[ Foro de C ]

Bucle infinito

15-May-2014 20:42
Invitado (Kardioh)
1 Respuestas

¿Por qué me entra este Do-While en bucle infinito? No debería... Llevo un dia dandole vueltas y a la fuerza tiene que llegar un momento en el que "line" apunte a NULL:


 do
	    {
	      fgets(line, MAX, ptconf);
	      if(line != NULL)
		{
		  sscanf(line, "%s %s %s", nom, tip, dat);
		  p = CreaNodo(nom, tip, dat, perroMemo);
		  if(p != NULL)
		    {
		      if(l == 0)
			Enlaza(p, &prim);
		      l = 0;
		    }
		  else
		    erroMemo = 1;
		  prim = p;
		}
	    }
	  while((line != NULL) && (erroMemo != 1));



17-May-2014 18:12
Nacho Cabanes (+83)

Lo he recolocado un poco (espacios en vez de tabulaciones) para que me resulte más fácil de leer, aunque las variables son cortas y un tanto crípticas, y no hay comentarios, así que hay que echarle imaginación para saber lo que pretendes:


do
{
    fgets(line, MAX, ptconf);
    if(line != NULL)
    {
        sscanf(line, "%s %s %s", nom, tip, dat);
        p = CreaNodo(nom, tip, dat, perroMemo);
        if(p != NULL)
        {
            if(l == 0)
                Enlaza(p, &prim);
            l = 0;
        }
        else
            erroMemo = 1;
        prim = p;
    }
}
while((line != NULL) && (erroMemo != 1));


Va a repetir mientras se cumplan esas 2 condiciones, de modo que que debería dejar de repetir en cuanto una de las dos no se cumpla.

Por una parte "line" será distinto de NULL siempre que consigas leer, sólo valdrá NULL en caso de error de lectura. Por tanto, se interrumpirá si no se consigue leer una línea. (aunque quizá  fuera menos arriesgado usar "feof" para comprobar el final del fichero).

Por otra parte, se saldrá si "erroMemo" vale 1, pero no sé qué valor previo tiene "erroMemo". En tu fuente sólo pasará a tener ese valor cuando "creaNodo" devuelva NULL, cosa que tampoco sé cuando ocurrirá (supongo que cuando un "malloc" no te consiga reservar espacio).

No veo ningún motivo evidente para el bucle sin fin, así que tendrás que depurar paso a paso si tu entorno lo permite, o añadir algún "printf" que te muestre los valores de las variables, si usas algún entorno poco amigable.






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)