Инициализация массива структуры в одну строку? (в С) - PullRequest
3 голосов
/ 13 мая 2011

У меня есть 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} ... };

Но проблема в том, что в этой структуре 50х50 есть значительные пустые места. Так, например, может быть от [30] [40] до [40] [50] пусто и некоторые другие точки здесь и там пусты, поэтому с указанными выше скобочными обозначениями я должен оставить пустые скобки, как это {}, {}, {} для этих пустых пятен.

Теперь мой вопрос: есть ли способ инициализировать подобное ниже?

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

Сохраняет две линии на точку, я был бы очень доволен этим.

PS: я использую индексы myMap [x] [y] в качестве ключей, подобных объекту словаря, поэтому я не могу просто избавиться от этих пустых в середине, потому что это меняет индексы.

Ответы [ 5 ]

4 голосов
/ 13 мая 2011

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};

И также заметить, что можно задаться вопросом, разумно ли размещать такие большие массивы настек.

1 голос
/ 14 мая 2011

C99 позволяет инициализацию следующим образом:

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

Или вы можете установить значения путем присваивания, например так:

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

Имейте в виду, что синтаксис во втором методеэто не кастинг.Это обозначение, введенное C99, которое, хотя и выглядит так же, как приведение, используется для записи литералов агрегатных типов.

1 голос
/ 13 мая 2011

Если вы используете C99, посмотрите составной литерал.

1 голос
/ 13 мая 2011

Если вы попробуете с:

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

или

myMap[0][0] = (MapStruct) {0, 1, 5};
0 голосов
/ 13 мая 2011

Это даст вам данные в куче, а не в стеке, но то, что вы хотите сделать, может быть достигнуто с помощью calloc из <stdlib.h>.calloc выделит пространство памяти и установит его инициализацию на ноль.

MyStruct * myMap = calloc( 50, 50 * sizeof(MyStruct));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...