|
Доступ к полям структуры. |
|
|
|
Aug 30 2013, 11:41
|
Знающий
   
Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709

|
Переношу код из AVR Studio (WINAVR) в Keil. Компилятор выдаёт предупреждение на объявление, на стоку с "};" Код ……… struct { unsigned char Bit1 : 1; unsigned char Bit2 : 1; }; …………. ..\Test.h(37): warning: #40-D: expected an identifier И потом выдаёт ошибку на использование этих полей. Лечится это заданием имени структуры, например "} A1;", что не удобно, для меня. В WINAVR, в MinGW, в Visual Studio такого нет, только в Keil. Может быть это стандарт С++, не проверял и всех тонкостей языка не знаю. Можно какими-нибудь флажками убрать эту особенность?
|
|
|
|
|
 |
Ответов
|
Aug 30 2013, 18:26
|
Знающий
   
Группа: Участник
Сообщений: 643
Регистрация: 29-05-09
Из: Германия
Пользователь №: 49 725

|
Цитата(Oleg_IT @ Aug 30 2013, 12:41)  Компилятор выдаёт предупреждение на объявление, на стоку с "};" Код ……… struct { unsigned char Bit1 : 1; unsigned char Bit2 : 1; }; …………. ..\Test.h(37): warning: #40-D: expected an identifier Код ……… struct mystruct_s { unsigned char Bit1 : 1; unsigned char Bit2 : 1; };
... struct mystruct_s variable_a, variable_b; ...
variable_a.Bit1 = variable_b.Bit2;
………….
|
|
|
|
|
Sep 1 2013, 06:35
|
Знающий
   
Группа: Свой
Сообщений: 922
Регистрация: 3-06-05
Из: Москва
Пользователь №: 5 709

|
Цитата Приведите весь код, а то не понятно это внутри структуры, юниона или просто чистое объявление. Это заголовок IP Код typedef struct IP_Head_v4_tag { struct { unsigned char IHL : 4; // IHL - 5 unsigned char Version : 4; // Version - 4 };
struct { unsigned char Prec : 3; // Precedence - 3 unsigned char D : 1; // Delay Normal - 0 unsigned char T : 1; // Throughput Normal - 0 unsigned char R : 1; // Relibility Normal - 0 unsigned char Res1 : 2; // Reserved - 00 };
unsigned short TotalLen; // Total Length unsigned short Identif; // Идентификатор - 0
struct { unsigned short FragOffset: 13; // Fragment Offset - 0 unsigned char MF : 1; // Fragment - 0 = Last Fragment unsigned char DF : 1; // Fragment - 1 = Don't Fragment unsigned char Res2 : 1; // Reserved - 0 }; struct { unsigned char TTL : 8; // Time to Live < 1 unsigned char Prot : 8; // Protocol }; unsigned short Checksum; // Header Checksum IPADDRESS IP_SRC_Adr; // Source Address IPADDRESS IP_DST_Adr; // Destination Address } IP_Head_v4; Со всеми перечисленными компиляторами (WINAVR, MinGW, Visual Studio) анонимные битовые поля структур работают правильно. Цитата Для анонимных структур существует #pragma anon_unions. Спасибо, проверю, а вдруг поможет. Цитата Что-то я не понимаю, как эту структуру безымянную использовать. Например так Код IP_Head_v4 IP_H; IP_H.IHL = 5;
|
|
|
|
|
Sep 4 2013, 11:47
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646

|
Цитата(pitt @ Sep 3 2013, 15:54)  Просто хочу, как бывший советский гражданин, дать несколько советов. Когда имеете дело со структурами, особенно отображающими пакеты данных, не забывайте endianness(простите не знаю как по-русски). Кроме того, советую включать файл stdint.h и использовать типы int8_t, uint16_t и тому подобное- это существенно облегчает как понимание, так и переносимость кода. По-русски это будет эндианность  А я вообще не рекомендую мапить протоколы на структуры, потому как нарвался однажды на грабельное поле, и связано это было с выравниванием.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Sep 4 2013, 20:42
|
Местный
  
Группа: Участник
Сообщений: 328
Регистрация: 1-06-06
Из: USA
Пользователь №: 17 672

|
Цитата(MrYuran @ Sep 4 2013, 07:47)  А я вообще не рекомендую мапить протоколы на структуры, потому как нарвался однажды на грабельное поле, и связано это было с выравниванием. А вот это напрасно. Если кто-то упаковывается данные, то, скорее всего, кто-то будет распаковывать. Такие вещи хорошо включать в заголовочный файл, который используется с обеих сторон. Выравнивание часто действительно может стать проблемой, но это другая тема. Особенно важно структурированность пакетов передачи и, по умолчанию, выравнивание побайтное. Подавляющее большинство компиляторов позволяют выравнивать так как надо заказчику. Методы могут быть различными.
--------------------
|
|
|
|
Сообщений в этой теме
Oleg_IT Доступ к полям структуры. Aug 30 2013, 11:41 shmur Приведите весь код, а то не понятно это внутри стр... Aug 30 2013, 11:57 psL компилятору непонятно, как вы собираетесь использо... Aug 30 2013, 12:01 SlavaG можно попробовать так:
Кодstruct {
unsigned char... Aug 30 2013, 12:17 VAI Для анонимных структур существует #pragma anon_uni... Aug 30 2013, 12:22 MrYuran Что-то я не понимаю, как эту структуру безымянную ... Aug 30 2013, 12:22 A. Fig Lee typedef struct {
unsigned char Bit1 : 1;
... Aug 30 2013, 12:29 shmur Возможно у топик стартера было что -то вроде:
Кодu... Aug 30 2013, 13:02 vassabi Может я что-то не понимаю, но как вы в битовое пол... Aug 30 2013, 14:47 A. Fig Lee Цитата(vassabi @ Aug 30 2013, 10:47) Може... Aug 30 2013, 15:10 SSerge Цитата(vassabi @ Aug 30 2013, 21:47) Може... Aug 30 2013, 16:13 Палыч Цитата(vassabi @ Aug 30 2013, 18:47) Согл... Aug 30 2013, 16:34 vassabi Цитата("SSerge")Я правильно понял, что в... Aug 30 2013, 16:18   Oleg_IT Цитата(pitt @ Sep 3 2013, 16:54) Просто х... Sep 4 2013, 11:31     aaarrr Цитата(pitt @ Sep 5 2013, 00:42) А вот эт... Sep 4 2013, 21:16     jcxz Цитата(pitt @ Sep 5 2013, 02:42) А вот эт... Sep 5 2013, 03:08    Oleg_IT Цитата(MrYuran @ Sep 4 2013, 15:47) По-ру... Sep 5 2013, 10:35     jcxz Цитата(Oleg_IT @ Sep 5 2013, 16:35) Я эту... Sep 5 2013, 11:30 Oleg_IT VAI спасибо, #pragma anon_unions помогла. Sep 2 2013, 08:56 alx.bilous И какой в этом вообще смысл?
чем это бы отличалос... Sep 4 2013, 12:32 pitt Практически каждый компилятор/процессор имеет своё... Sep 5 2013, 22:26
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|