| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Sab 25 Jul, 2015 5:51 pm Asunto: resultados extraños en variables |
|
|
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 |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Sab 25 Jul, 2015 6:58 pm Asunto: |
|
|
añado otro dato
He declarado global struct DATOS arti2; y funciona correctamente
no entiendo nada
saludos |
|
| Volver arriba |
|
 |
kabern Cdt

Registrado: 11 Ene 2008Mensajes: 11
|
Publicado: Mar 16 Feb, 2016 5:03 pm Asunto: Posible información para contestar un porque |
|
|
| 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 |
|
 |
escafandra Master

Registrado: 29 Nov 2007Mensajes: 625Ubicación: Madrid - España
|
Publicado: Mar 16 Feb, 2016 7:17 pm Asunto: |
|
|
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 |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Mar 16 Feb, 2016 10:42 pm Asunto: |
|
|
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 |
|
 |
|