Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Seyro97 en 25 Mayo 2015, 17:34 pm



Título: (Ayuda) Error con un bucle while en un constructor
Publicado por: Seyro97 en 25 Mayo 2015, 17:34 pm
Hola. Muy buenas a todos. Hoy traigo una duda de las que uno piensa que el compilador está fallando porque no tiene otra explicación.

Primero voy a introducir: Estoy intentando imitar la clase string a modo de ejercicio. Pues bien, en el constructor está pasado algo solo descriptible a través de la salida (está debajo del código).

Código
  1. String::String(const char *init_value) {
  2. unsigned int num_characters = 0;
  3.  
  4. while(init_value[num_characters] != (char)NULL)
  5. num_characters += 1;
  6.  
  7. _num_characters = num_characters;
  8. _value = (char *)malloc(num_characters + 1);
  9.  
  10. _value[num_characters] = (char)0;
  11.  
  12. while(--num_characters >= 0) {
  13. printf("%d ", num_characters);  // _value[num_characters] = init_value[num_characters];
  14. }
  15. }

Pues bien, la salida es la siguiente:
3 2 1 0 -1 -2 -3 -4 //... y así hasta el infinito
(El comentario no está en la salida, solo es para aclarar)

Como ven, aunque num_characters valga menos de 0, el while se sigue repitiendo...

Espero que sea error del compilador, porque si no yo sería muy tonto



Título: Re: (Ayuda) Error con un bucle while en un constructor
Publicado por: Stakewinner00 en 25 Mayo 2015, 17:44 pm
num_characters es unsigned, no tiene signo, siempre sera >= 0 (por mucho que num_characeters sea 0 cumple que == 0 y continuara el while y pasara de 0 a un número gigante.

Yo haría un while(--num_characters) y cuando sea 0 ya para.


Título: Re: (Ayuda) Error con un bucle while en un constructor
Publicado por: Seyro97 en 25 Mayo 2015, 18:17 pm
... Por eso algunas veces me siento tonto. Claro xD Gracias!

Para el que le interese, aquí le dejo el código con el error solucionado :D

Código
  1. String::String(const char *init_value) {
  2. unsigned int num_characters = 0;
  3.  
  4. while(init_value[num_characters] != (char)NULL)
  5. num_characters += 1;
  6.  
  7. _num_characters = num_characters;
  8. _value = (char *)malloc(num_characters + 1);
  9. _value[num_characters] = (char)0;
  10.  
  11. while(true) {
  12. --num_characters;
  13.  
  14. _value[num_characters] = init_value[num_characters];
  15.  
  16. if(num_characters == 0)
  17. break;
  18. }
  19. }


Título: Re: (Ayuda) Error con un bucle while en un constructor
Publicado por: Peregring-lk en 25 Mayo 2015, 20:11 pm
Así también es una opción:

Código
  1. ++num_characters;
  2.  
  3. while (num_characters-- > 0)
  4.    printf("%u ", num_characters);

Y si desplazas el postdecremento una posición:

Código
  1. ++num_characters;
  2.  
  3. while (num_characters --> 0)
  4.   printf("%u ", num_characters);

parece una flechita :)