реклама на сайте
подробности

 
 
> Доступ к полям структуры.
Oleg_IT
сообщение Aug 30 2013, 11:41
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 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. Может быть это стандарт С++, не проверял и всех тонкостей языка не знаю. Можно какими-нибудь флажками убрать эту особенность?
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
KnightIgor
сообщение Aug 30 2013, 18:26
Сообщение #2


Знающий
****

Группа: Участник
Сообщений: 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;

………….

Go to the top of the page
 
+Quote Post
Oleg_IT
сообщение Sep 1 2013, 06:35
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 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;
Go to the top of the page
 
+Quote Post
pitt
сообщение Sep 3 2013, 12:54
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 1-06-06
Из: USA
Пользователь №: 17 672



Просто хочу, как бывший советский гражданин, дать несколько советов.
Когда имеете дело со структурами, особенно отображающими пакеты данных, не забывайте endianness(простите не знаю как по-русски). Кроме того, советую включать файл stdint.h и использовать типы int8_t, uint16_t и тому подобное- это существенно облегчает как понимание, так и переносимость кода.



--------------------
Прокричал немой глухому:"...Спасибо за внимание!"
http://www.youtube.com/watch?v=3Nnj4ky4Z_g
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 4 2013, 11:47
Сообщение #5


Беспросветный оптимист
******

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



Цитата(pitt @ Sep 3 2013, 15:54) *
Просто хочу, как бывший советский гражданин, дать несколько советов.
Когда имеете дело со структурами, особенно отображающими пакеты данных, не забывайте endianness(простите не знаю как по-русски). Кроме того, советую включать файл stdint.h и использовать типы int8_t, uint16_t и тому подобное- это существенно облегчает как понимание, так и переносимость кода.

По-русски это будет эндианность sm.gif
А я вообще не рекомендую мапить протоколы на структуры, потому как нарвался однажды на грабельное поле, и связано это было с выравниванием.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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
|- - pitt   Цитата(MrYuran @ Sep 4 2013, 07:47) А я в...   Sep 4 2013, 20:42
||- - 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


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th July 2025 - 06:56
Рейтинг@Mail.ru


Страница сгенерированна за 0.01496 секунд с 7
ELECTRONIX ©2004-2016