2009-05-25 67 views
3

有人可以幫我理解C中的這個錯誤嗎? 這是我的代碼:關於結構的這個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 

回答

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

乾杯!

+0

你能解釋爲什麼O [13]和後續行會導致錯誤? – 2009-05-25 10:45:01

+0

這些錯誤對於所有行都是相同的。不只是13,14和15. – ralphtheninja 2009-05-25 10:52:09

+0

我從來沒有在一個問題中看到太多實際上相同的答案! :) – 2009-05-25 11:30:15

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

    /* ... */ 
} 
5

如果你要初始化O,你需要同時做這一切的聲明的一部分:

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

};

你不能做到這一點:

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

,因爲C不支持在聲明結構文本,只能作爲一個初始化列表的一部分。

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

否則你可以初始化像Magnus建議的結構。

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

嘗試

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

雖然不直接回答你的問題,你可以通過下面的語法解決的問題:

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

C89不具有結構文字。它有初始化列表,看起來好像它們是文字,但實際上不是。

這意味着你只能做「初始化分配」一次,變量定義,其中:

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

在C99,這種情況已經改變,看到評論的鏈接。

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

如果你只是想在初始化時間分配值。