我有一个像这个块的C ++结构形状:
typedef struct _VisibleString
{
uint8_t size;
unsigned char text[size];
}VisibleString, *LPVisibleString;
typedef struct _Device
{
uint16_t deviceType;
uint8_t powerSupplyStatus;
VisibleString manufacturer;
VisibleString model;
VisibleString revision;
VisibleString deviceTag;
VisibleString serialNo;
}Device, *LPDevice;
uint16_t numberOfDevices;
Device devicesList[numberOfDevices];
我在考虑使文本中的内容取决于大小。但是,我一直收到错误:
error: invalid use of non-static data member
似乎我无法声明具有动态大小的文本数组。有什么方法可以解决这个问题吗?我正在尝试接收信息,并根据其大小将其分开。
答案 0 :(得分:0)
这看起来更像C代码。如果你真的在使用C ++,那么我推荐使用std::string
的C ++方式而不是尝试自己动态地执行它;让std::string
为你照顾。
除非必须,否则不要使用typedef关键字声明结构;这是旧的C方式。
struct VisibleString
{
uint8_t size;
std::string text;
};
typedef VisibleString* LPVisibleString;
事实上,您可以简单地使用文本本身,因为text.length()或text.capacity()将为您提供所需的尺寸之一。
要回答您自己的原始问题,我推荐@ Beta的方式:
struct VisibleString
{
uint8_t size;
unsigned char* text;
};
稍后,你需要分配内存,并确保自己清理:
VisibleString s;
s.size = 20;
s.text = new unsigned char[size];
try
{
...
delete[] s.text;
}
catch (...)
{
delete[] s.text;
}
答案 1 :(得分:0)
我不确定我明白你要做什么,所以我会猜测。
你有
Device devicesList[numberOfDevices];
并假设您要将数据放入manufacturer
的{{1}}字段中。你有数据:
devicesList[2]
uint8_t data_size;
unsigned char data[30];
的值为5,data_size
的前5个元素为“Zeiss”。
如果以这种方式定义结构:
data
您可以通过以下方式填写struct VisibleString
{
uint8_t size;
unsigned char *text;
};
字段:
manufacturer
当你不再需要那个字符串时,你应该释放内存:
devicesList[2].manufacturer.size = data_size;
devicesList[2].manufacturer.text = new unsigned char[data_size];
for(uint8_t k=0; k<data_size; ++k)
devicesList[2].manufacturer.text[k] = data[k];
这是简单粗暴的方式。更简洁,更复杂的方法是使用成员函数和STL容器。我们可以随时向您展示如何做到这一点。