Windows可运行的数字时钟奇偶判断C代码Mac编译报错求助
问题描述
我们编写了一个用于判断数字时钟显示数字奇偶性的神经网络C代码,该代码在Windows机器上可正常运行,但在Mac编译时出现大量错误,例如:function definition is not allowed here,恳请提供帮助。
原代码:
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <stdbool.h> #define ligne 10 #define colonne 8 int main (){ //--------------------------creation A, W, O, d, X, epsilon-------------------------- int i,j; float epsilon = 0.2; float cpt_A; int O[ligne]; float A[ligne]; float W[colonne]; srand(time(NULL)); for( i = 0 ; i < colonne ; i++ ) { W[i]=rand() % 6; } int d[ligne] = {0,1,0,1,0,1,0,1,0,1}; int X[ligne][colonne]= {{1,1,1,1,1,1,1,0},{1,0,1,1,0,0,0,0},{1,1,1,0,1,1,0,1},{1,1,1,1,1,0,0,1}, {1,0,1,1,0,0,1,1},{1,1,0,1,1,0,1,1},{1,1,0,1,1,1,1,1},{1,1,1,1,0,0,0,0}, {1,1,1,1,1,1,1,1},{1,1,1,1,1,0,1,1}}; //--------------------------Check for O-------------------------- int check(float a){ if(a>=0) return 1; else return 0; } //--------------------------Remplissage de A[]-------------------------- float* Remplissage_A(float A[],float nW[],int index ){ for(i=index ; i<ligne ; i++){ for(j=0 ; j<colonne ; j++){ cpt_A += nW[j]*X[i][j]; } A[i]=cpt_A; } return A; } //--------------------------Fonction check pour remplir O-------------------------- int* Remplissage_O(float A[]){ for ( i = 0; i < ligne; i++){ O[i]=check(A[i]); } return O; } //--------------------------Affichage X-------------------------- for(i=0; i<colonne; i++){ printf("X%d\t",i); } printf("Valeur\n"); for(i=0; i<ligne; i++){ for(j=0; j<colonne; j++){ printf("%d",X[i][j]); printf(j<colonne-1?"\t":" => %d ",i); } printf("\n"); //printf("%f\n",A[i]); } //--------------------------Print A et O et d-------------------------- printf("\nA\t");printf("O\t");printf("D\n"); float *Ax= Remplissage_A(A,W,0); int *Ox= Remplissage_O(A); for ( i = 0; i < ligne; i++){ printf("%.1f\t",*(Ax + i));printf("%d\t",*(Ox + i));printf("%d\n",d[i]); } //--------------------------Fonction Correction W -------------------------- void Correction_W(int index){ for(j=0;j<colonne;j++){ W[j]=W[j]+(epsilon*((d[index]-O[index])*X[index][j])); } } //--------------------------Fonction Correction-------------------------- printf("-----------------------------------------------\n"); void Correction(float *A,float *W,int *O){ int stop=0; int allCorrect= false; int i,index; A=Remplissage_A(A,W,0); O=Remplissage_O(A); while (!allCorrect){ for ( i = 0; i < ligne; i++){ if(d[i]!=O[i]){ index=i; Correction_W(index); A = Remplissage_A(A,W,index); O = Remplissage_O(A); stop++; } } if(stop==0){ allCorrect=true; } stop=0; } } //--------------------------Appel Fonction-------------------------- Correction(A,W,O); //--------------------------Apres correction-------------------------- printf("Apres correction : \n"); printf("-----------------------------------------------\n"); printf("\nA\t");printf("O\t");printf("D\n"); for ( i = 0; i < ligne; i++){ printf("%.1f\t",*(A + i)); printf("%d\t",*(O + i)); printf("%d\n",d[i]); } }
解决办法
报错核心原因:C标准(C89/C99/C11及后续版本)不允许在函数内部嵌套定义其他函数。Windows常用的MSVC编译器支持微软私有拓展语法,允许函数嵌套,因此代码能正常编译;但Mac默认使用的Clang编译器严格遵循C标准,不支持该非标准写法,导致编译报错。
修复步骤:
- 将所有嵌套在
main函数内的子函数(check、Remplissage_A、Remplissage_O、Correction_W、Correction)移到main函数外部。 - 调整子函数参数传递:原嵌套函数直接使用
main的局部变量,现在需将这些变量作为参数传入子函数(或声明为全局变量,这里推荐传参以避免全局变量副作用)。 - 修复
Remplissage_A中cpt_A未初始化的问题,每次计算前需重置为0,否则会累积垃圾值。
修改后的完整代码:
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <stdbool.h> #define ligne 10 #define colonne 8 // 全局常量数组X,简化参数传递(也可改为传参形式) int X[ligne][colonne]= {{1,1,1,1,1,1,1,0},{1,0,1,1,0,0,0,0},{1,1,1,0,1,1,0,1},{1,1,1,1,1,0,0,1}, {1,0,1,1,0,0,1,1},{1,1,0,1,1,0,1,1},{1,1,0,1,1,1,1,1},{1,1,1,1,0,0,0,0}, {1,1,1,1,1,1,1,1},{1,1,1,1,1,0,1,1}}; // 判断激活值输出 int check(float a){ if(a >= 0) return 1; else return 0; } // 计算样本加权和,填充A数组 float* Remplissage_A(float A[], float nW[], int index ){ for(int i = index ; i < ligne ; i++){ float cpt_A = 0; // 每次计算前重置,避免累积错误值 for(int j = 0 ; j < colonne ; j++){ cpt_A += nW[j] * X[i][j]; } A[i] = cpt_A; } return A; } // 根据A数组结果生成输出O数组 int* Remplissage_O(float A[], int O[]){ for (int i = 0; i < ligne; i++){ O[i] = check(A[i]); } return O; } // 修正权重W void Correction_W(int index, float W[], int d[], int O[], float epsilon){ for(int j = 0; j < colonne; j++){ W[j] = W[j] + (epsilon * ((d[index] - O[index]) * X[index][j])); } } // 整体修正逻辑 void Correction(float *A, float *W, int *O, int d[], float epsilon){ int stop = 0; bool allCorrect = false; int i, index; A = Remplissage_A(A, W, 0); O = Remplissage_O(A, O); while (!allCorrect){ stop = 0; for (i = 0; i < ligne; i++){ if(d[i] != O[i]){ index = i; Correction_W(index, W, d, O, epsilon); A = Remplissage_A(A, W, index); O = Remplissage_O(A, O); stop++; } } if(stop == 0){ allCorrect = true; } } } int main (){ // 初始化变量 int i, j; float epsilon = 0.2; int O[ligne]; float A[ligne]; float W[colonne]; int d[ligne] = {0,1,0,1,0,1,0,1,0,1}; // 随机初始化权重W srand(time(NULL)); for(i = 0 ; i < colonne ; i++ ) { W[i] = rand() % 6; } // 打印X矩阵 for(i = 0; i < colonne; i++){ printf("X%d\t", i); } printf("Valeur\n"); for(i = 0; i < ligne; i++){ for(j = 0; j < colonne; j++){ printf("%d", X[i][j]); printf(j < colonne-1 ? "\t" : " => %d ", i); } printf("\n"); } // 打印初始的A、O、d值 printf("\nA\tO\tD\n"); float *Ax = Remplissage_A(A, W, 0); int *Ox = Remplissage_O(A, O); for (i = 0; i < ligne; i++){ printf("%.1f\t%d\t%d\n", Ax[i], Ox[i], d[i]); } printf("-----------------------------------------------\n"); // 执行权重修正 Correction(A, W, O, d, epsilon); // 打印修正后的结果 printf("Apres correction : \n"); printf("-----------------------------------------------\n"); printf("\nA\tO\tD\n"); for (i = 0; i < ligne; i++){ printf("%.1f\t%d\t%d\n", A[i], O[i], d[i]); } return 0; }
编译运行说明
在Mac终端中进入代码所在目录,执行以下命令:
# 编译代码(指定C99标准,兼容更多编译器) clang -o neural_network neural_network.c -std=c99 # 运行程序 ./neural_network
修改后的代码既符合C标准,可在Mac上正常编译运行,同时在Windows平台用MSVC编译也不会出现问题。
内容的提问来源于stack exchange,提问作者SyyKee
相关产品推荐
相关产品推荐

