странная ошибка в C; ожидая чего-то - PullRequest
0 голосов
/ 05 августа 2011

Я пишу небольшой язык на C, и он требует установки переменных. У меня настроена таблица переменных, но я получаю странную ошибку.

#define VAR_SIZE 100
typedef struct {
    const char *key;
    int value;
} variable;

variable Table[VAR_SIZE];
Table[0].key = NULL;
Table[0].value = 0;

Когда я запускаю это, я получаю следующую ошибку:

stack.c:8: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘->’ token
stack.c:9: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘->’ token

Что происходит?

Ответы [ 4 ]

7 голосов
/ 05 августа 2011

Вы пытаетесь написать код в глобальном масштабе. Вы не можете сделать это. Вам нужно либо дать вашей глобальной переменной статический инициализатор, либо инициализировать ее во время выполнения внутри вызова функции.

Пример статического инициализатора:

variable Table[VAR_SIZE] = {
    {NULL, 0},  // index 0
    {NULL, 0},  // index 1
    // etc.
};

Инициализация во время выполнения:

variable Table[VAR_SIZE];

void init_table(void) {
    Table[0].key = NULL;
    Table[0].value = 0;
    // etc.
}

int main(int argc, char **argv) {
    init_table();
    // rest of program
}

Если вы компилируете в режиме C99, вы также можете использовать обозначенный инициализатор :

// The following is valid C99, but invalid C89 and invalid C++
variable Table[VAR_SIZE] = {
    [0] = {   // initialize index 0
        .key = NULL,
        .value = 0
    },
    // etc.
};
3 голосов
/ 05 августа 2011

Вы не можете иметь выражение или выражение в области видимости файла. Вы можете иметь их только в области действия функции. Вам нужно изменить последние три строки на:

struct variable Table[VAR_SIZE] = { { NULL, 0 }, };

При использовании этого синтаксиса для инициализации структуры или массива любое неопределенное поле инициализируется нулем, как если бы вы сделали memset(..., 0, sizeof(...)); в оставшейся части структуры / массива. Таким образом, вы можете добавить поле в структуру, оно все равно будет скомпилировано.

Кстати, в C, struct name живут в своем собственном пространстве имен, и вам нужно поставить перед ними префикс с ключевым словом struct.

0 голосов
/ 05 августа 2011

Возможно, вам придется инициализировать элемент 0 вашего массива в функции. Вы можете объявить и определить что-либо снаружи в глобальном масштабе. Но последние две строки являются присваиваниями, которые могут выполняться только в функции

пример: (все остальное, как вы делали выше, кроме двух строк:))

void test()
{
    Table[0].key = NULL;
    Table[0].value = 0;
}
0 голосов
/ 05 августа 2011

Вы можете получить к нему доступ только внутри функции.Чтобы сделать это в такой глобальной области, попробуйте:

variable Table[VAR_SIZE] = {{NULL,0},{NULL,0}};

, если внутри функции все в порядке, то либо сделайте то, что вы уже сделали, либо я пойду на простое:

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