- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在为 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 上所做的事情。
我发现如果我删除 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/
“过载”/“过载”在编程方面是什么意思? 最佳答案 这意味着您提供了一个具有相同名称但具有不同签名的函数(方法或运算符)。 例如: void doSomething(); int doSomethin
Kotlin 是允许我们轻松定义各种预定义运算符行为的语言之一,该操作名为运算符重载 - https://kotlinlang.org/docs/reference/operator-overload
所以我正在尝试实现 xorshift PRNG 作为来自 random 的参数化 STL 样式类,例如std::mersenne_twister_engine , 所以我可以将它与来自 random
请给我一个具体的答案,为什么函数覆盖会隐藏基类中重载的函数。 class Base{ public: fun(int,int); fun(B); }; class Derived:public
假设我在 Alloy 4.2 中有以下签名声明: sig Target {} abstract sig A { parent: lone A, r: some Target } sig
我正在对API进行建模,其中方法重载将是一个很好的选择。我的幼稚尝试失败了: // fn attempt_1(_x: i32) {} // fn attempt_1(_x: f32) {} // Er
在方法重载中,重载方法是否可以有不同的返回类型? 例如, void foo(int x) ; int foo(int x,int y); double foo(String str); 在一般的面向对
这个问题已经有答案了: Why is implicit conversion from int to Long not possible? (3 个回答) 已关闭 5 年前。 使用包装类重载方法 vo
我正在为一个 API 建模,其中方法重载非常适合。我天真的尝试失败了: // fn attempt_1(_x: i32) {} // fn attempt_1(_x: f32) {} // Error
我正在为一个 API 建模,其中方法重载非常适合。我天真的尝试失败了: // fn attempt_1(_x: i32) {} // fn attempt_1(_x: f32) {} // Error
1、方法的重载 方法名一样,但参数不一样,这就是重载(overload)。 所谓的参数不一样,主要有两点:第一是参数的个数不一样,第二是参数的类型不一样。只要这两方面有其中的一
我正在设计我自己的编程语言(称为 Lima,如果你在 www.btetrud.com 上关心它),我正在努力思考如何实现运算符重载。我决定在特定对象上绑定(bind)运算符(它是一种基于原型(prot
我正在尝试将运算符用于 Wicket,这非常冗长。 我最想要的功能是使用一元“+”到add()一个组件。 但它需要在每个 MarkupContainer 的上下文中工作。后人。 使用应该是这样的: c
运算符重载如何与函数重载相关联。我的意思是我不太明白如何使用自身已重载的函数来重载运算符。 最佳答案 Operator 只是给中缀函数(写在参数之间的函数)的时髦名称。所以,1 + 2 只是一个 +(
是否有可能过载 __cinit__或 __add__ ? 像这样的东西: cdef class Vector(Base): cdef double x, y, z def __cini
我开始使用 smalltalk,我正在尝试添加一个新的赋值运算符 :> . pharo 中使用的当前运算符不是选择器,所以我开始查看下划线 _ 的类 Scanner可以为分配启用。我试图以类似的方式做
假设我有以下类(class): class A { has $.val; method Str { $!val ~ 'µ' } } # Is this the right way
我试图像这样重载>>运算符: class A {} multi sub infix:«>>»(A:D $a, Str() $b) is assoc { dd $a; dd $b } my $x = A
在 C++ 中,您可以创建使用特定运算符的模板类 模板化对象和实例化这些对象的类 必须重载该特定运算符才能使其对象与 模板类。例如,insertion BST实现的方法 可能依赖 Nil ) {
有时,我在未重载的方法后面有“overload”关键字。 除了代码的可读性和可维护性之外,这还有我应该注意的其他影响吗? 最佳答案 最大的区别在于,当方法的参数不正确时,错误消息对于非重载方法来说明显
我是一名优秀的程序员,十分优秀!