<html><DIV>Hola!</DIV>
<DIV> </DIV>
<DIV>Me parece que tu problema es por que el compilador hace alineación de memoria al reservar espacio para estructuras.</DIV>
<DIV>Creo que la creación de una macro o funcion SIZEOF() no resolveria tu problema, en realidad no se estan guardando mas datos de los que explicitamente declaras en la estructura, y todos son almacenados en memoria, de acuerdo al tipo que declaraste en tu estructura, los bytes de mas que te reporta sizeof() en realidad no son significativos (es decir no podemos atribuirle a esto un gasto inescesario de memoria, como con por ejemplo un uso inadecuado de malloc/free), asi podemos decir que esos bytes de mas estan ahi unicamente para preservar los datos en posiciones de memoria multiplos de dos (en los procesadores intel este es el caso), pues de esta manera se hace mas rápido el acceso a datos, generalmente la memoria REAL utilizada por una estructura es MENOR que la ASIGNADA.</DIV>
<DIV> </DIV>
<DIV>Creo que si intentas reservar menos memoria que la indicada por sizeof(), solo te buscarias problemas (como SEGFAULTs), pues estarias asignando menos memoria de la que el compilador necesita para cada una de las estructuras.</DIV>
<DIV> </DIV>
<DIV>Ademas, desde mi punto de vista creo que la implementacion de una función o macro SIZEOF(), solo haria tu programa mas dificil de compilar en maquinas con arquitectura distinta a la tuya.</DIV>
<DIV> </DIV>
<DIV>Cualquier comentario o corrección de lo anterior sera bien recibido.</DIV>
<DIV> </DIV>
<DIV>Saludos</DIV>
<DIV> </DIV>
<DIV>Theo Rodríguez Domínguez</DIV>
<DIV>Corporación Interamericana de Entretenimiento</DIV>
<DIV>SITE - Palmas</DIV>
<DIV>Tél 5201-9080</DIV>
<DIV>Celular 044-2510-1218</DIV>
<DIV> </DIV>
<DIV>>From: Miguel Cárdenas <MCMAIL_Y2K@YAHOO.COM></DIV>
<DIV></DIV>>Reply-To: mcmail_y2k@yahoo.com
<DIV></DIV>>To: mcmail_y2k@yahoo.com, Linux Ayuda Argentina <LUGAR-GRAL@LINUX.ORG.AR>
<DIV></DIV>>CC: Linux Ayuda Mexico <AYUDA@LINUX.ORG.MX>
<DIV></DIV>>Subject: PARTE 2: Que pasa con el sizeof() ???
<DIV></DIV>>Date: Sun, 21 Jan 2001 09:44:51 -0600
<DIV></DIV>>
<DIV></DIV>> > struct ICQHDRv2_CLIENT {
<DIV></DIV>> > unsigned short version;
<DIV></DIV>> > unsigned short command;
<DIV></DIV>> > unsigned short seq_num;
<DIV></DIV>> > unsigned long uin;
<DIV></DIV>> > };
<DIV></DIV>> > Alguien me podria explicar porque demonios sizeof(ICQHDRv2_CLIENT ) me
<DIV></DIV>> > devuelve un 12 !!! hasta donde yo se esta porqueria me debe de dar 10...
<DIV></DIV>>
<DIV></DIV>>Holas!!!
<DIV></DIV>>
<DIV></DIV>>Bueno aqui estoy de nuevo... despues de pasar toda la noche meditando al
<DIV></DIV>>respecto y probando con diferentes tipos de datos y checando el contenido de
<DIV></DIV>>diversas estructuras byte por byte en memoria, vi que el problema no es el
<DIV></DIV>>sizeof sino que realmente ese "amount of memory" es generado!!!
<DIV></DIV>>
<DIV></DIV>>Lo que encontre es que el tamaño del bloque de memoria utilizado es multiplo
<DIV></DIV>>del tamaño de tipo de dato mas grande, por ejemplo, con unsigned long o con
<DIV></DIV>>float el tamaño del bloque allocated es multiplo de 4, con unsigned short es
<DIV></DIV>>multiplo de 2, con long long es multiplo de 8 y asi... Por lo cual el tamaño de
<DIV></DIV>>las estructuras nunca es el que deberia de ser como deberia esperarse...
<DIV></DIV>>
<DIV></DIV>>En si mi problema no es que el bloque sea mas grande por 1, 2 o 3 bytes pues
<DIV></DIV>>solo copio los bytes efectivos y los demas lo ignoro, el problema es que al usar
<DIV></DIV>>el sizeof para copiar y armar paquetes de acuerdo al protocolo de icq (cuyos
<DIV></DIV>>datos y offsets no pueden ser alterados) pues todos los offsets son un
<DIV></DIV>>desmadre y resulta en paquetes que no sirven para nada...
<DIV></DIV>>
<DIV></DIV>>Alguna sugerencia para armar mi propio SIZEOF() que me de el tamaño de los
<DIV></DIV>>datos y no el tamaño de memoria allocated? Please!!! se los agradecere
<DIV></DIV>>eternamente!!!
<DIV></DIV>>
<DIV></DIV>>Saludos!
<DIV></DIV>>
<DIV></DIV>>--
<DIV></DIV>>
<DIV></DIV>> Miguel Cárdenas
<DIV></DIV>> --------------------
<DIV></DIV>> mcmail_y2k@yahoo.com
<DIV></DIV>>
<DIV></DIV>>
<DIV></DIV>>---------------------------------------------------------
<DIV></DIV>>para salir de la lista, enviar un mensaje con las palabras
<DIV></DIV>>"unsubscribe ayuda" en el cuerpo a majordomo@linux.org.mx
<DIV></DIV><br clear=all><hr>Get Your Private, Free E-mail from MSN Hotmail at <a href="http://www.hotmail.com">http://www.hotmail.com</a>.<br></p></html>
---------------------------------------------------------
para salir de la lista, enviar un mensaje con las palabras
"unsubscribe ayuda" en el cuerpo a majordomo@linux.org.mx