-1

(編集:可能な解決策を最後に置く)

私は 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);
4

2 に答える 2

1

テスト済みで、NSMutableString クラスとさまざまな文字列メソッドを使用して正常に動作します。実際に達成しようとしていることをコンパイラーに単純化するために、新しいドット演算子構文を使用するよりも、標準のメッセージ送信ブラケットを使用することをお勧めします。

sizeof(ClassName ) は sizeof([ClassName class]) (およびその点については int または id) と同じである必要があります。すべてのポインターが同じサイズになるため、投稿したコードでそのようなエラーが発生することはありません。sizeof(*someInstanceOfAClass) のようなものを試した場合、意図したものではない 10*10*(オブジェクトの実際のサイズ) に収まる十分なメモリを malloc しようとしているため、いくつかの問題が発生しています。する。(そして、あなたの警告が意図しているように聞こえます。)

于 2012-04-06T04:39:18.703 に答える
1

次のコードを試してください。

MapClass ***arr = (MapClass***) malloc(10 * 10 * sizeof(MapClass *));

for ( int row = 0; row < 10; ++row ) {
    arr[ row ] = (MapClass **)&arr[ row * 10 ];
}

arr[0][1] = [[MapClass alloc] init];
arr[1][2] = [[MapClass alloc] init];
于 2012-04-06T04:39:51.460 に答える