imanedaoudi
Messages postés82Date d'inscriptionvendredi 20 mai 2005StatutMembreDernière intervention24 octobre 2005
-
15 sept. 2005 à 12:39
imanedaoudi
Messages postés82Date d'inscriptionvendredi 20 mai 2005StatutMembreDernière intervention24 octobre 2005
-
16 sept. 2005 à 16:02
Salut tous le monde,
j'ai le fonction suivante
[cpp]
vecteur* vecteur:: readvecteur(int *nbrev,char *fichier)
{
int i=0,cp=0,j=0;
float value,val1,val2;
ifstream Al;
std::vector<vecteur>vect(50);
Al.open("fichier.txt");
while (i <(100*d) ) // *2 ici car on va lire x et y
{
Al >> value;
val1=value;
Al >> value;
val2=value;
vect[cp].x=val1;
vect[cp].y=val2;
vect[cp].id=compt++;
cp++;
i=i+d;
}
(*nbrev)=cp;
Al.close();
return vect;
}/cpp avec la class vecteur:
[cpp]
class vecteur
{
public :
};
/cpp le message d'erreur:
error C2440: 'return' : cannot convert from 'class std::vector<class vecteur,class std::allocator<class vecteur> >' to 'class vecteur *'
comment je peux résoudre ce problème?
Merci pour toutes proposition
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDernière intervention 6 février 2013 15 sept. 2005 à 14:40
Tu dois declarer vect en tant que pointeur de vecteur.
Sinon a part ca je te déconseille vivement de continuer dans cette vois.
Une fonctiion qui renvoie un pointeur, doit renvoyer un pointeur sur une variable globale (dans ton cas elle doit etre globale a ta classe).
Toi tu renvoies le pointeur d'une variable locale a ta fonction, tout en sachant qu'a la fin de ta fonction ton pointeur sera detruit.
Tu n'es donc plus dans la certitude de renvoyer un pointeur valide.
NE JAMAIS CREER DES FONCTIONS QUI RENVOI DES POINTEURS PROPRE A LA FONCTION!!!
imanedaoudi
Messages postés82Date d'inscriptionvendredi 20 mai 2005StatutMembreDernière intervention24 octobre 2005 15 sept. 2005 à 17:41
ci j'ai bien compris ta remarque je faire comme ca:
vecteur* vecteur:: readvecteur(int *nbrev,char *fichier)
{
int i=0,cp=0,j=0;
float value,val1,val2;
ifstream Al;
vecteur *vect;
vect=new vecteur[500];
Al.open("fichier.txt");
while (i <(100*d) ) //
{
Al >> value;
val1=value;
Al >> value;
val2=value;
vect[cp].x=val1;
vect[cp].y=val2;
vect[cp].id=compt++;
cp++;
i=i+d;
}
(*nbrev)=cp;
data=vect;
Al.close();
return vect;
}
avec la class vecteur:
BunoCS
Messages postés15472Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention25 mars 2024103 15 sept. 2005 à 18:08
Du coup, tu peux enlever:
- vecteur *vect;
- return vect;
Ah oui! Il vaut mieux faire le new en dehors de la fonction...
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
imanedaoudi
Messages postés82Date d'inscriptionvendredi 20 mai 2005StatutMembreDernière intervention24 octobre 2005 15 sept. 2005 à 18:11
merci Buno, .. juste pour rendre les choses un peu clair, l'allocation de la mémoire
vect=new vecteur[500]; dois se faire à l'extérieur de la fonction non??
imanedaoudi
Messages postés82Date d'inscriptionvendredi 20 mai 2005StatutMembreDernière intervention24 octobre 2005 15 sept. 2005 à 18:26
Et si je met ca est ce que ca pose un problème!!!
En gardant bien sur la meme classe vecteur
vecteur::vecteur(vecteur a,vecteur b,char *fichier)
{
int nb;
data=new vecteur[500];
readvecteur(data,&nb,fichier);
id=nb;
}
et en tenant compte bien sur de ta proposition Buno:
void vecteur:: readvecteur(vecteur *vect,int *nbrev,char *fichier)
BunoCS
Messages postés15472Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention25 mars 2024103 15 sept. 2005 à 19:13
Euh... je viens de réfléchir: si ta fonction readvecteur fais partie de ta classe vecteur, tu n'es pas obligé de retourner un vecteur!!! :)
Donc, je te propose ceci (attention, je n'ai pas testé!!!!!!):
int main(int argc, char ** argv)
{
vecteur vect;
int nb=500;
imanedaoudi
Messages postés82Date d'inscriptionvendredi 20 mai 2005StatutMembreDernière intervention24 octobre 2005 15 sept. 2005 à 20:25
je comprend, mais je ne vois pas ou tu alloue de la memoire pour *data??
je pense que pour realiser ca:
data[cp].x=val1;
data[cp].y=val2;
data[cp].id=compt++;
cp++;
il faut reserver de l'espace mémoire ou est ce que je peux mettre ca pour ne pas avoir de problème??
BunoCS
Messages postés15472Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention25 mars 2024103 15 sept. 2005 à 20:38
[problème: l'editbox ne prend pas mon texte en entier]
Je disais:
constructeur
vecteur::vecteur(int taille)
{
data = new truc[taille];
}
destructeur:
vecteur::~vecteur()
{
delete data;
}
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
imanedaoudi
Messages postés82Date d'inscriptionvendredi 20 mai 2005StatutMembreDernière intervention24 octobre 2005 15 sept. 2005 à 20:48
voila c'est ca ma question!! j'ai pas mis ca dans le constructeur, par contre si je le met dans la fonction read vecteur cela ne posera pas de problèmes non??
BunoCS
Messages postés15472Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention25 mars 2024103 15 sept. 2005 à 20:52
Du coup, dans le constructeur, tu initialise data à NULL, tu fais l'allocation dans readvecteur et tu n'oublie pas le delete dans le destructeur... ça devrait être correct...
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
imanedaoudi
Messages postés82Date d'inscriptionvendredi 20 mai 2005StatutMembreDernière intervention24 octobre 2005 15 sept. 2005 à 20:55
jevais eclaircir un peu plus le probléme, en faite je connais pas la taille exacte de data c'est en lisant les données du fichier que je peux récuperer l taille exacte de mon vecteur data (cp) dans la fonction donc je reserve un espace memoire tres grand(500) puis je calcul la taille exacte de mon vecteur (la fct read vecteur me renvoi la taille de data et le vecteur data).
BunoCS
Messages postés15472Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention25 mars 2024103 15 sept. 2005 à 21:01
Si ma soluce te convient, merci de cliquer sur "réponse acceptée" pour clore le sujet
Bonne prog'
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
imanedaoudi
Messages postés82Date d'inscriptionvendredi 20 mai 2005StatutMembreDernière intervention24 octobre 2005 15 sept. 2005 à 21:12
dans la meme fonction readfile, normalement le connais pas exactement la taille de mes données à lire j'ai mis :
Al.open("fichier.txt");
while (i <(100*d) ) //
{
Al >> value;
val1=value;
Al >> value;
val2=value;
vect[cp].x=val1;
vect[cp].y=val2;
vect[cp].id=compt++;
cp++;
i=i+d;
}
la taille (100*d) rien que pour lire un tres grand nombres de valeurs possibles,comment faire alors pour lire tous les donnees du fichier??
BunoCS
Messages postés15472Date d'inscriptionlundi 11 juillet 2005StatutModérateurDernière intervention25 mars 2024103 15 sept. 2005 à 21:26
Je ne connais pas par coeur la classe ifstream mais tu dois avoir une méthode qui te renseignes sur la fin du stream, genre is_empty... et tu boucle tant que cette condition n'est pas vérifiée (c'est-à-dire, tant qu'il y a quelquechose dans ton stream)
Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...