दिलचस्प

एक डेल्फी फ़ंक्शन से कई मान कैसे लौटाएं

एक डेल्फी फ़ंक्शन से कई मान कैसे लौटाएं

डेल्फी एप्लिकेशन में एक सबसे आम निर्माण एक प्रक्रिया या एक फ़ंक्शन होगा। रूटीन के रूप में जाना जाता है, प्रक्रिया या फ़ंक्शन एक प्रोग्राम में विभिन्न स्थानों से कॉल करने वाले स्टेटमेंट ब्लॉक हैं।

सीधे शब्दों में कहें तो एक प्रक्रिया एक मान है जो एक फ़ंक्शन को एक मान नहीं लौटाता है।

किसी फ़ंक्शन से वापसी मान को रिटर्न प्रकार द्वारा परिभाषित किया जाता है। ज्यादातर मामलों में आप एक फ़ंक्शन लिखेंगे एकल मान लौटाएं यह एक पूर्णांक, स्ट्रिंग, बूलियन या कुछ अन्य सरल प्रकार होंगे, रिटर्न प्रकार भी एक सरणी, एक स्ट्रिंग सूची, एक कस्टम वस्तु या एक जैसे उदाहरण हो सकते हैं।

ध्यान दें कि भले ही आपका फ़ंक्शन एक स्ट्रिंग सूची (स्ट्रिंग्स का एक संग्रह) लौटाता है, यह अभी भी एक एकल मान लौटाता है: स्ट्रिंग सूची का एक उदाहरण।

इसके अलावा, डेल्फी दिनचर्या वास्तव में कई चेहरे हो सकते हैं: दिनचर्या, विधि, विधि सूचक, घटना प्रतिनिधि, बेनामी ...

क्या कोई फ़ंक्शन कई मान लौटा सकता है?

पहला जवाब जो मन में आता है, वह नहीं है, सिर्फ इसलिए कि जब हम किसी फ़ंक्शन के बारे में सोचते हैं, तो हम एक एकल वापसी मूल्य के बारे में सोचते हैं।

निश्चित रूप से, उपरोक्त प्रश्न का उत्तर हां, हां है। एक फ़ंक्शन कई मान लौटा सकता है। आइए देखें कैसे।

वार पैरामीटर्स

निम्नलिखित फ़ंक्शन कितने मानों पर वापस लौट सकते हैं, एक या दो?

समारोह PositiveReciprocal (स्थिरांक valueIn: पूर्णांक; वर मान: वास्तविक): बूलियन;

फ़ंक्शन स्पष्ट रूप से एक बूलियन मान (सही या गलत) देता है। दूसरे पैरामीटर "valueOut" के बारे में "VAR" (चर) पैरामीटर के रूप में कैसे घोषित किया जाता है?

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

उपरोक्त कार्य कैसे होते हैं, यह देखने के लिए, यहाँ कार्यान्वयन है:

समारोह PositiveReciprocal (स्थिरांक valueIn: पूर्णांक; वर मान: वास्तविक): बूलियन;

शुरू

परिणाम: = valueIn> 0;

अगर परिणाम फिर valueOut: = 1 / valueIn;

समाप्त;

"ValueIn" को एक निरंतर पैरामीटर-फ़ंक्शन के रूप में पारित किया जाता है जो इसे बदल नहीं सकता है, और इसे केवल पढ़ने के लिए माना जाता है।

यदि "valueIn" या शून्य से अधिक है, तो "valueOut" पैरामीटर को "valueIn" का पारस्परिक मान सौंपा गया है और फ़ंक्शन का परिणाम सत्य है। यदि valueIn <= 0 है, तो फ़ंक्शन गलत हो जाता है और "valueOut" को किसी भी तरह से बदल नहीं दिया जाता है।

यहाँ उपयोग है:

वर

बी: बूलियन;

आर: असली;

शुरू

आर: = 5;

बी: = पॉजिटिव रीप्रोकल (1, आर);

//यहाँ:

// बी = सच (1 के बाद से = 0)

// आर = 0.2 (1/5)

आर: = 5;

बी: = पॉजिटिव रीप्रोकल (-1, आर);

//यहाँ:

// b = गलत (-1 के बाद से)

समाप्त;

इसलिए, PositiveReciprocal वास्तव में 2 मान "वापस" कर सकता है! Var मापदंडों का उपयोग करके आप एक से अधिक मूल्य पर एक नियमित रिटर्न दे सकते हैं।

पैरामीटर्स से बाहर

उप-संदर्भ पैरामीटर को निर्दिष्ट करने का एक और तरीका है, "आउट" कीवर्ड का उपयोग करना, जैसे कि:

समारोह PositiveReciprocalOut (स्थिरांक valueIn: पूर्णांक; बाहर मान: वास्तविक): बूलियन;

शुरू

परिणाम: = valueIn> 0;

अगर परिणाम फिर valueOut: = 1 / valueIn;

समाप्त;

PositiveReciprocalOut का कार्यान्वयन PositiveReciprocal के समान है, केवल एक ही अंतर है: "ValueOut" एक OUT पैरामीटर है।

"आउट" के रूप में घोषित मापदंडों के साथ, संदर्भित चर "valueOut" का प्रारंभिक मूल्य छोड़ दिया गया है।

यहाँ उपयोग और परिणाम हैं:

वर

बी: बूलियन;

आर: असली;

शुरू

आर: = 5;

b: = पॉजिटिव ReciprocalOut (1, r);

//यहाँ:

// बी = सच (1 के बाद से = 0)

// आर = 0.2 (1/5)

आर: = 5;

b: = पॉजिटिव ReciprocalOut (-1, r);

//यहाँ:

// b = गलत (-1 के बाद से)

समाप्त;

ध्यान दें कि दूसरी कॉल में स्थानीय चर "r" का मान "0" पर कैसे सेट किया गया है। फ़ंक्शन कॉल से पहले "r" का मान 5 पर सेट किया गया था, लेकिन चूंकि पैरामीटर "आउट" के रूप में घोषित किया गया था, इसलिए जब "r" फ़ंक्शन पर पहुंचा तो मान को त्याग दिया गया था और डिफ़ॉल्ट "रिक्त" मान पैरामीटर (0) के लिए सेट किया गया था वास्तविक प्रकार के लिए)।

नतीजतन, आप सुरक्षित रूप से बाहर के मापदंडों के लिए बिन-प्रकार के चर भेज सकते हैं-ऐसा कुछ जो आपको "var" मापदंडों के साथ नहीं करना चाहिए। पैरामीटर को रूटीन में कुछ भेजने के लिए उपयोग किया जाता है, "आउट" मापदंडों के साथ यहां को छोड़कर :), और इसलिए अनइंस्टाल्यूटेड चर (वीएआर मापदंडों के लिए उपयोग किया जाता है) में अजीब मान हो सकते हैं।

रिटर्निंग रिकॉर्ड?

उपरोक्त कार्यान्वयन जहां एक फ़ंक्शन एक से अधिक मान लौटाएगा वे अच्छे नहीं हैं। फ़ंक्शन वास्तव में एक एकल मान लौटाता है, लेकिन साथ ही, अल्टर कहने के लिए बेहतर है, var / out पैरामीटर के मान।

इस वजह से, आप शायद ही कभी संदर्भ के मापदंडों का उपयोग करना चाहते हैं। यदि किसी फ़ंक्शन से अधिक परिणाम की आवश्यकता होती है, तो आप फ़ंक्शन को रिकॉर्ड प्रकार चर वापस कर सकते हैं।

निम्नलिखित को धयान मे रखते हुए:

प्रकार

त्यलिटयूडलंग = अभिलेख

अक्षांश: वास्तविक;

देशांतर: वास्तविक;

समाप्त;

और एक काल्पनिक कार्य:

समारोह मैं कहाँ हूँ(स्थिरांक शहरनाम: तार): TLatitudeLongitude;

फ़ंक्शन व्हॉट्सएएमआई किसी दिए गए शहर (शहर, क्षेत्र, ...) के लिए अक्षांश और देशांतर लौटाएगा।

कार्यान्वयन होगा:

समारोह मैं कहाँ हूँ(स्थिरांक townName: तार): TLatitudeLongitude;

शुरू// "townName" का पता लगाने के लिए कुछ सेवा का उपयोग करें, फिर फ़ंक्शन परिणाम असाइन करें:

परिणाम। आभार: = 45.54;

परिणाम। आभार: = 18.71;

समाप्त;

और यहां हमारे पास 2 वास्तविक मानों को लौटाने वाला एक फ़ंक्शन है। ठीक है, यह 1 रिकॉर्ड लौटाता है, लेकिन इस रिकॉर्ड में 2 क्षेत्र हैं। ध्यान दें कि किसी फ़ंक्शन के परिणामस्वरूप वापस आने के लिए विभिन्न प्रकार के मिश्रण का एक बहुत ही जटिल रिकॉर्ड हो सकता है।

बस। इसलिए, हाँ, डेल्फी फ़ंक्शन कई मान वापस कर सकते हैं।