Ver Mensaje Individual
  #2 (permalink)  
Antiguo 10/11/2013, 06:27
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 9 meses
Puntos: 83
Respuesta: juego con comportamiento extraño

El array tiene memoria reservada accesible en 8x8, pero cuando recorres el array entre (x,y)[0,7] e intentas acceder a un elemento x+1 o x+2 en el caso que x=6 la posicion de 6+2 o en x=7 las posiciones 7+1 y 7+2 (a x=7 ya no se llega nunca porque cuando x=6 el acceso x+2 -> 6+2 se produce el error), es decir que ambas condiciones intentan acceder a una posicion de memoria para la que la aplicacion no tiene dercho de acceso lo cual provoca la violacion de acceso (segmentation fault).

No te pongo un codigo con la solucion pq no he mirado la logica y no habia visto nunca esta aplicacion. Te comento solo que cuando incrementas dentro de una matriz tienes que poner controles para evitar salir del rango: en caso que estes en posicion x=7, cuando intentas acceder a x+1 sales del rango, lo que te interesa es saltar de fila y seguir contando, es decir que si x+desplazamiento > rango entonces saltas de fila (y += 1), restauras contador de columna (X=0) y de ahi sigues contando.

Una cosa, la definicion de fflush no incluye el uso para el stream stdin; es decir, en determinados s.o. funciona pero la funcion no fue ideada para eso. Te copio una funcion estandar para vaciar el buffer de entrada por teclado estandar:

Código C:
Ver original
  1. void fflush_stdin() {
  2.     char c;
  3.     while ((c = getchar()) != '\n' && c != EOF);
  4. }

Otra cosa, la funcion system lanza una aplicacion, en el caso del system(pause) lanza una aplicacion que espera un retorno; mejor usa el getchar que hace lo mismo sin lanzar una aplicacion externa.

Una ultima cosa, la cabecera stdlib no la estas usando; evita lincar cabeceras de las que no usas ninguna funcion.

Y lo mas importante: indenta el codigo, te será mas facil ver lo que estas haciendo a la vez que será tambien mas facil para cualquier otro que vea tu codigo.

Y otra cosa mas, evita los valores 'hardcoded', esto son las asignaciones de valores picados dentro del codigo; es lo que tienes para declarar el array y lo que tienes para recorrerlo. Es mejor declarar un define para el ancho, el alto, y todo lo que sea necesario y usar esos defines

Código C:
Ver original
  1. #define ANCHO 8
  2. #define ALTO 8
  3.  
  4. char A[ANCHO][ALTO];
  5.  
  6. for(x = 0; x < ANCHO; x++) ...

Y junto con eso tambien te será de utilidad usar nombres de variables significativas; eso significa que declarar un array bajo la variable A es lo mismo que si tienes un perro y le pones de nombre gato; el array del tablero puedes llamarlo TABLERO y la compilacion tendrá el mismo tamaño. Y junto con eso tambien te será de utilidad separar por funciones: una funcion que muestra el logo, otra que pinta las instrucciones, otra que recupera los imputs, otra que ejecuta la logica... El main debe ocupar 4 lineas: la llamada a la funcion de inicio, la llamada al ciclo, el finalizado (en caso que haya alguno) y el return 0, lo demas separado por funciones.

Ok, y bueno aun otra ultima cosa y no te molesto mas :)) Supongo que eres consciente que al evaluar el array lo estas haciendo de forma vertical (para cada columna saltas de fila), no se si afectara en algo a la logica de la aplicacion pero tenlo en cuenta.

Saludos
vosk

Última edición por vosk; 10/11/2013 a las 06:55