3

誰かが構造体の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
4

9 に答える 9

8

代わりに、次のようにアレイを初期化します。

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

乾杯 !

于 2009-05-25T10:43:21.077 に答える
5

O を初期化する場合は、宣言の一部として一度に行う必要があります。

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

};

あなたはこれを行うことはできません:

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

C はステートメントで構造体リテラルをサポートせず、イニシャライザ リストの一部としてのみサポートするためです。

于 2009-05-25T10:44:38.517 に答える
3

単一の初期化子で初期化する必要が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';

    /* ... */
}
于 2009-05-25T10:44:28.890 に答える
2

初期化により割り当てを変更します。

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'}};
于 2009-05-25T10:44:53.570 に答える
1

あなたがやっているように構造体を割り当てることはできません。明示的に行う必要があります。

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

または、マグナスが提案したように構造体を初期化できます。

于 2009-05-25T10:44:39.780 に答える
1

試す

struct Orientation O[16] = {
    { 'W','L','S'},
    { 'W', 'R', 'N'},
    ...
}
于 2009-05-25T10:45:03.633 に答える
1

質問に対する直接の回答ではありませんが、次の構文で問題を解決できます。

struct Orientation O[16] = {
  {'N', 'F', 'N' },
  {'N', 'B', 'S'},
  {'N', 'R', 'E'},
  {'N', 'L', 'W'},
  ...
};
于 2009-05-25T10:45:22.790 に答える
1

C89 には構造体のリテラルがありません。リテラルのように見える初期化リストがありますが、実際にはそうではありません。

これは、変数が定義されている「初期化代入」を 1 回しか実行できないことを意味します。

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

C99 では、これが変更されました。コメント内のリンクを参照してください。

于 2009-05-25T10:45:25.567 に答える
0

複合リテラルは、後で値を割り当てたい場合に探しているものです。必要な構文は次のとおりです。

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

初期化時に値を割り当てたいだけの場合。

于 2013-03-31T07:15:31.327 に答える