3

我有一个像这样的二维结构数组,

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

每点节省两行我会很高兴的。

Ps:我将索引 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){ /* ... */ };
/* ... */

请注意,第二种方法中的语法不是强制转换。这是 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 回答