Message d'erreur

imanedaoudi Messages postés 82 Date d'inscription vendredi 20 mai 2005 Statut Membre Dernière intervention 24 octobre 2005 - 15 sept. 2005 à 12:39
imanedaoudi Messages postés 82 Date d'inscription vendredi 20 mai 2005 Statut Membre Dernière intervention 24 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 :


float x,y;
int id;
float reald;

vecteur();
vecteur(const vecteur &p);
vecteur(float a,float b,float c, float d);
virtual ~vecteur();

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

32 réponses

BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
15 sept. 2005 à 14:13
La fonction veut une valeur de retour de type vecteur et toi, tu lui retourne un std::vector.
Un peu de cohérence...

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Derniè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!!!
0
imanedaoudi Messages postés 82 Date d'inscription vendredi 20 mai 2005 Statut Membre Dernière intervention 24 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:

class vecteur
{
public :


float x,y;
int id;
float reald;
vecteur *data;

vecteur();
vecteur(const vecteur &p);
vecteur(float a,float b,float c, float d);
virtual ~vecteur();

};
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
15 sept. 2005 à 18:06
Euh... je réponds avant DeathCrash:


fais plutôt: void vecteur:: readvecteur(vecteur *vect,int *nbrev,char *fichier)

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
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...
0
imanedaoudi Messages postés 82 Date d'inscription vendredi 20 mai 2005 Statut Membre Dernière intervention 24 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??
0
imanedaoudi Messages postés 82 Date d'inscription vendredi 20 mai 2005 Statut Membre Dernière intervention 24 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)
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
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;

vect.readvecteur(&nb,"fichier.txt");
...
return 0;
}

void vecteur::readvecteur(int * nb, char * fichier)
{
int i=0,cp=0,j=0;
float value,val1,val2;
ifstream Al;
Al.open("fichier.txt");
while (i <(100*d) ) //
{
Al >> val1;
Al >> val2;
data[cp].x=val1;
data[cp].y=val2;
data[cp].id=compt++;
cp++;
i=i+d;
}
(*nbrev)=cp;
Al.close();
}

typedef struct
{
float x;
float y;
int id;
} truc;



class vecteur
{
public :


float reald;
truc *data;

vecteur();
vecteur(const vecteur &p);
vecteur(float a,float b,float c, float d);
virtual ~vecteur();

};

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
imanedaoudi Messages postés 82 Date d'inscription vendredi 20 mai 2005 Statut Membre Dernière intervention 24 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??
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
15 sept. 2005 à 20:35
Effectivement, mais j'ai supposé que tu l'avais fait dans le constructeur... ce n'est pas le cas????

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
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...
0
imanedaoudi Messages postés 82 Date d'inscription vendredi 20 mai 2005 Statut Membre Dernière intervention 24 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??
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
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...
0
imanedaoudi Messages postés 82 Date d'inscription vendredi 20 mai 2005 Statut Membre Dernière intervention 24 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).
0
imanedaoudi Messages postés 82 Date d'inscription vendredi 20 mai 2005 Statut Membre Dernière intervention 24 octobre 2005
15 sept. 2005 à 20:58
ta proposition marche trés bien buno merci.
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
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...
0
imanedaoudi Messages postés 82 Date d'inscription vendredi 20 mai 2005 Statut Membre Dernière intervention 24 octobre 2005
15 sept. 2005 à 21:05
ce n'est pas encore fini!!
ci ca te derange pas je pose une autre question??
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
15 sept. 2005 à 21:07
Vas-y, je suis payé pour...euh non...enfin, je suis là pour ça :)

Buno
----------------------------------------
L'urgent est fait, l'impossible est en cours. Pour les miracles, prévoir un délai...
0
imanedaoudi Messages postés 82 Date d'inscription vendredi 20 mai 2005 Statut Membre Dernière intervention 24 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??
0
BunoCS Messages postés 15472 Date d'inscription lundi 11 juillet 2005 Statut Modérateur Dernière intervention 25 mars 2024 103
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...
0
Rejoignez-nous