elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  [?] Fallo de segmentación - C
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: [?] Fallo de segmentación - C  (Leído 4,642 veces)
8789poli

Desconectado Desconectado

Mensajes: 39


Ver Perfil
[?] Fallo de segmentación - C
« 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!


En línea

Garfield07


Desconectado Desconectado

Mensajes: 1.121


¡Este año voy a por todas! JMJ 2011


Ver Perfil WWW
Re: [?] Fallo de segmentación - C
« Respuesta #1 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!


En línea



* Quiero cambiar el mundo, pero estoy seguro de que no me darían el código fuente.
* No estoy tratando de destruir a Microsoft. Ese será tan solo un efecto colateral no intencionado.
* Si compila esta bien, si arranca es perfecto.

¡Wiki elhacker.net!
Un saludo
do-while


Desconectado Desconectado

Mensajes: 1.276


¿Habra que sacarla de paseo?


Ver Perfil
Re: [?] Fallo de segmentación - C
« Respuesta #2 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!
En línea

- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!
8789poli

Desconectado Desconectado

Mensajes: 39


Ver Perfil
Re: [?] Fallo de segmentación - C
« Respuesta #3 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! ^^
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Fallo de segmentación!!
Programación C/C++
<[(x)]> 6 3,731 Último mensaje 13 Julio 2010, 06:44 am
por nicolas_cof
Fallo de segmentación
Programación C/C++
W0lFy 2 4,010 Último mensaje 21 Octubre 2010, 01:09 am
por W0lFy
Mensaje ¿nucleo? fallo de segmentacion ::: Desactivando la protección
GNU/Linux
Garfield07 2 3,321 Último mensaje 1 Enero 2011, 01:03 am
por Garfield07
Fallo de segmentación al agregar mas nodos en una lista.
Programación C/C++
samur88 0 3,101 Último mensaje 19 Enero 2011, 15:08 pm
por samur88
Fallo de segmentacion
Programación C/C++
_niu 9 5,448 Último mensaje 29 Agosto 2011, 02:58 am
por _niu
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines