Structure "struct" en language C. Déclaration Avancé. comment ca marche?
Répondre à la discussion
Affichage des résultats 1 à 5 sur 5

Structure "struct" en language C. Déclaration Avancé. comment ca marche?



  1. #1
    Mrfs

    Cool Structure "struct" en language C. Déclaration Avancé. comment ca marche?


    ------

    Bonjour.

    SVP, pouvez vous m'expliquer comment fonctionne cette déclaration et initialisation simultané en language C. (le code se trouve à la fin du poste)

    1- la déclaration d'une fonction pointée?! (c'est quoi au juste?
    Code:
    void (*Init)(char CodeB, char Intensity, char ScanLimit, char ShutDown);
    2- Déclaration de la variable Display de type Max7219Struct. et son initialisation avec des adresses?! (j'ai jamais croisé ca dans les docs que j'ai lu)
    Code:
    Display={&Max7219Init,&Max7219Print,&Max7219DisplayOff,&Max7219DisplayOn,&Max7219UpdateIntensity};
    3- qu'el est l'utilité de déclarer le type externe ? (j'ai pas bien assimilé son importance au cours mes lectures
    Code:
    extern sfr sbit MAX7219_CS_LOAD;
    Merci d'avance pour votre aide.
    PS: je suis novice en programmation C. j'ai relativement bien assimilé les concets de pointeurs mais je manque de pratique sur le implémentations particulières.
    &a: permet de récupérer l'adresse d'une variable
    *p: permet d'aller chercher le contenu de l'adresse pointé.
    p: c'est une variable qui contient une adresse d'une variable quelque part en mémoire

    le Code
    --------
    Code:
    extern sfr sbit MAX7219_CS_LOAD;
    extern sfr sbit MAX7219_CS_LOAD_DIRECTION;
    
    void Max7219Init(char CodeB, char Intensity, char ScanLimit, char ShutDown);
    void Max7219Print(unsigned long Number, unsigned short NumberOfDigits);
    void Max7219DisplayOff();
    void Max7219DisplayOn();
    void Max7219UpdateIntensity(char OnValue);
    
    
    struct Max7219Struct
    {
      void (*Init)(char CodeB, char Intensity, char ScanLimit, char ShutDown);
      void (*Print)(unsigned long Number, unsigned short NumberOfDigits);
      void (*TurnOff)();
      void (*TurnOn)();
      void (*ChangeIntensity)(char OnValue);
    }Display={&Max7219Init,&Max7219Print,&Max7219DisplayOff,&Max7219DisplayOn,&Max7219UpdateIntensity};
    
    
    #include "Max7219Lib.c"

    -----

  2. #2
    polo974

    Re : Structure "struct" en language C. Déclaration Avancé. comment ca marche?

    extern, c'est pour dire que la variable existe quelque part ailleurs...

    déclarations de fonctions:
    Code:
    void Max7219Init(char CodeB, char Intensity, char ScanLimit, char ShutDown); 
    void Max7219Print(unsigned long Number, unsigned short NumberOfDigits); 
    void Max7219DisplayOff(); void Max7219DisplayOn(); 
    void Max7219UpdateIntensity(char OnValue);
    pointeur de fonction (attention aux mauvaises traductions):
    Code:
     void (*Init)(char CodeB, char Intensity, char ScanLimit, char ShutDown);
    on peut donc initialiser ce pointeur avec une fonction existante AYANT la même signature (valeur de retour et paramètres).
    puis utiliser ce pointeur comme si c'était une fonction.
    ça permet d'écrire du code où la fonction est interchangeable (genre init d'un afficheur à led ou init d'un afficheur lcd (ou autre variation, genre bus spi ou bus i2c), mais le code principal appelle toujours de la même façon.


    structure contenant des pointeurs de fonctions et son initialisation avec les fonctions déclarées:
    Code:
      struct Max7219Struct {   
        void (*Init)(char CodeB, char Intensity, char ScanLimit, char ShutDown);   
        void (*Print)(unsigned long Number, unsigned short NumberOfDigits); 
        void (*TurnOff)();   
        void (*TurnOn)();   
        void (*ChangeIntensity)(char OnValue); 
    }Display={&Max7219Init,&Max7219Print,&Max7219DisplayOff,&Max7219DisplayOn,&Max7219UpdateIntensity};
    du coup, on a ici un Display standardisé dans lequel on a glissé les fonctions correspondantes à un Max7219 (composant électronique).


    il y a (avait?) un flou en C avec les pointeurs de fonction, car on pouvait initialiser avec ou sans le &... perso, je ne mettais pas le &...
    Jusqu'ici tout va bien...

  3. #3
    pm42

    Re : Structure "struct" en language C. Déclaration Avancé. comment ca marche?

    Outre la réponse pertinente de polo974, on peut noter que c'est du code un peu bizarre notamment avec les extern qui sont plutôt dans un .h et la structure qui implémente le mécanisme d'appel de méthodes virtuelles en C++.

  4. #4
    Mrfs

    Thumbs up Re : Structure "struct" en language C. Déclaration Avancé. comment ca marche?

    Merci beaucoup. ca devient beaucoup plus claire maintenant!
    - je suis entrain de me documenter sur le pointeur de fonctions. J'ai trouvé cette vidéo plutôt intéressante (pas encore visionné)
    https://www.youtube.com/watch?v=1KWmbDFrR6U

    Entre autre:

    La déclarations de fonctions: s'est la déclaration de "prototype" de fonctions (elle sont écrites dans un autre fichier *.C)

    déclarations de fonctions:
    Code:
    void Max7219Init(char CodeB, char Intensity, char ScanLimit, char ShutDown); 
    void Max7219Print(unsigned long Number, unsigned short NumberOfDigits); 
    void Max7219DisplayOff(); void Max7219DisplayOn(); 
    void Max7219UpdateIntensity(char OnValue);
    [/INDENT]

    désolé j'ai pas très bien compris
    ça permet d'écrire du code où la fonction est interchangeable (genre init d'un afficheur à led ou init d'un afficheur lcd (ou autre variation, genre bus spi ou bus i2c), mais le code principal appelle toujours de la même façon.

    la fonction est interchangeable : (ca reste flou j'ai du mal a cerner cette particularité)
    le code principal appelle toujours de la même façon: Ex initAffichage(LCD); initAffichage(LED); c'est ca?


    du coup, on a ici un Display standardisé dans lequel on a glissé les fonctions correspondantes à un Max7219 (composant électronique).
    je vais reformuler à ma manière:
    1- Je déclare une Variable Display de type (Struc Max7219Struct).
    2- La variable Display aura pour argument 5 Pointeurs de fonctions, chacune avec son propre "squelette", qui pointeront sur rien si elles ne sont pas initialisés.
    3- On initialise ces 5 pointeur de la variable Display de sorte que le premier pointe vers l'adresse de la fonction: &Max7219Init, Le second vers ..., le cinquième vers &Max7219UpdateIntensity

    je veux faire appel à l'une des fonctions Ex: la fonction Max7219Init(). Celle ci est pointée par le pointeur de fonction () (*Init) qui se trouve dans la structure Display.
    - Display.init(...) // (intuitivement J'aurais voulu écrire Display.(*init)() ma réflexion est-t-elle juste?)
    est comme la fonction Max7219Init(char CodeB, char Intensity, char ScanLimit, char ShutDown) doit recevoir des paramètres on aura infiné
    - Display.init(Param1, param2, param3);

    extern, c'est pour dire au compilateur de pas nous "emmerde"r et que la variable est déclarée quelque part ailleurs ?

    il y a (avait?) un flou en C avec les pointeurs de fonction, car on pouvait initialiser avec ou sans le &... perso, je ne mettais pas le &...
    Il y a beaucoup de raccourcis dans la saisie de code qui prêtent beaucoup à confusion pour les débutants


    les extern qui sont plutôt dans un .h
    c'est quoi la norme dans ce cas?

    la structure qui implémente le mécanisme d'appel de méthodes virtuelles en C++
    ce type d'implémentation n'est donc pas courant? il est propre au C++???

    Merci beaucoup pour vos éclaircissement.

  5. A voir en vidéo sur Futura
  6. #5
    albanxiii
    Modérateur

    Re : Structure "struct" en language C. Déclaration Avancé. comment ca marche?

    Bonjour,

    Citation Envoyé par Mrfs Voir le message
    ce type d'implémentation n'est donc pas courant? il est propre au C++???
    C'est très utilisé dans le code du noyau linux (en C), donc on peut considérer que ça n'est pas si rare que ça.
    Ce qui est propre au C++ ce sont les méthodes virtuelles dont pm42 a parlé.
    Not only is it not right, it's not even wrong!

Discussions similaires

  1. [Programmation] Impossible de déclarer mes entrées. erreur 196 "struct/union required" [Résolu]
    Par invitef6a02118 dans le forum Électronique
    Réponses: 9
    Dernier message: 04/09/2017, 15h13
  2. "fondamentales", "dures", "molles" ... : comment classer les sciences ?
    Par invite3e35cfa1 dans le forum Epistémologie et Logique (archives)
    Réponses: 13
    Dernier message: 22/04/2017, 23h41
  3. [Blanc] LV Miele G5905SC : pompe de lavage "cycle" (marche 3" arrêt 3") ?
    Par invite5e607398 dans le forum Dépannage
    Réponses: 20
    Dernier message: 21/11/2012, 08h51
  4. SAUVEGARDE AVEC ATImage "comment ça marche.." ???
    Par coolbatteur dans le forum Logiciel - Software - Open Source
    Réponses: 3
    Dernier message: 13/11/2010, 14h34
  5. [Methode] Comment BIEN réaliser une structure de type "tableau"
    Par invitefedf3f33 dans le forum Électronique
    Réponses: 15
    Dernier message: 21/06/2010, 20h21