0

我有一个联合(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;
 };
4

1 回答 1

1

在您的代码中,看起来 C++ 正在向函数抛出错误以创建 aWString而不是uint8_t,因此堆栈跟踪位于完全独立的标头中。在存储库中搜索 arduino 的源代码显示 WString.cpp here中存在错误,这是编译器检测到的。

github 用户建议使用不同的字符串库,并且由于该错误尚未修复,因此您必须更改,可能是string由 C++ 定义的标准库而不是arduino。正如用户在 github 上所说,arduino 字符串是出了名的不可靠。

换句话说,这个错误与您的代码无关,但我想问的一个问题是“为什么在 C++ 中使用联合?” 如果要定义泛型类型,只需使用模板,例如:

 template<class T>

 class ValueDefinition<T> {
 private:
     T typeDat;
 public:
     Valuedefinition(T t);
     /* etc. */
 }

建立联合是为了让 C 可以通过让多个类型共享联合中的数据来使用泛型类型。另一个常见用途是利用使用相同内存的数据类型来查找更复杂类型的底层二进制文件,例如使用uint8_ta 底层的单个值long long来查找其位的值或使用 aint来获取 a 的二进制值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

但是请注意,这是未定义的行为,因为通常会填充联合,并且体系结构使用不同形式的字节序。无论您在做什么,如果您使用 C++,有一种比使用联合更好的方法来实现您的解决方案,因为这是一种用于没有通用类型以节省内存的语言的功能。

编辑:使用 C 初始化 ValueDefinition malloc,如下所示:

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 */
于 2018-08-25T16:36:24.457 回答