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

SL & STL C++ Discussion :

Peut-on stocker un objet quelconque dans vector


Sujet :

SL & STL C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Par défaut Peut-on stocker un objet quelconque dans vector
    Salut à tous!

    Voila le code qui me pose probleme, j'ai une erreur de compilation ici pour la deuxieme instruction.
    Je pense qu'il y a surement un moyen de mettre mon objet dans mon vector Sequence...
    Merci de répondre...

    P.S.:Si on ne peut pas le faire ce dont je doute, y a t il un autre type de conteneur qui pourrais me rendre ce service??


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Packet* Paquet = new Packet(bufferIn);
    Sequence.push_back(Paquet);

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    C'est quoi l'erreur.............................

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Par défaut
    voila l erreur c 'est ca...

    error
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    error C2664: 'std::vector<_Ty>::push_back' : cannot convert parameter 1 from 'MpegPacket *' to 'const char &'
            with
            [
                _Ty=char
            ]
            Reason: cannot convert from 'MpegPacket *' to 'const char'
            There is no context in which this conversion is possible

  4. #4
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Donc tu veux placer un MpegPacket* dans un vector<char> ; normal que le compilo n'y comprenne rien.

    Tu essayes de faire quoi au juste ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Par défaut
    Ah oui juste j'avais mis un vector<char> pour faire des tests en fait il me faut un vector<MpegPacket>....

    Purée Merci mille fois c'est le genre d'erreur qu'il faut des heures pour trouver...
    C'est ridicule j'ai honte... hihihi!

    En fait je lis le contenu d'un fichier dans le but de modifier certains paramètres. Je construit donc une la sequence entière des paquets puis je mets chaaque paquets dans une case de mon vector, pour acceder, inserer d'autres paquets etc...
    voila j'ai fait la correction et maintenant ca joue.
    Merci encore de ta vivacité!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
    MpegPacket* Paquet = new MpegPacket(bufferIn);
    SequenceTS.push_back(*Paquet);

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Purée Merci mille fois c'est le genre d'erreur qu'il faut des heures pour trouver...
    C'est plutôt évident rien qu'en lisant le message d'erreur...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    MpegPacket* Paquet = new MpegPacket(bufferIn);
    SequenceTS.push_back(*Paquet);
    Pas bon. Soit tes MpegPaquet sont copiables et dans ce cas l'allocation dynamique ne sert à rien d'autre que créer des fuites ; soit ils ne sont pas copiables et il faudra stocker des pointeurs (intelligents) dans ton tableau.

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Par défaut
    mais attend comment ca des pointeurs intelligents??? ce serait l'ideal si je pouvais stocker les pointeurs, mais comment je peux faire ca???
    a oui un vector de pointeur sur des MpegPacket
    du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    vector<MpegPacket*>
     
    MpegPacket* Paquet = new MpegPacket(bufferIn);
    SequenceTS.push_back(Paquet);
    Ca c'est mieux deja...non??

  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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    C'est pas forcément mieux. Comme je te l'ai dit il faut déjà se demander comment doivent être stockées les instances de ta classe ; si elles peuvent être stockées par copie alors les pointeurs seront inutiles.

    Pour les pointeurs intelligents, il y a une explication dans la FAQ et un tutoriel de Miles sur les pointeurs intelligents de boost.

  9. #9
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Je ne peux qu'approuver les sages paroles de mon parrain

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Par défaut
    Ok vais aller mater ce tuto sur boost. Mais attendez les gars la dans le code que j'ai en dernier, je stocke des pointeurs non?
    Et comment je peux savoir si mon objet peut etre stocker par copie, de plus juste tu m'as dit que sotcker les objets pourrait provoquer des fuites memoires... C'est pour ça que je me suis dit que les pointeurs étaient une meilleures solutions sans compter j'aurai certainement un gain de performance si je stocke des pointeures plutot que des objets.

    Ma question etait donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    vector<MpegPacket*>
     
    MpegPacket* Paquet = new MpegPacket(bufferIn);
    SequenceTS.push_back(Paquet);
    Ici ne suis je pas en train de stocker des pointeurs???

  11. #11
    Membre éprouvé Avatar de hansaplast
    Homme Profil pro
    Artisant logiciel
    Inscrit en
    Septembre 2005
    Messages
    952
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Artisant logiciel
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 952
    Par défaut
    => tu as un vecteur de pointeur sur des objets MpegPacket*

    donc, pour libérer la memoire, une fois ceux ci inutils il te faudrat faire des
    delete MpegPacket*

    si je ne me trompe pas

  12. #12
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Tu auras des fuites mémoires si tu ne fais pas de delete à chaque new ou si tu n'utilises pas de pointeur intelligent pour le faire.
    Quand tu faisais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    machin.push_back(*alloue);
    Tu fais en fait une copie de ton objet, tu ne stockes pas l'objet lui-même, ce qui fais que si tu ne fais pas de delete -> fuite mémoire.
    De même si tu fais comme actuellement, si tu oublies d'effacer la mémoire allouée à la destruction ou à la modification du vector, tu auras des fuites mémoires, d'où l'interêt des PI pour t'éviter de penser au delete.

  13. #13
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Et comment je peux savoir si mon objet peut etre stocker par copie
    En général lorsque l'on conçoit une classe c'est la première chose qu'il faut se demander. Ca dépend de ce que fais ta classe, et de la manière dont elle le fait. En gros, demande toi si le fait d'écrire A = B (avec A et B des instances de ta classe) te poserait des problèmes.

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Par défaut
    Donc si je resume soit j'utilise les PI soit je suis condamne a faire des delete[] au bon endroit! Et dans mon cas faire des delete ca va etre complique puisque j'aurai une quantité très importante d'objet (probablement plusieurs centaines vois pluisieurs milliers).

    Enfin quoique en fait c'est pas si complique que ca il me suffirait de faire une boucle à la fin de mon programme qui detruirait iteravtivement chacun des objets, ca marcherais ca non ?

  15. #15
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Oui, ça marcherait, mais comme tu as tout sous la main C'est plus simple

  16. #16
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    127
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2006
    Messages : 127
    Par défaut
    Ouai ok vais sérieusement regarder alors en tout cas merci a tous.

    On va certainement se croiser quelque fois puisque je serai sur ce forum certainement de plus en plus souvent. Etant donné la qualités de ces membres.

    Merci encore et à bientôt

  17. #17
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    Hum vu que vous parlez des vector et des fuites de mémoire, j'ai un gros doute (je sais jamais si je supprime bien le tout), est-ce que il y a fuite de mémoire ici :

    Donc en gros j'ai un tableau de quatre pointeurs sur des objets Sprite :
    Sprite * g_pPouletSprite [4];

    Puis j'utilise des new pour les quatres :
    g_pPouletSprite [0] = new Sprite (g_pPouletBitmap, rcBounds, REBONDIR);
    ainsi que pour tous les autres, et je les stocke tous dans mon vector suivant un ordre Z.

    Puis à la fin du programme je fais un delete sur le bitmap qui est associé au Sprite, et j'appelle ma fonction SupprimerSprites qui fait ceci :

    m_vSprites.erase (m_vSprites.begin(), m_vSprites.end());

    Ya t'il une fuite de mémoire ?

    Merci ^^

  18. #18
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Oui, il n'y a aucun delete qui correspond à tes new. La règle est simple, il n'y a pas à chercher midi à quatorze heures.

    De plus ton erase n'est rien d'autre qu'un clear(), et est inutile si tu n'utilises plus ton tableau après.

  19. #19
    Rédacteur
    Avatar de Bakura
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2005
    Messages
    1 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 386
    Par défaut
    Ok donc le erase sert à rien ?

    donc il faudrait que je fasse...

    vector <Sprite *>::iterator s1;

    for (s1 = m_vSprites.begin() ; s1 != m_vSprites.end() ; ++s1
    {
    delete (*s1);
    m_vSprites.erase (s1);
    }

    C'est mieux ou yen a toujours ?

  20. #20
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Non, sors le erase de la boucle et fais un clear, ça ira mieux. Comme dit, avec des pointeurs intelligents, tu pourrais faire comme tu le faisais avant

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [1.x] [sf 1.2.x] Stocker un objet panier dans la session (myUser?)
    Par thecanea dans le forum Symfony
    Réponses: 2
    Dernier message: 02/04/2009, 17h28
  2. [Conception] Stocker un objet java dans une structure java
    Par m3allem001 dans le forum Langage
    Réponses: 2
    Dernier message: 19/03/2009, 09h41
  3. [Objet OLE]Stocker une base Access dans un champ
    Par SamRay1024 dans le forum Access
    Réponses: 4
    Dernier message: 04/04/2006, 15h23
  4. Réponses: 4
    Dernier message: 01/02/2006, 10h47
  5. objets différents dans un même vector...
    Par Empty_body dans le forum Langage
    Réponses: 7
    Dernier message: 07/01/2006, 19h20

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