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

 

 


Tema destacado: Como proteger una cartera - billetera de Bitcoin


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Return 86 en vez de 0
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Return 86 en vez de 0  (Leído 2,244 veces)
ExplosiveKay

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Return 86 en vez de 0
« en: 11 Enero 2015, 22:46 pm »

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
  1. int main (int argc,char * argv[])
  2. {
  3. /* Examina el número de parámetros pasados */
  4. if(argc!=4)
  5. {
  6. fprintf(stderr,"ERROR: linea de comandos incorrecta. Utilice:\n\
  7. leelabfich fichero_de_entrada columna_inicio fila_inicio\n");
  8. return 0;
  9. }
  10.  
  11. int inix=atoi(argv[2]); //Cambia a formato numérico los caracteres
  12. int iniy=atoi(argv[3]); //pasados en línea de comando
  13.  
  14. char dim[BUFF];
  15. char * pdim=&dim[0];
  16. char ** lab=NULL;
  17. char ** p=NULL;
  18. int i=0;
  19. int j=0;
  20. int ctrl=0;
  21. int ctrl2=0;
  22. int tamh=0;
  23. int tamv=0;
  24.    int varokey = 0;
  25.  
  26. nodo * lista=NULL;
  27.  
  28. //inicializamos el buffer donde se guardarán las dimensiones
  29. memset(dim,0,BUFF);
  30.  
  31. FILE * fp=NULL;
  32.  
  33. fp=fopen(argv[1],"r"); // abrimos el archivo
  34. if(NULL==fp) // comprobamos que se ha abierto correctamente
  35. {
  36. fprintf(stderr,"No se puede abrir el fichero de entrada.\n");
  37. return 0;
  38. }
  39.  
  40. pdim=fgets(dim,BUFF-1,fp);
  41. // Leemos la primera línea y la guardamos en el buffer
  42. /* Se espera encontrar sólo dos números enteros, descartando
  43. ** que haya más.
  44. **
  45. ** Para vrificar errores, numeros decimales o símbolos, la sentencia else y
  46. ** el if anidado en él controlan que no haya caracteres que induzcan
  47. ** al error, descartando los espacios.
  48. */
  49. for(i=0;dim[i]!='\n';i++)
  50. {
  51. if((dim[i]>='0')&&(dim[i]<='9'))
  52. {
  53. for(j=0;(dim[i+j]>='0')&&(dim[i+j]<='9');j++)
  54. ;
  55. i=i+j-1;
  56. ctrl++;
  57. }
  58. else
  59. {
  60. if(dim[i]!=' ')
  61. ctrl2++;
  62. }
  63. }
  64. /* aquí se determina si lo leído coincide con 2 enteros correspondientes
  65. ** a las dimensiones o hay un error.
  66. */
  67. if(ctrl!=2||ctrl2!=0)
  68. {
  69. //fprintf(stderr, "Dimensiones del laberinto incorrectas.\n\n");
  70. fprintf(stderr,"Las dimensiones han de ser dos números enteros.\n\n");
  71. return 0;
  72. }
  73. // si todo es correcto se leen del propio buffer las dimensiones
  74. sscanf(pdim,"%d %d",&tamh,&tamv);
  75.  
  76.  
  77. /* Se reserva memoria dinámicamente de acuerdo con las dimensiones
  78. ** especificadas. */
  79.  
  80. lab=crea_laberinto(tamh,tamv);
  81.  
  82. if(NULL==lab)
  83. {
  84. fprintf(stderr,"Error en la reserva de memoria.\n");
  85. return 0;
  86. }
  87. p=lab;
  88. //inicializamos las variables de control
  89. ctrl=0;
  90. ctrl2=0;
  91.  
  92. /* Ahora leemos el propio laberinto desde el fichero indicado.
  93. **
  94. ** Serán leídas tantas filas como diga la dimensión vertical.
  95. ** Cada línea leída se cuenta para asegurarnos que no se excede
  96. ** el valor indicado por la dimensión horizontal y haya una
  97. ** inconsistencia de datos
  98. */
  99. for(i=0,j=0;0==j;i++)
  100. {
  101. if(i<tamv)
  102. {
  103. fscanf(fp,"%s",p[i]);
  104. ctrl=(int)strlen(p[i]);
  105. if((ctrl!=tamh)&&((j=feof(fp))==0))
  106. {
  107. fprintf(stderr,"Fila %d leída errónea.\n",i+1);
  108. ctrl2++;
  109. }
  110. ctrl=0;
  111. }
  112. else
  113. {
  114. fscanf(fp,"%s",dim);
  115. ctrl++;
  116. }
  117. j=feof(fp);
  118. }
  119. if(1!=ctrl)
  120. {
  121. j=FALTANFILAS;
  122. if(i>tamv)
  123. --i;
  124. }
  125. else
  126. --i;
  127.  
  128. /* Examinamos que no hay una inconsistencia de datos analizando
  129. ** las variables de control. Si hay filas erróneas, se imprimen
  130. ** por la salida de errores los mesajes pertinentes, siendo ctrl2
  131. ** la variable que contiene el número de filas con errores.
  132. */
  133. if((ctrl2!=0)||(j==FALTANFILAS))
  134. {
  135. fprintf(stderr,"\nERROR en las filas leídas.\n");
  136. fprintf(stderr,"Filas válidas leídas: %d.\n",(i-ctrl2));
  137. fprintf(stderr, "Filas indicadas en dimensión: %d.\n",tamv);
  138.  
  139. if(j!=FALTANFILAS)
  140. {
  141. fprintf(stderr, "\nERROR en las columnas leídas.\n");
  142. fprintf(stderr, "%d filas con errores en sus columnas.\n",
  143. ctrl2);
  144. }
  145.  
  146. fprintf(stderr, "\nInconsistencias en los datos de entrada.\n\
  147. NO RESOLVEMOS EL LABERINTO.\n\n");
  148.  
  149. return 0;
  150. }
  151.  
  152. if((inix>tamh)||(inix<0)) //se analiza que no empieze fuera del laberinto
  153. {
  154. printf("El punto (%d, %d) no pertenece al laberinto.\n",inix,iniy);
  155. return 0;
  156. }
  157. else
  158. {
  159. if((iniy>tamv)||(iniy<0))
  160. {
  161. printf("El punto (%d, %d) no pertenece al laberinto.\n",inix,iniy);
  162. return 0;
  163. }
  164. }
  165. p=lab;
  166. if(p[iniy][inix]=='#') // se analiza si el punto de inicio es
  167.   // un obstáculo
  168. {
  169. printf("El punto (%d, %d) es un obstaculo.\n",inix,iniy);
  170. return 0;
  171. }
  172.  
  173.  
  174. int a=0;
  175. a=fclose(fp); //cerramos el fichero donde está el laberinto.
  176.    if (a){
  177.        fprintf(stderr, "Error cerrando\n");
  178.    }
  179. /*
  180. ** Llamamos a la función que propiamente encuentra la salida del laberinto
  181. ** Los parametros pasados a la funcion son:
  182. ** primero un puntero que indica la posicion donde empiezo
  183. ** Un puntero a una zona de memoria que contiene al laberinto
  184. ** Tamaño horizontal del laberinto
  185. ** Tamaño vertical del laberinto
  186. */
  187.  
  188. a=encuentraRuta(inix,iniy,lab,tamh,tamv,&lista);
  189.  
  190. //si la función no encuentra ninguna ruta, se imprime el mensaje pertinente
  191. if(a==0)
  192. printf("No existe salida desde el punto (%d, %d).\n",inix,iniy);
  193. else
  194. {
  195. // Aqui es donde se imprimir el laberinto de forma "visual".
  196. cambonito(lab,tamh,tamv,&lista);
  197. }
  198. // Liberamos la memoria donde se encontraba el laberinto y la
  199. // lista de puntos por los que paso
  200.  
  201. libera(lab,tamh,tamv,&lista);
  202.    varokey = OK;
  203.    if(varokey = OK){
  204. return 0;
  205.    }
  206. }
  207.  

