Probleme de new, tableau, * , ou & ?

Probleme de new, tableau, * , ou & ? - C++ - Programmation

Marsh Posté le 19-03-2004 à 22:08:28    

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 :
  1. //**************************************************************************  
  2.   int getNbreVert(); //  return nbreVert  
  3.   void setNbreVert(int nbre);  
  4.   float distanceE(Vertex* ori, Vertex* extrem);  
  5.   void placementLigne (char * filename , int l); // pointer sur une ligne  
  6.   void Read_Graph (char *filename,AdjList& G,HashTable& T,int is_nondirectional);  
  7.   int  Get_Source(HashTable& T);  
  8.   void Read_Dest (int source, Vertex *V, AdjList& G, HashTable& T);  
  9.   //**************************************************************************  
  10.   int vert ;  
  11.   char * fichiergraphe;  
  12.   //**************************************************************************  
  13.    
  14.   int main (int argc, char *argv[])  
  15.   {  
  16.    if (argc != 2)  
  17.    {  
  18.     cerr << "Syntax: " << argv[0] << " <graph-file>" << endl;  
  19.     exit(-1);  
  20.    }  
  21.      
  22.    HashTable T(SIZE); // Hash Table for Vertices  
  23.    AdjList   G(SIZE); // Graph as an Adjency List representation  
  24.      
  25.    if (IS_NONDIRECTIONAL)  
  26.       cout << "Reading NON-DIRECTIONAL Graph..." << endl;  
  27.    else  
  28.       cout << "Reading DIRECTIONAL Graph (digraph)..." << endl;  
  29.      
  30.    fichiergraphe = argv[1];  
  31.      
  32.    Read_Graph(fichiergraphe,G,T,IS_NONDIRECTIONAL);  // Read the Graph  
  33.      
  34.    int edges = G.no_of_edges();  
  35.      
  36.    ........  
  37.      
  38.    cout << endl << endl;  
  39.    cout << "EOF character pressed ! Exiting.............." << endl;  
  40.   }  
  41.    
  42.    
  43.   // *************************************************************************  
  44.   int getNbreVert () {   return vert; }  
  45.   void setNbreVert(int nbre) {   vert = nbre; }  
  46.   //**************************************************************************  
  47.    
  48.   void Read_Graph (char *filename,AdjList& G,HashTable& T,int is_nondirectional)  
  49.   {  
  50.    ifstream inp(filename);  
  51.    char buf[BUF_SIZE];  
  52.      
  53.    int etiq, degre;  
  54.    float x,y;  
  55.      
  56.    if (!inp)  
  57.    {  
  58.     cerr << "Invalid filename \"" << filename << "\" !!" << endl;  
  59.     cerr << "Exiting........." << endl;  
  60.     exit(-1);  
  61.    }  
  62.      
  63.      
  64.    if (inp.getline(buf,BUF_SIZE) && inp.good()) {  
  65.     cout << "NBRE DE POINTS = " << buf << endl;  
  66.     setNbreVert(atoi(buf));  
  67.    } // recupérer nombre de vert  
  68.      
  69.      
  70.    // on va y stocker nos vertex , avec le min d'infos  
  71.      
  72.    // MERDE  
  73.    Vertex *tabVertex = new Vertex[getNbreVert()];  
  74.      
  75.    // on est à la 2nd ligne  
  76.      
  77.    for (int ligne=0 ; ligne < getNbreVert() ; ligne++) {  
  78.      
  79.     for ( int i=0 ; i<4 ; i++) {  
  80.      inp.getline(buf,BUF_SIZE);  
  81.      switch(i) {  
  82.       case 0: etiq = atoi(buf); break;  
  83.       case 1: degre = atoi(buf); break;  
  84.       case 2: x = atof(buf); break;  
  85.       case 3: y = atof(buf); break;  
  86.      }  
  87.        
  88.     }  
  89.     cout << "Sommet="<< etiq << " degre=" << degre << " x=" << x << " y=" << y << endl;  
  90.      
  91.     // MERDE  
  92.     tabVertex[ligne] = new Vertex ( etiq , degre, x,y );   
  93.      
  94.    }  
  95.      
  96.    /* là on est dans la 2nd partie,  
  97.    où on doit récupérer l'étiquette des voisins de chaque sommet  
  98.    */
  99.    
  100.    int vertB; 
  101.    for (int i=0 ; i<getNbreVert() ; i++) {
  102.      
  103.       inp.getline(buf,BUF_SIZE);
  104.       degre = atoi ( buf); // on recupere le degre du sommet i  
  105.       cout << "Sommet i=" << i << " de degre=" << degre << endl;
  106.      
  107.       for (int j=0 ; j<degre ; j++) {
  108.          
  109.          inp.getline(buf,BUF_SIZE);
  110.          vertB = atoi(buf);
  111.          cout << "  => voisin" << (j+1) << " = " << vertB << endl;
  112.          
  113.          // MERDE  GRAVE  
  114.          G.add_edge( i,  vertB, distanceE(tabVertex[i], tabVertex[vertB]));
  115.          
  116.          
  117.          //cout << "TEST !!! tabVertex[i].getAbscisse()=" << tabVertex[i].getAbscisse()  << endl;  
  118.          
  119.          // MERDE  
  120.          cout << "distance entre [" << i <<";" << vertB <<"]=" << distanceE(tabVertex[i],tabVertex[vertB]) << endl;
  121.          
  122.          // on zap (pour l'instant?) les 3 autres lignes concernant vertB: degre, X,Y  
  123.          for (int k=0 ; k<3 ; k++)
  124.           inp.getline(buf,BUF_SIZE);
  125.          
  126.       }
  127.      
  128.    }
  129.    
  130.    return;
  131.   }
  132.  
  133.   // MERDE  
  134.   float distanceE(Vertex* ori, Vertex* extrem)
  135.   {
  136.      float X = ori->getAbscisse() - extrem->getAbscisse();
  137.      //cout << "X=" << X << endl;  
  138.      float Y = ori->getOrdonnee() - extrem->getOrdonnee();
  139.      //cout << "Y=" << Y << endl;  
  140.      float distanceEuclidienne = sqrt(pow(fabsf(X),2)+pow(fabsf(Y),2));
  141.      return distanceEuclidienne;
  142.   }
  143.   //**************************************************************************  
  144.   int Get_Source(HashTable& T){int source;char buf[BUF_SIZE];return source;}  
  145.   //**************************************************************************  
  146.   void Read_Dest (int source, Vertex *V, AdjList& G, HashTable& T){char buf[BUF_SIZE];}  
  147.   //**************************************************************************


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

