Forum de la communauté SFML

Aide => Général => Discussion démarrée par: tintounn le Avril 14, 2012, 09:01:48 pm

Titre: Vérification pointeur null.
Posté par: tintounn le Avril 14, 2012, 09:01:48 pm
Bonsoir, voila j'ai un big problème, je code actuellement un petit rpg mais lorsque que je veux vérifier si un pointeur pointe pas sur rien le programme plante  :o
J'ai bien a 0 les pointeurs dans le constructeur.

void Inventory::addItem(Item *item)
{
    int i;
    int u;
    for(i = 0; i < 6; i++)
    {
        if(m_item[i][0] != NULL) // L'erreur est ici.
        {
            if(m_item[i][0]->getName() == item->getName())
            {
                for(u = 0; u < 64; u++)
                {
                    if(m_item[i][u] == NULL)
                    {
                        std::cout << "Nouvelle ajout dans la categorie: " << item->getName() << std::endl;
                        m_item[i][u] = item;
                        return;
                    }
                }
            }
        }
    }
    for(i = 0; i < 6; i++)
    {
        if(m_item[i][0] == NULL)
        {
            std::cout << "Nouvelle categorie de: " << item->getName() << std::endl;
            m_item[i][0] = item;
            return;
        }
    }
}

Help please  ;D
Titre: Re : Vérification pointeur null.
Posté par: danman le Avril 14, 2012, 09:58:06 pm
m_item[0] != NULL

=> il y a trois erreurs possibles :  (en partant du principe que m_item existe forcément)
m_item[0] est null
m_item[0] est un indice impossible
m_item est un indice impossible

si ça peut t'aider ;)
Titre: Re : Vérification pointeur null.
Posté par: Koryushin le Avril 14, 2012, 10:55:40 pm
Je pense à une mauvaise initialisation du tableau à 2 dimensions m_item.
J'aime vraiment pas ces bestioles en c++. Je prefere leur équivalent de la STL.
Comme je galérais avec les tableau à 2 dimensions j'utilisais du coup un tableau à 1 dimensions bien indicé.

Bref Comment est initialisé le tableau en question ?
Titre: Re : Vérification pointeur null.
Posté par: tintounn le Avril 14, 2012, 10:59:22 pm
Je re-poste le début du code avec 2 cout pour voir si le pointeur est null ou pas, rien ne s'affiche et le programme plante.

    int i;
    int u;
    for(i = 0; i < 6; i++)
    {
        if(m_item[i][0] != NULL)
        {
            std::cout << "Pointeur non null" << std::endl;
            if(m_item[i][0]->getName() == item->getName())
            {
                for(u = 0; u < 64; u++)
                {
                    if(m_item[i][u] == NULL)
                    {
                        std::cout << "Nouvelle ajout dans la categorie: " << item->getName() << std::endl;
                        m_item[i][u] = item;
                        return;
                    }
                }
            }
        }
        else
        {
            std::cout << "Pointeur null" << std::endl;
        }
    }

et j’initialise le tableau comme cela:
Item *m_item[6][64];

Inventory::Inventory(sf::RenderWindow *app)
{
    m_app = app;
    int i;
    int u;
    for(i = 0; i < 6; i++)
    {
        for(u = 0; u < 64; u++)
        {
            m_item[i][u] = NULL;
        }
    }
}


Donc normalement c'est "Pointeur null" qui devrait etre affiché  ???
Titre: Re : Vérification pointeur null.
Posté par: Koryushin le Avril 14, 2012, 11:05:42 pm
Comme dit plus tôt ca fait longtemps que je ne travaille plus avec les tableau mais il me semble qu'il faut initialiser de la sorte. J'ai la flemme d'aller voir le tuto sur les tableau du site du zero.  ;)

Item *m_item[6][64];

