question sur realloc ..

question sur realloc .. - C - Programmation

Marsh Posté le 04-10-2005 à 17:07:33    

salut,
 
je voudrais savoir si je fais une saisie à l'écran, est-ce que je peux faire :
 
int i =0;
int *tab_num = (int*)malloc(sizeof(int));
 
printf("chiffre ?" );
             
    while ( scanf("%d",&tab_num[i]) != EOF) {
 
      printf("chiffre ?" );
      i++;
      realloc(number,i);
    }
 
... PArce que ca marche pas bien quand je fais ca  :cry: . Je comprend pas. Si je déclare tab_num comme un tableau avec une taille max ca marche, mais si je fais tab_num comme un poineur (comme dans l'exemple) et bien ca marche plus bien : quand j'affiche le résultat de mes chiffres rentrés, le premier chiffre du tableau est constamment à zéro.....Est ce que c'est lié à une mauvaise utilisation de realloc par hasard ?
 
merci  :whistle:  :lol:
 
 
PS : je suis sous windows avec dev c++ donc pas besoin de fflush machin chose apparement.

Message cité 2 fois
Message édité par in_your_phion le 04-10-2005 à 17:08:54
Reply

Marsh Posté le 04-10-2005 à 17:07:33   

Reply

Marsh Posté le 04-10-2005 à 17:34:00    


Citation :

int *tab_num = (int*)malloc(sizeof(int));


http://mapage.noos.fr/emdel/notes.htm#malloc

Citation :

     realloc(number,i);


http://mapage.noos.fr/emdel/notes.htm#realloc


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 04-10-2005 à 17:40:01    

Utilise les balises [cpp ][/cpp] pour ton code (sans espace), plus facile à lire sur le forum.
 

in_your_phion a écrit :

Est ce que c'est lié à une mauvaise utilisation de realloc par hasard ?


 
Oui, mais pas seulement.
 
Premièrement, enlève ce cast sur le malloc(). Il est inutile :  

int *tab_num = malloc(sizeof int);


 
Ensuite, il faut tester que l'allocation s'est bien passée :

if ( tab_num == NULL )  
{
    /* gerer l'erreur ici, a toi de voir comment */
}


 
 
Ensuite j'aimerais bien savoir à quoi correspond "number" dans ta ligne realloc().
Quant à la fonction en elle-même, le prototype c'est :
void *realloc(void *ptr, size_t size);
 
Il reçoit un pointeur, et une taille, et retourne un bloc mémoire nouvellement alloué.
Seulement il faut se méfier, parce que si la fonction échoue, realloc() retourne NULL alors que le pointeur initial est toujours valide :

while ...
{
   int *tmp_realloc;
   
   /* ton code */
 
   i++;
   tmp_realloc = realloc(tab_num, (i + 1) * sizeof int);
   if ( tmp_realloc != NULL )
      tab_num  = tmp_realloc;
   else
   {
      /* realloc() a echoue, mais tab_num est toujours valide.  
          A toi de voir comment gerer l'erreur */
   }
}


Message édité par Elmoricq le 04-10-2005 à 20:02:30
Reply

Marsh Posté le 04-10-2005 à 22:33:32    

ok merci les gars pour les réponses  :love: . Si j'ai bien compris ma seule erreur est de ne pas tester si le realloc pointe sur NULL... Mais a part ca mon truc devrait marcher, je comprend pas pourquoi ca marche pas bien...
 

j'aimerais bien savoir à quoi correspond "number" dans ta ligne realloc().


..je me suis planté, en fait c'est, en tenant compte de vos remarques :
 

Code :
  1. int i =0;
  2. int *tab_num;
  3. if ((tab_num = malloc(sizeof(int))) == NULL) {
  4. printf("bad luck" );
  5. exit(0); //etc bla bla
  6. }
  7. printf("chiffre ?" );
  8.            
  9.     while ( scanf("%d",&tab_num[i]) != EOF) {
  10.       printf("chiffre ?" );
  11.       i++;
  12.       if ( realloc(tab_num,i*sizeof(int)) ==NULL  )
  13.         printf("bad luck" ); //exit tra la la
  14.     }


 
 
alors toujours pas d'idée pourquoi ca marche pas ? est-ce que ca pourrait etre le fait d'etre sous windoze ?
 
pour etre clair, en sortie j'ai :
 
par exemple si j'ai rentré les chiffre 1, 2 et 3 .. ca marche et ca affiche
 
1
2
3
 
mais si je rentre plus de chiffres, à partir de 10 notamment ca deconne...si je rentre les chiffres 1 2 3 4 5 6 7 8 9 10... j'ai
 
0
2
3
4
5
6
7
8
9
10
 
 :cry:  :cry:  :cry:  :cry:  :cry:

Reply

Marsh Posté le 04-10-2005 à 22:42:33    

in_your_phion a écrit :

ok merci les gars pour les réponses  :love: . Si j'ai bien compris ma seule erreur est de ne pas tester si le realloc pointe sur NULL...


 [:hide]  
 
Je t'ai mis le code. Tout cuit dans le bec, plus qu'à réécrire, avec l'explication qui va avec.  
 
Le plus beau est que je me suis fait grillé par Emmanuel de quelques minutes. Il a posté un lien vers sa page, qui explique tout comme il faut avec exemples tout simples, y a plus qu'à appliquer.
 
Je te laisse conclure.  [:itm]

Reply

Marsh Posté le 04-10-2005 à 22:53:08    

Elmoricq a écrit :

[:hide]  
Je te laisse conclure.  [:itm]


 
ben j'en conclue que je sais toujours pas pourquoi mon programme marche pas, quand je teste realloc ne pointe jamais sur NULL avec juste une dizaine de chiffre rentrés .. et pourtant mon premier chiffre est remplacé par zéro.

Reply

Marsh Posté le 05-10-2005 à 09:23:21    

realloc(tab_num,i*sizeof(int))
 
scanf("%d",&tab_num[i])
 
mais oui bien sur


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 05-10-2005 à 09:45:20    

in_your_phion a écrit :

je me suis planté, en fait c'est, en tenant compte de vos remarques :
 

Code :
  1. int i =0;
  2. int *tab_num;
  3. if ((tab_num = malloc(sizeof(int))) == NULL) {
  4. printf("bad luck" );
  5. exit(0); //etc bla bla
  6. }
  7. printf("chiffre ?" );
  8.            
  9.     while ( scanf("%d",&tab_num[i]) != EOF) {
  10.       printf("chiffre ?" );
  11.       i++;
  12.       if ( realloc(tab_num,i*sizeof(int)) ==NULL  )
  13.         printf("bad luck" ); //exit tra la la
  14.     }




 
Hum... toujours à chercher à faire des trucs tordus. Mais ton algo est quand-même un peu faux
Je m'explique :
1) à ton premier malloc, tu alloues un tableau de un "int" et tu remplis l'élément[i] dans ton scanf. Comme ici, "i" vaut 0, tu remplis l'élément[0] => ok
2) en dessous, tu incrémentes "i" qui vaut "1". Comme ça, dans le tour suivant tu rempliras l'élement[1] => ton tableau doit donc avoir la place de stocker DEUX int
3) juste après, tu fais un realloc de "i * sizeof(int)" mais comme "i" vaut "1", tu realloues UN int alors qu'il faudrait ptet en réallouer deux non ???
 
