2010-07-30 12 views
6

Voici mon code problématique: Je dois prendre le nom de 2 joueurs. Ensuite, lorsque pour la partie suivante, lorsque le marqueur de joueur change le nom stocké dans "currentPlayer" devrait changer aussi le nom stocké dans playerOne ou playerTwo. Ce n'est pas le cas, comment puis-je résoudre ce problème? S'il vous plaît résoudre, j'ai essayé d'en faire une variable de référence avec le symbole & mais j'obtiens une erreur en disant que le tableau de référence n'est pas autorisé.Passer tableau tableau dans une fonction?

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

celui qui a décliné, c'était inapproprié. C'est une question bien écrite. – abelenky

+0

Je ne sais même pas comment dire à quel point votre code a l'air en ce moment. Compile-t-il même?!?!?! Par exemple, vous utilisez comme paramètre une variable appelée playerTurn qui n'a jamais été déclarée. – karlphillip

+2

dans ce cas, pourquoi n'avez-vous pas voté pour niveler le score? – catchmeifyoutry

Répondre

5
  • Vous ne pouvez pas affecter des tableaux les uns aux autres (vous devez les copier élément par élément)
  • Lorsqu'il est passé à des fonctions, la désintégration des tableaux de pointeurs, donc comme argument, char playerOne[100] est identique à char* playerOne
  • Affecter un char* à un autre char* ne copie pas la chaîne, il copie le pointeur.

La bonne façon de le faire:

currentPlayer = playerOne; 

est ceci:

strcpy(currentPlayer, playerOne); 

Ou, mieux encore, puisque c'est C++ et non C, utilisez std::string au lieu de char tableaux. std::string se comportera essentiellement comment vous vous attendez.

0

en C/C++ le nom d'un tableau est en fait un pointeur vers le premier élément du tableau. Ainsi, par exemple

*currentPlayer == 'p' 

Maintenant, quand vous passez un tableau dans une fonction comme ça, vous faites une copie du pointeur, mais pas le tableau lui-même.

Alors, quand dans votre fonction, vous dites

currentPlayer = playerOne 

Tout ce que vous faites est de faire le point de currentPlayer de pointeur sur le même emplacement mémoire que le pointeur Playerone.

obtenir ce que vous voulez, vous devez utiliser strcpy

strcpy(currentPlayer,playerOne) 
+0

Les tableaux ne sont pas des pointeurs, je ne vais pas downvote comme un malentendu commun, mais vous devriez examiner à la fois vos connaissances et la réponse. Le nom du tableau ** est ** un identifiant qui fait référence au tableau, la confusion vient du fait que les tableaux ont tendance à * décroître * en pointeurs dans la plupart des expressions et le fait que le langage permette la syntaxe du tableau dans un quelques endroits où il est analysé comme syntaxe de pointeur (ie un paramètre de fonction 'int a [10]' est analysé comme 'int *'.) Mais les tableaux sont toujours des tableaux dans la portée où ils sont définis et peuvent être utilisés comme tels. –

+0

Un exemple serait 'void foo (int (& a) [3]);'. Cette fonction prend un tableau de 3 ints par référence. = array; foo (array);/* foo (p); * /} '.' array' peut être passé à 'foo' car * c'est un tableau de 3 entiers,' p' ne peut pas parce que c'est un pointeur à un entier (qui est initialisé au début d'un tableau de 3 nombres entiers) –

+1

Dire que les tableaux sont des pointeurs est un moyen courant de les expliquer aux personnes qui peuvent être nouvelles à C becau. Cela rend beaucoup de leur comportement "étrange" plus logique. Je devrais probablement avoir été plus clair que les tableaux fonctionnent comme des pointeurs, mais ne sont pas exactement les mêmes. Par ailleurs, je ne suis pas sûr d'avoir jamais écrit du code comme dans votre exemple. Je savais que sizeof (array) était différent cependant. –

1

Vous voulez currentPlayer être un pointeur à caractères , puis échanger entre les deux joueurs:

Votre code, édité:

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

Certains commentaires ts sur votre code:

  • les variables playerTurn et playerMarker ne sont pas déclarés. (Je fais semblant qu'ils sont variables globales, pas montré ici).
  • Vous ne devez pas laisser les paramètres non nommés, tels que int& dans le prototype de boardMarker. Comme écrit, playerOne et playerTwo ne sont pas initialisés. Imaginons ils sont initialisés ailleurs.
+0

Cela donnera l'effet qu'il veut, mais change la sémantique de son programme. 'currentPlayer' est maintenant un alias à l'une des chaînes de nom de joueur, plutôt que de détenir la valeur du nom de joueur actuel. –