LINUX.ORG.RU

[C] Я туплю, или спать пора?


0

0

Нашел я примерчик на Си для чтения битмапов. Переделываю под свои нужды, и вот на что наткнулся. Есть структура

typedef struct {
	unsigned short type;
	unsigned int size;
	unsigned short reserved1;
	unsigned short reserved2;
	unsigned int offset;
} HEADER;
...
HEADER header;
В оригинале она читалась из файла почленно. Дай, думаю, прочитаю зараз:
fread(&header, sizeof(HEADER), 1, fptr);
Получаю: тип правильно, а все остальное - чушь какая-то. И что интересно, sizeof(HEADER) каким-то чудесным образом равен 16! Вернул почленное считывание - работает.

Но! Считывание информационного заголовка целой структурой за один раз работает! Как такое может быть? Или спать, все-таки, хотя бы по 6 часов надо?

☆☆☆☆☆

> sizeof(HEADER) каким-то чудесным образом равен 16!

всё верно:

unsigned short type; /* 4 байта (2 байта + выравнивание) */
unsigned int size; /* 4 байта */
unsigned short reserved1; /* 2 байта */
unsigned short reserved2; /* 2 байта */
unsigned int offset; /* 4 байта */
/* итого: 16 байт */

arsi ★★★★★ ()

> И что интересно, sizeof(HEADER) каким-то чудесным образом равен 16!

Если не сам Стандарт, то хотя бы одну книжечку по языку Си все-таки стоит прочитать - тогда бы вы знали что размер структуры не всегда равен сумме размеров ее членов по причине выравнивания.

anonymous ()

Если хочешь читать/писать заголовок целым блоком, то смотри в сторону нестандартных расширений компилятора: #pragma pack в случае VC++ и __attribute__((__packed__)) в случае GCC.

anonymous ()

Ну и напоследок осильте stdint.h для описания бинарных структур.

anonymous ()
Ответ на: комментарий от arsi

За все семейства ARM не ручаюсь, но с теми что сталкивался все ок (кроме дополнительных издержек по времени).

С архитектурой MIPS не знаком, но как подсказывает википедия: «Some architectures like MIPS have special unaligned load and store instructions.»

anonymous ()

>Я туплю,

да

или спать пора?

Не спать, а «учиться, учиться, учиться». И уроки не прогуливать.

Led ★★★☆☆ ()
Ответ на: комментарий от Led

И уроки не прогуливать.

:)

Школу 12 лет назад закончил. Ну да ладно, поспал - с утра на свежую голову разобрался.

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

>Ну да ладно, поспал - с утра на свежую голову разобрался.

Бывает. Я вот недавно под виндой в коде fopen забыл атрибут «бинарный» поставить. Ловил просто нереальные лулзы.

pathfinder ★★★ ()
Ответ на: комментарий от pathfinder

Я вот недавно под виндой в коде fopen забыл атрибут «бинарный» поставить.

:)

Программирование под мастдай - вообще геморройное дело. Поэтому я и не берусь за чуть ли половину предлагаемых мне проектов (если народ настолько упертый, что кроме мастдая ничего не хочет).

Eddy_Em ☆☆☆☆☆ ()
Ответ на: комментарий от Eddy_Em

Программирование под мастдай - вообще геморройное дело

Программирование - вообще геморройное дело

Программирование - геморройное

fixed.

impfp ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.