C++ 在函数中获取基元类型的指针
我有一个union(ValueDefinition),其中包含不同数据类型的指针和创建它的函数。使用字符串,它可以正常工作:C++ 在函数中获取基元类型的指针,c++,arduino,esp32,C++,Arduino,Esp32,我有一个union(ValueDefinition),其中包含不同数据类型的指针和创建它的函数。使用字符串,它可以正常工作: ValueDefinition CreateValDefString(String value){ ValueDefinition valDef = {.ValueString = new String(value)}; return valDef; } 但当我对uint8\t等执行相同操作时,它会编译,但在运行时会出现以下错误:
ValueDefinition CreateValDefString(String value){
ValueDefinition valDef = {.ValueString = new String(value)};
return valDef;
}
但当我对uint8\t等执行相同操作时,它会编译,但在运行时会出现以下错误:
[E][WString.cpp:185] changeBuffer(): realloc failed! Buffer unchanged
这是uint8的代码:
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++正在向函数投掷错误,以创建<代码> WStc> <代码>,而不是<代码> uTI8*T ,因此StAcTracle在一个完全分开的头中。在存储库中搜索arduino的源代码表明WString.cpp中存在错误,这是编译器检测到的错误 <> > GITHUB用户建议使用不同的字符串库,并且由于bug尚未修复,您可能需要更改,可能是由C++定义的标准<>代码>字符串< /C> >库,<强>不< /强> ARDUINO。正如用户在github上所说,arduino字符串是出了名的不可靠
换句话说,这个错误与您的代码无关,但我想问的问题是“为什么使用C++中的联合?”如果要定义泛型类型,只需使用模板,EX:
template<class T>
class ValueDefinition<T> {
private:
T typeDat;
public:
Valuedefinition(T t);
/* etc. */
}
但是请注意,这是未定义的行为,因为和体系结构使用不同形式的endianess。不管你在做什么,如果你使用C++,有一个更好的方法来实现你的解决方案,而不是使用联合,因为这是一个针对没有泛型类型的语言的特性。
编辑:
使用C的malloc
初始化值定义,如下所示:
union ValueDefinition *value = malloc(sizeof(union ValueDefinition));
value->ValueUInt8 = malloc(sizeof(uint8_t));
/* more code */
或使用C++的新建:
union ValueDefinition *value = new ValueDefinition();
value->ValueUInt8 = new uint8_t(/* Some number */);
/* more code */
我不是C++大师,但似乎<>代码> uTI8*T 不是一个类。嗯,你用什么来区分元素和uiNION?
union ValueDefinition *value = new ValueDefinition();
value->ValueUInt8 = new uint8_t(/* Some number */);
/* more code */