Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 在函数中获取基元类型的指针_C++_Arduino_Esp32 - Fatal编程技术网

C++ 在函数中获取基元类型的指针

C++ 在函数中获取基元类型的指针,c++,arduino,esp32,C++,Arduino,Esp32,我有一个union(ValueDefinition),其中包含不同数据类型的指针和创建它的函数。使用字符串,它可以正常工作: ValueDefinition CreateValDefString(String value){ ValueDefinition valDef = {.ValueString = new String(value)}; return valDef; } 但当我对uint8\t等执行相同操作时,它会编译,但在运行时会出现以下错误:

我有一个union(ValueDefinition),其中包含不同数据类型的指针和创建它的函数。使用字符串,它可以正常工作:

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 */