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 :

manipuler un vector de type "classe"


Sujet :

C++

  1. #21
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Probablement parce que justement le constructeur de Dessin n'est pas correct.

    On va jouer à un jeu: rend private les variables membres de Dessin.
    Partant de là, tout ce qui casse était une erreur.

    D'une manière générale, une classe devrait, pour moi, soit n'exposer aucun membre, soit tous les exposer, sans fonction d'accès.

    Si elle les expose, c'est qu'il s'agit d'un groupement ponctuel et informe (une std::pair, par exemple)
    Sinon, l'objet a une signification, et mérite qu'elle soit garantie.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  2. #22
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 15
    Points
    15
    Par défaut
    Les données membres de la classe dessin sont déjà private

  3. #23
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Alors que faisait les affectations de affichage, x et y dans le constructeur de Icone, puisqu'ils n'en sont pas membre?
    Pour rappel, ton code se présentait ainsi:
    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
     
    class Icone: public Dessin
    {
    private:
    //  SDL_Surface* iconeSurface;
      std::string commande;
      std::string pathIcone;
     
    public:
      Icone(SDL_Surface*, int, int, int, int, int, std::string, std::string);
      ~Icone();
     
      inline const std::string getCommande(){return commande;}
      const char* getPathIcone();
     
      void dessinIcone();
     
     
    };
     
    Icone::Icone(SDL_Surface* _affichage, int _r, int _g, int _b, int _x, int _y, std::string _commande, std::string _pathIcone)
            :Dessin(affichage, r, g, b, x, y), commande(_commande), pathIcone(_pathIcone)
    {
    	affichage=_affichage;
    	x=_x;
    	y=_y;
    	commande = _commande;
    }
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  4. #24
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 15
    Points
    15
    Par défaut
    Bonne question, comme je l'ai dit plus haut c'est une habitude que j'ai pris car on l'a fait une ou deux fois en cours sans trop savoir pourquoi.

    Mais même en l'enlevant ca ne marche pas.

    J'ai allégé ma classe icone pour faire des test, elle ne dépend plus de Dessin

    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
     
    class Icone
    {
    private:
    //  SDL_Surface* iconeSurface;
      char* pathIcone;
      SDL_Surface* affichage;
      int x, y;
    public:
      Icone(SDL_Surface*, int, int, char*);
      ~Icone();
     
      inline const char* getPathIcone() const {return pathIcone;}
      inline const SDL_Surface* getAffichage() const {return affichage;}
      inline const int getX() const {return x;}
      inline const int getY() const {return y;}
     
      void dessinIcone();
     
     
    };
    avec les méthodes associé, lorsque j'instancie manuellement et appelle la méthode de dessin ca marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    char* nomIcone;
    std::string stringIcone="Kodi.png";
    nomIcone = (char*)stringIcone.c_str();
     Icone iconeKodi(affichage, 50*i, 50*i, nomIcone);
    Dans ce cas j'ai bien l'icone qui est affiché à l'écran


    en revanche avec un vector ca ne marche plus et j'ai même un résultat étonnant:

    Je lit sur un fichier texte le nom des icones:

    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
     
    if(fichier)
      {
     
        std::string strNbApp;
        getline(fichier, strNbApp);
        if(!(std::istringstream(strNbApp) >> nbApp) ) nbApp = 0;
        std::cout << "nb app: " << nbApp << std::endl;
     
        for(unsigned int i = 0; i<nbApp; ++i)
        {
          getline(fichier, icone);
          std::cout << "getline icone: " <<  icone << std::endl;
          nomIcone = (char*)icone.c_str();
     
          tabIcone.emplace_back(affichage, 20*i, 20*i, nomIcone);
        }
     
      }
      for(auto &icone : tabIcone)
      {
        icone.dessinIcone();
        std::cout << " x, y: " << icone.getX() << ", " << icone.getY();
        std::cout << " nom: " << icone.getPathIcone() << std::endl;
      }
    mon fichier texte se présente ainsi:
    2
    Kodi.png
    Epiphany.png

    Lorsque j'affiche le contenu récupéré avec getline j'ai bien le nombre d'application (nom des icones dans ce cas) ainsi que les noms des deux icones:
    nb app: 2
    getline icone: Kodi.png
    getline icone: Epiphany.png


    Mais lorsque j'affiche les noms des icones contenu dans mon vecteur:
    x, y: 0, 0 nom: Ȑs
    x, y: 20, 20 nom: Epiphany.png

    La première ligne est censé contenir: x, y: 0, 0 nom: Kodi.png
    et à la place soit je me retrouve avec des caractères spéciaux soit un nom vide
    Alors que la deuxième ligne fonctionne parfaitement

  5. #25
    Membre habitué
    Homme Profil pro
    sans activité
    Inscrit en
    Janvier 2016
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : sans activité

    Informations forums :
    Inscription : Janvier 2016
    Messages : 76
    Points : 136
    Points
    136
    Par défaut
    Bonjour Kalemiro,

    question bête : pourquoi n'utilises-tu pas que des std::string?

    surtout que si tu as besoin à un moment d'un const char*, il te suffit d'un .c_str(), cela t’évitera les erreurs dues au manque du caractère terminal ('\0') ce qui est souvent le cas avec les char*.

  6. #26
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Je n'avais pas vu.

    Si une chaine de caractère (C-esque) est représentée par un char*, un char* n'est pas une chaine de caractère.

    Une chaine de caractère C-esque est un bloc mémoire, contenant une suite de char, dont la fin n'est pas déterminée par une taille, mais par la présence d'un char de valeur 0 ('\0').

    Un char * est l'adresse du début de la chaine.

    Une chaine de caractère C-esque ne se copie pas en copiant le pointeur (par exemple commande = *commande), mais en appelant un strncpy.
    En l'occurence, en C++, on n'utilise jamais char* (du moins, sans une très bonne raison).

    utilise std::string.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  7. #27
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    De plus, une std::string assure le contrôle de la durée de vie; tenter de mémoriser le pointeur retourné par c_str() relève du suicide logiciel.
    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.

  8. #28
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 15
    Points
    15
    Par défaut
    Oui d'accord je sais tout ca, le souci c'est que la fonction IMG_Load que j'utilise demande un const char* en paramètre c'est pour ca que j'avais pensé à convertir mon string en char*

  9. #29
    Membre habitué
    Homme Profil pro
    sans activité
    Inscrit en
    Janvier 2016
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : sans activité

    Informations forums :
    Inscription : Janvier 2016
    Messages : 76
    Points : 136
    Points
    136
    Par défaut
    Kalemiro, je comprend bien, c'est pour ça que je t'indique .c_str()

    dans ton IMG_Load passe ton string .c_str()

    EDIT:
    Utilise au maximum le string et des que tu as besoin de const char* utilise .c_str() mais pas avant

  10. #30
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 15
    Points
    15
    Par défaut
    Merci donc avec ça, ça fonctionne j'ai les bon noms de fichier dans mes instances d'icones mais elles ne s'affichent toujours pas

  11. #31
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    C'est possible, mais nous n'avons pas ton code d'affichage, ni le chargement des images.
    Quelque chose m'intrigue: comment fais-tu le lien entre les objets Icones et les pointeurs SDL (les SDL_Rect* ou SDL_Surface*)?
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  12. #32
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 967
    Points
    32 967
    Billets dans le blog
    4
    Par défaut
    As-tu essayé déjà avec un nbApp=1 ?
    Enfin ta fonction de dessin est une source à leak.
    Tu ne devrais avoir à faire un IMG_Load qu'une seule fois, dans le constructeur, pour charger l'image (capitaine obvious), qui n'a aucune raison de changer. Parce que l'ouvrir et créer la surface à chaque affichage, avec un leak en prime, c'est multiplier les erreurs.
    Aussi une fonction draw a toutes les chances d'être const.
    Un peu de clean serait préférable avant de traquer l'impossible. Les effets de bord ne sont pas décelables avec ce seul code. Et si ça vient d'un code externe à ce que tu présentes encore moins.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  13. #33
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 15
    Points
    15
    Par défaut
    Voici la fonction d'affichage de la classe Icone:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void Icone::dessinIcone()
    {
      SDL_Surface* iconeSurface;
      SDL_Rect positionIcone;
     
      positionIcone.x=this->getX();
      positionIcone.y=this->getY();
      iconeSurface=IMG_Load(this->getPathIcone());
     
      SDL_BlitSurface(iconeSurface, NULL, (this->affichage), &positionIcone); //Les parametres sont: l'image, la partie de l'image à afficher (Null = tout), la surface de destination (ici tout l'écran) et la position de l'icone
    }
    La fonction est relativement simple

  14. #34
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    Tu m'étonnes de ne rien voir.

    On ne charge pas une image au moment de la dessiner.
    a priori, utilise une map <identifiant, SDL_Surface*>
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  15. #35
    Membre habitué
    Homme Profil pro
    sans activité
    Inscrit en
    Janvier 2016
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : sans activité

    Informations forums :
    Inscription : Janvier 2016
    Messages : 76
    Points : 136
    Points
    136
    Par défaut
    Et a tout hasard, pour le rectangle de destination, il ne manque pas w et h?


    int SDL_BlitSurface(SDL_Surface* src, const SDL_Rect* srcrect, SDL_Surface* dst, SDL_Rect* dstrect)

  16. #36
    Membre habitué
    Homme Profil pro
    sans activité
    Inscrit en
    Janvier 2016
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : sans activité

    Informations forums :
    Inscription : Janvier 2016
    Messages : 76
    Points : 136
    Points
    136
    Par défaut
    Essaie ça...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    void Icone::dessinIcone()
    {
    SDL_Surface* iconeSurface;
    SDL_Rect positionIcone;
     
    positionIcone.x=this->getX();
    positionIcone.y=this->getY();
    iconeSurface=IMG_Load(this->getPathIcone());
    positionIcone.w=iconeSurface->w;
    positionIcone.h=iconeSurface->h;
     
    SDL_BlitSurface(iconeSurface, NULL, (this->affichage), &positionIcone); 
    }

  17. #37
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2014
    Messages
    58
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Gard (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2014
    Messages : 58
    Points : 15
    Points
    15
    Par défaut
    rnr72 -> non il ne me semble pas, la position du rectangle de desitnation est celle de "positionIcone"

    Bousk -> si je comprend bien dans le constructeur je met le chargement de l'image ? Ca me semble logique maintenant que ut le dit

    leternel -> une map ? Jamais vu ni utilisé, mais du coup si je met le chargement dans le constructeur j'ai toujours besoin de la map ?

  18. #38
    Membre habitué
    Homme Profil pro
    sans activité
    Inscrit en
    Janvier 2016
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : sans activité

    Informations forums :
    Inscription : Janvier 2016
    Messages : 76
    Points : 136
    Points
    136
    Par défaut
    Pour la position, je suis d'accord avec toi mais un rectangle à aussi une largeur et une hauteur, non?

    Si tu ne l'initialise pas, il y a de forte chance qu'elles soient égales à 0... (ou n'importe quoi)

  19. #39
    Membre habitué
    Homme Profil pro
    sans activité
    Inscrit en
    Janvier 2016
    Messages
    76
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : sans activité

    Informations forums :
    Inscription : Janvier 2016
    Messages : 76
    Points : 136
    Points
    136
    Par défaut
    Pour l'histoire de la map, dans un jeux, la gestion des ressources ne se fait pas au moment de leur utilisation mais pendant le chargement

  20. #40
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Si constructeur, je dirais pas besoin de map.
    Mais dans tous les cas, ce sera mieux qu'avoir une fuite à chaque appel de la fonction dessinIcone()...
    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.

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 4 PremièrePremière 1234 DernièreDernière

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