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

Auteur Sujet: [ Résolu ] SIGSEGV (inventaire)  (Lu 9878 fois)

0 Membres et 1 Invité sur ce sujet

S66

  • Full Member
  • ***
  • Messages: 120
  • *-*
    • Voir le profil
    • Teal
[ Résolu ] SIGSEGV (inventaire)
« le: Avril 08, 2015, 06:27:21 pm »
Bonjour,
...
Regardez en bas. Enfin, à la page 3.
« Modifié: Avril 19, 2015, 02:14:03 pm par S66 »

S66

  • Full Member
  • ***
  • Messages: 120
  • *-*
    • Voir le profil
    • Teal
Re : SIGSEGV plantage du prog
« Réponse #1 le: Avril 08, 2015, 06:34:53 pm »
Wow la grossière erreur !
J'ai mis dans inventory.h: if (pos > maxTailleX) alors que c'est l'inverse ! :o
Désolé du dérangement

S66

  • Full Member
  • ***
  • Messages: 120
  • *-*
    • Voir le profil
    • Teal
Re : SIGSEGV plantage du prog
« Réponse #2 le: Avril 08, 2015, 06:42:06 pm »
Bon.. triple post et 2e erreur, exactement le même message, mais cette fois le problème est ici:
Le programme plante quand je fais I, ce qui est censé m'afficher l'inventaire...

// inventory.h

std::string recupStr (const int pos) {
        if(pos < maxTailleX)
            return invStr[pos]; // fleche jaune ici
        else
            return "";
    }
 

Glân de Brylan

  • Jr. Member
  • **
  • Messages: 83
  • Je pense ce que je dis et le dis comme je le pense
    • Voir le profil
Re : SIGSEGV plantage du prog
« Réponse #3 le: Avril 09, 2015, 11:31:19 am »
Ah, l'éternel sigsev...le terrible, le redouté sigsev.
Il n'y a pas quarante solutions. Lance le debugger, exécute le programme pas-à-pas, et au moment où ça plante, trouve l'erreur.
SIGSEV apparaît dans les cas suivants :
– Quand tu essaies de déréférencer un pointeur nul.
Exemple :
MaClasse *ptr = nullptr;
ptr->fonctionMembre(); // ERREUR : Le pointeur est nul, la fonction ne peut être appelée.
– Quand tu essaies d'accéder à une case de mémoire qui n'est pas allouée à ton programme.
Exemple :
int *entier = new int(0);
*entier = 5; // pas de problème, la case de mémoire pointée est à toi.
delete entier;
*entier = 0; // ERREUR : la case de mémoire pointée n'est plus allouée à ton programme.

Dans tous les cas tu as un problème de pointeurs quelque part, et le seul moyen de trouver où est d'y aller à grands coups de debugger.


EDIT : J'avoue avoir répondu sans lire ton post.
Conseil : Pour stocker une position, prend un entier non signé, basiquement unsigned int plutôt que juste int.
Je te conseillerais même d'utiliser std::size_t qui est là exprès pour ça. Ça t'évitera des problèmes de positions négatives qui sont parfois source de problèmes.

Autre conseil : donne des noms explicites. J'ai pris une ligne au pif et ai trouvé ble4.getAvb(). Comment suis-je supposé comprendre ce que cela signifie ?! Chage tes noms, là c'est incompréhensible, personne ne va vouloir t'aider avec un code pareil.
Pareil, dans ta classe inventaire, il y a : std::string invStr[];
Je suppose que invStr signifie "inventory string". La chaîne de caractères de l'inventaire. Cool, ça correspond à quoi ? À quoi sert cete attribut ? C'est son nom ? Si c'est son nom, appelle-le name, ne lui donne pas un nom à la noix. Et surtout pas un nom qui contient celui du type, n'appelle pas un string str, il y a std::string juste avant, je voir bien que c'est un string, pas la peine de le remettre dans le nom de l'instance.
D'ailleurs au début j'avais pas pigé que inv c'était pour inventory, je croyais que c'était inverse...comme quoi...
« Modifié: Avril 09, 2015, 11:44:46 am par Glân de Brylan »
Vous aussi, ayez chaque jour une pensée pour tous ces gamins qui s'imaginent faire un MMORPG touts seuls, et ce avant même d'avoir appris le C++.

S66

  • Full Member
  • ***
  • Messages: 120
  • *-*
    • Voir le profil
    • Teal
Re : Re : SIGSEGV plantage du prog
« Réponse #4 le: Avril 09, 2015, 06:39:08 pm »
EDIT : J'avoue avoir répondu sans lire ton post.
Conseil : Pour stocker une position, prend un entier non signé, basiquement unsigned int plutôt que juste int.
Je te conseillerais même d'utiliser std::size_t qui est là exprès pour ça. Ça t'évitera des problèmes de positions négatives qui sont parfois source de problèmes.

Autre conseil : donne des noms explicites. J'ai pris une ligne au pif et ai trouvé ble4.getAvb(). Comment suis-je supposé comprendre ce que cela signifie ?! Chage tes noms, là c'est incompréhensible, personne ne va vouloir t'aider avec un code pareil.
Pareil, dans ta classe inventaire, il y a : std::string invStr[];
Je suppose que invStr signifie "inventory string". La chaîne de caractères de l'inventaire. Cool, ça correspond à quoi ? À quoi sert cete attribut ? C'est son nom ? Si c'est son nom, appelle-le name, ne lui donne pas un nom à la noix. Et surtout pas un nom qui contient celui du type, n'appelle pas un string str, il y a std::string juste avant, je voir bien que c'est un string, pas la peine de le remettre dans le nom de l'instance.
D'ailleurs au début j'avais pas pigé que inv c'était pour inventory, je croyais que c'était inverse...comme quoi...

ble4.getAvb ? Bah je vais pas non plus écrire tous les noms des fonctions en entier, je suis feignant moi...
la fonction getAvb signifie getAvaible, pour voir si l'objet est avaible ou pas. <.<
Pourquoi invStr ? Bah qu'est ce que tu veux que je te dises, invStr ou invName, ça change pas grand chose...
J'ai mis unsigned int à la place de int, ça change rien vu que l'erreur est sur invStr, mais bon, au moins ça sera fait x)

std::string recupStr (const int pos) {
        if(pos < maxTailleX)
            return invStr[pos]; // Trace du débogueur. J'vois pas ce qu'y'a de mal ici...
        else
            return "";
    }
Et toujours le même problème, Sigsegv

G.

  • Hero Member
  • *****
  • Messages: 1592
    • Voir le profil
Re : SIGSEGV plantage du prog
« Réponse #5 le: Avril 09, 2015, 06:46:56 pm »
Tu devrais tenter d'initialiser invStr avant de t'en servir... ce que tu fais dans ton constructeur ne sert a RIEN.
Et quel rapport entre un tableau de string et SFML ?
« Modifié: Avril 09, 2015, 06:58:09 pm par G. »

Glân de Brylan

  • Jr. Member
  • **
  • Messages: 83
  • Je pense ce que je dis et le dis comme je le pense
    • Voir le profil
Re : Re : Re : SIGSEGV plantage du prog
« Réponse #6 le: Avril 09, 2015, 07:20:16 pm »
ble4.getAvb ? Bah je vais pas non plus écrire tous les noms des fonctions en entier, je suis feignant moi...
Eh bien, je ne vais pas m'embêter à comprendre ton code plus que ça, je suis fainéant moi...
Plus sérieusement, si tu ne donnes pas de noms explicites dans ton code, si un jour tu veux réutiliser ce code mais que tu n'y as pas touché depuis des mois, tu vas toi-même avoir beaucoup de mal à comprendre comment cela fonctionne.

invStr ou invName, ça change pas grand chose
Ah ben à l'exécution, c'est sûr, ça ne change absolument rien. Mais comme je l'ai dit, c'est plus clair. Une chaîne de caractères c'est pas forcément un nom, ça peut être par exemple un texte qui s'affiche quand tu ouvres l'inventaire, ou encore plein d'autres trucs qu'on pourrait imaginer.

Il est important de donner des noms clairs. Si tu refuses de le faire, ne t'attends pas à recevoir de l'aide rapide et efficace.
Vous aussi, ayez chaque jour une pensée pour tous ces gamins qui s'imaginent faire un MMORPG touts seuls, et ce avant même d'avoir appris le C++.

