एक कार्य के लिए एक संरचना पारित नहीं करता है

Aug 16 2020

नीचे दिए गए कोड में मैंने मुख्य से अलग एक फ़ंक्शन बनाया है जो किसी संरचना के अंदर इंट को आधे में विभाजित करता है।

उसके बाद, मैं नया मूल्य प्रिंट करना चाहता हूं। हालाँकि, प्रिंट आउट मान अभी भी पुराना है।

मेरा मानना ​​है कि संरचना और संकेत के बारे में मेरा मौलिक ज्ञान काफी अच्छा नहीं है।

क्या कोई मुझे इस बारे में सहायता कर सकता है? बहुत बहुत धन्यवाद!!!

typedef struct{
    int age;
    int wage;
}person;


void divide(person A)
{
    person half;
    half.age = A.age / 2;
    half.wage = A.wage / 2;
    
    A = half;
}

int main(void)
{
    person A;
    A.age = 30;
    A.wage = 35000;
    
    divide(A);
    
    printf("%i\n", A.age);

}

जवाब

1 Miket25 Aug 16 2020 at 07:56

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

void divide(person* A)
{
    person half;

    half.age  = A->age  / 2;
    half.wage = A->wage / 2;
    
    *A = half;
}

divideमूल संरचना के पते के साथ कहा जाता है

divide(&A);
2 Peter Aug 16 2020 at 08:05

जब आप पास Aहोते हैं divide, की एक प्रति Aबनाई जाती है। इस प्रति को संशोधित करने से आपके द्वारा परिभाषित divideस्थानीय चर पर कोई प्रभाव नहीं पड़ता Aहै main। इसे ठीक करने के लिए, आप कर सकते हैं divideएक ले सूचक को person। एक पॉइंटर प्रभावी रूप से मेमोरी में एक एड्रेस का प्रतिनिधित्व करता है, जैसे कि आप इसका उपयोग अन्य कार्यों में परिभाषित स्थानीय चर तक पहुंच के लिए कर सकते हैं, जो अन्यथा सुलभ नहीं होगा ( यदि आप यह समझना चाहते हैं कि स्टैक फ्रेम क्यों है)।

तो व्यवहार में आप के divideहस्ताक्षर को बदल सकते हैं : void divide(person *A)और इस फ़ंक्शन की अंतिम पंक्ति में, Aलेकिन आप जो कुछ भी करने के लिए नहीं कह रहे हैं , Aवह डीपरेशन ऑपरेटर का उपयोग करके इंगित कर रहा है *A = half:। अपने mainफ़ंक्शन में आप तब ऑपरेटर के पते का उपयोग करने के बजाय स्वयं के पते को पास करते हैं :।AAdividedivide(&A)

संपादित करें: और भी बेहतर, आप halfसीधे प्रदर्शन करके अस्थायी बनाने से बच सकते हैं : A->age /= 2और A->wage /= 2कहाँ के A.xलिए वाक्य रचना चीनी है (*A).x