Je voulais savoir si quelqu'un peut m'expliquer comment realloc fonctionne aux niveaux de la mémoire en faite?
Je sais que ça réalloue une zone comme son l'indique, mais la réallocation comment se fait-elle?
Merci
Je voulais savoir si quelqu'un peut m'expliquer comment realloc fonctionne aux niveaux de la mémoire en faite?
Je sais que ça réalloue une zone comme son l'indique, mais la réallocation comment se fait-elle?
Merci
Tout est dans le man :Envoyé par theshark85
http://man.developpez.com/man3/realloc.3.php
Ouai je savais déjà tout ça, moi ce qui m'interessait c'était de comprendre un peu plus loin, savoir pourquoi quand on fait un realloc en size +1 et un realloc en size +1000 ça va pas réagir de la meme façon.
Si cela est du au faite que quand on realloue la memoire, il faut que la mémoire disponible soit contigue à l'ancienne place prise ...
Le langage C défini l'interface de la fonction et son comportement. Pas les détails internes de réalisation qui n'interessent que ceux qui veulent implémenter la fonction.Envoyé par theshark85
.
Il n'y a donc pas de réponse définitive. Il y a certainement différentes façons de faire, mais tout dépend de l'implémentation. Pourquoi tu veux connaître ces détails ?
Si tu y tiens, cherches des implémentations de realloc() sur le web.est ton ami...
Je vouslais savoir ceci, par curiosité et pour comprendre certaine chose.
Comme par exemple pourquoi quand l'on fait un realloc, et quon regarandi en faisant +1 ou +200 ça ne reagit pas de la memem maniere.
Peut etre un peu trop poussé ma question.
Peut-être en récupérant les source de la GLibC, sait-on jamais !
Mon Site
Ma bibliothèque de gestion des chaînes de caractères en C
L'imagination est plus importante que le savoir. A. Einstein
Je ne répond à aucune question technique par MP, merci d'avance !
Tu peux le redire en français ? Tu es limite incompréhensible...Envoyé par theshark85
En gros, j'ai appris que quand on fait un realloc, si on a un tableau de 10 et q'uon veut un tableau de 10+1, il a chercher une zone mémoire de 11. Puis il copie la zone de 10 dans celle de 11 et ma réallocation ets faite.
Pour ma part, je fais un realloc de tableau de , en faisant grossir mon tableau de taillestruct+1 a chaque nouvelle valeur. Au bout d'un moment le realloc plante. Alors que si je fais mon realloc, en grossissant mon tableau en faisant taillestruct+200 (quand il faut bien sur pas pour chaque nouvelel valeur) ça ne plante pas. Ne renvoie pas NULL le realloc.
VU_nbtab=> nombre d'element dans le tableau
VU_alloc=> nombre de zone alloue
Ne plante pas:
Plante:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 if(Liste[PosCol]->VU_nbtab==Liste[PosCol]->VU_alloc) { Liste[PosCol]->VU_alloc=Liste[PosCol]->VU_alloc+500;/*On fait +500 car si on fait +1 quand il faut traiter de gros fichier probleme de realloc*/ Liste[PosCol]->tab_VU= (VALEUR**) realloc (Liste[PosCol]->tab_VU,(Liste[PosCol]->VU_alloc+1) * sizeof(VALEUR*)); }
Code : Sélectionner tout - Visualiser dans une fenêtre à part Liste[PosCol]->tab_VU= (VALEUR**) realloc (Liste[PosCol]->tab_VU,(Liste[PosCol]->VU_nbtab+1) * sizeof(VALEUR*));
As-tu essayé d'imprimer la valeur de VU_nbtab ?Plante:
Liste[PosCol]->tab_VU= (VALEUR**) realloc (Liste[PosCol]->tab_VU,(Liste[PosCol]->VU_nbtab+1) * sizeof(VALEUR*));
Si ça tombe, la valeur n'est pas bonne et dans ce cas là ...
La valeur est bonne, j'ai déjà testé. Et aussi, si elle n'était pas bonne la solution avec le VU_alloc ne fonctionnerait pas non plus.
Je ne suis pas trop d'accord,car icitheshark85 La valeur est bonne, j'ai déjà testé. Et aussi, si elle n'était pas bonne la solution avec le VU_alloc ne fonctionnerait pas non plus.
il en revient de même de faire,
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 if(Liste[PosCol]->VU_nbtab==Liste[PosCol]->VU_nbtab)
if(1==1)
peut-importe la valeur de Liste[PosCol]->VU_nbtab (sauf si Liste[PosCol]=NULL),
tu entres dans ta conditon.
Ou n'aurais-je pas bien compris qch ?
Désolé probléme de copier coller.
Mais le if c'est
Code : Sélectionner tout - Visualiser dans une fenêtre à part if(Liste[PosCol]->VU_nbtab==Liste[PosCol]->VU_alloc)
Sinon ces sur je susi d'acord que 1==1
![]()
Bon dans le fond personne ne connait la réponse, pourquoi quand réalloue de 1 ça plante et quand on réalloue de 500 tous les temps de temps ça ne plante pas.
A mon avis, tu fais une erreur dans la façon dont tu gères ton realloc, montre le code entier relatif au problème du realloc avec une incrémentation de 1 et sans erreur de copier-coller...Envoyé par theshark85
Jc
On ne peut pas te repondre avec les deux lignes de code que tu postes. Il est fort possible que ton programme soit faux dans les deux cas, mais le bug ne se revele dans lorsque tu realloc() de 1. Le bug est surement ailleurs dans le programme.Envoyé par theshark85
Comme d'habitude avec les segmentation faults, il faut regarder tout attentivement:
- est-ce que PosCol n'est pas en dehors des limites du tableau Liste?
- est-ce que tab_VU a ete modifie depuis le malloc() qui l'a initialise?
- l'erreur est-elle ailleurs dans le programme (depassement de tableau qui ecraserait la valeur de tab_VU, par exemple).
Bon, j'ai résolu mon probléme avec mon +500. Mon programme sinon n'a pas de BUG. J'ai vérifié que tout allait bien ou il fallait et comme il faut.
Moi jep pense plutot que ça vient d'autre chose que le realloc en lui meme. Peu etre du PC et de son sytéme selon comment il gére la mémoire.
Voila une affirmation bien curieuse...Envoyé par theshark85
![]()
![]()
Il m'ai arrivé très souvant au cours de mes différentes programmations, de ne pas trouver une erreur, et d'en déduire par facilité, que c'était ma machine ou bien l'implementation de telle fonction qui posait problème...
Mais au final j'avais mis un ";" après mon if...
De plus je ne pense pas que réallouer de 1 en 1 la mémoire ne soit quelque chose de normal dans un programme.
Vu que tu fonctionnes sous windows XP, je suppose que tu as plus de 256 Mo de mémoire... faire une augmentation de 1024 éléments ne me parait pas être un gros problème ? Après je ne suis pas non plus un pro...
Pas de pretention, c'est plus que si vous trouvez quelqu'un qui test plus que moi son code au fur et à mesure qu'il programme, je cherche.Envoyé par Skyrunner
Non sinon sérieusement, ne trouvant pas le probléme, j'ai déjà demandé de l'aide aux personnes qui sont avec moi et qui ont plus d'expérience. Et on a fait des tests, et aussi j'ai un fichier de sorties qui si je pointais mal me sortirais des choses bizarres.
Bon et sinon, savoir que faut réussir à gérer la mise en mémoire d'un fichier de 5go voir plus ça devient coton. Surtout quand on veut que ça soit rapide.
Mais si quelqu'un peut vraiment m'expliquer comment ça se passe en mémoire, pas ce qu'il y a dans la bibliothéque.ça je l'ais compris. Mais plutot genre probléme niveau des temps d'acces, ... Ou meme une saturation car faire un realloc tous les secondes, le PC arrive peut etre pas à gérer...
Chez pas, mais tout ce que je sais, mon code n'a pas choqué les personnes à qui je l'ais montré.
Hmm. Tu es sur d'avoir besoin de charger l'ensemble du fichier en memoire? Meme un gestionnaire de base de donnee ne fait jamais cela. Tu dois pouvoir ameliorer ta conception pour eviter une lecture si importante.Envoyé par theshark85
Sinon, pour les diverses implementations des gestionnaires de memoire dans differents OS, cf. les forums dedies (et encore, cela est peut-etre trop technique. Google?).
Partager