в файле ibase.h имеется структура: Код (Text): typedef struct { short version; /* version of this XSQLDA */ char sqldaid [8]; /* XSQLDA name field */ ISC_LONG sqldabc; /* length in bytes of SQLDA */ short sqln; /* number of fields allocated */ short sqld; /* actual number of fields */ XSQLVAR sqlvar [1]; /* first field address */ } XSQLDA; переписываю в асм: Код (Text): struct XSQLDA version dw ? ; +0 sqldaid rb 8 ; sqldabc dd ? ; +12 sqln dw ? ; +16 sqld dw ? ; +18 sqlvar XSQLVAR ; first field address ends но размер структуры в с - 172 байта, а у меня - 170 байт. заполняю ее в сях поэлементно и смотрю в отладчике - размеры совпадают, а вот смещения отличаются на два байта начиная с sqldabc (указаны в коментах). лечу так: Код (Text): sqldaid rb 8 ; rb 2 ; sqldabc dd ? ; +12 поскольку в хлл у меня опыт небольшой, идея у меня одна: может, char sqldaid [8] имеет в начале двухбайтное слово для длины строки? или я чего-то не догнал?
для указателей? я не знаю в каких случаях элементы структуры могут выравниваться автоматически. (в смысле неявно)
в каких случаях внутри структуры? ведь не для каждого ж элемента. === Код (Text): #define ISC_LONG int
shoo Мм, по-моему, для всех. Но вообще, надо смотреть, какое выравнивание по-умолчанию в ключах компилятора и не было ли оно переопределено в заголовочном файле. Для align 4 думаю так будет: Код (Text): typedef struct { short version; /* version of this XSQLDA */ char pad[2]; char sqldaid [8]; /* XSQLDA name field */ ISC_LONG sqldabc; /* length in bytes of SQLDA */ short sqln; /* number of fields allocated */ short sqld; /* actual number of fields */ XSQLVAR sqlvar [1]; /* first field address */ } XSQLDA;
кажется начинаю догонять. явных спецификаций быстро я не нашел, но так понял, что элемент выравнивается по своему размеру (в общем случае): байт - на 1, слово на 2, а двойное - на 4. вот тестовая структура и смещения для элементов: Код (Text): typedef struct { char field1; /* 0 */ int field2; /* 4 */ char field3; /* 8 */ short field4; /* 10 */ char field5; /* 13 */ } TEST_STRUCT; а sizeof(TEST_STRUCT) дает значение 16 (кратное 4, точно не 2)
censored нет pad - перед int! === вот я записываю туда букву (из отладчика): Код (Text): MOV BYTE PTR DS:[ECX+2],DL (есх - указатель на структуру)
Asterix так и есть, я когда-то проверял =) PS: в Delphi просто record выравнивается таким же образом.