Partage
  • Partager sur Facebook
  • Partager sur Twitter

alloué tableau 2 dimension

comment ?

    26 juillet 2006 à 17:39:55

    bonjour,

    j'aurai voulu savoir comment alloué dynamiquement un tableau à double entrée (à 2 dimensions)

    en utilisant malloc je suppose pour cree un premiere tableau mais comment cree la 2eme serie du tableau ?

    est-ce possible de refaire un malloc sur le tableau qui aura été créé lui aussi avant avec malloc pour le transformé en tableau à 2 dimension ?


    merci :)
    • Partager sur Facebook
    • Partager sur Twitter
      26 juillet 2006 à 18:55:25

      Tu fais une boucle qui alloue un tableau dans chaque case du taleau. :magicien:
      • Partager sur Facebook
      • Partager sur Twitter
        26 juillet 2006 à 23:00:11

        comme il l'a dit, c'est un tableau de tableau que tu doit faire :
        allez un petit exemple :

            int i;
            int **tab = NULL;
            // un tableau a 2 dim tab[10][8]
            tab = malloc(10*sizeof(*tab));
            if (tab == NULL){
                printf("problème d'allocation mémoire");
                getchar();
                exit(0);
            }
            for (i=0 ; i<size ; i++){
                tab[i] = malloc(2*sizeof(**tab));
                if (tab[i] == NULL){
                    printf("problème d'allocation mémoire 2");
                    getchar();
                    exit(0);
                }
            }


        /*le code ou tu utilise tab comme si c'était tab[10][8]*/


            // on détruit tab
            for (i=0 ; i<size ; i++){
                free(tab[i]);
            }
            free(tab);tab = NULL;
        • Partager sur Facebook
        • Partager sur Twitter
          27 juillet 2006 à 13:05:33

          je cromprend pas trop ton code xD

          size coorespond a quoi ?
          pourquoi un double pointeur ?
          • Partager sur Facebook
          • Partager sur Twitter
            27 juillet 2006 à 22:45:13

            oups, escuse moi, c'est parce que j'ai extrais ce code d'un autre, j'ai oublier de modifier size.

            je te le redonne correct commenté et testé :

            #include <stdio.h>
            #include <stdlib.h>

            int main(int argc, char *argv[])
            {
                int i;
                int ligne = 10;
                int colonne = 6;
                int **tab = NULL; // c'ets la variable que l'on utilisera pour le tableau :
                // je vait créer tab pour pouvoir l'utiliser comme si c'était
                // un tableau a 2 dim tab[10][8]
               
                /* on fait un tableau contenant des tableau, comme on le fait dinamiquement,
                on déclare un puinteur sur un pointeur sur un int */

               
                /* j'alloue la mémoire: c'est a dire que je demande de l'espace en mémoire pour
                pouvoir stoquer "ligne" pointeur sur entier (qui seront en fait après
                10 tableau vecteurs : les colonnes*/

                tab = malloc(10*sizeof(*tab));
                // j'ai mis sizeof(*tab) c'est a dire la taille de ce qui est pointé par tab,
                // cad un pointeur sur un int. sizeof(*int) auré été corect je pense
                // (puisque au final tab c'est un (**int) )
               
               
                if (tab == NULL){ // un petit des pour vérifier
                    printf("problème d'allocation mémoire");
                    getchar();
                    exit(0);
                }
               
                /* ensuite je peu utiliser tab comme un int* tab[ligne]
                tableau de pointeur sur entier,
                et donc pour faire la 2ème dimention, on passe tout les tab[i]
                (qui sont des pointeurs sur int) et on y alloue comme dans le cours de la
                mémoire pour faire un tableau (une colonne)*/

                for (i=0 ; i<ligne ; i++){
                    tab[i] = malloc(colonne*sizeof(**tab));
                    // ici comme tout a l'heure, **tab correspond a int
                   
                    if (tab[i] == NULL){// vérif
                        printf("problème d'allocation mémoire 2");
                        getchar();
                        exit(0);
                    }
                }


            /*le code ou tu utilise tab comme si c'était int tab[10][8]*/
                // petit test
                tab[8][6]=25;
                tab[2][4]=36;
                printf("%d\n", tab[8][6]);


                // on détruit tab de la même manière qu'on l'as construit
                for (i=0 ; i<ligne ; i++){
                    free(tab[i]);
                }
                free(tab);tab = NULL;
                system("PAUSE");
                return 0;
            }


            voilà :)
            si j'ai fait des erreurs dans mes explications je m'en escuses, ça serais bien que quelqu'un qui s'y connais me confirme ce que j'ai dit :-°
            • Partager sur Facebook
            • Partager sur Twitter
              28 juillet 2006 à 1:20:21

              Citation : guimers8

              Tu fais une boucle qui alloue un tableau dans chaque case du taleau. :magicien:


              T'as fumé quoi ? Montre le code...

              Citation : Stingy


              OK. (Très bien la citation)

              • Partager sur Facebook
              • Partager sur Twitter
              Music only !
                28 juillet 2006 à 8:35:34

                -ed- toujours aussi sympathique, tes reflexions méprisantes envers les gens qui demandent des renseignements tu te les gardes; c'est pas parce que t'es hautain et que tu as une haute éstime de toi que tu as le droit de parler aux gens de cette façon merci...

                J'explique le principe de l'allocation dynamique d'un tableau à deux dimensions (perso quand je l'ai vu j'ai eu un peu de mal au début mais on s'y fait).

                en fait un tableau à deux dimensions (qu'il soit dynamique ou non)
                est en fait en premier lieu un tableau de pointeurs c'est à dire que ce sont des variables destinées à contenir l'adresse d'une autre variable du meme type.

                c'est à dire que lorsque par exemple vous déclarez ceci :

                int Tableau2Dim[5][10];

                En réalitée, cela crée en mémoire une chaine de 5 pointeurs de type int, qui pointent chacun sur l'adresse du premier element d'une chaine de 10 int.

                Car comme vous le savez, lorsque vous créer une chaine de caractère par exemple. Pour pouvoir acceder à n'importe quelle endroit de votre chaine, le nom pris pour la chaine deviens un pointeur sur le premier élement de la chaine (soit l'élément 0).
                Ainsi lorsque vous faites ceci :

                int Tableau2Dim[5][10];
                Tableau2Dim[0][0]=1;

                Cela pointe sur l'adresse contenu dans le pointeur 0.
                Puis pointe sur l'endroit de la chaine de int à configurer et l'initialise à 1.


                Donc pour les tableau à deux dimensions on emploi le même principe :

                int** Tableau2Dim = (int**)malloc(sizeof(int*)*5);

                la nous avons notre chaine de 5 pointeurs de type int.
                on fait pointer chaque pointeur sur une chaine de 10 int.

                int i;
                for(i = 0;i<5;i++)
                {
                Tableau2Dim[i]=(int*)malloc(sizeof(int)*10);
                }

                Aisi nous avons notre tableaux a eux dimensions manipulable comme un tableau a 2 dimensions classique !

                exemple :

                Tableau2Dim[0][0]=1;


                j'espère que vous aurez compris ces courtes et pas forcément bonnes explications lol. (Eh oui je suis pas tres doué pour les tutos mais c'était de bon coeur ^^ .)
                • Partager sur Facebook
                • Partager sur Twitter
                  28 juillet 2006 à 8:54:10


                  int** Tableau2Dim = (int**)malloc(sizeof(int*)*5);


                  Il me semble que pour un malloc, le cast est inutile vu qu'il renvoie un void *
                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 juillet 2006 à 9:09:22

                    Oui c'est vrai mais vu que j'ai encore le reflexe C++ (meme si en c++ c'est new qui remplace malloc) en C++ tu dois caster avec malloc.
                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 juillet 2006 à 9:11:01

                      Oui c'est sûr, mais personnellement je ne vois pas la raison d'utiliser un malloc en C++ vu que comme tu le dis toi même il y a à disposition new
                      • Partager sur Facebook
                      • Partager sur Twitter
                        28 juillet 2006 à 9:12:52

                        Parce que le cours C++ existe pas encore sur le SDZ tout simplement.
                        Donc j'ai penser que donner cette solution était correcte en C et en C++.
                        Sans besoin de connaissances suplémentaire comme l'opérateur new par exemple.
                        • Partager sur Facebook
                        • Partager sur Twitter
                          28 juillet 2006 à 9:17:15

                          Moui pourquoi pas aprés tout. Pour que ce sois encore plus clair, tu peux rajouter un PS : en C, le cast avec un malloc n'est pas obligatoire.

                          Sur ce, je pense que nous avons tout dis, bonne continuation
                          • Partager sur Facebook
                          • Partager sur Twitter
                            28 juillet 2006 à 9:20:14

                            vi ^^
                            J'espère que mes explications sont à peu prêt compréhensible pour la majoritée des personnes.
                            LOL
                            • Partager sur Facebook
                            • Partager sur Twitter
                              28 juillet 2006 à 9:42:22

                              Citation : castorus

                              -ed- toujours aussi sympathique, tes reflexions méprisantes envers les gens qui demandent des renseignements tu te les gardes;


                              Visiblement, tu ne sais pas lire. Il s'agit d'un contributeur. Autant il est normal qu'un questionneur soit à coté de ses pompes, autant c'est inacceptable venant de la part d'un contributeur. T'arrives à faire la différence ?

                              Alors oui, j'ai été, je suis et je serais intraitable avec les contributeurs qui ne savent pas de quoi ils parlent. C'est comme ça qu'on maintient un niveau correct dans un forum. Sinon, c'est n'importe quoi et personne ne trouve de réponse satisfaisante. Si tu n'es pas capable de comprendre ça, va jouer ailleurs.

                              Citation : Pas de titre


                              J'explique le principe de l'allocation dynamique d'un tableau à deux dimensions (perso quand je l'ai vu j'ai eu un peu de mal au début mais on s'y fait).

                              en fait un tableau à deux dimensions (qu'il soit dynamique ou non)
                              est en fait en premier lieu un tableau de pointeurs c'est à dire que ce sont des variables destinées à contenir l'adresse d'une autre variable du meme type.


                              Désolé mais ça commence mal. Un tableau statique à 2 dimensions est un tableau linéaire et non un 'tableau de pointeurs".

                              Je suis obligé de lire la suite ?
                              • Partager sur Facebook
                              • Partager sur Twitter
                              Music only !
                                28 juillet 2006 à 9:49:31

                                Tu veux mon bouquin ptetre?

                                Bon aller pour montrer que je sort pas ça d'un chapeau.


                                donc la source : "Le langage C" de Peter Aitken & Bradley L.Jones aux editions CampusPress. Page 366.

                                //début de citation.

                                Une déclaration de tableau à plusieurs dimensions se lit de gauche a droite (ce qui ne devrait guère bouleverser vos habitudes).

                                En utilisant cette notion de groupe contenant des groupes (ou de tableau contenant des tableaux), on aboutit à la representation imagée de la figure 15.3.

                                Revenons maintenant à la notion de noms de tableaux considérés comme des pointeurs.
                                Comme pour les tableaux à une seule dimension, le nom d'un tableau à plusieurs dimensions est un pointeur vers le premier élément du tableau.Toujours avec le même exemple du tableau multi, on peut dire que multi est un pointeur vers le premier élément d'un tableau à deux dimensions déclaré comme int multi[2][4].
                                Quel est exactement le premier élément de multi? Comme il s'agit d'un tableau de tableaux, ce n'est sûrement pas multi[0][0]. C'est en réalitée multi[0]. C'est a dire le premier "sous-tableau" de quatre variable type int.
                                Mais multi[0] est il un tableau ou un pointeur? Si c'est un pointeur, il doit bien pointer vers quelque chose.En effet il pointe vers le premier élement de ce sous tableau : multi[0][0].
                                Pourquoi multi[0] est-il un pointeur? Souvenez vous qu'un nom de tableau non suivi de crochets represente un pointeur vers le premier élément de ce Tableau.Ici, il manque le second groupe de crochets : on peut donc considérer que multi[0] est un pointeur.

                                Si vos idées ne sont pas très claires à ce sujet, ne vous inquietez pas outre mesure. C'est un concept quelque peu inhabituel qui au début est difficiel a appréhender.



                                //Fin de citation du livre

                                Comme quoi tu vois -ed- ! meme si tu as du mal ! ils disent que c'est pas grave c'est un peu inhabituel pour les débutants mais tu y parviendra au fur et à mesure !!! Courage !

                                D'ailleur au passage je conseil cet ouvrage a tout le monde ! Il est complet et bien organisé !
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  28 juillet 2006 à 10:44:12

                                  Citation : castorus


                                  Revenons maintenant à la notion de noms de tableaux considérés comme des pointeurs.


                                  STOP !

                                  On retombe sur les habituelles confusions sémantiques entre les pointeurs, les tableaux, les adresses... Je fatigue.
                                  http://mapage.noos.fr/emdel/notes.htm#pointeurs
                                  http://mapage.noos.fr/emdel/notes.htm#tableau
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                  Music only !
                                    28 juillet 2006 à 11:06:47

                                    Ma source est un bouquin.... et je ne ment pas....consulte les références tu verras.
                                    Enfin bon, disons que le bouquin ait été écrit par des personnes ne connaissant pas les bases du C. Même si ce sont des programmeurs chevronnés en C/C++ qui ont travaillé au CNRS mais enfin bon....

                                    Le problème c'est que je vois pas pourquoi tu chipottes là, pourquoi tu cherches la petite bête là ou y'a rien ?
                                    Pourquoi cherches-tu à détruire ce que les gens disent pour te mettre en valeur au point de même remettre en cause les pages d'un livre ...
                                    Bon d'accord tu es peut etre un super mega génie............ :lol: à tel point que des gens comme Peter Aitken et Bradley Jones en savent moins que toi.... o_O

                                    Sérieusement remets-tu officiellement les pages de ce bouquin en cause?

                                    tu veux que je te donne raison ?
                                    Moi ça me gene pas, je m'en fout catégoriquement!

                                    Bon alors disons que tu as raison..... Meme si c'est pas démontré....
                                    Mais au moins tu seras content !

                                    Bon et apres.... le sujet c'étais les tableaux à deux dimensions DYNAMIQUES autrement dit, les statiques sont hors sujet en ce topic....
                                    Donc si tu es d'accord avec ce que j'ai mis pour les tableaux a deux dimensions dynamiques on est d'accord y'a pas de problème terminé tout le monde y trouve son compte et ça répond a la question du topic.... OKAY??
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      28 juillet 2006 à 11:22:10

                                      Citation : castorus

                                      Donc si tu es d'accord avec ce que j'ai mis pour les tableaux a deux dimensions dynamiques on est d'accord y'a pas de problème terminé tout le monde y trouve son compte et ça répond a la question du topic.... OKAY??


                                      Pour une certaine forme (non linéaire) de tableaux dynamiques à n dimensions, oui.
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Music only !
                                        28 juillet 2006 à 11:26:15

                                        Voila ce qui s'appelle mesdames et messieurs la langue de bois, soit parler pour ne rien dire .
                                        Donc ce topic est clos et résolut merci.......
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          28 juillet 2006 à 12:00:18

                                          Un tableau à deux dimenssions (on va dire N et M), c'est pas plutot l'équivalent d'un tableau à une dimenssion de taille N*M ?

                                          Là c'est pas un tableau à 2 dimenssions, mais un tableau (à 1 dimension) de pointeur de tableau (à 1 dimenssion).

                                          Edit: ah oui pardon, le sujet à la base parle bien de ce deuxième type... m'enfin, ça a l'air un peu inutile, à moins que les sous tableaux n'aient pas une taille fixe et commune les uns aux autres.
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            29 juillet 2006 à 18:20:06

                                            Citation : -ed-

                                            Citation : castorus

                                            -ed- toujours aussi sympathique, tes reflexions méprisantes envers les gens qui demandent des renseignements tu te les gardes;


                                            Visiblement, tu ne sais pas lire. Il s'agit d'un contributeur. Autant il est normal qu'un questionneur soit à coté de ses pompes, autant c'est inacceptable venant de la part d'un contributeur.



                                            Ca c'est discutable.

                                            Une personne qui répond peut très bien être persuadé que sa réponse est correcte sans pour autant avoir proposé une bonne solution.

                                            L'erreur est possible.
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              6 novembre 2006 à 11:54:41

                                              Bonjour à tous,

                                              je m'excuse pour la question que je vais poser, je suis un débutant qui s'interresse au tableau en 2D.
                                              Mais je ne comprends pas à quoi sert la fonction getchar lors de la vérification de l'allocation de la mémoire pour un tableau :

                                              sitation du code de Stingy.

                                              if (tab == NULL){ // un petit des pour vérifier
                                                      printf("problème d'allocation mémoire");
                                                      getchar();
                                                      exit(0);


                                              Est-ce que quelqu'un saurait me répondre SVP?

                                              Merci d'avance.

                                              Micahell




                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                6 novembre 2006 à 12:31:02

                                                Citation : Stingy

                                                comme il l'a dit, c'est un tableau de tableau que tu doit faire :
                                                allez un petit exemple :


                                                    // un tableau a 2 dim tab[10][8]
                                                <...>
                                                        tab[i] = malloc(2*sizeof(**tab));


                                                C'est pas 2...

                                                Si je me souviens bien, quand j'ai posté ce code, j'ai fourni une énorme explication. Il aurait été plus judicieux de mettre ce post en référence...
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                Music only !
                                                  6 novembre 2006 à 13:54:39

                                                  Citation : ed

                                                  Citation : Stingy
                                                  comme il l'a dit, c'est un tableau de tableau que tu doit faire :
                                                  allez un petit exemple :
                                                  Code : C

                                                  // un tableau a 2 dim tab[10][8]
                                                  <...>
                                                  tab[i] = malloc(2*sizeof(**tab));


                                                  C'est pas 2...

                                                  Si je me souviens bien, quand j'ai posté ce code, j'ai fourni une énorme explication. Il aurait été plus judicieux de mettre ce post en référence...



                                                  Oui pardon c n'est pas un tableau 2D, mais je t'avouerai que ca rentre petit à petit dans ma tete aussi bien pour le fonctionnement du forum ( pour les refs, je ne sais pas ce que c'est de mettre un post en reference) que pour le language lui meme (tableau, pointeur etc...).

                                                  Desolé si ma question était mal placée.

                                                  Micahell.



                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    6 novembre 2006 à 14:32:36

                                                    Citation : Octal

                                                    Oui c'est sûr, mais personnellement je ne vois pas la raison d'utiliser un malloc en C++ vu que comme tu le dis toi même il y a à disposition new


                                                    et pour les structures des libC (comme la SDL) tu fais comment avec new :-° ?
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                    Anonyme
                                                      6 novembre 2006 à 15:18:22

                                                      @ micahell2 => Le getchar() est une fonction qui demande a l'utilisateur de taper quelque chose et d'appuyer sur entrée. C'est l'équivalent d'un system("PAUSE"), mais en portable.
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        6 novembre 2006 à 17:53:12

                                                        Citation : castorus

                                                        Tu veux mon bouquin ptetre?

                                                        Bon aller pour montrer que je sort pas ça d'un chapeau.


                                                        donc la source : "Le langage C" de Peter Aitken & Bradley L.Jones aux editions CampusPress. Page 366.

                                                        //début de citation.

                                                        Une déclaration de tableau à plusieurs dimensions se lit de gauche a droite (ce qui ne devrait guère bouleverser vos habitudes).

                                                        En utilisant cette notion de groupe contenant des groupes (ou de tableau contenant des tableaux), on aboutit à la representation imagée de la figure 15.3.

                                                        Revenons maintenant à la notion de noms de tableaux considérés comme des pointeurs.
                                                        Comme pour les tableaux à une seule dimension, le nom d'un tableau à plusieurs dimensions est un pointeur vers le premier élément du tableau.Toujours avec le même exemple du tableau multi, on peut dire que multi est un pointeur vers le premier élément d'un tableau à deux dimensions déclaré comme int multi[2][4].
                                                        Quel est exactement le premier élément de multi? Comme il s'agit d'un tableau de tableaux, ce n'est sûrement pas multi[0][0]. C'est en réalitée multi[0]. C'est a dire le premier "sous-tableau" de quatre variable type int.
                                                        Mais multi[0] est il un tableau ou un pointeur? Si c'est un pointeur, il doit bien pointer vers quelque chose.En effet il pointe vers le premier élement de ce sous tableau : multi[0][0].
                                                        Pourquoi multi[0] est-il un pointeur? Souvenez vous qu'un nom de tableau non suivi de crochets represente un pointeur vers le premier élément de ce Tableau.Ici, il manque le second groupe de crochets : on peut donc considérer que multi[0] est un pointeur.

                                                        Si vos idées ne sont pas très claires à ce sujet, ne vous inquietez pas outre mesure. C'est un concept quelque peu inhabituel qui au début est difficiel a appréhender.



                                                        //Fin de citation du livre

                                                        Comme quoi tu vois -ed- ! meme si tu as du mal ! ils disent que c'est pas grave c'est un peu inhabituel pour les débutants mais tu y parviendra au fur et à mesure !!! Courage !

                                                        D'ailleur au passage je conseil cet ouvrage a tout le monde ! Il est complet et bien organisé !



                                                        ...sans prendre parti sur les comportements de certains (bien que si j'étais encore modo, ce topic n'aurait pas duré, mais...), pour ton information personnelle, -ed- dit vrai et tu te trompes. Ce que dit le livre est hautement ambiguë et semble s'adresser à des débutants, si l'on s'en réfère au vocabulaire tout à fait approximatif employé (le terme "nom" est inexact). La seule vraie référence du C est la norme, et puisque tu sembles vouloir des références, je te les donne : § 6.2.5.20, § 6.7.5.2.3 et § 6.3.2.1.3 du dernier drafts (n1124, librement téléchargeable).
                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          6 novembre 2006 à 18:31:22

                                                          Citation : rz0

                                                          La seule vraie référence du C est la norme, et puisque tu sembles vouloir des références, je te les donne : § 6.2.5.20, § 6.7.5.2.3 et § 6.3.2.1.3 du dernier drafts (n1124, librement téléchargeable).


                                                          http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf
                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                          Music only !

                                                          alloué tableau 2 dimension

                                                          × 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