2010-07-30 33 views
6

Ecco la mia codifica problematica: Devo inserire il nome di 2 giocatori. Poi, quando per la parte successiva, quando l'indicatore del giocatore cambia, il nome memorizzato in "currentPlayer" dovrebbe cambiare anche il nome memorizzato in playerOne o playerTwo. Non è così come lo aggiusto? Si prega di risolvere, ho cercato di renderlo una variabile di riferimento con il simbolo & ma ottengo un errore che dice che la matrice di riferimento non è consentita.Passaggio del char array in una funzione?

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

chiunque avesse votato, era inappropriato. Questa è una domanda ben scritta. – abelenky

+0

Non so nemmeno come dire quanto sia sbagliato il tuo codice in questo momento. Compilano anche?!?!?! Ad esempio, si utilizza come parametro una variabile denominata playerTurn che non è mai stata dichiarata. – karlphillip

+2

in tal caso, perché non hai alzato il livello per aumentare il punteggio? – catchmeifyoutry

risposta

5
  • Non è possibile assegnare le matrici tra loro (è necessario copiarli elemento per elemento)
  • Quando viene passato alle funzioni, array decadimento di puntatori, in modo come argomento, char playerOne[100] è identico a char* playerOne
  • Assegnando un char* a un altro char* non copia la stringa, copia il puntatore.

Il modo corretto per fare questo:

currentPlayer = playerOne; 

è questo:

strcpy(currentPlayer, playerOne); 

O, meglio ancora, dal momento che questo è il C++ e non C, usare std::string invece di char array. std::string si comporterà essenzialmente come ci si aspetta.

0

In C/C++ il nome di un array è in realtà un puntatore al primo elemento della matrice. Così, per esempio

*currentPlayer == 'p' 

Ora, quando si sta passando una matrice in una funzione del genere, si stanno facendo una copia del puntatore, ma non la matrice stessa.

Così, quando nella funzione che si dicono

currentPlayer = playerOne 

Tutto quello che state facendo è fare il punto puntatore currentPlayer nella stessa posizione di memoria come il puntatore Playerone.

per ottenere ciò che si desidera, è necessario utilizzare strcpy

strcpy(currentPlayer,playerOne) 
+0

Gli array non sono puntatori, non lo farò come un comune equivoco, ma dovresti rivedere sia la tua conoscenza che la risposta. Il nome dell'array ** è ** un identificatore che si riferisce all'array, la confusione deriva dal fatto che gli array hanno una tendenza al * decadimento * nei puntatori nella maggior parte delle espressioni e al fatto che il linguaggio consente la sintassi dell'array in un pochi punti in cui viene analizzato come sintassi del puntatore (cioè un parametro di funzione 'int a [10]' viene analizzato come 'int *'. Ma gli array sono ancora array nell'ambito in cui sono definiti e possono essere utilizzati come tali nei luoghi in cui i puntatori non possono. –

+0

Un esempio sarebbe 'void foo (int (& a) [3]);'. Quella funzione prende una matrice di esattamente 3 inte per riferimento. 'int main() {int array [3]; int * p = array; foo (array);/* foo (p); * /} '.' array' può essere passato a 'foo' come * è * un array di 3 interi,' p' non può perché è un puntatore a un numero intero (che sembra essere inizializzato all'inizio di un array di 3 numeri interi –

+1

Dire che gli array sono puntatori è un modo comune di spiegarli a persone che potrebbero essere nuove a C becau Se fa molto del loro comportamento "strano" ha più senso. Probabilmente avrei dovuto essere più chiaro che gli array funzionano come puntatori, ma non sono esattamente gli stessi. BTW, non sono sicuro di aver mai scritto codice come nel tuo esempio. Sapevo però che sizeof (array) era diverso. –

1

Volete currentPlayer essere un puntatore a caratteri, poi scambiarlo tra i due giocatori:

Il tuo codice, a cura:

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; 
    } 
} 

Alcuni commen ts sul vostro codice:

  • variabili playerTurn e playerMarker non sono dichiarati. (Sto fingendo che siano variabili globali , non mostrate qui).
  • Non lasciare i parametri non nominati, ad esempio il penzolante int& nel prototipo di boardMarker.
  • Come scritto, playerOne e playerTwo non sono inizializzati. Facciamo finta che siano inizializzati altrove.
+0

Questo darà l'effetto che vuole, ma cambia la semantica del suo programma. 'currentPlayer' è ora un alias per una delle stringhe del nome del giocatore, piuttosto che contenere il valore del nome del giocatore corrente. –