2009-05-25 69 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'}, 
    ... 
}; 

如果你只是想在初始化时间分配值。