[C] Allocation dynamique et fonction.

Allocation dynamique et fonction. [C] - C++ - Programmation

Marsh Posté le 22-04-2003 à 16:42:24    

Je voudrais faire une allocation dynamique pour un tableau dans une fonction et pouvoir ensuite remplir ce tableau dans le main.
 
Mon problème c'est qu'à la fin d'une fonction, toute les fariables de cette fonction sont détruites donc je voit pas comment faire pour pouvoir travailler dans le tableau en dehors de la fonction.
Si kkun peut me donné un coup de pousse pour savoir quels variable je doit passé en paramètre à cette fonction etc...
J'ai déjà essayer en déclarant un pointeur dans le main, en le passant à la fonction d'allocation et en faisant l'allocation sur ce pointeur en gros : (mais ça plante qd je veux affiché *pt ds le main)
 

Code :
  1. // dans le main
  2. int *pt ;
  3. fct alloc (pt);
  4. //ds la fct
  5. pt = (int*)calloc (taille, sizeof(int));


Message édité par koude le 22-04-2003 à 16:48:24
Reply

Marsh Posté le 22-04-2003 à 16:42:24   

Reply

Marsh Posté le 22-04-2003 à 16:53:33    

tu peux donner unv rai bout de code s'il te plait

Reply

Marsh Posté le 22-04-2003 à 16:57:22    

Code :
  1. void main (void)
  2. {
  3. int *pt;
  4. fct_alloc(pt);
  5. printf ("%d",*pt);
  6. }
  7. void fct_alloc (int *pt)
  8. {
  9. do
  10. {
  11. pt =(int*) calloc (4,sizeof (int))
  12. if (!pt)
  13. {
  14. printf ("\n" );
  15. printf ("==> Erreur d'allocation, appuyer sur unne touche pour recommencer : <==\n" );
  16. getch ();
  17. }
  18. }
  19. }


Message édité par koude le 22-04-2003 à 17:14:11
Reply

Marsh Posté le 22-04-2003 à 17:09:48    

ben il te manque un niveau d'indirection, alors tu ne peux pas récupérer le résultat de ta fonction alloc
 
pour faire simple, vois le fonctionne de malloc

Code :
  1. void* malloc(size_t n)
  2. {
  3.   void *ptr=NULL;
  4.   ptr=appel_systeme_specifique();
  5.   return ptr;
  6. }


 
 
et un passage par pointeur
 

Code :
  1. void doit(int *i)
  2. {
  3.   *i=;
  4. }
  5. int entier;
  6. doit(&i)


 
je crois que tu ferais bien de t'acheter un bouquin de C

Reply

Marsh Posté le 22-04-2003 à 17:15:38    

++Taz a écrit :

ben il te manque un niveau d'indirection, alors tu ne peux pas récupérer le résultat de ta fonction alloc


 
Ca veut dire koi ?  :??:  
 

Reply

Marsh Posté le 22-04-2003 à 17:18:21    

pour faire simple, fait retourner ton pointer par ta fonction:
 
int * fct_alloc()
{
...
return pt;
}

Reply

Marsh Posté le 22-04-2003 à 17:20:49    

Deaddy a écrit :

pour faire simple, fait retourner ton pointer par ta fonction:
 
int * fct_alloc()
{
...
return pt;
}
 


 
Et dire que j'y ai pensé  :sarcastic:  mais je l'ai pas fait !!!
 
Merci


Message édité par koude le 22-04-2003 à 17:21:37
Reply

Marsh Posté le 22-04-2003 à 18:40:53    

ou alors :
 

Koude a écrit :

Code :
  1. void main (void)
  2. {
  3. int *pt;
  4. fct_alloc(&pt);
  5. printf ("%d",*pt);
  6. }
  7. void fct_alloc (int **pt)
  8. {
  9.   do
  10.   {
  11.     *pt =(int*) calloc (4,sizeof (int))
  12.     if (!*pt)
  13.     {
  14.       printf ("\n" );
  15.       printf ("==> Erreur d'allocation, appuyer sur unne touche pour recommencer : <==\n" );
  16.       getch ();
  17.     }
  18.   }
  19. }




 
:D


---------------
last.fm
Reply

Marsh Posté le 22-04-2003 à 19:11:08    

Pour voir si j'ai pas oublié mon C:

Code :
  1. void fct_alloc (int & *pt)
  2.   {
  3. ....
  4. }


C'est bon aussi?

Reply

Marsh Posté le 23-04-2003 à 11:24:51    

Belgique a écrit :

Pour voir si j'ai pas oublié mon C:

Code :
  1. void fct_alloc (int & *pt)
  2.   {
  3. ....
  4. }


C'est bon aussi?


 
perdu ... Les références, c'est C++, pas C .... :D


---------------
last.fm
Reply

Marsh Posté le 23-04-2003 à 11:24:51   

Reply

Marsh Posté le 23-04-2003 à 11:50:35    

Ah ben, j'ai confondu mais en c++ ça doit être bon alors? :p

Reply

Marsh Posté le 23-04-2003 à 13:21:04    

non ... En c++, il me semble que ce n'est pas correct ...
 
Tu dois préciser les indirections avant la référence, il me semble ...
 
ca te donne : void fct_alloc (int *&pt) {...}


---------------
last.fm
Reply

Marsh Posté le 23-04-2003 à 13:22:48    

en effet  :)  

Reply

Marsh Posté le 24-04-2003 à 14:47:57    

Koude a écrit :


Ca veut dire koi ?  :??:  


En C, les paramètres de fonction sont toujours en entrée. On passe toujours des copies des paramètres d'appel. Pour pouvoir modifier la valeur d'un paramètre de manière durable (i.e. la modification survit à la sortie de la fonction), il faut en fait passer un pointeur sur la valeur que l'on veut faire modifier à la fonction.
 
Dans ton cas, ce que tu veux modifier, c'est une valeur de type pointeur sur int, puisque tu alloues un tableau dentiers. Donc le paramètre de la fonction doit être un pointeur sur pointeur sur entier.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed