Partage
  • Partager sur Facebook
  • Partager sur Twitter

Alias en tant que paramètre de fonction

langage : c++

    10 avril 2022 à 22:32:35

    Bonjour,

    Je suis novice en terme de fonctions en c++. Mon problème est simple, j'ai crée un alias d'un tableau de N entier : 

    int N = 10;
    using tab = int[N];
    tab tableau ;


    Ensuite, je remplis ce tableau par des "-1" et je veux l'afficher dans une procédure "affichage". Or, j'ai comme erreur "tab was not declared in this scope".

    Voilà le code entier : 

    #include <iostream>
    using namespace std;
    
    void affichage(tab tableau, int N);
    int main(){
        int N = 10;
        using tab = int[N];     //déclaration du tableau de N entiers
        tab tableau ;
    
        for(int i=0;i<N;i++){   //Remplissage du tableau par "-1"
            tableau[i]=-1;
        }
        affichage(tableau, N);  //fonction d'affichage
        return 0;
    } 
    
    void affichage(tab tableau, int N){
        for (int i=0;i<N;i++){
            cout << tableau[i] << endl;
        }
    }

    Merci d'avance pour votre aide !

    -
    Edité par MaximeLefebvre32 10 avril 2022 à 22:32:58

    • Partager sur Facebook
    • Partager sur Twitter
      10 avril 2022 à 23:27:04

      Les déclarations et définitions sont mémorisées dans leur ordre d'apparition. Là... ce n'est pas dans le bon sens. En plus, la déclaration est locale, et donc non visible à l'extérieur.
      • Partager sur Facebook
      • Partager sur Twitter
      C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
        10 avril 2022 à 23:28:25

        Je ne sais pas ce que tu essais de tester, mais le compilateur lit le code de haut en bas et quand il arrive sur la ligne 4 il ne connait pas le type tab puisqu'il n'est pas encore défini. De plus tu le défini à l’intérieur d'une fonction, ce qui le rend inaccessible aux autre fonctions. 

        PS : de nos jours, on évite l'utilisation de using namespace std; et aussi des tableaux venu du C.

        • Partager sur Facebook
        • Partager sur Twitter
        ...
          10 avril 2022 à 23:53:46

          Pour commencer, merci beaucoup pour vos retours rapide !

          En effet lmghs, c'est ma faute d'avoir mal organisé l'ordre d'initialisation. Par contre, on m'avait dit que toutes les variables dans le main sont globales et donc utilisables partout, c'est faux ?

          Rouloude, c'est aussi mon professeur qui nous conseille d'utiliser "using namespace std" pour une simplicité de lecture, tu as une meilleure option à me conseiller ? D'ailleurs qu'entends-tu par "tableaux en C" ? Cela veut dire que la déclaration des tableaux en c++ est différentes ?

          Par ailleurs, j'ai reformulé mon code et il fonctionne désormais, le voici :

          #include <iostream>
          using namespace std;
          
          using tab = int[10];     //déclaration du tableau de N entiers
          
          void affichage(tab tableau, int N);
          int main(){
              int N = 10;
              tab tableau ;
              for(int i=0;i<N;i++){   //Remplissage du tableau par "-1"
                  tableau[i]=-1;
              }
              affichage(tableau, N);  //fonction d'affichage
              return 0;
          } 
          
          void affichage(tab tableau, int N){
              for (int i=0;i<N;i++){
                  cout << tableau[i] << endl;
              }
          }

          Le seul soucis que j'ai est le suivant : je voulais faire using tab = int[N]; avec N un nombre qu'on définie arbitrairement, or à chaque fois que j'essaie de déclarer l'entier N avant, il me mets une erreur. Avez-vous une solution ?

          -
          Edité par MaximeLefebvre32 10 avril 2022 à 23:54:07

          • Partager sur Facebook
          • Partager sur Twitter
            11 avril 2022 à 0:17:57

            Salut,

            MaximeLefebvre32 a écrit:

            Par contre, on m'avait dit que toutes les variables dans le main sont globales et donc utilisables partout, c'est faux ?

            Ahh, je ne sais pas qui a pu te raconter ce genre d’ânerie, mais oui, c'est totalement faux.

            La fonction main est une fonction tout à fait ordinaire, qui fonctionne exactement de la même manière que les autres.

            Il n'y a que trois différences qui en font une fonction "spéciale"

            • C'est la seule fonction qui ne doit pas être déclarée
            • C'est la seule fonction qui ne puisse pas être appelée dans le code
            • C'est la seule fonction qui sera automatiquement recherchée par l'éditeur de liens lors de la génération de l'exécutable final, afin de permettre au système d'exploitation de l'appeler au lancement du programme

            (bon, je simplifie un peu, l'idée est malgré tout bien là ;) )

            • Partager sur Facebook
            • Partager sur Twitter
            Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
              11 avril 2022 à 1:43:15

              > Le seul soucis que j'ai est le suivant : je voulais faire using tab = int[N]; avec N un nombre qu'on définie arbitrairement, or à chaque fois que j'essaie de déclarer l'entier N avant, il me mets une erreur. Avez-vous une solution ?

              Seules des constantes connues au moment de l'exécution sont autorisée. Pas des variables qui seront acquises au dernier moment.

              Si tu veux introduire de la dynamique, alors il te faudra utiliser des structures dédiées. Dans le monde professionnel, et dans le monde éducatif à jour, le type dédié c'est std::vector.

              Pour ce qui est des tableaux C, il est aujourd'hui recommandé d'utiliser std::array<type, nbr_elements>. Jusqu'au C++17 (comme dans la norme de 2017), on pouvait trouver de bonnes raisons de préférer les tableaux C, depuis le C++17 il n'y en a aucune.

              • Partager sur Facebook
              • Partager sur Twitter
              C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                11 avril 2022 à 3:08:19

                Et si je peux donner un petit truc si on trouve lourd d'écrire: std::vector
                Avec un bon éditeur, tu fais sxxvector
                et tu remplaces sxx par std:: une fois que tu as tout écrit.
                Note que je ne le fais plus, ça devient un automatisme que d'écrire std::
                • Partager sur Facebook
                • Partager sur Twitter

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

                  11 avril 2022 à 10:04:21

                  MaximeLefebvre32 a écrit:

                  Rouloude, c'est aussi mon professeur qui nous conseille d'utiliser "using namespace std" pour une simplicité de lecture, tu as une meilleure option à me conseiller ?

                  Ce qui facilite la lecture c’est de voir tout de suite d’où vient la classe ou fonction. Peut être que sur 20 lignes ça pose pas de problème mais dans un vrai projet c’est pas clair du tout. Il ne faut pas écouter les profs qui ne codent pas.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    11 avril 2022 à 12:01:37

                    Parenthèse

                    PierrotLeFou a écrit:

                    Et si je peux donner un petit truc si on trouve lourd d'écrire: std::vector
                    Avec un bon éditeur, tu fais sxxvector
                    et tu remplaces sxx par std:: une fois que tu as tout écrit.
                    Note que je ne le fais plus, ça devient un automatisme que d'écrire std::


                    J'ai des raccourcis dans mon environnement de dev (vim)
                    - Alt-S m'ajoute "std::"
                    - et ve(ctor) + tab étend non seulement avec  std:: et les chevrons, mais en plus ça rajoute le #include s'il n'est pas présent dans le fichier courant...

                    A l'inverse quand j'enseigne le C++, je me force à mettre std:: au maximum (au tableau/velleda c'est lourd), pour son pouvoir d'auto-documentation: au moins l'élève sait d'où vient le symbole qu'on lui fait manipuler.

                    -
                    Edité par lmghs 11 avril 2022 à 12:01:59

                    • Partager sur Facebook
                    • Partager sur Twitter
                    C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
                      11 avril 2022 à 13:07:55

                      JadeSalina a écrit:

                      MaximeLefebvre32 a écrit:

                      Rouloude, c'est aussi mon professeur qui nous conseille d'utiliser "using namespace std" pour une simplicité de lecture

                      Ah, parce que trouve réellement beaucoup plus simple de lire vector, string, set ou cin que de lire std::vector, std::string, std::set ou std::cin ?

                      C'est peut être le cas, personnellement, je ne suis pas convaincu par cet argument ;)

                      Par contre, ce que ton prof oublie de dire, c'est que les espaces de noms (les namespace) servent de "boite de rangement" dans lesquelles on place "tout ce qui fait partie du même groupe", un peu comme si tu avais une boite "outils", dans laquelle tu pourrais tout aussi bien trouver une boite "outils jardin", une boite "outil électricité", une boite "outil bricolage" ou une boite "outils charpente", et que ces boites permettent d'éviter la confusion si plusieurs éléments portant le même nom devaient apparaitre dans différents rangements.

                      Ainsi, si tu es occupé à changer une lampe, et que tu as donc besoin d'un tourne vis, tu ira "naturellement" le chercher dans la boite "outil électricité", dans laquelle tu aura la certitude de trouver quelque chose ressemblant à ceci:

                      Alors que si tu vas dans la boite "outils charpente" le tournevis que tu trouveras ressemblera d'avantage à ceci (même si c'est une version "vintage" :D ) :

                      Mais, pour ne pas repartir sur une diatribe forcenée, je te conseille de lire ==>ICI<== ;)

                      • Partager sur Facebook
                      • Partager sur Twitter
                      Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
                        11 avril 2022 à 15:54:55

                        MaximeLefebvre32 a écrit:

                        Le seul soucis que j'ai est le suivant : je voulais faire using tab = int[N]; avec N un nombre qu'on définie arbitrairement, or à chaque fois que j'essaie de déclarer l'entier N avant, il me mets une erreur. Avez-vous une solution ?

                        Après ça dépend si N est défini avant la compilation ou en cours d'exécution. Car si c'est avant tu peux le faire en déclarant la taille comme constante :

                        constexpr size_t tabsize = 10;
                        using tab = int[tabsize];

                        Si c'est lors de l'exécution ce n'est pas possible de la sorte. Il faudra passer par un std::vector.

                        J'avais supposé que tu faisais ce code pour tester le fonctionnement de "using". Ce n'est peut-être pas le cas. (C'est bien aussi de décrire ce que l'on souhaite faire quand on pose une question sur le forum. Ça évite que l'on fasse des suppositions).

                        MaximeLefebvre32 a écrit:

                        Rouloude, c'est aussi mon professeur qui nous conseille d'utiliser "using namespace std" pour une simplicité de lecture, tu as une meilleure option à me conseiller ? 

                        La solution de nos jours, c'est de ne pas le mettre et de mettre le nom de l'espace de noms avant les fonctions ex std::cout au lieu de cout. après tu fais comme tu veux.

                        MaximeLefebvre32 a écrit:

                        qu'entends-tu par "tableaux en C" ? Cela veut dire que la déclaration des tableaux en c++ est différentes ?

                        Ce type de tableau est celui qu'on utilise en C. ils sont aussi utilisable en C++, mais de nos jours on utilise plutôt les std::array pour ceux de taille fixe et std::vector pour ceux à taille variable.





                        • Partager sur Facebook
                        • Partager sur Twitter
                        ...

                        Alias en tant que paramètre de fonction

                        × 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