Marsh Posté le 19-03-2004 à 22:08:28   

Reply

Marsh Posté le 19-03-2004 à 22:10:19    

Citation :

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 te parait bon aux niveaux des types là ? c'est quoi tabVertex[ligne]? c'est quoi new Vertex ( etiq , degre, x,y ) ?

Reply

Marsh Posté le 19-03-2004 à 22:20:06    

tabVertex je veux que ce soit un tableau de Vertex
à chaque ligne je veux y mettre des Vertex
avec le new .. j'instancie vertex, et cette instance je la mets dans le tableau à la ligne qu'il faut
mais je vois pas l'erreur !! vraiment pas !!
please, le compilateur m'aide pas trop sur ce coup là

Reply

Marsh Posté le 19-03-2004 à 22:21:15    

moi je te demande : d'après toi, c'est quoi le type de  tabVertex[ligne] ?

Reply

Marsh Posté le 19-03-2004 à 22:23:09    

eh bien  
le type doit être  Vertex
non?

Reply

Marsh Posté le 19-03-2004 à 22:24:35    

oui. donc t'as bien ce qu'il te faut, qu'est-ce qui ne prends de faire un new ?

Reply

Marsh Posté le 19-03-2004 à 22:29:15    

mais il ne faut pas instancier Vertex , avant de stocker dans le tableau ?
le new vertex, je le mettais pour réellment 'créer' un sommet avec ses attributs
et ensuite je voulais le sauvegarder dns le tableau
 
mais qu'est-ce que tu me dis de faire alors ?
Vertex *tabVertex = new Vertex[getNbreVert()]; // c ok
 
tabVertex[ligne] = Vertex ( etiq , degre, x,y ); // c ce kil fo faire?
hmmm c bizarre cette écriture m'parle pas du tout
j'me dis ke sans le 'new' pas d'instanciation
je suis alors complètement dans le faux ?

Reply

Marsh Posté le 19-03-2004 à 22:31:08    

mais quand tu fais  Vexter[n] et bien tu crées/instancies n Vertex construit ave leur constructeur par défaut
 
après si tu fais tab[i] =Vertex(machin); tu crées un nouveau vertex temporaire qui recopié dans tab[i]. et voilà. point de new.

Reply

Marsh Posté le 19-03-2004 à 22:31:32    

souljah a écrit :


j'me dis ke sans le 'new' pas d'instanciation
je suis alors complètement dans le faux ?

t'as complètement faux. Java ?

Reply

Marsh Posté le 19-03-2004 à 22:33:56    

Java ...oui....bien vu...

Reply

Marsh Posté le 19-03-2004 à 22:33:56   

Reply

Marsh Posté le 19-03-2004 à 22:35:26    

j'm'en vais tester ça tt de suite
j'ai presque du mal à le croire,
 2 jours que j'étais sur ces erreurs...

Reply

Marsh Posté le 19-03-2004 à 23:33:07    

ben écoute, fais donc

Reply

Marsh Posté le 19-03-2004 à 23:40:00    

