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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

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