Probleme de new, tableau, * , ou & ? - C++ - Programmation
Marsh Posté le 19-03-2004 à 22:10:19
Citation : je fais |
et ça te parait bon aux niveaux des types là ? c'est quoi tabVertex[ligne]? c'est quoi new Vertex ( etiq , degre, x,y ) ?
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à
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] ?
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 ?
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 ?
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.
Marsh Posté le 19-03-2004 à 22:31:32
souljah a écrit : |
t'as complètement faux. Java ?
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...
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 =
Marsh Posté le 19-03-2004 à 23:43:53
n'importe quoi
Code :
|
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)
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
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 ?
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()
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 ?
Marsh Posté le 19-03-2004 à 23:52:29
mais là je dois aller dormir !
donc demain je m'y remets à fond !
Marsh Posté le 19-03-2004 à 23:53:16
non, tu finis et après tu peux regarder le dernier épisode de Dune
Marsh Posté le 20-03-2004 à 02:42:59
erf c'etait le dernier ?
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!
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
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
Marsh Posté le 20-03-2004 à 12:36:43
Si ca peut aider...
Code :
|
et
Code :
|
D'ailleurs, distanceE devrait etre friend de Vertex non ?
Cordialement,
xter.
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 |
putain merde je l'ai loupé
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 :
///////////////////////////
//////////////////////////
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(..)