将4个整数的结构转换为浮点数

时间:2018-08-14 12:12:04

标签: pointers type-conversion stm32 iar

我是编程新手,在指针和类型转换方面不强,所以我需要一些帮助。

我正在使用IAR Workbench和STM32L475。 从Eeprom加载结构后,我试图将结构中的4个字节转换为浮点数。

我知道Big / Little Endian以及将代码可移植到其他微型计算机方面可能会遇到挑战,但是请不要用这种方式使该线程混乱,因为这对我而言现在并不重要。

我做错了,谢谢您的帮助?

请保持简单,并解释“针对假人”。

我收到pe513错误。

我的代码:

struct Test {
    uint8_t Byte1;
    uint8_t Byte2;
    uint8_t Byte3;
    uint8_t Byte4;
} TestStruct;

float x = 0.0;

uint8_t *TestStruct_ptr;

int main(void)
{
    /* USER CODE BEGIN 1 */
    TestStruct.Byte1 = 0x41; //float value = 23.10
    TestStruct.Byte2 = 0xB8;
    TestStruct.Byte3 = 0xCC;
    TestStruct.Byte4 = 0xCD;  

    TestStruct_ptr = (float*)&TestStruct;

    x = (float*) TestStruct_ptr;

    // some code



    return 0;
}

编辑: 我正在从Eeprom加载数组,并且必须将四个uint8字节的数组“收集”到浮点数,它们在保存到Eeprom之前是结构的一部分。 明天上班时,我将更新确切的错误消息。

我最终使用了“ union”,因为这似乎是最好的解决方案。

我的示例代码现在看起来像这样:

union Eeprom {
  struct {
    uint8_t Byte1;
    uint8_t Byte2;
    uint8_t Byte3;
    uint8_t Byte4;
  };
  float x;
  uint8_t Array[4];
};


int main(void)
{

  union Eeprom Test;

  //assign values to individual bytes
  Test.Byte1=0xCD; 
  Test.Byte2=0xCC;
  Test.Byte3=0xB8;
  Test.Byte4=0x41;

  //Assign values as an array (here individual bytes, overwrites above assigned values).
  //Data will be formatted as an array when loaded from E2prom.
  Test.Array[0]=0xCD;  
  Test.Array[1]=0xCC;
  Test.Array[2]=0xB8;
  Test.Array[3]=0x41;

  //Assign value as floating point value (overwrites the above assigned values)
  Test.x = 23.1;  

  printf("FPvalue %3.2f \n Byte1 %x\n Byte2 %x\n Byte3 %x\n Byte4 %x\n 
    Array[0] %x\n Array[1] %x\n Array[2] %x\n Array[3] %x\n",
    Test.x, Test.Byte1, Test.Byte2, Test.Byte3, Test.Byte4, 
    Test.Array[0], Test.Array[1], Test.Array[2], Test.Array[3]);
}

输出看起来像这样:

floatvalue 23.10 
Byte1 cd
Byte2 cc
Byte3 b8
Byte4 41
Array[0] cd
Array[1] cc
Array[2] b8
Array[3] 41

4 个答案:

答案 0 :(得分:7)

联合会做。

typedef union
{
    uint32_t u32;
    uint16_t u16[2];
    uint8_t  u8[4];
    float    f;
}b32data;

当您从NV存储器中读取时,只需分配正确的成员而没有任何指针。

答案 1 :(得分:5)

您可以使用联合:

typedef union
{
    struct
    {
        uint8_t Byte1;
        uint8_t Byte2;
        uint8_t Byte3;
        uint8_t Byte4;
     };
     float      floatvalue;
}TestT;

TestT   Test;

Test.floatvalue = ......    //complete float
Test.Byte1 = .....          //single Byte to save in EEPROM

答案 2 :(得分:4)

由于您不关心可移植性或字节序问题,因此可以简单地使用memcpy复制字节:

memcpy(&x, &TestStruct, sizeof x);

您可能在某处看到了此选项或类似选项:

x = *(float*)&TestStruct;  // BAD!!!!! dereferencing using wrong pointer type

请勿执行此操作!。这会破坏严格的别名规则,即未定义的行为

答案 3 :(得分:0)

以这种方式键入pun是非法的。正如其他人提到的,联合可以用于进行类型修剪。另外,由于意图是要提供一个可通过字节访问的浮点数,因此将 打入char类型是合法的。因此,与其将变量的类型声明为4个char的结构,不如将其声明为float,然后将其键入到unsigned char并将其作为数组访问:

float x = 0.0;

unsigned char *test_ptr = (unsigned char *)&x;

int main(void)
{
    /* USER CODE BEGIN 1 */
    test_ptr[0] = 0x41; //float value = 23.10
    test_ptr[1] = 0xB8;
    test_ptr[2] = 0xCC;
    test_ptr[3] = 0xCD;  

    // some code

    return 0;
}

当然,字节的顺序将取决于字节序。我保留了字节顺序,这对于大端目标应该是正确的。