आर

2013-01-16 53 views
5

के भीतर से डीबग फोरट्रान कोड मेरे पास विरासत FORTRAN77 कोड का एक लंबा टुकड़ा है जिसे मैं .Fortran() का उपयोग करके आर से कॉल करता हूं। फोरट्रान कोड में subroutines का एक सेट होता है, और फ़ोरट्रान प्रोग्राम में एम्बेड किए जाने पर काम करता है और बाद में संकलित और कमांड लाइन से चलाया जाता है। हालांकि, जब मैं इसे आर से बुलाता हूं, तो दूसरी बार जब मैं फ़ंक्शन को कॉल करता हूं तो यह क्रैश हो जाता है।आर

चूंकि फोरट्रान कोड एक चर के रूप में संग्रहीत कई सूचकांक और सरणी आयामों का उपयोग करता है, मुझे लगता है कि कुछ गलत हो गया है। कुछ बिंदु पर, फोरट्रान कोड स्मृति में कहीं कहीं देख रहा है जहां यह नहीं होना चाहिए। तो मुझे फोरट्रान कोड से कदम उठाने की ज़रूरत है और जांच करें कि आर से जो कुछ आया वह मुझे लगता है कि यह है, और कोड जो मुझे लगता है वह करता है।

यदि यह एक आर समारोह होगा, तो मेरे पास debug() का उपयोग करने का विकल्प होगा, browser() कथन जोड़कर और कोड में एक बिंदु पर मुझे जो भी वैल्यू देखना है, उसे प्रिंट करना होगा। लेकिन फोरट्रान कोड मुझे इन चीजों में से किसी भी चीज की अनुमति नहीं देता है। अगर मैं इसे सही समझ गया, तो फोरट्रान का स्क्रीन आउटपुट आर

पर कब्जा नहीं किया गया है, तो क्या किसी को यह पता है कि मैं फोरट्रान कोड में आर के तर्कों के प्रकार और मूल्य की जांच कैसे कर सकता हूं। यदि आप आर से कॉल करते समय उस कोड को बाद में डीबग कर सकते हैं, तो यह स्पष्ट हो सकता है कि यह शानदार होगा।

मेरे उदाहरण का वर्णन करने के लिए यहां एक उदाहरण दिया गया है।

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 

मैं आर से सबरूटीन 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

बहुत मामूली सवाल है, लेकिन आप स्क्रीन के बजाय फ़ोरट्रान सबराउटिन में प्रवेश करने वाली मात्रा क्यों नहीं लिखते हैं? इस तरह आप जांच सकते हैं कि कम से कम आर और फोरट्रान के बीच संचार सही तरीके से काम करता है या नहीं। –

+0

@ बालिंटअरादी मैं अब बेवकूफ महसूस करता हूं ... ;-) थक्स। –

+1

अरे, सबसे अच्छे प्रश्नों में सरल दिखने वाले उत्तर हैं :-) –

उत्तर

4

अपने उदाहरण कार्यक्रम में आप के बजाय सिर्फ 2 तर्क 3 MYSUB की परिभाषा में पाया साथ MYSUB फोन: (एक्स, एन, मतलब)

यह शायद के साथ कोई संबंध नहीं है आपका प्रश्न, लेकिन चूंकि आप फोरट्रान और तर्कों को डीबग करने के बारे में पूछ रहे हैं, मैंने सोचा कि मुझे इसे इंगित करना चाहिए। फोरट्रान सबराउटिन स्वतंत्र संकलन हैं। गलत संख्या में तर्क (कोई कंपाइलर त्रुटि या लिंकेज संकेत) गुजरने से रोकने के लिए कुछ भी नहीं है और इससे समस्याएं पैदा हो सकती हैं।