繁体   English   中英

(无符号__int16浮动)并浮动到(无符号__int16)Typecast vs Union in C ++

[英](unsigned __int16 to float) and float to (unsigned __int16) typecast vs union in C++

我有3000个浮动类型(4个字节)变量和2000个无符号__int16(2个字节)变量。 这些变量存储来自plc的数据。

我有一个常量结构数组,用于存储每个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:声明float array [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) ; 
     }
 }

您能否建议我哪种类型的上述解决方案更适合我的问题? 如果以上两种方法都不好用,请给我建议一个更好的想法。

谢谢。

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

因为工会经常被滥用,因为提供的速度union根据类型双关所以大多数C ++编译器支持这样的行为。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM