2011-02-27 7 views
7
void GameBoard::enterShips() 
{ 
    char location[1]; 
    int ships = 0; 
    int count = 1; 

    while(ships < NUM_SHIPS) 
    { 
     cout << "Enter a location for Ship " << count << ": "; 
     cin >> location; 
     cout << endl; 

     Grid[location[0]][location[1]] = SHIP; 
     ships++; 
     count++; 
    } 
} 

Estoy escribiendo un juego de acorazado. Tengo los diseños de la pizarra funcionando y las computadoras generan barcos aleatoriamente. Ahora estoy trabajando en este método para solicitar al usuario que ingrese las coordenadas de los barcos. Cuando ejecuto el programa, me permite ingresar 5 naves. Cuando entro en el sexto barco, me da este error.Pila alrededor de la variable '' estaba dañado

La pila alrededor de la ubicación de la variable estaba dañada.

He buscado respuestas en línea y no he encontrado nada exclusivo.

Cualquier ayuda sería apreciada.

+0

En lugar de tratar CHAR ubicación [1] [2]; '- que le dará una matriz 1 por 2 (índices: [0 ] [0] y [0] [1]) – RageD

Respuesta

5

Usted está impulsando a la dirección de memoria de location matriz para el usuario. Usted debe preguntar a índices de localización por separado:

void GameBoard::enterShips() 
{ 
    int location[2]; 
    int ships = 0; 
    int count = 1; 

    while(ships < NUM_SHIPS) 
    { 
     cout << "Enter a location for Ship " << count << ": "; 
     cin >> location[0]; 
     cin >> location[1]; 
     cout << endl; 

     Grid[location[0]][location[1]] = SHIP; 
     ships++; 
     count++; 
    } 
} 

Aviso int location[2]; desde una matriz de tamaño 1 sólo puede contener un elemento. También cambié el tipo de elemento a int. Leer caracteres desde la consola dará como resultado valores ASCII, que probablemente no sean los que usted desea.

+0

Gracias, no sabía que pudieras hacer esto. – bluetickk

12

location es una matriz de un solo char.
No hay location[1].

3

Usted hizo que la variable location solo pueda contener un solo carácter. Usted accede esperando que contenga al menos 2 caracteres. Si estás usando cin y esperando para leer exactamente dos personajes, un método mejor sería:

char locationX, locationY; 
// ... 
std::cin >> locationX >> locationY; 
// ... 
Grid[locationX][locationY] = SHIP; 
3
cin >> location; 

location es una matriz de uno char. Esto no puede tener éxito porque cuando lee desde una secuencia en una matriz char, se debe agregar un terminador nulo (que toma un carácter). Inevitablemente superarás los límites de la matriz.

Puede utilizar un std::string, lo que ayudará a evitar cualquier problema de desbordamiento de buffer:

std::string location; 
if (!(std::cin >> location)) { 
    // handle input error 
} 

Nótese también que es probable que necesite para convertir las representaciones de cadena de los números en valores numéricos. Usted puede hacer esto mediante la lectura de la corriente en dos int objetos en su lugar:

int x_location, y_location; 
if (!(std::cin >> x_location >> y_location)) { 
    // Handle input error 
} 

if (x_location >= X_DIMENSION || x_location < 0 || 
    y_location >= Y_DIMENSION || y_location < 0) { 
    // Handle out-of-range error 
} 

// use x_location and y_location 
Cuestiones relacionadas