Partage
  • Partager sur Facebook
  • Partager sur Twitter

Récupérer un tableau

Sujet résolu
    16 août 2019 à 0:53:22

    Bonsoir :)

    Alors voila j'ai un programme qui prend un tableau et qui renvoi la valeur trié dans l'ordre croissant jusqu'ici tout va bien le programme marche 

    void tricroissant( int tab[], int tab_size)
    {
        int i = 0;
        int j = 0;
        int tmp = 0;
    
        while (i < tab_size)
        {
            j = i+1;
            while (j < tab_size)
            {
                if(tab[j] < tab[i])
                {
                    tmp = tab[i];
                    tab[i] = tab[j];
                    tab[j] = tmp;
                }
                    j++;
            }
            printf("%d ", tab[i]);
            i++;
        }
    }
    
    int main()
    {
            int array[4] = {12,23, 4, 2};
            
            tricroissant(array,4);
    }

    Mais voyer vous dans le main j'appelle juste ma fonction, au préalable j'ai crée mon tableau est initialiser ses valeurs, l'affichage je le fait directement dans la fonction mais quand j'essaye de faire autrement c'est a dire comme ça 

    int tricroissant( int tab[], int tab_size)
    {
        int i = 0;
        int j = 0;
        int tmp = 0;
    
        while (i < tab_size)
        {
            j = i+1;
            while (j < tab_size)
            {
                if(tab[j] < tab[i])
                {
                    tmp = tab[i];
                    tab[i] = tab[j];
                    tab[j] = tmp;
                }
                    j++;
            }  
            i++;
        }
        return (tab[i]);
    }
    
    int main()
    {
    	int array[4] = {12,23, 4, 2};
            printf("%d ", tricroissant(array,4));
    }

    Sa m'affiche une valeur du style -295765224 ce qui n'est pas du tout le résultat demandé pourtant j'ai bien passé ma fonction en type int je lui renvoie bien mon tableau une fois sortie de la boucle est rien n'y fait j'ai aussi essayer sa 

     int result;
            i = 0;
            result = tricroissant(array,4);
            printf("%d ", result);

    en assignant ma fonction a ma variable que j'appelle ensuite dans le print mais non 

    Si quelqu'un pourras m'éclairer merci :D

    EDIT : Quand je passe ma fonction en void donc je ne retourne plus rien mais que je l'affiche dans un printf comme ca 

     printf("%d ", tricroissant(array,4));

    j'ai ce message 

    argument type 'void' is incomplete

    le type d'argument est incomplet je saisis pas trop ? d'accord ses un void je ne retourne rien MAIS je peut quand même l'appeler dans mon main via un printf pourquoi il ne veut pas ? 

    est dernier point désoler 

    Ici avec le tab[i] i étant ce qui va me permettre de naviguer dans les case alloué je n'affiche que le dernier qui est  "2" et si je modifie ce chiffre donc le dernier chiffre de mon tableau au dessus de 4 il ne va pas l'afficher mais rester bloquer a "4".

    void tricroissant( int tab[], int tab_size)
    {
        int i = 0;
        int j = 0;
        int tmp = 0;
    
        while (i < tab_size)
        {
            j = i+1;
            while (j < tab_size)
            {
                if(tab[j] < tab[i])
                {
                    tmp = tab[i];
                    tab[i] = tab[j];
                    tab[j] = tmp;
                }
                    j++;
            }  
            i++;
        }
    }
    
    int main()
    {
    		int array[4] = {12,23, 4, 2};
            int i;
    	
            tricroissant(array,4);
            printf("%d ", array[i]);
    }
    

    Je voie bien que 4 est ma taille tab mais je voie pas ou le lien ce fait 

    -
    Edité par leprincefou 16 août 2019 à 1:39:27

    • Partager sur Facebook
    • Partager sur Twitter
    Notre mesure du possible rend possible l'impossible  
      16 août 2019 à 6:55:44

      La fonction est la pour ordonner le tableau qui lui est passé en paramètre. Elle n'a aucune raison de retourner un nombre.

      Donc type de retour = void.

      -
      Edité par michelbillaud 16 août 2019 à 6:56:10

      • Partager sur Facebook
      • Partager sur Twitter
        16 août 2019 à 6:57:17

        Bonjour ! Dans ton deuxième programme, celui où la fonction de tri est ainsi définie :

        int tricroissant( int tab[], int tab_size)

        la fonction retourne un 'int', indiqué dans la dernière ligne :

        return (tab[i]);

        c'est-à-dire retourne un élément du tableau (pas le tableau complet). Quel élément ? Pour le savoir, il faut examiner la valeur de i. Par exemple si le tableau a une taille de 4, la fonction est ainsi écrite que i vaut alors 4. (Je te laisse vérifier en regardant le programme.) Or l'élément numéro 4 n'existe pas (les éléments valides vont de 0 à 3). Ce que la fonction retourne est la case mémoire située juste après le tableau (plus exactement elle convertit en entiers les x octets qui suivent où x est la taille d'un 'int'). On ne sait pas trop ce qu'il y a dans cette case, pas étonnant qu'il affiche de drôles de nombres...

        Tout ça vient d'un défaut de conception. Le tri d'un tableau n'a pas à retourner le tableau (c'est impossible en C), donc la première fonction était la bonne :

        void tricroissant( int tab[], int tab_size)

        Éventuellement, la fonction peut retourner un code d'erreur, et là on peut remplacer void par int. C'est comme la fonction scanf : elle sert à initialiser une variable et, de plus, elle retourne un entier qu'on peut ou non utiliser (le nombre de variables correctement initialisées).

        Si tu souhaites afficher le tableau, tu peux créer une fonction qui commencerait par :

        void affichetableau( int tab[], int tab_size)

        (On peut remplacer void par int si on veut retourner un code d'erreur, ou le nombre d'éléments affichés, ou je ne sais quel nombre utile.)

        Autre chose : quand tu fais

        printf("%d ", tricroissant(array,4));

        (bonne idée d'expérimenter), tu affiches une donnée de type void (puisqu'à ce moment là la fonction était déclarée comme void). Tu ne peux pas l'afficher avec le format %d qui est réservés aux variables de type int, d'où le message d'erreur.

        (Quant au dernier point, je n'ai pas compris.)

        Bref, tu dois faire la différence entre une « vraie » fonction, qui retourne une valeur (on peut alors placer l'appel de la fonction dans un printf) et une procédure, qui effectue une certaine tâche mais ne retourne rien (et ne peut donc pas être placée dans un printf).

        -
        Edité par robun 16 août 2019 à 7:03:14

        • Partager sur Facebook
        • Partager sur Twitter
          16 août 2019 à 16:51:30

          Merci pour vos réponse :)

          Robun quand tu dis 

          " c'est-à-dire retourne un élément du tableau (pas le tableau complet). Quel élément ? Pour le savoir, il faut examiner la valeur de i. Par exemple si le tableau a une taille de 4, la fonction est ainsi écrite que i vaut alors 4. (Je te laisse vérifier en regardant le programme.) Or l'élément numéro 4 n'existe pas (les éléments valides vont de 0 à 3). Ce que la fonction retourne est la case mémoire située juste après le tableau "

          j'ai saisis je retourner la valeur qui était après ma case mémoire alloué parce que je renvoie la valeur de i (tab[i]) après la boucle mais justement a la place de renvoyer la une valeur du tab n'y a t'il pas un moyen de renvoyer le tab complet ?

          Ou comme tu dis plus bas c'est impossible ?

          Un grand merci pour t'es précision au passage :D

          -
          Edité par leprincefou 16 août 2019 à 16:53:42

          • Partager sur Facebook
          • Partager sur Twitter
          Notre mesure du possible rend possible l'impossible  
            16 août 2019 à 17:38:36

            En C on ne peut pas renvoyer un tableau directement. (de même qu'on ne peut pas le passer en paramètre à une fonction).

            On peut renvoyer l'adresse d'un tableau. (ou passer son adresse comme paramètre à une fonction).

            Il y a un cas ou l'on peut renvoyer un tableau, c'est s'il est incorporé à une structure.

            • Partager sur Facebook
            • Partager sur Twitter
              16 août 2019 à 19:49:33

              Pareil : en C, on ne peut pas renvoyer un tableau complet. Si on écrit à la fin de la fonction :

              return tableau ;

              il me semble que ça retourne l'adresse du tableau (à confirmer).



              • Partager sur Facebook
              • Partager sur Twitter
                16 août 2019 à 20:19:57

                C'est cela ! je confirme.
                • Partager sur Facebook
                • Partager sur Twitter
                  17 août 2019 à 1:34:22

                  Meeerci a vous :)
                  • Partager sur Facebook
                  • Partager sur Twitter
                  Notre mesure du possible rend possible l'impossible  

                  Récupérer un tableau

                  × 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