有人可以帮我理解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
答案 0 :(得分: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'}
};
干杯!
答案 1 :(得分:5)
如果您要初始化O,则需要在声明中一次性完成所有操作:
struct Orientation O[16] = {
{ 'N', 'F', 'N' },
{ 'N', 'B', 'S'),
...
};
你不能这样做:
O[0] = {'N', 'F', 'N'};
因为C不支持语句中的结构文字,只作为初始化列表的一部分。
答案 2 :(得分:3)
您必须使用单个初始化程序初始化O
,或者您可以在初始化函数中单独分配给其成员。你不能像在你那样使用函数之外的赋值表达式。
e.g。
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';
/* ... */
}
答案 3 :(得分: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'}};
答案 4 :(得分: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建议的那样初始化结构。
答案 5 :(得分:1)
尝试
struct Orientation O[16] = {
{ 'W','L','S'},
{ 'W', 'R', 'N'},
...
}
答案 6 :(得分:1)
虽然它不能直接回答您的问题,但您可以通过以下语法解决问题:
struct Orientation O[16] = {
{'N', 'F', 'N' },
{'N', 'B', 'S'},
{'N', 'R', 'E'},
{'N', 'L', 'W'},
...
};
答案 7 :(得分:1)
C89没有结构的文字。它确实有初始化列表,看起来好像是文字,但实际上并非如此。
这意味着您只能执行“初始化赋值”一次,其中定义了变量:
struct Orientation O[16] = {
{'N', 'F', 'N'},
...
};
在C99中,这已经改变,请参阅评论中的链接。
答案 8 :(得分: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'},
...
};
如果您只想在初始化时分配值。