0xC0000005: violation d'Accès au lieu de lecture d'un nombre Entier?
Il semble que, normalement, les gens reçoivent ces erreurs lorsque l'on travaille avec des pointeurs de tableau, les structures, etc. Je suis arriver sur tout entier dans une classe, ce qui me confond. Je suis sûr que je suis juste en manque quelques petits détails techniques (je suis un peu nouveau pour cette).
L'erreur exacte est:
First-chance exception at 0x003e6616 in Mine.exe: 0xC0000005:
Access violation reading location 0x00000008.
Unhandled exception at 0x003e6616 in Mine.exe: 0xC0000005:
Access violation reading location 0x00000008.
Le code s'arrête à la première ligne de cette méthode de classe:
void Grid::Move(int x, int y)
{
this->offX+=x;
this->offY+=y;
for (int i=0;i<2;i++)
for (int k=0;k<2;k++)
BitmapSetxy(chunks[i][k]->map,this->offX,this->offY);
}
Ici est le constructeur de la Grille:
Grid::Grid()
{
totalW =320*2;
totalH = 320*2;
offX = 0;
offY = 0;
//Fill the chunks array with Maps to be used
for (int i=0;i<2;i++)
for (int k=0;k<2;k++)
chunks[i][k] = new Map(i*320,k*320);
//Everything starts as dirt
for (int x=0;x<(320*2)/20;x++)
for (int y=0;y<(320*2)/20;y++)
blocks[x][y] = bType::Dirt;
}
Et le fichier d'en-tête:
#ifndef MapDef
#define MapDef
#include "Map.h"
class Grid
{
private:
int totalW, totalH;
int offX, offY;
public:
enum bType
{
Blank,
Dirt,
Copper
};
Map * chunks[2][2];
bType blocks[32][48];
void RemoveBlock(int x, int y);
bType GetBlockAt(int x, int y);
int GetAbsolutePosition20(int);
int GetMapIndex(int);
int GetChunkRelative(int,int);
bType GetBlockBelow(int x, int y);
bType GetBlockAbove(int x, int y);
bType GetBlockSide(int x, int y, bool isRight);
void Move(int x, int y);
Grid();
};
#endif
Lorsque l'on regarde les locaux de vue de l'instance courante de la Grille totalW, totalH, offX,offY tous le CXX0030 d'erreur, mais les deux tableaux sont parfaitement bien. Ce qui se passe exactement ici?
EDIT:
La définition de la grille pointeur est stocké dans un autre peu d'espace de noms qui constitue en quelque sorte une classe statique:
namespace Engine
{
static Grid * grid;
static Player * player;
}
Il est effectivement créés ici dans le fichier principal rpc:
//Initialize engine
Engine::grid = new Grid();
Engine::player = new Player(160,240);
Voici l'extrait où il est appelé, dans une autre classe appelée Joueur
if (y>392 && y<480 && x>75 && x<152)
{
printf("Right");
Engine::grid->Move(20,0);
}
Edit 2:
Je suis désolé, j'ai oublié de supprimer le mot-clé "statique à partir de la grille de déclaration dans le moteur. Je crois que c'était ce qui était à l'origine du problème.
par ailleurs, il est 0x00000008 parce que, entre le début de la classe et offX il y a 2 ints. Si quelqu'un me demandais...
Il semble sûrement comme si vous avez un pointeur null pour
this
; l'accès à 0x00000008 est correct pour l'ajout de 8 octets à 0 pour lire la valeur actuelle de this->offX
avant d'en rajouter.Si vous avez résolu le problème?
Je suis à obtenir des objets déjà définis problèmes, mais le problème initial est résolu. merci
OriginalL'auteur Fuller | 2011-05-28
Vous devez vous connecter pour publier un commentaire.
Selon le message d'erreur, votre code est en train d'essayer d'accéder à l'adresse 0x00000008, qui est très proche de 0. Cela signifie que vous avez probablement un pointeur null de type
Grid *
quelque part et que vous appelez une fonction sur elle.Vous devez vous assurer que le pointeur n'est pas null, ou de l'archiver. Par exemple:
Noter que
NULL
est le même que 0.comment identifier nullpointer déréférencement rapidement? Est-il en voyant si l'adresse est proche de 0, et si c'est le cas, pourquoi est-ce que le travail?
Si vous voyez que votre programme est en train d'essayer d'accéder à une adresse très proche de 0, comme 0x8, alors vous avez probablement un pointeur null. Dans ce cas, 8 est probablement le décalage que le compilateur choisi pour la offX membre de la classe de la Grille. Ainsi, lorsque le compilateur veut accéder à la offX membre d'un null
Grid *
pointeur, qu'il allait essayer d'accéder à l'adresse 0x8.OriginalL'auteur David Grayson
Quelle est la valeur de "ceci"? Êtes-vous essayer de déréférencer un pointeur null à une instance de la Grille?
OriginalL'auteur MRAB