C: для инициализации массива требуется заключенный в скобки список инициализаторов - простой код - PullRequest
0 голосов
/ 23 февраля 2019

Я полный новичок в C, и я столкнулся с простой ошибкой.Я искал похожие проблемы в Интернете, но не могу найти проблему с моим кодом.Существует очень мало, и я не знаю, в чем проблема.

Вот ошибка:

C: Array initialization requires a brace-enclosed initializer list

, и это мой полный код

#include <stdio.h>

int main() {
    char walk[10][10] = { 0 };

    for (int row = 0; row < 10; row++) {
        for (int col = 0; col < 10; col++) {
            walk[row][col] = '.';
            printf("%c", walk[row][col]);
        }
    }

    getchar();
    return 0;
}

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Вы компилируете код с включенными дополнительными предупреждениями, что очень хорошая идея.

Компилятор настаивает на том, чтобы вы инициализировали массив массивов с помощью инициализатора с такой же структурой.В вашем случае вы можете попробовать это char walk[10][10] = { { 0 } };.

У вас может быть еще более строгая настройка, когда компилятор указывает, что присутствует недостаточно инициализаторов.Полный инициализатор будет выглядеть так:

char walk[10][10] = {
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
};

Или более компактная версия:

char walk[10][10] = { "", "", "", "", "", "", "", "", "", "" };

Но, глядя на ваш код, walk вообще не нуждается в инициализаторе, так как вы установили всезаписи прямо под объявлением:

#include <stdio.h>

int main() {
    char walk[10][10];

    for (int row = 0; row < 10; row++) {
        for (int col = 0; col < 10; col++) {
            walk[row][col] = '.';
            printf("%c", walk[row][col]);
        }
    }

    getchar();
    return 0;
}

PS: как говорит pmg , ваш код допустим и будет компилироваться как с разрешающими настройками по умолчанию, но с использованием предупреждений компилятора, чтобы избежать глупостиошибки бьют дополнительные ограничения.Код, который аккуратно компилируется с высокими уровнями предупреждений, обычно содержит меньше ошибок.

Обратите также внимание, что вы можете инициализировать walk с помощью одного вызова memset(walk, '.', sizeof(walk)); и более эффективно выводить отдельные символы с помощью putchar(walk[row][col]);

0 голосов
/ 23 февраля 2019

При использовании char walk[10][10] = { 0 }; я получаю сообщение об ошибке компилятора «C: для инициализации массива требуется заключенный в скобки список инициализаторов».

То есть ваш компилятор ужасно анально удерживает.

Соответствующее утверждение совершенно законно C. Он определяет массив 10x10 2-D с именем char walk, где каждый элемент (из 100) равен 0.

Чтобы соответствовать прихотям вашего компилятора, используйте один из

char walk[10][10] = { { 0, 0, 0, 0, 0, 0, 0, 0, 0 },  /* ..., */ { 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
char walk[10][10] = { { 0 },  { 0 } };
char walk[10][10] = { { 0 } };
char walk[10][10] = { 0 }; // initial statement wrongly rejected by compiler

Еще лучше (ИМХО) будет настроить ваш компилятор для принятия юридического кода.

godbolt.org принимает ваш начальный код

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