2017-02-13 82 views
0

我已經定義了一些實現Modbus/RS-485應用程序的寄存器協議的數據結構。我正在編譯一個粒子電子板。結構中的Dyanmic數據類型

如何向結構添加不同的數據類型?我也試過(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

如何向結構添加變化的數據類型?我也嘗試過(void)。這甚至有可能嗎?

如果數據類型有限,可以使用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簡化代碼。