2009-06-28 8 views
6

क्या कोई मुझे बता सकता है कि पार्सर/कंपाइलर में एक डमी चर या विशेषता किस प्रकार का एक अमूर्त है?फोरट्रान कंपाइलर शब्दावली: डमी चर और गुण

 PURE SUBROUTINE F(X, Y) 
     IMPLICIT NONE 
     REAL, INTENT(INOUT) :: X, Y, C 
C  REAL :: A, B 
C  REAL, SAVE :: C = 3.14E0 
     PARAMETER (C = 3.14E0, X = 32, Y = X) 
     X = Y + 2 * SIN(Y) 
     END 

[email protected]:~/lab/secret/tapenade$ gfortran -x f77 -c 1.f 
1.f:6.37: 

     PARAMETER (C = 3.14E0, X = 32, Y = X)       
            1 
Error: PARAMETER attribute conflicts with DUMMY attribute in 'x' at (1) 
1.f:3.38: 

     REAL, INTENT(INOUT) :: X, Y, C         
            1 
Error: Symbol at (1) is not a DUMMY variable 

[email protected]:~/lab/secret/tapenade$ ifort -c 1.f 
1.f(3): error #6451: A dummy argument name is required in this context. [C] 
     REAL, INTENT(INOUT) :: X, Y, C 
-------------------------------------^ 
1.f(6): error #6406: Conflicting attributes or multiple declaration of name. [X] 
     PARAMETER (C = 3.14E0, X = 32, Y = X) 
-------------------------------^ 
1.f(6): error #6406: Conflicting attributes or multiple declaration of name. [Y] 
     PARAMETER (C = 3.14E0, X = 32, Y = X) 
---------------------------------------^ 
1.f(6): error #6592: This symbol must be a defined parameter, an enumerator, or an argument of an inquiry function that evaluates to a compile-time constant. [X] 
     PARAMETER (C = 3.14E0, X = 32, Y = X) 
-------------------------------------------^ 
compilation aborted for 1.f (code 1) 

उत्तर

9

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

जब आप कह रही है कि C एक DUMMY चर नहीं है त्रुटि मिलती है, तो इसका मतलब है कि यह चर की सूची है कि में पारित हो जाएगा/समारोह से बाहर में C नहीं मिल रहा है - अपने घोषणा केवल F(X, Y) है: कोई दृष्टि में C। यद्यपि आप DUMMY विशेषता का स्पष्ट रूप से उपयोग नहीं कर रहे हैं, आपके पास INTENT(INOUT) विशेषता है, जिसका अर्थ है कि ये चर subroutine इनपुट/आउटपुट से मेल खाते हैं। - जिसका मतलब है कि आप एक pure सबरूटीन घोषणा कर रहे,

subroutine F(X, Y) 
    implicit none 

    ! These are the dummy variables 
    real, intent(inout) :: X, Y 

    ! These are the variables in the scope of this subroutine 
    real     :: a, b 
    real, parameter, save :: c = 3.14E0 

    X = Y + 2*sin(Y) 
end subroutine F 

मैं पूरी तरह सुनिश्चित करें कि आप क्या करने की कोशिश कर रहे हैं नहीं कर रहा हूँ:

आप क्या चाहते हैं, तो आप एक सबरूटीन कि तरह दिखता होता प्राप्त करने के लिए साइड इफेक्ट्स के बिना एक सबराउटिन, लेकिन आप अपने चर के लिए intent(inout) का उपयोग कर रहे हैं, जिसका अर्थ है कि X और Y निष्पादन के दौरान बदला जा सकता है।

मैं एक सबरूटीन के अंदर के साथ ही है कि जोड़ना होगा, REAL :: C = 3.14E0 की तरह इसकी घोषणा बयान में एक चर प्रारंभ करने में निहितsave विशेषता के साथ एक चर अर्जित करता है। यदि आप इसे कॉल से कॉल से सहेजना चाहते हैं, हालांकि, आपने यह स्पष्ट करने के लिए save विशेषता को स्पष्ट रूप से जोड़कर सही काम किया है कि आप यही कर रहे हैं।

मैं एक पार्सर/कंपाइलर लड़का नहीं हूं, लेकिन मुझे लगता है कि आपके प्रश्न का उत्तर देने के लिए, dummy विशेषता का अर्थ है कि आपको केवल एक पॉइंटर मिल रहा है - आपको किसी भी स्थान आवंटित करने की आवश्यकता नहीं है, क्योंकि चर का उपयोग किया जाता है फ़ंक्शन कॉल में पहले से ही आवंटित स्थान है।

3

कॉल के साथ वास्तविक समस्या टिम व्हिटॉमब द्वारा अच्छी तरह से समझाया गया है। मैं शर्तों को अधिक स्पष्ट रूप से समझाने की कोशिश करूंगा।

डमी तर्क एक फोरट्रान विशिष्ट शब्द है। यह अन्य भाषाओं को औपचारिक पैरामीटर या इसी तरह कहते हैं, यानी यह ऑब्जेक्ट है जिसे X और Y (आपके मामले में) कहा जाता है और प्रक्रिया को कॉल करने पर वास्तविक तर्क से जोड़ा जाता है।

में

इसलिए:

subroutine s(i) 
    integer :: i 
end 

call s(1) 

i जबकि अभिव्यक्ति 1 वास्तविक तर्क जो डमी तर्क i को सबरूटीन में भेजा जाता है है सबरूटीन s की एक डमी तर्क है।

विशेषताएँ डेटा ऑब्जेक्ट्स या प्रक्रियाओं के अतिरिक्त गुण निर्दिष्ट करने का एक रूप है।

real c 
intent(in) c 
optional c 

या वे एक ही घोषणा में निर्दिष्ट किया जा सकता: गुण बयानों का उपयोग कर निर्दिष्ट किया जा सकता है

real, intent(in), optional :: c 

इस तरह डमी तर्क c विशेषताओं intent(in) और optional साथ एक डिफ़ॉल्ट वास्तविक है।

विवादित गुण विशेषताएँ हैं जिन्हें एक ही समय में एक ऑब्जेक्ट के लिए निर्दिष्ट नहीं किया जा सकता है। intent(...) और parameter के साथ आपका उदाहरण अच्छी तरह से कार्य करता है। ये असंगत हैं क्योंकि पहले एक डमी तर्क का तात्पर्य है और दूसरा निर्दिष्ट निर्दिष्ट करता है।

संबंधित मुद्दे