खोज…


टिप्पणियों

सी में, त्रुटियों को उत्पन्न करने के लिए रिटर्न मान का उपयोग करना आम है; और संकेत में पारित के उपयोग के माध्यम से डेटा वापस करने के लिए। यह कई कारणों से किया जा सकता है; जिसमें फ़ंक्शन कहा जाता है, उस बिंदु पर स्मृति को आवंटित करने या स्थैतिक आवंटन का उपयोग न करने सहित।

कई मानों को वापस करने के लिए सूचक मापदंडों का उपयोग करना

C में एक सामान्य पैटर्न, फ़ंक्शन से कई मानों को आसानी से लौटाने के लिए, पॉइंटर्स का उपयोग करना है।

#include <stdio.h>

void Get( int* c , double* d )
{
    *c = 72; 
    *d = 175.0;
}

int main(void)
{
    int a = 0;
    double b = 0.0;

    Get( &a , &b );

    printf("a: %d, b: %f\n", a , b ); 

    return 0;
}

अर्र्स टू फंक्शन्स में पास होना

int getListOfFriends(size_t size, int friend_indexes[]) {
  size_t i = 0;
  for (; i < size; i++) {
    friend_indexes[i] = i;
  }
}
C99 C11
/* Type "void" and VLAs ("int friend_indexes[static size]") require C99 at least. 
   In C11 VLAs are optional. */
void getListOfFriends(size_t size, int friend_indexes[static size]) {    
  size_t i = 0;
  for (; i < size; i++) {
    friend_indexes[i] = 1;
  }
}

यहाँ फ़ंक्शन पैरामीटर के [] के अंदर static , अनुरोध है कि तर्क सरणी में कम से कम कई तत्व होने चाहिए जो निर्दिष्ट हैं (अर्थात size तत्व)। उस सुविधा का उपयोग करने में सक्षम होने के लिए हमें यह सुनिश्चित करना होगा कि सूची में सरणी पैरामीटर से पहले size पैरामीटर आता है।

getListOfFriends() उपयोग इस तरह करें:

#define LIST_SIZE (50)

int main(void) {
  size_t size_of_list = LIST_SIZE;
  int friends_indexes[size_of_list];

  getListOfFriends(size_of_list, friend_indexes); /* friend_indexes decays to a pointer to the
                                                     address of its 1st element: 
                                                                      &friend_indexes[0] */

  /* Here friend_indexes carries: {0, 1, 2, ..., 49}; */

  return 0;
}

यह सभी देखें

एक फ़ंक्शन के लिए बहुआयामी सरणियों को पास करना

पैरामीटर मान द्वारा पारित किए जाते हैं

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

#include <stdio.h>

void modify(int v) {
    printf("modify 1: %d\n", v); /* 0 is printed */
    v = 42;
    printf("modify 2: %d\n", v); /* 42 is printed */
}

int main(void) {
    int v = 0;
    printf("main 1: %d\n", v); /* 0 is printed */
    modify(v);
    printf("main 2: %d\n", v); /* 0 is printed, not 42 */
    return 0;
}

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

#include <stdio.h>

void modify(int* v) {
    printf("modify 1: %d\n", *v); /* 0 is printed */
    *v = 42;
    printf("modify 2: %d\n", *v); /* 42 is printed */
}

int main(void) {
    int v = 0;
    printf("main 1: %d\n", v); /* 0 is printed */
    modify(&v);
    printf("main 2: %d\n", v); /* 42 is printed */
    return 0;
}

हालाँकि, स्थानीय चर के पते को अप्रकाशित व्यवहार में शांत नतीजे पर लौटाता है। अपने जीवनकाल से परे परिवर्तनशील के लिए एक संकेतक को देखें।

फ़ंक्शन पैरामीटर निष्पादन का आदेश

सी प्रोग्रामिंग में मापदंडों के निष्पादन का क्रम अपरिभाषित है। यहां यह बाएं से दाएं या दाएं से बाएं से निष्पादित हो सकता है। आदेश कार्यान्वयन पर निर्भर करता है।

#include <stdio.h>

void function(int a, int b) 
{
    printf("%d %d\n", a, b);
}

int main(void)
{
    int a = 1;
    function(a++, ++a);
    return 0;
}

त्रुटि कोड के साथ मूल्यों वाले फ़ंक्शन रिटर्निंग संरचना का उदाहरण

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

int func (int *pIvalue)
{
    int iRetStatus = 0;             /* Default status is no change */

    if (*pIvalue > 10) {
        *pIvalue = *pIvalue * 45;   /* Modify the value pointed to */
        iRetStatus = 1;             /* indicate value was changed */
    }

    return iRetStatus;              /* Return an error code */
}

हालाँकि आप किसी रिटर्न वैल्यू के रूप में एक struct का भी उपयोग कर सकते हैं जो आपको अन्य मूल्यों के साथ-साथ एक त्रुटि स्थिति दोनों को वापस करने की अनुमति देता है। उदाहरण के लिए।

typedef struct {
    int    iStat;      /* Return status */
    int    iValue;     /* Return value */
}  RetValue;

RetValue func (int iValue)
{
    RetValue iRetStatus = {0, iValue};

    if (iValue > 10) {
        iRetStatus.iValue = iValue * 45;
        iRetStatus.iStat = 1;
    }

    return iRetStatus;
}

यह फ़ंक्शन तब निम्न नमूने की तरह उपयोग किया जा सकता है।

int usingFunc (int iValue)
{
    RetValue iRet = func (iValue);

    if (iRet.iStat == 1) {
        /* do things with iRet.iValue, the returned value */
    }
    return 0;
}

या यह निम्नलिखित की तरह इस्तेमाल किया जा सकता है।

int usingFunc (int iValue)
{
    RetValue iRet;

    if ( (iRet = func (iValue)).iStat == 1 ) {
        /* do things with iRet.iValue, the returned value */
    }
    return 0;
}


Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow