You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 02:55:22