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 :

Échange de deux tableaux


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Inscrit en
    Février 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Échange de deux tableaux
    Bonjour,

    je voudrais échanger le contenu de deux tableaux de float passés en paramètre à ma fonction. Ma fonction est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void echange(int* A , int* B)
    {
    int *tmp;
    tmp  = A;
    A = B;
    B = tmp;
    }
    le problème est que quand j'appelle ma fonction dans le main :

    le contenu des deux tableaux n'est pas échangé.

    Merci,

    Maurice.

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Novembre 2010
    Messages
    56
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2010
    Messages : 56
    Points : 36
    Points
    36
    Par défaut
    Salut,

    Déjà, si tu veux traiter des tableaux de float, faut manipuler des tableaux de float. Là tu travailles avec des int.

  3. #3
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Tu fais un amalgame avec les pointeurs. Je vais tenter une explication.

    Déjà quand tu échanges deux tableaux tu peux soit échanger l'adresse de début entre les deux "noms"; visiblement c'est ce que tu essayes de faire là. Donc en pratique on fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    int* tab1 = // initialisation;
    int* tab2 = //initialisation;
    int* tmp;
     
    tmp = tab1;
    tab1 = tab2;
    tab2 = tmp;
    Oui c'est ce que tu as fait MAIS toi tu es dans une fonction et tous les paramètres sont passés par VALEUR en C. Ce qui fait que tu fais un échange LOCAL à la fonction parce que les adresses de tab1 ou tab2 sont locales même si elles pointent vers la même donnée (le début du tableau dans notre cas). La solution c'est de passer l'adresse du pointeur en paramètre (faut déjà maitriser les pointeurs tout court parce que plus tu rajoutes des niveaux d'indirection, plus t'as de chances de tout mélanger...) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void echange(int** a, int** b)
    {
      int* tmp = a;
      *a = *b;
      *b = tmp;
    }
    Franchement le mieux c'est de faire des petits dessins avec des cases et des flèches. Tu pourrais éventuellement mieux comprendre 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
    typedef int* Element; // Niveau d'abstraction
    /* En plus tu peux très bien remplacer int* par n'importe quoi sans changer ton code maintenant exemple : typedef int Element ! Et ça marchera également avec de simple int. */
     
    void echange(Element* a, Element* b)
    {
      Element tmp = a;
      *a = *b;
      *b = tmp;
    }
     
    // Appel
    int* tab1; // Ou Element tab1;
    int* tab2; // Ou Element tab2;
    echange(&tab1, &tab2);
    Mais évidemment ça ne fait échanger que deux adresses et non le contenu, pour le contenu faudrait évidemment échanger tout les éléments un par un avec une boucle.

Discussions similaires

  1. PL/SQL COMPARAISON DE DEUX TABLEAUX APRES BULK
    Par mimi_été dans le forum PL/SQL
    Réponses: 5
    Dernier message: 30/06/2009, 12h14
  2. Concaténation de deux tableaux
    Par mego dans le forum Langage
    Réponses: 6
    Dernier message: 19/11/2008, 11h52
  3. Réponses: 54
    Dernier message: 16/03/2006, 11h42
  4. comparer deux tableaux
    Par djibril dans le forum Langage
    Réponses: 4
    Dernier message: 15/11/2005, 15h26
  5. Réponses: 4
    Dernier message: 11/10/2005, 10h17

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