Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1123 connectés 

  FORUM HardWare.fr
  Programmation
  C

  question sur realloc ..

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

question sur realloc ..

n°1214743
in_your_ph​ion
Posté le 04-10-2005 à 17:07:33  profilanswer
 

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
mood
Publicité
Posté le 04-10-2005 à 17:07:33  profilanswer
 

n°1214778
Emmanuel D​elahaye
C is a sharp tool
Posté le 04-10-2005 à 17:34:00  profilanswer
 


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/
n°1214784
Elmoricq
Modérateur
Posté le 04-10-2005 à 17:40:01  profilanswer
 

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
n°1215030
in_your_ph​ion
Posté le 04-10-2005 à 22:33:32  profilanswer
 

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:

n°1215035
Elmoricq
Modérateur
Posté le 04-10-2005 à 22:42:33  profilanswer
 

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]

n°1215039
in_your_ph​ion
Posté le 04-10-2005 à 22:53:08  profilanswer
 

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.

n°1215181
blackgodde​ss
vive le troll !
Posté le 05-10-2005 à 09:23:21  profilanswer
 

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


---------------
-( BlackGoddess )-
n°1215192
Sve@r
Posté le 05-10-2005 à 09:45:20  profilanswer
 

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)...
 

n°1215242
Emmanuel D​elahaye
C is a sharp tool
Posté le 05-10-2005 à 10:48:10  profilanswer
 

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/
n°1215692
in_your_ph​ion
Posté le 05-10-2005 à 16:42:30  profilanswer
 

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.

mood
Publicité
Posté le 05-10-2005 à 16:42:30  profilanswer
 

n°1215730
Sve@r
Posté le 05-10-2005 à 17:05:08  profilanswer
 

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...

n°1215936
Emmanuel D​elahaye
C is a sharp tool
Posté le 05-10-2005 à 20:17:09  profilanswer
 

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/

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  question sur realloc ..

 

Sujets relatifs
Question sur les dll et les enumsQuestion sur la programmation C++
Question simpleQuestion simplissime
question top con... :)[Question] - Comment lancer un script perl en tache de fond
Derniéres question avant mise en ligne[Débutant] Question sur printf et les float
PHP registers globals, question de priorités 
Plus de sujets relatifs à : question sur realloc ..


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR