我有一个 union (ValueDefinition),其中包含不同数据类型的指针和创建它的函数。使用 String 效果很好:
ValueDefinition CreateValDefString(String value){
ValueDefinition valDef = {.ValueString = new String(value)};
return valDef;
}
但是当我对例如uint8_t 它编译,但在运行时我得到这个错误:
[E][WString.cpp:185] changeBuffer(): realloc failed! Buffer unchanged
这是 uint8_t 的代码:
ValueDefinition CreateValDefUint8(uint8_t value){
ValueDefinition valDef = {.ValueUInt8 = new uint8_t(value)};
return valDef;
}
我做错了什么?我在没有“new”和 malloc 的情况下尝试了它,但我仍然遇到同样的错误。
编辑:根据要求,ValueDefinition 的定义:
union ValueDefinition{
bool* ValueBool;
int8_t* ValueInt8;
int16_t* ValueInt16;
int32_t* ValueInt32;
uint8_t* ValueUInt8;
uint16_t* ValueUInt16;
uint32_t* ValueUInt32;
float* ValueFloat;
ulong* ValueULong;
String* ValueString;
};
最佳答案
在您的代码中,看起来 C++ 向函数抛出错误以创建 WString
而不是 uint8_t
,因此堆栈跟踪位于完全独立的 header 中。在 arduino 的存储库中搜索源代码显示 WString.cpp 中存在错误 here ,这是您的编译器正在检测的内容。
github 用户建议使用不同的字符串库,由于错误尚未修复,您将不得不更改,可能是 C++ 定义的标准 string
库,不是阿杜伊诺。正如用户在 github 上所说,arduino 字符串是出了名的不可靠。
换句话说,这个错误与你的代码无关,但我想问的一个问题是“为什么在C++中使用 union ?”如果你想定义一个通用类型,只需使用模板,例如:
template<class T>
class ValueDefinition<T> {
private:
T typeDat;
public:
Valuedefinition(T t);
/* etc. */
}
创建 union 是为了让 C 可以通过让多个类型共享 union 中的数据来使用泛型类型。另一个常见用途是利用使用相同内存的数据类型来查找更复杂类型的底层二进制文件,例如使用 long long
下的单个 uint8_t
值来查找其位的值或使用 int
获取 float
的二进制值,例如:
union foo {
uint8_t bits[4]; /* Represent the bits of 'data' */
long long int data;
}
union foo myLong = {.data = 12378591249169278l};
printf("%d\n", myLong.bits[0]); // Returns the value of the high bit of myLong
但是请注意,这是未定义的行为,因为unions are usually padded和体系结构使用不同形式的字节顺序。无论您在做什么,如果您使用的是 C++,那么有一种比使用 union 更好的方法来实现您的解决方案,因为这是一种针对没有通用类型的语言的功能 in order to save memory .
编辑:
使用 C 的 malloc
初始化 ValueDefinition,如下所示:
union ValueDefinition *value = malloc(sizeof(union ValueDefinition));
value->ValueUInt8 = malloc(sizeof(uint8_t));
/* more code */
或者使用 C++ 的 new
:
union ValueDefinition *value = new ValueDefinition();
value->ValueUInt8 = new uint8_t(/* Some number */);
/* more code */
关于c++ - 在函数中获取原始类型的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52017080/