3

私はこのような構造体の2D配列を持っています、

MapStruct myMap[50][50];

したがって、このように初期化できます。

myMap[0][0].left = 0;
myMap[0][0].up = 1;
myMap[0][0].right = 5;

以下の例も使用できることを知っています。

MapStruct myMap[50][50] = { {0,1,5}, {2,3,7}, {9,11,8} ... };

しかし、問題は、この50x50構造にかなりの空のスポットがあることです。たとえば、[30][40]から[40][50]までは空で、他のいくつかのポイントは空であるため、上記の角かっこ表記では、この{}、{}のように空の角かっこを残す必要があります。 {}それらの空のスポット。

今私の質問は、以下のようなものを初期化する方法はありますか?

myMap[0][0] = {0, 1, 5}; // gives a syntax error

ポイントごとに2行節約できます。とても満足しています。

追伸:辞書オブジェクトのようにインデックスmyMap [x] [y]をキーとして使用しているので、インデックスが変更されるため、途中で空のインデックスを削除することはできません。

4

5 に答える 5

4

C99は許可します

myMap[0][0] = (MapStruct){0, 1, 5};

C90 に制限されている場合は、ヘルパー関数を使用できます。

mypMap[4][2] = makeStruct(3, 6, 9);

ただし、注意してください

MapStruct myMap[50][50];

関数内では、初期化子がない場合、配列を0の値で初期化しないため、使用する必要があります

MapStruct myMap[50][50] = {0};

また、このような大きな配列をスタックに割り当てるのが賢明かどうか疑問に思うかもしれません。

于 2011-05-13T14:39:07.483 に答える
1

C99 では、次のような初期化が可能です。

MapStruct myMap[50][50] = {
    [ 0][ 5] = { /* ... */ },
    [10][20] = { /* ... */ },
    /* ... */
};

または、次のように、割り当てによって値を設定できます。

MapStruct myMap[50][50];
/* ... */
myMap[ 0][ 5] = (MapStruct){ /* ... */ };
myMap[10][20] = (MapStruct){ /* ... */ };
/* ... */

2 番目のメソッドの構文はキャストではないことに注意してください。キャストと同じように見えますが、集約型のリテラルを記述するために使用されるのは、C99 で導入された表記法です。

于 2011-05-13T21:33:55.310 に答える
1

あなたが試してみると:

myMap[0][0] = (MapStruct) {.left = 0, .up = 1, .right = 5};

または

myMap[0][0] = (MapStruct) {0, 1, 5};
于 2011-05-13T14:32:28.320 に答える
1

C99 を使用している場合は、複合リテラルを調べてください。

于 2011-05-13T14:33:03.287 に答える
0

これにより、スタックではなくヒープ上のデータが得られますが、やりたいことは calloc from で実現できます<stdlib.h>。calloc はメモリ空間を割り当て、初期化をゼロに設定します。

MyStruct * myMap = calloc( 50, 50 * sizeof(MyStruct));
于 2011-05-13T14:35:27.130 に答える