Можно ли создать «пустые» члены в структуре в C? - PullRequest
1 голос
/ 26 апреля 2019

Я пытаюсь создать несколько массивоподобных структур для обработки данных и адресов MODBUS.

Я делаю это внутри структуры, поэтому позже будет проще установить определенные значения, а не ссылаться на таблицу данных, чтобы узнать, какой адрес связан с данными.

Некоторые адреса оставлены пустымии зарезервированы для будущего использования (я знаю, что это не указано в стандарте MODBUS, данные не должны быть точно привязаны к MODBUS).

Я создал структуру, которая компилируется в программном обеспечении длявстроенное устройство, на котором оно должно работать.Однако я не был уверен, что все будет работать так, как я себе представлял, поэтому я запустил некоторый тестовый код на 2 разных компиляторах.Я являюсь онлайн-компилятором, который работает так, как я ожидал, с одним предупреждением в зарезервированном байте.Второе запускается в консольном приложении visual studio c ++, которое не запускается, поскольку выдает ошибку:

Ошибка C2208 «unsigned short»: нет членов, определенных с использованием этого типа

Thisэто полный код, который должен выполняться:

#include <stdio.h>
#include <stdint.h>
#define U16 uint16_t
#define UI  unsigned int
struct t {
    U16 t1;
    union {
        struct {
            UI b_f1 : 2;
            UI b_f2 : 2;
            UI b_f3 : 2;
            UI b_f4 : 2;
            UI b_f5 : 2;
            UI b_f6 : 2;
            UI b_f7 : 2;
            UI b_f8 : 2;
        }f;
        U16 c;
    }t2;
    U16; //Reserved space for later use <- this gives me the compiler error
    U16 t3;
}test;

int main()
{
    test.t3 = 12;
    test.t2.f.b_f1 = 0; //0
    test.t2.f.b_f2 = 2; //4 (8)
    test.t2.f.b_f3 = 0; //16
    test.t2.f.b_f4 = 0; //64
    test.t2.f.b_f5 = 0; //256
    test.t2.f.b_f6 = 0; //1024
    test.t2.f.b_f7 = 2; //4096 (8192)
    test.t2.f.b_f8 = 0; //16384
    //tot: 8200    
    test.t1 = 3000;
    int h; //test variable
    for (int i = 0; i < (sizeof(test) / sizeof(U16)); i++) {
        h = *(&test.t1 + (i*sizeof(U16));

        printf("%d", h); //here I can now send every MODBUS address & data
    }

    return 0;
}

Установка переменных не требуется, это просто для целей тестирования

Я ожидал, что это просто сгенерирует структуру из 4 элементов, один из которыхуказатель 0, так что адресация правильная, так что адрес 3 не используется, и поэтому 0, в то время как адрес 4 (t3) будет содержать больше данных.

Есть ли способ выполнить эту работу, которую я планировал сделатьделать, или я должен просто создать некоторые переменные между ними под названием Reserved1..Reserverd2..etc?

Ответы [ 3 ]

3 голосов
/ 26 апреля 2019

«Декларация» типа

U16; //Reserved space for later use

просто недействительно.

Просто используйте какое-нибудь фиктивное имя для решения вашей проблемы, например,

U16 _reserved_; //Reserved space for later use
2 голосов
/ 26 апреля 2019

Нет, ты не можешь.Сам по себе тип не является допустимым объявлением в определении структуры.

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

#define _concat(a,b) a##b
#define concat(a,b) _concat(a,b)

и напишите

U16 concat(t, __LINE__);

, что является уникальным, поскольку struct имя t уникально.

1 голос
/ 26 апреля 2019

Есть ли способ сделать эту работу, которую я планировал сделать?

номер

или я должен просто создать некоторые переменные между ними под названием Reserved1..Reserverd2..etc

Да.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...