2013-01-16 21 views
5

.Fortran() kullanarak R'den aradığım uzun bir kalıtımsal FORTRAN77 kod parçam var. Fortran kodu bir dizi alt yordam içerir ve bir Fortran programına gömüldüğünde çalışır ve sonradan derlenir ve komut satırından çalıştırılır. Ancak, onu R'den aradığımda, i fonksiyonu çağıracağım ikinci kez R çöküyor.Hata ayıklama Fortran kodu içinde R

Fortran kodu, değişken olarak depolanan çok sayıda dizin ve dizi boyutu kullandıkça, orada bir şeyler yanlış gidildiğini düşünüyorum. Bir noktada, Fortran kodu olması gereken yerde bellekte bir yere bakıyor. Bu yüzden Fortran koduna adım atmalı ve R'den gelenlerin benim düşündüğüm şey olup olmadığını kontrol etmeliyim ve kod benim düşündüğüm şeyi yapar.

Eğer bir R işlevi olurdu, debug() kullanarak, browser() ifadeleri ekleyerek ve kodda bir noktada görmek istediğiniz herhangi bir değeri basmayı seçebilirim. Ama Fortran kodu bana bu şeylerden herhangi birini afaik izin vermez. Eğer doğru anladıysam, Fortran'ın ekran çıktısı R tarafından yakalanmayan argümanların türünü ve değerini tam olarak nasıl kontrol edebildiğime dair herhangi bir fikriniz var. Daha sonra R'den çağrıldığında bu kodu nasıl ayıklayabileceğimi açıklayabilirseniz, bu harika olur.

İşte ne demek istediğimi göstermek için bir örnek.

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 

Ben R altprogram MySub aramak istediğiniz Say ve ben doğru X ve N olsun emin olmak istiyorum. Eğer sadece 2 argümanlar yerine mysub tanımına bulunan 3 ile mysub diyoruz senin örneğin programında

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

Çok önemsiz bir soru, ama neden Fortran alt programına giren miktarları ekrana dökmek yerine dosyaya yazmıyorsunuz? Bu şekilde, en azından R ve Fortran arasındaki iletişimin doğru şekilde çalışıp çalışmadığını kontrol edebilirsiniz. –

+0

@ BálintAradi Kendimi aptal hissediyorum ... ;-) Thx. –

+1

Hey, en iyi soruların basit görünümlü cevapları var :-) –

cevap

4

: Aşağıdaki işlevini kullanın (X, N, ORTALAMA)

Bu muhtemelen ile ilgisi yoktur Sorunuz, ama FORTRAN ve argümanların hatalarını ayıklamak istediğiniz için, bunu işaret etmem gerektiğini düşündüm. FORTRAN alt yordamları bağımsız derlemelerdir. Yanlış sayıda argümanı (derleyici hatası veya bağlantı ipucu) geçirmemenizi engelleyecek hiçbir şey yoktur ve bu da sorunlara neden olabilir.