我正在尝试解析在结构中可能包含可变数据量的返回信息。我不确定如何有效地执行此操作,我编写了一个包含每个变量作为函数的类,并且该函数通过计算适当的偏移量来返回数据,但是它不是很易于管理,必须有更好的方法。我已经阅读过关于向量的内容(对它们没有多少经验),但是当我将它们添加到结构时,它会添加额外的填充,从而将所有变量都移位。
例如:
struct info_t {
UINT32 signature;
UINT32 elements[NUM_ELEMENTS];
UINT32 options;
};
NUM_ELEMENTS是动态生成的,只有在运行时才知道,elements变量的大小必须正好为NUM_ELEMENTS,否则options变量的偏移量就会错误。
如果我可以在需要时初始化结构指针,我很高兴,但C ++不会让我在编译期间获得一个未知的NUM_ELEMENTS变量。有任何想法吗?感谢。
答案 0 :(得分:2)
C ++标准不支持可变长度数组(VLA) C ++为此提供了 std::vector 。
答案 1 :(得分:2)
通常,您将变量长度值放在最后,然后将其作为数组拉出并将其分配到vector
中。这种代码通常不在C ++中使用。
答案 2 :(得分:1)
尝试编写一个包装类,它接受数据并提供成员函数以一种干净的方式访问数据,然后查看它的速度。它可能已经足够快了。
答案 3 :(得分:0)
我认为info_t
是您要解析的数据的格式,因此您无法对其进行更改。
为什么使用包装类不可管理有什么特别的原因?这似乎是OOP有用的问题。如果您不是一个界面与info_t
兼容的类,您可以使用以下布局:
struct info_t {
UINT32 &signature;
UINT32 * const elements;
UINT32 &options;
};
然后,您必须创建一个构造函数,将字段设置为指向输入数据中的正确位置。
如果您的输入数据是作为指向UINT32s数组的指针给出的,那么构造函数可能如下所示:
info_t(UINT32 *data, size_t number_of_elements) :
signature (*data),
elements (data+1),
options (*(data+number_of_elements+1)) {}
如果您希望在data
实例超出范围时取消分配info_t
,则可以在构造函数中执行此操作。
答案 4 :(得分:0)
(代码的)图片超过千言万语:
// --> do not instantiate a static variable of these:
struct info_t_headerstruct {
UINT32 signature;
UINT32 options;
UINT32 num_elements;
// no elements !!!
};
// --> do not instantiate a static variable of these, either:
// header plus variable elements
struct info_t_struct {
info_t_headerstruct header;
UINT32 elements[65535];
};
// --> you will use this type instead:
typedef
info_t_struct* info_t_ptr;
info_t_ptr generate(size_t variableqty)
{
size_t HowManyBytes = (sizeof(info_t_headerstruct) + (sizeof UINT32 * variableqty));
info_t_ptr Result = malloc(HowManyBytes);
}
// ...
void doSomething(info_t_ptr dataptr)
{
dataptr = generate(5);
// ...
}
这些是那种情况,你可能想要摆脱“一切都是阶级/对象”的想法。我通常在C ++中使用“struct”,就像在“plain C”中一样,使用数据而不是类/对象。
如前一个答案所述。您应该将元素或变量数据移动到数据类型的页脚。
您还必须添加一个存储项目数量的字段。该类型以非常大的数量声明。项目,但是,从来没有做出真正的变量。
您将使用结构的指针,而不是结构本身。
一些[大学项目/公司]非标准版本的“pascal”或“plain C”在语法中支持这种功能。