(unsigned __int16 to float)和float to(unsigned __int16)typecast vs union in C ++

时间:2017-02-15 18:26:31

标签: c++ casting unions

我有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) ; 
     }
 }

您能否建议我哪种类型的上述解决方案更适合我的问题? 如果上述两种情况都不好用,请建议我更好地实施。

谢谢。

1 个答案:

答案 0 :(得分:0)

您尝试对union执行的操作称为Type Punning,并且在C ++中是未定义的行为:https://stackoverflow.com/a/11996970/2642059

因为工会经常被滥用,因为基于union类型Punning所提供的速度,所以大多数C ++编译器 支持这种行为。

简而言之,如果您打算编写符合标准的便携式,您需要使用解决方案1 ​​;但是,根据您的编译器,您可能会发现解决方案2 是编译器上更快的解决方案。