Programación General > C/C++
Error al imprimir un campo de un registro, devuelve "ZERO"
huevofritopamojarpan:
Hola. Primero me dirijo a "mo0squit0". Si bien tu primero contestación me pareció sin duda graciosa, en la segundo noto un tono de superioridad que espero que sea sólo interpretación mía, porque aquí vengo a aprender y a enseñar lo que buenamente pueda, y no a perder el tiempo recordándole a nadie por qué su madre sale todas las noches de casa.
Me centro pues en el problema. Tengo un registro con varios campos, y al imprimir uno de estos campos, un array de caracteres, me imprime "ZERO". Adjunto de nuevo el código porque lo he modificado bastante. La línea a la que me refiero es ahora la número 365.
Un saludo y muchas gracias!
PD: Por qué es mejor scanf que gets?
huevofritopamojarpan:
Bueno, planteo la pregunta de otro modo. ¿Cuando devuelve C "ZERO"?
A mi esto me parece muuuuuy raro.
Un saludo!
Eternal Idol:
linea 421: warning C4700: uninitialized local variable 'lista_usuarios' used
tipo_usuario usuario, *lista_usuarios;
tipo_fecha fecha;
//los índices de los arrays: mes,dia,hora
tipo_reserva matriz_reservas[122][31][13];
reservas_inicializar(&(matriz_reservas[0][0][0]));
usuarios_inicializar(lista_usuarios); <<<< puntero indefinido
Se me ocurren dos cosas para el ZERO, una es que sea efectivamente ese el contenido de la cadena y otra que al ser un puntero nulo tu RTL (asumo que estas usando gcc ya que VC++ no compila este codigo) use esa cadena. La funcion usuario_add deberia retornar algo.
linea 249: warning C4804: '>' : unsafe use of type 'bool' in operation
No entiendo el objetivo de la misma:
if (!contador>0)
¿Tal vez queres menor o igual a 0?
huevofritopamojarpan:
Muchísimas gracias Eternal Idol por contestar. :beer:
El puntero no está definido, pero luego hago malloc dentro de la función. ¿Esto es un error?
Sobre la función usuario_add, nada, eso es una función a más, que aún tengo que hacer.No influye en el resto del programa, ya que mientras no doy solucionado lo de ZERO intento avanzar por otros lados para no perder el tiempo.
Y por último !contador>0 equivale a contador<=0, sí, jeje. A mi me parecía normal ponerlo así :-P
Mil gracias!!
Agur!
Eternal Idol:
De nadas B)
Si, esta mal debido a que dentro de la funcion usuarios_inicializar lista_usuarios tendra un valor pero ese no se vera reflejado en las funciones que la llaman, para eso tenes que usar un doble puntero o una referencia (asi pasas la direccion de memoria donde esta el puntero y de esa manera podes hacerlo apuntar a otro lado, si solo pasas el puntero en si mismo no podes hacer eso). Un ejemplo simple, fijate que p (equivalente a lista_usuarios en tu codigo) es simplemente una variable local y esta en la pila, si pasas su contenido no podes hacerla apuntar a otro lado (inicializar_mal) si pasas su direccion si (inicializar_bien):
--- Código: C++ ---#include <stdio.h>#include <stdlib.h> void inicializar_mal(char *p){ printf("%s %prn", __FUNCTION__, p); p = (char*)malloc(1024); printf("%s %prn", __FUNCTION__, p);} void inicializar_bien(char **p){ printf("%s %p %prn", __FUNCTION__, p, *p); *p = (char*)malloc(1024); printf("%s %p %prn", __FUNCTION__, p, *p);} int main(){ char *p = 0; printf("%s %p %prn", __FUNCTION__, &p, p); inicializar_mal(p); printf("%s %p %prn", __FUNCTION__, &p, p); inicializar_bien(&p); printf("%s %p %prn", __FUNCTION__, &p, p); return 0;}
Un output de ejemplo:
main 0022FF74 00000000
inicializar_mal 00000000
inicializar_mal 003E4FA8
main 0022FF74 00000000
inicializar_bien 0022FF74 00000000
inicializar_bien 0022FF74 003E53B0
main 0022FF74 003E53B0
El azul es la direccion de memoria de la variable en la pila, nunca cambiara, lo rojo es la memoria dinamica reservada. Fijate que antes de entrar a inicializar_mal p apunta a 0 y despues de salir tambien, en el caso de inicializar_bien al entrar apunta a 0 pero al salir apunta a la memoria dinamica reservada.
En ningun caso libere la memoria PERO en el segundo podria hacerlo desde main, en el primero no, es un memory leak seguro :clown:
Navegación
[#] Página Siguiente
[*] Página Anterior
Ir a la versión completa