Partage
  • Partager sur Facebook
  • Partager sur Twitter

Copie d'un tableau dans un autre

    17 février 2020 à 11:28:52

    Bonjour, Je commence tout juste la programmation en C via le cours d'openclassroom et je suis bloqué sur un exercice où il faut copié un premier tableau dans un autre.

    Mais lorsque je compile la console m'affiche ceci :

    [4][4][6][8][10]

    [1550245031][-2][6356712][1975414765][4200832]

    je ne comprends pas où est mon erreur même apres avoir parcouru les differents sujet du forum en lien avec cet exercice.

    #include <stdio.h>
    #include <stdlib.h>
    
    void copie_tableau(int tabOriginal[] , int tabCopie[] , int tailletableau);
    
    int main()
    {
        int tabOriginal[5] = {4,4,6,8,10};
        int tabCopie[5] ;
        int i=0;
    
    for(i=0 ; i<5 ; i++)
        printf("[%d]",tabOriginal[i]);
    
        printf("\n");
    
      void  copie_tableau(int tabOriginal[] , int tabCopie[] , int tailletableau);
        for(i=0 ; i<5 ; i++)
            printf("[%d]",tabCopie[i]);
    
        return 0;
    }
    
    void copie_tableau(int tabOriginal[] , int tabCopie[] , int tailletableau)
    {
        int i =0 ;
    
        for(i=0 ; i<tailletableau ; i++)
           tabCopie[i] = tabOriginal[i];
    }



    • Partager sur Facebook
    • Partager sur Twitter
      17 février 2020 à 11:39:43

      Salut, ligne 17 tu n'appelles la fonction, tu la déclares (comme à la ligne 4), tu dis juste qu'elle existe... ça ne sert à rien.

      Il faut remplacer la ligne 17 par :

      copie_tableau(tabOriginal,TabCopie,5);


      Et donc les valeurs que tu obtiens, de TabCopie sont "n'importe quoi" car il peut y avoir n'importe quoi dans des variables non initialisées (l'erreur est de croire qu'il y a des 0 systématiquement) 

      -
      Edité par Fvirtman 17 février 2020 à 11:40:49

      • Partager sur Facebook
      • Partager sur Twitter

      Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

        17 février 2020 à 11:40:47

        Ligne 17, il fait faire un _appel_ à la fonction copie_tableau.

        Oops, trop tard.

        Bon alors j'en profite pour dire qu'il ne faut pas confondre

        • déclaration
        • définition

        Déclaration Les lignes 4 et 17 déclarent qu'il existe quelque part une fonction qui s'appelle comme-ci avec des paramètres comme-ça.

        Définition les lignes 24 à 30 expliquent ce qu'est la fonction

        et bien sur, l'appel, c'est autre chose.

        --- une subtilité : une définition est aussi une déclaration

        Ce qui qui fait que si on définissait copie_tableau avant main, on n'aurait pas besoin de mettre une déclaration pour l'utiliser dans main.

        -
        Edité par michelbillaud 17 février 2020 à 11:46:34

        • Partager sur Facebook
        • Partager sur Twitter
          17 février 2020 à 11:50:33

           Effectivement après avoir remplacé la ligne 17 cela marche nettement mieux

          Merci beaucoup pour vos réponse très rapide. :)

          • Partager sur Facebook
          • Partager sur Twitter
            17 février 2020 à 18:53:17

            J'ai toujours (ou presque) placé mes fonctions avant le main et dans le bon ordre et je n'ai rarement été obliger d'utiliser des déclarations.
            À moins qu'il y ait des appels récursifs croisés.
            Je remarque que les nouveaux qui viennent sur ce site placent la définition des fonctions après le main et les déclarent au début.
            Quel est le meilleur usage?
            Tant qu'il y a concordance entre la déclaration et la définition, ce n'est pas si mal.
            • Partager sur Facebook
            • Partager sur Twitter

            Le Tout est souvent plus grand que la somme de ses parties.

              17 février 2020 à 19:43:38

              A la longue, le problème ne se pose pas vraiment pour les programmes qui atteignent une certaine taille (*) et se retrouvent découpés en fichiers sources, correspondant à des modules,  compilés séparément.

              Les déclarations se retrouvent dans le fichier d'entete, et sont inclus dans le code du module.

              A part ça, déclarer les fonctions avant d'utiliser, c'est dans la logique du langage (compilation en une passe), comme en Pascal, mais dans le Kernighan et Ritchie, ils ont utilisé les prototypes dès les premiers exemples

              (*) et/ou pour qui on veut avoir des tests unitaires, lancés par un autre main.

              • Partager sur Facebook
              • Partager sur Twitter
                18 février 2020 à 0:50:30

                C'est vrai, j'avais oublié les en-tête .h où je met en effet certaines définitions et les déclarations ou prototypes.
                Tout cela est évidemment protégé par des #ifndef / #define / #endif
                Quand je programmais en Fortran, on mettait le programme principal avant les sous-routines et les fonctions.
                Je ne vois pas pourquoi ce serait différent.
                J'ai même fait un #include d'un fichier .c parce que c'était plus commode à ce moment.
                • Partager sur Facebook
                • Partager sur Twitter

                Le Tout est souvent plus grand que la somme de ses parties.

                  18 février 2020 à 7:41:25

                  C'est différent parce que C a été conçu pour être compilable en une seule passe. Si on veut vérifier qu'on appelle une fonction avec les paramètres du bon type etc, il faut que la déclaration précède les appels.

                  Même chose en Pascal, où on fait un forward pour prédéclarer. Ou C++.

                  FORTRAN, ou JAVA, autre histoire,

                  -
                  Edité par michelbillaud 18 février 2020 à 7:42:35

                  • Partager sur Facebook
                  • Partager sur Twitter
                    18 février 2020 à 9:31:04

                    PierrotLeFou a écrit:

                    J'ai toujours (ou presque) placé mes fonctions avant le main et dans le bon ordre et je n'ai rarement été obliger d'utiliser des déclarations.
                    À moins qu'il y ait des appels récursifs croisés.
                    Je remarque que les nouveaux qui viennent sur ce site placent la définition des fonctions après le main et les déclarent au début.
                    Quel est le meilleur usage?
                    Tant qu'il y a concordance entre la déclaration et la définition, ce n'est pas si mal.


                    Je fais comme toi, je place mes fonctions avant. 

                    Je parle bien entendu de toutes les sous fonctions qui ne méritent pas d'avoir une déclaration dans un .h

                    Dans le .h je mets le ou les points d'entrée et dans le .c qui va avec, le point d'entrée est en bas, et toutes les fonctions locales qu'il appelle sont au dessus en ce qui me concerne.

                    Après, en C++ c'est un peu différent car avec les classes, il faut tout déclarer dans les hpp.

                    Mais j'ai gardé l'habitude de mettre mes points d'entrée en bas des fichiers .c ou .cpp

                    -
                    Edité par Fvirtman 18 février 2020 à 9:31:39

                    • Partager sur Facebook
                    • Partager sur Twitter

                    Recueil de code C et C++  http://fvirtman.free.fr/recueil/index.html

                      18 février 2020 à 13:31:39

                      Ca ne repond pas exactement a la question, mais tu peux utiliser memcpy pour ce genre de chose, plutot que de le faire a la main. Quitte a mettre l'appel a memcpy dans une fonction wrapper pour preciser l'utilisation.

                      • Partager sur Facebook
                      • Partager sur Twitter
                        18 février 2020 à 14:41:31

                        Il faut se rappeler que c'est un exercice. On  devrait savoir comment recopier un tableau dans un autre.
                        Plus tard, l'utilisateur en aura marre d'écrire ce genre de fonctions et utilisera les fonctions de la bibliothèque de C.
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Le Tout est souvent plus grand que la somme de ses parties.

                        Copie d'un tableau dans un autre

                        × 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