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 :

problème de segmentation fault


Sujet :

C

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut problème de segmentation fault
    Bonjour je suis en train de coder un resolveur de grille de sudoku. L'algorithme en lui même marche car j'ai déjà fait une version en java qui fonctionne. Et donc maintenant je suis en train de porter celle algo en C pour le faire tourner sur DS.
    Seulement voila, le C n'est pas le java, et j'ai beaucoup de mal avec les pointeurs surtout, et puis maintenant j'ai une belle erreur de segmentation fault

    Après plusieurs heures où je tourne en rond, il me faut de l'aide
    J'ai essayer de commenter le plus possible mon code, si il y des zones d'ombres je peut commenter plus


    merci d'avance a qq'un qui aura le temps et la patience de mettre son nez la dedans
    Fichiers attachés Fichiers attachés

  2. #2
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Bonjour et bienvenue sur Developpez.com,

    rapidement :
    devient :

    Ensuite, cette fonction pose problème :
    Code C : 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
    void file_enqueue(File **p_file, int donnee)
    {
        File *p_nouveau = malloc(sizeof *p_nouveau);
        if (p_nouveau != NULL)
        {
            p_nouveau->suivant = NULL;
            p_nouveau->donnee = donnee;
            if (*p_file == NULL)
            {
                *p_file = p_nouveau;
            }
            else
            {
                File *p_tmp = *p_file;
                while (p_tmp->suivant != NULL)
                {
                    p_tmp = p_tmp->suivant;
                }
                p_tmp->suivant = p_nouveau;
            }
        }
    }

    Surtout dans le while...

    Par contre, prenez l'habitude d'utiliser gdb et de mettre des points d'arrêts dans votre code, vous verrez par vous même d'où proviennent les erreurs et serez plus à même de les corriger.

    Si un bout de code pose problème et que vous ne savez vraiment pas d'où vient l'erreur, venez copier le bout de code en question et nous apporterons les corrections nécessaires ensuite

    Ce n'est pas à nous de déboguer le code d'autrui, mais juste l'aider dans ses démarches !


  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci de ta réponse

    Citation Envoyé par buchs Voir le message
    Bonjour et bienvenue sur Developpez.com,

    Ensuite, cette fonction pose problème :
    Code C : 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
    void file_enqueue(File **p_file, int donnee)
    {
        File *p_nouveau = malloc(sizeof *p_nouveau);
        if (p_nouveau != NULL)
        {
            p_nouveau->suivant = NULL;
            p_nouveau->donnee = donnee;
            if (*p_file == NULL)
            {
                *p_file = p_nouveau;
            }
            else
            {
                File *p_tmp = *p_file;
                while (p_tmp->suivant != NULL)
                {
                    p_tmp = p_tmp->suivant;
                }
                p_tmp->suivant = p_nouveau;
            }
        }
    }

    Surtout dans le while...
    Humm... j'ai beau chercher je ne trouve pas ce qui cloche la dedans :-/


    Citation Envoyé par buchs Voir le message
    Ce n'est pas à nous de déboguer le code d'autrui, mais juste l'aider dans ses démarches !
    J'entends bien mais, après avoir tourné en rond qq'e heures j'étais un peu désespéré

  4. #4
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    En utilisant un débogueur (gdb), j'ai réalisé qu'une erreur de segmentation provient de cette partie du code :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                File *p_tmp = *p_file;
                while (p_tmp->suivant != NULL)
                {
                    p_tmp = p_tmp->suivant;
                }
                p_tmp->suivant = p_nouveau;

    Ce n'est pas parce que le code compile et qu'il s'exécute que c'est forcément juste. À toi de voir les états qui font que ça pourrait cocher, pour ma part, je n'ai pas cherché plus loin... (tu peux déboguer en faisant des printf et autres si tu ne veux pas utiliser de débogueur )

    ++

    [edit] si tu veux mon avis, ça provient de l'affection *p_tmp= *p_file

  5. #5
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    void file_enqueue(File **p_file, int donnee)
    {
    ....
    }
    Le code semble correct. Donc l'appel est sans doute incorrect. Probablement que *p_file n'est pas NULL ni l'adresse de quelque chose de valide : A priori, mauvaise initialisation.

    En cherchant un peu qui appelle cette fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    File* candidats ( struct Pos *pos, int *grille[9][9] )
    {
    ...
    		File *candidats;
    ...
    			   file_enqueue(&candidats, i);
    ...
    }
    candidats n'est pas initialisé à NULL

Discussions similaires

  1. Problème avec segmentation fault
    Par Gobelins dans le forum C
    Réponses: 10
    Dernier message: 02/06/2010, 13h20
  2. Problème de segmentation fault
    Par skysee dans le forum C++
    Réponses: 4
    Dernier message: 25/01/2009, 10h06
  3. problème de "segmentation fault"
    Par reivilouadivad dans le forum C++
    Réponses: 2
    Dernier message: 05/03/2008, 08h54
  4. Réponses: 6
    Dernier message: 01/11/2007, 18h44
  5. [Socket SSL] problème de "Segmentation fault"
    Par jesus144 dans le forum Programmation et administration système
    Réponses: 1
    Dernier message: 09/03/2007, 19h50

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