2

の 2 次元配列を生成しようとして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

次の 4 行を削除すると、プログラムを実行できます。

        struct absCell {
            int material;
            float health;
        } cells[maxX - minX + 1][maxY - minY + 1];

これがどのように起こるか考えていますか?どんな助けでも大歓迎です!

アップデート

どうやら問題は、この配列が非常に大きくなることです。これを最適化するのを手伝ってくれるかもしれません。

Material は 0 から 10 の間の int である必要があります。Health は 0 から 1 の間の float で、最大 2 桁の小数部である必要があります。

これらの変数のサイズを制限するにはどうすればよいですか?

更新 2

Mark B は、vectorswhile itwasntpete の使用を提案し、ポインター new と delete の使用を提案しました。これら2つの方法の違いはどこにあり、長所と短所は何ですか? 再度、感謝します!

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、既存の float の固定小数点表現 (たとえば、0.23 は整数 23 として格納されます) を使用して、for each 属性を使用して構造体をスペース用に簡単に最適化することです。

次に、配列の代わりにベクトルを使用してヒープに構造体を格納します。

    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

あなたのスニペットが正しい方法で得られた場合、あなたは配列を作成しようとしています。配列の割り当てはスタックベースで、2 Mb 以上のサイズが必要です。スタックの空き容量が 2Mb 未満である可能性があるため、関数に入った瞬間にコードがクラッシュします。

同じ配列を動的に割り当ててみてください。

于 2013-09-20T18:35:24.213 に答える
2

私の推測では、スタック制限に達しています。その配列をそのように作成すると、スタックに 801*401*8 バイトを置こうとします。簡単なコンパイルを行ったところ、さまざまな最小値と最大値の数値を下げるまでクラッシュが発生していました。

于 2013-09-20T18:34:07.733 に答える