Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tri de tableau wtf ?!

Affectation non demandée

Sujet résolu
    3 décembre 2017 à 6:39:54

    Bonjour à tous !

    Je suis sur le cours de C, en train de faire les exercices sur les tableaux et plus particulièrement, le tri.

    Ce que je veux faire (en français) :

    • On a un tableau A qu'on veut trier par ordre croissant.
    • Je le copie dans un tableau B (qui sera un tableau de travail).
    • Je récupère la valeur max d'un des deux tableaux et la mets dans une variable.
    • Je boucle sur le premier tableau (pour le parcourir dans l'ordre croissant).
    • Pour chaque itération, je boucle sur le tableau B et récupère la valeur min.
    • A la fin de cette seconde itération, je remplace la valeur min du tableau B par la valeur max retenue et j'inscris cette valeur min dans le tableau A.

    Le soucis : Lorsque je récupère ma valeur max (ligne 70), une des 'cases' de mon tableau B est modifiée sans que je n'ai fait aucune affectation ! Les vérifications se situent l.56 et l.72.

    Le code source :

    #include <stdio.h>
    #include <stdlib.h>
    
    void copie(int tableau[], int tableauBis[], int tailleTableau);
    void ordonnerTableau(int tableau[], int tailleTableau);
    
    int main()
    {
        int tableau[4]={0}; //déclaration tableau à 4cases initialisées à 0
        int i=0;
    
        //remplissage tableau
        tableau[0]=4;
        tableau[1]=3;
        tableau[2]=2;
        tableau[3]=1;
    
        //Affichage tableau avant tri
        for(i=0;i<4;i++)
        {
            printf("\nValeur tableau avant tri, case %d : %d",i,tableau[i]);
        }
    
        ordonnerTableau(tableau,4);
    
        //Affichage tableau après tri
        for(i=0;i<4;i++)
        {
            printf("\nValeur tableau apres tri, case %d : %d",i,tableau[i]);
        }
    
        return 0;
    }
    
    void copie(int tableau[], int tableauBis[], int tailleTableau)
    {
        int i=0;
    
        for(i=0;i<tailleTableau;i++)
        {
            tableauBis[i] = tableau[i];
        }
    }
    
    void ordonnerTableau(int tableau[], int tailleTableau)
    {
        int i=0;
        int i2=0;
        int min=0;
        int minPlaceDansTableau=0;
        int max=0;
        int tableauCopieTemp[]={0};
    
        copie(tableau,tableauCopieTemp,tailleTableau);
    
        //Vérification copie conforme
        for(i2=0;i2<tailleTableau;i2++)
        {
            printf("\nVerif tableau temp (copie) case %d : %d",i2,tableauCopieTemp[i2]);
        }
    
        //On récup le max
        /*for(i=0;i<tailleTableau;i++)
        {
            if(tableauCopieTemp[i]>max)
            {
                max=tableauCopieTemp[i];
            }
        }*/
        max=4; //WTF LE BUG ?!
    
        //Vérification copie conforme après récup max
        for(i2=0;i2<tailleTableau;i2++)
        {
            printf("\nVerif tableau temp (apres max) case %d : %d",i2,tableauCopieTemp[i2]);
        }
    
        //On effectue le tri du tableau
        for(i=0;i<tailleTableau;i++)
        {
            for(i2=0;i2<tailleTableau;i2++)
            {
                if(i2==0) //première incrémentation, on prend le résultat sans tester
                {
                    min=tableauCopieTemp[i2];
                    minPlaceDansTableau = i2;
                }
                else //Ensuite, on prend le résultat s'il est plus petit que le premier qu'on a trouvé
                {
                    if(tableauCopieTemp[i2]<min)
                    {
                        min=tableauCopieTemp[i2];
                        minPlaceDansTableau = i2;
                    }
                }
            }
            tableauCopieTemp[minPlaceDansTableau]=max; //On efface la valeur min du tableau de copie et on la remplace par la max (comme ça on ne la retrouvera pas)
            tableau[i]=min; //On place la valeur min de gauche à droite
        }
    }
    

    Je dois avouer que j'ai eu du mal à trouver mon erreur, et que je ne l'attendais vraiment pas à cet endroit... Du coup, j'aimerais comprendre ! :D

    Merci d'avance pour le temps que vous aurez consacré à ce sujet !

    AmiCalement (oh le jeu d'mots avec C ! \o/)

    • Partager sur Facebook
    • Partager sur Twitter
      3 décembre 2017 à 9:43:02

      A la ligne 52, tu devrais mettre   int tableauCopieTemp[tailleTableau]; à la palce de  int tableauCopieTemp={0};
      • Partager sur Facebook
      • Partager sur Twitter
      Je pense donc je suis.
        3 décembre 2017 à 16:05:08

        Argh, la fameuse déclaration qui fait porter le chapeau à l'affectation du quartier voisin... J'aurais du m'en douter, c'est un classique de Sherlock Holmes ! Une belle erreur de bleusaille dirait-on !

        Merci beaucoup pour la réponse ! Je vais pouvoir redormir la nuit \o/.

        J'ai aussi compris pourquoi, et mes tests me l'ont confirmé. Pas de vérification de dépassement de tableau en C... C'est violent ! Et pas de bol, lors de mes premiers tests, ma variable max avait une adresse réservée en plein milieu de mon 'faux' tableau.

        Encore merci, et à bientôt pour de nouvelles aventures !

        • Partager sur Facebook
        • Partager sur Twitter

        Tri de tableau wtf ?!

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown