Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: [RÉSOLU] Mon poids est chelou.  (Lu 1978 fois)

0 Membres et 2 Invités sur ce sujet

S66

  • Full Member
  • ***
  • Messages: 120
  • *-*
    • Voir le profil
    • Teal
[RÉSOLU] Mon poids est chelou.
« le: Mai 17, 2015, 12:58:04 pm »
B'jour.
J'vous jure, c'est hyper chelou.
Quand je met mon projet en mode debug, tout va bien, mon poids est normal.
Quand je met mon projet en mode release, tout va mal.
J'ai des warnings:
C:\Users\william\Projets\C++\tilemap\Inventory.h:178: avertissement : 'poid' may be used uninitialized in this function [-Wmaybe-uninitialized]
                 poid += myObjects[g].poids;
                                           ^
Et pourtant...
Bon. Je suppose que vous avez rien compris ?
J'ai un inventaire. il a une variable poids qui a le poids de tous les objets.
J'ai des places d'inventaires. Elles sont chacun leur poids.
class Inventaire {
public:

// ...

private:
   const unsigned int maxTailleX;
   sf::RectangleShape dfault; // carré noir de 32x32
   sf::Text invTextName; // = invName en sf::Text.
   InvSpace myObjects[16]; // place d'objet. il y'a 16 places.
   sf::Font myFont;
   sf::Sprite spr;
   int argent;
   sf::Text textArgent;
   unsigned int maxPoids;
   sf::Text Poids;
};

Et ... les warnings sont dans cette fonction:

int getPoids() {
        int poid; //Warning: 'poid' was declared here
        for( std::size_t i(0) ; i < 16 ; i++) {
            for (std::size_t g = 0; g < myObjects[i].number; g++) {
                poid += myObjects[g].poids; // Warning: [-Wmaybe-uninitialized]
            }
        }
            return poid;
    }

Bizarre tout ça...
Mais quand je me met en mode debug, tout va bien ! Aucun warning, pas de poids chelou...
Ah, et à propos du poids chelou...
En mode release, au début, j'ai une faux dans mon inventaire.
Et j'ai un poids très bizarre... 1722241157/100
Sachant que 100 est le poids maximum de mon inventaire ._.
Puis quand je vais récolter 1 blé, qui prend une place dans mon inventaire, mon poids va à 19.
et il varie n'importe comment quand j'ai quelque chose de plus dans mon inventaire.

En quoi cela concerne -t- il sfml ? Bin je me suis dit: Peut-être un problème sur les Sf::text...
(click to show/hide)
Sinon, je suppose que vous avez besoin de quelques fonctions ?

Dans ma classe Inventaire:

bool add (int nbr, std::string str, const sf::Texture& texture, unsigned int poid = 1) {

         for (std::size_t i(0) ; i < 16 ; i++)
         {
             if (myObjects[i].name == str && (getPoids()+poid) <= maxPoids) // on a trouvé une case qui contient déjà de ces objets ! ET on a assez de place
             {
                 myObjects[i].number += nbr; // donc on en ajoute le nombre qu'il faut.
                 myObjects[i].nbr.setString( std::to_string(myObjects[i].number) );
                 updatePoids();
                 return true; // objets ajoutés à l'inventaire avec succès.
             }
         }

         for(std::size_t i(0) ; i < 16 ; i++) // aucune case contenant déjà de ces objets n'a été trouvée, on va donc en chercher une vide.
         {
             updatePoids();
             if(myObjects[i].number == 0 && (getPoids()+poid) <= maxPoids) // si cette case est vide... ET qu'on a assez de place
             {

                 myObjects[i].number = nbr; // ...on la remplit avec notre nouvel objet.
                 myObjects[i].poids = poid;
                 myObjects[i].name = str;
                 myObjects[i].image.setTexture(texture);
                 myObjects[i].nbr.setString( std::to_string(myObjects[i].number) );
                 myObjects[i].texte.setString( myObjects[i].name );

                 if(i == 0) { // si c'est la première case de l'inventaire...
                     myObjects[i].image.setPosition(2.f, 2.f); // ...on lui donne la position du premier objet à afficher.
                     myObjects[i].texte.setPosition(2.f, 32.f);
                     myObjects[i].nbr.setPosition(18.f, 2.f);

                     myObjects[i].texte.setFont(myFont);
                     myObjects[i].nbr.setFont(myFont);
                 }
                 else
                 {
                     myObjects[i].image.setPosition( myObjects[i-1].image.getPosition() ); // ...sinon on lui donne la position de l'objet d'avant...
                     myObjects[i].image.move(35.f, 0.f); // ...avec x+32 !
                     myObjects[i].nbr.setPosition( myObjects[i-1].nbr.getPosition() ); // ...sinon on lui donne la position de l'objet d'avant...
                     myObjects[i].nbr.move(35.f, 0.f); // ...avec x+32 !
                     myObjects[i].texte.setPosition( myObjects[i-1].texte.getPosition() ); // ...sinon on lui donne la position de l'objet d'avant...
                     myObjects[i].texte.move(35.f, 0.f); // ...avec x+32 !

                     myObjects[i].texte.setFont(myFont);
                     myObjects[i].nbr.setFont(myFont);
                 }
                 updatePoids();
                 return true; // objets ajoutés à l'inventaire avec succès.
             }
         }
         updatePoids();
         return false; // échec, l'inventaire est plein, les objets n'ont pas pu y être ajoutés.
     }

