IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Realloc


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Par défaut Realloc
    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

  2. #2
    Membre émérite Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Par défaut
    Citation Envoyé par theshark85
    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 :
    http://man.developpez.com/man3/realloc.3.php

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Par défaut
    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 ...

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par theshark85
    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?
    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.
    .
    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...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Par défaut
    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.

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    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 !

  7. #7
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par theshark85
    Je vouslais savoir ceci, par curiosité et pour comprendre certaine[] chose[].
    Comme par exemple pourquoi quand l'on fait un realloc, et qu[]on regarandi en faisant +1 ou +200 ça ne reagit pas de la memem maniere.

    Peut etre un peu trop poussé[] ma question.
    Tu peux le redire en français ? Tu es limite incompréhensible...

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Par défaut
    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.

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Par défaut
    VU_nbtab=> nombre d'element dans le tableau
    VU_alloc=> nombre de zone alloue


    Ne plante pas:

    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*));
          }
    Plante:
    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*));

  10. #10
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    Plante:

    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 ?
    Si ça tombe, la valeur n'est pas bonne et dans ce cas là ...

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Par défaut
    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.

  12. #12
    Membre éclairé Avatar de je®ome
    Inscrit en
    Octobre 2005
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 285
    Par défaut
    theshark85 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 ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    if(Liste[PosCol]->VU_nbtab==Liste[PosCol]->VU_nbtab)
    il en revient de même de faire,
    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 ?

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Par défaut
    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.

  14. #14
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Citation Envoyé par theshark85
    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...

    Jc

  15. #15
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par theshark85
    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.
    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.
    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).

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Par défaut
    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.

  17. #17
    Expert confirmé
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Par défaut
    Citation Envoyé par theshark85
    Mon programme sinon n'a pas de BUG.
    Voila une affirmation bien curieuse...

  18. #18
    Membre expérimenté Avatar de Pikwik
    Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Mai 2006
    Messages : 237
    Par défaut
    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...

  19. #19
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    163
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 163
    Par défaut
    Citation Envoyé par Skyrunner
    Voila une affirmation bien curieuse...
    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.

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

  20. #20
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par theshark85
    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.
    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.

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

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Quel est l'équivalent de realloc en C++ ?
    Par xavlours dans le forum C++
    Réponses: 4
    Dernier message: 13/05/2005, 13h36
  2. Malloc et realloc
    Par Triomen dans le forum C
    Réponses: 6
    Dernier message: 21/02/2005, 19h20
  3. [Debutant]reallocation de memoire d'un tableau de type perso
    Par killerjeff dans le forum Débuter
    Réponses: 3
    Dernier message: 04/08/2004, 17h09
  4. Re-problème avec realloc() (désolé)
    Par Yabo dans le forum C
    Réponses: 8
    Dernier message: 30/07/2003, 22h07
  5. Réponses: 4
    Dernier message: 03/12/2002, 16h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo