Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

resultados extraños en variables

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: resultados extraños en variables Responder citando

Hola
Tengo un problema que me vuelve loco y no adivino por donde solucionarlo
He declarado de forma global una estructura con este formato
Código:
struct DATOS{
char nombre[30];
char codigo[15];
char multiplos[2];
} arti;

El caso es que leo del archivo la estructura, pero cuando le pongo el puntero del ide encima de arti me muestra la estructura con los datos pero vacíos, como si no hubiese leído nada del disco
Código:
Valor=arti.codigo
pero cuando ejecuto la linea, Valor = "ES05"

No habría problema con el fallo si no fuese que en otra función el dato vale "" y claro no puedo hacer un seguimiento para ver donde "se come" los datos

Espero haberme explicado
Gracias y saludos
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

añado otro dato
He declarado global struct DATOS arti2; y funciona correctamente
no entiendo nada

saludos
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Posible información para contestar un porque Responder citando

Recuerda que el C reusa la memoria, no hace limpieza de la basura, por lo tanto cuando se reserva memoria para una variable "x", se encuentra información, También en las cadenas hay que considerar la ultima posición para el fin de cadena, que es una marca física, por ejemplo si reservas 30 espacios para una cadena, solo puedes usar 29, si usas 30 destruyes la marca física del fin de cadena y tomará información de otra variable, hasta que encuentre otra marca física de fin de cadena....contestado?
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Muy posiblemente se trate del alineamiento de la estructura en memoria. Tu estructura tiene un tamaño de 47 bytes. Pero en memoria estará ocupando un múltiplo de 4. Para comprobarlo, simplemente encuentra en tiempo de ejecución su tamaño size (DATOS).
El compilador añade bytes de relleno a tu estructura hasta completar un tamaño adecuado con el alineamiento en vigor.

Tienes dos opciones:
1.- Forzar un tamaño de 48 bytes
2.- Forzar el alineamiento:
Código:
 
#pragma pack( push )
#pragma pack( 1 )  // valor de alineamiento

struct DATOS{ 
char nombre[30]; 
char codigo[15]; 
char multiplos[2]; 
} ;

#pragma pack( pop )  // recuperamos el alineamiento por defecto


Por lo general no es necesario alinear estructuras a no ser que tengas varias seguidas en memoria, como por ejemplo, leídas de un archivo sobre un buffer sobre el que realizas un castillo a tus estructuras. En ese caso no puedes tener valores vacíos de alineamiento entre una y otra.

Si no inicializas la estructura a un valor determinado, contendrá basura.

Saludos.
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Gracias a los 2 por vuestras respuestas
kabern: No va por ahí. El problema es que mi rad 2007 detecta a 0 toda la estructura en modo debug, pero la mayoría de las veces la struct SI tiene valor. Este fallo me evita "rastrear" el posible fallo de perdida de datos
Código:
Valor=arti.codigo;

y en modo debug, después de ejecutar la linea: Valor="ES05" y arti.codigo="\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0"

escafandra: Si, ya se que tengo que "cuadrar" los bytes, pero tengo miedo de tocar nada por si es un error serio y pierdo la pista.
Ya "solucioné" el problema haciendo global la estructura, aunque de vez en cuando me vuelvo masoca y pruebo cosas. Te prometo que voy a probarlo, aunque no entiendo que tiene que ver con que el debug muestre la struct llena de nulos

Gracias y saludos
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.