|
Доступ к полям структуры. |
|
|
|
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, 11:57
|
Участник

Группа: Участник
Сообщений: 55
Регистрация: 28-11-11
Пользователь №: 68 553

|
Приведите весь код, а то не понятно это внутри структуры, юниона или просто чистое объявление.
|
|
|
|
|
Aug 30 2013, 12:17
|
Группа: Участник
Сообщений: 11
Регистрация: 14-07-06
Из: Кишинёв
Пользователь №: 18 825

|
можно попробовать так: Код struct { unsigned char Bit1_ : 1; unsigned char Bit2_ : 1; } A1; #define Bit1 A1.Bit1_ #define Bit2 A1.Bit2_
|
|
|
|
|
Aug 30 2013, 13:02
|
Участник

Группа: Участник
Сообщений: 55
Регистрация: 28-11-11
Пользователь №: 68 553

|
Возможно у топик стартера было что -то вроде: Код union uu { struct { unsigned char Bit1 : 1; unsigned char Bit2 : 1; }; int v; }; Но некоторые компиляторы не позволяют использовать безымянные структуры, возможно Кейл как раз один из таких компиляторов.
|
|
|
|
|
Aug 30 2013, 16:18
|

Частый гость
 
Группа: Свой
Сообщений: 156
Регистрация: 18-02-13
Из: Киев
Пользователь №: 75 678

|
Цитата("SSerge") Я правильно понял, что в Вашей версии С невозможны поля длиной меньше 8 бит? Не правильно. Читайте внимательно.
|
|
|
|
|
Aug 30 2013, 16:34
|

Гуру
     
Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954

|
Цитата(vassabi @ Aug 30 2013, 18:47)  Согласно справочника по С, битовое поле может быть signed или unsigned. Согласно стандарта: Цитата A bit-field shall have a type that is a qualified or unqualified version of _Bool, signed int, unsigned int, or some other implementation-defined type. Транслятор Keil в данном случае считает тип signed/unsigned char как "other implementation-defined type".
|
|
|
|
|
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;
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|