int getPoids() {
        int poid;
        for( std::size_t i(0) ; i < 16 ; i++) {
            for (std::size_t g = 0; g < myObjects[i].number; g++) {
                poid += myObjects[g].poids;
            }
        }
            return poid;
    }

sf::Text updatePoids() {
        std::string tPoids = "Poids: ";
        int poids = getPoids();
        std::string poidsStr = std::to_string(poids);
        std::string poidsMax = std::to_string(maxPoids);
        tPoids += poidsStr;
        tPoids += "/";
        tPoids += poidsMax;
        Poids.setString(tPoids); //Poids = le sf::Text.
        return Poids;
    }

(click to show/hide)

Merci.  :-X

EDIT: ah j'oubliais, voici ma classe InvSpace:

class InvSpace
{
public:
    InvSpace(int poid = 1) : number(0), name(""), image(), texte(), nbr(), poids(poid) {
        texte.setCharacterSize(20);
        texte.setStyle(sf::Text::Bold);
        nbr.setCharacterSize(25);
        texte.setColor(sf::Color::Red);
        nbr.setColor(sf::Color::Magenta);
    }
    ~InvSpace() {}
    unsigned int number;
    std::string name;
    sf::Sprite image;
    sf::Text texte;
    sf::Text nbr;
    int poids;
};
« Modifié: Mai 17, 2015, 05:59:05 pm par S66 »

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Mon poids est chelou.
« Réponse #1 le: Mai 17, 2015, 01:52:41 pm »
C'est pas assez explicite ?
Ta variable poid n'est pas initialisée, initialise la avant de t'en servir...

S66

  • Full Member
  • ***
  • Messages: 120
  • *-*
    • Voir le profil
    • Teal
Re : Mon poids est chelou.
« Réponse #2 le: Mai 17, 2015, 03:08:18 pm »
On parle bien de la même variable ?
int getPoids() {
        int poid; // Tu va me dire qu'elle n'est pas initialisée ?
                      // Ce n'est pas une variable privée de la classe...
        for( std::size_t i(0) ; i < 16 ; i++) {
            for (std::size_t g = 0; g < myObjects[i].number; g++) {
                poid += myObjects[g].poids;
            }
        }
            return poid;
    }

Enfin bon, j'ai plus les warnings, alors que j'ai touché à rien, mais j'ai toujours le gros nombre 17.../100

G.

  • Hero Member
  • *****
  • Messages: 1593
    • Voir le profil
Re : Mon poids est chelou.
« Réponse #3 le: Mai 17, 2015, 04:27:14 pm »
Tu l'as juste déclarée.
Premier lien sur google en cherchant "initialiser une variable c++" : http://www.commentcamarche.net/contents/197-langage-c-les-variables#initialisation

S66

  • Full Member
  • ***
  • Messages: 120
  • *-*
    • Voir le profil
    • Teal
Re : Mon poids est chelou.
« Réponse #4 le: Mai 17, 2015, 05:58:52 pm »
Ah... effectivement  :-X
Merci de ton aide  :)