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 :

Segmentation Fault


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Février 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : chercheur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Février 2011
    Messages : 78
    Par défaut Segmentation Fault
    Bonjour,

    Je sollicite votre aide pour me corriger ce message d'erreur : Segmentation Fault lors de la compilation :

    La structure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    typedef struct JOURS		
    {
    	int *nbr_clients;                                     /* number of clients */
    	int *listcust;                                       /* liste of clients */
    	int *cust;                                           /* clients par jour */
     
    }JOURS;
    le code :

    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
    void  affect_client_to_days(JOURS * days, donnee *data, usine1 *usine, client *cust){
        int j;
        int t;
        int jr;
        int dem;
        int it=0;
        int nbr_c;
        float *listcust;
        int nbr_t;
        srand(time(NULL));
        int nombre_aleatoire = 0;
     
                for (jr=1; jr<=data->nbr_periodes; jr++)
     
            {       
     
                       cust->demande = 0;
                       days[jr].nbr_clients= 0;
     
                       while ((usine[dem].dem_jour > cust->demande) || (it<1000));
                       {
                                      int nombre_aleatoire = rand()%data->nbr_clients+1;
                                      printf("affecter le client numero %d a la periode %d",nombre_aleatoire, nbr_t);
                                      if((cust[j].Nbvisites < cust[j].frequence)&& (days[jr].cust[j]=0)) 
                                      {
     
                                      days[jr].nbr_clients++;
                                      cust[j].Nbvisites=j++;
                                      days[jr].cust[j]=1;
                                      days[jr].listcust[days[jr].nbr_clients]=j;
                                      cust->demande=cust[j].demande;
                                      }
                       it++;
                       }
     
            }
    }
    merci d'avance.

  2. #2
    Membre expérimenté Avatar de brachior
    Homme Profil pro
    Doctorant
    Inscrit en
    Mai 2011
    Messages
    190
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Doctorant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mai 2011
    Messages : 190
    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
    ...
    int dem;
    int it=0;
    int nbr_c;
    float *listcust;
    int nbr_t;
    srand(time(NULL));
    int nombre_aleatoire = 0;
    
      for (jr=1; jr<=data->nbr_periodes; jr++)
      {       
        cust->demande = 0;
        days[jr].nbr_clients= 0;
        while ((usine[dem].dem_jour > cust->demande) || (it<1000));
        ...
    Quand assignes tu une valeur à la variable dem ???

    Par ailleurs, penses à vérifier le contenu des pointeurs que tu récupères (datas, usines, ...)

  3. #3
    Membre confirmé
    Homme Profil pro
    chercheur
    Inscrit en
    Février 2011
    Messages
    78
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : chercheur
    Secteur : Services à domicile

    Informations forums :
    Inscription : Février 2011
    Messages : 78
    Par défaut
    Quand assignes tu une valeur à la variable dem ???
    la variable dem est assignée dans une autre structure de typedef usine.

    le problème de compilation vient de ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    days[jr].listcust[days[jr].nbr_clients]=j;
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    days[jr].nbr_clients= 0;
    Je ne sais pas pourquoi mais la structure est correcte. peut être un problème de pointeur que je n'arrive pas à saisir la faute.

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 480
    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 480
    Par défaut
    Brachior a raison : non seulement on ne sait pas si ton pointeur « usine » est valide mais si il l'est, le simple fait que « dem » ne soit pas initialisé suffit à rendre ton programme incorrect.

    En C, un tableau est géré en prenant son adresse de départ en mémoire, et en lui ajoutant l'index multiplié par la taille d'un élément. Lorsque tu déclares une variable « dem », elle n'est pas mise à zéro par défaut si tu ne le précises pas. Seule sa place en mémoire est allouée, et sa valeur initiale correspond donc à ce qui se trouve en mémoire à ce moment-là.

    Étant donné que « dem » est une variable locale et n'appartenant à aucune structure, si tu as initialisé, ailleurs dans ton programme, une variable nommée « dem », c'est qu'il s'agit d'un homonyme et en aucun cas de celle qui nous intéresse ici.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2009
    Messages : 59
    Par défaut
    Obsidian et brachior ont raisons, de plus, si tu segfault a cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    days[jr].listcust[days[jr].nbr_clients]=j;
    c'est parce que tu as eu de la chance que la merde qui ce trouve dans la variable dem soit correct... ou du moins qu'elle est passée, en revanche tu as eu moins de chance avec la variable j que tu as aussi oublié d'initialiser.

  6. #6
    Membre Expert Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Par défaut
    En outre, il existe un outil très puissant pour trouver ses erreurs de segmentation sans passer par un debugger. Il s'agit de Valgrind ( http://valgrind.org/ )

    Il est très facile à utiliser :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    gcc tonprogramme.c
    valgrind ./a.out
    Et tu auras des indications te permettant de résoudre ton problème sans notre aide. Car c'est toujours difficile de résoudre une segfault avec un code sans sa partie "usine". Regarde également dans la doc, tu peux faire une analyse plus ou moins poussée de la mémoire si besoin.

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

Discussions similaires

  1. Pb segmentation fault avec glutinit()
    Par pipistrelle dans le forum GLUT
    Réponses: 2
    Dernier message: 17/11/2004, 23h17
  2. [SDL_Image] Img_Load : segmentation fault ....
    Par Mathieu.J dans le forum OpenGL
    Réponses: 6
    Dernier message: 19/10/2004, 23h52
  3. [REDHAT] Segmentation fault systematique
    Par mela dans le forum RedHat / CentOS / Fedora
    Réponses: 2
    Dernier message: 21/09/2004, 06h05
  4. Réponses: 13
    Dernier message: 13/07/2004, 15h41
  5. Comment contrer la "segmentation fault" ?
    Par guillaume_pfr dans le forum C
    Réponses: 15
    Dernier message: 08/08/2003, 13h43

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