Partage
  • Partager sur Facebook
  • Partager sur Twitter

Aide à la compréhension des pointeurs

Sujet résolu
    28 novembre 2023 à 2:45:10

    Bonjour, j'aimerais comprendre ce que signifie (int* ).

    int* pArr = (int* ) HeapAlloc(hHeap, 0, sizeof(int) * 30);

    voici, où trouver le trouver : https://cpp.hotexamples.com/examples/-/-/HeapCreate/cpp-heapcreate-function-examples.html

    • Partager sur Facebook
    • Partager sur Twitter
      28 novembre 2023 à 8:40:48

      Salut,

      C'est un cast (comme quand tu cast un int en short par exemple).

      Ici tu cast le void* (retour de HeapAlloc) en int*

      • Partager sur Facebook
      • Partager sur Twitter

      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

        28 novembre 2023 à 10:47:15

        C'est un type de cast " à la C" qui devrait être remplacer en C++ avec un type de cast plus spécifique, au pire un reinterpret_cast serait toujours mieux qu'un cast à la "C".
        • Partager sur Facebook
        • Partager sur Twitter
        Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
          28 novembre 2023 à 10:57:34

          Historiquement c'est le job de static_cast.

          Mais je crois que reinterpret_cast est valide pour ça maintenant.

          Mais la vraie question... Pourquoi? C'est quoi ces trucs pas standards ? Tu es obligé de les utiliser? Ou tu es dans une optique d'apprentissage des pointeurs? (auquel cas. Fuis!)

          • Partager sur Facebook
          • Partager sur Twitter
          C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
            28 novembre 2023 à 15:11:36

            sarazin a écrit:

            Bonjour, j'aimerais comprendre ce que signifie (int* ).

            int* pArr = (int* ) HeapAlloc(hHeap, 0, sizeof(int) * 30);

            voici, où trouver le trouver : https://cpp.hotexamples.com/examples/-/-/HeapCreate/cpp-heapcreate-function-examples.html


            En fait c'est clairement du C, microsoftien de plus (win32), avec printf_s, ... pas du C++

            Sinon, le (int *) en C, c'est un transtypage (typecast) qui indique que le résultat de HeapAlloc doit être converti en / considéré comme l'adresse d'un int, ce qui arrange bien les choses pour l'affecter dans pArr, qui est de ce type  int*.


            Doc https://learn.microsoft.com/fr-fr/windows/win32/api/heapapi/nf-heapapi-heapalloc

            Valeur retournée

            Si la fonction réussit, la valeur de retour est un pointeur vers le bloc de mémoire alloué.

            ---

            On peut faire un parallèle avec ce qui se passait du temps du C d'avant la normalisation (vous étiez pas nés, comme les poissons), quand le type void* n'existait pas, et que la fonction d'allocation malloc était comme ceci

            char* malloc(int size);
            

            elle retournait (si tout va bien) l'adresse du premier octet (= char en C) de la zone de taille size allouée dynamiquement.

            Alors si voulait allouer un tableau de 10 entiers, on ne pouvait pas faire

            int *tab = malloc(10 * sizeof(int));   // incorrect
            


            parce que le résultat de malloc est un char*, type différent de int*.

            Alors il fallait forcer la conversion en disant, ok, c'est l'adresse du premier octet, mais c'est aussi l'adresse du premier entier du tableau, donc il faut la considérer comme une adresse d'entier. C'est à ça que sert le "transtypage"

            int *tab = (int *) malloc(10 * sizeof(int));  
            
            


            Ensuite, dans leur grande sagesse, les concepteurs du langage ont inventé le type "pointeur générique" void*, et malloc est devenu

            void* malloc(int size);
            

            ce qui permet d'écrire

            int *tab = malloc(10 * sizeof(int));
            


            parce que les void* sont compatibles avec les autres types de pointeurs.

            Evidemment, un quart de siècle plus tard, il traine encore sur internet des cours pas à jour qui disent de faire le transtypage devant malloc, et des codes sources qui donnent l'exemple de ce qu'il ne faut plus faire depuis des lustres.



            -
            Edité par michelbillaud 28 novembre 2023 à 16:15:50

            • Partager sur Facebook
            • Partager sur Twitter
              30 novembre 2023 à 0:01:49

              Merci, pour vos réponses.


              lmghs a écrit:

              Mais la vraie question... Pourquoi? C'est quoi ces trucs pas standards ? Tu es obligé de les utiliser? Ou tu es dans une optique d'apprentissage des pointeurs? (auquel cas. Fuis!)


              Oui, je suis dans une optique d'apprentissage. J'essaye d'appendre windows GDI en utilisant dans un projet. Et il devait pointer vers un BITMAP

              -
              Edité par sarazin 30 novembre 2023 à 9:27:59

              • Partager sur Facebook
              • Partager sur Twitter
                30 novembre 2023 à 9:39:42

                Bonjour !

                Quel est l'objectif final, pour ton apprentissage de GDI ?

                • Partager sur Facebook
                • Partager sur Twitter

                Si vous ne trouvez plus rien, cherchez autre chose.

                  30 novembre 2023 à 10:41:07

                  Le GDI de Windows, c'est vieux, assez limité et pas portable.

                  Il y a une "vraie" raison pour utiliser cette API C dans un programme C++ ?

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                    30 novembre 2023 à 10:49:47

                    sarazin a écrit:

                    Et il devait pointer vers un BITMAP

                    Pourquoi :  sizeof(int) * 30  et pas   sizeof(BITMAP)  ?



                    • Partager sur Facebook
                    • Partager sur Twitter
                    ...
                      30 novembre 2023 à 14:11:41

                      Et pourquoi pas

                      BITMAP *pBitmap = (BITMAP *) HeapAlloc(machin, truc, sizeof(BITMAP));

                      -
                      Edité par michelbillaud 30 novembre 2023 à 14:12:37

                      • Partager sur Facebook
                      • Partager sur Twitter
                        30 novembre 2023 à 15:59:44

                        Hum... Les fonctions de l'API de GDI volent les bitmaps qu'on leur donne?

                        Si "non" => `new[]`, c'est bien.

                        Mais j'ai comme l'impression qu'il y a des toutes façon des fonctions dédiées genre CreateBitmap() et DeleteObject() à mettre dans des capsules RAII.

                        Je rêve ou "GDI", c'est du Windows 32 bits...?

                        Puis-je recommander d'apprendre à manipuler un truc qui pourra vraiment potentiellement te servir un jour, genre Qt à la place?

                        • Partager sur Facebook
                        • Partager sur Twitter
                        C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                          30 novembre 2023 à 16:39:01

                          lmghs a écrit:

                          Je rêve ou "GDI", c'est du Windows 32 bits...?

                          Oui, Windows. 32 et 64 bits
                          • Partager sur Facebook
                          • Partager sur Twitter
                          ...
                            1 décembre 2023 à 9:39:16

                            GDI, c'est un truc où il y a encore des bidules 16bits dedans pour assurer de la rétrocompatibilité avec des machins des années 80.

                            Alors dire que GDI est 32 bits, c'est très vite dit (et encore pire pour 64 bits).

                            Il y a des limitations parce qu'il y a tables limite à 64k entrées, LOL.

                            BITMAP, c'est une structure C à taille variable.

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                              1 décembre 2023 à 10:09:09

                              bacelar a écrit:

                              Alors dire que GDI est 32 bits, c'est très vite dit (et encore pire pour 64 bits).

                              Et pourtant, c'est toujours là. Aussi bien en 32 bits qu'en 64 bits.

                              bacelar a écrit:

                              BITMAP, c'est une structure C à taille variable.

                              typedef struct tagBITMAP {
                                LONG   bmType;
                                LONG   bmWidth;
                                LONG   bmHeight;
                                LONG   bmWidthBytes;
                                WORD   bmPlanes;
                                WORD   bmBitsPixel;
                                LPVOID bmBits;
                              } BITMAP;
                              Il y a quoi de variable en taille ?

                              -
                              Edité par rouIoude 1 décembre 2023 à 10:19:36

                              • Partager sur Facebook
                              • Partager sur Twitter
                              ...
                                1 décembre 2023 à 10:24:19

                                et du coup, quel intérêt de l'allouer dynamiquement ?

                                (les exemples stupides qui trainent sur internet....)

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  1 décembre 2023 à 10:40:31

                                  "LPVOID bmBits", c'est le premier octet d'un truc dont la taille est un calcul sur les champs d'avant.

                                  (C'est encore plus bordélique que dans mes souvenirs)

                                  Laissez mourir le GDI en paix. BORDEL !

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                                    1 décembre 2023 à 11:00:48

                                    Documentation

                                    LPVOID

                                    Pointeur vers n’importe quel type.

                                    Ce type est déclaré dans WinDef.h comme suit :

                                    typedef void *LPVOID;

                                    (ayant réussi à échapper - Dieu merci - à toute programmation sous windows, je ne risque pas de me baser sur des souvenirs, je consulte la doc)
                                    => LPVOID Bmbits, c'est un pointeur contenant l'adresse de début d'un truc qui contient des bits (les pixels).
                                    => BITMAP est de taille fixe  : on peut en prendre le sizeof, donc c'est un type complet, contrairement aux structs à taille variable  https://en.wikipedia.org/wiki/Flexible_array_member

                                    -
                                    Edité par michelbillaud 1 décembre 2023 à 11:22:49

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      1 décembre 2023 à 11:30:16

                                      bacelar a écrit:

                                      "LPVOID bmBits", c'est le premier octet d'un truc dont la taille est un calcul sur les champs d'avant.

                                      LPVOID bmBits est un pointeur ! Il ne faut pas confondre avec les "flexible array member".
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      ...
                                        1 décembre 2023 à 15:05:05

                                        Oupsi, la mémoire qui flanche.

                                        L'habitude de gérer ça comme un block continu en mémoire quand on les forgent "à la main" qui m'est resté.

                                        Mais vous voyez bien le truc à la con où on se retrouve avec des champs de type pointeur initialisé avec de la mer.. si on oublie le ZeroMemory.

                                        GDI RIP !!!

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
                                          1 décembre 2023 à 18:37:42

                                          bacelar a écrit:

                                          Oupsi, la mémoire qui flanche.

                                          L'habitude de gérer ça comme un block continu en mémoire quand on les forgent "à la main" qui m'est resté.

                                          Mais vous voyez bien le truc à la con où on se retrouve avec des champs de type pointeur initialisé avec de la mer.. si on oublie le ZeroMemory.

                                          GDI RIP !!!

                                          Ah, mais le programmeur C sait ce qu'il fait, par définition.

                                          Sinon, une bonne habitude c'est d'initialiser à la déclaration 

                                          BITMAP b = {

                                              .bmtype = ...,

                                              ....

                                          }

                                          Les champs non cités sont mis à 0.

                                          Ce qui est lié au fait de déclarer les variables à l'endroit oû 1) on on peut leur donner une valeur qui a un sens 2) on va en avoir besoin juste après.

                                                 

                                          -
                                          Edité par michelbillaud 1 décembre 2023 à 18:43:02

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            1 décembre 2023 à 19:39:29

                                            dragonjoker a écrit:

                                            Bonjour !

                                            Quel est l'objectif final, pour ton apprentissage de GDI ?


                                            Le  but est de comparer 2 images. par exemple 2 miniatures d'une vidéo youtube pour savoir si c'est une même vidéos ou pas, les couleurs qui reviennent le plus etc..
                                            .

                                            michelbillaud a écrit:

                                            Et pourquoi pas

                                            BITMAP *pBitmap = (BITMAP *) HeapAlloc(machin, truc, sizeof(BITMAP));

                                            -
                                            Edité par michelbillaud hier à 14:12


                                            C'est ce que j'ai fait, la ligne de code de l'exemple est juste repris du lien que j'ai donner dans mon premier message.

                                            bacelar a écrit:

                                            Le GDI de Windows, c'est vieux, assez limité et pas portable.

                                            Il y a une "vraie" raison pour utiliser cette API C dans un programme C++ ?

                                            J'ai expliqué la raison plus haut et donc que préconise tu comme "outils" plus adapté ?

                                            lmghs a écrit:

                                            Puis-je recommander d'apprendre à manipuler un truc qui pourra vraiment potentiellement te servir un jour, genre Qt à la place?

                                            Qt est-il adapté ? J'ai regarder est, c'est une API d'interface graphique... Mais pour avoir accès à tout le service, je crois qu'il faut payer. Donc, ma question est, la partie gratuite est il-il toujours adapté pour ce que je veux faire ?

                                            Encore, une fois merci pour vos nombreuses réponses.




                                            -
                                            Edité par sarazin 1 décembre 2023 à 19:41:31

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              1 décembre 2023 à 20:56:32

                                              Qt est payant uniquement dans certaines conditions et pour certains modules. Pas de problème dans ton cas.
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                4 décembre 2023 à 9:01:43

                                                >J'ai expliqué la raison plus haut et donc que préconise tu comme "outils" plus adapté ?

                                                Pourquoi ne pas utiliser des moteurs de recherche d'images ? (qui ne prennent pas des BITMAP en paramètres)

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.

                                                Aide à la compréhension des pointeurs

                                                × 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