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'objets à membres de taille variable : dynamique deux fois.


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut allocation dynamique d'objets à membres de taille variable : dynamique deux fois.
    Bonjour,

    Je me pose une question peut être évidente (?)... pas pour moi en tout cas : est-ce qu'il est possible de créer dynamiquement un objet contenant des tableaux membres de taille variable (donc alloués dynamiquement également) ? En fait, ce serait deux couches d'allocation dynamique l'une sur l'autre, en quelque sorte... Accessoirement : si c'est possible : comment procéder ? (proprement).

    Merci beaucoup,

    Hugo

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 55
    Points : 72
    Points
    72
    Par défaut
    std::vector<std::vector<int>> ?

    un tableau dynamique de tableau dynamique d'entier
    got root?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    Bonjour,

    Je dois confesser que je ne comprends pas la réponse... en gros, mon problème est le suivant:

    J'ai créé une classe d'objets A que je veux allouer dynamiquement, puisque ce sera à l'utilisateur de fixer le nombre nécessaire, et chacun de ces objets contient plusieurs tableaux de string de taille variable... à allouer dynamiquement également, donc... Faut-il jouer avec des machins genre malloc... ? Mon C++ est un peu hésitant...

    Hugo

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    La classe template std::vector<> (déclarée dans <vector>) est parfaite pour les tableaux de taille variable.
    Quand à la classe std::string (déclarée dans <string>), elle s'occupe de la taille de la chaîne sans problèmes.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    Pour string, OK, je viens de voir ça , pour mes objets, est-ce que cela veut dire que je peux créer un tableau d'objets avec <vector> de taille variable ?

    Merci pour les réponses

    Hugo

  6. #6
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Ben oui, tu peux créer un tableau d'objets qui s'agrandit au fur et à mesure des ajouts (avec push_back() par exemple), ou un tableau de strings...

    Ou même un tableau de pointeurs d'objets, mais attention, comme tout tableau de pointeurs, c'est assez délicat à gérer...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    pour créer un tableau d'objet avec vector, ne pas oublier de mettre un contructeur par copie
    il y a du linge sur la corde à linge

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    eh bé, voilà ce que c'est de se former sur le tas... merci beaucoup ! Pour ce qui est du constructeur par copie... qu'est-ce que cela veut dire ? je ne peux pas juste écrire

    new A;

    et faire un pushback()... ?

    Hugo

  9. #9
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    il faut que ta classe A aie un constructeur comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Class A
    {
    ....
    A(&A);
    ....
    }
    bien evidement le contructeur doit faire tout ce qu'il faut (recopier les données)
    il y a du linge sur la corde à linge

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    Ah ! Le bien entendu me dépasse un peu... parce qu'effectivement je viens de taper une truc comme ç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
     
    class quizz
    {
       public :
         vector<string> questions;
         vector< vector<string> > reponses;
         vector<int> type;
     
    void ajout_item(int i, string t);
    };
     
    void quizz::ajout_item(int i, string t)
    {
    reponses[i].push_back(t);
    }
    et ça plante, mais de fait je n'ai pas de constructeur comme tu le suggères... (pour tout confesser, je ne sais vraiment pas quoi en faire de cet animal de constructeur )
    Merci pour les réponses so far, en tout cas

    Hugo

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    Pour être plus précis, quand j'exécute la fonction membre ajout_item, ça plante. la compilation est OK mais il me fait une superbe "Incident de segmentation" à l'exécution arrivé à ajout_item... ça craint, non ?

    Hugo

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    Ca y est, en farfouillat, j'ai trouvé si ça intéresse : il faut écrire la onction membre comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    void quizz::ajout_item(vector<string> t)
    {
    reponses.push_back(t);
    }
    et aller constituer le string qui va bien ailleurs pour le passer en prm. On ne peut pas remplir - apparemment - un vector de dimension 2 avec des objets de dimension 0, il faut lui donner à manger des vector de dimension 1, sinon pas content...

    Hugo

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 55
    Points : 72
    Points
    72
    Par défaut
    tu un vector de vector de string
    donc avant d'ajouter une string au 2e vector il faut d'abord ajouter le vector qui doit recevoir la string
    got root?

  14. #14
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    Ben oui, c'est normal...
    Mais au pire, tu pourrais toujours faire ceci, si les effets vont dans le sens que tu veux:
    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
    void quizz::ajout_item_sur_nouveau_vecteur(string t)
    {
    	vector<string> v;
    	v.push_back(t);
    	reponses.push_back(v);
    }
     
    void quizz::ajout_item_sur_dernier_vecteur(string t)
    {
    	reponses.back().push_back(t);
    }
     
    bool quizz::ajout_item_sur_un_vecteur(int i, string t)
    {
    	bool bRet = false;
     
    	if(i>= 0 && i<size)
    	{
    		reponses[i].push_back(t);
    		bRet = true;
    	}
    }
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2006
    Messages
    620
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2006
    Messages : 620
    Points : 453
    Points
    453
    Par défaut
    Merci pour vos réponses ! Je découvre doucement ce monde merveilleux de la STL...
    Pour le moment, ma solution me convient bien (elle fait ce que je veux), mais vos explications/exemples sont toujours instructifs

    Hugo

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 02/06/2011, 18h28
  2. SQL Dynamique pour listes de taille variable
    Par Tino13 dans le forum SQL
    Réponses: 9
    Dernier message: 24/08/2007, 09h30
  3. Réponses: 24
    Dernier message: 26/04/2007, 15h20
  4. objet de taille variable en attribut static
    Par BigNic dans le forum C++
    Réponses: 8
    Dernier message: 06/07/2006, 21h41
  5. Réponses: 9
    Dernier message: 22/12/2005, 22h20

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