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

 

 


Tema destacado: Estamos en la red social de Mastodon


  Mostrar Temas
Páginas: [1]
1  Programación / Programación C/C++ / 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
Páginas: [1]
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines