将数据浮动到uint8_t和memcpy,返回null

use*_*930 3 c c++ floating-point

我有一个float变量,需要作为uint8_t传递给函数.

如何转换回浮动原始值.

码:

bool SetAnalog(uint8_t number, float voltage, MessagePriority priority, Callback clbck)
{
    uint8_t args[2];
    args[0] = number;
    memcpy(&(args[1]),&voltage,sizeof(float));

    PTCLoopOutMessage* message = parent()->GetLoopOutMessage(this,
                                                             this->address(),
                                                             _OutputVoltage,
                                                             "DACVoltage",
                                                             args,
                                                             sizeof(args),
                                                             Device,
                                                             priority);
    message->SetCallback(clbck);

    return ProcessOutMessage(message);
}
Run Code Online (Sandbox Code Playgroud)

我试图从uint8_t数组中取回浮点原始值并需要分配到探测[channel]

uint8_t channel = message->GetOutMessage()->GetData()->data[0];
unsigned char* value = &message->GetOutMessage()->GetData()->data[1];
memcpy(&__output.output.probe[channel].dac, value, sizeof(float));
Run Code Online (Sandbox Code Playgroud)

我总是得到0的价值,

请帮忙

Som*_*ude 7

您的代码中有未定义的行为.A float通常是四个字节长,uint8_t而是一个字节.所以你用至少三个字节覆盖你的数组.

然后当你传递它时,GetLoopOutMessage你只传递实际的数组(这是两个字节),所以浮点数现在缺少它的大部分数据.

你可能想用eg

uint8_t args[1 + sizeof(float)];
Run Code Online (Sandbox Code Playgroud)

如果GetLoopOutMessage不复制传递给它的数据,那么你有另一种未定义行为的情况,即传递指向局部变量的指针.当SetAnalog函数返回时,存储局部变量的内存空间将被下一个函数调用重用.这意味着该args数组不再存在于内存中,而以前它可能存在其他数据.

要解决这个问题,您应该创建args数组static,使其成为全局(实际上不推荐)或在堆上动态分配它:

uint8_t* args = new uint8_t[1 + sizeof(float)];
Run Code Online (Sandbox Code Playgroud)

delete完成后(即检索数据时)不要忘记此指针.