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的价值,
请帮忙
您的代码中有未定义的行为.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完成后(即检索数据时)不要忘记此指针.