Récupération de données de taille inconnue dans le main
fatenov
Messages postés16Date d'inscriptionlundi 8 octobre 2007StatutMembreDernière intervention23 novembre 2007
-
23 nov. 2007 à 15:23
nickydaquick
Messages postés416Date d'inscriptionvendredi 31 janvier 2003StatutMembreDernière intervention19 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.
A voir également:
Récupération de données de taille inconnue dans le main
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 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];
fatenov
Messages postés16Date d'inscriptionlundi 8 octobre 2007StatutMembreDernière intervention23 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;
}
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 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.
fatenov
Messages postés16Date d'inscriptionlundi 8 octobre 2007StatutMembreDernière intervention23 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?
DeAtHCrAsH
Messages postés2670Date d'inscriptionvendredi 25 janvier 2002StatutMembreDerniè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!
fatenov
Messages postés16Date d'inscriptionlundi 8 octobre 2007StatutMembreDernière intervention23 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 .
Pistol_Pete
Messages postés1053Date d'inscriptionsamedi 2 octobre 2004StatutMembreDernière intervention 9 juillet 20137 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.
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 ...!
nickydaquick
Messages postés416Date d'inscriptionvendredi 31 janvier 2003StatutMembreDernière intervention19 décembre 20133 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 ...!