question sur realloc .. - C - Programmation
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
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 ) |
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 ... |
Marsh Posté le 04-10-2005 à 22:33:32
ok merci les gars pour les réponses . 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 :
|
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
Marsh Posté le 04-10-2005 à 22:42:33
in_your_phion a écrit : ok merci les gars pour les réponses . Si j'ai bien compris ma seule erreur est de ne pas tester si le realloc pointe sur NULL... |
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.
Marsh Posté le 04-10-2005 à 22:53:08
Elmoricq a écrit : |
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.
Marsh Posté le 05-10-2005 à 09:23:21
realloc(tab_num,i*sizeof(int))
scanf("%d",&tab_num[i])
mais oui bien sur
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 :
|
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)...
Marsh Posté le 05-10-2005 à 10:48:10
in_your_phion a écrit : ok merci les gars pour les réponses . 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...
|
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 :
|
As-tu compris ce code ? Sinon, c'est pas la peine d'aller plus loin. Pose des questions si tu ne comprends pas.
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 ...
|
ben j'ai corrigé cette erreur
.. et py ensuite ca marchait toujours pas .
Alors finalement ..ca marche quand je fais :
Code :
|
et ca marchait pas avant quand je faisait juste :
Code :
|
ark ark.. ..
|
en définitive, je pense maintenant avoir compris comment fonctionne realloc .. 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.
Marsh Posté le 05-10-2005 à 17:05:08
in_your_phion a écrit : Alors finalement ..ca marche quand je fais :
|
Comment ai-je pu rater ça !!!
in_your_phion a écrit : en définitive, je pense maintenant avoir compris comment fonctionne realloc .. 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...
Marsh Posté le 05-10-2005 à 20:17:09
in_your_phion a écrit : .. et py ensuite ca marchait toujours pas .
|
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...
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 . 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
PS : je suis sous windows avec dev c++ donc pas besoin de fflush machin chose apparement.
Message édité par in_your_phion le 04-10-2005 à 17:08:54