View Single Post
  #1  
Old 19-03-2004, 22:12
souljah souljah is offline
Membre junior
 
Join Date: 19-03-2004
Posts: 8
Probleme de new, tableau, * , ou & ?

Probleme de new, tableau, * , ou & ?

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(..)
Reply With Quote