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 :

déclaration de structure


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 854
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 854
    Par défaut déclaration de structure
    Bonjour,

    Je travaille sur un µC, j'ai donc deux zones mémoires pour le stockage de mes données : la ROM et la RAM.

    J'ai des éléments qui sont constitués
    - nom de l'élément : type string
    - description de l'élément : type string
    - pointeur de fonction associé a l'élément


    donc j'ai créé ma structure comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    typedef struct _structElement
    {
    	rom char *eltName;
    	rom char *eltDesc;
    	TYPE_FUNC_VOIDVOID *ptr_action;
    } structElement;
    Declaration de mon type pointeur de fonction TYPE_FUNC_VOIDVOID :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef void TYPE_FUNC_VOIDVOID(void); // fonction de type : void toto(void)

    Donc voici comment je déclare un élément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    rom const structElement elt1 = { "ma commande1"   , "ma description1", toto()};
    rom const structElement elt2 = { "ma commande2"   , "ma description2", tutu()};
    ...
    la liste de tous mes elements :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    rom structElement *rom tabElt[] =  {&elt1, &elt2, ...}

    Donc pour lancer la commande de l'element 0, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (*tabElt[0]->ptr_action)();
    => pas encore testé



    Mon but est d'avoir un tableau qui est composé de ma liste de commande et qu'il soit facile de modifier/ajouter un élément => toutes ces données doivent être stockées en ROM
    => est-ce que vous auriez fait comme ça ?
    => j'ai un doute sur le positionnement des attributs "rom" et "const"...

  2. #2
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 184
    Par défaut
    Attention il me semble qu'il y a une erreur dans ta déclaration du type de pointeur sur fonction, ce serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef void (*TYPE_FUNC_VOIDVOID)(void); // fonction de type : void toto(void)
    du coup, ta struct devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct _structElement
    {
    	rom char *eltName;
    	rom char *eltDesc;
    	TYPE_FUNC_VOIDVOID ptr_action;
    } structElement;
    puisque TYPE_FUNC_VOIDVOID est déjà un pointeur.
    De même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    rom const structElement elt1 = { "ma commande1"   , "ma description1", toto};
    rom const structElement elt2 = { "ma commande2"   , "ma description2", tutu};
    Pas de parenthèses, sinon, la valeur de toto() c'est la valeur de retour d'une exécution de la fonction toto et non pas l'adresse de la fonction toto.

    Enfin pour lancer la commande, c'est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tabElt[0]->ptr_action();
    Par contre je ne connais pas le qualificatif rom, je pense que ça doit être spécifique à la plateforme non ?

  3. #3
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 854
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 854
    Par défaut
    merci pour ta réponse

    rom est spécifique a ma plateforme c'est jsute pour dire que la variable est stockée en rom => mais je crois bien que ça fait la même chose si j'utilise const

    par contre es-tu bien sure pour la déclaration du pointeur de fonction ? dans le lien suivant, il n'y a pas de parenthèses :
    http://c.developpez.com/faq/?page=ta...dresse_tableau

  4. #4
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par huit_six Voir le message
    Attention il me semble qu'il y a une erreur dans ta déclaration du type de pointeur sur fonction, ce serait plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef void (*TYPE_FUNC_VOIDVOID)(void); // fonction de type : void toto(void)
    du coup, ta struct devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct _structElement
    {
    	rom char *eltName;
    	rom char *eltDesc;
    	TYPE_FUNC_VOIDVOID ptr_action;
    } structElement;
    puisque TYPE_FUNC_VOIDVOID est déjà un pointeur.
    Donc y avait finalement pas erreur dans l'ancienne déclaration de TYPE_FUNC_VOIDVOID (qui était un type "fonction" et que TU as préféré changé directement en "pointeur de fonction").

    Citation Envoyé par boboss123
    Donc pour lancer la commande de l'élément 0, je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (*tabElt[0]->ptr_action)();
    Le déréférencement est inutile.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    printf("Vive le C !\n");
    (printf)("Vive le C !\n");
    (&printf)("Vive le C !\n");
    (*printf)("Vive le C !\n");
    (**printf)("Vive le C !\n");
    (*************printf)("Vive le C !\n");
    => C'est la même chose. Voir tutos/FAQs.

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Septembre 2009
    Messages
    1 854
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2009
    Messages : 1 854
    Par défaut
    merci beaucoup, ça marche

    mais auriez vous structuré votre projet de la même manière que ce que je fais la (ça me semble pas mal comme solution) ?

  6. #6
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    ça me semble pas mal comme solution
    En effet .

  7. #7
    Membre très actif
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    184
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 184
    Par défaut
    Et bah MINCE alors !

    Je viens d'apprendre quelque chose ! Je ne savais pas qu'il existait de type fonction !

    Je n'en avais jamais entendu parler, je manipulais des pointeurs de fonction, mais pas de types fonction.

    [Edit] Je suis en train de lire ton cours Melem, je savais bien que j'aurai du le faire avant...

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

Discussions similaires

  1. Déclaration des structures
    Par DavidleVrai dans le forum Débuter
    Réponses: 5
    Dernier message: 03/05/2013, 15h03
  2. Déclaration de structures et pointeurs de structure
    Par Alpha573 dans le forum Débuter
    Réponses: 1
    Dernier message: 22/11/2011, 18h09
  3. [WD14] Déclaration de structure via compilation dynamique
    Par cladoo dans le forum WinDev
    Réponses: 14
    Dernier message: 15/02/2011, 14h22
  4. Déclaration de structures dépendantes
    Par Dark-Seal dans le forum C
    Réponses: 6
    Dernier message: 02/12/2006, 21h43
  5. déclaration et création de structure.
    Par poporiding dans le forum C++
    Réponses: 4
    Dernier message: 17/01/2006, 10h37

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