Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: 8789poli en 14 Diciembre 2010, 17:26 pm



Título: [?] Fallo de segmentación - C
Publicado por: 8789poli en 14 Diciembre 2010, 17:26 pm
Buenas!  :)

Estoy recién empezando a realizar un juego en C y lo puedo compilar y funciona todo bien hasta que llega a la función actualizarPiezas, al intentar designarle valores a un arreglo 2x2 específicamente. Me tira un error de segmentación ("Fallo de segmentacion"). Si pongo como comentario la designación del arreglo 2x2 me compila y funciona todo perfectamente.
(Lo compilé desde ubuntu con gcc 4.4.3)

Función donde me tira el error

Código:
void actualizacionPiezas(int *piezas[8][8], int *equipoBlanco, int *equipoNegro){ 

int i,j;   

for(i=0 ; i<8 ; i++){   
for(j=0 ; j<8 ; j++){

*piezas[i][j] = 7;         //<============================= ERROR

}
}

}

Codigo completo (hasta ahora  :P)

Código:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define limpiarPantalla system("clear");

char menu();
void jugar();
void ingresarNombreJugador();
void informacion();
void ingresarEquipoJugador();
void actualizacionPiezas();
void tomarPieza();

////////////////////////////////////////////////////////////////////////////////////////_____________________________________
int main(){ ///////////////////////////////////////////////////////////////////////////|| MAIN

switch(menu()){
case '1': jugar(); break;
case '2': informacion(); break;
case '3': return 0; break;
}
}
////////////////////////////////////////////////////////////////////////////////////////_____________________________________
char menu(){ //////////////////////////////////////////////////////////////////////////|| MENÚ

char opcion;

limpiarPantalla

printf(" 1. Jugar \n 2. Informacion \n 3. Salir \n\n Seleccione una opcion y presione ENTER\n\n >:");

        do{opcion = getchar();} while(opcion != '1' && opcion != '2' && opcion != '3');

limpiarPantalla

return opcion;
}
////////////////////////////////////////////////////////////////////////////////////////_____________________________________
void jugar(){ /////////////////////////////////////////////////////////////////////////|| JUGAR

char jugadorBlanco[30], jugadorNegro[30];
int equipoBlanco, equipoNegro, tomarPiezaX, tomarPiezaY, piezas[8][8];

ingresarNombreJugador(&jugadorBlanco, &jugadorNegro);

limpiarPantalla

ingresarEquipoJugador(&equipoBlanco, &equipoNegro);

limpiarPantalla

actualizacionPiezas(&piezas, &equipoBlanco, &equipoNegro);

limpiarPantalla

tomarPieza(&tomarPiezaX, &tomarPiezaY);

}
////////////////////////////////////////////////////////////////////////////////////////_____________________________________
void ingresarNombreJugador(char *jugadorBlanco, char *jugadorNegro){ /////////////////|| INGRESAR NOMBRE JUGADOR

printf("Ingrese el nombre del jugador blanco\n\n >: ");
scanf("%s", &*jugadorBlanco);

printf("\nIngrese el nombre del jugador negro\n\n >: ");
scanf("%s", &*jugadorNegro);

}
////////////////////////////////////////////////////////////////////////////////////////_____________________________________
void ingresarEquipoJugador(int *equipoBlanco, int *equipoNegro){ //////////////////////|| INGRESAR EQUIPO JUGADOR

printf("Clasico: 1\nJapones: 2\nMayas: 3\n\n");
printf("Ingrese el equipo del jugador blanco\n\n >: ");
scanf("%d", &*equipoBlanco);

printf("\nIngrese el equipo del jugador negro\n\n >: ");
scanf("%d", &*equipoNegro);

switch(*equipoBlanco){
case 1: *equipoBlanco = 0; break;
case 2: *equipoBlanco = 2; break;
case 3: *equipoBlanco = 4; break;
}

switch(*equipoNegro){
case 1: *equipoNegro = 1; break;
case 2: *equipoNegro = 3; break;
case 3: *equipoNegro = 5; break;
}

}
////////////////////////////////////////////////////////////////////////////////////////_____________________________________
void informacion(){ ///////////////////////////////////////////////////////////////////|| INFORMACIÓN

printf("\ninformacion\n");

}
////////////////////////////////////////////////////////////////////////////////////////_____________________________________
void actualizacionPiezas(int *piezas[8][8], int *equipoBlanco, int *equipoNegro){ ////|| ACTUALIZACIÓN PIEZAS

int i,j;      // IGUALAMOS EL TABLERO ENTERO A 7 (VACÍO)

for(i=0 ; i<8 ; i++){   
for(j=0 ; j<8 ; j++){

*piezas[i][j] = 7;         //<============================= ERROR

}
}

}
////////////////////////////////////////////////////////////////////////////////////////_____________________________________
void tomarPieza(int *tomarPiezaX, int *tomarPiezaY){ /////////////////////////////////////|| TOMAR PIEZA
char aux1;

printf("Ingrese las coordenadas 'x' e 'y' (Ejemplo: b5)\n\n >: ");
scanf("%c%d", &aux1, &*tomarPiezaY);

switch(aux1){
case 'a': *tomarPiezaX = 0; break;
case 'b': *tomarPiezaX = 1; break;
case 'c': *tomarPiezaX = 2; break;
case 'd': *tomarPiezaX = 3; break;
case 'e': *tomarPiezaX = 4; break;
case 'f': *tomarPiezaX = 5; break;
case 'g': *tomarPiezaX = 6; break;
case 'h': *tomarPiezaX = 7; break;
}

switch(*tomarPiezaY){
case 1: *tomarPiezaY = 0; break;
case 2: *tomarPiezaY = 1; break;
case 3: *tomarPiezaY = 2; break;
case 4: *tomarPiezaY = 3; break;
case 5: *tomarPiezaY = 4; break;
case 6: *tomarPiezaY = 5; break;
case 7: *tomarPiezaY = 6; break;
case 8: *tomarPiezaY = 7; break;
}

}