S66

  • Full Member
  • ***
  • Messages: 120
  • *-*
    • Voir le profil
    • Teal
Re : Re : SIGSEGV plantage du prog
« Réponse #7 le: Avril 11, 2015, 09:42:54 am »
Tu devrais tenter d'initialiser invStr avant de t'en servir... ce que tu fais dans ton constructeur ne sert a RIEN.
Ah bon ? Voici mon nouveau code alors <.<

class Inventory {
public:
    Inventory () :  maxTailleX(16), invInt(), invName() {
        //unsigned int invInt[maxTailleX];
        //std::string invName[maxTailleX];
    }
    ~Inventory () {}
    bool modifier (int posX, int nbr, std::string str) {
        if(posX < maxTailleX)
            return false;
        invInt[posX] = nbr;
        invName[posX] = str;
        return true;
    }
    unsigned int recupInt (int posX) {
        if(posX < maxTailleX)
            return invInt[posX];
        else
            return 0;
    }
    std::string recupStr (const int pos) {
        if(pos < maxTailleX)
            return invName[pos]; //toujours ici la trace du débogueur...
        else
            return "";
    }
private:
   const int maxTailleX;
   unsigned int invInt[]; // Nombre d'objets dans la place de l'inventaire X
   std::string invName[]; // Nom de l'objet dans l'inventaire X
};

M'enfin..

Object.h:

class RObject : public Entity {
public:
    RObject(int xx, int yx, std::string nam, bool canBeUsed = true, bool isAvaible = true) : \
        Entity(), name(nam), type(3), isStillAvaible(isAvaible), isUsed(canBeUsed) {
        x = 0;
        y = 0;
        //name = nam;
        //type = 3;
        int i = 1;
        while (i < xx) {
            Icon.move(32.f, 0.f);
            x+=1;
            i+=1;
        }
        i = 1;
        while (i < yx) {
            Icon.move(0.f, 32.f);
            y+=1;
            i+=1;
        }
        i = 0;
        //isStillAvaible = isAvaible;
        //isUsed = canBeUsed;
    }
    bool load(const std::string& texture) {
        if (m_texture.loadFromFile(texture))
            Icon.setTexture(m_texture);
        else
            return false;
        return true;
    }
    ~RObject() {}
    bool inter() {
        if (isStillAvaible && isUsed)
            return true;
        else
            return false;
    }
    void changeU(bool u) {
        isUsed = u;
    }
    bool getU() {
        return isUsed;
    }
    bool getAvb() {
        return isStillAvaible;
    }
    void changeAvb(bool n) {
        isStillAvaible = n;
    }
    std::string getName() {
        return name;
    }
private:
    int type;
    bool isStillAvaible; // Montré/Caché, si oui = montré
    bool isUsed; // Pour interagir, si oui = peut interagir
    std::string name;
    virtual void draw(sf::RenderTarget& target, sf::RenderStates states) const {

        // on applique la transformation
        states.transform *= getTransform();

        // on applique la texture du tileset
        states.texture = &m_texture;

        // et on dessine enfin le tableau de vertex
        target.draw(Icon, states);
    }
};

Code qui me donne un warning '-'

C:\Users\william\Projets\C++\newQt\Projects\dofus\Code\tilemap\Object.h:66: avertissement : 'RObject::name' will be initialized after [-Wreorder]
     std::string name;
                 ^

Mais, rien n'a changé, toujours le même problème, et pourtant j'ai initialisé...
Enfin je crois...

Glân de Brylan

  • Jr. Member
  • **
  • Messages: 83
  • Je pense ce que je dis et le dis comme je le pense
    • Voir le profil
Re : SIGSEGV plantage du prog
« Réponse #8 le: Avril 11, 2015, 10:42:03 am »
unsigned int invInt[]; // Nombre d'objets dans la place de l'inventaire X
std::string invName[]; // Nom de l'objet dans l'inventaire X
C'est simple. Tu n'as pas donné de taille à tes tableaux. invInt et invName sont des tableaux de 0 cases.
Donc évidemment si tu essaies d'accéder à la case 4 (par exemple), ça plante, et ta condition ne l'empêche pas puisque 4 est bien inférieur à 16 (maxTalleX).

