Message d'erreur

Signaler
Messages postés
82
Date d'inscription
vendredi 20 mai 2005
Statut
Membre
Dernière intervention
24 octobre 2005
-
Messages postés
82
Date d'inscription
vendredi 20 mai 2005
Statut
Membre
Dernière intervention
24 octobre 2005
-
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

Messages postés
15140
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
24 septembre 2021
99
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...
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
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!!!
Messages postés
82
Date d'inscription
vendredi 20 mai 2005
Statut
Membre
Dernière intervention
24 octobre 2005

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();

};
Messages postés
15140
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
24 septembre 2021
99
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...
Messages postés
15140
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
24 septembre 2021
99
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...
Messages postés
82
Date d'inscription
vendredi 20 mai 2005
Statut
Membre
Dernière intervention
24 octobre 2005

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??
Messages postés
82
Date d'inscription
vendredi 20 mai 2005
Statut
Membre
Dernière intervention
24 octobre 2005

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)
Messages postés
15140
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
24 septembre 2021
99
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...
Messages postés
82
Date d'inscription
vendredi 20 mai 2005
Statut
Membre
Dernière intervention
24 octobre 2005

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??
Messages postés
15140
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
24 septembre 2021
99
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...
Messages postés
15140
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
24 septembre 2021
99
[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...
Messages postés
82
Date d'inscription
vendredi 20 mai 2005
Statut
Membre
Dernière intervention
24 octobre 2005

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??
Messages postés
15140
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
24 septembre 2021
99
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...
Messages postés
82
Date d'inscription
vendredi 20 mai 2005
Statut
Membre
Dernière intervention
24 octobre 2005

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).
Messages postés
82
Date d'inscription
vendredi 20 mai 2005
Statut
Membre
Dernière intervention
24 octobre 2005

ta proposition marche trés bien buno merci.
Messages postés
15140
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
24 septembre 2021
99
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...
Messages postés
82
Date d'inscription
vendredi 20 mai 2005
Statut
Membre
Dernière intervention
24 octobre 2005

ce n'est pas encore fini!!
ci ca te derange pas je pose une autre question??
Messages postés
15140
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
24 septembre 2021
99
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...
Messages postés
82
Date d'inscription
vendredi 20 mai 2005
Statut
Membre
Dernière intervention
24 octobre 2005

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??
Messages postés
15140
Date d'inscription
lundi 11 juillet 2005
Statut
Modérateur
Dernière intervention
24 septembre 2021
99
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...