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 :

gestion de la memoire


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 14
    Par défaut gestion de la memoire
    bonjour
    j'ai un tp a préparer que je n'arrive pas a trouver l'idée pour commencer
    le problème c'est que on doit créer un tableau de 256 octets qui va jouer le rôle d'une mémoire donc l'utilisateur peut déclarer n'importe quel type de variable prédéfinie en c et on doit stocke le contenue de ses variable dans ce tableau d'une manière contiguë a l'aide d'une liste chainé où on stock l'identifiant de la variable , sa taille et son debut dans le tableau
    merci d'avance

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ada_14 Voir le message
    bonjour
    j'ai un tp a préparer que je n'arrive pas a trouver l'idée pour commencer
    le problème c'est que on doit créer un tableau de 256 octets qui va jouer le rôle d'une mémoire donc l'utilisateur peut déclarer n'importe quel type de variable prédéfinie en c et on doit stocke le contenue de ses variable dans ce tableau d'une manière contiguë a l'aide d'une liste chainé où on stock l'identifiant de la variable , sa taille et son debut dans le tableau
    merci d'avance
    Bonjour
    Il te faut juste savoir gérer une liste chainée. Ensuite le reste ça va tout seul.
    Par exemple tu veux gérer un int (4 octets), un char (1 octet) et un double (8 octets) et tu as ton tableau char mem[256].
    Ben alors l'int commence en mem[0] et prend 4 octets. Donc le char commencera en mem[4] et le double commencera en mem[5]. Et etc etc etc...

    Perso je rajouterais en plus l'espace total utilisé par les variables déjà présentes. Ainsi si je dois rajouter une nouvelle variable je saurai immédiatement où elle doit se placer dans mem sans avoir à balayer toute la liste...

    Exemple de structures de travail
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    typedef struct s_variable {
        char ident[20 + 1];      //Son nom
        unsigned char size;      // Sa taille (max 8 octets)
        unsigned char pos;      // Sa position de début dans c
        struct s_variable *next;
    } t_variable;
     
    typedef struct {
        t_variable *first;         // Premier élément de la liste
        unsigned char len;       // Longueur de la liste (en octets)
        unsigned char nb_var;  // Nb de variables de la liste (facultatif mais je pense que ça peut être utile)
        char mem[256];          // Tant qu'à faire, puisqu'on a un type dédié à la liste autant y mettre aussi le tableau dédié à la mémoire...
    } t_liste;
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 14
    Par défaut
    merci Sve@r pour votre aide
    mais comment je peux stocker des variables de differents types dans le tableau mem
    un cast suffit???

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ada_14 Voir le message
    merci Sve@r pour votre aide
    mais je n'ai pas bien compris a quoi sert la 2eme structure
    J'ai une structure pour manipuler un élément de la liste... et une structure pour manipuler la liste elle-même. Ca doit être le sujet du moment dans les écoles parce que les listes chainées ça y va depuis ces derniers jours sur le forum.
    Ici une explication détaillée sur l'utilité de cette seconde structure (ça commence à "Enfin quand on manipule une liste chainée"...)

    Citation Envoyé par ada_14 Voir le message
    Citation Envoyé par ada_14 Voir le message
    ...on doit créer un tableau de 256 octets qui va jouer le rôle d'une mémoire
    et le type du tableau qu je vais utiliser
    Bah tu l'as dit: un tableau de 256 octets !!!
    La mémoire c'est simplement une suite de caractères. Donc le tableau sera un tableau de caractères...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Janvier 2014
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2014
    Messages : 14
    Par défaut
    si j'ai compris ce que vous avez dit c'est stockée le contenue des variable dans le tableau de type de caractère mais si par exemple je veux stockée 12.145 ça va considéré 1 comme caractère et 2 comme caractère et par suite ce nombre va occuper 6 octet et non pas 4 octets et ce n'est pas ce que je veux aussi si j'utilise un cast (int*)mem ça va transformer tout le tableau en int et je serai pas capable d'ajouter des élément d'autre type si vous permettez de me donner un exemple de la manipulation du tableau avec les structure que vous avez mentionner et merci beaucoup pour votre aide

  6. #6
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par ada_14 Voir le message
    si j'ai compris ce que vous avez dit c'est stockée le contenue des variable dans le tableau de type de caractère mais si par exemple je veux stockée 12.145 ça va considéré 1 comme caractère et 2 comme caractère et par suite ce nombre va occuper 6 octet et non pas 4 octets
    Faut pas confondre "codage binaire" et "place occupée à l'écran lors de l'affichage". Quand tu écris float f=1234.5678 ça occupe bien 4 octets et non 9. Et l'entier 12 qui s'écrit sur 2 caractères sera codé 00001100 soit un octet en mémoire...

    Tu devrais reprendre tes cours sur le codage des flottants (tu te souviens, quand ton prof te parlait de mantisse et d'exposant...)

    Citation Envoyé par ada_14 Voir le message
    si vous permettez de me donner un exemple de la manipulation du tableau avec les structure que vous avez mentionner et merci beaucoup pour votre aide
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    char mem[256];
    float input1=1234.5678;
    float input2=9012.3456;
    float output=0.0;
     
    memcpy(&mem[100], &input1, sizeof(float));    // Ecriture de 4 octets (en mem[100] jusqu'à mem[103])
    memcpy(&mem[200], &input2, sizeof(float));    // Ecriture de 4 octets (en mem[200] jusqu'à mem[203])
    strcpy(mem, "Salut...");    // Ecriture de 9 octets (en mem[0] jusqu'à mem[9]
     
    memcpy(&output, &mem[100], sizeof(float));     // Récupération des 4 octets depuis mem[100]
    printf("output=%f\n", output);
     
    memcpy(&output, &mem[200], sizeof(float));     // Récupération des 4 octets depuis mem[200]
    printf("output=%f\n", output);
     
    printf("mem=[%s]\n", mem);     // Affichage des 8 octets situés en mem[0] (le '\0' n'est pas affiché)

    Voilà un petit exemple de stockage de différentes choses dans une zone mémoire. J'ai pris des valeurs larges (100, 200, 0) pour te montrer que la position n'a pas d'importance tout en étant sûr de ne pas écraser une partie de la zone mais quand c'est géré par un programme qui connait exactement chaque taille des éléments qu'il manipule il peut alors tout mettre en contigu. J'aurais pu d'ailleurs mettre parfaitement le premier float en mem[13], le second en mem[9] (il serait allé jusqu'à mem[12]) et la chaine en mem[0] (elle serait allé jusqu'à mem[8]) et donc tout rentrait bien rangé.

    Faut imaginer cette zone comme un bac à glaçons dans lequel tu ranges des apéricubes. Donc si tu y mets 4 cubes verts aux olives puis 2 cubes rouges au jambon puis 4 cubes bleus au thon et ensuite tu veux les apéricubes au jambon faudra te positionner sur la 5° case puis récupérer 2 cubes. Sans avoir besoin de les regarder tu sauras que ce sont ceux qu'il te faut.

    La liste chainée, elle, n'est là que pour référencer les variables créées (avec leurs positions dans la zone)...

    Citation Envoyé par ada_14 Voir le message
    aussi si j'utilise un cast (int*)mem ça va transformer tout le tableau en int...
    Oh là là !!! Attention, un cast ne transforme absolument rien !!!
    Un cast ne fait que dire au compilo "considère que cet élément est de tel type". Si le contenu de l'élément est compatible avec le type en question alors ça marche mais si ce n'est pas compatible, cela ne marche pas. Mais un cast ne change rien dans l'élément ou dans ce qui en ressort...

    Exemple de cast qui fonctionne
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    char mem[4];
    float f=1234.5678;
    memcpy(mem, &f, sizeof(float));
    printf("Ma valeur est %f\n", *(float*)mem);
    Etant donné que mem est un char * (pointeur sur char), je suis obligé de lui dire "considère que mem est un float* (pointeur sur float) pour ensuite aller me récupérer son contenu". Et comme j'y ai plaqué un float de façon brutale (copie octet par octet) il se trouve que ça fonctionne (parce que les 4 octets situés dans mem sont codés exactement comme l'est un float en mémoire). Mais rien de ce qui est situé dans mem ne change ou est transformé...

    Exemple de cast qui ne fonctionne pas
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char mem[]="12";
    printf("Ma valeur est %d\n", *(int*)mem);
    Là ça ne peut pas fonctionner parce que mem contient '1', '2' et '\0' sous forme de codes ascii (soit 00110001 00110010 00000000) or si le compilo tente de décoder 00110001 00110010 000000000 depuis le binaire ça donnera tout autre chose que 12...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  7. #7
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations forums :
    Inscription : Juillet 2012
    Messages : 200
    Par défaut
    En C, pour allouer dynamiquement de la mémoire, on utilise les fonctions malloc() et free() définis dans le fichier stdlib.h. Pour plus d'infos, je te conseille de lire le cours de langage C de Henri Garreta. Voir la section sur la gestion de la mémoire. Cette discussion pourra aussi t'être utile.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gestion de la memoire
    Par deeal dans le forum C++/CLI
    Réponses: 8
    Dernier message: 14/11/2006, 14h20
  2. Gestion de la memoire central d'un PC
    Par Bass_Room dans le forum C
    Réponses: 7
    Dernier message: 22/10/2006, 15h02
  3. gestion de la memoire en java
    Par jojob dans le forum Langage
    Réponses: 15
    Dernier message: 16/10/2006, 17h04
  4. Gestion de la mémoire.
    Par nicolas_faf dans le forum GTK+ avec C & C++
    Réponses: 4
    Dernier message: 27/03/2006, 16h58
  5. [JVM]Gestion de la mémoire
    Par Crypt dans le forum Général Java
    Réponses: 20
    Dernier message: 31/12/2005, 14h33

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