unsigned int invInt[16]; // Nombre d'objets dans la place de l'inventaire X
std::string invName[16]; // Nom de l'objet dans l'inventaire X
Vous aussi, ayez chaque jour une pensée pour tous ces gamins qui s'imaginent faire un MMORPG touts seuls, et ce avant même d'avoir appris le C++.

S66

  • Full Member
  • ***
  • Messages: 120
  • *-*
    • Voir le profil
    • Teal
Re : SIGSEGV plantage du prog
« Réponse #9 le: Avril 11, 2015, 12:12:39 pm »
Juste pour ça ! ><
Merci beaucoup '-'

S66

  • Full Member
  • ***
  • Messages: 120
  • *-*
    • Voir le profil
    • Teal
Re : SIGSEGV plantage du prog
« Réponse #10 le: Avril 11, 2015, 01:14:58 pm »
Super. Mais j'ai un autre problèmes.
Enfin deux, mais pour le 2e, on verra après...

Voici mon main:
#include "tilemap.h"
#include "perso.h"
#include "Entity.h"
#include "PNJ.h"
#include "Object.h"
#include "Monster.h"
#include "Inventory.h"

#include <SFML/Window.hpp>
#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>
#include <string>
#include <fstream>
#include <QApplication>
#include <QDebug>

using namespace std;

bool RInter(Perso& p, RObject& e, const std::string& texture, Inventory& inv) {
    if (p.inter(e) == e.getType()) {
        qDebug() << "23";
        if (e.inter()) {
            qDebug() << "25";
            e.changeU(false);
            if (!e.load(texture))
                 return false;
            string e_name = e.getName();
            if (e_name == "ble") {
                qDebug() << "31";
                int nb = inv.recupInt(0);
                int nbr = nb+1;
                inv.modifier(0, nbr, e_name);
            }
            if (e_name == "orge") {
                qDebug() << "37";
                int nb = inv.recupInt(1);
                int nbr = nb+1;
                inv.modifier(1, nbr, e_name);
            }
            qDebug() << "42";
            qDebug() << "";
            return true;
        }
    }
    qDebug() << "46";
    qDebug() << "";
    return false;
}

int main(int argc, char *argv[])
{
    // on crée la fenêtre
    QApplication app(argc, argv);
    //------------------------------------17----8
sf::RenderWindow window(sf::VideoMode(544, 256), "Tilemap");
    sf::RenderWindow w;
    sf::VideoMode v(400, 200);
    int errCode = 0;
    sf::Font font;
    font.loadFromFile("arial.ttf");
    sf::View view = window.getDefaultView();

    // on définit le niveau à l'aide de numéro de tuiles
    const int level[] ={.........};

    // on crée la tilemap avec le niveau précédemment défini
    TileMap map;
    if (!map.load("tileset.png", sf::Vector2u(32, 32), level, 52, 24)) {
          //gestion d'erreur...
    }
    //                            ____________________________^ THIS
    Perso perso; //               v THIS
    if (!perso.load("perso.png", 52)) {
        //gestion d'erreur...
    }
    // __________________________^
    RObject ble(49, 13, "ble"), \
            ble2(47, 13, "ble"), \
            ble3(48, 12, "ble"), \
            ble4(45, 11, "ble"), \
            ble5(44, 12, "ble"), \
            ble6(47, 11, "ble");

    if (!ble.load("ble.png") \
            || !ble2.load("ble.png") \
            || !ble3.load("ble.png") \
            || !ble4.load("ble.png") \
            || !ble5.load("ble.png") \
            || !ble6.load("ble.png")) {
        //...
    }
    //
    RObject orge(47, 14, "orge"), \
            orge2(45, 13, "orge"), \
            orge3(44, 14, "orge"), \
            orge4(49, 11, "orge");

    if (!orge.load("orge.png") \
            || !orge2.load("orge.png") \
            || !orge3.load("orge.png") \
            || !orge4.load("orge.png")) {
        //...
    }

    //RObjects = true; A desactiver si on
    // ne veut pas faire les interactions.
    // RObjects = false pour desactiver
    bool RObjects = true;
        bool Ble = true;
        bool Orge = true;

        Inventory Inventaire;
    int myInt;
    float myFloat;
    sf::Sprite mySprite;
    sf::Texture myTexture;

   while (window.isOpen())
    {
        // on gère les évènements
        sf::Event event;
        while (window.pollEvent(event))
        {
            if(event.type == sf::Event::Closed) {
                window.sf::RenderWindow::close();
                if (errCode != 0)
                    w.sf::RenderWindow::close();
                return 0;
            }

            if (event.type == sf::Event::KeyPressed && errCode == 0) // Si on appuie sur une touche
            {
                if (event.key.code == sf::Keyboard::Right)
                    perso.deplacer(Perso::Orientation::Droite, level, view);
                if (event.key.code == sf::Keyboard::Left)
                    perso.deplacer(Perso::Orientation::Gauche, level, view);
                if (event.key.code == sf::Keyboard::Down)
                    perso.deplacer(Perso::Orientation::Bas, level, view);
                if (event.key.code == sf::Keyboard::Up)
                    perso.deplacer(Perso::Orientation::Haut, level, view);
                if (event.key.code == sf::Keyboard::E) {
                    if (RObjects) {
                        if (Ble) {
                            RInter(perso, ble, "deadBle.png", Inventaire); // E => Interaction
                            RInter(perso, ble2, "deadBle.png", Inventaire);
                            RInter(perso, ble3, "deadBle.png", Inventaire);
                            RInter(perso, ble4, "deadBle.png", Inventaire);
                            RInter(perso, ble5, "deadBle.png", Inventaire);
                            RInter(perso, ble6, "deadBle.png", Inventaire);
                        }
                        if(Orge) {
                            RInter(perso, orge, "deadOrge.png", Inventaire);
                            RInter(perso, orge2, "deadOrge.png", Inventaire);
                            RInter(perso, orge3, "deadOrge.png", Inventaire);
                            RInter(perso, orge4, "deadOrge.png", Inventaire);
                        }
                    }
                }
                if (event.key.code == sf::Keyboard::I) {
                    if (perso.getStatus() == 0)
                        perso.setStatus(1); //mode inventaire
                    else
                        perso.setStatus(0); //mode jeu
                }
            }

        }
window.clear(sf::Color::Green);

        if (errCode == 0) {
            window.setView(view);
            if (perso.getStatus() == 0) {
                window.draw(map);
                if (RObjects) {
                    if (Ble) {
                        if (ble.getAvb())
                            window.draw(ble);
                        if (ble2.getAvb())
                           window.draw(ble2);
                        if (ble3.getAvb())
                           window.draw(ble3);
                        if (ble4.getAvb())
                          window.draw(ble4);
                        if (ble5.getAvb())
                          window.draw(ble5);
                        if (ble6.getAvb())
                            window.draw(ble6);
                    }
                    if (Orge) {
                        if (orge.getAvb())
                            window.draw(orge);
                        if (orge2.getAvb())
                            window.draw(orge2);
                        if (orge3.getAvb())
                            window.draw(orge3);
                        if (orge4.getAvb())
                            window.draw(orge4);
                    }
                }
                window.draw(perso);
            }
if (perso.getStatus() == 1) {
                //Draw Invetory
                myInt = 0;
                myFloat = 0;
                while (Inventaire.recupInt(myInt) > 0) {
                    string strr = Inventaire.recupStr(myInt);
                    string str_texture = strr;
                    str_texture += ".png";
                    if (myTexture.loadFromFile(str_texture)) {
                        mySprite.setTexture(myTexture);
                        int nbrr = Inventaire.recupInt(myInt);
                        string nbrrr = to_string(nbrr);
                        sf::Text myText(strr, font, 10);
                        sf::Text myText2(nbrrr, font, 10);
                        myText2.move(20.f, 0.f);

                        myText.move(myFloat, 0.f);
                        myText2.move(myFloat, 0.f);
                        mySprite.move(myFloat, 0.f);

                        window.draw(mySprite);
                        window.draw(myText);
                        window.draw(myText2);
                    }
                    myFloat += 32;
                    myInt += 1;
                }
            }
        }
        window.display();
    }
    return 0;
}
 
