Allocateur de Mémoire c++

kellyse Messages postés 5 Date d'inscription vendredi 23 mars 2007 Statut Membre Dernière intervention 5 juin 2007 - 19 mai 2007 à 15:43
languebasque Messages postés 4 Date d'inscription jeudi 6 avril 2006 Statut Membre Dernière intervention 6 juin 2007 - 6 juin 2007 à 20:38
Bonjour à tous!
Actuellement avant la fin du mois , je dois finir ce devoir très important ( concernant mon dîplome) et comme je suis une débutante , j'aurai voulu qu'on m'explique sur ce cours! voilà
merci de votre compréhension !
J'ai vraiment besoin d'aide car je suis tout seule à faire ça et comme j'ai des autres cours à faire !
PS: J'ai bossais un peut actuellement sur ce cours et de + j'ai fais des commentaires pour mieux que vous comprenez le cours! j'aimerais savoir ce qui me manque?

[i]#include
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

class Item
{
public:
Item()
{
cout<<'+';
}
virtual ~Item()
{
cout<<'-';
}
char afficheCarte;
int affiche();

};

typedef unsigned int Adresse;
typedef unsigned int Taille;

const Adresse NAA = UINT_MAX;

/*La classe Item représente les éléments de base contenus dans la zone
mémoire simulée; le type Adresse représentera les adresses dans cette zone
mémoire, et le type Taille sera utilisé lui pour représenter des quantités
de cet espace mémoire.Finalement, la constance NAA(=<>),
devant être utilisée pour représenter une adresse invalide(équivalent du NULL de c++).

2) Prototype et définissez la classe Mémoire , de sorte que:

-L'on puisse instancier 'une mémoire' en précisant à la construction
la taile de cette mémoie(Item étant l'unité de mesure).

-La zone de mémoire soit somilée par un tableau de taille fixe (d'Items), mais
alloué dynamiquement(voir les remarques ci-après pour l'allocation
et la libération dynamique de tableaux).Par ailleurs, l'utilisation de la classe
ne devra pas provoquer de fuite mémoire(i.e. toute la mémoire 'réelle'
allouée doit être restituée).

-La réservation d'une zone de la mémoire simulée par la classe
se fasse au moyen de la méthone:
Adresse alloue(Taille taille);
qui, pour autant que la mémoire à disposition le permette, réserve
une zone contigÜe de taille (taille),et retournera l'adresse de départ
de cette zone, ou NNA dans le cas ou la demande d'allocation ne peut être satisfaite.

-La libération d'une zone de la mémoire précedemment allouée se fasse au moyen
de la méthode:
void libere(Adresse adresse);

Dans le cas ou l'argument adresse est invalide(hors bornes), la méthode ne fera rien.

-L'on puisse dupliquer une instance de Mémoire, et travailler avec les deux copies de manière
indépendante.

Pour connaître à toute instant la disponibilité de la mémoire, et permettre une
libération de zone en ne précisant que son adresse , il est nécessaire
de mémoriser une information aditionnelle, représentant l'occupation de
la mémoire.

-Une technique (totalement prohibitive, mais simple à réaliser) pour cela consite
à disposer d'un (second) tableau d'entiers (appelé par la suite map), de même dimension
que la mémoire, et de l'utiliser pour <<cartographier>> la mémoire.

-map[i] indique quel est le statue de l'adresse i de la mémoire.
-la valeur 0 sera utilisée pour désigner une adresse libre
-une valeur m différent de 0 indiquera que la position mémoire correspondant
à l'adresse i est attribuée , et qu'elle l'à été lors de la mième réservation.

-Ainsi, lors d'une réservation, il suffira de chercher dans la 'carte'
une zone suffisamment grande non encore réservée, et lors d'une libération,
il suffira de marquer livre toutes les adresses (contigues) supérieurs ou égales
à celle précisée en argument , pour lesquelles le no de réservation est le même
que celui de l'adresse précisée.*/

//03)Ajouter à Mémoire la méthode

void afficheCarte(ostream& os, unsigned int nb);

//04: Tester finalement votre programme, en utilisant la fonction principale
//suivante(également fournie dans le fichier d'origine):

void main()
{
int Memoire;
cout << " Creaction de M1 : " ;

Memoire m1(20);
cout << endl;
Adresse a1 m1.alloue(5); cout << " A1(5)" <<a1<<endl; Adresse a2 m1.alloue(10; cout << " A2(10" <<a2<<endl; Adresse a3 m1.alloue(15); cout << " A3(15)" <<a3<<endl; Adresse a4 m1.alloue(1); cout << " A4(1)" <<a4<<endl;

m1.libere(a2);
cout <<endl<<"Etat de M1 :"<<endl;
m1.afficheCarte(cout,10);
{
cout << endl << "Duplication de M1 : " ;
Memoire m2(m1);cout << endl;

cout << " Liberation de M1("<<a1<<')'<< endl;
m1.libere(a1);

cout << " Liberation de M2("<<a3<<')'<< endl;
m2.libere(a3);

a2 = m1.alloue(2); cout << " A2(2)=<<a2<<endl;
a4 = m2.alloue(2); cout << " A4(2)=<<a4<<endl;

cout<<endl<<"Etat de M2 : " <<endl;
m2.afficheCarte(cout,10);
cout << endl <<"Destruction de M2 : " ;
}
cout << endl << "Etat de M1 : " << endl;
m1.afficheCarte(cout,10);
cout << endl << " Destruction de M1 : " ;
}/i

PS: Si une personne , connait le c++! J'aimerais qui me contacte actuellement car j'aimerai vraiment de l'aide merci bcp !

8 réponses

languebasque Messages postés 4 Date d'inscription jeudi 6 avril 2006 Statut Membre Dernière intervention 6 juin 2007
26 mai 2007 à 21:38
j'ai le mem exercice si t'arrive a trouver la solution ecrit la merci beaucioup
0
The_Guardian Messages postés 317 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 19 octobre 2007 1
26 mai 2007 à 22:13
Salut,

Deja est-ce que tu comprends ce que l'on te demande ? es-tu bien au point sur les pointeurs par exemple ?
Ensuite je te conseille de faire par etape, l'allocation ca risque d'etre assez dur donc dans un premier temps fait la methode simple proposee. Et arrives-tu par exemple a afficher la taille de tous les blocs libres ?
Affiches-tu la carte correctement ?
Resouds ces petits problemes et ensuite tu peux t'attaquer au plus gros probleme.

=
0
languebasque Messages postés 4 Date d'inscription jeudi 6 avril 2006 Statut Membre Dernière intervention 6 juin 2007
27 mai 2007 à 16:11
salut


bon je crois que j'ai des connaissance en pointeur  est pour faire allouer la memoire dynamiquement


ce n'est pas ca le probleme


mais je sais pas comment definir la fonction alloue(Taille taille)


pour reserver la place dans la zone que j'ai allouée sous forme d'un tableau:


fixe de 100 item par exemple


class memoire


{


.......


memoire(item n)


{


taille=n;


 zone_memoire=new item[100];
}
mais pour la fonction membre alloue comment dois je reservé
la mmoire en item dans ce tableau de 100 etem
merci encore
0
The_Guardian Messages postés 317 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 19 octobre 2007 1
27 mai 2007 à 17:56
Salut,

Pour ta fonction je pense que tu as une carte, c'est a dire une liste d'emplacements libres ou pas. Donc bon alors supposons que ta memoire soit constituee d'un tableau de 1000 items, initialement ta memoire va ressembler a un truc du genre
[etat=libre debut=0 n=1000]
ensuite tu alloues disons 100 blocs, a priori ca va faire ca
[etat=occupe debut=0 n=100] [etat=libre debut=100 n=900]
si tu realloues un bloc de 200 blocs apres, ca va faire ca
[etat=occupe debut=0 n=100] [etat=occupe debut=100 n=200] [etat=libre debut=300 n=700]
si tu desalloues le premier bloc, tu obtiens
[etat=libre debut=0 n=100] [etat=occupe debut=100 n=200] [etat=libre debut=300 n=700]
en desallouant le deuxieme bloc, voici ce que tu auras
[etat=libre debut=0 n=1000]


bon donc voila en gros le principe. ca va donner quoi du coup en algorithme ? un truc de ce genre la


allocation(taille t)
debut
  pourchaque bloc b de la liste faire
    si b.etat==libre et b.taille>=t alors
      le debut de b est attribue a l'application
      la fin de b est libre
      retourner le nouveau bloc alloue'
    finsi
  finpourchaque
  retourner erreur
fin


pour la desallocation c'est un peu different. d'abord tu dois retrouver le bloc qui a ete alloue, ca c'est pas forcement tres dur. puis, il te faut fusionner tous les blocs libres adjacents, car il ne faut pas fragmenter la memoire.


tu vois ?


=
0

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

Posez votre question
kellyse Messages postés 5 Date d'inscription vendredi 23 mars 2007 Statut Membre Dernière intervention 5 juin 2007
28 mai 2007 à 10:52
Bonjour à tous ! merci de m'avoir répondu!
j'ai un peu compris sur certaines choses , mais d'un coter j'ai pas trop compris comment faire et commençer (c'est ce qui me dérange vraiment ) !
je  sais pas , j'aurai voulue un exemple ! si cela existe ? merci beaucoup c'est très urgent
0
languebasque Messages postés 4 Date d'inscription jeudi 6 avril 2006 Statut Membre Dernière intervention 6 juin 2007
5 juin 2007 à 16:30
bon j'ai essayé de commencer un peu mais je n'ai pas y arriver car je me bloque a la fonction void libere(adresse adresse)!
voila ce que j'ai fait:
class memoire{
typedef unsigned int Adresse;
typedef unsigned int Taille;
const Adresse NAA=UNIT_MAX;
Taille _taille;
Taille _hauteaur;
Item zone_memoire;
class Item{
public:
Item(){cout<<"+";}
virtual ~Item()
{
cout<<'-';};
public:
memoire(&memoire p);
memoire();
~memoire();
Adresse alloue(Taille taille);
void libere(Adresse adresse);
void afficheCarte(ostream & os, unsigned int nb);
};
memoire::memoire{
zone_memoire=new Item[1000];
_taille=1000;
_hauteur=0;
}
memoire::alloue(Taille taille)
{
if(taille>_taille){return NAA;//memoire insuffisante}
else{
for(int i=0;i<taille;i++) _hauteur++;
_taille=_taille-taille;
Adresse adr;
adr=hauteur-taille;
return adr;
}
}
void memoire::libere(Adresse adresse)
{
et la je sais pas comment faire?.............
0
kellyse Messages postés 5 Date d'inscription vendredi 23 mars 2007 Statut Membre Dernière intervention 5 juin 2007
5 juin 2007 à 17:44
Merci beaucoup pour cette exemple ! je pense que sa m'aidera beaucoup et encore merci à vous tous ^^
0
languebasque Messages postés 4 Date d'inscription jeudi 6 avril 2006 Statut Membre Dernière intervention 6 juin 2007
6 juin 2007 à 20:38
merci a toi aussi si t'arrive a trouver quelque chose n'esite pas de le poster merci encore
0
Rejoignez-nous