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

 
 
> Доступ к полям структуры.
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
pitt
сообщение Sep 4 2013, 20:42
Сообщение #6


Местный
***

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



Цитата(MrYuran @ Sep 4 2013, 07:47) *
А я вообще не рекомендую мапить протоколы на структуры, потому как нарвался однажды на грабельное поле, и связано это было с выравниванием.

А вот это напрасно. Если кто-то упаковывается данные, то, скорее всего, кто-то будет распаковывать. Такие вещи хорошо включать в заголовочный файл, который используется с обеих сторон.
Выравнивание часто действительно может стать проблемой, но это другая тема. Особенно важно структурированность пакетов передачи и, по умолчанию, выравнивание побайтное. Подавляющее большинство компиляторов позволяют выравнивать так как надо заказчику. Методы могут быть различными.


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


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(pitt @ Sep 5 2013, 02:42) *
А вот это напрасно. Если кто-то упаковывается данные, то, скорее всего, кто-то будет распаковывать. Такие вещи хорошо включать в заголовочный файл, который используется с обеих сторон.
Выравнивание часто действительно может стать проблемой, но это другая тема. Особенно важно структурированность пакетов передачи и, по умолчанию, выравнивание побайтное. Подавляющее большинство компиляторов позволяют выравнивать так как надо заказчику. Методы могут быть различными.

Можно и методы сделать одинаковыми для C++. Я делаю так:
CODE
struct u16p8 {
u8 bytes[2];
operator u16() const { return u16load(&bytes); }
u16p8 & operator =(u32 val) { u16save(&bytes, val); return *this; }
};
struct u32p8 {
u8 bytes[4];
operator u32() const { return u32load(&bytes); }
u32p8 & operator =(u32 val) { u32save(&bytes, val); return *this; }
};

где: u16load(), u16save(), u32load(), u32save() - макросы, определённые по-разному в соответствии с платформой.
Если для Cortex-M3 и x86 к примеру u16load() будет:
#define u16load(p) (*(u16 *)p)
то для ARM7/9:
#define u16load(p) (*(u8 *)(p) | (u16)((u8 *)(p))[1] << 8)
Таким образом я совершенно свободно перетаскиваю структуры, описывающие пакованные структуры, между разными платформами.
Это очень полезно когда пишешь firmware и тут же пишешь клиентское ПО на PC (для этого устройства) и надо описать протокол взаимодействия - это можно делать в одном файле просто копируя его между двумя проектами.
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
||- - aaarrr   Цитата(pitt @ Sep 5 2013, 00:42) А вот эт...   Sep 4 2013, 21:16
|- - 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 Текстовая версия Сейчас: 30th July 2025 - 00:05
Рейтинг@Mail.ru


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