यह एक गलत संकलक अनुकूलन के साथ संयोजन में FORTRAN के फ़ंक्शन कॉल मूल्यांकन रणनीति का एक अनजाने साइड इफेक्ट था।
FORTRAN II ने उपयोगकर्ता-परिभाषित कार्यों और उप-वृत्तों को संदर्भ द्वारा पारित उनके तर्कों के साथ पेश किया । (क्यों, मुझे नहीं पता। यह शायद उस समय के आईबीएम हार्डवेयर पर पास-बाय-वैल्यू से अधिक कुशल था।)
आम तौर पर, पास-दर-संदर्भ का मतलब है कि आपको आर-मान के बजाय एल-मान (एक चर की तरह) पास करना होगा। लेकिन फोरट्रान के डिजाइनरों ने मददगार होने का फैसला किया और आर-वैल्यू को तर्क के रूप में वैसे भी पारित कर दिया। संकलक स्वचालित रूप से आपके लिए एक चर उत्पन्न करेगा। तो, अगर आपने लिखा है:
CALL SUBFOO(X + Y, 4)
संकलक इसे पर्दे के पीछे कुछ इस तरह परिवर्तित करेगा
TEMP1 = X + Y
TEMP2 = 4
CALL SUBFOO(TEMP1, TEMP2)
एक आम संकलक अनुकूलन भी था जिसे "शाब्दिक पूल" कहा जाता है, जो एक ही संख्यात्मक स्थिर के कई उदाहरणों को एक ही ऑटो-जनरेट चर में समेकित करेगा। (सी परिवार की कई भाषाओं में इसके लिए स्ट्रिंग लिटरल की आवश्यकता होती है।) इसलिए, यदि आपने लिखा है
CALL SUBBAR(4)
CALL SUBBAZ(4)
यह माना जाएगा जैसे कि यह थे
FOUR = 4
CALL SUBBAR(FOUR)
CALL SUBBAZ(FOUR)
जब तक कि आपके पास एक ऐसा सबप्रोग्राम होने के लिए एक पूरी तरह से उचित चीज की तरह लगता है जो अपने मापदंडों के मूल्य को बदलता है।
SUBROUTINE SUBBAR(X)
!...lots of code...
X = 5
!...lots of code...
END SUBROUTINE SUBBAR
बूम! CALL SUBBAR(4)
शाब्दिक पूल में 4 के मूल्य को 5. में बदल दिया और फिर आप सोच रहे हैं कि क्यों SUBBAZ
मान लिया गया है कि आपने इसे 4
वास्तव में कोड में लिखे जाने के बजाय इसे 5 पास कर दिया है ।
फोरट्रान के नए संस्करण की अनुमति देकर इस समस्या को कम आप यह घोषणा INTENT
के रूप में एक चर के IN
या OUT
, और आपको एक त्रुटि दे रही है (या कम से कम एक चेतावनी) यदि आप एक के रूप में एक निरंतर पारित OUT
पैरामीटर।