Массив структур в C - PullRequest
       10

Массив структур в C

4 голосов
/ 27 апреля 2010

Для жизни я не могу понять правильный синтаксис для создания массива структур в C. Я попробовал это:

struct foo {
    int x;
    int y;
} foo[][] = {

    {
        { 1, 2 },
        { 4, 5 },
        { -1, -1 }
    },

    {
        { 55, 44 }
        { 100, 200 },
    }
};

Так, например, foo [1] [0] .x == 100, foo [0] [1] .y == 5 и т. Д. Но GCC выдает много ошибок.

Если бы кто-то мог предоставить правильный синтаксис, который был бы великолепен.

РЕДАКТИРОВАТЬ: Хорошо, я попробовал это:

struct foo {
     const char *x;
     int y;
};

struct foo bar[2][] = {

     {
      { "A", 1 },
      { "B", 2 },
      { NULL, -1 },
     },

     {
      { "AA", 11 },
      { "BB", 22 },
      { NULL, -1 },
     },

     {
      { "ZZ", 11 },
      { "YY", 22 },
      { NULL, -1 },
     },

     {
      { "XX", 11 },
      { "UU", 22 },
      { NULL, -1 },
     },
};

Но GCC дает мне «элементы массива bar имеют неполный тип» и «лишние элементы в инициализаторе массива».

Ответы [ 3 ]

7 голосов
/ 27 апреля 2010

Это создает и инициализирует двумерный массив структур, каждая строка содержит три. Обратите внимание, что вы не предоставили инициализатор для array[1][2], что в данном случае означает, что его содержимое не определено.

struct foo {
    const char *x;
    int y;
};

int main()
{
    struct foo array[][3] = {
        {
            { "foo", 2 },
            { "bar", 5 },
            { "baz", -1 },
        },
        {
            { "moo", 44 },
            { "goo", 200 },
        }
    };
    return 0;
}

РЕДАКТИРОВАТЬ: сделал х указатель на константную строку. Постарайтесь, чтобы ваши примеры были близки к реальному коду.

2 голосов
/ 27 апреля 2010

Я думаю, что самый простой подход - разделить объявления структуры и массива:

struct foo {
    int x;
    int y;
};

int main()
{
    struct foo foo_inst = {1, 2};
    struct foo foo_array[] = {
        {5, 6},
        {7, 11}
    };
    struct foo foo_matrix[][3] = {
        {{5,6}, {7,11}},
        {{1,2}, {3,4}, {5,6}}
    };

    return 0;
}

Проблема в том, что объявления вложенных массивов в C (и C ++) не могут иметь произвольную длину для любого массива, кроме самого внешнего. Другими словами, вы не можете сказать int[][] arr, и вместо этого вы должны сказать int[][5] arr. Точно так же вы не можете сказать int[][6][] arr или int [][][7] arr, вам придется сказать int[][6][7] arr.

0 голосов
/ 23 июля 2013

Ваша первая проблема - объявление массива. Вы можете оставить только первый квадратный набор пустым. остальные должны быть явно объявлены.

так что вместо этого:

struct foo bar[2][]

Вы должны сделать это:

struct foo bar[][4]

Это действительно первое, что нужно разобраться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...