2013-06-30 12 views
14

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

fprintf(stderr, "There was an error of kind foo"); 
exit(EXIT_FAILURE); 

लेकिन fortran में, सबसे अच्छा मैं कैसे करना है पता लग रहा है

write(*,*) 'There was an error of kind foo' 
stop 

जो उत्पादन धारा के चुनाव का अभाव है जैसे (लघु मुद्दा) और बाहर निकलने की स्थिति (बड़ी समस्या)।

मैं एक गैर-शून्य निकास स्थिति के साथ एक किलर कार्यक्रम कैसे समाप्त कर सकता हूं?

यदि यह संकलक-निर्भर है, तो एक समाधान जो गोरफ्रान के साथ काम करता है वह अच्छा होगा।

उत्तर

18

stop कथन एक पूर्णांक या वर्ण मान की अनुमति देता है। ऐसा लगता है कि जब यह अस्तित्व में है, तो यह स्टडरर के लिए आउटपुट होगा, लेकिन जैसा कि stderr ओएस निर्भर है, यह संभावना नहीं है कि फोरट्रान भाषा मानक की आवश्यकता है, अगर यह कुछ भी कहता है। यह भी संभावना है कि यदि आप संख्यात्मक विकल्प का उपयोग करते हैं तो निकास स्थिति सेट की जाएगी। मैं किसी Mac gfortran साथ यह कोशिश की, और कहा कि मामला था:

program TestStop 

integer :: value 

write (*, '("Input integer: ")', advance="no") 
read (*, *) value 

if (value > 0) then 
    stop 0 
else 
    stop 9 
end if 

end program TestStop 

जबकि ठीक क्या stop एक पूर्णांक या स्ट्रिंग करना होगा साथ ओएस पर निर्भर है, बयान भाषा का हिस्सा है और हमेशा संकलित कर देगा। call exit एक जीएनयू एक्सटेंशन है और शायद कुछ ओएसई पर लिंक नहीं हो सकता है।

+0

मानक के अनुसार, " समाप्ति के समय, स्टॉप कोड, यदि कोई हो, प्रोसेसर-निर्भर तरीके से उपलब्ध है।" – astrojuanlu

4

gfortran 4.7.0 keyword index में STOP के बारे में मुझे कुछ भी नहीं मिला, शायद इसलिए कि यह एक भाषा कीवर्ड है और आंतरिक नहीं है। फिर भी, EXIT intrinsic है जो ऐसा लगता है जो मैं ढूंढ रहा था: किसी दिए गए स्थिति से बाहर निकलें। और the fortran wiki में a small example of using stderr है जो निरंतर ERROR_UNIT का उल्लेख करता है। तो अब मेरा कोड अब इस तरह दिखता है:

USE ISO_FORTRAN_ENV, ONLY : ERROR_UNIT 
[…] 
WRITE(ERROR_UNIT,*) 'There as an error of kind foo' 
CALL EXIT(1) 

यह कम से कम संकलित करता है। परीक्षण अभी भी लंबित है, लेकिन यह काम करना चाहिए। अगर कोई अधिक सुरुचिपूर्ण या अधिक उपयुक्त समाधान जानता है, तो इस प्रश्न के वैकल्पिक उत्तर देने के लिए स्वतंत्र महसूस करें।

+2

STOP एक बयान है। EXIT() एक जीएनयू एक्सटेंशन है और अन्य कंपेलरों में उपलब्ध नहीं हो सकता है। –

10

रोक n के अलावा, वहाँ भी त्रुटि रोक n फोरट्रान 2008 के बाद से gfortran के साथ Windows के तहत वे दोनों ओएस के लिए त्रुटि संख्या भेजने के लिए, के रूप में बाद में एक echo %errorlevel% साथ देखा जा सकता है। कथन त्रुटि रोक भी एक त्रुटि संदेश पारित किया जा सकता है।

program bye 
    read *, n 
    select case (n) 
     case (1); stop 10 
     case (2); error stop 20 
     case (3); error stop "Something went wrong" 
     case (4); error stop 2147483647 
    end select 
end program 
संबंधित मुद्दे