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 :

Debbuger un segfault


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 179
    Par défaut Debbuger un segfault
    Bonjour,

    la compilation de mon programme produit un seg fault.
    Les soucis se trouvent dans la classe Plage mais je ne sais pas trop comment corriger ça:


    Merci

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    la compilation de mon programme produit un seg fault.
    L'exécution, pour être exact.

    #define NBCOLONNES 100
    ...
    colonne=126945
    Tu as comme qui dirait un dépassement de capacité.

    Après, il faudrait afficher la pile d'appels pour voir d'où vient cette valeur.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 179
    Par défaut
    Citation Envoyé par Laurent Gomila
    L'exécution, pour être exact.


    Tu as comme qui dirait un dépassement de capacité.

    Après, il faudrait afficher la pile d'appels pour voir d'où vient cette valeur.
    Cette pile s'affiche avec quelle commande ?

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Avec gdb, c'est "backtrace" ou en abrégé "bt", si mes souvenirs sont bons.

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    125
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 125
    Par défaut
    Salut

    j'ai pas lu tout le code mais il me semble que ta fonction hasard() est douteuse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int Plage::hasard(int min, int max){
      return (int) (min + ((float) rand() / RAND_MAX * (max - min + 1)));
    }
    le cas d erreur est rand() == RAND_MAX il me semble que tu seras en dehors des bornes.

    perso j'utiliserais plutot un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    min +(rand() % (max-min))

    si tu es sous un unix (linux) utilises valgrind ca te fera gagner du temps

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Outre la fonction de random, il me semble que les fonctions "entrée" et "sortie" le sont aussi...

    Je sais bien que les compilateurs sont très bons, et qu'il peuvent detecter des recursions inutiles (en fin de fonction par exemple), mais là c'est typiquement le cas, ou la recursion ne sert qu'à remplir la pile... D'autant qu'on peut, exploser la pile très vite si on appelle entrée avec une seule cellule libre ou sortie avec une seule cellule occupée

    Une simple boucle while autour des appels serait plus "sur" à mon avis (quitte à faire tourner le processus en boucle infinie, au moins sa explosera pas la pile).

    Genre (pseudocode):
    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
     
    entree(ligne, colonne)
    {
       if (nb_libre == 0)
            return;
     
       do {
           if (cellule[ligne,colonne]) {
               cellule[ligne,colonne]=false;
               nb_occupees++;
               return;
           }
     
           ligne = random();
           colonne = random();
     
       } while(true)
    }
    Ensuite, je me demande dans quelle mesure la selection d'une ligne et d'une colonne par double appel à rand() est valable.

    rand() est censé retourner tous les éléments possible au moins une fois avant de boucler. Mais rien ne dit qu'il le fait deux fois avec un nombre d'impair d'appels entre les deux.
    Ce que j'entends par là, c'est que des "pattern" peuvent apparaitrent et rien ne dit que toutes les lignes/colonnes seront touchées par un double appel.

    Bien entendu, ce cas est d'autant plus fréquent que le nombre de lignes/colonnes augmente. Et dans ce cas, la fonction a de fortes chances de boucler.

    Attention aussi à l'utilisation de rand() conjointement à un modulo... le résultat n'est pas sur d'être random non plus !

    Si la mémoire n'est pas un probleme, allouer deux vecteurs additionels: un pour les cellules libres, l'autre pour les cellules occupées. Quand une cellule change de mode elle passe d'un vecteur (tableau) à un autre.
    La selection aléatoire n'a besoin d'être faite qu'une seule fois sur la longueur du tableau voulu (on est sur que la cellule est du bon type dans ce cas là).

Discussions similaires

  1. Debbug pour débutant
    Par BFH dans le forum C
    Réponses: 18
    Dernier message: 27/11/2005, 15h15
  2. Debbuger le PHP
    Par Sydaze dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 25/11/2005, 16h00
  3. [linux]segfault lors d'un realloc d'une structure
    Par le mage tophinus dans le forum C
    Réponses: 2
    Dernier message: 10/10/2005, 13h30
  4. [debutant] pour debbuger un petit prog avec menu
    Par niluge01 dans le forum Windows
    Réponses: 3
    Dernier message: 22/11/2003, 14h03

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