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 :

Tableau de pointeurs sur fonctions.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de JulieCarree
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 50
    Par défaut Tableau de pointeurs sur fonctions.
    bonjour,
    pour declarer un tableau de six pointeurs void sur fonctions sans retour ni arguments et sans typedef, apres moultes recherches, j'ai pondu ça, ça à l'air de fonctionner .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void (*parole[6])(void);
    d'apres les " Notes sur le langage C par Emmanuel Delahaye " trouvé sur dvp
    XXI-B-2-a. Remarques importantes▲
    void* n'est pas un type correct pour un pointeur de fonction ;
    Il n'existe pas de type générique pour les pointeurs de fonctions.


    ma question :
    faut-il utiliser des fonctions qui retournent un resultat ?

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 485
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 485
    Par défaut
    Hello,

    Je crois que ce qu'il voulait dire, c'est qu'on ne met pas un pointeur de fonction dans un objet de type « void * » tout court pour que ce soit plus simple. Mais tu as bien sûr tout-à-fait le droit de déclarer des pointeurs sur des fonctions de type void.

    L'idée générale est qu'un pointeur « void * » pointe quelque chose dont le type est indéfini, ce qui peut donc être n'importe quoi. Néanmoins, ce « n'importe quoi » ne peut pas être une fonction. C'est principalement dû au fait que les architectures Harvard stockent code et données dans des espaces d'adressage différents et que l'on considère que ce qui est pointé par « void * » est une donnée.

    On en parlait ici.

  3. #3
    Membre éclairé Avatar de JulieCarree
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 50
    Par défaut
    merci de ta reponse,
    j'ai survolé le topic que tu as mis en lien, donc ce n'est pas defini dans la norme C, de plus suivant l'architecture ( bus de données et instructions ) il y a une impossibilité materielle .
    sur gcc c'est permis et c'est defini dans la norme posix .

    j'ai ecris ce petit essait :

    Code : 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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    void bonjour ( void );
    void adieu ( void );
    void merci ( void );
    void siouplait ( void );
    void atchoum ( void );
    void casse_toi ( void );
     
    int main ( void )
    {
            int gogo;
            void (*parole[6])(void); /* tableau de six pointeurs void sur fonctions sans retour ni arguments */
     
            parole[0] = bonjour;
            parole[1] = adieu;
            parole[2] = merci;
            parole[3] = siouplait;
            parole[4] = atchoum;
            parole[5] = casse_toi;
     
            for ( gogo = 0; gogo < 6; ++gogo)
                    parole[gogo]();
     
            gogo = 5;
            do
            {
                    parole[gogo]();
                    --gogo;
             }
             while  (gogo >= 0);
     
            return 0;
    }
    Compilé avec gcc -pedantic -ansi -W -Wall argue_1.c -o argue_1, pas de plaintes de gcc .

  4. #4
    Membre Expert
    Avatar de Metalman
    Homme Profil pro
    Enseignant-Chercheur
    Inscrit en
    Juin 2005
    Messages
    1 049
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Enseignant-Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 1 049
    Par défaut
    Uuuuh... chez moi ça ne link pas...

    Undefined reference to 'bonjour'
    Et sur chaque nom de fonction...

    D'un seul coup ça m'intéresse, car je m'étais assez énervé un soir avec les pointeurs sur fonction !

    EDIT : hahahaha... bah oui.. je suis c*n... il trouve pas les réf c'est normal...
    Avec un -c ça marcherait "mieux"
    --
    Metalman !

    Attendez 5 mins après mes posts... les EDIT vont vite avec moi...
    Les flags de la vie : gcc -W -Wall -Werror -ansi -pedantic mes_sources.c
    gcc -Wall -Wextra -Werror -std=c99 -pedantic mes_sources.c
    (ANSI retire quelques fonctions comme strdup...)
    L'outil de la vie : valgrind --show-reachable=yes --leak-check=full ./mon_programme
    Et s'assurer que la logique est bonne "aussi" !

    Ma page Developpez.net

  5. #5
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Citation Envoyé par JulieCarree Voir le message
    bonjour,
    pour declarer un tableau de six pointeurs void sur fonctions sans retour ni arguments et sans typedef, apres moultes recherches, j'ai pondu ça, ça à l'air de fonctionner .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void (*parole[6])(void);
    moi, pour un tableau de fonction void f(void), je ferai oplutot ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    typedef void (*action_t)(void);
    void bonjour ( void );
    void adieu ( void );
    void merci ( void );
     
    int main ( void ) {
        action_t parole[]={bonjour, adieu, merci};
        return 0;
    }

  6. #6
    Membre éclairé Avatar de JulieCarree
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 50
    Par défaut
    @ Metalman
    Uuuuh... chez moi ça ne link pas...

    Citation:
    Undefined reference to 'bonjour'
    normal, les fonctions sont en option

    @ leternel,
    merci, j'avais dejà trouvé sur le net avec le typedef, mais sans le typedef, pas evident de trouver comment definir un tableau de pointeurs void sur fonctions .

  7. #7
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    C'est l'intérêt même du typedef, justement: améliorer la lisibilité, et l'écrivabilité.
    En plus d'ajouter une information sémantique si les noms sont bien choisit.

  8. #8
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Oui, pour les pointeurs de fonction, je dirais que les typedefs sont pratiquement indispensable à une bonne compréhension.
    Il n'y a qu'à voir le prototype de la fonction signal() pour voir à quel vitesse la manipulation de pointeurs de fonction devient compliquée sans typedefs.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  9. #9
    Membre éclairé Avatar de JulieCarree
    Homme Profil pro
    Inscrit en
    Juin 2012
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 50
    Par défaut
    @ medinoc

    ok je sais, et je l'ai bien compris, mais ma demarche est de comprendre comment ça marche sans typedef, j'apprends tout seul pour le plaisir de comprendre, je ne dois pas rendre de projet demain à la premiere heure, mais merci à tous de prendre le temps de me repondre, moi qui ne suis pas pro de l'informatique .

  10. #10
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par JulieCarree Voir le message
    @ leternel,
    merci, j'avais dejà trouvé sur le net avec le typedef, mais sans le typedef, pas evident de trouver comment definir un tableau de pointeurs void sur fonctions .
    Salut, tu devrais essayer cdecl (version web):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    cdecl> declare parole as array 6 of pointer to function (void) returning void
    void (*parole[6])(void )
    cdecl> 
    cdecl> declare selectFunction as function (int, array of pointer to function(int, int) returning int, int) returning pointer to function (int, int) returning int
    int (*selectFunction(int , int (*[])(int , int ), int ))(int , int )
    Amuses-toi bien

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 09/01/2013, 15h30
  2. Réponses: 1
    Dernier message: 22/12/2009, 11h40
  3. [BCB6]Tableau de pointeurs sur fonctions
    Par rtg57 dans le forum C++Builder
    Réponses: 6
    Dernier message: 06/10/2006, 20h49
  4. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37

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