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 :

Considérations sur les pointeurs de fonctions


Sujet :

C++

  1. #1
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut Considérations sur les pointeurs de fonctions
    Bonjour,

    D'après ce que j'ai compris, on peut considérer une fonction comme une variable qui possède sa propre adresse mémoire, puisque chaque morceaux de code occupe une place mémoire. J'ai voulu comprendre comment traiter les pointeurs sur les fonctions en s'appuyant sur les pointeurs sur variables. en fait, une fonction serait plus une référence, puisque f et &f ont la même adresse mémoire.

    (Je n'ai pas vu cela dans les livres que j'ai lui, mais je trouve que c'est clair comme ca)


    De la même manière que l'on déclare une variable
    on déclare une fonction comme ceci par exemple:
    Supposons qu'on ait une fonction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int f(int o){
    return o+1;}
    Maintenant, on peut faire passer cette fonction "par valeur" comme n'importe quelle variable. On peut considérer que la fonction suivante est une composition de fonction f°g(x), où x est l'entier r.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main(){
    int f1(int ft(int),int r){	                    
      int ff=ft(r);           
      return ff+10;           
    }
    Mais on peut aussi faire ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int f2(int ft(int o),int r){ 
    	int ff=ft(r);
      return ff+20;
    }
    Quelle est d'ailleurs la différence avec le code précédent?

    Comme les variables, on peut faire passer les fonctions par références:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int f3(int (&ft)(int o),int r){
    	int ff=ft(r);               
        return ff+30;
    }
    et on aura:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int main(){
    int o3=f3(f,2);
    }
    Même question: quelle est la différence avec les cas précédents? Parce qu'ici, on ne cherche pas a modifier la fonction

    Enfin, comme pour les variables, on a les pointeurs sur fonctions, avec un code spécifique:


    Donc fct est un pointeur sur la fonction f. Pour l'utiliser, on la déférence comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int f4(int (*ft)(int o),int r){	
      int ff=(*ft)(r);           
      return ff+40;
    }
    et on l'utilise comme cela:
    où comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    int (*g)(int)=&f;
      o=(&f)(5);
    Je voudrais savoir s'il est possible de faire qqch comme cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    int g(int)=f;
     
    //ou
     
    int g(int)=f(int);
    parce qu'apparement ca fait planter le compilateur, g ne peut pas être initialisé.


    D'après ce que j'ai vu, un pointeur sur fonction permet d'aller plus vite et d'économiser de la place mémoire, puisqu'on ne recrée pas de variables. Cela permet aussi de créer des "variables de fonctions" que l'on peut réutiliser dans le code.

    Merci

    Edit:
    Bien sur, tout cela n'est que pur spéculation, j'attends vos corrections, commentaires, ajouts... avec remerciements de ma part.

  2. #2
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Ah ben t'es pas au bout de tes peines, là

    Une fonction est un bout de code en mémoire en un endroit fixé. Le point d'entrée de ce code est une adresse mémoire, c'est-à-dire un... pointeur.
    Je crois qu'il ne faut pas chercher plus loin que ça.

    Tiens, petit exercice pour toi ()
    Ecris une "fonction" qui reçoit un paramètre et dont le résultat est un booléen, vrai si le paramètre est un pointeur, faux sinon.
    Si si, on peut faire ça en C++

  3. #3
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    On a droit à une classe de trait?
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  4. #4
    Débutant  
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Points : 217
    Points
    217
    Par défaut
    Ecris une "fonction" qui reçoit un paramètre et dont le résultat est un booléen, vrai si le paramètre est un pointeur, faux sinon.
    Si si, on peut faire ça en C++
    hmm pas je regarderai.

    En attendant, j'ai vu qu'on pouvais déférencer autant de fois un pointeur sur fonction (je ne sais plus pourquoi d'ailleurs), cela ne changera pas le résultat.

    Sinon, j'essaye de faire des conversions de fonctions. Par exemple, on a bien une conversion avec le code suivant, a cause du double en parenthèse.

    [code]
    int o=3;
    double g=(double)o;
    [CODE]

    Si on a une fonction g qui prend un int et qui renvoie un int,
    Est-il possible de convertir un pointeur de fonction qui prend un entier en argument et qui renvoie un entier en un pointeur de fonctions qui prend un entier en argument et qui renvoie un double.
    Je pensais à faire qqch comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int (*)(f)(int)=&g;
    double (*w)(int)=int (*)(f)(int);
    //ou 
    double (*w)(int)=(double) (int (*f)(int));
    enfin qqch comme
    Pt2=(double) Pt1

    Mais cela ne fonctionne pas.

Discussions similaires

  1. Question sur les pointeurs avec les fonctions
    Par Loester dans le forum Débuter
    Réponses: 2
    Dernier message: 01/02/2012, 22h56
  2. Réponses: 7
    Dernier message: 02/01/2008, 14h32
  3. pointeurs sur les arguments des fonctions?
    Par brunoP dans le forum C
    Réponses: 3
    Dernier message: 14/05/2006, 18h11
  4. Réponses: 4
    Dernier message: 13/08/2004, 18h39
  5. Pb de débutant sur les pointeurs!!!
    Par benji17c dans le forum C
    Réponses: 6
    Dernier message: 30/09/2003, 17h50

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