Inventory::Inventory(sf::RenderWindow *app)
{
    m_app = app;
    int i;
    int u;

    for(i = 0; i < 6; i++)
    {
        m_item[i] = new Item[64];
        for(u = 0; u < 64; u++)
        {
            m_item[u] = new Item;
            m_item[i][u] = NULL;
        }
    }
}

Enfin un truc dans le style.
Titre: Re : Vérification pointeur null.
Posté par: danman le Avril 15, 2012, 11:33:16 am
yep, c'est ça :

int machin[40];  alloue bien un tableau de 40 cases mais
int* machin[40]; ne fait que créer un tableau de 40 pointeurs
donc int* machin[40][40] est impossible ;) il faut que tu fasses l'initialisation sous-adjacente toi-même ;)

je dis peut etre n'importe quoi, je n'ai pas non plus bossé avec les tableaux C depuis longtemps.

en fait tu le vois comme un tableau multidimensionnel, mais c'est un tableau en ligne qui stocke des colonnes et non des Objet, et ces colonnes stockent les objets ;) .

m_Item = un tableau
m_Item[0] = une colonne
m_Item[j] = un item
Titre: Re : Re : Vérification pointeur null.
Posté par: Ceylo le Avril 15, 2012, 11:41:44 am
m_Item[j] = un item
m_Item[ i ][j]* (problème de balise :p )
Titre: Re : Vérification pointeur null.
Posté par: lezebulon le Avril 15, 2012, 09:05:11 pm
Salut,
je pense que vous avez tous les 2 torts, le code qu'il a proposé est correct:
char *m_item[6][64];


    int i;
    int u;
    for(i = 0; i < 6; i++)
    {
        for(u = 0; u < 64; u++)
        {
            m_item[i][u] = NULL;
        }
    }

    for(i = 0; i < 6; i++)
    {
        if(m_item[i][0] != NULL)
{
}
}

ça tourne sans problème ici... de toute façon si il initialise les cases unes par unes sans souci, il devrait pas y avoir de pb pour les lire après. En fait tintounn il faudrait que tu débuggues ton programme


@Koryushin : non ça ça marchera pas, de toute façon m_item= new Item risque pas de fonctionner, vu que veux placer un Item* dans un Item**, et en plus ton code fait des fuites mémoires vu que tu écrases tes pointeurs avec NULL juste après.

@danman : je ne pige pas le "int* machin[40][40] est impossible ;) il faut que tu fasses l'initialisation sous-adjacente toi-même ;)"-> y'a aucun problème à faire ça, le compilo génères la place 40*40*sizeof(int) octets et te stocke l'adresse dans ton tableau, et puis c'est bon
Titre: Re : Vérification pointeur null.
Posté par: Bigz le Avril 16, 2012, 10:00:08 am
Question con : Tu es sur que c'est bien ce constructeur qui est appelé ?
Titre: Re : Vérification pointeur null.
Posté par: tintounn le Avril 16, 2012, 12:42:09 pm
Oui le constructeur est bien appelé ;) J'avoue être perdu, c'est la première fois que je suis confronté a cela. Je tente une réinstallation de codeblocks avec mingw  ;)
Titre: Re : Vérification pointeur null.
Posté par: Laurent le Avril 16, 2012, 12:52:21 pm
Il faut plus d'informations avant d'essayer de trouver la cause du problème.

1. Ca c'est primordial, il faut voir la déclaration de la variable m_item.

2. Un petit coup de debugger vite fait pour voir où et pourquoi ça plante, ce serait sympa non ? ;)

3. Le top ce serait d'extraire le morceau qui pose problème dans un code complet et minimal, comme ça on sait de manière sûre si le problème vient bien du code qui boucle, ou bien si ça n'a rien à voir.
Titre: Re : Vérification pointeur null.
Posté par: tintounn le Avril 16, 2012, 01:00:55 pm
Je viens de lancer le debugger voici ce qu'il me dit:

