Partage
  • Partager sur Facebook
  • Partager sur Twitter

Allouer de la mémoire

    19 mars 2006 à 14:35:27

    Bonjour à tous,

    La fonction malloc ne permet a priori d'allouer un espace mémoire minimum de 1 octet. J'aimerais savoir s'il est possible en C d'allouer n bits de mémoire, et si possile avec quelle fonction.

    Seconde question. Si grace a malloc j'alloue un espace sizeof(int) en mémoire, est il possible de donner à chacun des bits une valeur binaire. Peu on ensuite récuperer cette valeur en tant qu'int ?

    Merci d'avance,
    Alexandre
    • Partager sur Facebook
    • Partager sur Twitter
      19 mars 2006 à 15:09:18

      Citation : lexou

      Bonjour à tous,


      Bonjour

      Citation : lexou

      La fonction malloc ne permet a priori d'allouer un espace mémoire minimum de 1 octet.


      Oui, c'est exact.

      Citation : lexou

      J'aimerais savoir s'il est possible en C d'allouer n bits de mémoire, et si possile avec quelle fonction.


      Non, c'est pas possible. Tu ne peux allouer que des octets "entiers", par contre tu peux les utiliser comme tu veux.

      Citation : lexou

      Seconde question. Si grâce a malloc j'alloue un espace sizeof(int) en mémoire, est-il possible de donner à chacun des bits une valeur binaire. Peut-on ensuite récupérer cette valeur en tant qu'int ?


      J'ai du mal à comprendre... Tu devrais regarder du côté des champs de bits, exemple :
      typedef struct {
          int machin   : 1;
          int bidule   : 1;
          int truc     : 1;
          int chose    : 1;
          int chouette : 1;
          int test     : 1;
      } Champ;


      Sinon, tu dois pouvoir te servir des opérateurs <<, | et &.
      • Partager sur Facebook
      • Partager sur Twitter
        19 mars 2006 à 15:18:05

        Citation : lexou


        La fonction malloc ne permet a priori d'allouer un espace mémoire minimum de 1 octet.


        Pour être tout à fait précis, un byte (ou char), c'est à dire un objet correctement aligné d'au moins 8 bits.

        Citation : lexou


        J'aimerais savoir s'il est possible en C d'allouer n bits de mémoire, et si possile avec quelle fonction.


        Non, et je ne vois pas l'intérêt. La résolution en C est le char.

        Citation : lexou


        Seconde question. Si grace a malloc j'alloue un espace sizeof(int) en mémoire, est il possible de donner à chacun des bits une valeur binaire. Peu on ensuite récuperer cette valeur en tant qu'int ?


        Quelque soit la classe mémoire d'un objet (automatique, statique, alloué), il est toujours possible d'utiliser les opérateurs bit (bitwise operators) pour positionner des bits de cet objet. L'effet sera portable avec les entiers non signés.

        Explique ce que tu veux faire exactement.
        • Partager sur Facebook
        • Partager sur Twitter
        Music only !
          19 mars 2006 à 15:22:13

          J'ai essayé de pondre un petit code vite fait, mais c'est du C++ et il peut y avoir des erreurs (mais l'idée est là).

          #include <cstdio>

          #define MEM_SIZE   4 // En octets

          class Bit {

          protected:
             
              static unsigned char Memoire[MEM_SIZE]// La mémoire à utiliser
              static unsigned char Used[MEM_SIZE];     // Mémoire déjà utilisée
              static bool Init;                        // Initialisé ?
              unsigned int Offset;                     // Bit à utiliser
          public:
              Bit();
              ~Bit();
              void operator=(int);
              int value();
              class Exception {};
          };

          // Variables statiques
          unsigned char Bit::Memoire[MEM_SIZE];
          unsigned char Bit::Used[MEM_SIZE];
          bool Bit::Init = false;

          // Constructeur
          Bit::Bit()
          {
              int i;
              // Initialise la mémoire partagée
              if(Init==false)
              {
                  for(i=0;i<MEM_SIZE;i++)
                  {
                      Memoire[i] = 0;
                      Used[i]    = 0;
                  }
                  Init=true;
              }

              // Alloue un bit
              for(i=0;i<MEM_SIZE*8;i++)
                  if((Used[i/8]>>(i%8))%2 == 0)
                  {
                      Offset = i;
                      Used[i/8] = Used[i/8] | (1<<(i%8));
                      return ;
                  }
          }

          // Destructeur
          Bit::~Bit()
          {
              Used[Offset/8] = Used[Offset/8] ^ (1<<(Offset%8));
          }

          // Affectation
          void Bit::operator=(int nb)
          {
              if      (nb==1) Memoire[Offset/8] = Memoire[Offset/8] | (1<<(Offset%8));
              else if (nb==0) Memoire[Offset/8] = Memoire[Offset/8] ^ (1<<(Offset%8));
              else            throw Bit::Exception();
          }

          // Récupérer la valeur
          int Bit::value()
          {
              return ((Memoire[Offset/8] >> (Offset%8))==1)?1:0;
          }

          // Procédure principale
          int main()
          {
              // Des bits
              Bit premier_bit;
              Bit second_bit;
              Bit troisieme_bit;
              // Affectation via des ints
              premier_bit = 1;
              second_bit  = 0;

              try {
              troisieme_bit = 5; // Va bien sûr lever une exception
              } catch(Bit::Exception e) {
                  printf("Erreur !\n");
              };
              // Affichage des valeurs
              int a,b;
              a = premier_bit.value();
              b = second_bit.value();
              printf("%d %d\n",a,b);
              return 0;
          }


          Edit : ça marche maintenant
          • Partager sur Facebook
          • Partager sur Twitter
            19 mars 2006 à 15:29:06

            Je doute qu'un code en C++ l'aide à mieux comprendre la chose :(
            • Partager sur Facebook
            • Partager sur Twitter

            If you'd like to join us, read "How do we work at OpenClassrooms"! :)

              19 mars 2006 à 16:26:26

              D'après sa question, c'est la seule chose utile que je puisse faire : un système pour allouer des bits séparement. Ils sont stockés dans le tableau static Memoire les uns après les autres, ce qui permet de les envoyer par le réseau, dans un fichier etc (je sais pas pourquoi il doit mettre des bits bout-à-bout, moi !).
              S'il veut avoir ces bits uniquement pour éviter un tableau de bools (donc un octet par bool, alors qu'il suffirait d'un bit), évidement il doit passer par les champs de bits, car ma classe n'allège rien (l'offset est sur 4 octets).
              • Partager sur Facebook
              • Partager sur Twitter
                19 mars 2006 à 19:35:59

                Merci à tous pour vos réponses.

                -Ed- a parfaitement répondu au probleme que je me posais. Merci pour ce bout de code aussi, je connais un peu le java ca m'a l'air plutot semblable question structure du code.

                En fait je voulais en effet coder un bool sur 1bit. C'est impossible, tant pi c'est comme ca qu'on apprend. En ce qui concerne la deuxieme question j'ai compris en gros en quoi ca consistait, c'est à dire déclarer un INT et modifier la valeur bit par bit. Aussi si vous pouviez en quelques ligne completer ce code :

                int monINT=10;
                //Travail sur les bit pour avoir monINT=11;


                Résoudre ce probleme est tres simple grace a une affectation standard, mais c'est la méthode qui m'interesse. Merci à vous.

                Alexandre
                • Partager sur Facebook
                • Partager sur Twitter
                  19 mars 2006 à 21:01:58

                  Citation : lexou

                  Merci pour ce bout de code aussi, je connais un peu le java ca m'a l'air plutôt semblable question structure du code.


                  Si c'est bien de mon code que tu parles, c'est pas du java mais du C++ (c'est vrai que c'est assez proche, on va dire entre java et C (bien que chronologiquement ce soit pas ça du tout)).

                  Citation : lexou

                  En fait je voulais en effet coder un bool sur 1bit. C'est impossible, tant pis c'est comme ça qu'on apprend.


                  Si, tu peux avec les champs de bits (M@teo21 en parle dans son cours je suppose).

                  Citation : lexou

                  Aussi est-ce que vous pourriez en quelques lignes compléter ce code :

                  int monINT=10;
                  /* Travail sur les bit pour avoir monINT=11; */



                  Résoudre ce probleme est très simple grace a une affectation standard, mais c'est la méthode qui m'intéresse. Merci à vous.

                  Alexandre


                  "11" (binaire, 3 en décimal) ou 11 en binaire (00001011) ?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 mars 2006 à 1:09:19

                    J'avais bien compris que ce n'étais pas du java. Sinon c'est 11 en décimal donc en fait c'est monINT+1 =). Et si matéo passe par la qu'il confirme que cette partie sur les champs de bits est dans son cours, car je ne me rappel pas l'avoir trouvé en le suivant.
                    • Partager sur Facebook
                    • Partager sur Twitter

                    Allouer de la mémoire

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown