Перейти к содержанию
    

Доступ к полям структуры.

Переношу код из 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. Может быть это стандарт С++, не проверял и всех тонкостей языка не знаю. Можно какими-нибудь флажками убрать эту особенность?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приведите весь код, а то не понятно это внутри структуры, юниона или просто чистое объявление.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

можно попробовать так:

struct {
  unsigned char Bit1_      : 1;
  unsigned char Bit2_      : 1;
} A1;
#define Bit1 A1.Bit1_
#define Bit2 A1.Bit2_

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для анонимных структур существует #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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

enum - другое дело.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

typedef struct {

unsigned char Bit1 : 1;

unsigned char Bit2 : 1;

} tStruct;

 

 

tStruct str1;

tStruct str2;

 

void func1() {

str1.Bit1 = 0;

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно у топик стартера было что -то вроде:

union uu {
        struct {
            unsigned char Bit1        : 1;
            unsigned char Bit2        : 1;
        };
        int v;
};

Но некоторые компиляторы не позволяют использовать безымянные структуры, возможно Кейл как раз один из таких компиляторов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может я что-то не понимаю, но как вы в битовое поле длиной один бит хотите воткнуть char, т.е. 8 бит?

Согласно справочника по С, битовое поле может быть signed или unsigned.

Если вы хотите unsigned char, то наверное нужно хотябы длинну поля указать :8...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может я что-то не понимаю, но как вы в битовое поле длиной один бит хотите воткнуть char, т.е. 8 бит?

Согласно справочника по С, битовое поле может быть signed или unsigned.

Если вы хотите unsigned char, то наверное нужно хотябы длинну поля указать :8...

Кто хочет? Я?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может я что-то не понимаю, но как вы в битовое поле длиной один бит хотите воткнуть char, т.е. 8 бит?

Согласно справочника по С, битовое поле может быть signed или unsigned.

Если вы хотите unsigned char, то наверное нужно хотябы длинну поля указать :8...

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Согласно справочника по С, битовое поле может быть 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".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Компилятор выдаёт предупреждение на объявление, на стоку с "};"

 

………
        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;

………….

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Приведите весь код, а то не понятно это внутри структуры, юниона или просто чистое объявление.

Это заголовок 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;

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...