Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Опять про Struct
Форум программистов > Системное программирование > C, С++ и С Builder > Общие вопросы по С и С++
debug
Ниже я задавал подобный вопрос - незнание это плохо - но не нашёл ответов на следующий вопрос:
Имеется код:
struct SIGNAL_STATUS {
    char status_t;
    unsigned short gNumber;
    unsigned char sNumber;
    unsigned short info;
    unsigned short panel;
};

    char temp[16];
    memset(temp, 0, 16);
    temp[0]=0x14;
    temp[1]=0;
    temp[2]=0x01;
    temp[3]=0x01;
    temp[4]=0;
    temp[5]=0;
    temp[6]=0;
    temp[7]=0x01;
    SIGNAL_STATUS *sg=(SIGNAL_STATUS*)temp;
    sg->status_t;
    sg->gNumber;
    sg->sNumber;
    sg->info;
    sg->panel;


Резхультаты к сожалению не ожидаемые мной.
Что я ожидал:
sg->status_t=0x14
sg->gNumber=0x0001
sg->cNumber=0x01
sg->info=0x0000
sg->panel=0x0001

что получаеться на самом деле:
sg->status_t=0x14
sg->gNumber=257
sg->cNumber=0
sg->info=256
sg->panel=..

Могу конечно ошибиться - но факт тот - что результат сильно отличается от ожидаемого.
Что здесь может быть - выравнивание или сетевой порядок байт (похоже чем то), хотя думаю последнее тут не причём.
debug
Немного разобрался с выравниванием - как мне ответили в предыдущем вопросе - объявил так
#pragma pack(push,1)
struct SIGNAL_STATUS {
    char status_t;
    unsigned short gNumber;
    unsigned char sNumber;
    unsigned short info;
    unsigned short panel;
};
#pragma pack(pop)


Результат после этого стал таким (в предыдущем примере)
sg->status_t=0x14
sg->gNumber=256
sg->cNumber=1
sg->info=0
sg->panel=256

Вижу - что переменные структуры типа short видимо хранятся в памяти в обратном порядке байт.
Почему - если я заполняю памать прямо, так видимо храняться переменные целых типов в памяти?
И ещё вопрос - как избежать этого выравнивания по другому - я с такими проблемами ещё не встречался sad.gif - очч неприятная вещь.
grigsoft
Избежать - опцией компилятора выравнивать всегда по 1 байту. А по порядку байт - почитай где нибудь про органицацию памяти в x86.
]]>http://en.wikipedia.org/wiki/Byte_ordering]]>
]]>http://msdn2.microsoft.com/en-US/library/3thek09d.aspx]]>
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2008 IPS, Inc.