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 :

Pb graphe en C++


Sujet :

C++

  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 94
    Par défaut Pb graphe en C++
    Salut à tous,
    Je suis en train d'implémenter un graphe basé sur les listes d'adjacence.
    En première étape, j'ai essayé d'initialiser le tableau de pointeurs sur les sommets, mais j'ai l'impression que ça ne marche pas.
    Code cpp : 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
    #include <string>
    #include <iostream>
    using namespace std;
     
    class noeud
    {
    	public:
    	int n ; //n° de l’état destinataire
     	char a ; //caractère de la transition conduisant à cet état.
    	noeud *suiv1 ; //on utilise une liste chainée.
    	noeud *suiv2 ; //à double pointeurs
    };
    class automate
    {
    	private:
    	int n; //nbre de noeud
    	noeud *tab[];
    	public:
    	void init_tab(int m);
    	void ajouter_noeud(noeud);
     
    };
     
    void automate::init_tab(int m)
    {
    	for (int i=0;i>m;i++)
    	{
    	  tab[i]=new noeud();
    	  tab[i]->n=i;
    	  cout << " I's ok ";
     
    	}
     
    }
    int main(void)
    {
    	int n;
    	//Création de notre graphe
     	automate *aut= new automate();
    	cout << "Tapez le nombre de noeuds de l'automate : ";
    	cin >> n;
    	(*aut).init_tab(n);
    	return 0;
    }
    En fait lors de l'exécution de ce bout de code je remarque que le message "I's ok" n'est pas affiché donc la méthode d'initialisation n'est pas atteinte.
    Aidez moi SVP.

  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
    Ton tableau tab n'a pas de dimension. Si c'est un tableau dynamique, tu ferais mieux d'utiliser std::vector (voir FAQ).

  3. #3
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 94
    Par défaut
    Je ne sais pas mais ce n'est pas ça le pb.
    En fait j'ai essayé de faire getch() mais il parait que <conio.h> n'est reconnu par le compilateur.

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 11
    Par défaut i>m -> i<m
    Pour afficher ton message " I's ok ", introduis simplement -1 lors de l'exécution...
    (euh..., WARNING: Le message s'affichera 2147483648 fois si int est sur 32bits)
    Plus sérieusement, remplace i>m par i<m dans le for et ton problème sera résolu...


    Citation Envoyé par Fahmi06
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	for (int i=0;i>m;i++)

  5. #5
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 94
    Par défaut
    Et oui toujours on met de telles fautes de betises.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 11
    Par défaut Allocation mémoire
    i<m ne résout qu'un problème!

    Citation Envoyé par Fahmi06
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    	noeud *tab[];
            ...
    	tab[i]=new noeud();
    Ton tableau n'est pas alloué... la remarque de Laurent Gomila est justifiée.
    En fait, tu alloues de l'espace mémoire pour un noeud mais pas pour le tableau (dynamique) contenant le pointeur vers l'espace alloué dans la case tab[i].

  7. #7
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 94
    Par défaut
    Voila j'ai essayé de refaire avec les vecteurs, mais j'ai qqs pbs à vous mentionner
    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
     
    class automate
    {
    	private:
    	int n; //nbre de noeud
    	vector<noeud*> tab;
    	public:
    	void init_tab(int m);
    	void ajouter_noeud(noeud);
     
    };
     
    void automate::init_tab(int m)
    {
    	noeud *e;
    	for (int i=0;i<m;i++)
    	{
    	  e=new noeud();
    	  e->n=i+1;
    	  tab.push_back(e);
    	}
    	delete e;
    	  //on les affiche, toujours sur le meme principe ...
    	for(int j=0; j<tab.size(); j++)
    	{
    	   cout << tab[j]->n << "\n" ;
    	}
    }
    Lors de l'exécution l'ordre d'affichage affiche le 0 en dernier lieu:
    Tapez le nombre de noeuds de l'automate : 7
    1
    2
    3
    4
    5
    6
    0
    et parfois il m'affiche n'importe quoi :
    Tapez le nombre de noeuds de l'automate : 5
    1
    2
    3
    4
    159039992
    Est ce que ça peut s'expliquer?
    merci d'avance.

  8. #8
    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
    C'est parce que tu détruis le dernier élément inséré (delete e) ; sa valeur sera donc n'importe quoi. Il ne faut pas le détruire, puisque ton tableau pointe toujours dessus.

  9. #9
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 94
    Par défaut
    Ok mais je dois comme même le détruire quelque part.
    En tous cas ça ne résoud pas tous les pbs parce que le 0 reste tjours le dernier affiché.

  10. #10
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Un conseil évite les tableau de pointeurs si possible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vector<noeud*> tab;
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vector<noeud> tab;
    Sinon penses à créer une méthode pour détruire correctement ton vecteur et appelle la dans le destructeur de automate par exemple.
    Consulte la FAQ pour trouver la meilleure solution

  11. #11
    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
    comme même
    quand même

    Ok mais je dois comme même le détruire quelque part.
    Seulement une fois que tu n'en as plus besoin...

    En tous cas ça ne résoud pas tous les pbs parce que le 0 reste tjours le dernier affiché.
    Tu n'as aucun noeud qui vaut 0, si tu as un zéro affiché c'est donc un bug.

  12. #12
    Membre éprouvé
    Inscrit en
    Mai 2007
    Messages
    157
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2007
    Messages : 157
    Par défaut
    Ok mais je dois comme même le détruire quelque part.
    Une solution est dans le destructeur de ta classe...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while(this->tab.size() >0)
    {
        delete this->tab.back();
        this->tab.pop_back();
    }
    Quelquechose dans le genre....

  13. #13
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 94
    Par défaut
    Merci pour vos réponses qui m'aident beaucoup à ameliorer mon code.
    Mais j'ai un autre pb SVP. Est ce que qq'un peut m'expliquer la signification d'une erreur de segmentation générée lors de l'exécution.

  14. #14
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Exécute ton code pas à pas avec un debugger pour savoir exactement où est ton erreur.

    Causes possibles :
    • tentative d'accès à une case inexistante d'un tableau
    • delete deux fois sur le même pointeur
    • problème d'allocation ou mémoire non allouée
    • ... beaucoup d'autres

  15. #15
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Toutes les causes de la segmentation fault se résument à des accès interdits à certains emplacements mémoire.

  16. #16
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 94
    Par défaut
    Citation Envoyé par befalimpertinent
    Exécute ton code pas à pas avec un debugger pour savoir exactement où est ton erreur.
    Est ce que tu peux me donner une méthode pour le faire car je ne sais pas comment le faire.

  17. #17
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Tu travailles sur quel plateforme Win, Linux ?
    Avec quels outils ou IDE : Visual, gcc ?

  18. #18
    Membre confirmé
    Inscrit en
    Septembre 2006
    Messages
    94
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 94
    Par défaut
    Je travaille sous fedora 6.
    J'ai installé QT4.3.0 qui peut compiler des codes C et C++(car je pense il utilise le compilateur g++)

  19. #19
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Si tu compiles avec la console tu peux utiliser gdb (english) qui est un bon debugger. Voir aussi cette doc en français.
    Je ne connait pas les autres debugger sous Fedora mais il doit surement y avoir des outils plus graphique et plus "user-friendly" comme on dit.
    Mais gdb devrait te suffire.
    Essayes de taper dans ta console :
    gdb ton_prog

    ça devrait suffire à dire à quelle ligne ça plante il me semble.
    Après je ne l'ai pas suffisamment utilisé pour pouvoir t'en dire plus (je suis sous Xp et Visual). Consulte la doc si besoin.

Discussions similaires

  1. Classe pour la création d'un graphe xy
    Par Bob dans le forum MFC
    Réponses: 24
    Dernier message: 03/12/2009, 17h20
  2. [Turbo Pascal] [Windows XP] Problème avec l'unité GRAPH
    Par themofleur dans le forum Turbo Pascal
    Réponses: 22
    Dernier message: 29/03/2003, 22h43
  3. Perl & Graphes
    Par makram9999 dans le forum Modules
    Réponses: 4
    Dernier message: 24/03/2003, 11h24
  4. [] [Excel] Exporter un graphe MSChart vers Excel
    Par Gonzo dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 18/12/2002, 17h49
  5. Concerne les graphes
    Par mcr dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 12/11/2002, 11h02

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