No encuentro el error, ayuda o_o

Iniciado por deserto, 6 Septiembre 2013, 17:36 PM

0 Miembros y 3 Visitantes están viendo este tema.

deserto

Hola a todos, estoy tratando de hacer un programita en c, pero al ejecutarlo me tira error. Alguien me puede decir en lo que me equivoque¿?.
  Se supone que es un tablero de ajedrez en el que el caballo se tiene que mover de manera aleatoria logrando el mayor recorrido posible, sin pasar por el mismo lugar. Tiene 100 intentos. Voy registrando en un vector la cantidad de movimientos de cada intento.

http://imageshack.us/a/img40/6745/x1nu.png
http://imageshack.us/a/img407/9054/p085.png
http://img580.imageshack.us/img580/4497/oqek.png


eferion

Pretendes que alguien se copie el código a partir de las capturas de imágenes y lo depure por ti?? si es así, suerte.

Esto no suele funcionar así... la cosa es que nos facilites un poco el trabajo. Nos pones la porción de código problemática (si es posible) y nos comentas de paso qué es lo que tendría que suceder... o qué sale mal.

Pero ya te digo yo que no veo muy probable que alguien se ponga a picar código sacado de 3 capturas de pantalla para darte una respuesta.

ivancea96

+1 a eferion.

Si quieres que alguien lo vea y compile (la forma más fácil de localizar errores), pon el código así:

Código (cpp) [Seleccionar]

int main(){
string a="etc etc";
}

flony

#3
bue ya que estamos con fotos la respuesta sera con fotos
http://subefotos.com/ver/?c9026e139b7c28b544d74e8b1344558eo.jpg


aprovecho y te enseño a ingresar el code y los errores en la pagina
http://subefotos.com/ver/?97996c051c410dd194522c7ca2cd013do.jpg

aclaro esta interesante el desafio

buscando en google...es largo para pensarlo

http://hitmontop-ejerciciosresueltos.blogspot.com.ar/2011/01/deitelc425ccircuito-del-caballo.html

si un problema no tiene solucion entonces no es un problema...es algo inevitable

deserto

#4
Ante todo gracias por responder. Y NO, no sabía utilizar el código. Soy nuevo en el foro, y hace tiempo que no me registro en uno. Creí que la forma más fácil era mostrando esas capturas.
algo
Código (cpp) [Seleccionar]
//caballoLoco//
#include <stdio.h>
#include <stdlib.h>
#define LIMITE 8
#define LONG 100
int ejex(int x);int ejey(int y);
int main()
{
   int tablero[LIMITE][LIMITE]={{0},{0}};
   int caminos[LONG];
   int x, xx, yy, y;int direc= 0;int sepuede;int contador= 1;
   int i, j;int elegido= 0;
   int m, n;// para inicializar tablero//
   scanf("%d",&xx);//elegiendo posicion de arranque//
   scanf("%d",&yy);
   tablero[x][y]= 1;
   srand(time(NULL));
   for (j=1; j <= LONG; j++){
      for (m= 0; m < LIMITE-1; m++){ //inicializando tablero//
          for (n= 0; n <  LIMITE-1; n++)
             tablero[m][n]= 0;
      }        
      tablero[x][y]= 1;
      sepuede= 0;
      contador= 0;
      xx= x;
      yy= y;
      while (sepuede != 1) {
            elegido= rand()%7;
            x+= ejex(elegido); //moviendose//
            y+= ejey(elegido);
            if ((x < 0) ||  (y > 7)){
                printf("Se sale del tablero");
                sepuede= 1;    
            }
            else {
                 if (( x > 7) || ( y < 0)){
                     printf("Se sale del tablero");
                     sepuede= 1;
                 }
                 else {
                      if ( tablero[x][y]== 1){    
                          printf("Ya se pasó por acá");
                          sepuede= 1;
                      }
                      else {    
                          tablero[x][y]= 1;
                          contador+= 1;
                          printf("\n\n");
                          for (i=0; i < 8; i++) { //Viendo el tablero//
                               printf("%d%d%d%d%d%d%d%d\n", tablero[0][i], tablero[1][i], tablero[2][i], tablero[3][i],
                                                            tablero[4][i], tablero[5][i], tablero[6][i], tablero[7][i]);                               //graficando lo que pasa//            
                          }
                      }
                 }  
            }  
      }  
      printf("\n\n");
      printf("Casilleros: %d\n",contador);
      caminos[j-1]= contador;
   }
   printf("INTENTO  distancia\n");
   for (j=0; j < LONG; j++) //Imprime caminos//
       printf("%d----%d\n", j, caminos[j]);
   system("PAUSE");
   return 0;
}
int ejex(int x)
{
   int fila[LIMITE]={2,1,-1,-2,-2,-1,1,2};
   return fila[x];
}
int ejey(int y)
{
   int columna[LIMITE]={-1,-2,-2,-1,1,2,2,1};
   return columna[y];
}


