(編集:可能な解決策を最後に置く)
私は iPhone アプリを開発するために Objective C を学んでいる C/C++ プログラマーです。これから作成するプログラムは、オブジェクトの大きな 2 次元配列を扱います。私は NSArray の NSArray の使用について読み、いくつかの動作するコードを持っていますが、C スタイルの配列を使用してオーバーヘッドを節約し、できることとできないことを学ぶ方法を理解しようとしています。
このフラグメントの MapClass には、int x と int y の 2 つのプロパティのみが含まれています。10x10 の静的に定義された配列を操作する次のコード フラグメントがあります。
MapClass *arr[10][10];
arr[2][3] = [[MapClass alloc] init];
arr[2][3].x = 2;
arr[2][3].y = 3;
NSLog(@"The location is %i %i", arr[2][3].x, arr[2][3].y);
// Output: "The location is 2 3"
これは、1 次元配列で実行し、セルが X と Y に基づいてどこにあるかを計算する例です。
MapClass **arr = (MapClass**) malloc(10 * 10 * sizeof(MapClass *));
arr[3 * 10 + 2] = [[MapClass alloc] init];
arr[3*10 + 2].x = 2;
arr[3*10 + 2].y = 3;
NSLog(@"The location is %i %i", arr[3*10 + 2].x, arr[3*10 + 2].y);
// Output: "The location is 2 3"
私の質問は次のとおりです: arr[2][3] スタイル表記を使用してアクセスできるように、配列を 2 次元配列として malloc するにはどうすればよいですか?
私が試みていることはすべて、「下付き文字には[クラス]のサイズが必要ですが、脆弱でないABIでは一定ではありません」などのさまざまなエラーが生成されます。
誰かがこれを行う方法についてスニピットを教えてもらえますか? 私は読んで実験してきましたが、理解できません。私の 1 次元配列の例は何か問題がありますか?
答え?
xzgybの答えをいじった後、次のブロックが機能しています。何か問題がありますか?ありがとう!
int dimX = 20;
int dimY = 35;
MapClass ***arr = (MapClass***) malloc( dimX * sizeof(MapClass **));
for (int x = 0; x < dimX; ++x)
{
arr[x] = (MapClass **) malloc( dimY * sizeof(MapClass*));
}
for (int x = 0; x < dimX; ++x)
{
for (int y = 0; y < dimY; ++y)
{
arr[x][y] = [[MapClass alloc] init];
arr[x][y].x = x;
arr[x][y].y = y;
}
}
for (int x = 0; x < dimX; ++x)
{
for (int y = 0; y < dimY; ++y)
{
NSLog(@"%i %i is %i %i", x, y, arr[x][y].x, arr[x][y].y);
}
}
// Cleanup
for (int x = 0; x < dimX; ++x) {
for (int y = 0; y < dimY; ++y) {
[arr[x][y] release];
}
}
for (int x = 0; x < dimX; ++x)
{
free(arr[x]);
}
free(arr);