我正在尝试生成struct
的二维数组,但这会导致程序无法启动。窗口冻结,程序在几秒钟后退出。知道为什么吗?
这是我尝试定义数组cells
的文件。
#ifndef _FIELD_H_
#define _FIELD_H_
class Field {
public:
static const int minX = -400;
static const int maxX = 400;
static const int minY = 0;
static const int maxY = 400;
Field();
private:
struct absCell {
int material;
float health;
} cells[maxX - minX + 1][maxY - minY + 1];
};
#endif
当我删除这四行时,程序能够运行:
struct absCell {
int material;
float health;
} cells[maxX - minX + 1][maxY - minY + 1];
知道这是怎么回事吗?任何帮助表示赞赏!
好吧,显然问题是这个阵列变得非常大。也许你可以帮助我优化它。
材质必须是0到10之间的int。 健康必须是介于0和1之间的浮点数,最多为2个小数位。
如何限制这些变量的大小?
Mark B建议使用vectors
,而itwasntpete建议使用指针,new和delete。差异在哪里,这两种方法的优点和缺点是什么?再次感谢!
答案 0 :(得分:4)
您正在堆栈上分配struct absCell
的801 * 401(= 321201)个元素。假设您有32位机器,它是2569608字节(~2.45 MB)。这会炸毁你的筹码。见here。
将元素移动到堆,如:
class Field {
public:
static const int minX = -400;
static const int maxX = 400;
static const int minY = 0;
static const int maxY = 400;
Field() {
cells = new absCell*[maxX - minX + 1];
for(int i=0; i<maxX - minX + 1; i++)
cells[i] = new absCell[maxY - minY + 1];
}
~Field() {
for(int i=0; i<maxX - minX + 1; i++)
delete[] cells[i];
delete[] cells;
}
private:
struct absCell {
unsigned char material;
unsigned char health;
}**cells;
};
应该解决你的问题。
因为您的更新资料和运行状况可以保存在char
中。访问健康,你必须重新计算它:
put -> x*100
get -> x/100
并且别忘了施展它。
答案 1 :(得分:3)
基于更新说明:
您可以做的第一件事就是使用unsigned char
为每个属性轻松优化结构空间,使用现有浮点数的定点表示法(例如,0.23将存储为整数23)。
然后使用vector而不是数组将结构存储在堆上:
struct absCell {
unsigned char material;
unsigned char health;
};
std::vector<std::vector<absCell> > cells_;
然后设置构造函数:
Field() : cells_(maxX - minX + 1, std::vector<absCell>(maxY - minY + 1)) {}
答案 2 :(得分:2)
我的猜测是你达到了堆栈限制。当您创建该数组时,它试图在您的堆栈上放置801 * 401 * 8字节。我做了一个快速编译并且崩溃了,直到我降低了你的各种分数和最大值的数字。
答案 3 :(得分:2)
如果我正确地获得了你的代码片段,那么你正在尝试创建一个数组。阵列的分配是基于堆栈的,需要超过2 Mb的大小。您的堆栈可能有少于2Mb的可用内容,因此代码在您进入函数时就崩溃了。
尝试以dinamically方式分配相同的数组。