Quel gros main...

M'enfin, alors voilà, quand je fais E, n'importe où, et bien tous mes RObjects sont "utilisés" alors qu'ils ne devraient pas !
Par exemple, je suis en 3;3 et le RObject est en 49;13, quand je fais E, le RObject a l'image deadBle.png (ou deadOrge.png pour l'orge) alors qu'il ne devrait pas !
Et cela, pour tous les RObjects...
if (event.key.code == sf::Keyboard::E) {
                    if (RObjects) {
                        if (Ble) {
                            RInter(perso, ble, "deadBle.png", Inventaire); // E => Interaction
                            RInter(perso, ble2, "deadBle.png", Inventaire);
                            RInter(perso, ble3, "deadBle.png", Inventaire);
                            RInter(perso, ble4, "deadBle.png", Inventaire);
                            RInter(perso, ble5, "deadBle.png", Inventaire);
                            RInter(perso, ble6, "deadBle.png", Inventaire);
                        }
                        if(Orge) {
                            RInter(perso, orge, "deadOrge.png", Inventaire);
                            RInter(perso, orge2, "deadOrge.png", Inventaire);
                            RInter(perso, orge3, "deadOrge.png", Inventaire);
                            RInter(perso, orge4, "deadOrge.png", Inventaire);
                        }
                    }
                }

bool RInter(Perso& p, RObject& e, const std::string& texture, Inventory& inv) {
    if (p.inter(e) == e.getType()) {
        qDebug() << "23";
        if (e.inter()) {
            qDebug() << "25";
            e.changeU(false);
            if (!e.load(texture))
                 return false;
            string e_name = e.getName();
            if (e_name == "ble") {
                qDebug() << "31";
                int nb = inv.recupInt(0);
                int nbr = nb+1;
                inv.modifier(0, nbr, e_name);
            }
            if (e_name == "orge") {
                qDebug() << "37";
                int nb = inv.recupInt(1);
                int nbr = nb+1;
                inv.modifier(1, nbr, e_name);
            }
            qDebug() << "42";
            qDebug() << "";
            return true;
        }
    }
    qDebug() << "46";
    qDebug() << "";
    return false;
}

Donc quand je fais E, la console m'affiche:
23
25
31
42
pour le blé, et pour l'orge:
32
35
37
42

... ?

Ah et voici les fonctions inter...
perso.inter:
int inter(Entity e) {
        int eX = e.getX();
        int eYY = e.getY();
        int eY = mynumx*eYY;
        int eXY = eY+eX;
        if (e.getType() == 0)
            return 0;
        if (e.getType() != 0 && eXY == xy)
            return e.getType();
        else
            return 0;
    }
RObject.inter:
bool inter() {
        if (isStillAvaible && isUsed)
            return true;
        else
            return false;
    }
Entity.getType:
int getType() {
        return type;
    }
 

RObject hérite de Entity

Merci d'avance  :)
« Modifié: Avril 11, 2015, 01:17:54 pm par S66 »

Glân de Brylan

  • Jr. Member
  • **
  • Messages: 83
  • Je pense ce que je dis et le dis comme je le pense
    • Voir le profil
Re : SIGSEGV plantage du prog
« Réponse #11 le: Avril 11, 2015, 01:38:26 pm »
Avant tout, une petite chose :
RObject ble(49, 13, "ble"), \
            ble2(47, 13, "ble"), \
            ble3(48, 12, "ble"), \
            ble4(45, 11, "ble"), \
            ble5(44, 12, "ble"), \
            ble6(47, 11, "ble");
Alors ce code est correct, pas de problèmes. Sache juste que les \ sont inutiles vu qu'en C++ il n'y a aucune notion de fin de ligne. Par exemple, si tu avais écrit :
RObject ble(49, 13, "ble"),



            ble2(47, 13, "ble"),
            ble3(48, 12, "ble"),

            ble4(45, 11, "ble"),
            ble5(44, 12, "ble"),                           ble6(47, 11, "ble");
Cela fonctionnerait tout aussi bien.

