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++

  1. #1
    GO
    GO est déconnecté
    Membre régulier 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
    Points : 92
    Points
    92
    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 : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    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 régulier 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
    Points : 92
    Points
    92
    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 régulier
    Profil pro
    Inscrit en
    Février 2005
    Messages
    88
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Février 2005
    Messages : 88
    Points : 107
    Points
    107
    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
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    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.

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    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.

  7. #7
    GO
    GO est déconnecté
    Membre régulier 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
    Points : 92
    Points
    92
    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;
    ???

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    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*/

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

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

  10. #10
    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 : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    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 ?

  11. #11
    GO
    GO est déconnecté
    Membre régulier 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
    Points : 92
    Points
    92
    Par défaut
    c juste histoire de me mettre au point...après des années de Delphi.

    pas évident de revenir au source ! A+

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    c juste histoire de me mettre au point...
    Deux liens vers la FAQ C et C++ concernant les pointeurs:
    http://c.developpez.com/faq/c/?page=pointeurs
    http://c.developpez.com/faq/cpp/?pag...CE_utilisation

  13. #13
    Membre confirmé
    Avatar de NewbiZ
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2002
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2002
    Messages : 184
    Points : 563
    Points
    563
    Par défaut
    Un réponse précédente sur le forum qui te donnera quelques exemples concrets :
    http://www.developpez.net/forums/sho...94&postcount=9

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En nommant les variables en conséquence:
    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
    //Avec des pointeurs, il est HAUTEMENT CONSEILLE
    //d'indiquer "pointeur" dans le nom
    void fct1(int * pa, int * pb)
    {
    	//Ici, les ADRESSES des entiers sont passées PAR VALEUR.
    	int c;
    	c = *pa;
    	*pa = *pb;
    	*pb = c;
    }
     
    //Pour les références, il y en a qui décorent les noms, 
    //d'autres qui ne le font pas.
    void fct2(int & ra, int &rb);
    {
    	//Ici, les ENTIERS sont passés PAR RÉFÉRENCE (comme en pascal)
    	int c;
    	c = ra; //Pas d'étoile ici: C'est implicite pour les références
    	ra = rb;
    	rb = c;
    }
     
    //Et la fonction qui n'échange rien:
    void fct3(int a, int b);
    {
    	//Ici, les ENTIERS sont passés PAR VALEUR
    	int c;
    	c=a;
    	a=b;
    	b=c;
    }
    Et la façon de les appeler:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    fct1(&entierA, &entierB); //Échange les contenus des entiers
    fct2(entierA, entierB); //Échange les contenus des entiers
    fct3(entierA, entierB); //N'échange rien ici.
    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.

  15. #15
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    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 275
    Points : 10 985
    Points
    10 985
    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...

+ 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