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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Доступ к полям структуры.
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
shmur
сообщение Aug 30 2013, 11:57
Сообщение #2


Участник
*

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



Приведите весь код, а то не понятно это внутри структуры, юниона или просто чистое объявление.
Go to the top of the page
 
+Quote Post
psL
сообщение Aug 30 2013, 12:01
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 526
Регистрация: 5-08-05
Пользователь №: 7 390



компилятору непонятно, как вы собираетесь использовать эту анонимную структуру в дальнейшем.
Go to the top of the page
 
+Quote Post
SlavaG
сообщение Aug 30 2013, 12:17
Сообщение #4





Группа: Участник
Сообщений: 11
Регистрация: 14-07-06
Из: Кишинёв
Пользователь №: 18 825



можно попробовать так:
Код
struct {
  unsigned char Bit1_      : 1;
  unsigned char Bit2_      : 1;
} A1;
#define Bit1 A1.Bit1_
#define Bit2 A1.Bit2_
Go to the top of the page
 
+Quote Post
VAI
сообщение Aug 30 2013, 12:22
Сообщение #5


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



Для анонимных структур существует #pragma anon_unions.
Почитать можно в файле "....\Keil\ARM\Hlp\armcc.chm" или здесь http://www.keil.com/support/man/docs/armcc...ef_BCFBCFBF.htm
или здесь http://infocenter.arm.com/help/index.jsp?t...c/BCFBCFBF.html


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Aug 30 2013, 12:22
Сообщение #6


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

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



Что-то я не понимаю, как эту структуру безымянную использовать.
enum - другое дело.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Aug 30 2013, 12:29
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



typedef struct {
unsigned char Bit1 : 1;
unsigned char Bit2 : 1;
} tStruct;


tStruct str1;
tStruct str2;

void func1() {
str1.Bit1 = 0;
}


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
shmur
сообщение Aug 30 2013, 13:02
Сообщение #8


Участник
*

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



Возможно у топик стартера было что -то вроде:
Код
union uu {
        struct {
            unsigned char Bit1        : 1;
            unsigned char Bit2        : 1;
        };
        int v;
};

Но некоторые компиляторы не позволяют использовать безымянные структуры, возможно Кейл как раз один из таких компиляторов.
Go to the top of the page
 
+Quote Post
vassabi
сообщение Aug 30 2013, 14:47
Сообщение #9


Частый гость
**

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



Может я что-то не понимаю, но как вы в битовое поле длиной один бит хотите воткнуть char, т.е. 8 бит?
Согласно справочника по С, битовое поле может быть signed или unsigned.
Если вы хотите unsigned char, то наверное нужно хотябы длинну поля указать :8...
Go to the top of the page
 
+Quote Post
A. Fig Lee
сообщение Aug 30 2013, 15:10
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 974
Регистрация: 4-04-08
Из: далека
Пользователь №: 36 467



Цитата(vassabi @ Aug 30 2013, 10:47) *
Может я что-то не понимаю, но как вы в битовое поле длиной один бит хотите воткнуть char, т.е. 8 бит?
Согласно справочника по С, битовое поле может быть signed или unsigned.
Если вы хотите unsigned char, то наверное нужно хотябы длинну поля указать :8...

Кто хочет? Я?


--------------------
Верить нельзя никому, даже себе. Мне - можно.
Go to the top of the page
 
+Quote Post
SSerge
сообщение Aug 30 2013, 16:13
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 719
Регистрация: 13-09-05
Из: Novosibirsk
Пользователь №: 8 528



Цитата(vassabi @ Aug 30 2013, 21:47) *
Может я что-то не понимаю, но как вы в битовое поле длиной один бит хотите воткнуть char, т.е. 8 бит?
Согласно справочника по С, битовое поле может быть signed или unsigned.
Если вы хотите unsigned char, то наверное нужно хотябы длинну поля указать :8...

Я правильно понял, что в Вашей версии С невозможны поля длиной меньше 8 бит?


--------------------
Russia est omnis divisa in partes octo.
Go to the top of the page
 
+Quote Post
vassabi
сообщение Aug 30 2013, 16:18
Сообщение #12


Частый гость
**

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



Цитата("SSerge")
Я правильно понял, что в Вашей версии С невозможны поля длиной меньше 8 бит?
Не правильно. Читайте внимательно.
Go to the top of the page
 
+Quote Post
Палыч
сообщение Aug 30 2013, 16:34
Сообщение #13


Гуру
******

Группа: Свой
Сообщений: 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".
Go to the top of the page
 
+Quote Post
KnightIgor
сообщение Aug 30 2013, 18:26
Сообщение #14


Знающий
****

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


Знающий
****

Группа: Свой
Сообщений: 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

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

 


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


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