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 :

echange de variables en utilisant l'adresse des variables


Sujet :

C++

  1. #1
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut echange de variables en utilisant l'adresse des variables
    j'ai un exo qui demande d'écrire un programme consiste à echanger les contenus de 2 variables de type int fournies en argument en transmettant l'adress des variables

    j'ai fait ceci:

    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
     
    void SWAP(int a, int b){
        int *a1=&a;
        int *b1=&b;
     
    	int*swap;
     
    	swap=a1;
         a1=b1;
    	b1=swap;
     }
     
     
     void main(){
        SWAP(1,2);
     }
    est-ce que ca répond à la question?

  2. #2
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par deubelte

    est-ce que ca répond à la question?
    Non !!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main()
    {
         int a = 2;
         int b = 3;
         swap(a, b); // ou swap (&a, &b) suivant ton approche
     
         return 0;
    }
    est le main que tu veux créer! Il faut que tu échanges deux variables qui existent avant que tu appeles ta fontion, sinon ça n'a aucun sens!

    C'est plus du forum C que C++...

    2 solutions pour coder ta fonction:



    Je te laisse écrire le reste !

  3. #3
    Membre expérimenté Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Par défaut
    J'ai failli repondre a ta question, puis je me suis rendu compte que ton main ne fait rien : Tu dois inverser 2 variables, et tu n'as aucune variable dans ton main, tu ne regardes pas les valeurs obtenues apres l'appel de la fonction swap...

    Bref visiblement tu n'as meme pas essayé de faire fonctionner la chose...

    Quelquechose me dit que tu souhaites qu'on fasse tes devoirs a ta place.

    EDIT : Tiens poukill a ete plus rapide et plus gentil que moi

  4. #4
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    excuse moi, mais je ne vois pas vraiment de différence entre ton main et le mien.

    Par contre pour le swap, pourquoi tu passes les variables par adresse?
    Je ne vois pas quel est le problème avec ma fonction?

  5. #5
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    j'aime bien l'agressivité (et la paranoia) du forum, mais bon on se calme.


    J'ai essayé ma fonction sur VC2005 et ca marche:

    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
     
    void SWAP(int a, int b){
        int *a1=&a;
        int *b1=&b;
     
    	int*swap;
     
    	swap=a1;
         a1=b1;
    	b1=swap;
    	cout<<*a1;
     }
     
     
     void main(){
    	 int c=1,d=22;
        SWAP(c,d);
     }

  6. #6
    Membre expérimenté Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Par défaut
    Le but est d'inverser les variables qui sont dans le main. Tu n'affiches rien, tu peux donc pas savoir si cela fonctionne

    Essaye ce main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
     void main()
    {
        int c=1;
        int d=22;
        cout << "Valeur de c :" << c;
        cout << "Valeur de d :" << d;
        SWAP(c,d);
        cout << "Valeur de c :" << c;
        cout << "Valeur de d :" << d;
     }
    Tu verras que ton code ne fonctionne pas : Comme tu passes les arguments par valeur et non par adresse, les a et b modifiés par swap sont des copies

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    j'aime bien l'agressivité (et la paranoia) du forum, mais bon on se calme.
    Il ne faut pas non plus que tu oublies pourquoi tu as le rang "Débutant".

    J'ai essayé ma fonction sur VC2005 et ca marche
    Pas vraiment non. Une fois sorti de la fonction les variables c et d seront inchangées.
    Tu devrais lire ceci, tu devrais comprendre où est le problème :
    http://c.developpez.com/faq/cpp/?page=references

  8. #8
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    Il ne faut pas non plus que tu oublies pourquoi tu as le rang "Débutant".
    ce n'est pas ce qui me gene le plus.

    Mais je viens de comprendre mon erreur que j'ai faite dans mon code.

    Maintenant, est ce que ca:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void g(int *a, int *b){....}
     
    void main(){
    ....
    g(&a,&b)...
    }
    c'est équivalent à ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    void g(int c,int d){...}
     
    void main(){
    ...
    g(a,b)
    ...
    }

  9. #9
    Membre expérimenté Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Par défaut
    Non, rajoute des cout dans ton main comme je te l'ai suggéré, tu verras tout de suite que ca n'a rien a voir

    Le premier est un passage par valeur qui provoque une copie des variables dans de nouvelles variables (locales a la fonction appelée)

    Le second est un passage par adresse qui se fait sans copie

  10. #10
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Non !
    Mais alors pas du tout !!!!

    EDIT : ce coup ci, c'est toi qui a été plus rapide et plus gentil !

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void g(int *a, int *b){....}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void g(int c,int d){...}
    Je t'ai donné un lien vers la section "références" de la FAQ (qui commence d'ailleurs par une fonction swap...), ce n'était pas pour faire joli

  12. #12
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    ok, je croyais que & et * étaient des opérations "mathématiquement" inversibles.
    C'est a dire que *(&v)=v.
    Mais si vous dites le crontraire, je vous crois

    Je t'ai donné un lien vers la section "références" de la FAQ (qui commence d'ailleurs par une fonction swap...), ce n'était pas pour faire joli
    j'ai un livre de C++ avec moi, mais on apprends toujous mieux en échangant avec les autres.

  13. #13
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    ok, je croyais que & et * étaient des opérations "mathématiquement" inversibles.
    C'est a dire que *(&v)=v.
    *&v = v est vrai (littéralement : la valeur contenue à l'adresse de v est v).
    Par contre le contraire n'est pas syntaxiquement correct, à savoir que *v ne signifie rien si le type de v ne définit pas un opérateur *.

    j'ai un livre de C++ avec moi, mais on apprends toujous mieux en échangant avec les autres.
    Va dire ça aux membres bénévoles qui passent des heures à écrire des FAQ et des tutoriels.
    Bon je pense qu'à l'époque tu l'avais compris mais je te le rappelle tout de même : on cherche d'abord, on pose les questions ensuite si on n'a pas trouvé de solution satisfaisante.

  14. #14
    Membre éprouvé
    Inscrit en
    Novembre 2006
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 1 073
    Par défaut
    J'utilise aussi les FAQ comme source d'info complémentaire.


    voici ma solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    void SWAP(int &a, int &b){
    	int swap;
    	swap=a;
    	a=b;
    	b=swap;
          }
     
     void main(){
    	 int c=1,d=8;
    	 cout<<c<<" "<<d<<endl;
     SWAP(c,d);
     cout<<c<<" "<<d;
     }
    mais ici, je passe par référence et non par adresse (oui?)

  15. #15
    Membre Expert
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Par défaut
    Citation Envoyé par deubelte
    j'ai un livre de C++ avec moi, mais on apprends toujous mieux en échangant avec les autres.
    Je ne suis pas d'accord...
    On apprend mieux en faisant les deux en parallèle.
    Je viens de me taper 3 semaines à ne faire que lire de la conception orienté objet, c'était pas juste par pur plaisir!


    Aide toi, et le forum DVP.com t'aidera !

  16. #16
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    mais ici, je passe par référence et non par adresse (oui?)
    Oui.

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

Discussions similaires

  1. Adresse des variables
    Par Heroiik dans le forum Débuter
    Réponses: 4
    Dernier message: 17/02/2015, 16h25
  2. Réponses: 8
    Dernier message: 28/02/2012, 17h44
  3. Réponses: 2
    Dernier message: 12/06/2009, 17h21
  4. [MySQL] ne pas tenir compte des variables non utilisées pour éviter les bugs
    Par canary dans le forum PHP & Base de données
    Réponses: 17
    Dernier message: 26/03/2009, 08h46
  5. [VBA][02]Détection des variables non utilisées
    Par cluis dans le forum VBA Access
    Réponses: 1
    Dernier message: 22/03/2007, 10h20

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