2010-07-30 11 views
6

Aquí está mi codificación problemática: Tengo que tomar el nombre de 2 jugadores. Luego, cuando en la siguiente parte, cuando el marcador de jugador cambie, el nombre almacenado en "jugador actual" también debería cambiar el nombre almacenado en el jugador Uno o el jugador en dos. No es así, ¿cómo lo arreglo? Resuelva, intenté convertirlo en una variable de referencia con el símbolo &, pero aparece un error que indica que no se permite la matriz de referencia.Al pasar matriz de caracteres en una función?

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

Quien rechazó el voto, no fue apropiado. Esta es una pregunta bien escrita. – abelenky

+0

Ni siquiera sé cómo decir qué tan mal se ve tu código en este momento. ¿Incluso compila?!?!?! Por ejemplo, usted usa como parámetro una variable llamada playerTurn que nunca fue declarada. – karlphillip

+2

en ese caso, ¿por qué no votaste para nivelar el puntaje? – catchmeifyoutry

Respuesta

5
  • No puede asignar matrices entre sí (hay que copiarlos elemento por elemento)
  • Cuando se transmite a las funciones, matrices de descomposición a los punteros, así como un argumento, es idéntica a char playerOne[100]char* playerOne
  • Asignando un char* a otro char* no copia la cadena, copia el puntero.

La forma correcta de hacer esto:

currentPlayer = playerOne; 

es la siguiente:

strcpy(currentPlayer, playerOne); 

O, mejor aún, ya que este es C++ y no en C, utilice std::string en lugar de char matrices. std::string se comportará esencialmente de la forma esperada.

0

en C/C++ el nombre de un array es en realidad un puntero al primer elemento de la matriz. Así, por ejemplo

*currentPlayer == 'p' 

Ahora, cuando estás pasando un array en una función de esa manera, usted está haciendo una copia del puntero, pero no la propia matriz.

Por eso, cuando en su función que dicen

currentPlayer = playerOne 

Todo lo que está haciendo es hacer el punto puntero currentPlayer en la misma ubicación de memoria que el playerOne puntero.

para conseguir lo que quiere, necesita usar strcpy

strcpy(currentPlayer,playerOne) 
+0

Las matrices no son punteros, no declinaré ya que es un malentendido común, pero debe revisar tanto su conocimiento como la respuesta. El nombre de la matriz ** es ** un identificador que hace referencia a la matriz, la confusión proviene del hecho de que las matrices tienen una tendencia a * decaer * en punteros en la mayoría de las expresiones y el hecho de que el lenguaje permite la sintaxis de la matriz en una pocos lugares donde se analiza como sintaxis de puntero (es decir, un parámetro de función 'int a [10]' se analiza como 'int *'. Pero las matrices siguen siendo matrices en el ámbito donde están definidas y se pueden usar como tales en lugares donde los punteros no pueden. –

+0

Un ejemplo sería 'void foo (int (& a) [3]);'. Esa función toma una matriz de exactamente 3 ints por referencia. 'int main() {int array [3]; int * p = array; foo (array);/* foo (p); * /} '.' array' se puede pasar a 'foo' como * es * una matriz de 3 enteros,' p' no puede porque es un puntero a un entero (que sucede que se inicializa al principio de una matriz de 3 enteros. –

+1

Decir que las matrices son punteros es una forma común de explicarlas a las personas que pueden ser nuevas en C becau porque hace que gran parte de su comportamiento "extraño" tenga más sentido. Probablemente debería haber sido más claro que las matrices funcionan como punteros, pero no son exactamente lo mismo. Por cierto, no estoy seguro de haber escrito código como en su ejemplo. Sin embargo, sabía que sizeof (array) era diferente. –

1

¿Quieres currentPlayer ser un puntero a caracteres, luego intercambiarlo entre los dos jugadores:

Su código, editado:

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

Algunos comentarios ct en su código:

  • variables de playerTurn y playerMarker no se declaran. (Estoy pretendiendo que son variables globales , que no se muestran aquí).
  • No debe dejar los parámetros sin nombre, como el int& colgante en el prototipo de boardMarker.
  • Como está escrito, playerOne y playerTwo no están inicializados. Supongamos que están inicializados en otro lugar.
+0

Esto dará el efecto que quiere, pero cambia la semántica de su programa. 'currentPlayer' ahora es un alias de una de las cadenas de nombre del jugador, en lugar de mantener el valor del nombre del jugador actual. –

Cuestiones relacionadas