因此,当我尝试将值分配给int数组时,我继续遇到此问题。我读了这个expected expression before '{' token,但我仍然对它出现在我的代码中的原因感到困惑。我有一种感觉,我正在初始化并声明数组错误,这就是为什么它给我的问题。
所以,在main()之前我声明了一些全局变量(是的,我知道这很危险,但我的目的需要)。使用这组全局变量,我还想声明一个大小为3的双数组
double rob_size, rob_tilt;
double rob_leftcolor [3];
double rob_rightcolor [3];
然后在main函数中,我正在初始化变量和数组
rob_size = 1.0;
rob_tilt = 0.0;
rob_leftcolor [3] = {1.0, 0.0, 0.0};
rob_rightcolor [3] = {0.0, 1.0, 0.0};
但是,我收到错误消息“'{'token'之前的预期表达式”。
首先,该错误消息是什么意思?其次,该消息是否会出现,因为我正在初始化并正确地声明数组?
由于
答案 0 :(得分:10)
最好在申报时进行初始化:
double rob_size = 1.0;
double rob_tilt = 0.0;
double rob_leftcolor [3] = {1.0, 0.0, 0.0};
double rob_rightcolor [3] = {0.0, 1.0, 0.0};
只有阵列需要以这种方式完成,但最好以同样的方式完成。
您的替代方案是
rob_leftcolor[0] = 1.0;
rob_leftcolor[1] = 0.0;
rob_leftcolor[2] = 0.0;
答案 1 :(得分:1)
Charlie Burns是正确的,用实际值初始化数组总是更好。但是,使用您提供的代码,一旦声明了数组,您只能设置特定元素:
double x[3];
x[0] = 1.1;
x[1] = 2.2;
x[2] = 3.3;
如您所见,为了设置变量,您可以使用与您尝试设置的元素对应的括号内的数字。在声明数组后,你无法立即设置它。
答案 2 :(得分:0)
在查看答案和评论之后,我认为还有一些事情需要澄清:
static
{...}
来初始化它。但是你
不能在作业陈述中使用它。double rob_leftcolor[3] =
{1.0, 0.0, 0.0}
是一个定义,而rob_leftcolor[3] = {1.0,
0.0, 0.0}
是一项分配,因此您无法在此处使用初始化程序。对于存储类,请考虑下面的情况,没有static
,您实际上是在定义全局变量:
// a1.c
static double rob_size, rob_tilt;
rob_leftcolor [3] = {1.0, 0.0, 0.0};
rob_rightcolor [3] = {0.0, 1.0, 0.0};
int main(int argc, char** argv) {
rob_size = 1.0;
rob_tilt = 0.0;
return 0;
}
// a2.c
rob_leftcolor [3] = {1.0, 0.0, 0.0};
然后编译&链接他们:
$ gcc -c a1.c
a1.c:2:1: warning: data definition has no type or storage class [enabled by default]
a1.c:3:1: warning: data definition has no type or storage class [enabled by default]
$ gcc -c a2.c
a2.c:1:1: warning: data definition has no type or storage class [enabled by default]
$ gcc -o a a1.o a2.o
a2.o:(.data+0x0): multiple definition of `rob_leftcolor'
a1.o:(.data+0x0): first defined here
collect2: error: ld returned 1 exit status
答案 3 :(得分:0)
问题 1:该错误消息是什么意思?
A1:错误意味着编译器不希望您将数组分配给标量。当您指定 rob_leftcolor[3] = {1.0, 0.0, 0.0};
时,您告诉编译器,我希望您将值向量 {1.0, 0.0, 0.0} 分配给数组 rob_leftcolor 的第 4 个元素(计数从 0 - 0, 1, 2, 3 开始)。编译器期望像 rob_leftcolor[0] = 1.0
这样的东西。如您所见,您不能将 3 个元素放在 1 个元素的位置。此外,您尝试分配给三个元素数组中的第四位。
问题 2:出现该消息是因为我错误地初始化和声明数组吗?
A2:您正确地声明了数组但没有分配它们。
其他人已经正确地告诉了您首选的做法。
作为替代方案,您还可以使用 C99 标准中引入的复合文字运算符。
double rob_size = 1.0;
double rob_tilt = 0.0;
double *rob_leftcolor;
double *rob_rightcolor;
...
rob_leftcolor = (double []){1.0, 0.0, 0.0};
rob_rightcolor = (double []){0.0, 1.0, 0.0};
请注意,此数组的作用域仅在您为其分配的函数内。