Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : tableau [ Archives / Au secours ] (infodaoudi)

vendredi 12 mai 2006 à 19:00:12 | tableau

infodaoudi

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

vendredi 12 mai 2006 à 19:06:52 | Re : tableau

SAKingdom

Membre Club
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


vendredi 12 mai 2006 à 19:10:55 | Re : tableau

SAKingdom

Membre Club
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


samedi 13 mai 2006 à 01:02:27 | Re : tableau

ymca2003

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.


samedi 13 mai 2006 à 10:44:06 | Re : tableau

infodaoudi

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?

samedi 13 mai 2006 à 10:58:25 | Re : tableau

infodaoudi

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

samedi 13 mai 2006 à 11:13:20 | Re : tableau

ymca2003

Réponse acceptée !
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;
}


samedi 13 mai 2006 à 11:15:27 | Re : tableau

ymca2003

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.

samedi 13 mai 2006 à 11:34:03 | Re : tableau

infodaoudi

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

samedi 13 mai 2006 à 11:49:00 | Re : tableau

ymca2003

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)


1 2

Cette discussion est classé dans : data, tableau, vecteur, al, lp


Répondre à ce message

Sujets en rapport avec ce message

fseek en c++ [ par imanedaoudi ] Bonjour, je cherche l'equivalent de fseek en c++, j'ai utilise la fonction suivante: vecteur* RegionApprox:: readvecteur(char *fichier,int *taille) { fichier [ par imanedaoudi ] Bonjour, comment detecter la fin du fichier en c++, je cherche à executer l' instruction (*taille=cp)une fois je detecte la fin du fichier vecteur* R Problème pour l'utilisation d'un constructeur de recopie [ par vincemail ] Bonsoir à tous, j'ai un petit problème concernant le constructeur de recopie d'une classe, ou plutot son utilisation. Voilà, je crée une classe Vecteu Convertir un tableau de vecteur de String en pointeur [ par fcoutel ] Bonjour, J'ai cree un tableau dynamique a 2D de type string vector> tab,  je voudrais savoir quel est le meilleur moyen de le convertir en char***.M Classe contenant vecteur template [ par val3113 ] Bonjour,Je suis sur un programme cpp sous linux. J'ai créé une classe template "Vecteur" qui est censée pouvoir recevoir plusieurs types dont des clas tableau/ vecteur [ par moberol ] Bonjour à tous !je suis debutant en C++, si quelqu'un peux me donner une idée;soit le fichier ci dessous,Module A   (....)intput 2;output <font size tableau des caractere en C [ par themahg ] ThemahG, Japon toujours! j'ai un problème avec mon programme il bloque à partir de la fonction si dessous:ai message d'erreur [ par imanedaoudi ] 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 fonction qui retourne un vecteur en C/C++ [ par rocketcariboo ] Je voudrais savoir comment on fait une fonction qui prend un tableau et qui retourne un autre tableau. Quelle est la façon la plus simple. Je sais qu' stockage avec vecteur ou tableau [ par moberol ] Bonjour à tous!si quelqu'un peux  m'aider....je dois réaliser une structure de donnée pour mémoriser(stocké) mots identiques qui se répète tout le lon


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,281 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.