Citer
#0 00000000   0x0045c946 in ??() (??:??)
#1 00000000   0x0028fc4c in ??() (??:??)
#2 00000000   0x0a4880d0 in ??() (??:??)
#3 00000000   0x0028ffc4 in ??() (??:??)
#4 74F38CD5   msvcrt!atan2() (C:\Windows\syswow64\msvcrt.dll:??)
#5 00000000   0xc7250777 in ??() (??:??)
#6 00000000   0x006b5300 in ??() (??:??)
#7 00000000   0x006b4a78 in ??() (??:??)
#8 00000000   0x0028fcec in ??() (??:??)
#9 00000000   0x0028fc6c in ??() (??:??)
#10 00000000   0x004120c0 in ??() (??:??)
#11 00000000   0x00485014 in ??() (??:??)
#12 00000000   0x0028fc80 in ??() (??:??)
#13 00000000   0x0045856f in ??() (??:??)
#14 00000000   0x004120c0 in ??() (??:??)
#15 00000000   0x00484884 in ??() (??:??)
#16 00000000   0x0028fc90 in ??() (??:??)
#17 00000000   0x0045c9c0 in ??() (??:??)
#18 00000000   0x0028fc30 in ??() (??:??)
#19 00000000   0x00485001 in ??() (??:??)
#20 00000000   0x0048ecc0 in ??() (??:??)
#21 00000000   0x0047fc6b in ??() (??:??)
#22 00000000   0x004120c0 in ??() (??:??)
#23 00000000   0x00484ea0 in ??() (??:??)
#24 00000000   0x0028fca0 in ??() (??:??)
#25 00000000   0x004586bf in ??() (??:??)
#26 00000000   0x0028fc50 in ??() (??:??)
#27 00000000   0x0028fcb8 in ??() (??:??)
#28 00000000   0x00409aae in ??() (??:??)
#29 00000000   0x0028fd24 in ??() (??:??)

Et la déclaration de m_item ce passe ici:
#ifndef INVENTORY_H_INCLUDED
#define INVENTORY_H_INCLUDED
#include <iostream>
#include <SFML/Graphics.hpp>
#include <SFML/System.hpp>
#include <SFML/Window.hpp>

class Item;

class Inventory
{
    public:
    Inventory(sf::RenderWindow *app);
    ~Inventory();
    void addItem(Item *item);
    std::vector<Item*> getItem(const sf::Vector2f position);
    void draw();


    private:
    sf::RenderWindow *m_app;
    Item *m_item[6][64];
};

#endif

Titre: Re : Vérification pointeur null.
Posté par: Laurent le Avril 16, 2012, 01:30:42 pm
Citer
Je viens de lancer le debugger voici ce qu'il me dit
On voit pas grand chose. Tu compiles bien en mode debug (pas release) ?

En tout cas l'erreur n'a pas l'air de venir des morceaux de code que tu as postés, il faudrait voir ce qu'il y a au-dessus (le code qui appelle ces fonctions).
Titre: Re : Vérification pointeur null.
Posté par: tintounn le Avril 16, 2012, 01:47:42 pm
pfff, ayez sa marche  :o dans le constructeur de Game j'ai juste changer de place l'initialisation de Inventory et sa fonctionne  ???

Avant:
Game::Game()
{
    m_app = new sf::RenderWindow(sf::VideoMode(840, 840, 32), "1518-World", sf::Style::None | sf::Style::Close);
    m_app->setVerticalSyncEnabled(true);

    m_view = new sf::View;
    *m_view = m_app->getDefaultView();

    m_event = new sf::Event;

    m_imageManager = new ImgMgr;
    m_imageManager->setImage("ressources.png", 16);
    m_imageManager->getImage().createMaskFromColor(sf::Color::Color(255, 81, 243));
    m_imageManager->getTexture().update(m_imageManager->getImage());

    m_player = new Player(m_app, m_view, m_level, m_inventory);
    m_player->setSkin(m_imageManager->getSprite(81, 90));

    m_level = new Level(m_app, m_imageManager, m_player, m_inventory);
    m_level->loadLevel("level.png");
    m_player->setPosition(m_level->getOriginPlayer());
    m_level->addItem(new SaphirSword(m_app, m_level, m_player, m_imageManager, m_inventory), 6, sf::Vector2f(2, 2));

    m_hud = new Hud(m_app, m_view, m_player, m_imageManager, m_inventory);

    m_inventory = new Inventory(m_app);

    m_musicMgr = new MusicMgr;
}

