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 :

Fonction swap - variables


Sujet :

C

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 12
    Points : 8
    Points
    8
    Par défaut Fonction swap - variables
    Bonjour,

    Voici un petit code que je ne comprends pas bien:

    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
    #include <stdio.h> 
     
    void f1(int a, int b) {
    	int c;
    	c = a;
    	a = b;
    	b = c;
    }
    int main() {
    	int a = 0;
    	int b = 111;
    	f1(a,b);
    	printf("a= %d, b = %d\n", a, b);
     
    	f1(b,a);
    	printf("a= %d, b = %d\n", a, b);
    	return 0;
    }
    J'aimerais "prédire" le résultat. Et... je n'obtient pas ce que je veux (en compilant le code).

    Ce que je pensais: Je calcule f1(a=0,b=111) -> c = 0 , a = 111, b = 0 . Or, le programme me sort a = 0 et b = 111 et je ne vois pas pourquoi.
    Pour f1(b,a) là mon raisonnement marche ou du moins j'obtient ce qui est prévu:
    f1(a = 111, b =0) -> c= 111, a = 0, b = 111 ce qui est OK.

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    C passe toujours les arguments d'une fonction par valeur, les variables a et b ne sont donc pas affectées par l'appel de f1.

    Il faut utiliser des pointeurs quand on souhaite que le contenu de variables puisse être modifié (passage par référence) :

    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
    #include <stdio.h> 
     
    void f1(int *a, int *b) {
    	int c;
    	c = *a;
    	*a = *b;
    	*b = c;
    }
    int main() {
    	int a = 0;
    	int b = 111;
    	f1(&a,&b);
    	printf("a= %d, b = %d\n", a, b);
     
    	f1(&b,&a);
    	printf("a= %d, b = %d\n", a, b);
    	return 0;
    }
    Voir http://cpp.developpez.com/cours/cpp/...page_6#LVI-F-4 et http://c.developpez.com/cours/bernar...gne/node46.php

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2014
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2014
    Messages : 12
    Points : 8
    Points
    8
    Par défaut
    Citation Envoyé par jlliagre Voir le message
    C passe toujours les arguments d'une fonction par valeur, les variables a et b ne sont donc pas affectées par l'appel de f1.

    Il faut utiliser des pointeurs quand on souhaite que le contenu de variables puisse être modifié (passage par référence) :

    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
    #include <stdio.h> 
     
    void f1(int *a, int *b) {
    	int c;
    	c = *a;
    	*a = *b;
    	*b = c;
    }
    int main() {
    	int a = 0;
    	int b = 111;
    	f1(&a,&b);
    	printf("a= %d, b = %d\n", a, b);
     
    	f1(&b,&a);
    	printf("a= %d, b = %d\n", a, b);
    	return 0;
    }
    Voir http://cpp.developpez.com/cours/cpp/...page_6#LVI-F-4 et http://c.developpez.com/cours/bernar...gne/node46.php
    Merci. J'ai pas encore vu les pointeurs mais du coup c'est parce que dans mon main j'utilises les mêmes noms de variables (a et b) qui fait que f1 est inutilisable ?

  4. #4
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Points : 7 842
    Points
    7 842
    Par défaut
    Non, le nom des variables n'intervient pas du tout ici, mais effectivement, si tu n'a pas encore abordé les pointeurs, c'est un peu tôt pour comprendre. Regarde quand même les pages dont les liens sont à la fin de ma réponse précédente (qu'il ne servait à rien d'inclure dans ta réponse par ailleurs).

Discussions similaires

  1. Aide sur la fonction SWAP
    Par mc_fly dans le forum Langage
    Réponses: 6
    Dernier message: 10/07/2006, 15h35
  2. [Sécurité] htaccess en fonction de variables PHP
    Par myomyo dans le forum Langage
    Réponses: 14
    Dernier message: 13/06/2006, 11h00
  3. appels de fonctions et variables intermediaires
    Par TabrisLeFol dans le forum Langage
    Réponses: 7
    Dernier message: 07/03/2006, 13h37
  4. Réponses: 5
    Dernier message: 19/09/2005, 20h58
  5. Réponses: 9
    Dernier message: 24/05/2005, 16h34

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