【问题标题】:C code won't run on mac but runs on windowsC 代码不会在 mac 上运行,但在 windows 上运行
【发布时间】:2022-11-10 23:08:37
【问题描述】:

基本上,我们制作了一个神经网络来测试来自数字时钟的数字是奇数还是偶数。 C 代码可以在我的 windows 机器上运行,但是,它在我的 mac 上给了我很多错误。 喜欢:此处不允许函数定义.

我认为这只是一个编译问题。任何帮助将非常感激。

#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 标准不允许嵌套函数。但是一些编译器允许嵌套函数作为扩展。我认为拥有所有功能没有任何好处里面main 函数。只需将它们移出main 函数即可。
  • 请将您收到的所有错误消息作为文本发布到问题中。
  • 另外,为什么在只需要 1 的地方使用 3 printf()printf("%.1f\t",*(Ax + i));printf("%d\t",*(Ox + i));printf("%d\n",d[i]);
  • cpt_A 未初始化。
  • 它给了我很多错误。看到会很有趣这些是哪些错误.

标签: c


【解决方案1】:
  1. (主要问题)我将您的嵌套函数更改为非嵌套函数。你可能不喜欢我选择的论点顺序。
  2. Remplissage_A():我初始化了cpt_A = 0。请检查这是否是您想要的。
  3. main():修复了条件打印,以消除有关其中一个字符串没有与传入的变量匹配的格式的警告。
  4. check():重构然后内联。
  5. 最小化变量范围(i、j、大小、cpt_A 等)。
  6. 合并连续的printf() 调用。
    #include <stdbool.h>
    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #define ligne 10
    #define colonne 8
    
    //--------------------------Remplissage de A[]--------------------------
    float* Remplissage_A(float A[],float nW[], int X[ligne][colonne], int index) {
        float cpt_A = 0;
        for(int i=index ; i<ligne ; i++){
            for(int 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[], int *O) {
        for (int i = 0; i < ligne; i++){
            O[i]=A[i] >= 0;
        }
        return O;
    }
    
    //--------------------------Fonction Correction W --------------------------
    void Correction_W(int *O, float *W, int X[ligne][colonne], int d[ligne], float epsilon, int index){
        for(int j=0;j<colonne;j++){
            W[j]=W[j]+(epsilon*((d[index]-O[index])*X[index][j]));
        }
    }
    
    //--------------------------Fonction Correction--------------------------
    void Correction(float *A,float *W, int X[ligne][colonne], int *O, int d[ligne], float epsilon){
        int stop=0;
        int allCorrect= false;
        A=Remplissage_A(A,W,X,0);
        O=Remplissage_O(A,O);
        while (!allCorrect){
            for (int i = 0; i < ligne; i++){
                if(d[i]!=O[i]){
                    Correction_W(O,W,X,d,epsilon, i);
                    A = Remplissage_A(A,W,X,i);
                    O = Remplissage_O(A,O);
                    stop++;
                }
            }
            if(stop==0){
                allCorrect=true;
            }
            stop=0;
        }
    }
    
    int main (){
        //--------------------------creation A, W, O, d, X, epsilon--------------------------
        float epsilon    =   0.2;
        int   O[ligne];
        float A[ligne];
        float W[colonne];
        srand(time(NULL));
        for(int 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}};
    
        //--------------------------Affichage X--------------------------
        for(int i=0; i<colonne; i++){
            printf("X%d	",i);
        }
        printf("Valeur
    ");
        for(int i=0; i<ligne; i++){
            for(int j=0; j<colonne; j++){
                printf("%d",X[i][j]);
                if(j<colonne-1)
                    printf("	");
                else
                    printf("    =>   %d ",i);
            }
            printf("
    ");
        }
    
        //--------------------------Print A et O et d--------------------------
        printf("
    A	");printf("O	");printf("D
    ");
        float *Ax= Remplissage_A(A,W,X,0);
        int *Ox= Remplissage_O(A,O);
        for (int i = 0; i < ligne; i++){
            printf(
               "%.1f	"
               "%d	"
               "%d
    ",
               *(Ax + i),
               *(Ox + i),
               d[i]
            );
        }
    
        printf("-----------------------------------------------
    ");
    
        //--------------------------Appel Fonction--------------------------
        Correction(A,W,X,O,d,epsilon);
        //--------------------------Apres correction--------------------------
        printf(
            "Apres correction : 
    "
            "-----------------------------------------------
    "
            "
    A	"
            "O	"
            "D
    "
        );
        for (int i = 0; i < ligne; i++){
            printf(
               "%.1f	"
               "%d	"
               "%d
    ",
               *(A + i),
               *(O + i),
               d[i]
            );
        }
    }
    

【讨论】:

  • 默认情况下,嵌套函数是 GCC 扩展。当我不得不使用 MSVC 时,我在 Windows 上非常想念它。
  • @Joshua 在这里使用的闭包使它不同于普通的 c 代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多