2013-01-16 9 views
5

私はRから.Fortran()を使用して呼び出された長いFORTRAN77コードを継承しています。 Fortranコードには、一連のサブルーチンが含まれており、Fortranプログラムに組み込み、その後コンパイルしてコマンドラインから実行すると機能します。しかし、Rから呼び出すと、2回目に関数を呼び出すとRがクラッシュします。内からのFortranコードのデバッグR

Fortranコードは多くのインデックスと配列次元を変数として使用しているので、何かが間違っていると思います。ある時点では、Fortranコードは、メモリ内のどこかで、想定されていない場所を探しています。だから、私はFortranコードを踏んで、Rから来たものがすべて私が思うものであるかどうかをチェックし、コードは私が思うものを実行する必要があります。

R関数であれば、debug()を使用し、browser()ステートメントを追加し、コード内の一点で見たい値を印刷することができます。しかし、Fortranのコードは、私にこれらの事柄のどれも許さない。私が正しく理解していれば、Fortranの画面出力はRによって捕捉されません。

RがFortranコードに渡す引数の型と値をどの程度正確に確認できるのか誰かが知っています。 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

非常に些細な質問ですが、画面に表示する代わりに、ファイルにFortranサブルーチンに入力する量を書き込まないのはなぜですか?そうすれば、少なくともRとFortran間の通信が正しく機能するかどうかを確認できます。 –

+0

@BálintAradi今はむしろ愚かな気がする... ;-) Thx。 –

+1

ちょっといい質問は簡単な答えがあります:-) –

答えて

4

:私は次の関数を使用する(X、N、MEAN)

これはおそらくとは何の関係もありませんあなたの質問は、しかし、あなたはFORTRANと引数のデバッグについて質問しているので、私はそれを指摘する必要があると思った。 FORTRANサブルーチンは独立したコンパイルです。間違った数の引数(コンパイラエラーやリンケージヒントはありません)を渡すのを妨げるものは何もありません。これは問題を引き起こす可能性があります。

関連する問題