关于结构的这个C错误是什么意思?
问题描述:
有人可以帮我理解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
答
初始化数组这样的,而不是这些错误:
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'}
};
干杯!
答
要么你必须用一个初始化函数初始化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';
/* ... */
}
答
如果你要初始化O,你需要同时做这一切的声明的一部分:
struct Orientation O[16] = {
{ 'N', 'F', 'N' },
{ 'N', 'B', 'S'),
...
};
你不能做到这一点:
O[0] = {'N', 'F', 'N'};
,因为C不支持在声明结构文本,只能作为一个初始化列表的一部分。
答
你不能像你在做的那样分配一个结构。你需要明确地做到这一点:
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建议的结构。
答
通过初始化更改分配。
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'}};
答
尝试
struct Orientation O[16] = {
{ 'W','L','S'},
{ 'W', 'R', 'N'},
...
}
答
虽然不直接回答你的问题,你可以通过下面的语法解决的问题:
struct Orientation O[16] = {
{'N', 'F', 'N' },
{'N', 'B', 'S'},
{'N', 'R', 'E'},
{'N', 'L', 'W'},
...
};
答
C89不具有结构文字。它有初始化列表,看起来好像它们是文字,但实际上不是。
这意味着你只能做“初始化分配”一次,变量定义,其中:
struct Orientation O[16] = {
{'N', 'F', 'N'},
...
};
在C99,这种情况已经改变,看到评论的链接。
答
复合文字就是你正在寻找的,如果你想在以后的时间分配值是什么,你想要的语法是
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'},
...
};
如果你只是想在初始化时间分配值。
你能解释为什么O [13]和后续行会导致错误? – 2009-05-25 10:45:01
这些错误对于所有行都是相同的。不只是13,14和15. – ralphtheninja 2009-05-25 10:52:09
我从来没有在一个问题中看到太多实际上相同的答案! :) – 2009-05-25 11:30:15