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 :

Pointeur sur une fonction


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Pointeur sur une fonction
    Bonjour à tous

    malgré pas mal de recherches je n'arrives pas bien à cerner l'intérêt de passer un pointeur sur une fonction comme ceci:

    int *fct ( ... )
    {
    ...
    return &p
    }

    au lieu d'un traditionnel int fct (...) { ... }

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int *fct ( ... )
    {
    ...
    return &p
    }
    tu ne passes pas du tout l'adresse d'une fonction, cette fonction en fait retourne un pointeur vers un enteir, donc en fait l'adresse d'un entier.

    Petite remarque comme tu fais return &p; on "peut" penser que ce p est une variable locale à la fonciton dont l'adresse sera devenue inutilisable au sortir de cette fonction, donc c'est une faute grave en C, signalée en principe par un compilo bien réglé.

    Par contre ce peut-être très utile de passer des adresses de fonctions : par exemple le qsort de C est une fonction qui permet de trier très rapidement n'importe quele type de tableau d'objets, commet fait cette fonction ? tout simplement on lui fournit, en particulier, l'adresse de la fonction de comparaison des éléments du tableau.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Trap D
    Petite remarque comme tu fais return &p; on "peut" penser que ce p est une variable locale à la fonciton dont l'adresse sera devenue inutilisable au sortir de cette fonction, donc c'est une faute grave en C, signalée en principe par un compilo bien réglé.
    oui tout a fait.

    si j'ai bien compris ca peut être très pratique pour faire passer un tableau à une autre fonction :
    est-ce un moyen pour éviter les problèmes de variables locales-globales entre fonctions ?
    je patoge un peu

  4. #4
    Rédacteur
    Avatar de Neitsa
    Homme Profil pro
    Chercheur sécurité informatique
    Inscrit en
    Octobre 2003
    Messages
    1 041
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Chercheur sécurité informatique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 041
    Points : 1 956
    Points
    1 956
    Par défaut
    Bonjour,

    il existe un tutorial très bien fait sur les pointeurs de fonctions à cette adresse :

    http://www.newty.de/fpt/index.html

    Possibilité de télécharger les tutoriaux en PDF ou PS (en français ou anglais) et les codes sources.

    Voir aussi la section liens ( http://www.newty.de/fpt/chapt5.html#misc ) qui est intéressante.

  5. #5
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Merci pour le lien, c'est toujours bienvenu!

    Meilleures salutations

    Thierry

  6. #6
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par bogosse
    si j'ai bien compris ca peut être très pratique pour faire passer un tableau à une autre fonction :
    Non.
    est-ce un moyen pour éviter les problèmes de variables locales-globales entre fonctions ?
    je patoge un peu
    Les applications des pointeurs de fonctions sont basées sur des concepts assez avancés (liens dynamiques, callbacks) que je te conseille de voir un peu plus tard quand tu 'pataugeras" moins en C...

    Mais si tu y tiens, voici un article qui utilise la notion de 'callback' très utilisé en programmation évènementielle :

    http://emmanuel-delahaye.developpez.com/complog.htm

  7. #7
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Les applications des pointeurs de fonctions sont basées sur des concepts assez avancés
    Je ne crois pas que la question initiale se portait sur les pointeurs de fonction, mais sur les fonctions qui renvoient un pointeur:

    Code de la question originale
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int *fct ( ... ) 
    { 
    ... 
    return &p 
    }
    Il y a deux manières d'utiliser un tel code:

    Cas 1
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int * fonction(int *p_valeur)
    {
        *p_valeur = 1;
        return p_valeur;
    }
    Cas 2
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int * fonction(void)
    {
       int *p_valeur;
       p = malloc(sizeof *p);
       if (p != NULL){
           *p_valeur = 1;
       }
       return p_valeur;
    }
    Le cas suivant conduit à une fuite de mémoire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int * fonction(void)
    {
        int p;
        p = 1;
        return &p;
    }
    Meilleures salutations

    Thierry

  8. #8
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Il y a encore un 3e cas...

    Cas 3
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int * fonction(void)
    {
        int tableau[10] = {1};
        return tableau;
    }
    Salutations

    Thierry

  9. #9
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par mujigka
    Il y a encore un 3e cas...
    Euh, tu veux dire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    static int tableau[10] = {1};
    Sinon, tu renvoies une adresse qui n'est pas valide hors de la portee de la fonction.

  10. #10
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Euh, tu veux dire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    static int tableau[10] = {1};
    Sinon, tu renvoies une adresse qui n'est pas valide hors de la portee de la fonction.
    Euuuh! AUTANT POUR MOI! Je ne sais pas trop ce qui m'a pris de dire de pareilles bétises. Merci de me reprendre. Cas n°3 à oublier!!! D'ailleurs, vous voyez un cas n°3?

    Meilleures salutations et encore merci


    Thierry (qui promet de retourner 7 fois sa langue avant de ...)

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    merci mujigka pour les 2 exemples d'utiliser le code, mais je ne comprend toujours pas l'intérêt qu'une fonction renvoi une adresse ou une valeur dans la pratique

  12. #12
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par bogosse
    je ne comprend toujours pas l'intérêt qu'une fonction renvoi une adresse ou une valeur dans la pratique
    - C'est la seule facon de renvoyer un tableau de valeurs alloue a l'interieur d'une fonction.
    - C'est conseille lorsqu'on renvoie une structure potentiellement grande (pour eviter les couts de copie).
    - C'est la seule facon d'implementer un constructeur de type abstrait (abstract data type), voir le retour de fopen() par exemple.
    - d'autres raisons que j'oublie...

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    merci

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 18/11/2007, 01h15
  2. Réponses: 5
    Dernier message: 29/06/2006, 17h23
  3. Réponses: 3
    Dernier message: 16/05/2006, 18h22
  4. Pointeur sur une fonction template
    Par Progs dans le forum Langage
    Réponses: 2
    Dernier message: 15/02/2006, 20h25
  5. Probleme de pointeur sur une fonction
    Par nicky78 dans le forum C
    Réponses: 2
    Dernier message: 23/05/2004, 20h26

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