Tableau

Résolu
infodaoudi Messages postés 117 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 30 mars 2012 - 12 mai 2006 à 19:00
infodaoudi Messages postés 117 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 30 mars 2012 - 13 mai 2006 à 11:55
bonjour,
je veux récupérer le tableau *data à l'exterieure de la fonction readvecteur, comment faire sans utiliser return. Quelqu'un à une idée?
merci d'avance

void base:: readvecteur(char *fichier, int *t,vecteur *data)
{
int cp=0,lp=0;
float val1;
ifstream Al;
//vecteur *data;

data=new vecteur[500];

Al.open(fichier);
if(!Al)cout<<"error opening fichier"<<endl;

while (Al)
{
for(int i=0;i<d;i++)
{
Al>>val1;
data[lp].coord[i]=val1;
}
lp++;
}

Al.close();
*t=lp;

//return data;
}

10 réponses

ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
13 mai 2006 à 11:13
si tu prend cette methode :
void base:: readvecteur(char *fichier, int *t,vecteur **data)
= > pointeur
au lieu de la mienne :
void base:: readvecteur(char *fichier, int *t,vecteur* &data)
=> reference

il y a une indirection de plus à faire :

void base:: readvecteur(char *fichier, int *t,vecteur * * data)
{
int cp =0,lp= 0;
float val1;
ifstream Al;
//vecteur *data;

*data =new vecteur[500];

Al.open(fichier);
if(!Al)cout<<"error opening fichier"<<endl;

while (Al)
{
for(int i= 0;i<d;i++)
{
Al>>val1;
(*data) [lp].coord[i] =val1;
}
lp++;
}

Al.close();
*t=lp;

//return data;
}

====================================================
il y a 3 methodes pour ce que tu veux faire :

1) garder la fct initiale mais faire l'allocation en dehors de la fonction
=> le code est identique au post initial mais sans l'alloc dans la fct
void base:: readvecteur(char *fichier, int *t,vecteur *data)
main()
{
int taille = 0;
vecteur *data = NULL;
data=new vecteur[500];
base::readvecteur(fich, &taille, data);
}

2) faire l'allocation dans la fonction et utiliser une ref sur un pointeur.
=> le code est identique au post initial
void base:: readvecteur(char *fichier, int *t,vecteur * &data)
main()
{
int taille = 0;
vecteur *data = NULL;
base::readvecteur(fich, &taille, data);
delete[] data;
}

3) faire l'allocation dans la fonction et utiliser un pointeur sur un pointeur.
=> le code est celui de cette réponse
void base:: readvecteur(char *fichier, int *t,vecteur * *data)
main()
{
int taille = 0;
vecteur *data = NULL;
base::readvecteur(fich, &taille, &data);
delete[] data;
}
3
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
12 mai 2006 à 19:06
data=new vecteur[500];

Pourquoi tu alloue de la mémoire à data. D'habitude, si c'est un param, on alloue la mémoire pour le param avant l'appelle de la fonction.

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
12 mai 2006 à 19:10
Ensuite pour allouer quelque chose à une structure on fait ceci:

void test (verteur *data)
{
data->membre = 150; // par exemple
}

voilà. Pas de return.

___________________________________________
Les plus grands esprits trouvent toujours une solution
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
13 mai 2006 à 01:02
void base:: readvecteur(char *fichier, int *t,vecteur* &data);

passer une ref sur le ptr ermet de récupérer la nouvelle valeur du ptr.


mais vu que tu fait une allocation dynamique fixe (la taille ne dépend pas de ce que tu vas lire dans le fichier), tu pourrais auusi bien faire l'alocation à l'extérieure de la fonction.


Petiit pb : i ton fichier ne peut pas être ouvert, tu sautes bien la boucle mais tu me fermes quand même.
0

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

Posez votre question
infodaoudi Messages postés 117 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 30 mars 2012
13 mai 2006 à 10:44
j'ai fait la solution suivante :

main()
{
vecteur *data;
data=new vecteur[500];
base::readvecteur(fich,&taille,&dataN);
}


void base:: readvecteur(char *fichier, int *t,vecteur **data)
{
int cp=0,lp=0;
float val1;
ifstream Al;

Al.open(fichier);
if(!Al)cout<<"error opening fichier"<<endl;

while (Al)
{
for(int i=0;i<d;i++)
{
Al>>val1;
data[lp]->coord[i]=val1; // ca se plante ici............??
}
lp++;
}

Al.close();
*t=lp;

//return data;
}

probleme : probléme d'allocation .pourquoi?
0
infodaoudi Messages postés 117 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 30 mars 2012
13 mai 2006 à 10:58
une autre question? si je veux que la taille tu tableau data depend de ce que je lis du fichier comment faire ????
merci pour toutes vos propositions
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
13 mai 2006 à 11:15
pour que l'alloc dépend du fichier il faut soit :
1) que la taille soit dans le fichier
2) faire une alloc initiale par malloc, puis augmenter la taille au fur et à mesure avec realloc. Libérer par free.
0
infodaoudi Messages postés 117 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 30 mars 2012
13 mai 2006 à 11:34
Merci bcp ymca2003, c'est une réponse trés compléte, juste une précision pouvez vous me montrer comment faire pour réaliser ta deuxiémen proposition (malloc, realloc)?
merci
0
ymca2003 Messages postés 2070 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 3 juillet 2006 7
13 mai 2006 à 11:49
bon je mairise pas trop les streams mais voici grosso modo :

data = NULL;
int lp = 0;
while(data_in_file)
{
// alloation ou réallocation
if(data == NULL)
data = (vecteur*)malloc(sizeof(vecteur));
else
data = (vecteur*)realloc(data, (lp+1)sizeof(vecteur));

// lecture
for(int i=0;i<d;i++)
{
Al>>val1;
data[lp].coord[i] = val1;
}
lp++;
}

data_in_file : condition qui te permet de savoir qu'il reste des données dans le fichier (genre fin de fichier)
0
infodaoudi Messages postés 117 Date d'inscription vendredi 10 février 2006 Statut Membre Dernière intervention 30 mars 2012
13 mai 2006 à 11:55
ok ymca2003 c'est comme mm gentil merci
0
Rejoignez-nous