c++ - 在函数中获取原始类型的指针

标签 c++ arduino esp32

我有一个 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/

相关文章:

c++ - Qt QStatusBar 更宽的分隔符

将 const char* 转换为二元运算符+

android - 通过 USB 从 Arduino 接收数据到 Android 设备

bluetooth-lowenergy - (ESP-IDF) 通过 BLE 发送 .txt 文件(日志数据)? (从 ESP32 到 Android 手机的大文件)

c++ - 有人可以解释一下 openCV 中的 detectMultiScale

C++ 多线程互斥锁段错误

c++ - Qt 使用 isAutoRepeat() 处理 QPushButton Autorepeat() 行为

C# 串行接收限制

c - tm 结构转换为错误的 time_t

curl - 如何在 ESP32 中发布 OTA 的 bin 文件,而无需在网络服务器托管的浏览器中手动打开页面