पैरामीटर (कंप्यूटर प्रोग्रामिंग)
कंप्यूटर क्रमादेशन में, एक पैरामीटर या एक औपचारिक तर्क एक विशेष प्रकार का चर है जिसका उपयोग सबरूटीन में इनपुट के रूप में प्रदान किए गए डेटा के भाँग में से एक को संदर्भित करने के लिए किया जाता है।[lower-alpha 1][1] डेटा के ये भाँग तर्कों के मान हैं[2][3][4] (जिन्हें प्रायः वास्तविक तर्क या वास्तविक पैरामीटर कहा जाता है) जिसके साथ सबरूटीन को संबोधित/आह्वान किया जाता है। पैरामीटर की एक आदेशित सूची सामान्यतः एक सबरूटीन की परिभाषा में सम्मिलित होती है, इसलिए प्रत्येक बार सबरूटीन को कॉल किया जाता है, उस कॉल के लिए इसके तर्कों का मूल्यांकन किया जाता है, और परिणामी मान संबंधित पैरामीटर को नियुक्त किया जा सकता है।
सामान्य गणितीय उपयोग में तर्क के विपरीत, कंप्यूटर विज्ञान में तर्क एक वास्तविक इनपुट अभिव्यक्ति है जो किसी प्रकार्य, प्रकार्य या रूटीन को आह्वान/आह्वान कथन में पारित/आपूर्ति करती है, जबकि पैरामीटर सबरूटीन के कार्यान्वयन के अंदर चर है। उदाहरण के लिए, यदि कोईadd
सबरूटीन को def add(x, y): return x + y
के रूप में परिभाषित करता है, तो x, y
पैरामीटर हैं, जबकि अगर इसेadd(2, 3)
कहा जाता है तब 2, 3
तर्क हैं। ध्यान दें कि आह्वान संदर्भ से चर (और उसके भाव) तर्क हो सकते हैं: यदि सबरूटीन को a = 2 कहा जाता है; b = 3; add(a, b)
तो चर a, b
तर्क हैं, मूल्य 2, 3
नहीं है। अधिक जानकारी के लिए पैरामीटर और तर्क अनुभाग देखें।
पैरामीटर को कैसे अभिप्रेत किया जा सकता है और सबरूटीन के पैरामीटर के लिए (मूल्य) तर्कों को कैसे पारित किया जाता है, इसके शब्दार्थ को भाषा की मूल्यांकन रणनीति द्वारा परिभाषित किया जाता है, और किसी विशेष कंप्यूटर प्रणाली में इसका प्रतिनिधित्व कैसे किया जाता है, इसका विवरण उस प्रणाली के आह्वान सम्मेलन पर निर्भर करता है। सबसे सामान्य प्रकरण में, मूल्य से कॉल करें, एक पैरामीटर सबरूटीन के अंतर्गत एक नए स्थानीय चर के रूप में कार्य करता है जो तर्क के मान के लिए आरंभिक होता है (यदि तर्क एक चर है तो तर्क की एक स्थानीय (पृथक) प्रति), लेकिन अन्य प्रकरण में, उदाहरण के लिए संदर्भ द्वारा कॉल, कॉल करने वाले द्वारा प्रदान किया गया तर्क चर सबरूटीन कहे जाने वाले कार्यों से प्रभावित हो सकता है।
उदाहरण
C क्रमादेशन भाषा में निम्नलिखित क्रमादेश एक प्रकार्य को परिभाषित करता है जिसे "सेल्सटैक्स" नाम दिया गया है और इसमें "मूल्य" नाम का एक पैरामीटर है। मूल्य का प्रकार "दोगुना" (अर्थात एक द्विगुण परिशुद्धता चल बिंदु संख्या) है। प्रकार्य का प्रतिफल प्रकार भी दोगुना है।
double SalesTax(double price)
{
return 0.05 * price;
}
प्रकार्य परिभाषित होने के बाद, इसे निम्नानुसार उपयोजित किया जा सकता है:
SalesTax(10.00);
इस उदाहरण में, प्रकार्य को तर्क 10.00 के साथ उपयोजित किया गया है। जब ऐसा होता है, तो 10.00 मूल्य निर्धारित किया जाता है, और प्रकार्य इसके परिणाम की गणना करना प्रारंभ कर देता है। परिणाम प्रस्तुत करने के पद नीचे दिए गए हैं, {} में संलग्न हैं। 0.05 * price
इंगित करता है कि सबसे पहले मूल्य के मूल्य से 0.05 को गुणा करना है, जो 0.50 return
देता है जिसका अर्थ है कि प्रकार्य 0.05 * price
के परिणाम का उत्पादन करता है। इसलिए, अंतिम परिणाम (द्विआधारी अंशों के रूप में दशमलव अंशों का प्रतिनिधित्व करने के साथ सामना करने वाली संभावित निकटन त्रुटियों को उपेक्षित करना) 0.50 है।
पैरामीटर और तर्क
विभिन्न क्रमादेशन भाषाओं में पैरामीटर और तर्क के अलग-अलग अर्थ हो सकते हैं। कभी-कभी उनका उपयोग परस्पर विनिमय के लिए किया जाता है, और अर्थ को अलग करने के लिए संदर्भ का उपयोग किया जाता है। पैरामीटर शब्द (कभी-कभी औपचारिक पैरामीटर कहा जाता है) का उपयोग प्रायः प्रकार्य परिभाषा में पाए जाने वाले चर को संदर्भित करने के लिए किया जाता है, जबकि तर्क (कभी-कभी वास्तविक पैरामीटर कहा जाता है) प्रकार्य कॉल पर प्रदान किए गए वास्तविक इनपुट को संदर्भित करता है। उदाहरण के लिए, यदि कोई प्रकार्य कोdef f(x): ...
के रूप में परिभाषित करता है, तब x
पैरामीटर है, और यदि इसेa = ...;f(a)
कहा जाता है तोa
तर्क है। पैरामीटर एक (अपरिबद्ध) चर है, जबकि तर्क शाब्दिक (कंप्यूटर क्रमादेशन) या चर या अधिक जटिल अभिव्यक्ति हो सकता है जिसमें शाब्दिक और चर सम्मिलित हैं। मान आह्वान के प्रकरण में, प्रकार्य को जो पारित किया जाता है वह तर्क का मान है - उदाहरण के लिए, f(2)
और a = 2; f(a)
समतुल्य कॉल हैं - संदर्भ द्वारा कॉल करते समय, तर्क के रूप में एक चर के साथ, जो पारित किया जाता है वह उस चर का एक संदर्भ है - यद्यपि प्रकार्य कॉल के लिए वाक्य विन्यास समान रह सकता है।[5] प्रकार्य घोषित और/या परिभाषा में उत्तीर्ण-द्वारा-संदर्भ या उत्तीर्ण-द्वारा-मूल्य के लिए विनिर्देश बनाए जाते है।
प्रकार्य परिभाषाओं में पैरामीटर दिखाई देता हैं; प्रकार्य कॉल में तर्क प्रकट होते हैं। प्रकार्य परिभाषा में f(x) = x*x
चर x एक पैरामीटर है; प्रकार्य कॉल में f(2)
मान 2 प्रकार्य का तर्क है। संक्षेप में, एक पैरामीटर एक प्रकार है, और एक तर्क उदाहरण है।
एक पैरामीटर प्रकार्य का एक आंतरिक गुण है, इसकी परिभाषा में सम्मिलित है। उदाहरण के लिए, कई भाषाओं में, दो प्रदान किए गए पूर्णांकों को एक साथ जोड़ने और योग की गणना करने के प्रकार्य में प्रत्येक पूर्णांक के लिए एक, दो पैरामीटर की आवश्यकता होती है। सामान्य रूप में, एक प्रकार्य को कई पैरामीटर के साथ परिभाषित किया जा सकता है, या कोई भी पैरामीटर के साथ परिभाषित नहीं किया जा सकता है। यदि किसी प्रकार्य में पैरामीटर हैं, तो उसकी परिभाषा का वह भाग जो पैरामीटर निर्दिष्ट करता है, उसकी पैरामीटर सूची कहलाता है।
इसके विपरीत, [6] तर्क उस प्रकार्य को प्रदान किए गए भाव हैं जब इसे कहा जाता है, सामान्यतः एक अभिव्यक्ति जो किसी एक पैरामीटर से अनुकूल है। पैरामीटर के विपरीत, जो प्रकार्य की परिभाषा का एक अपरिवर्तनीय भाग है, तर्क कॉल से कॉल में भिन्न हो सकता हैं। प्रत्येक बार एक प्रकार्य को कॉल किया जाता है, प्रकार्य कॉल का भाग जो तर्कों को निर्दिष्ट करता है उसे तर्क सूची कहा जाता है।
यद्यपि पैरामीटर को सामान्यतः तर्कों के रूप में संदर्भित किया जाता है, तर्कों को कभी-कभी वास्तविक मान या पैरामीटर चर के संदर्भ के रूप में माना जाता है जब सबरूटीन को कार्यावधि पर संबोधित किया जाता है। सबरूटीन में कॉल करने वाले कोड पर बातचित करते समय, सबरूटीन में पारित कोई भी मान या संदर्भ तर्क होते हैं, और कोड में वह स्थान जहां ये मान या संदर्भ दिए गए हैं, वह पैरामीटर सूची है। सबरूटीन परिभाषा के अंतर्गत कोड पर बातचित करते समय, सबरूटीन की पैरामीटर सूची में चर पैरामीटर हैं, जबकि कार्यावधि पर पैरामीटर के मान तर्क हैं। उदाहरण के लिए, C में, क्रम से वितरण के समय शून्य * प्रकार के तर्क में पारित होना सामान्य बात है और इसे अपेक्षित प्रकार में विक्षेप किया जाता है:
void ThreadFunction(void* pThreadArgument)
{
// Naming the first parameter 'pThreadArgument' is correct, rather than
// 'pThreadParameter'. At run time the value we use is an argument. As
// mentioned above, reserve the term parameter for when discussing
// subroutine definitions.
}
अंतर को अधिक समझने के लिए, C में लिखे गए निम्नलिखित प्रकार्य पर विचार करें:
int Sum(int addend1, int addend2)
{
return addend1 + addend2;
}
प्रकार्य योग के दो पैरामीटर हैं, जिनका नाम addend1 और addend2 है। यह पैरामीटर में दिए गए मान जोड़ता है, और सबरूटीन के कॉलर को परिणाम देता है (C अनुभाषक द्वारा स्वचालित रूप से आपूर्ति की गई तकनीक का उपयोग करके)।
सम प्रकार्य को कॉल करने वाला कोड इस तरह दिखाई दे सकता है:
int value1 = 40;
int value2 = 2;
int sum_value = Sum(value1, value2);
चर value1 और value2 मानों के साथ प्रारंभ किए गए हैं। इस संदर्भ में, value1 और value2, दोनों योग प्रकार्य के लिए तर्क हैं।
कार्यावधि पर, इन परिवर्त्य को नियुक्त किए गए मान प्रकार्य योग को तर्कों के रूप में पारित किया जाता है। योग प्रकार्य में, पैरामीटर addend1 और addend2 का मूल्यांकन किया जाता है, जिससे क्रमशः तर्क 40 और 2 प्राप्त किया जाता है। तर्कों के मान जोड़े जाते हैं, और परिणाम कॉलर को वापस कर दिया जाता है, जहां इसे चर योग मूल्य को नियुक्त किया जाता है।
पैरामीटर और तर्कों के मध्य अंतर के कारण, किसी प्रकार्य को अनुचित तर्क देना संभव है। कॉल बहुत अधिक या बहुत कम तर्क प्रदान कर सकता है; एक या अधिक तर्क गलत प्रकार के हो सकते हैं; या तर्क गलत क्रम में दिए जा सकते हैं। इनमें से कोई भी स्थिति पैरामीटर और तर्क सूचियों के मध्य अवतरण का कारण बनती है, और प्रकार्य प्रायः अनपेक्षित उत्तर देता है या कार्यावधि त्रुटि उत्पन्न करता है।
एफिल में वैकल्पिक सम्मेलन
एफिल सॉफ्टवेयर विकास पद्धति और भाषा के अंतर्गत, संबंध के तर्क और पैरामीटर के अलग-अलग उपयोग सम्मेलन द्वारा स्थापित किए गए हैं। शब्द तर्क विशेष रूप से नियमित इनपुट के संदर्भ में प्रयोग किए जाते है,[7] और अवधि पैरामीटर का उपयोग विशेष रूप से सामान्य वर्गों के लिए प्रकार पैरामीटरकरण में किया जाता है।[8]
निम्नलिखित नियमित परिभाषा पर विचार करें:
sum (addend1: INTEGER; addend2: INTEGER): INTEGER
do
Result := addend1 + addend2
end
रूटीन sum
में दो तर्क होते हैंaddend1
और addend2
, जिन्हें रूटीन का औपचारिक तर्क कहा जाता है। कॉल से sum
वास्तविक तर्कों को निर्दिष्ट करता है, जैसा किvalue1
और value2
के साथ नीचे दिखाया गया है।
sum_value: INTEGER
value1: INTEGER = 40
value2: INTEGER = 2
…
sum_value := sum (value1, value2)
पैरामीटर को या तो औपचारिक या वास्तविक माना जाता है। सामान्य वर्ग की परिभाषा में औपचारिक सामान्य पैरामीटर का उपयोग किया जाता है। नीचे दिए गए उदाहरण में, class HASH_TABLE
एक सामान्य वर्ग के रूप में अभिप्रेत किया गया है जिसमें दो औपचारिक सामान्य पैरामीटर हैं, G
प्रभावित डेटा का प्रतिनिधित्व करता है औरK
डेटा के लिए हैश कुंजी का प्रतिनिधित्व करता है:
class HASH_TABLE [G, K -> HASHABLE]
…
जब एक वर्ग HASH_TABLE का
ग्राहक बन जाता है, तो सामान्य व्युत्पत्ति में औपचारिक सामान्य पैरामीटर को वास्तविक सामान्य पैरामीटर के साथ प्रतिस्थापित किया जाता है। निम्नलिखित विशेषता विवरण में, my_dictionary
एक वर्ण स्ट्रिंग आधारित शब्दकोश के रूप में उपयोग किया जाता है। इस प्रकार, डेटा और प्रमुख औपचारिक सामान्य पैरामीटर दोनों को STRING
प्रकार के वास्तविक सामान्य पैरामीटर के साथ प्रतिस्थापित किया जाता है।
my_dictionary: HASH_TABLE [STRING, STRING]
डेटा प्रकार
दृढ़ता से टाइप की गई क्रमादेशन भाषाओं में, प्रत्येक पैरामीटर के डेटाटाइप को प्रकार्य विवरण में निर्दिष्ट किया जाना चाहिए। प्रकार अनुमान का उपयोग करने वाली भाषाएं प्रकार्य के तत्व और उपयोग से स्वचालित रूप से प्रकारों को खोजने का प्रयास करती हैं। गतिकीय रूप से टाइप की गई क्रमादेशन भाषा कार्यावधि तक प्ररूप विश्लेषण को अलग करती हैं। अशक्त रूप से टाइप की गई भाषाएँ शुद्धता के लिए क्रमादेशक पर निर्भर होने के बदले, बिना किसी प्रकार के संकल्प के बहुत कम प्रदर्शन करती हैं।
कुछ भाषाएँ यह इंगित करने के लिए एक विशेष संकेत शब्द (जैसे शून्य) का उपयोग करती हैं कि सबरूटीन का कोई पैरामीटर नहीं है; औपचारिक प्रकार के सिद्धांत में, ऐसे कार्य एक रिक्त पैरामीटर सूची लेते हैं (जिसका प्रकार शून्य नहीं है, अथवा इकाई है)।
प्राचर पारण
पैरामीटर को तर्क देने के लिए यथार्थ प्रकार्य, जिसे तर्क पारित करना कहा जाता है, उस पैरामीटर के लिए उपयोग की जाने वाली मूल्यांकन रणनीति पर निर्भर करता है (सामान्यतः मूल्य द्वारा कॉल किया जाता है), जिसे संकेत शब्द का उपयोग करके निर्दिष्ट किया जा सकता है।
व्यतिक्रम तर्क
कुछ क्रमादेशन भाषा जैसे Ada (क्रमादेशन भाषा), C++, क्लोजर,[citation needed] सामान्य लिस्प,[9] फोरट्रान 90,[10] पायथन (क्रमादेशन भाषा), रूबी (क्रमादेशन भाषा) , Tcl (क्रमादेशन भाषा), और विंडोज पॉवरशेल[citation needed] सबरूटीन की विवरण में स्पष्ट या निहित रूप से दिए जाने वाले व्यतिक्रम तर्क की अनुमति देते हैं। यह कॉल करने वाले को सबरूटीन कॉल करते समय उस तर्क को छोड़ने की अनुमति देते है। यदि व्यतिक्रम तर्क स्पष्ट रूप से दिया गया है, तो कॉलर द्वारा प्रदान नहीं किए जाने पर उस मान का उपयोग किया जाता है। यदि व्यतिक्रम तर्क निहित है (कभी-कभी वैकल्पिक जैसे संकेत शब्द का उपयोग करके) तो कॉलर द्वारा कोई मान प्रदान नहीं किए जाने पर भाषा एक प्रसिद्ध मान (जैसे शून्य सूचक, रिक्त, शून्य, एक रिक्त स्ट्रिंग, आदि) प्रदान करती है।
पॉवरशेल उदाहरण:
function doc($g = 1.21) {
"$g gigawatts? $g gigawatts? Great Scott!"
}
PS > doc
1.21 gigawatts? 1.21 gigawatts? Great Scott!
PS > doc 88
88 gigawatts? 88 gigawatts? Great Scott!
व्यतिक्रम तर्कों को चर-लंबाई तर्क सूची के विशेष प्रकरण के रूप में देखा जा सकता है।
चर-लंबाई पैरामीटर सूची
कुछ भाषाएँ तर्कों की चर संख्या को स्वीकार करने के लिए सबरूटीन को परिभाषित करने की अनुमति देती हैं। ऐसी भाषाओं के लिए, सबरूटीन को तर्कों की सूची के माध्यम से पुनरावृति करना चाहिए।
पॉवरशेल उदाहरण:
function marty {
$args | foreach { "back to the year $_" }
}
PS > marty 1985
back to the year 1985
PS > marty 2015 1985 1955
back to the year 2015
back to the year 1985
back to the year 1955
नामित पैरामीटर
कुछ क्रमादेशन भाषा- जैसे एडा (क्रमादेशन भाषा) और विंडोज पॉवरशेल- सबरूटीन्स को नामित पैरामीटर रखने की अनुमति देते हैं। यह आह्वान कोड को अधिक स्व-दस्तावेजीकरण करने की अनुमति देते है। यह कॉल करने वाले को अधिक नम्यता भी प्रदान करते है, प्रायः तर्कों के क्रम को बदलने की अनुमति देते है, या आवश्यकतानुसार तर्कों को छोड़ देते है।
पॉवरशेल उदाहरण:
function jennifer($adjectiveYoung, $adjectiveOld) {
"Young Jennifer: I'm $adjectiveYoung!"
"Old Jennifer: I'm $adjectiveOld!"
}
PS > jennifer 'fresh' 'experienced'
Young Jennifer: I'm fresh!
Old Jennifer: I'm experienced!
PS > jennifer -adjectiveOld 'experienced' -adjectiveYoung 'fresh'
Young Jennifer: I'm fresh!
Old Jennifer: I'm experienced!
कार्यात्मक भाषाओं में एकाधिक पैरामीटर
लैम्ब्डा गणना में, प्रत्येक प्रकार्य में यथार्थत: एक पैरामीटर होता है। कई पैरामीटर वाले कार्यों के बारे में क्या सोचा जाता है, सामान्यतः लैम्ब्डा गणना में एक प्रकार्य के रूप में दर्शाया जाता है जो पहला तर्क लेता है, और एक प्रकार्य देता है जो अन्य तर्कों को लेता है; यह एक परिवर्तन है जिसे विच्छेदन के रूप में जाना जाता है। कुछ क्रमादेशन भाषाएं, जैसे एमएल (क्रमादेशन भाषा) और हास्केल, इस योजना का अनुकरण करती हैं। इन भाषाओं में, प्रत्येक प्रकार्य में यथार्थत: एक पैरामीटर होता है, और जो कई पैरामीटर के प्रकार्य की परिभाषा की तरह दिख सकता है, वास्तव में प्रकार्य की परिभाषा के लिए वाक्यविन्यास खंड है जो प्रकार्य आदि देता है। प्रकार्य आवेदन इन भाषाओं के साथ-साथ लैम्ब्डा गणना में बाएं-सहयोगी है, तो क्या लगता है कि एक से अधिक तर्कों के लिए एक प्रकार्य के अनुप्रयोग का सही प्रकार से मूल्यांकन किया जाता है, क्योंकि प्रकार्य पहले तर्क पर उपयोजित होता है, फिर परिणामी प्रकार्य दूसरे तर्क आदि पर उपयोजित होता है।
आउटपुट पैरामीटर
आउटपुट पैरामीटर, जिसे आउट पैरामीटर या प्रतिफल पैरामीटर के रूप में भी जाना जाता है, इनपुट के अधिक सामान्य उपयोग के बदले आउटपुट के लिए उपयोग किया जाने वाला पैरामीटर है। संदर्भ पैरामीटर द्वारा कॉल का उपयोग करना, या मूल्य पैरामीटर द्वारा कॉल करना जहां मूल्य एक संदर्भ है, क्योंकि आउटपुट पैरामीटर कुछ भाषाओं में एक मुहावरा है, विशेष रूप से C और C++,[lower-alpha 2] जबकि अन्य भाषाओं में आउटपुट पैरामीटर के लिए अंतर्निहित समर्थन है। आउटपुट पैरामीटर के लिए अंतर्निहित समर्थन वाली भाषाओं में एडा [11] (क्रमादेशन भाषा देखें), फोरट्रान (फोरट्रान 90 के बाद से; फोरट्रान "उद्देश्य" देखें)), SQL के लिए विभिन्न प्रकार्यत्मक विस्तार, जैसे PL/SQL (PL/SQL प्रकार्य देखें)[12] और Transact-SQL, C Sharp [13] और .NET संरचना,[14] स्विफ्ट (क्रमादेशन भाषा),[15] और लिपिन्यास भाषा टीस्क्रिप्ट (टीस्क्रिप्ट प्रकार्य विवरण) सम्मलित है।
अधिक निश्चित रूप से, कोई तीन प्रकार के पैरामीटर या पैरामीटर विधि में अंतर कर सकते है: इनपुट पैरामीटर, आउटपुट पैरामीटर, और इनपुट/आउटपुट पैरामीटर; इन्हें प्रायः in
, out
, और in out
या inout
के रूप में दर्शाया जाता है। एक इनपुट तर्क (इनपुट पैरामीटर के लिए तर्क) एक मान होना चाहिए, जैसे प्रारंभिक चर या शाब्दिक, और इसे फिर से परिभाषित या नियुक्त नहीं किया जाना चाहिए; एक आउटपुट तर्क एक नियुक्त करने योग्य चर होना चाहिए, लेकिन इसे प्रारंभ करने की आवश्यकता नहीं है, कोई स्थित मान पहुंच योग्य नहीं है, और इसे एक मान निर्दिष्ट किया जाना चाहिए; और एक इनपुट/आउटपुट तर्क एक प्रारंभिक, नियुक्त करने योग्य चर होना चाहिए, और वैकल्पिक रूप से एक मान नियुक्त किया जा सकता है। भाषाओं के मध्य यथार्थ आवश्यकताएं और प्रवर्तन अलग-अलग होते हैं - उदाहरण के लिए, Ada 83 में आउटपुट पैरामीटर केवल नियतन के बाद भी नियुक्त किए, पढ़े नहीं जा सकते हैं (इसे Ada 95 में एक सहायक संचायक चर की आवश्यकता को हटाने के लिए हटा दिया गया था)। ये एक r-मूल्य (एक मूल्य है), एक l-मूल्य (नियुक्त किया जा सकता है), या एक r-मूल्य/l-मूल्य (एक मूल्य है) के अभिव्यक्ति में मूल्य (कंप्यूटर विज्ञान) की धारणा के अनुरूप हैं), क्रमशः, हालांकि इन शब्दों का C में विशेष अर्थ है।
कुछ प्रकरणों में केवल इनपुट और इनपुट/आउटपुट को अलग किया जाता है, आउटपुट को इनपुट/आउटपुट का एक विशिष्ट उपयोग माना जाता है, और अन्य प्रकरणों में केवल इनपुट और आउटपुट (लेकिन इनपुट/आउटपुट नहीं) समर्थित होते हैं। व्यतिक्रम अवस्था भाषाओं के मध्य भिन्न होते है: फोरट्रान में 90 इनपुट/आउटपुट व्यतिक्रम है, जबकि C# और SQL विस्तार में इनपुट व्यतिक्रम है, और TScript में प्रत्येक पैरामीटर को इनपुट या आउटपुट के रूप में स्पष्ट रूप से निर्दिष्ट किया गया है।
सांकेतिक रूप से, पैरामीटर अवस्था को सामान्यतः प्रकार्य विवरण में एक संकेत शब्द के साथ इंगित किया जाता है, जैसे C# में void f(out int x)
किया जाता है। परंपरागत रूप से आउटपुट पैरामीटर को प्रायः पैरामीटर सूची के अंत में स्पष्ट रूप से अलग करने के लिए रखा जाता है, हालांकि इसका हमेशा अनुगमन नहीं किया जाता है। TScript एक अलग दृष्टिकोण का उपयोग करता है, जहां प्रकार्य विवरण में इनपुट पैरामीटर सूचीबद्ध होते हैं, फिर आउटपुट पैरामीटर, एक कोलन (:) द्वारा अलग किए जाते हैं और प्रकार्य में स्वयं कोई प्रतिफल प्रकार नहीं होता है, जैसा कि इस प्रकार्य में होता है, जो टेक्स्ट खंड के आकार की गणना करता है:
TextExtent(WString text, Font font : Integer width, Integer height)
पैरामीटर अवस्था वस्त्वर्थक अर्थविज्ञान का एक रूप है, जो क्रमादेशक के उद्देश्य को बताता है और अनुभाषक को त्रुटियों को पकड़ने और इष्टतमीकरण उपयोजित करने की अनुमति देता है - वे अनिवार्य रूप से परिचालन अर्थविज्ञान (कैसे पैरामीटर अस्थायी वास्तव में होता है) को उपयोजित नहीं करते हैं। विशेष रूप से, हालांकि इनपुट पैरामीटर को मान आह्वान द्वारा उपयोजित किया जा सकता है, और आउटपुट और इनपुट/आउटपुट पैरामीटर को संदर्भ आह्वान द्वारा उपयोजित किया जा सकता है - और यह बिना अंतर्निर्मित समर्थन के इन प्रकार के भाषाओं में करने का एक सीधा प्रकार है - यह हमेशा ऐसा नहीं होता है कि उन्हें कैसे उपयोजित किया जाता है। इस भेद पर Ada '83 औचित्य में विस्तार से बातचित की गई है, जो इस बात पर महत्त्व देता है कि पैरामीटर अवस्था संक्षिप्त है जिससे पैरामीटर पारक प्रकार्यविधि (संदर्भ द्वारा या प्रतिलिपि द्वारा) वास्तव में कार्यान्वित किया जाता है।[11] उदाहरण के लिए, जबकि C# में इनपुट पैरामीटर (व्यतिक्रम, कोई संकेत शब्द नहीं) मान द्वारा पारित किए जाते हैं, और आउटपुट और इनपुट/आउटपुट पैरामीटर (out
और ref
) संदर्भ द्वारा पारित किए जाते हैं, पीएल/एसक्यूएल इनपुट पैरामीटर (IN
) में संदर्भ द्वारा पारित किए जाते हैं, और आउटपुट और इनपुट/आउटपुट पैरामीटर (OUT
और IN OUT
) व्यतिक्रम रूप से मान द्वारा पारित किए जाते हैं और परिणाम वापस अनुकरण किया जाता है, लेकिनNOCOPY
संकलक संकेत का उपयोग करके संदर्भ द्वारा पारित किया जा सकता है।[16]
आउटपुट पैरामीटर के लिए एक वाक्य रचनात्मक रूप से समान निर्माण प्रकार्य के समान नाम वाले चर के लिए प्रतिफल मान निर्दिष्ट करता है। यह पारित्कल (क्रमादेशन भाषा) और फोरट्रान 66 और फोरट्रान 77 में पाया जाता है, जैसा कि इस पारित्कल उदाहरण में है:
function f(x, y: integer): integer;
begin
f := x + y;
end;
यह अर्थ की दृष्टि से भिन्न है कि जब कॉल किया जाता है, तो प्रकार्य का मूल्यांकन किया जाता है - यह आउटपुट को भंडार करने के लिए आह्वान क्षेत्र (कंप्यूटर साइंस) से एक चर पारित नहीं किया गया है।
प्रयोग
आउटपुट पैरामीटर का प्राथमिक उपयोग प्रकार्य से एकाधिक मान वापस करना है, जबकि इनपुट/आउटपुट पैरामीटर का उपयोग पैरामीटर पारक (सहभाजित वातावरण के बदले, वैश्विक चर के रूप में) का उपयोग करके स्थिति को संशोधित करना है। एकाधिक मानों को वापस करने का एक महत्वपूर्ण उपयोग एक मान और एक त्रुटि स्थिति दोनों को वापस करने की अर्धसूत्रीय समस्या समाधान करना है - अर्ध विधेय समस्या: बहुमूल्यवान प्रतिफल देखें।
उदाहरण के लिए, C में किसी प्रकार्य से दो चर वापस करने के लिए, कोई लिख सकता है:
int width
int height;
F(x, &width, &height);
जहाँx
एक इनपुट पैरामीटर है और width
और height
आउटपुट पैरामीटर हैं।
C और संबंधित भाषाओं में एक सामान्य उपयोग प्रकरण अपवाद से निपटने के लिए है, जहां एक प्रकार्य प्रतिफल मान को आउटपुट चर में रखता है, और प्रकार्य सफल हुआ या नहीं, इसके अनुरूप एक बूलियन देता है। एक आदर्श उदाहरण .NET में TryParse
विधि है, विशेष रूप से C#, जो एक पूर्णांक में स्ट्रिंग को एक पदव्याख्या करता है, सफलता पर true
और विफलता पर false
होता है। इसमें निम्नलिखित हस्ताक्षर हैं:[17]
public static bool TryParse(string s, out int result)
और इस तरह प्रयुक्त किया जा सकता है:
int result;
if (!Int32.TryParse(s, result)) {
// exception handling
}
इसी तरह के विचार कई संभावित प्रकारों में से एक के मूल्य को वापस करने के लिए उपयोजित होते हैं, जहां वापसी मूल्य प्रकार निर्दिष्ट कर सकता है और फिर कई आउटपुट चर में से एक में मूल्य संग्रहीत किया जाता है।
कमियां
आधुनिक क्रमादेशन में आउटपुट पैरामीटर को प्रायः हतोत्साहित किया जाता है, अनिवार्य रूप से अनुपयुक्त, भ्रामक और बहुत निम्न-स्तर के रूप में - सामान्य प्रतिफल मान समझने और काम करने में अत्याधिक आसान होते हैं।[18] विशेष रूप से, आउटपुट पैरामीटर में अनुषंगी प्रभाव (आउटपुट पैरामीटर को संशोधित करना) के साथ कार्य सम्मिलित होते हैं और शब्दार्थ संदर्भ के समान होते हैं, जो शुद्ध प्रकार्य और मूल्यों की तुलना में अधिक भ्रमित होते हैं, और आउटपुट पैरामीटर और इनपुट/आउटपुट पैरामीटर के मध्य अंतर सूक्ष्म हो सकते है। इसके अलावा, क्योंकि सामान्य क्रमादेशन शैलियों में अधिकांश पैरामीटर केवल इनपुट पैरामीटर हैं, आउटपुट पैरामीटर और इनपुट/आउटपुट पैरामीटर असामान्य हैं और इसलिए भ्रम के लिए अतिसंवेदनशील हैं।
आउटपुट और इनपुट/आउटपुट पैरामीटर प्रकार्य संरचना (कंप्यूटर विज्ञान) को रोकते हैं, क्योंकि आउटपुट अभिव्यक्ति के मूल्य के बदले चर में संग्रहीत होते है। इस प्रकार किसी को प्रारंभ में एक चर अभिप्रेत करना चाहिए, और फिर प्रकार्य की श्रृंखला के प्रत्येक पद को एक अलग कथन में होना चाहिए। उदाहरण के लिए, C ++ में निम्न प्रकार्य संरचना:
Object obj = G(y, F(x));
जब आउटपुट और इनपुट/आउटपुट पैरामीटर के साथ लिखा जाता है (F
के लिए यह एक आउटपुट पैरामीटर है, G
एक इनपुट/आउटपुट पैरामीटर के लिए):
Object obj;
F(x, &obj);
G(y, &obj);
एकल आउटपुट या इनपुट/आउटपुट पैरामीटर वाले प्रकार्य के विशेष प्रकरण में और कोई वापसी मान नहीं है, प्रकार्य संयोजन संभव है यदि आउटपुट या इनपुट/आउटपुट पैरामीटर (या C/C++ में, इसका पता) भी प्रकार्य द्वारा लौटाया जाता है, जिस स्थिति में उपरोक्त बन जाता है:
Object obj;
G(y, F(x, &obj));
विकल्प
आउटपुट पैरामीटर के उपयोग के प्रकरणों के लिए कई विकल्प हैं।
किसी प्रकार्य से एकाधिक मान वापस करने के लिए, एक विकल्प टपल वापस करना है। यदि Go या पायथन में स्वचालित अनुक्रम विकुलन और समानांतर नियुक्त का उपयोग किया जा सकता है, तो यह वाक्यात्मक रूप से स्पष्ट है:
def f():
return 1, 2
a, b = f()
कई प्रकारों में से किसी एक का मान लौटाने के लिए, इसके बदले चिन्हित किए गए संघ का उपयोग किया जा सकता है; सबसे सामान्य प्रकरण अशक्त प्रकार (विकल्प प्रकार) हैं, जहां वापसी मूल्य विफलता को इंगित करने के लिए शून्य हो सकता है। अपवाद से प्रबंधन के लिए, कोई अशक्त प्रकार वापस कर सकता है, या एक अपवाद बढ़ा सकता है। उदाहरण के लिए, पायथन में किसी के पास हो सकता है:
result = parse(s)
if result is None:
# exception handling
या, अधिक मुहावरेदार भाषा में:
try:
result = parse(s)
except ParseError:
# exception handling
स्थानीय चर की आवश्यकता नहीं होने और आउटपुट चर का उपयोग करते समय प्रतिफल की प्रतिलिपि बनाने के माइक्रो-इष्टतमीकरण को पारंपरिक प्रकार्य पर भी उपयोजित किया जा सकता है और पर्याप्त रूप से परिष्कृत अनुभाषकों द्वारा मूल्यों को लौटाया जा सकता है।
C और संबंधित भाषाओं में आउटपुट पैरामीटर का सामान्य विकल्प सभी प्रतिफल मूल्य वाले एकल डेटा संरचना को वापस करना है।[13]उदाहरण के लिए, चौड़ाई और ऊंचाई को प्रावरण वाली संरचना दी गई है, कोई लिख सकता है:
WidthHeight width_and_height = F(x);
वस्तु अभिमुखित भाषाओं में, इनपुट/आउटपुट पैरामीटर का उपयोग करने के बदले, एक व्यक्ति प्रायः सहभाजन करके कॉल का उपयोग कर सकता है, किसी वस्तु के संदर्भ को पारित कर सकता है और फिर वस्तु को बदलना, हालांकि यह नहीं बदल रहा है कि चर किस वस्तु को संदर्भित करता है।[18]
यह भी देखें
टिप्पणियाँ
- ↑ In this article, the term "subroutine" refers to any subroutine-like construct, which have different names and slightly different meanings depending on the programming language being discussed.
- ↑ C and C++ are call by value, but if type is a reference (a C/C++ pointer or C++ reference), then setting the value of the reference can be used to produce call by reference style behavior.
संदर्भ
- ↑ "Passing Information to a Method or a Constructor (The Java™ Tutorials > Learning the Java Language > Classes and Objects)". Oracle.com. Retrieved 2021-09-09.
Parameters refers to the list of variables in a method declaration. Arguments are the actual values that are passed in when the method is invoked. When you invoke a method, the arguments used must match the declaration's parameters in type and order.
- ↑ Prata, Stephen (2004). सी प्राइम अधिक (5th ed.). Sams. pp. 276–277. ISBN 978-0-672-32696-7.
- ↑ "वर्किंग ड्राफ्ट, प्रोग्रामिंग लैंग्वेज C++ के लिए मानक" (PDF). www.open-std.org. Archived from the original (PDF) on December 14, 2005. Retrieved 1 January 2018.
- ↑ Gordon, Aaron. "उपप्रोग्राम और पैरामीटर पासिंग". rowdysites.msudenver.edu/~gordona. Archived from the original on 1 January 2018. Retrieved 1 January 2018.
- ↑ Dollard, Kathleen. "मूल्य और संदर्भ द्वारा तर्क पास करना (विजुअल बेसिक)". docs.microsoft.com (in English). Retrieved 2018-10-27.
- ↑ "जीएनयू सी प्रोग्रामिंग ट्यूटोरियल". crasseux.com (in English). Retrieved 2018-10-27.
- ↑ Meyer, Bertrand. Object-Oriented Software Construction, 2nd Edition, Prentice Hall, 1997, p 444.
- ↑ Meyer, p. 96.
- ↑ "कार्य". gigamonkeys.com. Retrieved 2021-06-02.
- ↑ "वैकल्पिक तर्क". www.netlib.org. Retrieved 2021-06-02.
- ↑ 11.0 11.1 8.2 Parameter Modes, "Rationale for the Design of the Ada® Programming Language"
- ↑ 8. PL/SQL Subprograms: Specifying Subprogram Parameter Modes
- ↑ 13.0 13.1 Peter Hallam. "Why does C# have both 'ref' and 'out'?". Archived from the original on 2011-09-26.
- ↑ ParameterDirection Enumeration
- ↑ Functions — The Swift Programming Language (Swift 4.2)
- ↑ 8. PL/SQL Subprograms: Passing Large Data Structures with the NOCOPY Compiler Hint
- ↑ Int32.TryParse Method (String, Int32)
- ↑ 18.0 18.1 CA1021: Avoid out parameters