!!! Pb d'allocation mémoire !!! [Résolu]

Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
- - Dernière réponse : 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]
Afficher la suite 

15 réponses

Meilleure réponse
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 205 internautes nous ont dit merci ce mois-ci

Commenter la réponse de vecchio56
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
0
Merci
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++ (@++)<!--
Commenter la réponse de SAKingdom
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
0
Merci
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]
Commenter la réponse de yoyo269
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
0
Merci
Ben à moin de segmenté le buffer (par exemple, avec un tableau de pointeurs), je ne vois pas d'autre solution.

C++ (@++)<!--
Commenter la réponse de SAKingdom
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010
0
Merci
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...
Commenter la réponse de cs_Matt67
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
0
Merci
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]
Commenter la réponse de yoyo269
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
0
Merci
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++ (@++)<!--
Commenter la réponse de SAKingdom
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
0
Merci
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]
Commenter la réponse de yoyo269
Messages postés
3212
Date d'inscription
lundi 7 novembre 2005
Statut
Membre
Dernière intervention
16 février 2009
12
0
Merci
Peut-être mais ça va prendre beacoup moin de temps que de faire des realloc.

C++ (@++)<!--
Commenter la réponse de SAKingdom
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
0
Merci
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
Commenter la réponse de vecchio56
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
0
Merci
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]
Commenter la réponse de yoyo269
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
0
Merci
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
Commenter la réponse de vecchio56
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
0
Merci
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]
Commenter la réponse de yoyo269
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
0
Merci
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]
Commenter la réponse de yoyo269
Messages postés
1403
Date d'inscription
lundi 23 février 2004
Statut
Membre
Dernière intervention
11 janvier 2009
3
0
Merci
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]
Commenter la réponse de yoyo269