Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C &引用;在'之前的预期表达式;{&“x27;代币”;_C_Arrays - Fatal编程技术网

C &引用;在'之前的预期表达式;{&“x27;代币”;

C &引用;在'之前的预期表达式;{&“x27;代币”;,c,arrays,C,Arrays,因此,当我尝试将值分配给int数组时,我不断遇到这个问题。我阅读了这篇文章,但我仍然不明白为什么它会出现在我的代码中。我感觉我正在错误地初始化和声明数组,这就是为什么它会给出我的问题 因此,在main()之前,我要声明一些全局变量组(是的,我知道这是危险的,但出于我的目的是必需的) double rob_size, rob_tilt; double rob_leftcolor [3]; double rob_rightcolor [3]; 然后在main函数中,我初始化变量和数组 rob_si

因此,当我尝试将值分配给int数组时,我不断遇到这个问题。我阅读了这篇文章,但我仍然不明白为什么它会出现在我的代码中。我感觉我正在错误地初始化和声明数组,这就是为什么它会给出我的问题

因此,在main()之前,我要声明一些全局变量组(是的,我知道这是危险的,但出于我的目的是必需的)

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};
但是,我在处收到错误消息“在“{”标记之前的预期表达式”

首先,这个错误消息是什么意思?第二,是因为我初始化和声明数组不正确而出现这个消息吗


感谢您在申报时进行初始化:

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;

Charlie Burns是正确的,最好使用实际值初始化数组。但是,使用您提供的代码,一旦声明数组,您只能设置特定元素:

double x[3];

x[0] = 1.1;
x[1] = 2.2;
x[2] = 3.3;

如您所见,为了设置变量,您使用了括号内的数字,该数字对应于您试图设置的元素。声明数组后,您不能一次设置所有变量。

查看答案和注释后,我认为还有一些事情需要澄清:

  • 如果变量在中的任何函数体之外定义/声明 作为编译单元,必须指定存储类,例如。
    static
  • 这些变量将放在您的BSS部分 可执行文件。然后最好初始化
  • 在定义 数组,您可以使用初始值设定项
    {…}
    来初始化它 无法在赋值语句中使用它
  • double rob_leftcolor[3]=
    {1.0,0.0,0.0}
    是一个定义,而
    rob_leftcolor[3]={1.0,
    0.0,0.0}
    是赋值,因此不能在此处使用初始值设定项
  • 请确保您知道C中声明和定义之间的区别
  • 存储类,考虑下面的情况,没有<代码>静态< /代码>,实际上是定义全局变量:

    // 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
    

    因为这就是在C@user2930701中初始化数组的方式,因为如果数组大小为空,编译器需要知道数组的大小……如果不是空的,那只是因为C语言这么说。是的,使用
    {…}
    作为数组的初始值设定项仅用于初始化,不用于赋值。还必须为这些变量指定存储类,例如
    static double rob_size=1.0
    否则您的编译将向您发出警告。您是否可以扩展指定存储类的第一个概念?您不必指定存储类。stor年龄级别定义范围(可见性)以及C程序中变量和/或函数的生存时间。C程序中可以使用以下存储类:
    auto
    register
    static
    extern
    。实际上,
    auto
    是默认的存储类,不需要使用
    auto
    存储显式指定变量类。存储类可以参考“C编程语言”。如果未指定存储类,编译将向您发出警告。有趣的是,我的gcc和clang不会发出警告。