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 :

Appel de fonctions/arguments


Sujet :

C++

Vue hybride

GO Appel de fonctions/arguments 25/09/2006, 10h57
Matthieu Brucher La première prend 2... 25/09/2006, 11h20
GO Donc on ne peut pas faire ... 25/09/2006, 11h26
frenchi Tu peux le faire, mais ca... 25/09/2006, 11h31
GO Mais que représente *a ? une... 25/09/2006, 11h37
homeostasie *a correspond a la valeur qui... 25/09/2006, 11h40
frenchi a est donc un pointeur... 25/09/2006, 11h40
jobherzt dans ce cas la, la valeur des... 25/09/2006, 11h32
Luc Hermitte Mais ... c'est exactement... 25/09/2006, 22h46
homeostasie fct(int *, int *); On... 25/09/2006, 11h36
Message précédent Message précédent   Message suivant Message suivant
  1. #1
    GO
    GO est déconnecté
    Membre confirmé Avatar de GO
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 114
    Par défaut Appel de fonctions/arguments
    Quelles différences entre ces 3 définitions d'une fonction qui permute les valeurs des deux variables ?

    fct(int *, int *);

    fct(int &, int &);

    fct(int a, int b);

    Merci

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    La première prend 2 pointeurs, la deuxième 2 références et la troisième 2 valeurs.
    Seules les 2 premières fonctions peuvent échanger les valeurs de 2 entiers, mais franchement, là, on peut faire aussi beaucoup de bêtises avec simplement les prototypes, sans savoir ce que font chacune des fonctions !

  3. #3
    GO
    GO est déconnecté
    Membre confirmé Avatar de GO
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 114
    Par défaut
    Donc on ne peut pas faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void fct(int a, int b);
    { int c;
    c=a;
    a=b;
    b=c;
    }
    comme en pascal ? ca donne quoi au juste ?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2005
    Messages : 88
    Par défaut
    Tu peux le faire, mais ca n'echangera pas les valeurs de a et b.

    Lors de l'appel a la fonction a et b sont "copiés" et reprennent leur valeur d'origine lorsque l'appel se termine.
    C'est pour cela que pour echanger deux valeurs, on passe deux pointeurs sur ces valeurs.

  5. #5
    GO
    GO est déconnecté
    Membre confirmé Avatar de GO
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 114
    Par défaut
    Mais que représente *a ? une valeur ou un pointeur ? et c ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void fct (int * a, int * b)
    {int c;
    c=*a;
    *a=*b;
    *b=c;
    ???

  6. #6
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    Mais que représente *a ?
    *a correspond a la valeur qui se trouve à l'adresse pointée par ton pointeur a.
    a possède l'adresse de ta variable pointée.

    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    int c = 5;
    int *a = &c; /*a pointe sur la variable c, elle possède son adresse et *a = 5 */
     
    *a = 10; /*c vaut maintenant 10*/

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Février 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2005
    Messages : 88
    Par défaut
    a est donc un pointeur d'entier et c un entier.

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par GO
    Mais que représente *a ? une valeur ou un pointeur ? et c ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    void fct (int * a, int * b)
    {int c;
    c=*a;
    *a=*b;
    *b=c;
    ???
    T'as déjà jeté un oeil sur un cours de C ou de C++ et dans la FAQ ?

  9. #9
    Membre émérite
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Par défaut
    dans ce cas la, la valeur des variables que tu passes en parametres est copiée dans la fonction. donc tout ce qui se passe est interne a la fonction, et n'a pas de consequence sur le variables d'origine. donc ta fonction n'aura aucun effet.

  10. #10
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Citation Envoyé par GO
    Donc on ne peut pas faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void fct(int a, int b);
    { int c;
       c=a;
       a=b;
       b=c;
    }
    comme en pascal ? ca donne quoi au juste ?
    Mais ... c'est exactement comme en Pascal. On ne me la fait pas!

    En Pascal tu disais explicitement au compilateur que tu désirais passer ton paramètre par référence (-> "var"), en C++ tu passes une référence (-> "&"), en C tu passes un pointeur par valeur (-> "*")(marche aussi en C++), en Ada tu déclares ton paramètre [in,out], idem pour Corba & COM, en Java tu ne fais pas avant l'auto-boxing du Java 1.5, ...

    J'ai l'étrange impression que tout le monde a fait tes exos, alors que la réponse est en clair dans quantité de cours de C++
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  11. #11
    Membre émérite Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Par défaut
    On transmet par pointeurs, c'est à dire que les deux pointeurs pointe sur l'adresse des deux variables à permuter.
    On peut donc modifier ces valeurs en usant de l'utilisation des pointeurs.

    On transmet par référence. On ne pointe donc pas sur l'adresse des deux variables à permuter, mais ici la référence correspond à la variable elle même. Ceci implique aucune copie des variables lors de la transmission par référence des paramètres.

    On recopie seulement les valeurs à permuter dans deux autres variables que l'on transmet en pramètre, d'ou le fait que modifier celles ci ne modifiera pas les variables désirées.

    Donc on ne peut pas faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void fct(int a, int b);
    { int c;
    c=a;
    a=b;
    b=c;
    }
    Après exécution de cette fonction, il n'y aura pas eu de permutations avec les valeurs que tu as fait passé dans ta fonction mais seulement avec celles utilisées dans ta fonction fct.

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

Discussions similaires

  1. [Prototype] Ajax.Request et onSuccess : appel de fonction avec plusieurs arguments
    Par gregbond dans le forum Bibliothèques & Frameworks
    Réponses: 3
    Dernier message: 18/10/2012, 17h00
  2. Réponses: 4
    Dernier message: 04/03/2010, 15h13
  3. Réponses: 4
    Dernier message: 24/08/2007, 15h56
  4. Réponses: 8
    Dernier message: 08/06/2006, 17h05
  5. Comment appeller une fonction dynamiquement, à partir d'un argument
    Par Invité dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 23/04/2006, 16h47

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