29

私が取り組んでいるスペース インベーダー ゲームで非常に奇妙な問題が発生しています。基本的に、アクセス違反エラーが発生します。

SpaceInvaders.exe の 0x5edad442 (msvcr100d.dll) で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0x00000000。

以下のコードを含めると。Visual Studio では、デバッグ時に "strcmp.asm" に移動します。私のコードでは strcmp() を使用していないことに注意してください。コードに何か問題がありますか、それとも私が含めた範囲を超えた問題ですか? 助けてくれてありがとう

const char* invarray[] = {"invader0.png", "invader1.png", "invader2.png", "invader3.png", "invader4.png"}; 
int i=0;
//Creates 55 invaders
for (int y=0; y<250; y+=50){
    for (int x=0; x<550;x+=50){
        Invader inv(invarray[y/50], x+50, y+550, 15, 15, 1, false, 250);
        invaders[i] = inv;
    }
}

インベーダー コンストラクター:

Invader::Invader(const char *pic, int x, int y, int w, int h, bool dir, bool des, int point) : MovingObject(pic, x, y, w, h) , direction(dir), destroyed(des), b(0), points(point){};

MovingObject コンストラクター

MovingObject::MovingObject(const char *pic, int x, int y, int w, int h):picture(pic), positionX(x), positionY(y), width(w), height(h) {};
4

3 に答える 3

36

アクセス違反の読み取り場所 0x00000000」は、初期化されていないためガベージ値を持つポインターを逆参照していることを意味します。これらのガベージ値は何でもかまいませんが、通常はたまたまそうであるため、オペレーティングシステムが検出して実行できないように0、メモリアドレスから読み取ろうとします。0x0

invaders[]配列が本来あるべきものであることを確認してください。

また、これまで更新していないようです。iつまり、ループの繰り返しごとに同じInvaderオブジェクトを場所0に配置し続けています。invaders[]

于 2012-05-07T08:35:22.750 に答える
18

この行は疑わしいようです:

invaders[i] = inv;

をインクリメントすることはないiので、 に割り当て続けますinvaders[0]。これがコードを例に縮小するときに犯した単なるエラーである場合iは、実際のコードで計算する方法を確認してください。のサイズを超えている可能性がありますinvaders

コメントが示唆するように、 55 を作成している場合は、この番号を処理するために正しく初期化されているinvadersことを確認してください。invaders

于 2012-05-07T08:37:52.587 に答える