gpt4 book ai didi

C++ union 函数,Arduino 编译器错误 "cannot be overloaded"

转载 作者:行者123 更新时间:2023-12-02 10:57:46 25 4
gpt4 key购买 nike

我正在为 Arduino 编写一个库,现在我正忙于将字节顺序错误的字节数组转换为浮点数 uint32 oruint16。

我得到了工作代码,我使用 memcpy 将一个为正确字节顺序反转的数组复制到浮点数的内存中,但现在我发现 union { uint8_t bytes[4]; float result; } 是一种快速有效的方法来做同样的事情,但使用更少的资源。

我制作的概念在我的 PC 上运行(Windows 10 上使用 cygwin 的 C++14),但它不会在我的 Arduino 的 Arduino IDE 中编译,因为 'float Converter::ToFloat(uint8_t*)' cannot be overloaded 我不知道编译器从哪里得到我的想法重载任何东西。

union Converter {
float ToFloat(uint8_t data[]) {
inValue[0] = data[3];
inValue[1] = data[2];
inValue[2] = data[1];
inValue[3] = data[0];
return floatOutValue;
};
uint32_t ToUint32(uint8_t data[]) {
inValue[0] = data[3];
inValue[1] = data[2];
inValue[2] = data[1];
inValue[3] = data[0];
return uint32OutValue;
};
uint32_t ToUint16(uint8_t data[]) {
inValue[0] = data[1];
inValue[1] = data[0];
return uint16OutValue;
};
private:
uint8_t inValue[4];
float floatOutValue;
uint32_t uint32OutValue;
uint16_t uint16OutValue;
};

void setup() {
uint8_t t1[4] = {0x0A, 0xC3, 0x53, 0x48}; //180573000
Converter converter;
Serial.println(converter.ToUint32(t1));
uint8_t t2[2] = {0x07, 0xE3}; //2019
Serial.println(converter.ToUint16(t2));
uint8_t t3 = 0x05; //5
Serial.println(t3 * 1);
uint8_t t4[9][4] = {
{0x3F, 0x7F, 0xCC, 0x8C}, //0.99921
{0x3D, 0x21, 0x43, 0x00}, //0.039371
{0x3B, 0x92, 0x07, 0xDF}, //0.0044565
{0xBD, 0x21, 0xBE, 0x6E}, //-0.039488
{0x3F, 0x7F, 0xAE, 0x7E}, //0.99876
{0x3C, 0xF9, 0x64, 0x38}, //0.030443
{0xBB, 0x55, 0x26, 0x18}, //-0.0032524
{0xBC, 0xFA, 0xA3, 0x24}, //-0.030595
{0x3F, 0x7F, 0xE0, 0xFC}, //0.99953
};
for (int i = 0; i < 9; i++) {
Serial.println(converter.ToFloat(t4[i]));
}
}

那么,为什么这段代码不能为 Arduino 编译,而是在 Windows 10 上以正确的输出完美运行?
编译器错误的真正含义是什么?

最佳答案

解决方案:如果它不起作用,请不要尝试做我在 arduino 上所做的事情。

我发现如果我删除 union 中的所有函数,除了一个之外,如果该函数具有参数列表(uint8_t data []),它将编译,但当我将任何第二个参数添加到参数列表时不会编译,我不知道为什么。

我遇到的许多不同问题似乎都没有记录,因此我将放弃 union 功能,并采用简单但不太优雅的解决方案,将功能置于 union 之外并将 union 成员定义为公共(public),如下所示:

static union {
float floatValue;
uint32_t uint32Value;
uint16_t uint16Value;
uint8_t inValue[4];
};

float bytesToFloat(uint8_t data[]){
inValue[ 0 ] = data[ 3 ];
inValue[ 1 ] = data[ 2 ];
inValue[ 2 ] = data[ 1 ];
inValue[ 3 ] = data[ 0 ];
return floatValue;
}
uint32_t bytesToUint32(uint8_t data[]){
inValue[ 0 ] = data[ 3 ];
inValue[ 1 ] = data[ 2 ];
inValue[ 2 ] = data[ 1 ];
inValue[ 3 ] = data[ 0 ];
return uint32Value;
}
uint16_t bytesToUint16(uint8_t data[]){
inValue[ 0 ] = data[ 1 ];
inValue[ 1 ] = data[ 0 ];
return uint16Value;
}

void setup() {
uint8_t t1[4] = {0x0A, 0xC3, 0x53, 0x48}; //180573000
cout << bytesToUint32(t1) << endl;
uint8_t t2[2] = {0x07, 0xE3}; //2019
cout << bytesToUint16(t2) << endl;
uint8_t t3 = 0x05; //5
cout << t3 * 1 << endl;
cout.precision(5);
uint8_t t4[9][4] = {
{0x3F, 0x7F, 0xCC, 0x8C}, //0.99921
{0x3D, 0x21, 0x43, 0x00}, //0.039371
{0x3B, 0x92, 0x07, 0xDF}, //0.0044565
{0xBD, 0x21, 0xBE, 0x6E}, //-0.039488
{0x3F, 0x7F, 0xAE, 0x7E}, //0.99876
{0x3C, 0xF9, 0x64, 0x38}, //0.030443
{0xBB, 0x55, 0x26, 0x18}, //-0.0032524
{0xBC, 0xFA, 0xA3, 0x24}, //-0.030595
{0x3F, 0x7F, 0xE0, 0xFC}, //0.99953
};
for (int i = 0; i < 9; i++) {
cout << bytesToFloat(t4[ i ]) << endl;
}
}

关于C++ union 函数,Arduino 编译器错误 "cannot be overloaded",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56042093/

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