0xC0000005: место чтения нарушения прав доступа для целого числа? - PullRequest
2 голосов
/ 28 мая 2011

Кажется, что обычно люди получают эти ошибки при работе с указателями, массивами, структурами и т. Д. Я получаю их для каждого целого числа в классе, что меня смущает. Я уверен, что я просто упускаю некоторые мелкие технические детали (я немного новичок в этом).

Точная ошибка:

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.

Код разбивается на первую строку в этом методе класса:

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);
}  

Вот конструктор Grid:

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; 
}

И заголовочный файл:

#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

Если посмотреть на локальный вид текущего экземпляра Grid totalW, totalH, offX, offY, все показывают ошибку CXX0030, но два массива в порядке. Что именно здесь происходит?

EDIT:

Определение указателя сетки хранится в отдельном небольшом пространстве имен, которое служит чем-то вроде статического класса:

namespace Engine
{       
static Grid * grid;
static Player * player;
}

На самом деле он создается здесь в основном файле cpp:

//Initialize engine
Engine::grid = new Grid();
Engine::player = new Player(160,240);

Вот отрывок, где он вызывается, в другом классе с именем Player

    if (y>392 && y<480 && x>75 && x<152)
    {
        printf("Right");
        Engine::grid->Move(20,0);
    }

Редактировать 2:

Извините, я забыл удалить ключевое слово "static" из объявления сетки в движке. Я считаю, что именно это и стало причиной проблемы.

Ответы [ 2 ]

10 голосов
/ 28 мая 2011

Согласно сообщению об ошибке, ваш код пытается получить доступ к адресу 0x00000008, который очень близок к 0. Это означает, что у вас где-то есть нулевой указатель типа Grid *, и вы вызываете функцию на нем.

Вы должны либо убедиться, что указатель не равен нулю, либо проверить его.Например:

Grid * grid = ...;
if (grid == NULL){ return; }
grid->move(0,1);

Обратите внимание, что NULL совпадает с 0.

3 голосов
/ 28 мая 2011

Какова ценность этого? Вы пытаетесь разыменовать нулевой указатель на экземпляр Grid?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...