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

Auteur Sujet: Vérification pointeur null.  (Lu 9435 fois)

0 Membres et 2 Invités sur ce sujet

tintounn

  • Newbie
  • *
  • Messages: 20
    • Voir le profil
Vérification pointeur null.
« 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

danman

  • Hero Member
  • *****
  • Messages: 1121
    • Voir le profil
    • E-mail
Re : Vérification pointeur null.
« Réponse #1 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 ;)
Pointilleur professionnel

Koryushin

  • Jr. Member
  • **
  • Messages: 93
    • Voir le profil
Re : Vérification pointeur null.
« Réponse #2 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 ?

tintounn

  • Newbie
  • *
  • Messages: 20
    • Voir le profil
Re : Vérification pointeur null.
« Réponse #3 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é  ???

Koryushin

  • Jr. Member
  • **
  • Messages: 93
    • Voir le profil
Re : Vérification pointeur null.
« Réponse #4 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.
« Modifié: Avril 14, 2012, 11:08:16 pm par Koryushin »

danman

  • Hero Member
  • *****
  • Messages: 1121
    • Voir le profil
    • E-mail
Re : Vérification pointeur null.
« Réponse #5 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
« Modifié: Avril 15, 2012, 11:34:53 am par danman »
Pointilleur professionnel

Ceylo

  • Hero Member
  • *****
  • Messages: 2325
    • Voir le profil
    • http://sfemovie.yalir.org/
    • E-mail
Re : Re : Vérification pointeur null.
« Réponse #6 le: Avril 15, 2012, 11:41:44 am »
m_Item[j] = un item
m_Item[ i ][j]* (problème de balise :p )
Want to play movies in your SFML application? Check out sfeMovie!

lezebulon

  • Full Member
  • ***
  • Messages: 235
    • Voir le profil
Re : Vérification pointeur null.
« Réponse #7 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
« Modifié: Avril 15, 2012, 09:11:44 pm par lezebulon »

Bigz

  • Full Member
  • ***
  • Messages: 154
    • Voir le profil
    • Bigz.fr
Re : Vérification pointeur null.
« Réponse #8 le: Avril 16, 2012, 10:00:08 am »
Question con : Tu es sur que c'est bien ce constructeur qui est appelé ?

tintounn

  • Newbie
  • *
  • Messages: 20
    • Voir le profil
Re : Vérification pointeur null.
« Réponse #9 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  ;)

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Vérification pointeur null.
« Réponse #10 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.
Laurent Gomila - SFML developer

tintounn

  • Newbie
  • *
  • Messages: 20
    • Voir le profil
Re : Vérification pointeur null.
« Réponse #11 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


Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Vérification pointeur null.
« Réponse #12 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).
Laurent Gomila - SFML developer

tintounn

  • Newbie
  • *
  • Messages: 20
    • Voir le profil
Re : Vérification pointeur null.
« Réponse #13 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;
}

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Vérification pointeur null.
« Réponse #14 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.
Laurent Gomila - SFML developer