我有3000个浮点型(4字节)变量和2000个无符号__int16(2字节)变量。这些变量存储来自plc的数据。
我有一个常量struct数组,用于存储每个plc标记的信息。
struct strPLCtags
{
unsigned short id ; //plc tag id
unsigned __int16 mbaddress ; //plc Modbus address
String name ; //plc tag name
String description ; //plc tag description
Byte datatype ; // 2 = ushort ; 4 = float
Byte plcaccess ; //Read, Write, Read/Write Tag
};
const strPLCtags plcTags[5000] = {{....},{....},.................,{....}};
我想将所有上述变量(3000 float + 2000 ushort)分组为单个数组[5000]。所以,我可以根据标记索引访问plc标记的值。
我想出了两个解决方案。但不确定哪一个是正确的。
解决方案1:声明浮点数组[5000]并根据plc标记ID访问值。
float PLCDataArray1[5000] ;
//Get PLC data and assign to array
PLCDataArray1[0] = static_cast<float>(GetU16ValueFromPLC(addr)) ;
PLCDataArray1[1] = GetFloatValueFromPLC(addr) ;
.
.
PLCDataArray1[4999] = GetFloatValueFromPLC(addr) ;
//To read back above data as String and show it on form.
String GetPLCData(unsigned short tid) //tid is plc tag id
{
if(plcTags[tid] == 2)
{
return IntToStr(PLCDataArray1[tid]) ;
}
else
{
return FloatToStrF(PLCDataArray1[tid],ffFixed,6,2) ;
}
}
解决方案2:
union uFltOrUS16
{
unsigned __int16 usVal;
float fltVal;
};
uFltOrUS16 PLCDataArray2[5000] ;
//Get PLC data and assign to array
PLCDataArray2[0].usVal = GetU16ValueFromPLC(addr) ;
PLCDataArray2[1].fltVal = GetFloatValueFromPLC(addr) ;
.
.
PLCDataArray2[4999].fltVal = GetFloatValueFromPLC(addr) ;
//To read back above data as String and show it on form.
String GetPLCData(unsigned short tid) //tid is plc tag id
{
if(plcTags[tid] == 2)
{
return IntToStr(PLCDataArray2[tid].usval) ;
}
else
{
return FloatToStrF(PLCDataArray2[tid].fltval,ffFixed,6,2) ;
}
}
您能否建议我哪种类型的上述解决方案更适合我的问题? 如果上述两种情况都不好用,请建议我更好地实施。
谢谢。
答案 0 :(得分:0)
您尝试对union
执行的操作称为Type Punning,并且在C ++中是未定义的行为:https://stackoverflow.com/a/11996970/2642059
因为工会经常被滥用,因为基于union
类型Punning所提供的速度,所以大多数C ++编译器 支持这种行为。
简而言之,如果您打算编写符合标准的便携式c++,您需要使用解决方案1 ;但是,根据您的编译器,您可能会发现解决方案2 是编译器上更快的解决方案。