(Ayuda) Error con un bucle while en un constructor

Iniciado por Seyro97, 25 Mayo 2015, 17:34 PM

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

Seyro97

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 (cpp) [Seleccionar]
String::String(const char *init_value) {
unsigned int num_characters = 0;

while(init_value[num_characters] != (char)NULL)
num_characters += 1;

_num_characters = num_characters;
_value = (char *)malloc(num_characters + 1);

_value[num_characters] = (char)0;

while(--num_characters >= 0) {
printf("%d ", num_characters);  // _value[num_characters] = init_value[num_characters];
}
}


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

Carlos Peláez González. visita http://www.taringa.net/EnjoyC para muchos tutoriales!

Stakewinner00

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.

Seyro97

#2
... 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 (cpp) [Seleccionar]
String::String(const char *init_value) {
unsigned int num_characters = 0;

while(init_value[num_characters] != (char)NULL)
num_characters += 1;

_num_characters = num_characters;
_value = (char *)malloc(num_characters + 1);
_value[num_characters] = (char)0;

while(true) {
--num_characters;

_value[num_characters] = init_value[num_characters];

if(num_characters == 0)
break;
}
}
Carlos Peláez González. visita http://www.taringa.net/EnjoyC para muchos tutoriales!

Peregring-lk

Así también es una opción:

Código (cpp) [Seleccionar]

++num_characters;

while (num_characters-- > 0)
   printf("%u ", num_characters);


Y si desplazas el postdecremento una posición:

Código (cpp) [Seleccionar]

++num_characters;

while (num_characters --> 0)
  printf("%u ", num_characters);


parece una flechita :)