2017-02-13 5 views
0

Я определил некоторые структуры данных, которые реализуют протокол регистрации для приложения Modbus/RS-485. Я собираю это для электронной платы с частицами.Dyanmic datatype в структуре

Как добавить различный тип данных в структуру? Я попробовал (void). Возможно ли это?

typedef struct { 
     uint16_t registerAddress; 
     uint8_t registerSize; 
     void* dataType; 
     char description[50]; 
    } _rgRegister; 

    static const _rgRegister PressureParameterRegister[6]={ 
     {0x038, 2, float, "Measured value"}, 
     {0x040, 1, ushort, "Parameter Id = 2 (pressure)"}, 
     {0x041, 1, ushort, "Units Id"}, 
     {0x042, 1, ushort, "Data Quality Id"}, 
     {0x043, 2, float, "Off line sentinel value (default = 0.0)"}, 
     {0x045, 1, char, "Available Units = 0x0005"} 
    }; 

Другой вариант я объявляю его как:

char datatype[10]; 

и передать его как:

_rgRegister.datatype = "float" 

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

+0

вы можете использовать ключевое слово 'auto' для автоматического присвоения типов данных переменным во время выполнения. –

+0

Или вы можете определить тип данных во время выполнения с помощью функции C++ 'typeid-> name()'. –

ответ

2

Как добавить различный тип данных в структуру? Я тоже попробовал. Возможно ли это?

Если тип данных ограничен, вы можете использовать enum представлять тип данных и union для представления данных.

enum DataType { DT_CHAR, DT_USHORT, DT_INT, DT_FLOAT, ..., }; 

typedef struct { 
    uint16_t registerAddress; 
    uint8_t registerSize; 
    DataType dataType; 
    union 
    { 
     char c; 
     unsigned short us; 
     int i; 
     float f; 
     ... 
    } data; 
    char description[50]; 
} _rgRegister; 

static const _rgRegister PressureParameterRegister[6]={ 
    {0x038, 2, DT_FLOAT, 0, "Measured value"}, 
    {0x040, 1, DT_USHORT, 0, "Parameter Id = 2 (pressure)"}, 
    {0x041, 1, DT_USHORT, 0, "Units Id"}, 
    {0x042, 1, DT_USHORT, 0, "Data Quality Id"}, 
    {0x043, 2, DT_FLOAT, 0, "Off line sentinel value (default = 0.0)"}, 
    {0x045, 1, DT_CHAR, 0, "Available Units = 0x0005"} 
}; 

Если у вас есть возможность использовать boost, вы можете использовать boost::any для упрощения кода.

 Смежные вопросы

  • Нет связанных вопросов^_^