kosyak© 0 3 сентября, 2009 Опубликовано 3 сентября, 2009 (изменено) · Жалоба есть объявление структуры ... typedef __packed struct { BYTE Signature:7; BYTE Answer:1; BYTE Owner; BYTE Command; BYTE Error; BYTE PacketID; WORD PacketSize; } TPackHead; ... и далее в коде ... if( RECV_SIZE == sizeof(TPackHead) ) { if( ((TPackHead*)USART_BUF)->Answer == 0 ) { ... Такая конструкция используетсяв 2-х проектах: В одном проекте sizeof(TPackHead) == 7 (что есть правильно) В другом sizeof(TPackHead) == 9 (о_О). Я так понимаю что это компилятор насовал в структуру доп. элементы для выравнивания, но вроде как деректива __packed при объявлении должна запретить ему такую самодеятельность... Как заставить компилятор не выравнивать члены структур?!?!?! Компилятор RealView MDL 3.24. Всем спасибо вопрос снят! Оказыватся WORD был объявлен как typedef unsigned int WORD; эт все перекочевало с 8 битной платформы...второй раз уже втыкаюсь :cranky: Изменено 3 сентября, 2009 пользователем kosyak© Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
esaulenka 7 3 сентября, 2009 Опубликовано 3 сентября, 2009 · Жалоба Дурацкий вопрос: а что будет в памяти, если сделать struct TPackHead head; memset (head, 0, sizeof (TPackHead)); head.Signature = 0xFF; head.Answer = 1; ... head.PacketSize = 0xFFFF Кейл как-то странно себя вёл с битовыми полями. Разбираться не стал, переделал под маски. Впрочем, в той ситуации подозреваю собственные кривые руки :) Заинтересовался. Что тут в хелпе обещают? Выравнивание - по байтам, что-ли? Bitfield containers in packed structures have an alignment of 1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться