Récupération de données de taille inconnue dans le main

fatenov Messages postés 16 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 23 novembre 2007 - 23 nov. 2007 à 15:23
nickydaquick Messages postés 416 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 19 décembre 2013 - 5 déc. 2007 à 18:48
Salut tout le monde,


Je veux récupérer dans le main le contenu d'une variable calculée dans un module dans le main, mais le problème est que la taille de cette variable n'et déterminée que dans ce module.


J'ai pensé à  utiliser l'allocation dynamique de la mémoire mais cette allocation est écrasée à la sortie du modula là où elle a été déclarée donc récupère à la sortie mon pointeur vide.


Quelqu'un pourra-t-il me proposer une solution? Je ne veux pas faire une allocation dans le main de taille max ou un tableau statique sauf si c'est la seule solution qui me se présente.


Merci.

13 réponses

Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
23 nov. 2007 à 15:39
Salut,
Il faut passer par l'allocation dynamique:
Dans la fonction tu l'alloues dynamiquement avec la taille qu'il te faut et dans le main tu déclares un pointeur pour recupérer son adresse.
e.g.

int *fonc()
{
   int Taille=50;
   int *Tab=new int[50];

  return Tab
}
int main()
{
  int *MonTab=fonc();
  return 0;
}
A+
Mon site internet : http://pistol.petesampras.free.fr
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
23 nov. 2007 à 15:41
N'oublie pas de faire un delete []MonTab dans le main pour libérer la mémoire utilisé.

Mon site internet : http://pistol.petesampras.free.fr
0
fatenov Messages postés 16 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 23 novembre 2007
23 nov. 2007 à 15:52
Merci, mais c'est une solution dans un cas simple. Mais moi je veux utiliser une precédure (void) pas une fonction car je veux faire cette itération pour plusieurs variables.

Tiens, sauf si ma fonction me retourne un tableau de pointeurs chaque élément pointe sur un tableau ???
Cm cela:

int *fonc()
{
   int *Tab;

   int Taille1=50;
   int Taille2=100;

   int *Tab1=new int[50];
   int *Tab2=new int[100];

  Tab[1]= Tab1;
  Tab[2]=Tab2;

  return Tab ;
}
int main()
{
  int *MonTab=fonc();
  return 0;
}

Est ce une bonne solution?
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
23 nov. 2007 à 16:00
Pourquoi ne pas tout simplement passer une variable out à ta fonction ?
Comme ca tu y mets la taille de l'allocation effectuée.

Pistol_Pete> Au passage il est fortement déconseillé d'effectuer le retour d'une fonction sur un pointeur déclaré au sein de cette fonction.

Shell
0

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

Posez votre question
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
23 nov. 2007 à 16:09
Ok deathcrash 
Cependant, j'utilise souvent cette méthode je la trouve plus pratique et aussi sure que de passer la variable en paramètre. Maintenant au programmeur de savoir ce qu'il fait.

Mon site internet : http://pistol.petesampras.free.fr
0
fatenov Messages postés 16 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 23 novembre 2007
23 nov. 2007 à 16:10
Si je comprends bien ma fonction me retourne la taille de mon tableau?
Mais cela ne va pas résoudre le problème, comment je récupérerai les données que je vais mettre dans le tableau dans le main???

Mais pourquoi il déconseillé de retourner un pointeur?
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
23 nov. 2007 à 16:21
Non mon prog retourne l'adresse vers le tableau et non la taille du tableau.
Donc dans le main tu auras les données mise dans ton tableau.

Et en ce qui concerne le fait de retourné un pointeur ca peut etre dangereux
exemple:

si tu fais: printf("%i", fonc() );

Tu as alloué la mémoire dans fonc() et comment fais tu pour la desalloué?
Tu ne peux plus.

Mon site internet : http://pistol.petesampras.free.fr
0
DeAtHCrAsH Messages postés 2670 Date d'inscription vendredi 25 janvier 2002 Statut Membre Dernière intervention 6 février 2013
23 nov. 2007 à 16:24
Pistol_Pete> "plus pratique et aussi sure " :  J'en suis pas si sure... A la sortie de la fonction le système considère que les variables alloués au sein de ta fonction n'ont plus lieu d'etre, et marque leur espace mémoire comme "libre" pour de nouvelles allocations. En gros tu n'es pas sure d'y trouver ce que tu cherches a la sortie de la fonction car le système peut réaffecter l'emplacement mémoire a n'importe quel moment!

Puis pour info, lorsque l'on code propement à chaque new on ecrit le delete correspondant, meme au sein d'une fonction!

Shell
0
fatenov Messages postés 16 Date d'inscription lundi 8 octobre 2007 Statut Membre Dernière intervention 23 novembre 2007
23 nov. 2007 à 16:25
Pistil_Pete => Oui j'ai bien compris ce que tu voulais faire  Mais je parlai de la proposition de deatchcrash, ben j'aurai du préciser c'était destiné à qui .
0
julienbj Messages postés 452 Date d'inscription jeudi 4 décembre 2003 Statut Membre Dernière intervention 19 décembre 2008 15
23 nov. 2007 à 16:32
[www.agilicom.fr AGILiCOM]
Savon
0
Pistol_Pete Messages postés 1053 Date d'inscription samedi 2 octobre 2004 Statut Membre Dernière intervention 9 juillet 2013 7
23 nov. 2007 à 16:35
Deathcrash> C'est exacte pour les variables statiques déclarées mais par pour les variables dynamiques !!! He heureusement! Sinon à quoi ca sert de faire un delete.

Cependant tu as raison: pour coder proprement, il faudrait un delete dans la meme fonction que le new.

Mon site internet : http://pistol.petesampras.free.fr
0
nickydaquick Messages postés 416 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 19 décembre 2013 3
4 déc. 2007 à 00:57
Salut ,

FateNov ->
nt *fonc()
{
   int *Tab;

   int Taille1=50;
   int Taille2=100;

   int *Tab1=new int[50];
   int *Tab2=new int[100];

  Tab[1]= Tab1;
  Tab[2]=Tab2;

  return Tab ;
}
int main()
{
  int *MonTab=fonc();
  return 0;
}
ne jamais faire ca => crash un pointeur non declare : acces interdit

ce qu'il faut que tu fasses c de passer l'adresse d'un pointeur
exemple

void fonction(void** variable)
{
    char** tab =  (char**)variable;
  *tab = new char[50];
}
void main()
{
    char* tab = 0;
    fonction(&tab);
   if(tab)delete [] tab;
}

mais la il y a encore un souci parce que en c++ c difficile de savoir si c un tableau ou pas , dans ce cas utilise une valeur de retour true pour tableau false sinon.

   j'espere avoir aider , Salut
je suis heureux de faire partie d'une grande famille ...!
0
nickydaquick Messages postés 416 Date d'inscription vendredi 31 janvier 2003 Statut Membre Dernière intervention 19 décembre 2013 3
5 déc. 2007 à 18:48
Bonjour,

Fatenov, ta fonction n'est pas correcte et elle va crasher au  moment de l'execution a 1 endroit (int* Tab n'est pas dirige vers un espace memoire valide, donc ne pointe pas vers une zone de memoire deja allouee). En plus en considerant que tu en alloues tu ne detruis pas la memoire allouee dans cette fonction plus tard dans le main (int* monTab=fonc(); ===> besoin d'un delete [] ).En gros il faudrait savoir si c'est un tableau que la fonction de retourne et sa dimension(uni ou multi-dimensionnel) ou i c'un objet autre qu'un tableau. Ensuite tu pourras detruire de la bonne maniere parce que int* tab new int[50]; si tu fais un delete tab, tu perds 49*4octets; et si tu as int* tab new int; et que tu fais delete[] tab; tu crash le programme.

DeathCrash , tu as raison sur le fait que les variables allouees au sein d'une fonction n'ont plus lieu d'etre sauf lorsque qu'elles sont allouees dynamiquement dans le heap. alors retourner un pointeur sur une memoire dynamiquement allouee est correct.

       J'espere avoir apporte certaines precisions la-dessus, Salut

je suis heureux de faire partie d'une grande famille ...!
0
Rejoignez-nous