我已经定义了一些实现Modbus / RS-485应用程序注册协议的数据结构。我正在为粒子电子板编译这个。
如何向结构中添加不同的数据类型?我也尝试了(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"
我必须有一些switch语句,它可以动态地将数据类型转换为数据。
答案 0 :(得分: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
来简化代码。