j'ai ceci comme erreur
main.cc: In function `void Read_Graph(char*, AdjList&, HashTable&, int)':
main.cc:186: error: no match for 'operator=' in '*(tabVertex + (+(ligne * 28))) = Vertex(etiq, degre, x, y)'
vertex.h:61: error: candidates are: void Vertex::operator=(Vertex& )
main.cc:239: error: cannot convert `Vertex' to `Vertex*' for argument `1' to `float distanceE(Vertex*, Vertex*)'
main.cc:242: error: cannot convert `Vertex' to `Vertex*' for argument `1' to `float distanceE(Vertex*, Vertex*)'
make: *** [main.o] Erreur 1
 
apparemment il va chercher un operateur = redefini dans Vertex.h
 
 
--
void operator =(Vertex& b) {
= b.name;
parent = b.parent;
distance = b.distance;
degre = b.degre;
x=b.x;
y=b.y;
};
--
 
 
que penses tu de ces lignes ?
Vertex **tabVertex = new Vertex*[getNbreVert()];  
tabVertex[ligne] = new Vertex ( etiq , degre, x,y );  
 
ou alors je dois retirer la redefinition de l'operator =

Reply

Marsh Posté le 19-03-2004 à 23:43:53    

n'importe quoi
 

Code :
  1. Vertex & operator= (const Vextex &other)
  2. {
  3.   if( this != &other)
  4.   {
  5.     recopie membre à membre
  6.   }
  7.   return *this;
  8. }


 
cela dit si ton operator= est simple, c'est à dire shallow copie, c'est à dire copie membre à membre (sans suivre les pointeurs), lo'opérateur d'affectation que synthétise le compilateur conviendra parfaitement, donc rien besoin d'écrire du tout)

Reply

Marsh Posté le 19-03-2004 à 23:44:45    

Vertex **tabVertex = new Vertex*[getNbreVert()];  
tabVertex[ligne] = new Vertex ( etiq , degre, x,y );  
 
 
c bon mais ça n'a aucun intéret
 
 
Vexter *tab =  new Vertex[n]; est très bien
 
 
et utilise std::vector<> tant qu'àf aire

Reply

Marsh Posté le 19-03-2004 à 23:45:37    

Vertex **tabVertex = new Vertex*[getNbreVert()];  
tabVertex[ligne] = new Vertex ( etiq , degre, x,y );  
 
ça compile, ça calcule bien la distance, ça bloque juste au moment où il faut ajouter les arètes
G.add_Edge(...)
 
mais  ta methode semble meilleure et plus simple, mais ça bloque à la compile
tu vois ce ke je peux encore arranger pour ke ça compile ?

Reply

Marsh Posté le 19-03-2004 à 23:49:12    

non, ça bloque pas. écoute un problème à la fois, d'accord. arrete tes conneries avec les pointeurs.
 
tu mets un  
 
#include <vector>  
 
dén début de fichier
 
et après tu fais
 
std::vector<Vertex> tab( getNbreVert() );
 
et hop t'as un vecteur à la java, tu t'en sers comme d'un tableau, avec l'opérateur []
 
tab[i] = machin
tab[j].action();
 
et plus besoin de gérer la mémoire.
 
si t'as peur de déconner, au lieu d'utiliser [], tu peux utiliser at qui fait une vérification
 
tab.at(i) = machin
tab.at(j).Action()

Reply

Marsh Posté le 19-03-2004 à 23:49:15    

std::vector<> je l'utilise où et comment ?
il sert à koi dans le code ? àla place de koi ?

Reply

Marsh Posté le 19-03-2004 à 23:50:14    

ah ! ok je comprends mieux !
je v tester !

Reply

Marsh Posté le 19-03-2004 à 23:50:41    

MERCI POUR TON AIDE !

Reply

Marsh Posté le 19-03-2004 à 23:51:27    

bon je te lache pas tant que que ça marche pas

Reply

Marsh Posté le 19-03-2004 à 23:52:29    

mais là je dois aller dormir !
donc demain je m'y remets à fond !

Reply

Marsh Posté le 19-03-2004 à 23:53:16    

non, tu finis et après tu peux regarder le dernier épisode de Dune :o

Reply

Marsh Posté le 20-03-2004 à 02:42:59    

erf c'etait le dernier ?  :cry:


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 20-03-2004 à 07:59:19    

heu...g pas de tv...j'sais même pas c koi Dune...
il est 8h, j'ai +/- dormi, mais j'v tester ça now!
merci les gars!

Reply

Marsh Posté le 20-03-2004 à 08:18:52    

#include <vector>
 
std::vector<Vertex> tabVertex( getNbreVert() );
tabVertex.at(ligne) = Vertex ( etiq , degre, x,y );
// le Action() c l'action ke je veux je suppose, c pas une  methode de vector on dirait , enfin g testé a tt hasard :)
 
pour le calcul de la distance j'ai rajouté des &
distanceE(&tabVertex[i],&tabVertex[vertB]);
et ça marche !
 
ça plante au  G.add_Edge
 
...
Sommet=7 degre=3 x=0.851018 y=0.740699
Sommet=8 degre=1 x=0.29446 y=0.487999
Sommet=9 degre=2 x=0.0131403 y=0.303363
Sommet i=0 de degre=5
  => voisin1 = 1
Segmentation fault
 
j regarde d'koi il en retourne

Reply

Marsh Posté le 20-03-2004 à 12:14:36    

1) arrete tout de suite les pointeurs !
2) sinon je vais arrêter là avec toi, par ce que les "// le Action() c l'action ke je veux je suppose, c pas une  methode de vector on dirait , enfin g testé a tt hasard" ça me dit que je perds un peu mon temps

Reply

Marsh Posté le 20-03-2004 à 12:36:43    

Si ca peut aider...

Code :
  1. float distanceE( const Vertex & ori, const Vertex & extrem) 
  2. float X = ori.getAbscisse() - extrem.getAbscisse(); 
  3. float Y = ori.getOrdonnee() - extrem.getOrdonnee(); 
  4. float distanceEuclidienne = sqrt(pow(fabsf(X),2)+pow(fabsf(Y),2)); 
  5. return distanceEuclidienne; 
  6. }


et  

Code :
  1. distanceE( tabVertex.at(i), tabVertex.at(vertB) );


D'ailleurs, distanceE devrait etre friend de Vertex non ?
 
Cordialement,
   xter.

Reply

Marsh Posté le 20-03-2004 à 12:38:04    

non.
 
 
et puis elle devrait être operator- :P

Reply

Marsh Posté le 20-03-2004 à 12:43:44    

pas bete ! ;)

Reply

Marsh Posté le 20-03-2004 à 12:54:06    

Taz a écrit :

non, tu finis et après tu peux regarder le dernier épisode de Dune :o


 
putain merde je l'ai loupé  :cry:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed