Pour l'IUT, on doit faire un programme où l'espace mémoire utilisé varie au cours du programme. On fait ça en C++.
Donc, la méthode brute serait de faire un realloc : lorsqu'on a besoin d'agrandir l'espace utilisé, on alloue un bloc de taille plus grande que l'actuel, dans lequel on recopie le contenu du bloc actuel, puis on libère le bloc actuel et on utilise le nouveau bloc comme bloc actuel.
Mais je pense que ce serait mieux si au lieu de ça, à chaque fois que j'ai besoin d'agrandir mon bloc, j'alloue un nouveau bloc d'une taille moyenne, assez petite, et je l'utilise comme s'il était contigu au précédent. Mais pour gérer ça, pour l'instant la seule solution à laquelle j'ai pensé est de faire une liste chainée de blocs de mémoire, et en fonction de l'endroit auquel je veux accéder du grand bloc virtuel constitué par tous ces blocs, je sélectionne le bloc que je veux dans ma liste chainée. Il y a plus simple ?

« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas
. »
PpHd Le 30/04/2004 à 12:29 1. C++ => Utilise stl::vector.
2. "on alloue un bloc de taille plus grande que l'actuel, dans lequel on recopie le contenu du bloc actuel, puis on libère le bloc actuel et on utilise le nouveau bloc comme bloc actuel." Faux une implantation normale de realloc regarde d'abord si elle ne peut pas etendre ton premier malloc sans a avoir a recopier. Si tu fais peu d'allocation memoire c'est souvent le cas.
3. "plus simple". Ca depend. C'est quoi les operations sur ton bloc ?
1. Non, il faut qu'on code ça nous même je pense.
2. Oui, tu as raison, mais je ne sais pas comment faire ça en C++.
3. Je l'utilise comme un tableau.

« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas
. »
Mouais, mais là je ne fais rien.
Je pense qu'ils veulent qu'on fasse nous-même cette gestion de mémoire.

« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas
. »
Je ne dis pas que "en pratique" ça ne marchera pas, mais je dis qu'il y aura de (nombreuses) plateformes et configurations pour lesquelles ça ne marchera pas... Tu n'as en principe pas le droit d'utiliser "array" après l'avoir libéré, même si c juste la ligne d'après ^^
« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)
Si, je crois que ça peut marcher si "array" a un trou (au lieu d'un bloc alloué) à sa gauche...
« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)
Bah, généralement, c'est ce qu'on fait ... nous en tout cas (même si ca sucks grave !)
$ pollux, je vois pas pkoi ca marcherais uniquement si le bloc précédent es libre, tu peux expliquer ?
Mais en fait, je ne sais pas trop ce qu'ils veulent de nous.
En cours, ils n'ont pas introduit les primitives *alloc du C, donc je suppose qu'ils veulent qu'on fasse sans.
On n'a vu que new et delete, donc il faut qu'on fasse avec.
Mais d'habitude ils nous prennent complètement pas la main pour ce genre de boulot et là pas du tout, donc je doute qu'il faille faire des trucs très recherchés (sinon ils nous auraient encore pris par la main), donc peut-être qu'ils pensent à ce qu'on utilise des new pour obtenir des blocs de plus en plus gros et qu'on recopie l'ancien bloc dedans...
Je leur demanderai plus tard, parce que je ne comprends pas jusqu'où ils veulent qu'on aille.
Ça m'étonnerait vraiment beaucoup qu'ils veuillent qu'on fasse la méthode 2 que j'ai décrite au post de départ parce qu'ils nous auraient tout détaillé étape par étape si ça avait été le cas.

« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas
. »
En plus, le bloc de mémoire, on est censés l'utiliser pour faire une liste chainée, alors qu'en cours, ils n'ont montré qu'une représentation avec une allocation par cellule, pas avec un gros tableau. Et dans le sujet, ils disent qu'on a vu une représentation avec un tableau.
Donc je ne comprends vraiment pas de quoi ils parlent.
Je ne sais pas s'ils veulent qu'on utilise la méthode bête et brute de tout décaler dans le tableau à chaque fois qu'on insère/supprime un élément ou bien qu'on utilise une méthode plus sophistiquée, mais là encore, ça m'étonnerait parce qu'ils nous auraient pris par la main si ça avait été le cas...

« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas
. »
ah j'oubliais, si le bloc précédent est vide, le tios aggrandit le bloc vide qui précède afin d'en faire un plus grand (d'où la remarque de pollux)

<<< Kernel Extremis©®™ >>> et Inventeur de la différence administratif/judiciaire ! (©Yoshi Noir)
<Vertyos> un poil plus mais elle suce bien quand même la mienne ^^
<Sabrina`> tinkiete flan c juste qu'ils sont jaloux que je te trouve aussi appétissant
On apprend pas a faire ca ... on apprend pas le C++ d'où mon "sucks"
c'est pas un pb de c++, c'est un pb de programmation. Quel que soit le langage, retourner une référence (au sens français, pas au sens c++) à un objet détruit est un bug. Qu'il se manifeste ou pas n'est pas la question.
Sasume>fait une liste chainé.

Membre fondateur de la Ligue Anti-MacIntoc
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Un expert est quelqu'un qui en sait de plus en plus sur de moins en moins
de choses, jusqu'à ce qu'il connaisse absolument tout à propos de rien.
Pen^2 Le 14/05/2004 à 19:50 Je n'ai pas le temps de bien lire les reponses déjà postées, donc ça a déjà peut etre été proposé, mais le plus simple à mon avis c'est de faire une classe avec un tableau dynamique dedans d'une taille multiple de N.
Tu te fais une methode *push_back* qui vérifie si tu as encore de la place. => A chaque fois que tu dépasse, tu réalloues N octets suplementaires.
Comme ça tu ne réalloues pas trop souvent.