Problema con el tamaño de una estructura y/o cadena en Dev-C++

Iniciado por BlerofonT, 8 Junio 2012, 14:29 PM

0 Miembros y 2 Visitantes están viendo este tema.

BlerofonT

Buenas a tod@s!!!

Mi problema es que he hecho un programa en el cual modifico las siguientes estructuras:

Código (cpp) [Seleccionar]
struct Producto{
       int codigo;
       char nombre[N];/*N=50*/
       float precio;
       int stock;
       };


y cuando hago el Dev-C++ un sizeof(struct Producto) me dice que ocupa 64bytes, pero si hacemos el calculo: 4 de int + 50 de char +4 float(en mi makina el tamaño de float es 4) + 4 de int =62!!!!
En cambio en Borland si que el sizeof(struct Producto) = 62.

¿Alguien sabe porke Dev-C++ me cuenta 2 bytes de mas?(creo que estos dos bytes son debidos a la cadena de 50 caracteres, ya que al leer la estructura de un fichero, el puntero avanza por el fichero: 4+50+2+4+4 y ademas cree una estructura con solo un int y un float y el sizeof(struct Producto)=8, como debe de ser )

Espero vuestras respuestas!!! :D

do-while

¡Buenas!

Supongo que sera por la alineacion de los datos en memoria. Esto quiere decir, que cuando el compilador crea tu tipo de dato, no siempre el tamaño final sera la suma de los tamaños de los datos que contiene, ya que, por ejemplo, por cuestiones de eficiencia a la hora de acceder a la informacion, puede resultar mas facil acceder a unas posiciones de memoria que a otras. En este caso, si te das cuenta, esos 50 caracteres, que equivalen a 50 bytes, no son multiplo de 4, y por lo que comentas, te lo redondea por arriba a un multiplo de 4 (que es el tamaño de un DWORD)...

La verdad es que la respuesta la he dado por intuicion, si es errornea o alguien tiene una respuesta mas exacta, me gustaria conocerla.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!

BlerofonT

Cita de: do-while en  8 Junio 2012, 15:37 PM
¡Buenas!

Supongo que sera por la alineacion de los datos en memoria. Esto quiere decir, que cuando el compilador crea tu tipo de dato, no siempre el tamaño final sera la suma de los tamaños de los datos que contiene, ya que, por ejemplo, por cuestiones de eficiencia a la hora de acceder a la informacion, puede resultar mas facil acceder a unas posiciones de memoria que a otras. En este caso, si te das cuenta, esos 50 caracteres, que equivalen a 50 bytes, no son multiplo de 4, y por lo que comentas, te lo redondea por arriba a un multiplo de 4 (que es el tamaño de un DWORD)...

La verdad es que la respuesta la he dado por intuicion, si es errornea o alguien tiene una respuesta mas exacta, me gustaria conocerla.

¡Saludos!

Pues efectivamente tienes razon en lo de multiplo de 4, ya que cambie la N por 48 y me dice que el tamaño de la estructura es 60, y despues escribi N=49, 50, 51 y 52 y me decia que el tamaño era 64, y escribi N=53 y el tamaño era 68. Pero, ¿esto no es un coñazo si quiero usar mi codigo en otras IDE o con otros compiladores? Porque si escribo mi mismo codigo en Borland no funciona ya que en la lectura del ficheroen Dec-C++, al acceder al elemento float de mi estructura tenia q sumarle el 2 famoso que dije antes, y en Borland no hace falta y por eso mi programa no funcionaba bien... :(

BlerofonT

do-while tenia razon, aki dejo el enlace:

http://c.conclase.net/curso/index.php?cap=011b#STR_sizeof

aunke me sigue pareciendo un coñazo que Dev-C++(ya que segun este link no dicen q otros programas lo hagan) haga esto, ya que si quiero luego usar mi codigo en otro programa como Borland me compila bien pero no funciona... (aunke mejore el rendimeinto del procesador). Supongo que si siempre usas el mismo IDE tiene la ventaja de mejorar el rendimiento, pero bueno... :(

eduu15

#4
Yo uso codeblocks y tambien lo hace, creo que lo hacen todos.
Llego 6 años despues a la respuesta pero bueno...