2

我正在尝试生成 a 的二维数组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];

知道这是怎么发生的吗?任何帮助表示赞赏!

更新

好的,显然问题是这个数组变得相当大。也许你可以帮我优化一下。

Material 必须是 0 到 10 之间的整数。 Health 必须是 0 到 1 之间的浮点数,最多 2 个小数位。

如何限制这些变量的大小?

更新 2

Mark B 建议使用vectorswhile itwasntpete 建议使用指针、new 和 delete。区别在哪里,这两种方法的优缺点是什么?再次感谢!

4

4 回答 4

4

您正在分配堆栈上的 801 * 401 (=321201) 个元素struct absCell。假设你有一台 32 位机器,它是 2569608 字节(~2.45 MB)。据此,正在炸毁你的堆栈。

将元素移动到堆中,如:

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

更新 2

除非您有某些原因,否则使用向量很可能是更好的选择,正如 Mark B 的回答所描述的那样。

于 2013-09-20T18:53:41.383 回答
3

基于更新说明:

您可以做的第一件事是通过使用unsigned char每个属性轻松优化空间结构,使用现有浮点数的定点表示(例如,0.23 将存储为整数 23)。

然后用向量而不是数组将结构存储在堆上:

    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)) {}
于 2013-09-20T18:53:50.550 回答
2

我的猜测是你达到了堆栈限制。当您制作该数组时,它试图将 801*401*8 字节放在您的堆栈上。我进行了快速编译并且一直崩溃,直到我降低了您的各种最小值和最大值的数字。

于 2013-09-20T18:34:07.733 回答
2

如果我以正确的方式获得了您的代码段,那么您正在尝试创建一个数组。阵列的分配是基于堆栈的,需要超过 2 Mb 的大小。您的堆栈可能有小于 2Mb 的可用空间,因此代码会在您输入函数时立即崩溃。

尝试动态分配相同的数组。

于 2013-09-20T18:35:24.213 回答