Partage
  • Partager sur Facebook
  • Partager sur Twitter

segmentation fault

matrice d'entier

Sujet résolu
    28 octobre 2019 à 17:42:11

    Bonjour a tous ! voilà mon problème j"essais de construire une matrice d'entier d'ordre 10 000 et ensuite effectuer certaines opérations sur la matrice. j'ai construit un sous programme qui effectuera l'opération sur la matrice. mais lorsque je lance le sous programme j'obtiens segmentation fault je crois bien que cela viens du fait que je lui transmet la matrice comme paramètre voila le sous programme 
    #include<stdio.h>
    #include<math.h>
    #define N 1000
    
    void rech(int posi, int posj, int elt, int comp, int fin, int (*mat)[N]){
        int j,comp2,ligne,ligne2,bs,ht;
    
        j=posj;
        comp2=comp;  // comparons si l'élément selectionné est premier ou mulitple
        for(ligne=posi; ligne<fin; ligne+=elt) mat[ligne][j]=0;
        for(ligne=posi; ligne>1; ligne-=elt) mat[ligne][j]=0;
        if(elt!=comp)mat[posi][posj]=0;
        j+=1;
        ligne2=posj;
        while(mat[ligne2][j]%elt!=0){
            ht+=1;
            ligne2-=1;
        }
        while(mat[ligne2][j] % elt!=0){
            bs+=1;
            ligne2+=1;
        }
        if (mat[ligne2-ht][j]!=0){
            rech(ligne2-ht, j, mat[ligne2][j],comp2,fin,mat);
        }else{rech(ligne2+bs, j, mat[ligne2][j],comp2,fin,mat);}
        
    }
    • Partager sur Facebook
    • Partager sur Twitter
      28 octobre 2019 à 18:27:17

      Tu utilises tes variables bs et ht sans les initialiser ! ( tu as du avoir des warnings).
      • Partager sur Facebook
      • Partager sur Twitter
        28 octobre 2019 à 19:00:20

        l'idéé c'est de créer une matrice d'entier affin de rechercher des nombres premiers en essayant d'améliorer le crible d'eratosthène. mais j'ai se problème segmentation fault et également je ne sais comment faire de l'allocation dynamique si vous pouvez me filer un coup de main pour mon programme. voici tout le code:

        #include<stdio.h>
        #include<math.h>
        #define N 1000
        
        void rech(int posi, int posj, int elt, int comp, int fin, int (*mat)[N]){
            int j,comp2,ligne,ligne2,bs,ht;
        
            j=posj;
            comp2=comp;  // comparons si l'élément selectionné est premier ou mulitple
            for(ligne=posi; ligne<fin; ligne+=elt) mat[ligne][j]=0;
            for(ligne=posi; ligne>1; ligne-=elt) mat[ligne][j]=0;
            if(elt!=comp)mat[posi][posj]=0;
            j+=1;
            ligne2=posj;
            while(mat[ligne2][j]%elt!=0){
                ht+=1;
                ligne2-=1;
            }
            while(mat[ligne2][j] % elt!=0){
                bs+=1;
                ligne2+=1;
            }
            if (mat[ligne2-ht][j]!=0){
                rech(ligne2-ht, j, mat[ligne2][j],comp2,fin,mat);
            }else{rech(ligne2+bs, j, mat[ligne2][j],comp2,fin,mat);}
            
        }
        
        int Matrice(){
            int mat[N][N];
            long i=1,j=1,l,m,ordre,som=0;
            printf("Veuillez entrer l'ordre de la matrice:\n");
            scanf("%ld",&ordre);
            rewind(stdin);
            while(i<=ordre){
                j = 1;
                while(j<=ordre){
                som = som + 1;
                mat[j][i] = som;
                j++;
                 }
            i++;
            }
        
            for(l=1;l<=ordre;l++){
                for(m=1;m<=ordre;m++){
                    printf(" %d ", mat[l][m]);
                }
                printf("\n");
            }
        
            printf("\n\n");
        
            for(i=1;i<=ordre;i++){
                for(j=1;j<=ordre;j++){
                    if(mat[j][i]%2!=0 && mat[j][i]%3!=0 && mat[j][i]%5!=0){
                        rech(j,i,mat[j][i],mat[j][i], ordre, mat);
                    }
                }
            }
            
            
        
            /*for(i=1;i<=ordre;i++){
                if (mat[i][1]==2 || mat[i][1]==3 || mat[i][1]==5){
                    for(j=2;j<ordre+1;j++)mat[i][j]=0;
                }
                else if ((mat[i][1]>2 && mat[i][1]%2 == 0)||(mat[i][1]>3 && mat[i][1]%3 == 0)){
                    for(j=1;j<ordre+1;j++)mat[i][j]=0;
                }
                else if (mat[i][1]>5 && mat[i][1]%5 == 0){
                    for(j=1;j<ordre+1;j++)mat[i][j]=0;
                }
                else{
                    for(j=2;j<ordre+1;j++){
                        if (mat[i][j]>7 && mat[i][j]%7 == 0)mat[i][j]=0;
                        else if ((mat[i][j]>11 && mat[i][j]%11 == 0)||(mat[i][j]>13 && mat[i][j]%13 == 0))mat[i][j]=0;
                        else if ((mat[i][j]>17 && mat[i][j]%17 == 0)||(mat[i][j]>19 && mat[i][j]%19 == 0))mat[i][j]=0;
                        else if ((mat[i][j]>23 && mat[i][j]%23 == 0)||(mat[i][j]>29 && mat[i][j]%29 == 0))mat[i][j]=0;
                        else if ((mat[i][j]>31 && mat[i][j]%31 == 0)||(mat[i][j]>37 && mat[i][j]%37 == 0))mat[i][j]=0;
                    }
                }
                }
            
        
            for(l=1;l<=ordre;l++){
                for(m=1;m<=ordre;m++){
                    printf(" %d ", mat[l][m]);
                }
                printf("\n");
            }*/
        
        return 0;
        }
        
        int main(){
        Matrice();
        return 0;
        }
        

        merci si vous pouvez me donner un coup  de main pour mon projet. 


         

        -
        Edité par SteveDeg'S 28 octobre 2019 à 19:10:38

        • Partager sur Facebook
        • Partager sur Twitter
          28 octobre 2019 à 19:12:07

          Non. Tu les as declarées mais pas initialisées. Actuellement elles existent mais peuvent contenir n'importe quelle valeur vu que tu ne les initialises pas.
          • Partager sur Facebook
          • Partager sur Twitter
            28 octobre 2019 à 19:24:26

            Hello,

            Ce n'est pas la cause de ton problème (quoique, peut-être aussi), mais en C, l'indice d'un tableau de taille N va de 0 à N-1. Ton programme va planter si je donne 1000 pour l'ordre de la matrice

            Edit: c'est pas bien de modifier son post suite à une remarque....

            -
            Edité par edgarjacobs 28 octobre 2019 à 19:26:42

            • Partager sur Facebook
            • Partager sur Twitter

            On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

              28 octobre 2019 à 19:40:12

              merci pour la remarque edgarjacobs je tacherais de faire plus ample attention la prochaine fois. Pour revenir au code comment puis-je faire pour que l'ordre de la matrice soit supérieur a 10000j'ai initialisé les variables bs et ht mais le code tourne en boucle j'essais de voir la ou il peut exister des boucles infinies je ne trouve pas.
              • Partager sur Facebook
              • Partager sur Twitter
                28 octobre 2019 à 20:15:26

                Je viens de tester ton code, chez moi le plantage viens d'un débordement de pile.

                La cause est que ton tableau est probablement trop grand pour la pile (4Mo).

                • Partager sur Facebook
                • Partager sur Twitter
                  28 octobre 2019 à 21:08:52

                  ok! comment je peux faire pour augmenter la pile? ou soit il y'a une autre manière que je puisse coder pour éviter le débordement de pile ? désolé de m'appuyer sur toi ainsi mais je ne sais pas comment faire. merci

                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 octobre 2019 à 21:16:20

                    Augmenter la pile ? C'est faisable, mais idiot (*). Tu vas t'arranger pour que ton tableau puisse avoir 10000 x 10000 int, mais avec 10100 x 10100, ça plantera, ou tu changeras le type de int en float ou double  (exemple). Ce n'est donc pas la solution, qui viendra de l'allocation dynamique avec malloc()

                    (*) En plus, rien ne dit que la machine sur laquelle tournera ton programme puisse le supporter

                    -
                    Edité par edgarjacobs 28 octobre 2019 à 21:19:10

                    • Partager sur Facebook
                    • Partager sur Twitter

                    On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                      29 octobre 2019 à 2:52:16

                      merci a tous! j'ai fini par trouver le problème je faisais de la récursivité dans la fonction rech sans pour autant lui indiquer quand est ce qu'il doit s'arrêter j'ai pu corriger le bug merci a tous pour votre aide
                      • Partager sur Facebook
                      • Partager sur Twitter

                      segmentation fault

                      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                      • Editeur
                      • Markdown