Co znamená tato chyba C o strukturách znamená?

hlasů
3

Mohl by někdo prosím, pomozte mi pochopit tuto chybu v C pro struktury? To je můj kód:

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

a já si tyto chyby týkající se O [15] [13] O, O [14] a

..\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
Položena 25/05/2009 v 11:37
zdroj uživatelem
V jiných jazycích...                            


9 odpovědí

hlasů
8

Inicializaci pole takto místo:

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

Na zdraví!

Odpovězeno 25/05/2009 v 11:43
zdroj uživatelem

hlasů
5

Pokud se chystáte k inicializaci O, co musíte udělat to všechno najednou jako součást prohlášení:

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

};

Můžete to udělat:

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

protože C nepodporuje struct literals v prohlášení, ale pouze jako součást seznamu Inicializátor.

Odpovězeno 25/05/2009 v 11:44
zdroj uživatelem

hlasů
3

Buď musíte inicializovat Os jediným inicializátor, nebo můžete přiřadit svým členům individuálně inicializační funkce. Nelze použít přiřazení výrazy mimo funkci, jak jste udělali.

např

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

nebo

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

    /* ... */
}
Odpovězeno 25/05/2009 v 11:44
zdroj uživatelem

hlasů
2

Změna přiřazení pomocí inicializace.

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'}};
Odpovězeno 25/05/2009 v 11:44
zdroj uživatelem

hlasů
1

C89 nemá literály pro konstrukcí. To přece má seznamy inicializace, které vypadají, jako by oni jsou literály, ale ve skutečnosti nejsou.

To znamená, že můžete udělat jen „Inicializace úkol“ jednou, kde je proměnná definována:

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

V C99 se to změnilo, viz odkaz v poznámce.

Odpovězeno 25/05/2009 v 11:45
zdroj uživatelem

hlasů
1

Ačkoli to není přímá odpověď na svou otázku, můžete vyřešit problém pomocí následující syntaxe:

struct Orientation O[16] = {
  {'N', 'F', 'N' },
  {'N', 'B', 'S'},
  {'N', 'R', 'E'},
  {'N', 'L', 'W'},
  ...
};
Odpovězeno 25/05/2009 v 11:45
zdroj uživatelem

hlasů
1

Snaž se

struct Orientation O[16] = {
    { 'W','L','S'},
    { 'W', 'R', 'N'},
    ...
}
Odpovězeno 25/05/2009 v 11:45
zdroj uživatelem

hlasů
1

Nemůžete přiřadit struct jako děláte. Musíte to udělat explicitně:

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

Anebo můžete inicializovat struct jako Magnus navrhl.

Odpovězeno 25/05/2009 v 11:44
zdroj uživatelem

hlasů
0

Složené literals je to, co hledáte, pokud chcete přiřadit hodnoty v pozdější době, syntax chcete, je

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

Výhodou je, že to lze provést kdekoliv ve funkci, a to nejen v době inicializace.

Ačkoli jako každý jiný navrhl, stačí přepsat jako:

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

Nebo dokonce

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

Pokud si jen chcete přiřadit hodnoty v době inicializace.

Odpovězeno 31/03/2013 v 08:15
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more