Mod: Al publicar código usa etiquetas GeSHi


« Última modificación: 12 Enero 2015, 01:06 am por engel lex » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Return 86 en vez de 0
« Respuesta #1 en: 12 Enero 2015, 18:48 pm »

Ellos sabrán: http://www.imdb.com/title/tt0087332/


En línea

_Enko


Desconectado Desconectado

Mensajes: 538



Ver Perfil WWW
Re: Return 86 en vez de 0
« Respuesta #2 en: 12 Enero 2015, 20:43 pm »

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

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

deberia de ser
Código:
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
« Última modificación: 12 Enero 2015, 20:52 pm por _Enko » En línea

A.I.

Desconectado Desconectado

Mensajes: 61


Ver Perfil
Re: Return 86 en vez de 0
« Respuesta #3 en: 12 Enero 2015, 21:05 pm »


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

Código:

    if(varokey = OK){


Las asignaciones como condición se cumplen siempre.

¿Puedes enseñarnos como obtienes el valor de retorno?
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Return Fire2
Juegos y Consolas
juanjorome 2 2,044 Último mensaje 3 Febrero 2005, 03:48 am
por juanjorome
Return en recursividad(Lenguaje C)
Programación C/C++
DanielPy 2 1,437 Último mensaje 29 Octubre 2015, 13:48 pm
por DanielPy
Problemas con return
Programación C/C++
cNoob 3 1,971 Último mensaje 19 Junio 2016, 23:44 pm
por engel lex
Mas problemas con return.
Programación C/C++
cNoob 3 2,402 Último mensaje 20 Junio 2016, 22:26 pm
por engel lex
Ayuda con error en c++ , return raro
Programación C/C++
strancok 8 4,948 Último mensaje 19 Julio 2019, 01:05 am
por @XSStringManolo
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines