एक सबसे आम निर्माण में डेल्फी आवेदन एक होगा प्रक्रिया या एक समारोह. रूटीन के रूप में जाना जाता है, प्रक्रिया या फ़ंक्शन एक प्रोग्राम में विभिन्न स्थानों से कॉल करने वाले स्टेटमेंट ब्लॉक हैं।
सीधे शब्दों में कहें तो एक प्रक्रिया एक मान है जो एक फ़ंक्शन को एक मान नहीं लौटाता है।
किसी फ़ंक्शन से वापसी मान को रिटर्न प्रकार द्वारा परिभाषित किया जाता है। ज्यादातर मामलों में आप एक फ़ंक्शन लिखेंगे एकल मान लौटाएं यह एक पूर्णांक, स्ट्रिंग, बूलियन या कुछ अन्य सरल प्रकार होंगे, रिटर्न प्रकार भी एक सरणी, एक स्ट्रिंग सूची, एक कस्टम वस्तु या एक जैसे उदाहरण हो सकते हैं।
ध्यान दें कि भले ही आपका फ़ंक्शन एक स्ट्रिंग सूची (का एक संग्रह) लौटाता है तार) यह अभी भी एक एकल मान लौटाता है: स्ट्रिंग सूची का एक उदाहरण।
इसके अलावा, डेल्फी दिनचर्या वास्तव में कई चेहरे हो सकते हैं: दिनचर्या, विधि, विधि सूचक, घटना प्रतिनिधि, बेनामी ...
क्या कोई फ़ंक्शन कई मान लौटा सकता है?
पहला जवाब जो मन में आता है, वह नहीं है, क्योंकि जब हम किसी फ़ंक्शन के बारे में सोचते हैं, तो हम एक एकल वापसी मूल्य के बारे में सोचते हैं।
निश्चित रूप से, उपरोक्त प्रश्न का उत्तर हां, हां है। एक फ़ंक्शन कई मान लौटा सकता है। आइए देखें कैसे।
वार पैरामीटर्स
निम्नलिखित फ़ंक्शन कितने मानों पर लौट सकते हैं, एक या दो?
समारोह PositiveReciprocal (स्थिरांक valueIn: पूर्णांक; वर मान: वास्तविक): बूलियन;
फ़ंक्शन स्पष्ट रूप से एक बूलियन मान (सही या गलत) देता है। दूसरे पैरामीटर "valueOut" के बारे में "VAR" (चर) पैरामीटर के रूप में कैसे घोषित किया जाता है?
वार पैरामीटर समारोह में पारित कर रहे हैं संदर्भ से इसका अर्थ है कि यदि फ़ंक्शन पैरामीटर के मान को बदलता है - कोड के कॉलिंग ब्लॉक में एक चर- फ़ंक्शन पैरामीटर के लिए उपयोग किए गए चर के मूल्य को बदल देगा।
उपरोक्त कार्य कैसे होते हैं, यह देखने के लिए, यहाँ कार्यान्वयन है:
समारोह PositiveReciprocal (स्थिरांक valueIn: पूर्णांक; वर मान: वास्तविक): बूलियन;
शुरू
परिणाम: = valueIn> 0;
अगर परिणाम फिर valueOut: = 1 / valueIn;
समाप्त;
"ValueIn" को एक निरंतर पैरामीटर के रूप में पारित किया जाता है - फ़ंक्शन इसे बदल नहीं सकता है, और इसे केवल-पढ़ने के लिए माना जाता है।
यदि "valueIn" या शून्य से अधिक है, तो "valueOut" पैरामीटर को "valueIn" का पारस्परिक मान सौंपा गया है और फ़ंक्शन का परिणाम सत्य है। यदि valueIn <= 0 है, तो फ़ंक्शन गलत हो जाता है और "valueOut" को किसी भी तरह से बदल नहीं दिया जाता है।
यहाँ उपयोग है:
वर
बी: बूलियन;
आर: असली;
शुरू
आर: = 5;
बी: = पॉजिटिव रीप्रोकल (1, आर);
//here:
// b = सच (1 के बाद से = 0)
// आर = 0.2 (1/5)
आर: = 5;
बी: = पॉजिटिव रीप्रोकल (-1, आर);
//here:
// बी = गलत (-1 के बाद से)
समाप्त;
इसलिए, PositiveReciprocal वास्तव में 2 मान "वापस" कर सकता है! Var पैरामीटर का उपयोग करके आप एक से अधिक मूल्य पर एक नियमित रिटर्न प्राप्त कर सकते हैं।
पैरामीटर्स से बाहर
उप-संदर्भ पैरामीटर निर्दिष्ट करने का एक और तरीका है - "आउट" कीवर्ड का उपयोग करना, जैसे:
समारोह PositiveReciprocalOut (स्थिरांक valueIn: पूर्णांक; बाहर मान: वास्तविक): बूलियन;
शुरू
परिणाम: = valueIn> 0;
अगर परिणाम फिर valueOut: = 1 / valueIn;
समाप्त;
PositiveReciprocalOut का कार्यान्वयन PositiveReciprocal के समान है, केवल एक ही अंतर है: "ValueOut" एक OUT पैरामीटर है।
"आउट" के रूप में घोषित मापदंडों के साथ, संदर्भित चर "valueOut" का प्रारंभिक मूल्य छोड़ दिया गया है।
यहां देखें उपयोग और परिणाम:
वर
बी: बूलियन;
आर: असली;
शुरू
आर: = 5;
b: = पॉजिटिव ReciprocalOut (1, r);
//here:
// b = सच (1 के बाद से = 0)
// आर = 0.2 (1/5)
आर: = 5;
b: = पॉजिटिव ReciprocalOut (-1, r);
//here:
// बी = गलत (-1 के बाद से)
समाप्त;
ध्यान दें कि दूसरी कॉल में स्थानीय चर "r" का मान "0" पर कैसे सेट किया गया है। फ़ंक्शन कॉल से पहले "r" का मान 5 पर सेट किया गया था, लेकिन जब से पैरामीटर "आउट", "जब" r " फ़ंक्शन पर पहुंच गया मान को छोड़ दिया गया था और डिफ़ॉल्ट "रिक्त" मान पैरामीटर (0 के लिए वास्तविक) के लिए सेट किया गया था प्रकार)।
नतीजतन, आप सुरक्षित रूप से बाहर के मापदंडों के लिए बिना लाइसेंस वाले चर भेज सकते हैं - कुछ ऐसा जो आपको "var" मापदंडों के साथ नहीं करना चाहिए। पैरामीटर्स का उपयोग कुछ चीज़ों को रूटीन में भेजने के लिए किया जाता है, यहां "आउट" पैरामीटर के साथ छोड़कर :), और इसलिए अनइंस्ट्रुलेटेड वैरिएबल (VAR मापदंडों के लिए उपयोग किया जाता है) में अजीब मान हो सकते हैं।
रिटर्निंग रिकॉर्ड?
उपरोक्त कार्यान्वयन जहाँ एक फ़ंक्शन एक से अधिक मान लौटाएगा अच्छा नहीं है। फ़ंक्शन वास्तव में एकल मान लौटाता है, लेकिन साथ ही, अल्टर कहने के लिए बेहतर है, var / out पैरामीटर के मान।
इस वजह से, आप शायद ही कभी उप-संदर्भ मापदंडों का उपयोग करना चाहते हैं। यदि किसी फ़ंक्शन से अधिक परिणाम आवश्यक हैं, तो आप एक फ़ंक्शन वापस कर सकते हैं रिकॉर्ड का प्रकार चर।
निम्नलिखित को धयान मे रखते हुए:
प्रकार
त्यलिटयूडलंग = अभिलेख
अक्षांश: वास्तविक;
देशांतर: वास्तविक;
समाप्त;
और एक काल्पनिक कार्य:
समारोह मैं कहाँ हूँ(स्थिरांक townName: तार): TLatitudeLongitude;
समारोह जहाँ AAmI वापस आ जाएगा अक्षांश और देशांतर किसी दिए गए शहर (शहर, क्षेत्र, ...) के लिए।
कार्यान्वयन होगा:
समारोह मैं कहाँ हूँ(स्थिरांक townName: तार): TLatitudeLongitude;
शुरू// "townName" का पता लगाने के लिए कुछ सेवा का उपयोग करें, फिर फ़ंक्शन परिणाम असाइन करें:
परिणाम। अक्षांश: = 45.54;
परिणाम। देशांतर: = 18.71;
समाप्त;
और यहां हमारे पास 2 वास्तविक मानों को लौटाने वाला एक फ़ंक्शन है। ठीक है, यह 1 रिकॉर्ड लौटाता है, लेकिन इस रिकॉर्ड में 2 क्षेत्र हैं। ध्यान दें कि आपके पास एक फ़ंक्शन के परिणामस्वरूप वापस आने के लिए विभिन्न प्रकार के मिश्रण का एक बहुत ही जटिल रिकॉर्ड हो सकता है।
बस। इसलिए, हाँ, डेल्फी फ़ंक्शन कई मान वापस कर सकते हैं।