Apres:
Game::Game()
{
    m_app = new sf::RenderWindow(sf::VideoMode(840, 840, 32), "1518-World", sf::Style::None | sf::Style::Close);
    m_app->setVerticalSyncEnabled(true);

    m_view = new sf::View;
    *m_view = m_app->getDefaultView();

    m_event = new sf::Event;

    m_imageManager = new ImgMgr;
    m_imageManager->setImage("ressources.png", 16);
    m_imageManager->getImage().createMaskFromColor(sf::Color::Color(255, 81, 243));
    m_imageManager->getTexture().update(m_imageManager->getImage());

    m_player = new Player(m_app, m_view, m_level, m_inventory);
    m_player->setSkin(m_imageManager->getSprite(81, 90));

    m_inventory = new Inventory(m_app);

    m_level = new Level(m_app, m_imageManager, m_player, m_inventory);
    m_level->loadLevel("level.png");
    m_player->setPosition(m_level->getOriginPlayer());
    m_level->addItem(new SaphirSword(m_app, m_level, m_player, m_imageManager, m_inventory), 6, sf::Vector2f(2, 2));

    m_hud = new Hud(m_app, m_view, m_player, m_imageManager, m_inventory);

    m_musicMgr = new MusicMgr;
}
Titre: Re : Vérification pointeur null.
Posté par: Laurent le Avril 16, 2012, 02:05:02 pm
Donc tu ne sais pas plus pourquoi ça ne marchait pas, et ça va bientôt te retomber dessus étant donné qu'il s'agit probablement d'une corruption mémoire vicieuse qui affecte un endroit du code qui n'a rien à voir avec la cause :D

Sérieusement, essaye de faire marcher ton debugger. Quel temps gâché à chercher un problème quasiment à l'aveugle, alors qu'un simple clic sur un bouton permet de savoir quelle ligne de code plante, pourquoi, et quel enchaînement d'appels à permis d'y arriver.
Titre: Re : Vérification pointeur null.
Posté par: lezebulon le Avril 16, 2012, 02:11:08 pm
Tu peux en profiter pour corriger le    m_view = new sf::View;
    *m_view = m_app->getDefaultView();
aussi ;)
Titre: Re : Vérification pointeur null.
Posté par: tintounn le Avril 16, 2012, 02:15:07 pm
Corriger, et puis un GRAND merci a toute les personnes qui m'ont aidaient  :) Tout façon je risque pas de rester longtemps sur ce projet car j'aime pas l'architecture que prend celui ci. Je vais quand même m'attaquer au pourquoi du comment. Je poste quand j'ai des nouvelles ;)

Je vous souhaites une bonne journée et encore merci :D
Titre: Re : Vérification pointeur null.
Posté par: Orwel le Avril 17, 2012, 06:45:34 pm
Je pense que son probléme est réglée

m_level->addItem(new SaphirSword(m_app, m_level, m_player, m_imageManager, m_inventory), 6, sf::Vector2f(2, 2));

m_hud = new Hud(m_app, m_view, m_player, m_imageManager, m_inventory);

 m_inventory = new Inventory(m_app);

Il ajoutais l'inventaire avant de le crée. Donc la valeur de l'inventaire était indéterminé dans m_level.

Tu devrais procéder comme ceci dans un constructeur :
-Contruction des attributs
-Initialisation des attributs
-autre...

Puis le débugeur de Code::Block est tellement friendly, abusent  ;D