获取函数中基元类型的指针
Getting a pointer of a primitive type in a function
我有一个联合(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 */
- 非类型指针和引用模板参数,以及在编译时如何/为什么解析它们.c++
- 如何访问在 c++ 中在类内声明的结构类型指针变量?
- (C )找到基本类型指针的儿童类型
- 表达式必须具有指向对象的指针类型(指针向量)
- 将子项复制构造到父类型指针中
- C 返回类型指针声明
- 调用虚拟函数而不通过类类型指针创建任何对象
- C++ 如何使用类类型指针制作向量
- 为什么基类型指针不能获取派生类对象的地址值?
- 如何在 C++ 中获取映射类型指针,映射
- 如何检查该类型的类型指针是正确对齐的
- 正在转换为短类型指针
- 指向任意类方法的模板非类型指针
- 如何通过强制转换类型指针将字符数组转换为uint16_t
- 指向shared_ptr的不透明类型 C 指针
- C++:从值类型指针强制转换为包含迭代器
- C/C++:访问给定类型指针的位置与访问另一类型指针的相同位置不同
- 比较类型指针
- 数据类型指针使用*(Datatype *)
- 如何打印c++中char类型指针的所有值