2009-05-25 5 views
3

Quelqu'un pourrait m'aider s'il vous plaît à comprendre cette erreur en C pour les structures? Voici mon code:Que signifie cette erreur C sur les structures?

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

et je reçois ces erreurs en ce qui concerne O [13], O [14] et 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 

Répondre

8

Initialiser le tableau comme ceci:

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

Cheers!

+0

Pouvez-vous expliquer pourquoi les lignes O [13] et suivantes provoquent des erreurs? –

+0

Ces erreurs sont les mêmes pour toutes les lignes. Pas seulement pour 13, 14 et 15. – ralphtheninja

+0

Je n'ai jamais vu autant de réponses pratiquement identiques en une seule question! :) –

3

Soit vous devez initialiser O avec un seul initialiseur, soit vous pouvez affecter individuellement à ses membres une fonction d'initialisation. Vous ne pouvez pas utiliser d'expressions d'affectation en dehors d'une fonction comme vous l'avez fait.

par exemple.

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

ou

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

    /* ... */ 
} 
5

Si vous allez initialiser O, vous devez tout faire à la fois dans le cadre de la déclaration:

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

};

Vous ne pouvez pas le faire:

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

parce que C ne supporte pas les littéraux struct dans une déclaration, que dans le cadre d'une liste d'initialiseur.

+0

Je pense que ça ira: O [0] = (char []) {'N', 'F', 'N'}; selon http://gcc.gnu.org/onlinedocs/gcc/Compound-Literals.html#Compound-Literals –

+0

@AllanRuin: Oui, mais c'est une extension GCC. Non standard C. – Ferruccio

1

Vous ne pouvez pas affecter une structure comme vous le faites. Vous devez le faire explicitement:

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... 

Ou bien vous pouvez initialiser le struct comme Magnus suggéré.

2

Modifiez l'affectation par une initialisation.

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

Essayez

struct Orientation O[16] = { 
    { 'W','L','S'}, 
    { 'W', 'R', 'N'}, 
    ... 
} 
1

Bien qu'il ne soit pas répondre directement à votre question, vous pouvez résoudre le problème par la syntaxe suivante:

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

C89 n'a pas littéraux pour les structures. Il a des listes d'initialisation, qui ont l'air d'être des littéraux, mais qui ne le sont pas vraiment.

Cela signifie que vous ne pouvez faire la « cession d'initialisation » une fois, où la variable est définie:

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

En C99, cela a changé, voir le lien dans le commentaire.

+0

http://gcc.gnu.org/onlinedocs/gcc/Compound-Literals.html – sigjuice

0

composés littéraux est ce que vous cherchez si vous souhaitez affecter les valeurs à un moment plus tard, la syntaxe que vous voulez est

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

L'avantage est que cela peut être fait partout dans la fonction et non seulement pendant le temps d'initialisation.

Bien que tout le monde a suggéré, vous pouvez simplement réécrire comme:

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

Ou encore

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

Si vous voulez juste affecter les valeurs au cours du temps d'initialisation.

+0

Vous ne pouvez utiliser ces affectations qu'au sein d'un corps de fonction (en particulier, vous ne pouvez pas les utiliser "partout", et certainement pas où l'OP les utilisait, qui est en dehors d'une fonction, juste à côté de la déclaration de type). – jogojapan

+0

@jogojapan Comment savez-vous que l'OP ne les utilise pas dans un corps de fonction? La question n'a aucune indication à ce sujet. "n'importe où" où une cession peut avoir lieu. La façon dont je l'ai vu est qu'il essaie d'assigner une valeur à l'un des index de O à un moment ultérieur. – Wiz

+0

Je sais que l'OP utilise le code en dehors d'un corps de fonction parce que sinon le message d'erreur serait sur l'affectation directe de '{...}' à une variable étant illégale. Mais le message d'erreur concerne plusieurs définitions. – jogojapan