说我有这样的结构:
struct someDataType
{
boost::multi_array<int,3> data;
};
如何初始化阵列?我已经尝试过了,但它似乎不起作用:
someDataType container;
container.data=boost::multi_array<int,3>(boost::extents[5][5][5]);
程序在运行时使用该代码崩溃;当编译为debug时,它会从Boost代码中的某个位置抛出assertion failed
。
任何帮助将不胜感激:)
编辑:我刚才意识到我错误地写了一些代码。我的意思是,我在程序中使用它是正确的,但是当我将它复制到SO时,我将其概括为一并犯了一个错误。现在修好了。
答案 0 :(得分:4)
首先,someDataType的声明仅指定multi_array有多少维度,而不是范围。
你必须在处理container.data之前设置范围,以便Boost可以为它分配内存。简单的方法是使用“调整大小”:
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]
答案 1 :(得分: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;
或者,为了使您的代码几乎按照书面形式工作,您可以使用resize:
struct someDataType
{
boost::multi_array<int,3> data;
};
someDataType container;
container.data.resize(boost::extents[5][5][5]);