0

假设我有一个这样的结构:

struct someDataType
{
    boost::multi_array<int,3> data;
};

然后如何初始化数组?我已经尝试过了,但它似乎不起作用:

someDataType container;
container.data=boost::multi_array<int,3>(boost::extents[5][5][5]);

程序在运行时使用该代码崩溃;当编译为调试时,它会assertion failed从 Boost 代码中的某处抛出一个。

任何帮助都感激不尽 :)

编辑:我刚刚意识到我写错了那段代码。我的意思是,我在程序中是正确的,但是当我将它复制到 SO 时,我对其进行了概括并犯了一个错误。现在修好了。

4

2 回答 2

4

首先,您对 someDataType 的声明仅指定您的 multi_array 有多少维,而不是范围。

您必须在处理 container.data 之前设置范围,以便 Boost 可以为其分配内存。最简单的方法是使用“resize”:

  container.data.resize(boost::extents[5][5][5]);

您还可以将构造函数添加到 someDataType 并在那里设置范围:

someDataType::someDataType(): data(boost::extents[5][5][5]){}

至于程序崩溃,似乎你粘贴了一些错误的东西,它会编译失败。如果省略第二个“数据”,片段将编译但崩溃。原因是这样的分配不符合 Multi Array 文档中指定的“前提条件”:源的形状和目标的形状应该相同。但是,左侧的形状为 [0][0][0],而右侧的范围为 [5][5][5]

于 2013-11-07T02:45:58.353 回答
2

您可以使用聚合初始化:

someDataType container = { boost::multi_array<int,3>(boost::extents[5][5][5]) };

或提供默认构造函数

struct someDataType
{
    boost::multi_array<int,3> data;
    someDataType() : data(boost::extents[5][5][5]) {}
};

someDataType container;

或者,为了使您的代码几乎像编写的那样工作,您可以使用调整大小:

struct someDataType
{
    boost::multi_array<int,3> data;
};

someDataType container;
container.data.resize(boost::extents[5][5][5]);
于 2013-11-07T02:37:40.790 回答