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 :

Imbriquer les appels de fonctions par adresse


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Par défaut Imbriquer les appels de fonctions par adresse
    Bonjour !

    J'ai Une petite question que je me pose régulièrement :
    lorsque une fonction attend un pointeur, je peut lui passer l'adresse d'une variable... mais est il possible de le faire en imbriquant les appelles, lorsque ladite fonction imbriqué ne renvoie pas un pointeur.

    Un exemple pour expliquer cela
    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
     
    foo(bar* p_bar);
    bar ret_bar();
     
    int main() {
      foo(ret_bar());      //Erreur : attend une adresse et passe une variable
      foo(&ret_bar());    //Erreur : passe l'adresse de la fonction
      foo(&(ret_bar()));  //Erreur :  & n'est pas une l-value
     
      //obligé de passer par une variable ? 
      bar my_bar = ret_bar();
      foo(&my_bar);
     
      return 0;
    }
    Il est toujours possible de passer par une variable intermédiaire (c'est même plus claire) mais je me demande quelle syntaxe permet le passage directe (anonyme je crois qu'on appelle ça) si c'est techniquement possible. merci.

  2. #2
    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
    Pas à ma connaissance.
    & ne peut être placé qu'à gauche d'une lvalue.

    Imagine si c'était possible: À quoi cela servirait-il ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    int GetFortyTwo(void) { return 42; }
    void AddOne(int *p) { (*p)++; }
     
    int main(void)
    {
    	AddOne(&GetFortyTwo());
    	/* Euh... Comment je récupère mon résultat maintenant ? */
     
    	return 0;
    }
    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.

  3. #3
    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
    Et c'est pareil en C++, sauf une petite exception pour les références: Une fonction C++ peut prendre une référence const vers une valeur qui vient juste d'être retournée par une fonction (on appelle ça un temporaire non-nommé). Mais cela ne permet pas de modifier l'objet.
    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.

  4. #4
    Membre très actif
    Avatar de TheDrev
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    310
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 310
    Par défaut
    ok, merci pour ces précisions.

    En fait je parlai d'appel de fonctions vers procédure, je n'avais pas pensé au cas de fonction vers fonction... La déclaration doit aussi être nécessaire pour passer l'adresse d'une variable déclaré sur la pile (cette opération de déclaration et réservation en peut pas être implicite en C...)

  5. #5
    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
    Précise ce que tu entends par "procédure", car ce terme n'existe pas en C...
    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.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par TheDrev Voir le message
    J'ai Une petite question que je me pose régulièrement :
    lorsque une fonction attend un pointeur, je peut lui passer l'adresse d'une variable... mais est il possible de le faire en imbriquant les appelles, lorsque ladite fonction imbriqué ne renvoie pas un pointeur.

    Un exemple pour expliquer cela
    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
     
    foo(bar* p_bar);
    bar ret_bar();
     
    int main() {
      foo(ret_bar());      //Erreur : attend une adresse et passe une variable
      foo(&ret_bar());    //Erreur : passe l'adresse de la fonction
      foo(&(ret_bar()));  //Erreur :  & n'est pas une l-value
     
      //obligé de passer par une variable ? 
      bar my_bar = ret_bar();
      foo(&my_bar);
     
      return 0;
    }
    Il est toujours possible de passer par une variable intermédiaire (c'est même plus claire) mais je me demande quelle syntaxe permet le passage directe (anonyme je crois qu'on appelle ça) si c'est techniquement possible. merci.
    Évidemment qu'il faut une variable intermédiaire. Simple question de bon sens... Le fonction retourne une valeur. Or une valeur n'a pas d'adresse. Seuls les objets ont une adresse... Ce que tu veux faire n'a aucn sens et n'est évidemment pas possible.

    La question est pourquoi ta fonction retourne-t-elle une valeur de type structure ? Est-ce voulu ?

    Si tu veux une adresse, pourquoi tu ne retournes pas une adresse ? Si cette fonction sert à créer un objet dynamiquement, c'est la solution la plus logique. C'est par exemple ce que fait fopen() avec l'objet de type FILE.

Discussions similaires

  1. [POO] Appeler une fonction par son nom dans une variable
    Par whitespirit dans le forum Langage
    Réponses: 16
    Dernier message: 18/06/2008, 11h23
  2. Espacer les appels des fonctions
    Par thibaut06 dans le forum Langage
    Réponses: 1
    Dernier message: 25/12/2007, 16h58
  3. Appel de fonctions par un formulaire
    Par Mista dans le forum Langage
    Réponses: 2
    Dernier message: 23/03/2007, 22h54
  4. Hooking : intercepter les appels de fonction
    Par The Lord of Nesquik dans le forum Windows
    Réponses: 17
    Dernier message: 28/02/2007, 17h07
  5. voir tout les appels de fonction avec le debugger?
    Par decksroy dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 03/10/2006, 11h33

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