Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.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 错误:表达式在keil中必须有一个常量值_C_Keil - Fatal编程技术网

C 错误:表达式在keil中必须有一个常量值

C 错误:表达式在keil中必须有一个常量值,c,keil,C,Keil,这是我的密码: int i; char *p; char mnc[20],mcc[20],network_string[20]; char *array_parse[3] = {mnc ,mcc ,network_string}; /* Error occurs here */ WATCH_DOG_RESET; printf("\n\n##############Mobile Country Code############\r\n"); Modem_Send("AT*P

这是我的密码:

int i; char *p;
char mnc[20],mcc[20],network_string[20];
char *array_parse[3] = {mnc ,mcc ,network_string}; /* Error occurs here */
WATCH_DOG_RESET;
      printf("\n\n##############Mobile Country Code############\r\n");
      Modem_Send("AT*PSHPLMN?\r\n",13);
      ModemWaitForAtResponse((char *)APN_Buffer,80,20);
        p = strtok (APN_Buffer,"'\":");
        while (p!= NULL)
        {
                    strcpy(array_parse[i++], p);
          //printf ("%s\r\n",p);
          p = strtok (NULL, "\":");
        }
        printf("%s\r\n",mnc);
        printf("%s\r\n",mcc);
        printf("%s\r\n",network_string);
此代码在代码块中工作,但在Keil uvision4中不工作


我得到“表达式必须有一个常量值”。

据我所知,您在没有编译为C99的情况下以某种方式纠正了您的问题。在C99(因1999年批准而命名)之前,C89(因1989年批准而命名)要求您的初始化类型仅使用常量表达式

让我们首先解释这个术语,常量表达式,因为它通常与
const
关键字相混淆。在这方面做得比我好得多,因此无需进一步道别:

常量表达式可以在转换过程中而不是在运行时进行计算,因此可以在常量所在的任何位置使用

换句话说,如果编译器可以在不执行代码的情况下计算出结果,那么它就是一个常量表达式

关于初始化问题,声明:

具有静态存储持续时间的对象的初始值设定项或具有聚合或联合类型的对象的初始值设定项列表中的所有表达式都应为常量表达式

关于骨料类型,在中,说明如下:

数组和结构类型统称为聚合类型


看起来这是对该部分的一次全面检修,对聚合类型(比如数组)的要求也有所放宽。因此,使用现代C99或C11编译器编译肯定会解决您的问题

C11没有改变C99的太多东西。该标准化主要只是添加了一些小功能,如匿名联合、线程等,不推荐的
get
,并使VLA支持可选。。。描述初始化的节号已更改,这很可能是因为我之前提到的添加


请时不时地利用一点空闲时间阅读标准。一天只有二十分钟。下次当你使用一个你一直在使用的功能,但是你从来没有读过手册的时候,就要这样做。搜索该函数,查看它是否在标准中,以便您可以查看它是否可移植。。。了解它,它返回什么,等等。你永远不知道C语言中有什么细微差别会把你的代码从垃圾变成辉煌,除非你读过它们,否则你不会知道这些细微差别


和平!祝你快乐

“表达式必须有一个常量值”是的,我使用了c99模式。但生成的十六进制文件在我的微控制器中不起作用。然而,我刚刚在没有使用c99模式的情况下纠正了这个问题。但奇怪的是,为什么在没有c99模式的情况下会发生这种错误。它们是局部变量。具体来说,C99中的相关变化是块范围(即函数内部)的初始值设定项不需要是常量表达式