Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème tableau 2d

    3 novembre 2018 à 1:04:47

    Bonjour à tous et toutes!

    Voilà je débute en c++ et j'ai un exercice à propos d'un tableau bidimensionnel.

    Je doit initialiser un tableau bidimensionnel d'entiers avec une fonction.

    J'ai réussit à l'initialiser avec la fonction:

    #define N 5

    void initab(int tab[N][N]);

    Cette fonction marche pour initialiser à 0 le tableau.

    Mais je doit aussi l'initialiser avec la fonction:

    void InitTab(int *Matrice) ;

    il m'indique qu'il faut une seule boucle for. Il m'indique aussi qu'il faut utiliser *(Matrice + i*N + j) mais je n'ai pas compris.

    Pouvez-vous m'aidez pour initialiser le tableau avec un pointeur s'il vous plaît? :) 

    Merci d'avance pour votre aide!

    • Partager sur Facebook
    • Partager sur Twitter
      3 novembre 2018 à 9:49:16

      Salut, peux-tu mettre  ici ce que tu as fait pour ? :

      void initab(int tab[N][N]);



      -
      Edité par pseudo-simple 3 novembre 2018 à 9:51:42

      • Partager sur Facebook
      • Partager sur Twitter
        3 novembre 2018 à 14:41:50

        Bonjour,

        Il faut passer à la fonction ce qu'elle attend : un pointeur sur la premier élément du tableau.

        void InitTab( int* Matrice );
        
        int main() {
           int  tab[5][5];
           InitTab( &tab[0][0] );
        }
        
        
        • Partager sur Facebook
        • Partager sur Twitter

        En recherche d'emploi.

          3 novembre 2018 à 15:22:32

          Lu',

          je crois que tu as le meme devoir maison que l'OP de ce sujet. Retrouve son fil sur le forum C, et tu auras ton aide.

          • Partager sur Facebook
          • Partager sur Twitter

          Eug

            3 novembre 2018 à 17:22:35

            #include<vector>
            #include<cassert>
            #include<iostream>
            
            class Matrix
            {
               using Storage = std::vector<int>;
            
               size_t lines_;
               size_t cols_;
            
               Storage storage_;
            
               size_t get(size_t x, size_t y) const
               {
                 assert(x < lines_ && y < cols_);
                 return x*cols_+y;
               }
            
            public:
            
               Matrix(size_t l,size_t c, int v = 0)
                 :lines_{l},cols_{c},storage_(l*c,v){}
            
               int operator()(size_t x, size_t y) const {return storage_[get(x,y)];}
               int & operator()(size_t x, size_t y){return storage_[get(x,y)];}
            
               size_t lines() const { return lines_;}
               size_t columns() const {return cols_;}
               
            };
            
            void print(Matrix const & m)
            {
               for( auto i= 0u ; i < m.lines() ; ++i) {
                  for( auto j = 0u ; i < m.columns() ; ++j) {
                      std::cout << m(i,j) << " ";
                  }
                  std::cout << "\n";
               }
            }
            
            int main()
            {
            
                Matrix m{5,5};
                print(m);
                std::cout << "\n";
               
                for( auto i= 0u ; i < m.lines() ; ++i) {
                  for( auto j = 0u ; i < m.columns() ; ++j) {
                      m(i,j) = i+j;
                  }
                }
                print(m);
                return 0;
            }
            
            
            Voilà comment on fait un tableau 2D en C++, on laisse tomber les defines préhistoriques, les pointeurs approximatifs. Là on a un truc qui tient la route quelque soit la taille du tableau(dans des limites raisonnables, disons environ 1000000 x 1000000 en 32 bits...), qui marche sur tous les OS, compile avec tous les compilateurs supportant c++11 (sorti en 2011). En modifiant deux ou trois petites choses mineures, ça passera aussi sur tous les compilateurs supportant C++98 (sorti en 1998). Et si tu demandais à ton prof de t'apprendre C++ et pas l'égyptien ancien?

            -
            Edité par int21h 3 novembre 2018 à 22:47:29

            • Partager sur Facebook
            • Partager sur Twitter
            Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
              3 novembre 2018 à 19:24:38

              Salut int21h ;),

              2 questions :

              1) en relisant ton code de près, il me semble que sur ton deuxième operator, tu voulais dire () ?

              Peux-tu expliquer s'il te plaît ?

              car sans ça , le code ne compile pas. Quand je corrige, ça compile.

              2) cela fait un moment que je vois le type size_t

              J'ai regardé la doc, je n'ai pas bien saisi c'est quoi ce type. Pourrais-tu m'expliquer à quoi cela correspond  ?

              Merci

              -
              Edité par pseudo-simple 3 novembre 2018 à 22:50:07

              • Partager sur Facebook
              • Partager sur Twitter
                3 novembre 2018 à 22:47:05

                oui, j'ai écrit ça vite fait et au passage, j'ai oublié une paire de parenthèses, il fallait effectivement lire operator()(size_t x,size_t y), je corrige :)

                Il n'y a rien de franchement compliqué, plutôt que de définir des accesseurs/mutateurs nommés genre get/set, je fais de mon tableau 2D un foncteur. Fondamentalement ça ne change rien, ça permet juste d'avoir une écriture du code utilisateur plus légère, très proche de celle qu'on utilise ordinairement en maths pour manipuler des tableaux/matrices 2D :) 

                Et par transformation affine, c'est généralisable à n'importe quelle dimension, pour de la 3D, les surcharges de () et la fonction privée get prendront 3 paramètres, seule la fonction privée get  changera, au lieu de renvoyer x*cols_+y, elle renverra x*dy*y*dz+z, la taille totale étant dx*dy*dz ^^

                -
                Edité par int21h 3 novembre 2018 à 23:41:34

                • Partager sur Facebook
                • Partager sur Twitter
                Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
                  3 novembre 2018 à 22:51:50

                  @ int21h, j'ai édité mon message , on s'est croisé :

                  j'ai vu dans ton code que tu as utilisé à multiples reprises le mot-clé size_t

                  2) cela fait un moment que je vois le type size_t

                  J'ai regardé la doc, je n'ai pas bien saisi c'est quoi ce type et il apparaît souvent.

                  Pourrais-tu m'expliquer à quoi cela correspond  ? je veux dire dans quel contexte on l'utilise ?

                  Merci à toi

                  -
                  Edité par pseudo-simple 3 novembre 2018 à 23:04:23

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Anonyme
                    3 novembre 2018 à 23:22:14

                    C'est un type non signé qui est garanti comme étant capable de stocker la taille de n'importe quel objet. Notamment des indexs de tableaux.

                    Une recherche internet t'en dira plus.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      3 novembre 2018 à 23:27:43

                      YES, man a écrit:

                      J'ai regardé la doc, je n'ai pas bien saisi c'est quoi ce type 

                      Quelle partie (voire qu'elle phrase) tu n'as pas compris?

                      YES, man a écrit:

                      je veux dire dans quel contexte on l'utilise 

                      D'après le premier lien de google

                      cppreference a écrit:

                      std::size_t is commonly used for array indexing and loop counting.



                      -
                      Edité par eugchriss 3 novembre 2018 à 23:28:53

                      • Partager sur Facebook
                      • Partager sur Twitter

                      Eug

                        4 novembre 2018 à 0:14:38

                        La plupart du temps:

                        typedef unsigned int size_t;

                        Comme l'ont dit mes VDD, size_t est utilisé partout où il est question d'exprimer une quantité entière, la taille d'un type, la longueur d'une chaîne de caractères, le nombre d'éléments dans un conteneur, la position d'un élément dans un tableau...

                        -
                        Edité par int21h 4 novembre 2018 à 0:15:40

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug
                          4 novembre 2018 à 0:18:59

                          Merci, tout est clair pour moi aussi.

                          Question hors sujet : c'est l'acronyme pour quoi VDD ? j'ai vu ce mot plusieurs fois

                          • Partager sur Facebook
                          • Partager sur Twitter
                            4 novembre 2018 à 0:59:01

                            Voisins Du Dessus, les gens qui ont postés avant moi. Leurs messages apparaissent au dessus du mien ^^

                            -
                            Edité par int21h 4 novembre 2018 à 1:02:32

                            • Partager sur Facebook
                            • Partager sur Twitter
                            Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug

                            Problème tableau 2d

                            × 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