2

私はコンウェイの人生ゲームを実装することで C を試しています。

現在のグリッドと次世代のグリッドの 2 つのグリッド (マトリックス) を動的に構築しようとしていますint。そのため、次世代がどのように見えるかを判断した後、ポインターを交換するだけです。

最初はどうしようもなく のようにグリッドへのポインターを定義しようとしましたがint * grid、これは のように 2 番目の角かっこのセットで下付きにすることはできません[][]

のようなものも試しましint * grid[HEIGHT][WIDTH]たが、このようなポインターを別のポインターに割り当てると問題が発生します。(そして実際、これがメモリ内で実際に何をするのかわかりません!)

私の素朴な希望の中で、ダブルポインターに出くわした後、次のことがうまくいくと思いました。プログラムはコンパイルされますが、示された行で実行すると失敗します。(Windows では、問題イベント名が であること以外に詳細はわかりませんAPPCRASH)。

免責事項:これは実際のプログラムではなく、問題の概念実証にすぎません。

#include <stdio.h>
#include <stdlib.h>

int HEIGHT = 20;
int WIDTH = 20;

int ** curr_gen; // Current generation
int ** next_gen; // Next generation

/* Entry Point main */
int main(int argc, char** argv) {

    // Allocate memory for the grids
    curr_gen = malloc(sizeof (int) * WIDTH * HEIGHT);
    next_gen = malloc(sizeof (int) * WIDTH * HEIGHT);

    curr_gen[0][0] = 0; //<< PROGRAM FAILS HERE

    // Release heap resources
    free(curr_gen);
    free(next_gen);

    return 0;
}
4

3 に答える 3

2

スペースを割り当てて、列と行のサイズを定義する型にポインタをキャストするだけです。[][] 経由でポインターを検索するのはコストがかかります。そして、この方法で動的多次元配列を構築することは、不規則な配列のために予約する必要があります.. IE: 必要な場合にのみ使用してください。

タイプを定義できます。

typedef int MyArray[20][20];

そして、必要な型に malloc ポインターをキャストします。

MyArray * curr_gen = (MyArray *) malloc(...);

ただし、これは、コンパイル時に高さと幅がわかっている定数があることを前提としています。動的でなければならない場合は、必ずポインタ テーブル メソッドへのインデックスを使用してください。ただし、実際にルックアップされたポインターは、パイプラインのストールや潜在的なキャッシュ ミスにつながる可能性のある直前にロードする必要があることに注意してください。[行 * 20 + 列] を介して自分で計算するよりも 100 倍のコストがかかります。

したがって、自問すべき本当の質問は、「高速に実行する必要があるか、それともコードを「きれいに」見せたいか?」ということです。

于 2014-02-20T07:48:34.960 に答える
0

これを行う一般的な方法は、http://c-faq.com/aryptr/dynmuldimary.htmlで説明されています。

于 2014-02-20T07:53:47.347 に答える
0

int*私の方法でグリッドのタイプとして使用できます。

マクロ定義または関数によって 2D 位置を 1D に変換します。

#define MATRIX2INDEX(x, y, width)  ((x) + (y) * (width))  // `width` is the max of x + 1 :)
int Matrix2Index(int x, int y, int width)
{
    return MATRIX2INDEX(x, y, width);
}

の 2D 位置でデータにアクセスしますint*

int* grid = (int*)malloc(sizeof(int) * WIDTH * HEIGHT);
grid[MATRIX2INDEX(0, 0, WIDTH)] = 0; // here: get the data you want by 2D position
free(grid); grid = NULL;
于 2014-02-20T08:17:40.550 に答える