“'''令牌之前的预期表达”

时间:2013-11-20 03:43:03

标签: c arrays

因此,当我尝试将值分配给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'之前的预期表达式”。

首先,该错误消息是什么意思?其次,该消息是否会出现,因为我正在初始化并正确地声明数组?

由于

4 个答案:

答案 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)

在查看答案和评论之后,我认为还有一些事情需要澄清:

  1. 如果在任何函数体外定义/声明变量 在编译单元中,您必须指定存储类,例如 static
  2. 这些变量将被提交给您的BSS部分 可执行文件。然后你最好初始化。
  3. 定义时 数组,您可以使用初始化程序{...}来初始化它。但是你 不能在作业陈述中使用它。
  4. double rob_leftcolor[3] = {1.0, 0.0, 0.0}是一个定义,而rob_leftcolor[3] = {1.0, 0.0, 0.0}是一项分配,因此您无法在此处使用初始化程序。
  5. 请确保您了解C中声明和定义之间的区别。
  6. 对于存储类,请考虑下面的情况,没有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};

请注意,此数组的作用域仅在您为其分配的函数内。