IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Allocation dynamique d'un tableau de pointeurs à 2 dimensions


Sujet :

C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 13
    Points : 6
    Points
    6
    Par défaut Allocation dynamique d'un tableau de pointeurs à 2 dimensions
    Bonjour,

    J'ai un petit soucis pour allouer dynamiquement de la mémoire pour créer un tableau de pointeurs à 2 dimensions, voilà comment je procède :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Classe1
    {
       public :
       Type ***var1;
     
       Classe1(unsigned short int **_var1, unsigned short int _nombre)
       // **_var1 est un tableau à 2 dimensions contenant des unsigned short int
       // _nombre est la taille d'une dimension du tableau
       {
          Type ***var1 = new Type*[CONSTANTE][_nombre];
       }
     
    };

    Mais voilà le problème :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: `_nombre' cannot appear in a constant-expression

    Vu l'erreur, j'imagine que c'est pas une erreur de syntaxe

    Vous avez une idée de comment je peux faire ça?

  2. #2
    Membre habitué
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Points : 186
    Points
    186
    Par défaut
    Pas besoin de pointeur ni de taille...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    ...
    #include <vector>
    ...
    class Classe1
    {
       public :
     
         Classe1(std::vector< std::vector< Type > > var) : _var1(var) { } ;
     
         std::vector< std::vector< Type > > _var1;
     
    };
    Plus y'a d'Gruyère, plus y'a d'trous !
    Plus y'a d'trous, moins y'a d'Gruyère...
    Donc, Plus y'a d'Gruyère, moins y'a d'Gruyère !!!

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    En fait, j'aimerais garder une allocation dynamique et ne pas utiliser <vector> pour différentes raisons, principalement ne pas alourdir le programme avec un nouveau header et aussi parce que je sais pas l'utiliser

    Merci

  4. #4
    Membre habitué
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Points : 186
    Points
    186
    Par défaut
    Juste 3 points alors :
    - vector alloue dynamiquement lui meme sa memoire et pas besoin de s'occuper de la desallocation...
    - y'a des tuto trés bien fait ici sur les conteners http://c.developpez.com/faq/cpp/?page=STL (il est vital de savoir s'en servir)
    - sinon y'a des tuto sur l'allocations dynamique http://c.developpez.com/faq/cpp/?page=pointeurs

    Je prefere laisser quelqu'un d'autre te donner une solution avec des pointeurs.... je risquerai de te dire des grosses conneries
    Plus y'a d'Gruyère, plus y'a d'trous !
    Plus y'a d'trous, moins y'a d'Gruyère...
    Donc, Plus y'a d'Gruyère, moins y'a d'Gruyère !!!

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup j'ai trouvé

    Si ça en interesse certains, voilà la solution (en tout cas elle m'a l'air de fonctionner) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    class Classe1
    {
       public :
       Type ***var1;
     
       Classe1(unsigned short int **_var1, unsigned short int _nombre)
       // **_var1 est un tableau à 2 dimensions contenant des unsigned short int
       // _nombre est la taille d'une dimension du tableau
       {
          Type ***var1 = new Type**[CONSTANTE];
     
          for(int i = 0 ; i < CONSTANTE ; i++)
          {
             var[i] = new Type*[_nombre];
          }
       }
     
    };
    Merci beaucoup

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    La solution est dans la FAQ, si tu tiens réellement à le faire à la main (ta solution ne gère pas les erreurs).

    Mais les deux raisons que tu donnes pour ne pas utiliser std::vector sont des excuses de fainéant... (ce qui est paradoxal car au final tu devras déployer beaucoup plus d'énergie pour gérer ta mémoire à la main qu'avec std::vector ou tout autre conteneur approprié)

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Tu parles de quel type d'énergie? la mienne ou celle de ma machine?

    Si c'est la mienne tant mieu, je veux faire en sorte que le programme soit le plus léger / rapide possible

  8. #8
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu parles de quel type d'énergie? la mienne ou celle de ma machine?
    De la tienne. Concernant la machine, cela se finira tôt ou tard en crash / comportement indéterminé / fuites mémoires.

    Si c'est la mienne tant mieu, je veux faire en sorte que le programme soit le plus léger / rapide possible
    Il sera "lourd" si tu veux éviter ce dont je parle plus haut. A ce sujet je te conseille de lire le chapitre concernant le RAII dans la FAQ C++.
    Ensuite concernant la rapidité... Si tu utilises bien ton std::vector tu n'auras aucun surplus par rapport à la version brute.
    Tu écris quel genre de programme ? Ce tableau à 3 étoiles sert à quoi ?

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Laurent Gomila
    Concernant la machine, cela se finira tôt ou tard en crash / comportement indéterminé / fuites mémoires.
    Pas si j'utilise bien mes allocations

    Citation Envoyé par Laurent Gomila
    Tu écris quel genre de programme ? Ce tableau à 3 étoiles sert à quoi ?
    C'est pour un jeu, en gros j'ai un tableau a double entrée contenant une instance de chaque arme en fonction de la classe du perso et chaque marchand d'arme possède un tableau a double entrée de pointeurs sur ces armes avec le nombre de classes de perso en constantes et le nombre d'arme maximum vendue par classe en variable envoyé au constructeur.
    Le tableau a double entrée envoyé au constructeur contient les numéros de position des armes dans mon tableau d'arme en fonction de la classe.
    J'espère que c'est à peu près clair

    Enfin au final ça me donne ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    class Marchand : public Personnage
    {
        public :
        Arme ***arme; // tableaux de pointeurs d'objet
        Armure ***armure;
        Accessoire ***accessoire;
        ObjetSoin **objetSoin;
     
        Marchand(){}
     
        Marchand(unsigned short int **_arme, unsigned short int _nW, unsigned short int **_armure, unsigned short int _nS,
                 unsigned short int **_accessoire, unsigned short int _nA, unsigned short int *_objetSoin, unsigned short int _nH)
        {
            Arme ***arme = new Arme**[NBCLASSESPERSOS];
            Armure ***armure = new Armure**[NBCLASSESPERSOS];
            Accessoire ***accessoire = new Accessoire**[NBCLASSESPERSOS];
     
            for(unsigned char i = 0 ; i < NBCLASSESPERSOS ; i++)
            {
                arme[i] = new Arme*[_nW];
                armure[i] = new Armure*[_nS];
                accessoire[i] = new Accessoire*[_nA];
            }
     
            ObjetSoin **objetSoin = new ObjetSoin*[_nH];
     
            for(unsigned char j = 0 ; j < NBCLASSESPERSOS ; j++)
            {
                for(unsigned short int i = 0 ; i < _nW ; i++)
                {
                    *arme[j][i] = inventaire.arme[j][_arme[j][i]];
                }
            }
     
            for(unsigned char j = 0 ; j < NBCLASSESPERSOS ; j++)
            {
                for(unsigned short int i = 0 ; i < _nS ; i++)
                {
                    *armure[j][i] = inventaire.armure[j][_armure[j][i]];
                }
            }
     
            for(unsigned char j = 0 ; j < NBCLASSESPERSOS ; j++)
            {
                for(unsigned short int i = 0 ; i < _nA ; i++)
                {
                    *accessoire[j][i] = inventaire.accessoire[j][_accessoire[j][i]];
                }
            }
     
            for(unsigned short int i = 0 ; i < _nH ; i++)
            {
                *objetSoin[i] = inventaire.objetSoin[_objetSoin[i]];
            }
        }
     
        ~Marchand()
        {
            for(unsigned char i = 0 ; i < NBCLASSESPERSOS ; i++)
            {
                delete(&arme[i]);
            }
            delete(&arme);
     
            for(unsigned char i = 0 ; i < NBCLASSESPERSOS ; i++)
            {
                delete(&armure[i]);
            }
            delete(&armure);
     
            for(unsigned char i = 0 ; i < NBCLASSESPERSOS ; i++)
            {
                delete(&accessoire[i]);
            }
            delete(&accessoire);
        }
     
    };

  10. #10
    Membre habitué
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Points : 186
    Points
    186
    Par défaut
    Tu as neanmoins des sacrées lacunes de conceptions ...
    Mais bon, si tu crois que ça marche et que la programmation n'est pas ton metier...
    Bon crash du systeme !
    Plus y'a d'Gruyère, plus y'a d'trous !
    Plus y'a d'trous, moins y'a d'Gruyère...
    Donc, Plus y'a d'Gruyère, moins y'a d'Gruyère !!!

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Méchanceté gratuite totalement inutile...

    Tu pourrais au moins m'indiquer le genre de lacune que j'ai parce que là ton commentaire m'avance pas beaucoup...

  12. #12
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Bon, passons encore que tu ne veuilles pas utiliser vector, je ne suis pas sûr que je le ferais pour un tableau bidimentionnel. Ou plus exactement, je suis sûr que je commencerais en l'utilisant mais l'encapsulé dans une classe pour pouvoir changer facilement mon choix.

    On arrive là au premier reproche: si tu veux gérer manuellement tes tableaux, il faut faire une classe qui gère le tableau et l'utiliser. Ici, tu disperses un peu partout les conséquences de ton choix.

    Deuxièmement, si tu es si préoccupé des performances, pourquoi est-ce que tu t'amuses à faire un tableau de pointeurs vers tableau plutôt qu'à indexer correctement pour avoir une vision bidimentionnelle? (Une raison possible est dans le premier reproche).

    Troisièmement, tout est public dans ta classe. Encore de la dispersion pour les conséquences de tes choix.

    Quatrièmement, tu masques tes membres avec des variables locales, je doute que ce soit ce que tu voulais.

    Cinquièmement, tu alloues avec operator new[] et tu libères avec operator delete; il faut utiliser operator delete[].

    Sixièmement, tu ne libères certainement pas ce que tu penses.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  13. #13
    Membre habitué
    Avatar de superspag
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    153
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 153
    Points : 186
    Points
    186
    Par défaut
    Citation Envoyé par caribou87
    Méchanceté gratuite totalement inutile...

    Tu pourrais au moins m'indiquer le genre de lacune que j'ai parce que là ton commentaire m'avance pas beaucoup...
    ça n'est pas de la mechanceté rassure toi
    je pense sincerement que c'est en faisant des erreurs que l'on apprend le mieux... et je suis persuadé que tu t'en rendras bientot compte.
    si tu as besoin de conseil, il y aurras certainements toujours quelqu'un sur ce forum pour t'en fournir des bons... écoutes les ne re-invente pas la roue
    Plus y'a d'Gruyère, plus y'a d'trous !
    Plus y'a d'trous, moins y'a d'Gruyère...
    Donc, Plus y'a d'Gruyère, moins y'a d'Gruyère !!!

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 13
    Points : 6
    Points
    6
    Par défaut
    Merci

    Sur le conseil d'un autre programmeur sur le projet, on va surement faire plusieurs tableaux plutôt qu'un seul à double entrée, ça sera plus simple à gérer.

    Merci pour vos conseils

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Allocation dynamique d'un tableau de pointeur
    Par Général03 dans le forum Débuter
    Réponses: 20
    Dernier message: 09/12/2009, 18h21
  2. allocation dynamique d'un tableau de pointeurs
    Par Dilettante dans le forum C++
    Réponses: 9
    Dernier message: 29/06/2007, 23h41
  3. Réponses: 2
    Dernier message: 05/03/2007, 18h37
  4. Réponses: 67
    Dernier message: 13/02/2007, 18h08
  5. [PRO*C] Allocation dynamique d'un tableau de VARCHAR
    Par NéalZheimer dans le forum Interfaces de programmation
    Réponses: 5
    Dernier message: 07/07/2006, 13h02

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo