IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Erreur de Segmentation en fin de boucle


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 3
    Par défaut Erreur de Segmentation en fin de boucle
    Bonjour ou plutot bonsoir .
    Je dois créer un petit programme en C sur le Théorème des restes chinois
    http://fr.wikipedia.org/wiki/Th%C3%A...restes_chinois si vous voulez des infos

    bref j'ai fait mon programme et bètement il me sort une erreur de segmentation a la fin de la première boucle for de la main (au moment de rentrer la valeur dans x[4])

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    int main() {
    int i,j,N,X;
    int n[5], x[5];
     
     for(i=0;i<5;i++){
      printf("Entrer l'entier %d \n", i);
      scanf("%d", &n[i]);
      printf("Entrer le modulo %d \n", i);
      scanf("%d", &x[i]);
     }
     
     N=n[0];
     X=x[0];
     
     
     for(j=1;j<5;j++){
      CRT(n[j],x[j],&N,&X);
     }
     
    printf("Le résultat est : %d \n", X);
     
    return 0;
    }
    Si vous avez besoin du reste du code ce n'est pas un soucis. Merci de m'aider a déboguer

  2. #2
    Membre éclairé Avatar de LinuxUser
    Inscrit en
    Avril 2007
    Messages
    857
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 857
    Par défaut
    T'es sûr que ça ne vient pas la fonction CRT() car là je vois rien de particulier, d'ailleurs ça compile et s'execute sans problème.

    Peux tu nous montrer CRT?

    Avec les balises de code s'il te plait (l'icône avec un #).

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 3
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #include<stdio.h>
    #include<stdlib.h>
     
    void Euclide(int a, int b, int *ui, int *vi,int *m){
     int uj=0, vj=1,tmpu,tmpv,n, r,q;
     
     n=a;
     *m=b;
     while(r!=0){
       r=n%*m; 
       q=n/(*m);
       if(r!=0){
         n=*m;
         *m=r;// si r=0 m=pgcd
       }
       tmpu=uj;
       tmpv=vj;
       uj=*ui-q*uj;
       vj=*vi-q*vj;
       *ui=tmpu; // si r=0 ui= coeff de bezout
       *vi=tmpv;
     }
    }
     
    void CRT(int n, int x, int *N, int *X) {
     
     int u,v,osef; 
     Euclide(n,N,&u,&v,&osef);
     X=(u)*(n)*(*X)+(v)*(*N)*(x);
     N=*N*n;
     X=*X%*N;
    }
     
    int main() {
    int i,j,N,X;
    int n[5], x[5];
     
     for(i=0;i<5;i++){
      printf("Entrer l'entier %d \n", i);
      scanf("%d", &n[i]);
      printf("Entrer le modulo %d \n", i);
      scanf("%d", &x[i]);
     }
     
     N=n[0];
     X=x[0];
     
     
     for(j=1;j<5;j++){
      CRT(n[j],x[j],&N,&X);
     }
     
    printf("Le résultat est : %d \n", X);
     
    return 0;
    }
    Je savais pas pour la balise de code... Pour le coup je sais pas si je dois m'excuser ^^.

    Bref j'ai testé en affichant n[i] et x[i] après les avoir rentré et j'ai un problème en sortie de boucle. Le dernier x[i] ne s'affiche pas. C'est assez bizarre... RECTIFICATION CA MARCHE ICI ^^.

    D'ailleurs le compilateur me dit ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    seb@debianseb:~$ gcc Restechinois.c 
    Restechinois.c: In function ‘CRT’:
    Restechinois.c:28: warning: passing argument 2 of ‘Euclide’ makes integer from pointer without a cast
    Restechinois.c:4: note: expected ‘int’ but argument is of type ‘int *’
    Restechinois.c:29: warning: assignment makes pointer from integer without a cast
    Restechinois.c:30: warning: assignment makes pointer from integer without a cast
    Restechinois.c:31: warning: assignment makes pointer from integer without a cast
    Et j'oubliais merci pour la réponse... Je suis mal poli !

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    Par défaut
    Hello,

    Il manque les étoiles en rouge dans l'extrait suivant :

    Citation Envoyé par SebHaLEau Voir le message

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    void CRT(int n, int x, int *N, int *X) {
    
     int u,v,osef; 
     Euclide(n,N,&u,&v,&osef);
     X=(u)*(n)*(*X)+(v)*(*N)*(x);
     *N=*N*n;
     *X=*X%*N;
    }
    Sans elles, tu réaffectes de nouvelles valeurs aux pointeurs X et N au lieu de modifier ce qu'ils pointent.

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Dans CRT()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Euclide(n,N,&u,&v,&osef);
    N est une adresse de int (un int *), or Euclide attend un int à cette position.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    X=(u)*(n)*(*X)+(v)*(*N)*(x);
    X est une adresse de int, un int *, or le second membre est un int
    Idem ici pour N et ici pour X
    Bref, une salade entre les entiers et les adresses des entiers.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Inscrit en
    Février 2013
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 3
    Par défaut
    Faut vraiment que je me remette au C. Trop de JAVA tue le C!

    Bref merci pour vos aides, j'ai réussi a faire fonctionner par je ne sais quelle magie mon bordel ^^

    Bonne soirée a tous

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. erreur de segmentation au 4eme tour de boucle
    Par zaboug dans le forum Débuter
    Réponses: 5
    Dernier message: 15/11/2009, 18h45
  2. Erreur de segmentation
    Par Trunks dans le forum C
    Réponses: 3
    Dernier message: 06/10/2005, 18h28
  3. Erreur de segmentation (Inconnue)
    Par Dark-Meteor dans le forum C
    Réponses: 5
    Dernier message: 08/09/2005, 13h42
  4. [Dev-C++] Erreur de segmentation...
    Par sas dans le forum Dev-C++
    Réponses: 11
    Dernier message: 26/03/2005, 14h25
  5. erreur de segmentation
    Par transistor49 dans le forum C++
    Réponses: 10
    Dernier message: 15/03/2005, 11h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo