2013-01-16 2 views
5

나는 R에서 .Fortran()을 사용하여 호출 한 상속 된 FORTRAN77 코드의 긴 조각을 가지고 있습니다. Fortran 코드는 일련의 서브 루틴을 포함하며 Fortran 프로그램에 포함 된 후 명령 행에서 컴파일 및 실행될 때 작동합니다. 그러나 R에서 호출 할 때 함수를 호출 할 때 두 번째로 R이 충돌합니다.내에서 포트란 코드 디버그

포트란 코드는 많은 인덱스와 배열 차원을 변수로 사용하므로 뭔가 잘못되었다고 생각합니다. 어떤 시점에서 Fortran 코드는 예상치 못한 메모리 어딘가를보고 있습니다. 따라서 포트란 코드를 살펴보고 R에서 온 모든 것이 내가 생각하는 것인지 확인하고 코드가 생각하는대로 수행해야합니다.

R 함수라면 debug()을 사용하고 browser() 문을 추가하고 코드의 한 지점에서보고 싶은 모든 값을 출력 할 수 있습니다. 그러나 포트란 코드는 나에게 이런 것들을 허용하지 않습니다. 만약 내가 올바르게 이해한다면, 포트란의 화면 출력은 R에 의해 캡쳐되지 않는다.

그래서 R이 포트란 코드에 전달하는 인수의 유형과 값을 정확히 확인할 수있는 아이디어가있다. R에서 호출 할 때 코드를 디버깅하는 방법을 설명 할 수 있다면 훌륭합니다.

다음은 의미를 설명하기위한 예입니다.

C An example program 
C 
     PROGRAM EXAMPLE 
     INTEGER N 
     PARAMETER (N=10) 
     REAL X0, X(N),MEAN 

C 
     X0 = 14 
     DO 10 I = 1,10 
     FI = FLOAT(I) 
     X(I) = X0 + FI 
    10 CONTINUE 
     CALL MYSUB(X0,MEAN) 
     END 
C 
C Mysub the subroutine 
C 
     SUBROUTINE MYSUB(X,N,MEAN) 
     INTEGER N 
     REAL X(N), MEAN 
     MEAN = 0 
     DO 20 I = 1,N 
     MEAN = MEAN + X(I) 
    20 CONTINUE 
     MEAN = MEAN/N 
     RETURN 
     END 

내가 R에서 서브 루틴 mysub를 호출하고 싶습니다. 올바르게 X와 N을 얻고 싶습니다. 그냥 2 인자 대신 MYSUB의 정의에서 볼 수있는 3 MYSUB를 호출하여 예제 프로그램에서

mysub <- function(x){ 
    if(!is.vector(x) | is.numeric(x)) stop("X has to be a numeric vector") 
    n <- length(x) 
    res <- .Fortran('mysub',X=as.single(x), N=as.integer(n), MEAN=single(1)) 
    return(res$MEAN) 
} 
+4

매우 간단한 질문이지만 화면에 표시하는 대신 파일에 포트란 서브 루틴에 입력하는 양을 쓰지 않으십시오. 그렇게하면 R과 Fortran 사이의 통신이 제대로 작동하는지 여부를 확인할 수 있습니다. –

+0

@ BálintAradi 지금은 바보 같아서 ... ;-) Thx. –

+1

안녕하세요, 가장 좋은 질문은 간단한 답변을 가지고 있습니다 :-) –

답변

4

: 나는 다음과 같은 기능을 사용하여 (X, N, MEAN)

이 아마 함께 할 수 없다 귀하의 질문,하지만 당신은 포트란과 인수를 디버깅에 대해 묻는 이후, 나는 그것을 지적해야한다고 생각. FORTRAN 서브 루틴은 독립적 인 컴파일입니다. 잘못된 인수 (컴파일러 오류나 연결 힌트 없음)를 전달하는 것을 막을 수있는 방법은 없으며 이로 인해 문제가 발생할 수 있습니다.