实现指向可变大小结构的指针

时间:2011-07-16 15:50:02

标签: c++ variables data-structures

我正在尝试解析在结构中可能包含可变数据量的返回信息。我不确定如何有效地执行此操作,我编写了一个包含每个变量作为函数的类,并且该函数通过计算适当的偏移量来返回数据,但是它不是很易于管理,必须有更好的方法。我已经阅读过关于向量的内容(对它们没有多少经验),但是当我将它们添加到结构时,它会添加额外的填充,从而将所有变量都移位。

例如:

struct info_t {
   UINT32 signature;
   UINT32 elements[NUM_ELEMENTS];
   UINT32 options;
};

NUM_ELEMENTS是动态生成的,只有在运行时才知道,elements变量的大小必须正好为NUM_ELEMENTS,否则options变量的偏移量就会错误。

如果我可以在需要时初始化结构指针,我很高兴,但C ++不会让我在编译期间获得一个未知的NUM_ELEMENTS变量。有任何想法吗?感谢。

5 个答案:

答案 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”在语法中支持这种功能。