Вопрос по выравниванию

Тема в разделе "WASM.BEGINNERS", создана пользователем electron, 18 окт 2005.

  1. electron

    electron New Member

    Публикаций:
    0
    Регистрация:
    26 май 2005
    Сообщения:
    32
    Извиняюсь за С.

    Есть структура:

    #pragma pack(push,1)

    typedef struct str

    {

    USHORT str1;

    USHORT str2;

    ULONG str3;

    ...

    }*pstr;

    #pragma pack (pop)



    pMem — какой-то адрес в памяти.

    pstr mystr = (pstr)pMem;



    mystr->str3 оказывается равен не 4 байтам ,следущими за str2,a 4 байтам отстающими от str2 на 4 байта.



    Что нужно сделать, чтоб они шли по порядку,

    Заранее спасибо.
     
  2. electron

    electron New Member

    Публикаций:
    0
    Регистрация:
    26 май 2005
    Сообщения:
    32
    Причём, если ULONG заменить на 2xUSHORT то становится на свои места.
     
  3. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    electron

    Какой компилятор?

    Пробовал код
    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3. #pragma pack(push,1)
    4. typedef struct
    5. {
    6.   USHORT s1;
    7.   USHORT s2;
    8.   ULONG  s3;
    9.   BYTE   s4;
    10. } str;
    11. #pragma pack (pop)
    12.  
    13. int main(void)
    14. {
    15.   str s;
    16.   printf("\n"
    17.          "sizeof(s)   = %u\n"
    18.          "offset s.s1 = %u sizeof(s.s1) = %u\n"
    19.          "offset s.s2 = %u sizeof(s.s2) = %u\n"
    20.          "offset s.s3 = %u sizeof(s.s3) = %u\n"
    21.          "offset s.s4 = %u sizeof(s.s4) = %u\n",
    22.          sizeof(s),
    23.          FIELD_OFFSET(str, s1), sizeof(s.s1),
    24.          FIELD_OFFSET(str, s2), sizeof(s.s2),
    25.          FIELD_OFFSET(str, s3), sizeof(s.s3),
    26.          FIELD_OFFSET(str, s4), sizeof(s.s4));
    27.   return 0;
    28. }
    на MS C/C++ v13.10.3077 и Intel С/С++ v8.1.025. В обеих случаях получил
    Код (Text):
    1. sizeof(s)   = 9
    2. offset s.s1 = 0 sizeof(s.s1) = 2
    3. offset s.s2 = 2 sizeof(s.s2) = 2
    4. offset s.s3 = 4 sizeof(s.s3) = 4
    5. offset s.s4 = 8 sizeof(s.s4) = 1
     
  4. electron

    electron New Member

    Публикаций:
    0
    Регистрация:
    26 май 2005
    Сообщения:
    32
    q_q

    Спасибо q_q,я вроде разобрался.Я тут с 16-ми значениями начудил,смотрю на Hex,а в голове Dec.