Pour ce qui est de ton problème...je ne suis pas sûr d'avoir très bien compris ton code, mais si c'est le cas, quand on appuie sur E, ça appelle la fonction RInter sur tous les objets ble ou orge, selon. Or cette fonction fait deux choses : ajouter le blé/orge dans ton inventaire et transformer celui au sol en blé/orge mort.
Ton programme fait exactement ce que tu lui demande : récupérer tout. Tu dois faire en sorte de vérifier pour chaque blé si ton perso est dessus, et si oui, récupérer le blé/orge. Là ,aucun test de hitbox n'est fait, donc évidemment, il récupère tout.
Vous aussi, ayez chaque jour une pensée pour tous ces gamins qui s'imaginent faire un MMORPG touts seuls, et ce avant même d'avoir appris le C++.

S66

  • Full Member
  • ***
  • Messages: 120
  • *-*
    • Voir le profil
    • Teal
Re : SIGSEGV plantage du prog
« Réponse #12 le: Avril 11, 2015, 02:19:35 pm »
Euh, si, y'a des tests, regarde:
bool RInter(Perso& p, RObject& e, const std::string& texture, Inventory& inv) {
    if (p.inter(e) == e.getType()) {
        qDebug() << "23";
        if (e.inter()) {
            qDebug() << "25";
            e.changeU(false);
            if (!e.load(texture))
                 return false;
            string e_name = e.getName();
            if (e_name == "ble") {
                qDebug() << "31";
                int nb = inv.recupInt(0);
                int nbr = nb+1;
                inv.modifier(0, nbr, e_name);
            }
            if (e_name == "orge") {
                qDebug() << "37";
                int nb = inv.recupInt(1);
                int nbr = nb+1;
                inv.modifier(1, nbr, e_name);
            }
            qDebug() << "42";
            qDebug() << "";
            return true;
        }
    }
    qDebug() << "46";
    qDebug() << "";
    return false;
}
p.inter:
int inter(Entity e) {
        int eX = e.getX();
        int eYY = e.getY();
        int eY = mynumx*eYY;
        int eXY = eY+eX;
        if (e.getType() == 0)
            return 0;
        if (e.getType() != 0 && eXY == xy)
            return e.getType();
        else
            return 0;
    }
et e.inter:
bool inter() {
        if (isStillAvaible && isUsed)
            return true;
        else
            return false;
    }

Donc, c'est pas censé faire ça.

Et pour les \, pas grave, je préfère comme ça ^^

Glân de Brylan

  • Jr. Member
  • **
  • Messages: 83
  • Je pense ce que je dis et le dis comme je le pense
    • Voir le profil
Re : SIGSEGV plantage du prog
« Réponse #13 le: Avril 11, 2015, 03:15:55 pm »
        int eXY = eY+eX;
        if (e.getType() == 0)
            return 0;
        if (e.getType() != 0 && eXY == xy)
Première erreur. Tu ne peux pas juste additionner les coordonnées. Si son perso est en (3;6) et ton blé en (5;4), ils ne sont pas du tout au même endroit et pourtant ton programme va croire que si. Tu dois comparer les x et le y séparément.
Ensuite j'aimerais comprendre : c'est quoi getType() ? Ça renvoie un int, mais qui correspond à quoi ? Usuellement, pour définir un type, on crée une énumération, on ne se contente pas d'un int...
Vous aussi, ayez chaque jour une pensée pour tous ces gamins qui s'imaginent faire un MMORPG touts seuls, et ce avant même d'avoir appris le C++.

S66

  • Full Member
  • ***
  • Messages: 120
  • *-*
    • Voir le profil
    • Teal
Re : SIGSEGV plantage du prog
« Réponse #14 le: Avril 11, 2015, 04:03:31 pm »
getType correspond au type de l'entity
0 = juste une entité, aucune interaction
1 = un monstre.
2 = un PNJ.
3 = un RObject
Et, comparer les coordonnés séparément ?
D'accord, je vais essayer

EDIT:
int inter(Entity e) const {
        int eX = e.getX();
        int eY = e.getY();
        if (e.getType() == 0)
            return 0;
        if (e.getType() != 0 && eX == x && eY == y)
            return e.getType();
        else
            return 0;
    }

Ça change rien. Je comprends pas ><
« Modifié: Avril 11, 2015, 04:07:48 pm par S66 »