এটি একটি ভুল সংকলক অপ্টিমাইজেশনের সাথে মিশ্রণে ফরটারের ফাংশন কল মূল্যায়ন কৌশলটির একটি অজান্তেই পার্শ্ব প্রতিক্রিয়া ছিল।
ফোরট্রান ২ তাদের আর্গুমেন্ট সহ চালু ব্যবহারকারী-সংজ্ঞায়িত কার্যকারিতা ও সাবরুটিনের রেফারেন্স দ্বারা পাস । (কেন, আমি জানি না। এটি সম্ভবত তখনকার আইবিএম হার্ডওয়্যারের পাস-বাই-ভ্যালুর চেয়ে বেশি দক্ষ ছিল))
সাধারণত, পাস-রেফারেন্সের অর্থ আপনাকে আর-মানের পরিবর্তে একটি এল-মান (একটি ভেরিয়েবলের মতো) পাস করতে হবে। তবে ফরট্রানের ডিজাইনারগণ সহায়ক হবার সিদ্ধান্ত নিয়েছে এবং আপনাকে যে কোনও উপায়ে আর-মানগুলি পাস করার অনুমতি দেয় pass সংকলকটি স্বয়ংক্রিয়ভাবে আপনার জন্য একটি পরিবর্তনশীল তৈরি করবে would সুতরাং, আপনি যদি লিখেছেন:
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 এ পরিবর্তিত করে And এবং তারপরে আপনি ভাবছেন যে কেন SUBBAZ
আপনি কোডটিতে 4
প্রকৃতপক্ষে লিখেছেন তার পরিবর্তে আপনি এটি 5 টি পাস করে ধরে নিচ্ছেন কেন ?
ফরট্রানের নতুন সংস্করণগুলি আপনাকে INTENT
পরিবর্তনকের হিসাবে IN
বা হিসাবে ঘোষণা করে OUT
এবং যদি আপনি OUT
পরামিতি হিসাবে ধ্রুবকটি পাস করেন তবে আপনাকে একটি ত্রুটি (বা কমপক্ষে একটি সতর্কতা) দিয়ে এই সমস্যাটি প্রশমিত করে ।