Что означает эта ошибка C о структурах? - PullRequest
3 голосов
/ 25 мая 2009

Может ли кто-нибудь помочь мне понять эту ошибку в C для структур? Это мой код:

struct Orientation
{
    char facing;
    char sensor;
    char mazeDir;
}; 

struct Orientation O[16];
O[0] = {'N', 'F', 'N'};
O[1] = {'N', 'B', 'S'};
O[2] = {'N', 'R', 'E'};
O[3] = {'N', 'L', 'W'};
O[4] = {'S', 'F', 'S'};
O[5] = {'S', 'B', 'N'};
O[6] = {'S', 'R', 'W'};
O[7] = {'S', 'L', 'E'};
O[8] = {'E', 'F', 'E'};
O[9] = {'E', 'B', 'W'};
O[10] = {'E', 'R', 'S'};
O[11] = {'E', 'L', 'N'};
O[12] = {'W', 'F', 'W'};
O[13] = {'W', 'B', 'E'};
O[14] = {'W', 'R', 'N'};
O[15] = {'W', 'L', 'S'};

и я получаю эти ошибки относительно O [13], O [14] и O [15]

..\RMNCODE.C(282): error C231: 'O': redefinition
..\RMNCODE.C(283): error C279: 'O': multiple initialization
..\RMNCODE.C(283): error C231: 'O': redefinition
..\RMNCODE.C(284): error C279: 'O': multiple initialization
..\RMNCODE.C(284): error C231: 'O': redefinition

Ответы [ 9 ]

8 голосов
/ 25 мая 2009

Вместо этого инициализируйте массив следующим образом:

struct Orientation O[16] = {
    {'N', 'F', 'N'},
    {'N', 'B', 'S'},
    {'N', 'R', 'E'},
    {'N', 'L', 'W'},
    {'S', 'F', 'S'},
    {'S', 'B', 'N'},
    {'S', 'R', 'W'},
    {'S', 'L', 'E'},
    {'E', 'F', 'E'},
    {'E', 'B', 'W'},
    {'E', 'R', 'S'},
    {'E', 'L', 'N'},
    {'W', 'F', 'W'},
    {'W', 'B', 'E'},
    {'W', 'R', 'N'},
    {'W', 'L', 'S'}
};

Ура!

5 голосов
/ 25 мая 2009

Если вы собираетесь инициализировать O, вам нужно сделать все сразу как часть объявления:

struct Orientation O[16] = {
  { 'N', 'F', 'N' },
  { 'N', 'B', 'S'),
  ...

};

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

O[0] = {'N', 'F', 'N'};

потому что C не поддерживает структурные литералы в выражении, только как часть списка инициализатора.

3 голосов
/ 25 мая 2009

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

, например

struct Orientation O[16] = { {'N', 'F', 'N'}, {'N', 'B', 'S'} /* , ... */ };

или

void InitializeO(void)
{
    O[0].facing = 'N';
    O[0].sensor = 'F';
    O[0].mazeDir = 'N';

    O[1].facing = 'N';
    O[1].sensor = 'B';
    O[1].mazeDir = 'S';

    /* ... */
}
2 голосов
/ 25 мая 2009

Изменить назначение путем инициализации.

struct Orientation { char facing; char sensor; char mazeDir; };

struct Orientation O[16] = 
{{'N', 'F', 'N'},
{'N', 'B', 'S'}, 
{'N', 'R', 'E'}, 
{'N', 'L', 'W'}, 
{'S', 'F', 'S'}, 
{'S', 'B', 'N'}, 
{'S', 'R', 'W'}, 
{'S', 'L', 'E'}, 
{'E', 'F', 'E'}, 
{'E', 'B', 'W'}, 
{'E', 'R', 'S'}, 
{'E', 'L', 'N'}, 
{'W', 'F', 'W'}, 
{'W', 'B', 'E'}, 
{'W', 'R', 'N'}, 
{'W', 'L', 'S'}};
1 голос
/ 25 мая 2009

C89 не имеет литералов для структур. У него есть списки инициализации, которые выглядят как литералы, но на самом деле это не так.

Это означает, что вы можете выполнить «инициализирующее назначение» только один раз, когда переменная определена:

struct Orientation O[16] = {
  {'N', 'F', 'N'},
  ...
};

В C99 это изменилось, см. Ссылку в комментарии.

1 голос
/ 25 мая 2009

Хотя это не является прямым ответом на ваш вопрос, вы можете решить проблему, используя следующий синтаксис:

struct Orientation O[16] = {
  {'N', 'F', 'N' },
  {'N', 'B', 'S'},
  {'N', 'R', 'E'},
  {'N', 'L', 'W'},
  ...
};
1 голос
/ 25 мая 2009

Попробуйте

struct Orientation O[16] = {
    { 'W','L','S'},
    { 'W', 'R', 'N'},
    ...
}
1 голос
/ 25 мая 2009

Вы не можете назначить структуру, как вы делаете. Вам нужно сделать это явно:

O[0].facing = 'N';
O[0].sensor = 'F';
O[0].mazeDir = 'N';

O[1].facing = 'N';
O[1].sensor = 'B';
O[1].mazeDir = 'S';

//etc...

Или вы можете инициализировать структуру, как предложил Магнус.

0 голосов
/ 31 марта 2013

Составные литералы - это то, что вы ищете, если вы хотите присвоить значения позже, вам нужен синтаксис

struct Orientation O[16];
O[0] = (struct Orientation){'N', 'F', 'N'};
O[1] = (struct Orientation){'N', 'B', 'S'};
O[2] = (struct Orientation){'N', 'R', 'E'};
O[3] = (struct Orientation){'N', 'L', 'W'};
O[4] = (struct Orientation){'S', 'F', 'S'};
O[5] = (struct Orientation){'S', 'B', 'N'};
O[6] = (struct Orientation){'S', 'R', 'W'};
O[7] = (struct Orientation){'S', 'L', 'E'};
O[8] = (struct Orientation){'E', 'F', 'E'};
O[9] = (struct Orientation){'E', 'B', 'W'};
O[10] = (struct Orientation){'E', 'R', 'S'};
O[11] = (struct Orientation){'E', 'L', 'N'};
O[12] = (struct Orientation){'W', 'F', 'W'};
O[13] = (struct Orientation){'W', 'B', 'E'};
O[14] = (struct Orientation){'W', 'R', 'N'};
O[15] = (struct Orientation){'W', 'L', 'S'};

Преимущество состоит в том, что это можно сделать везде внутри функции, а не только во время инициализации.

Хотя, как и все остальные, вы можете просто переписать его как:

struct Orientation O[16] = 
{
    {'N', 'F', 'N'},
    {'N', 'B', 'S'}, 
    {'N', 'R', 'E'},
    ...
};

Или даже

struct Orientation O[16] =
{
    [0] = {'N', 'F', 'N'},
    [1] = {'N', 'B', 'S'},
    [2] = {'N', 'R', 'E'},
    [3] = {'N', 'L', 'W'},
    ...
};

Если вы просто хотите присвоить значения во время инициализации.

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