souljah | bonjour j'ai un programme qui doit calculer les + courts chemins entre 1pt et 1 autre pt d'un graphe.
ce graphe est modélisé dans un fichier texte que je place en paramètre quand je lance le programme.
le parcours du fichier , et la récupération (l'affichage) des données se passe très bien
ça coince quand je veux stocker tt ça dans un tableau
précisément un tableau de Vertex (sommets)
je fais
Vertex *tabVertex = new Vertex[getNbreVert()];
et ensuite après chaque bloc d'information concernant chaque sommet
je fais
tabVertex[ligne] = new Vertex ( etiq , degre, x,y ); et ça provoque une erreur de pointeur
je ne comprends pas pkoi, qq1 peut me dire ce qu'il manque pour que ça fonctionne svp?
ensuite , ya 2 ou 3 autres endroits où des erreurs du même genre sont lancées, j'ai mis : // MERDE pour les marquer mais déjà si vous pouvez m'expliquer pourquoi la ligne du dessus marche pas , je pourrai ptêtre me débrouiller pour le reste.
voici en partie le code du main, je mets des liens pour le code complet à la fin du post :
///////////////////////////
Code :
- //**************************************************************************
- int getNbreVert(); // return nbreVert
- void setNbreVert(int nbre);
- float distanceE(Vertex* ori, Vertex* extrem);
- void placementLigne (char * filename , int l); // pointer sur une ligne
- void Read_Graph (char *filename,AdjList& G,HashTable& T,int is_nondirectional);
- int Get_Source(HashTable& T);
- void Read_Dest (int source, Vertex *V, AdjList& G, HashTable& T);
- //**************************************************************************
- int vert ;
- char * fichiergraphe;
- //**************************************************************************
-
- int main (int argc, char *argv[])
- {
- if (argc != 2)
- {
- cerr << "Syntax: " << argv[0] << " <graph-file>" << endl;
- exit(-1);
- }
-
- HashTable T(SIZE); // Hash Table for Vertices
- AdjList G(SIZE); // Graph as an Adjency List representation
-
- if (IS_NONDIRECTIONAL)
- cout << "Reading NON-DIRECTIONAL Graph..." << endl;
- else
- cout << "Reading DIRECTIONAL Graph (digraph)..." << endl;
-
- fichiergraphe = argv[1];
-
- Read_Graph(fichiergraphe,G,T,IS_NONDIRECTIONAL); // Read the Graph
-
- int edges = G.no_of_edges();
-
- ........
-
- cout << endl << endl;
- cout << "EOF character pressed ! Exiting.............." << endl;
- }
-
-
- // *************************************************************************
- int getNbreVert () { return vert; }
- void setNbreVert(int nbre) { vert = nbre; }
- //**************************************************************************
-
- void Read_Graph (char *filename,AdjList& G,HashTable& T,int is_nondirectional)
- {
- ifstream inp(filename);
- char buf[BUF_SIZE];
-
- int etiq, degre;
- float x,y;
-
- if (!inp)
- {
- cerr << "Invalid filename \"" << filename << "\" !!" << endl;
- cerr << "Exiting........." << endl;
- exit(-1);
- }
-
-
- if (inp.getline(buf,BUF_SIZE) && inp.good()) {
- cout << "NBRE DE POINTS = " << buf << endl;
- setNbreVert(atoi(buf));
- } // recupérer nombre de vert
-
-
- // on va y stocker nos vertex , avec le min d'infos
-
- // MERDE
- Vertex *tabVertex = new Vertex[getNbreVert()];
-
- // on est à la 2nd ligne
-
- for (int ligne=0 ; ligne < getNbreVert() ; ligne++) {
-
- for ( int i=0 ; i<4 ; i++) {
- inp.getline(buf,BUF_SIZE);
- switch(i) {
- case 0: etiq = atoi(buf); break;
- case 1: degre = atoi(buf); break;
- case 2: x = atof(buf); break;
- case 3: y = atof(buf); break;
- }
-
- }
- cout << "Sommet="<< etiq << " degre=" << degre << " x=" << x << " y=" << y << endl;
-
- // MERDE
- tabVertex[ligne] = new Vertex ( etiq , degre, x,y );
-
- }
-
- /* là on est dans la 2nd partie,
- où on doit récupérer l'étiquette des voisins de chaque sommet
- */
-
- int vertB;
- for (int i=0 ; i<getNbreVert() ; i++) {
-
- inp.getline(buf,BUF_SIZE);
- degre = atoi ( buf); // on recupere le degre du sommet i
- cout << "Sommet i=" << i << " de degre=" << degre << endl;
-
- for (int j=0 ; j<degre ; j++) {
-
- inp.getline(buf,BUF_SIZE);
- vertB = atoi(buf);
- cout << " => voisin" << (j+1) << " = " << vertB << endl;
-
- // MERDE GRAVE
- G.add_edge( i, vertB, distanceE(tabVertex[i], tabVertex[vertB]));
-
-
- //cout << "TEST !!! tabVertex[i].getAbscisse()=" << tabVertex[i].getAbscisse() << endl;
-
- // MERDE
- cout << "distance entre [" << i <<";" << vertB <<"]=" << distanceE(tabVertex[i],tabVertex[vertB]) << endl;
-
- // on zap (pour l'instant?) les 3 autres lignes concernant vertB: degre, X,Y
- for (int k=0 ; k<3 ; k++)
- inp.getline(buf,BUF_SIZE);
-
- }
-
- }
-
- return;
- }
-
- // MERDE
- float distanceE(Vertex* ori, Vertex* extrem)
- {
- float X = ori->getAbscisse() - extrem->getAbscisse();
- //cout << "X=" << X << endl;
- float Y = ori->getOrdonnee() - extrem->getOrdonnee();
- //cout << "Y=" << Y << endl;
- float distanceEuclidienne = sqrt(pow(fabsf(X),2)+pow(fabsf(Y),2));
- return distanceEuclidienne;
- }
- //**************************************************************************
- int Get_Source(HashTable& T){int source;char buf[BUF_SIZE];return source;}
- //**************************************************************************
- void Read_Dest (int source, Vertex *V, AdjList& G, HashTable& T){char buf[BUF_SIZE];}
- //**************************************************************************
|
//////////////////////////
voici le code de http://small.axe.free.fr/graphe/
et principalement
http://small.axe.free.fr/graphe/main.cc
http://small.axe.free.fr/graphe/vertex.h
http://small.axe.free.fr/graphe/adjlist.cc // je l'utilise pour ajouter les arètes : G.add_edge(..)
|