Forum Programmation.c++ Tableaux dynamiques multidimmensionnels

Posté par  .
Étiquettes : aucune
0
26
nov.
2004
Bien le bonjour...

Je voulais savoir s'il était possible et si oui comment, d'avoir de l'allocation mémoire dynamique pour stocker des tableaux multidimmensionnels. Vraisemblablement, les opérateurs new[ ] et delete [ ] ne fonctionnent que pour des tableaux à une dimension.
Merci!


-- LastMan

N'oubliez pas de linker : http://www.NoSoftwarePatents.com(...)
  • # Rien ne vaut un exemple ...

    Posté par  . Évalué à 5.

    const int TAILLE_X = 100;
    const int TAILLE_Y = 100;
    unsigned int i = 0;
    int** tab2d = NULL;

    tab2d = new int* [TAILLE_X];
    if (tab2d==NULL) return -1;
    for (i=0; i<TAILLE_X; i++) {
    tab2d[i] = new int [TAILLE_Y];
    if (tab2d[i]==NULL) {
    // delete tous les précédents
    return -1;
    }
    }

    Et voilà :)
    Et bien suûr on peut faire la même chose en C, il suffit de remplacer l'utilisation de new et delete par malloc() et free();
    • [^] # Re: Rien ne vaut un exemple ...

      Posté par  . Évalué à 3.

      Ce qui veut donc dire que ce n'est pas possible en soi.

      Cela se comprend dans le sens où la réservation d'un espace mémoire est différente de l'initialisation d'un objet en particulier. L'ennui ici, c'est que l'on est pas du tout sûr que le tableau multidimensionnel ainsi créé soit en un seul morceau en mémoire. En même temps, ce n'est de toutes façons pas quelque chose que l'on peut garantir puisque les opérateurs de déréférencement (*) et d'indexation ([x]) peuvent être redéfinis.

      Ceci m'amène donc à quelques questions, moi aussi.

      . Est-il possible d'initialiser un objet dans une zone de mémoire déjà définie (à priori non puisque qu'on devrait définir cette zone mémoire à l'aide d'un "new Object"). Je crois que même un (Object *)this->Object() créera une nouvelle instance plutôt que d'initialiser celle pointée par this.

      . Est-ce qu'il existe en C++ l'équivalent de realloc() ? Parce que là, par contre, c'est vraiment pénible d'avoir à faire soi-même le transfert. En plus, cela implique un déplacement de pointeur et une cohabitation temporaire de deux segments de mémoire même lorsque ce n'est pas nécessaire (ex: troncature du segment initial).
      • [^] # Re: Rien ne vaut un exemple ...

        Posté par  . Évalué à 3.

        Ce qui veut donc dire que ce n'est pas possible en soi.

        Bien sûr que non ! Les calculs d'adresse par indexation de tableau se font avec multiplication de l'index par la taille de l'element, la multidimension etant simplement traité comme un vecteur de vecteur. Une taille dynamique impliquerait donc une multiplication par une taille dynamique, or la manière dont C/C++ stocke les tableau et gère l'équivalence sémantique avec l'adresse empeche de stocker les dimensions... Donc pas de tableau dynamique multidimensionel possible.

        . Est-il possible d'initialiser un objet dans une zone de mémoire déjà définie (à priori non puisque qu'on devrait définir cette zone mémoire à l'aide d'un "new Object"). Je crois que même un (Object *)this->Object() créera une nouvelle instance plutôt que d'initialiser celle pointée par this.

        Ouai, il suffit de surdéfinir l'opérateur new.

        Est-ce qu'il existe en C++ l'équivalent de realloc() ? Parce que là, par contre, c'est vraiment pénible d'avoir à faire soi-même le transfert. En plus, cela implique un déplacement de pointeur et une cohabitation temporaire de deux segments de mémoire même lorsque ce n'est pas nécessaire (ex: troncature du segment initial).

        Non. De plus je ne vois pas ce que tu veux dire en parlant de segments ? Le modèle le plus courrament rencontré est plat.
        • [^] # Re: Rien ne vaut un exemple ...

          Posté par  . Évalué à 2.

          Bien sûr que non ! Les calculs d'adresse par ...

          C'est ce que j'explique dans le paragraphe suivant.

          Non. De plus je ne vois pas ce que tu veux dire en parlant de segments ?

          Je parlais de segments de mémoire dans le sens général du terme, pas en faisant référence au mode réel du 80x86. Ce qui me chagrine avec le new,delete du C++, c'est qu'à moins d'avoir loupé quelque chose, il n'est pas possible de faire l'équivalent d'un realloc().

          Cela veut dire que même lorsque tu veux par exemple ne serait-ce que réduire la taille d'un bloc de mémoire allloué, tu es obligé d'en redéclarer un à coté et de consommer (temporairement) encore plus de mémoire, et que tu es dans tous les cas obligé de changer de pointeur. En outre, il te faut faire la copie du bloc mémoire par tes propres soins.
    • [^] # Re: Rien ne vaut un exemple ...

      Posté par  . Évalué à 2.

      Je n'avais pas vu les choses de cette façon mais ta manière de procéder me permet de résoudre mon problème à priori.

      Merci !
  • # Je ne comprends pas

    Posté par  . Évalué à 3.

    Qu'est ce qui t'empeche de calculer la taille de ton tableau et de l'allouer?

    Ok, new t[10][20] ne marche pas mais faire new t[10*20], ce n'est quand même pas extremement compliqué.. new ou malloc d'ailleur.
    • [^] # Re: Je ne comprends pas

      Posté par  . Évalué à 1.

      Le problème avec ce genre d'allocation est que tu ne peux pas accéder à tes tableaux de la manière suivante : t[1][3] par ex. n'a aucun sens. Ton exemple créé un tableau unidimensionnel à 200 cases.
      • [^] # Re: Je ne comprends pas

        Posté par  . Évalué à 2.

        et t[x+y*width] ? C'est effectivement plus pénible à écrire, mais rien n'empèche de créer une classe pour cela, l'accès devient alors par exemple t.elem(x,y).
  • # Encore un jeune Padawan...

    Posté par  (site web personnel) . Évalué à 6.

    Le C++ de l'ancien temps te montre ses limites, Il est temps de passer au C++ moderne, avec la STL. (Standard Template Library)

    Les tableaux dynamiques se font avec des std::vector ou avec des std::list.

    Redimensionnables, bloc de memoire continu (pour vector en tout cas), vitesses incomparables, algo deja fait (sort, find, find_if, for each), possibilites de debugging automatique accrues, code portable...

    Bref, faire du C++ sans la STL de nos jours est un crime.
    (sauf si on est oblige de se coltiner un vieux compilos, pour de l'embarque ou des plates-formes exotiques.)

    Il FAUT lire "effective STL" pour maitriser tous ca.
    (pour le c++, il FAUT lire "effective c++")

    Sinon en attendant de te procurer ces bouquins (existe-t-il une version en francais, qq connait le titre ?), tu peux lire ce superbe PDF sur le C++, fait par un type du comite de standardisation du C++, c'est le meilleur cours existant sur le web sur le c++.
    on y apprend le c++ actuel, et avec une explication de toutes les erreurs et des optimisations possibles.
    A LIRE :
    http://www.rz.rwth-aachen.de/computing/events/2002/hpc++/HPC++1.18-(...)

    (Meme pour ceux qui pensent maitriser le C++, une lecture qui en apprendra beaucoup.)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.