No se me ocurre cual puede ser el error  :-\ 
Por favor si alguien puede ayudarme a descubrir el error le estaré muy agradecido  ;D

Saludos!


Título: Re: [?] Fallo de segmentación - C
Publicado por: Garfield07 en 14 Diciembre 2010, 18:24 pm
De un vistazo veo un buen fallo, creo. Deberias leerte algo de punteros. Y aparte repasarte lo que sabes sobre las funciones. El codigo esta completamente mal, no solo las piezas. Resulta que lo que haces es mandar a las funciones una direccion en la que escriben. El compilador da Ok, pero el planteamiento es incorrecto. Deberias usar returns y demas. Ademas lo mejor seria quitar algunas funciones extras, porque al final te lias. Datos desde main, luego pasas un vector a otras funciones , pero es excesivo.

Si sigues interesado en esta forma, el error esta en que estas escribiendo en los datos a los que apunta el puntero, que estan fuera del alcance de la funcion. Resumido: escribes donde no puedes...
Sin embargo la idea era buena...

Mucha suerte!


Título: Re: [?] Fallo de segmentación - C
Publicado por: do-while en 14 Diciembre 2010, 19:38 pm
¡Buenas!

Que el puntero esta fuera de alcance de la funcion? Ejem, es uno de los parametros, por lo tanto existira dentro del alcance de la funcion hatsa que se vuelva al punto en el que fue hecha la llamada.

Lo que estas haciendo es coger el valor que hay en la posicion i,j de la matriz, suponer que es un puntero e intentar acceder a la posicion de memoria que indica dicho numero (aqui esta el error) para asignarle el valor siete. Lo primero que tienes que hacer es aplicarle el operador de indireccion al puntero a la matriz cada vez que quieras trabajar con ella, asi podras acceder a cada una de las componentes de la matriz.

¡Saludos!


Título: Re: [?] Fallo de segmentación - C
Publicado por: 8789poli en 14 Diciembre 2010, 19:50 pm
Gracias  por responder!  :)

Bueno, este juego ya lo hice una vez para un proyecto de la U, en primer año, por lo que vimos lo más básico de punteros. Ahora indagué un poco más y encontré que no era tan simple como creía  :P .

El uso de tantas funciones es para que quede bien representada cada labor de cada función, para luego poder pasarlo a C++ (con allegro).

Voy a reescribir los punteros de forma correcta y volveré a comentar.

Gracias nuevamente! ^^