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

Getting a pointer of a primitive type in a function

本文关键字:类型 指针 函数 获取      更新时间:2023-10-16

我有一个联合(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_t的代码:

ValueDefinition CreateValDefUint8(uint8_t value){
ValueDefinition valDef = {.ValueUInt8 = new uint8_t(value)};
return valDef;
}

我做错了什么?我尝试了没有"新"和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,因此堆栈跟踪位于一个完全独立的标头中。在存储库中搜索 arduino 的源代码显示 WString 中存在错误.cpp此处,这是编译器检测到的。

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

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

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

创建联合是为了让 C 可以通过让多个类型共享联合中的数据来使用泛型类型。另一个常见用途是利用使用相同内存的数据类型来查找更复杂类型的底层二进制文件,例如使用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("%dn", myLong.bits[0]); // Returns the value of the high bit of myLong

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

编辑: 使用 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 */