Return 86 en vez de 0

Iniciado por ExplosiveKay, 11 Enero 2015, 22:46 PM

0 Miembros y 1 Visitante están viendo este tema.

ExplosiveKay

Hola buenas, estaba haciendo un código en lenguaje C que consta de 3 ficheros. El programa lo que hace es leer de un fichero en formato txt las dimensiones y el dibujo de un laberinto, y mediante reserva dinámica de memoria, crearlo y luego liberar la memoria reservada. Dicho fichero lo paso por la línea de comandos junto con el nombre del ejecutable predeterminado (a.out) y las coordenadas mediante las cuales se soluciona el laberinto. El programa funciona bien salvo por un pequeño detalle, y es que el main no retorna 0, sino 86. Lo más curioso es que la propia función main, al final, le tengo puesto explícitamente que retorne 0. He probado a poner una estructura de control que garantice que siempre retorne 0, y sin embargo, no lo hace. A continuación, paso la función main de mi programa fuente:
Código (cpp) [Seleccionar]
int main (int argc,char * argv[])
{
/* Examina el número de parámetros pasados */
if(argc!=4)
{
fprintf(stderr,"ERROR: linea de comandos incorrecta. Utilice:\n\
leelabfich fichero_de_entrada columna_inicio fila_inicio\n");
return 0;
}

int inix=atoi(argv[2]); //Cambia a formato numérico los caracteres
int iniy=atoi(argv[3]); //pasados en línea de comando

char dim[BUFF];
char * pdim=&dim[0];
char ** lab=NULL;
char ** p=NULL;
int i=0;
int j=0;
int ctrl=0;
int ctrl2=0;
int tamh=0;
int tamv=0;
   int varokey = 0;

nodo * lista=NULL;

//inicializamos el buffer donde se guardarán las dimensiones
memset(dim,0,BUFF);

FILE * fp=NULL;

fp=fopen(argv[1],"r"); // abrimos el archivo
if(NULL==fp) // comprobamos que se ha abierto correctamente
{
fprintf(stderr,"No se puede abrir el fichero de entrada.\n");
return 0;
}

pdim=fgets(dim,BUFF-1,fp);
// Leemos la primera línea y la guardamos en el buffer
/* Se espera encontrar sólo dos números enteros, descartando
** que haya más.
**
** Para vrificar errores, numeros decimales o símbolos, la sentencia else y
** el if anidado en él controlan que no haya caracteres que induzcan
** al error, descartando los espacios.
*/
for(i=0;dim[i]!='\n';i++)
{
if((dim[i]>='0')&&(dim[i]<='9'))
{
for(j=0;(dim[i+j]>='0')&&(dim[i+j]<='9');j++)
;
i=i+j-1;
ctrl++;
}
else
{
if(dim[i]!=' ')
ctrl2++;
}
}
/* aquí se determina si lo leído coincide con 2 enteros correspondientes
** a las dimensiones o hay un error.
*/
if(ctrl!=2||ctrl2!=0)
{
//fprintf(stderr, "Dimensiones del laberinto incorrectas.\n\n");
fprintf(stderr,"Las dimensiones han de ser dos números enteros.\n\n");
return 0;
}
// si todo es correcto se leen del propio buffer las dimensiones
sscanf(pdim,"%d %d",&tamh,&tamv);


/* Se reserva memoria dinámicamente de acuerdo con las dimensiones
** especificadas. */

lab=crea_laberinto(tamh,tamv);

if(NULL==lab)
{
fprintf(stderr,"Error en la reserva de memoria.\n");
return 0;
}
p=lab;
//inicializamos las variables de control
ctrl=0;
ctrl2=0;

/* Ahora leemos el propio laberinto desde el fichero indicado.
**
** Serán leídas tantas filas como diga la dimensión vertical.
** Cada línea leída se cuenta para asegurarnos que no se excede
** el valor indicado por la dimensión horizontal y haya una
** inconsistencia de datos
*/
for(i=0,j=0;0==j;i++)
{
if(i<tamv)
{
fscanf(fp,"%s",p[i]);
ctrl=(int)strlen(p[i]);
if((ctrl!=tamh)&&((j=feof(fp))==0))
{
fprintf(stderr,"Fila %d leída errónea.\n",i+1);
ctrl2++;
}
ctrl=0;
}
else
{
fscanf(fp,"%s",dim);
ctrl++;
}
j=feof(fp);
}
if(1!=ctrl)
{
j=FALTANFILAS;
if(i>tamv)
--i;
}
else
--i;

/* Examinamos que no hay una inconsistencia de datos analizando
** las variables de control. Si hay filas erróneas, se imprimen
** por la salida de errores los mesajes pertinentes, siendo ctrl2
** la variable que contiene el número de filas con errores.
*/
if((ctrl2!=0)||(j==FALTANFILAS))
{
fprintf(stderr,"\nERROR en las filas leídas.\n");
fprintf(stderr,"Filas válidas leídas: %d.\n",(i-ctrl2));
fprintf(stderr, "Filas indicadas en dimensión: %d.\n",tamv);

if(j!=FALTANFILAS)
{
fprintf(stderr, "\nERROR en las columnas leídas.\n");
fprintf(stderr, "%d filas con errores en sus columnas.\n",
ctrl2);
}

fprintf(stderr, "\nInconsistencias en los datos de entrada.\n\
NO RESOLVEMOS EL LABERINTO.\n\n");

return 0;
}

if((inix>tamh)||(inix<0)) //se analiza que no empieze fuera del laberinto
{
printf("El punto (%d, %d) no pertenece al laberinto.\n",inix,iniy);
return 0;
}
else
{
if((iniy>tamv)||(iniy<0))
{
printf("El punto (%d, %d) no pertenece al laberinto.\n",inix,iniy);
return 0;
}
}
p=lab;
if(p[iniy][inix]=='#') // se analiza si el punto de inicio es
  // un obstáculo
{
printf("El punto (%d, %d) es un obstaculo.\n",inix,iniy);
return 0;
}


int a=0;
a=fclose(fp); //cerramos el fichero donde está el laberinto.
   if (a){
       fprintf(stderr, "Error cerrando\n");
   }
/*
** Llamamos a la función que propiamente encuentra la salida del laberinto
** Los parametros pasados a la funcion son:
** primero un puntero que indica la posicion donde empiezo
** Un puntero a una zona de memoria que contiene al laberinto
** Tamaño horizontal del laberinto
** Tamaño vertical del laberinto
*/

a=encuentraRuta(inix,iniy,lab,tamh,tamv,&lista);

//si la función no encuentra ninguna ruta, se imprime el mensaje pertinente
if(a==0)
printf("No existe salida desde el punto (%d, %d).\n",inix,iniy);
else
{
// Aqui es donde se imprimir el laberinto de forma "visual".
cambonito(lab,tamh,tamv,&lista);
}
// Liberamos la memoria donde se encontraba el laberinto y la
// lista de puntos por los que paso

libera(lab,tamh,tamv,&lista);
   varokey = OK;
   if(varokey = OK){
return 0;
   }
}


Mod: Al publicar código usa etiquetas GeSHi

ivancea96


_Enko

#2
Tienes un monton de return 0 condicionales, pero y el return por defecto?


libera(lab,tamh,tamv,&lista);
   varokey = OK;
   if(varokey = OK){
return 0;
   }
}


deberia de ser

libera(lab,tamh,tamv,&lista);
   varokey = OK;
   if(varokey = OK){
return 0;
   }
return 0;
} //<----- la última llave


De lo contrario el programa retornara con basura que esté en eax... eché por arriba un vistazo al codigo, y creo que el compilador te debería de tirar un error "main must return INT" porque tienes los return condicionales, pero el valor por defecto? Mas que nada por si ninguna de las condiciones se cumplen; ademas que si llego la ultima "}" evidentemente todo fue OK, y ahi va el return 0

A.I.

Cita de: _Enko en 12 Enero 2015, 20:43 PM

Mas que nada por si ninguna de las condiciones se cumplen;



   if(varokey = OK){



Las asignaciones como condición se cumplen siempre.

¿Puedes enseñarnos como obtienes el valor de retorno?