2010-07-30 16 views
6

यहां मेरी समस्याग्रस्त कोडिंग है: मुझे 2 प्लेयर का नाम लेना है। फिर जब अगले भाग के लिए जब खिलाड़ी मार्कर "CurrentPlayer" में संग्रहीत नाम को बदलता है तो उसे किसी भी खिलाड़ी या प्लेयर दो में संग्रहीत नाम भी बदलना चाहिए। ऐसा नहीं है कि मैं इसे कैसे ठीक करूं? कृपया हल करें, मैंने इसे & प्रतीक के साथ एक संदर्भ चर बनाने की कोशिश की लेकिन मुझे एक त्रुटि मिली है जिसमें संदर्भ की सरणी की अनुमति नहीं है।फ़ंक्शन में चार सरणी पास करना?

void boardMarker(int &, char playerOne[], char playerTwo[], char &playerMarker, char currentPlayer[]); 

int main() 

{ 
    char playerOne[100]; 
    char playerTwo[100]; 
    char currentPlayer[100] = "playername"; 

    boardMarker(playerTurn, playerOne, playerTwo, playerMarker, currentPlayer); 

} 
void boardMarker(int &playerTurn, char playerOne[100], char playerTwo[100], char &playerMarker, char currentPlayer[100]) 
{ 
    // Set player markers 
    //Player 1 uses X and Player 2 uses O 
    if (playerTurn == 1) 
    { 
     playerMarker = 'X'; 
     currentPlayer = playerOne; 
    } 
    else 
    { 
     playerMarker = 'O'; 
     currentPlayer = playerTwo; 
    } 
} 
+2

जो भी नीचे मतदान किया गया, यह अनुचित था। यह एक अच्छी तरह से लिखा प्रश्न है। – abelenky

+0

मुझे यह भी नहीं पता कि कैसे कहना है कि आपका कोड अभी कितना गलत दिखता है। क्या यह संकलित भी करता है?!?!? उदाहरण के लिए, आप पैरामीटर के रूप में उपयोग करते हैं जिसे प्लेयर टर्न नाम दिया गया है जिसे कभी घोषित नहीं किया गया था। – karlphillip

+2

उस मामले में, आपने स्कोर को स्तर देने के लिए क्यों नहीं उठाया? – catchmeifyoutry

उत्तर

5
  • आप एक दूसरे के लिए सरणियों असाइन नहीं कर सकते
  • कार्यों के लिए पारित किया है, संकेत करने के लिए सरणियों क्षय, तो एक तर्क के रूप, char playerOne[100] के समान है (आप उन्हें तत्व द्वारा तत्व नकल करने के लिए है) char* playerOne
  • char* को char* पर असाइन करना स्ट्रिंग की प्रतिलिपि नहीं करता है, यह सूचक को प्रतिलिपि बनाता है। के बाद से इस सी ++ और नहीं सी, std::stringchar के बजाय सरणियों का उपयोग करें,

    strcpy(currentPlayer, playerOne); 
    

    या, बेहतर अभी तक:

यह करने के लिए सही तरीका:

currentPlayer = playerOne; 

यह है। std::string अनिवार्य रूप से व्यवहार करेगा कि आप कैसे उम्मीद करते हैं।

0

सी/सी में पर एक सी ट्यूटोरियल ++ एक सरणी के नाम वास्तव में सरणी के पहले तत्व के लिए सूचक है। इसलिए उदाहरण के

*currentPlayer == 'p' 

अब, जब आप इस तरह एक समारोह में एक सरणी गुजर रहे हैं के लिए, आप सूचक की एक प्रति नहीं, बल्कि सरणी ही कर रहे हैं।

तो जब अपने कार्य में आप कहते हैं

currentPlayer = playerOne 

तुम सब क्या कर रहे हैं सूचक playerOne रूप में एक ही स्मृति स्थान के लिए सूचक currentPlayer बिंदु बना रहा है।

आप क्या चाहते हैं पाने के लिए आपको strcpy

strcpy(currentPlayer,playerOne) 
+0

Arrays पॉइंटर्स नहीं हैं, मैं इसे एक सामान्य गलतफहमी के रूप में कम नहीं करूँगा लेकिन आपको अपने ज्ञान और उत्तर दोनों की समीक्षा करनी चाहिए। सरणी का नाम ** ** एक पहचानकर्ता है जो सरणी को संदर्भित करता है, भ्रम इस तथ्य से आता है कि अधिकांश अभिव्यक्तियों में पॉइंटर्स में * क्षय * क्षय * की प्रवृत्ति होती है और तथ्य यह है कि भाषा सरणी वाक्यविन्यास को अनुमति देती है कुछ स्थानों जहां इसे पॉइंटर सिंटैक्स के रूप में पार्स किया जाता है (यानी एक फ़ंक्शन पैरामीटर 'int [10] 'को' int * 'के रूप में पार्स किया जाता है। लेकिन सरणी अभी भी उस क्षेत्र में सरणी हैं जहां उन्हें परिभाषित किया गया है और इन स्थानों के रूप में उपयोग किया जा सकता है पॉइंटर्स नहीं कर सकते हैं। –

+0

एक उदाहरण 'शून्य फू (int (& a) [3]) होगा;' यह फ़ंक्शन संदर्भ द्वारा बिल्कुल 3 इन्स की सरणी लेता है। 'int main() {int array [3]; int * p = सरणी; foo (सरणी);/* foo (p); * /} '। array '' foo' को पास किया जा सकता है * यह * 3 पूर्णांक की सरणी है,' p' नहीं कर सकता क्योंकि यह एक सूचक है एक पूर्णांक (जिसे 3 पूर्णांकों की सरणी की शुरुआत में शुरू किया जाता है। –

+1

कह रहा है कि सरणी पॉइंटर्स उन लोगों को समझाते हैं जो सी becau के लिए नए हो सकते हैं से यह उनके बहुत से "अजीब" व्यवहार को और अधिक समझ में आता है। मुझे शायद यह स्पष्ट होना चाहिए कि सरणी पॉइंटर्स की तरह काम करती हैं, लेकिन बिल्कुल वही नहीं हैं। बीटीडब्ल्यू, मुझे यकीन नहीं है कि मैंने कभी आपके उदाहरण में कोड लिखा है। मुझे पता था कि आकार (सरणी) अलग था हालांकि। –

1

आप currentPlayer चाहते होने के लिए उपयोग करने के लिए जरूरत है एक सूचक-टू-वर्ण, तो यह दोनों खिलाड़ियों के बीच स्वैप:

आपका कोड, संपादित:

void boardMarker(int&, char playerOne[], char playerTwo[], char &playerMarker, char** pCurrentPlayer); 

int main() 
{ 
    char playerOne[100]; 
    char playerTwo[100]; 
    char* currentPlayer = playerOne; 

    boardMarker(playerTurn, playerOne, playerTwo, playerMarker, &currentPlayer); 

} 
void boardMarker(int &playerTurn, char playerOne[100], char playerTwo[100], char &playerMarker, char** pCurrentPlayer) 
{ 
    // Set player markers 
    //Player 1 uses X and Player 2 uses O 
    if (playerTurn == 1) 
    { 
     playerMarker = 'X'; 
     *pCurrentPlayer = playerOne; 
    } 
    else 
    { 
     playerMarker = 'O'; 
     *pCurrentPlayer = playerTwo; 
    } 
} 

कुछ कमेन अपने कोड पर ts:

  • चर playerTurn और playerMarker घोषित नहीं कर रहे हैं। (मैं दिखा रहा हूं कि वे वैश्विक चर हैं, यहां दिखाए गए नहीं हैं)।
  • आपको पैरामीटर अन-नामित नहीं छोड़ना चाहिए, जैसे कि बोर्डमार्कर के प्रोटोटाइप में int& लटकाना।
  • लिखित के रूप में, प्लेयरऑन और प्लेयर दो अनियमित हैं। आइए का नाटक करें, उन्हें कहीं और शुरू किया गया है।
+0

यह वह प्रभाव देगा जो वह चाहता है, लेकिन अपने कार्यक्रम के अर्थशास्त्र को बदलता है। 'वर्तमान प्लेयर' अब वर्तमान प्लेयर नाम के मूल्य को रखने के बजाए प्लेयर नाम तारों में से एक के लिए उपनाम है। –

संबंधित मुद्दे