Primero intente hacer el codigo para que el caballo haga un solo recorrido al azar y funciono bien, pero despues, para que haga 100 intentos seguidos utilice un for.
Citarfor (j=1; j <= LONG; j++){
No me tira errores de sintaxis, pero cuando lo ejecuto, ingreso la posicion de inicio y despues de un par de segundos me tira error.

do-while

¡Buenas!

Con semejante caos de código no se donde puede estar el error. Si tienes un error de ejecución lo mas posible es que en algún momento intentes acceder a una posición de memoria incorrecta (que te salgas de los límites de algún vector).

Tienes un montón de variables. Intenta hacer el código mas limpio utilizando funciones. Por ejemplo:

- Una función que dada la posición del caballo y el movimiento que quieres realizar, te diga si el movimiento es correcto o no.

- Una función que te inicialice el tablero.

- Una función que te imprima el tablero.

- Una función, lo mas sencillo es que sea recursiva, que partiendo de una posición inicial realice los movimientos de forma automática hasta que no haya mas posibilidades.

De esta forma tu código estará separado en tareas mas sencillas en las que encontrar errores te resultará mas fácil y será mucho mas facil de leer, ya que cada una de las funciones tendrá unas pocas líneas de código y sus acciones serán muy concretas.

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

deserto

ok intentare emprolijar el asunto haber si encuentro el error. Gracias por responder!!

ivancea96

#7
1: El error es un Access violatión, al menos en mi máquina, con OllyDBG.
2: A base de system("pause"), encontré el error en
Código (cpp) [Seleccionar]
tablero[x][y]= 1;(Después de los scanf())
Las variables "x" e "y" no están inicializadas. Quizás lo hayas confundido con "xx" e "yy". Eso ya es tu código, y no me paré mucho a entender cómo funciona.

Cita de: do-while en  7 Septiembre 2013, 10:04 AM
Tienes un montón de variables

Tiene toda la razón.

Suerte :D

deserto

muchas gracias ivancea96 , do-while!!. Esas variables estaban un poco alpedo. Ahora modularice un poco y me quedo esto:

#include <stdio.h>
#include <stdlib.h>
#define LIMITE 8
#define LONG 100

void mostrar(int matriz[][LIMITE]);
void inicializar(int matriz[][LIMITE]);
int ejex(int x);int ejey(int y);
int mover(int y, int x, int matriz[][LIMITE]);


int main()
{
  int tablero[LIMITE][LIMITE];
  int caminos[LONG]={0};
  int x, y, i;
  srand(time(NULL));
  scanf("%d", &x);
  scanf("%d", &y);
  for (i= 1; i <= LONG; i++) {
      inicializar(tablero);
      tablero[y][x]= 1;
      caminos[i-1]= mover(y, x, tablero);
  }
  printf("Intento      distancia\n");
  for (i=0; i < LONG; i++)
      printf("%d\t\t%d\n", i+1, caminos[i]);
  mostrar(tablero);
  system("PAUSE");
  return 0;
}

void inicializar(int matriz[][LIMITE])
{
     int i, j;
     for (i= 0; i < LIMITE; i++){
         for (j= 0; j < LIMITE; j++)
             matriz[i][j]= 0;
     }
     return;
}
int ejey(int y)
{
    int fila[LIMITE]={2,1,-1,-2,-2,-1,1,2};
    return fila[y];
}
int ejex(int x)
{
    int columna[LIMITE]={-1,-2,-2,-1,1,2,2,1};
    return columna[x];
}
int mover(int y, int x,int matriz[][LIMITE])
{
    int sepuede= 1;
    int elegido, fx, fy;
    int contador= 0;
    fy= y;
    fx= x;
    while (sepuede == 1) {
          elegido= rand()% 7;
          fx+= ejex(elegido);
          fy+= ejey(elegido);
          if ((fx < 0) || (fx > 7))
                sepuede= 0;
          else {
               if ((fy < 0) || ( fy > 7))
                     sepuede= 0;
               else {
                    matriz[fy][fx]= 1;
                    contador+= 1;
               }
          }
    }
    return contador;
}
void mostrar(int matriz[][LIMITE])
{
    int i,j;
    for (i= 0; i < LIMITE; i++){
        for (j= 0; j < LIMITE; j++)
            printf("%d ", matriz[i][j]);
        printf("\n");
    }
    return;
}


Se ejecuta bien, pero me llama un poco la atención que ningun intento supere de los 15 o 17 movimientos.
No había modularizado antes por que no sabía pasar matrices a la función xD.