2013-01-16 81 views
5

我有一長串繼承的FORTRAN77代碼,我使用.Fortran()從R調用。 Fortran代碼包含一組子程序,當嵌入到Fortran程序中並隨後通過命令行進行編譯和運行時,Fortran代碼就可以工作。但是,當我從R調用它時,它會在第二次調用該函數時使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.我用下面的函數:

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

在您的示例程序調用MYSUB只有2個參數,而不是在MYSUB的定義中發現的3:(X,N,MEAN)

這可能有無關你的問題,但是因爲你在調試FORTRAN和爭論,所以我想我應該指出。 FORTRAN子程序是獨立的編譯。沒有什麼可以阻止你傳遞不正確數量的參數(沒有編譯器錯誤或鏈接提示),這可能會導致問題。