gpt4 book ai didi

c++ - 将数据 float 到 uint8_t 和 memcpy ,返回 null

转载 作者:太空狗 更新时间:2023-10-29 20:13:58 27 4
gpt4 key购买 nike

我有一个浮点变量,它需要作为 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);
}

我尝试从 uint8_t 数组取回 float 原始值并需要分配给 probe[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));

我得到的值总是 0,

请帮忙

最佳答案

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

然后当您在 GetLoopOutMessage 中传递它时,您只传递了实际的数组(两个字节),因此 float 现在丢失了它的大部分数据。

您可能想使用例如

uint8_t args[1 + sizeof(float)];

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

要解决这个问题,您要么将args 数组设置为static,使其成为全局的(真的不推荐),要么在堆上动态分配它:

uint8_t* args = new uint8_t[1 + sizeof(float)];

不要忘记删除这个指针,一旦你完成了它(即当你检索数据时)。

关于c++ - 将数据 float 到 uint8_t 和 memcpy ,返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18614451/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com