!!! Pb d'allocation mémoire !!!

Résolu
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 - 31 mars 2007 à 18:44
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 - 2 avril 2007 à 17:07
Bonjour à tous !

Comme le titre l'indique, j'ai un petit souci avec l'allocation de mémoire.
En fait j'ai un char*, auquel j'applique un malloc. Ensuite, la taille des données devant être contenues dans le char* n'est pas connue d'avance. J'ai donc pensé à utiliser realloc pour augmenter la taille mémoire. Seulement, de temps en temps, le realloc ne semble pas pouvoir allouer assez de mémoire. Ceci me provoqe alors une erreur.
Connaitriez-vous une fonction ou une technique pour arriver à allouer de nouveau un bloc mémoire sans être rapidement limité (< 10 Mo) ?
Merci d'avance pour votre aide.

PS : si vous souhaitez des détaills, n'hésitez pas !

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
____________________________________________
[Site officiel de YoyoCut, découpe fichiers open source]

15 réponses

vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
1 avril 2007 à 17:12
Ah bon j'ai cru que tu faisais un taitement du contenu des fichiers.
Dans ce cas, pourquoi n'utilises-tu pas une structure de données chainée pour stocker les noms de fichiers?

_____________________________________
Un éditeur de ressources gratuit pour Windows
3
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
1 avril 2007 à 02:09
Si tu essayais ton propre realloc:

void *myrealloc (void *mem, DWORD oldsize, DWORD newsize)
{
    char *buffer;

    if(!mem || !oldsize || !newsize) return 0;
    if(newsize == oldsize) return mem;
    if(newsize < oldsize) oldsize = newsize;

    if(!(buffer = (char*)malloc(newsize))) return 0;

    memcpy(buffer, mem, oldsize);

    free(mem);

    return (void*)buffer;
}

C++ (@++)<!--
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
1 avril 2007 à 11:02
Merci SAKingdom pour la fonction, c'est sympa !
Il n'y a pas d'autre(s) moyen(s) afin d'éviter des memcpy ? Parce que si mem fait quelques Mo (ce qui peut arriver), ça risque d'être un peu long non ?

PS : pour l'instant, ma technique est d'utiliser un fichier (et ça fonctionne bien) mais il faudrait que j'arrive à faire le travail en interne du programme.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
____________________________________________
[Site officiel de YoyoCut, découpe fichiers open source]
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
1 avril 2007 à 14:25
Ben à moin de segmenté le buffer (par exemple, avec un tableau de pointeurs), je ne vois pas d'autre solution.

C++ (@++)<!--
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Matt67 Messages postés 549 Date d'inscription samedi 6 septembre 2003 Statut Membre Dernière intervention 6 mars 2010 3
1 avril 2007 à 15:02
Bonjour,

j'aime bien le "de temps en temps". C'est a dire que tu realloues plusieurs fois de la memoire dans ton programme et, de temps en temps, ca plante ou alors tu lances plusieurs fois ton programme et, de temps en temps, ca plante ?
Tu realloues comment au maximum (environ) ?
Peut-être qu'un bout de code.

Matt...
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
1 avril 2007 à 15:33
En fait, c'est pour créer une arborescence de dossiers/fichiers. J'utilise donc un code récursif. La taille de l'arborescence est donc aléatoire.
Voilà une explication du code (un peu long) :
Du coup, à l'initialisation j'alloue avec malloc() pour mettre le dossier de départ de l'arborescence. Ensuite à chaque fois que je vais ajouter un fichier ou un dossier à l'arborescence, je fais un realloc(buffer, taille_arborescence + 1000);
Selon ce qui a été ajouté je fais : taille_arborescence += nombre_d'_octets_écrits;
Et ainsi de suite avec la récursivité.
J'ai essayé une autre façon, en faisant un realloc() uniquement quand c'est nécessaire :
if(_msize(Arborescence) < *TailleArb + 1000) Arborescence = (char*)realloc(Arborescence, *TailleArb + 1048576);
J'augmente la taille du bloc mémoire d'1 Mo à chaque fois que sa taille devient limite insuffisante.
Et visiblement ça à l'air de passer comme ça.
Qu'en pensez-vous ?

PS à Matt67 : le programme plante pour certaines arborescences et pas pour d'autres.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
____________________________________________
[Site officiel de YoyoCut, découpe fichiers open source]
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
1 avril 2007 à 15:41
Ton arborescence elle existe (ce sont des fichiers/dossiers qui sont sur le disque) ? Si oui, pourquoi ne pas compter tout ça avant d'allouer ? Tu aurais la somme exacte de mémoire nécessaire et pas de memcpy ou de realloc.
C++ (@++)<!--
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
1 avril 2007 à 15:46
Oui elle existe. J'ai déjà pensé à calculer la taille avant, mais avec de grosses arborescences ça risque de mettre un peu de temps je pense (?). Donc je préfère faire le boulot (parcourir les dossiers) une seule fois si possible.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
____________________________________________
[Site officiel de YoyoCut, découpe fichiers open source]
0
SAKingdom Messages postés 3212 Date d'inscription lundi 7 novembre 2005 Statut Membre Dernière intervention 16 février 2009 15
1 avril 2007 à 16:15
Peut-être mais ça va prendre beacoup moin de temps que de faire des realloc.

C++ (@++)<!--
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
1 avril 2007 à 16:16
Pour ce genre de choses je fais un seul parcours. Pendant le parcours tu remplis une liste (par exemple) contenant les fichiers et en même temps tu calcules la taille totale. Du coup plus besoin de reparcourir ton arborescence puisque tu as ta liste.

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
1 avril 2007 à 16:18
Ah ben dans ce cas je vais essayer comme ça alors !
Je vous tiens au courant de l'évolution.
En attendant, un grand merci pour votre aide.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
____________________________________________
[Site officiel de YoyoCut, découpe fichiers open source]
0
vecchio56 Messages postés 6535 Date d'inscription lundi 16 décembre 2002 Statut Membre Dernière intervention 22 août 2010 14
1 avril 2007 à 16:18
SAKingdom> Ca pourrait être plus lent de refaire un parcours de l'arborescence, par exemple si le dossier à parcourir est situé sur un lecteur réseau et que le débit est lent.

_____________________________________
Un éditeur de ressources gratuit pour Windows
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
1 avril 2007 à 16:30
Vecchio56 tu peux m'en dire un peu plus sur le terme "liste" stp ?
Parce que moi c'est déjà ce que je fais de lister les noms des fichiers et dossiers pendant le parcours.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
____________________________________________
[Site officiel de YoyoCut, découpe fichiers open source]
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
1 avril 2007 à 17:18
Ah oui les listes chainées ! Je me rappelle avoir déjà vu ça en cours d'algo. On a jamais fait en pratique. Je crois que ça va être l'occasion de s'y lancer !
J'ai du boulot qui m'attend je crois....zou je file !

Je vous tiens au courant.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
____________________________________________
[Site officiel de YoyoCut, découpe fichiers open source]
0
yoyo269 Messages postés 1403 Date d'inscription lundi 23 février 2004 Statut Membre Dernière intervention 11 janvier 2009 2
2 avril 2007 à 17:07
Bonne nouvelle ! J'ai réussi à m'en sortir. Et tout ça grâce aux listes chainées. Comme quoi les cours ça sert desfois.
Un grand merci à vous tous pour m'avoir aidé et merci vecchio56 pour m'avoir trouvé cette petite idée qui a fait toute la différence.

YOYO, @+.
"L'intelligence c'est comme un parachute, quand on en n'a pas...on s'écrase !"
____________________________________________
[Site officiel de YoyoCut, découpe fichiers open source]
0
Rejoignez-nous