Par ailleurs, la stratégie générale de tableaux dynamiques est de limiter les realloc (gourmands). Il vaut mieux allouer au depart "N" éléments, et si tu les remplis tous, alors tu réalloues "N" de plus.
Là, il y a plusieurs stratégies. Certains rajoutent la taille initiale, certains doublent systématiquement la taille précédente. J'ai même vu sur ce forum une discussion où Taz conseille d'allouer au nouveau tableau la taille "n -2" plus la taille "n - 1" (Fibonacci)...
 

Reply

Marsh Posté le 05-10-2005 à 10:48:10    

in_your_phion a écrit :

ok merci les gars pour les réponses  :love: . Si j'ai bien compris ma seule erreur est de ne pas tester si le realloc pointe sur NULL... Mais a part ca mon truc devrait marcher, je comprend pas pourquoi ca marche pas bien...


      if ( realloc(tab_num,i*sizeof(int)) ==NULL  )



Y'a rien qui te choque là ?  
 
As-tu lu la doc de realloc() ? As-tu compris comment fonctionne realloc() ? Dans l'exemple que je donne sur mon site , il y a :  


   /* Agrandissement du tableau a 15 int */
   {
      /* reallocation. Le resultat est stocke'
       * dans une variable temporaire
       */
      size = 15;
      type_s *p_tmp = realloc (p, size * sizeof *p_tmp);
 
      if (p_tmp != NULL)
      {
         /* si la nouvelle valeur est valide,
          * le pointeur original est mis a jour.
          */
         p = p_tmp;
      }
      else
      {
         /* l'ancien bloc est valide, mais il n'a pas ete agrandi */
      }
   }


As-tu compris ce code ? Sinon, c'est pas la peine d'aller plus loin. Pose des questions si tu ne comprends pas.


Message édité par Emmanuel Delahaye le 05-10-2005 à 10:49:31

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 05-10-2005 à 16:42:30    

ok merci encore pour vos réponses les gars .. en fait j'ai résolu mon problème, youpi ! .. voila comment je fais (dites moi si c'est pas bon, ce serait cool)
 
Tout d'abord ...
 


3) juste après, tu fais un realloc de "i * sizeof(int)" mais comme "i" vaut "1", tu realloues UN int alors qu'il faudrait ptet en réallouer deux non ???  


 
ben j'ai corrigé cette erreur  :D  
 
 .. et py ensuite ca marchait toujours pas :heink:.  
 
Alors finalement ..ca marche quand je fais :
 

Code :
  1. tab_num = realloc (tab_num, (i+1) * sizeof (int));


et ca marchait pas avant quand je faisait juste :
 

Code :
  1. realloc (tab_num, (i+1)* sizeof (int));


ark ark.. :lol: ..
 


 As-tu compris comment fonctionne realloc() ?


 
en définitive, je pense maintenant avoir compris comment fonctionne realloc   :p  .. le test avec la variable temporaire sert uniquement si on a plus de mémoire, ce qui risque pas d'arriver quand je rentre une dizaine de chiffres ..a mon avis.

Reply

Marsh Posté le 05-10-2005 à 16:42:30   

Reply

Marsh Posté le 05-10-2005 à 17:05:08    

in_your_phion a écrit :

Alors finalement ..ca marche quand je fais :
 

Code :
  1. tab_num = realloc (tab_num, (i+1) * sizeof (int));


et ca marchait pas avant quand je faisait juste :
 

Code :
  1. realloc (tab_num, (i+1)* sizeof (int));



Comment ai-je pu rater ça !!!
 

in_your_phion a écrit :

en définitive, je pense maintenant avoir compris comment fonctionne realloc   :p  .. le test avec la variable temporaire sert uniquement si on a plus de mémoire, ce qui risque pas d'arriver quand je rentre une dizaine de chiffres ..a mon avis.


 
Tu as aussi le droit de ne pas utiliser "malloc". Si tu fais un "realloc" en lui passant un pointeur initial nul, il y aura alors simple allocation mémoire et non réallocation. Comme tu fais ton realloc dans une boucle, tu peux la modifier un peu pour faire le realloc juste avant de stocker le nombre saisi dans le tableau et enlever alors le malloc initial...

Reply

Marsh Posté le 05-10-2005 à 20:17:09    

in_your_phion a écrit :

.. et py ensuite ca marchait toujours pas :heink:.  
 
Alors finalement ..ca marche quand je fais :

Code :
  1. tab_num = realloc (tab_num, (i+1) * sizeof (int));



Ben oui. realloc() (comme malloc()) retourne l'adresse du nouveau bloc alloué. Ca peut être la même ou non. C'est imprévisible. Il faut donc toujours la sauvegarder.

Citation :

le test avec la variable temporaire sert uniquement si on a plus de mémoire, ce qui risque pas d'arriver quand je rentre une dizaine de chiffres ..a mon avis.


Il sert dans tous les cas. On ne peut jamais savoir à l'avance si on a de la mémoire ou pas. Ne pas oublier que ton process n'est pas le seul sur ta machine...


Message édité par Emmanuel Delahaye le 05-10-2005 à 20:20:24

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

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