Partage
  • Partager sur Facebook
  • Partager sur Twitter

Tableau multidimensionnel dans fonction

Vector

    17 janvier 2023 à 20:21:16

    Bonjour à tous,

    Je crée aujourd'hui car j'ai besoin d'aide sur un de mes programmes. J'ai vraiment du mal à comprendre comment fonctionne un tableau dans une fonction en c++.

    J'utilise vector car je n'ai pas trouvé d'autre exemple parlant de tableau multidimensionnel dans une fonction sachant que dans mes recherches, j'ai souvent lu qu'il fallait éviter d'utiliser en c++ des tableaux comme ceci " tableau[ ][ ] mais plutôt des array ou vector.

    Voici mon programme ( il est composé de plusieurs fichiers) soyez indulgent j'ai commencé le c++ il n'y a pas très longtemps.

    voici mon main:

    #include <vector>
    #include "engine.cpp"
    
    using namespace std;
    
    int main()
    {
        vector<vector<int> > damier;
    
        creation_damier(damier);
    
        return 0;
    }

    ma fonction:

    #include <iostream>
    #include <vector>
    
    #include "header.h"
    
    int creation_damier(std::vector<std::vector<int>> const& array)
    {
        for ( int i = 0; i < array.size(); ++i)
        {
            for (int j = 0; j < array.size(); ++j)
            {
                array.push_back(std::vector<std::vector<int>>(0)); 
                std::cout << " " << array[i][j]; 
             } 
         }
     }

    la partie ( array.push_back) est soulignée en rouge est c'est l'erreur que je n'arrive pas à corriger

    mon fichier d'entête:

    //
    // Created by johstar on 17/01/23.
    //
    
    #ifndef ARMAGEDON_HEADER_H
    #define ARMAGEDON_HEADER_H
    
    int creation_damier(std::vector<std::vector<int>> const& array);
    
    #endif //ARMAGEDON_HEADER_H

    Je précise que si j'ai plusieurs fichiers c'est qu'il s'agit à la base d'un projet mais vu que suis bloqué avec ces tableaux ...

    Enfaîte je veux réaliser une matrice de 0 et de 1 ressemblant a un damier, je voulais juste afficher avant cela des 0 uniquement pour voir si ma fonction fonctionnait.

    Pouvez-vous m'éclairer s'il vous plaît en espérant que le sujet que je viens de créer est aux bons endroits, (c'est la 1er fois que je post quelque chose)



    -
    Edité par JohanPezo 17 janvier 2023 à 20:27:50

    • Partager sur Facebook
    • Partager sur Twitter
      17 janvier 2023 à 21:49:00

      Les grilles, c'est un peu particulier. Le C++ pre-23 est démuni en matière de tableaux rectangulaires dynamiques. Et même en non-dynamique, std::array<std::array<type, dim1> dim2>, c'est un peu lourd à manipuler.

      Le truc que l'on se fait pour se simplifier la vie en attendant, on se crée des classes de tableaux rectangulaires à 2 dimension p.ex. Mais en interne il n'y a qu'un seul vecteur où tout est mis à plat: les C premiers éléments correspondent à la 1ere ligne, les C suivant à la 2e ligne, etc.

      Tu peux faire avec des vector<vector<T>>, mais c'est plus compliqué que nécessaire AMA, et en particulier pour des débutants. Mais la version classe de tableau 2D, cela demande un petit peu plus de bagages. D'où que l'exo de création de matrice arrive plus loin dans la béta du tuto de ZdS.

      Maintenant, ce que tu veux, c'est que la création du damier renvoie un damier. Et pour cela, il y a déjà une syntaxe barbare qui va tout faire.

      using line_t = std::vector<int>;
      using grid_t = std::vector<line_t>;
      
      grid_t create_grid(std::size_t L, std::size_t C) {
          grid_t g(L, line_t(C, 42));
          //     |    +-> construit une ligne (vecteur), de C éléments de valeur 42
          //     +-> construit une grille (vecteur) de L éléments tels que celui passé en paramètre: des lignes de bonne taille
          // <-- plus boucle ici si tu veux donner des valeurs différentes et pas des 42 partout
          return g;
      }

      => pas besoin de push_back

      Et surtout renvoi du nouveau vecteur2D en sortie de ta fonction. C'est cette notion que tu as ratée. Plus confusion sur ce qu'est un paramètre, quand est-ce qu'il est modifié ou pas, etc.

      -
      Edité par lmghs 17 janvier 2023 à 21:50:49

      • 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.
        17 janvier 2023 à 23:19:30

        bonjour,

        Il y a plusieurs problèmes dans ta fonction.
        - Le array est constant et tu tentes de le modifier.
        - tu veux modifier ton vecteur de vecteurs en lui ajoutant plein d'éléments qui sont des vecteurs de vecteurs. Non dans un vecteur de vecteurs les éléments sont des vecteurs.
        En restant dans l'esprit de ta fonction, ça deviendrait:

        void  creation_damier( std::vector<std::vector<int>>& array, size_t nbx, size_t nby, int init_val=0 )
        {
             array.clear(); 
             array.resize( nby );         // créer les lignes avec des vector vides
             for ( auto&  v  :  array ) { // remplir avec des vector de la taille attendue
                  v = std::vector<int>( nbx, init_val );
             }
        }

        Mais la solution en une ligne de lmghs est bien plus lisible et bien plus simple.

        • Partager sur Facebook
        • Partager sur Twitter

        En recherche d'emploi.

        Tableau multidimensionnel dans 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