2014-05-15 4 views
7

मैं एक ऐसा फ़ंक्शन लिखने की कोशिश कर रहा हूं जो मेरे सरल सी सांप गेम में स्क्रीन बदलता है।एक फंक्शन के अंदर सी में अद्यतन (int) चर

main(){ 
    int stage = 0; 
    ... 
    .. 
    . 
    while(stage!=0){ 
    //if snake hits wall 
    changeStage(stage); 
    } 
} 

समारोह:

void changeStage(int stage){ 
    stage = 1; 
} 

इस कोड को कोड को अद्यतन नहीं है, यह चल रहा है पर रखेंगे। मेरे कोड में क्या गलत है?

+0

आप मूल्य के आधार पर एक चर पारित कर रहे हैं (आप सी में संदर्भ द्वारा पारित नहीं कर सकते हैं)। पॉइंटर्स का प्रयोग करें। – DevNull

+0

आपको _ [स्कोप] (http://en.wikipedia.org/wiki/Variable_scope#Levels_of_scope) _ की अवधारणा को समझने की आवश्यकता है। _। – user3386109

+0

वोटिंग के लिए धन्यवाद। और शीर्षक वास्तव में समझता है "परिवर्तनीय कैसे बदलें" - जब मैं इसे किसी फ़ंक्शन के अंदर करने के लिए कह रहा हूं। शायद एक बेहतर शीर्षक होने से मुझे उस धागे को खोजने की अनुमति होगी। धन्यवाद! – user3589718

उत्तर

12

stagechangeStage पर मूल्य से गुजरता है। stage = 1stage में changeStage में स्थानीय मान को केवल stage का मान main में परिवर्तित नहीं करता है। आपको इसके बजाय एक पॉइंटर पास करना होगा:

while (stage != 0) { 
    changeStage(&stage); 
} 

void changeStage(int *stage) { 
    *stage = 1; 
} 
2

सी फ़ंक्शन तर्क पास-दर-मूल्य हैं। इसका मतलब है कि संदर्भ से stage पास करने के बजाय आप इसमें संग्रहीत मूल्य पारित कर रहे हैं। अद्यतन जो आप changeStage फ़ंक्शन में करते हैं, उसके बाद केवल उस प्रतिलिपि पर लागू होता है जो बनाया गया है।

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

void changeStage(int* stage_p){ 
    *stage_p = 1; 
} 

int main() { 
    //... 
    while(stage!=0){ 
     //if snake hits wall 
     changeStage(&stage); 
    } 
} 

&stagestage का पता लेने के लिए और कार्य करने के लिए है कि पारित करने के लिए कहते हैं। stage_p तर्क तब मुख्य में int को इंगित करेगा।

*stage_pstage_p द्वारा इंगित मूल्य का उपयोग करने का कारण बनता है, जो आपके मामले में मुख्य में stage है।

Further reading

6

सी मूल्य भाषा से एक पास है। जो भी आप चाहते हैं उसे पूरा करने का सबसे आसान तरीका यह है कि आपको बदलने के लिए आवश्यक चर के संदर्भ को पास करना है। उदाहरण के लिए:

void changeStage(int *stage){ 
    *stage = 1; 
} 

main(){ 
    int score = 0; 
    int stage = 0; 
    ... 
    .. 
    . 
    while(stage!=0){ 
    //if snake hits wall 
    changeStage(&stage); 
} 
} 

ध्यान दें: आप अगर आप सिर्फ सी प्रोग्रामिंग के साथ शुरुआत कर रहे हैं पूरी तरह से कोड को समझने के लिए संकेत पर पढ़ने की जरूरत हो सकती है। उदाहरण कोड में, 'चरण' के मान को पारित करने के बजाय, आप उस स्थान को पास करते हैं जहां 'चरण' का मान संग्रहीत किया जाता है। फ़ंक्शन फिर स्थान में सामग्री को संशोधित कर सकता है।

2

आप मूल stage चर को संशोधित नहीं कर रहे हैं, लेकिन केवल changeStage समारोह के अंदर एक स्थानीय प्रतिलिपि संशोधित। समारोह का उपयोग कर

void changeStage(int* stage) 
{ 
    *stage = 1; 
} 

:

while (stage != 0) 
{ 
    // if snake hits wall 
    changeStage(&stage); 
} 

आप सी भाषा का अधिक बुनियादी अवधारणाओं जानने की जरूरत है

आप एक सूचक का उपयोग करने की जरूरत है। सी भाषा में सूचक एक बहुत ही महत्वपूर्ण विशेषता है।

1

सही, यदि आप मुख्य() में चर के मान को बदलना चाहते हैं तो आप सूचक को पास करने की आवश्यकता है या आप इसे वैश्विक चर के रूप में बना सकते हैं, इस तरह यह कार्यों और मुख्य दोनों में accesable है।

static int stage = 0; 

void changeStage(){ 
    stage = 1; 
    } 

main(){ 
int score = 0; 

... 
.. 
. 
while(stage!=0){ 
    //if snake hits wall 
    changeStage(); 
} 
} 
संबंधित मुद्दे