0
Sprite1 *test = new Sprite1(450, 450, "enemy.bmp", *screen);
    test->DrawJon();
    SDL_Delay(1000);
    test->MoveJon(20,20);

2行目でランタイムエラーが発生しています。0x0でアクセス違反と表示されます

Sprite1は私が定義したクラスであり、そのクラスにはDrawJon()とMoneJon()があります。この構文はコンパイラーでは問題ありませんが、実行時に失敗します。

Sprite1.cpp

#include "Sprite1.h"

Sprite1::Sprite1(int posX, int posY, std::string imagePath, SDL_Surface screen) :     PosX(posX), PosY(posY), ImagePath(imagePath), Screen(screen)
{
void DrawSprite1Jon( int x, int y, SDL_Surface *sprite, SDL_Surface *screen );
void DrawJon();
void MoveJon(int xDist, int yDist);
}

void Sprite1::DrawSprite1Jon( int x, int y, SDL_Surface *sprite, SDL_Surface *screen )
{
//Make a temporary rectangle to hold the offsets
SDL_Rect offset;

//Give the offsets to the rectangle
offset.x = x;
offset.y = y;

//Blit the surface
SDL_BlitSurface( sprite, NULL, screen, &offset );

SDL_UpdateRect(screen, 0, 0, 0, 0);
}

void Sprite1::DrawJon()
{
#pragma region Char to String Conversion

string ImagePath;
char * writable = new char[ImagePath.size() + 1];
copy(ImagePath.begin(), ImagePath.end(), writable);
writable[ImagePath.size()] = '\0';

#pragma endregion

temp = SDL_LoadBMP(writable);
sprite = SDL_DisplayFormat(temp);
SDL_FreeSurface(temp);

// free the string after using it
delete[] writable;

DrawSprite1Jon(PosX, PosY, sprite, screen);
}

Sprite1.h

#include <string>
#include <SDL.h>
#include "Functions.h"

using namespace std;

class Sprite1
{
private:
    int PosX;
    int PosY;
    int xDist;
    int yDist;
    string ImagePath;
    SDL_Surface Screen;
    SDL_Surface *temp, *sprite, *screen;

public:
    Sprite1(int PosX, int PosY, string ImagePath, SDL_Surface Screen );
    void DrawSprite1Jon( int x, int y, SDL_Surface *sprite, SDL_Surface *screen);
    void DrawJon();
    void MoveJon(int xDist, int yDist);
};

編集:

さらに調査すると、この行です

DrawSprite1Jon(PosX, PosY, sprite, screen);

それはDrawJon()で失敗しています

4

3 に答える 3

1

少なくともあなたのコードのこの部分は壊れています:

string ImagePath;
char * writable = new char[ImagePath.size() + 1];
copy(ImagePath.begin(), ImagePath.end(), writable);
writable[ImagePath.size()] = '\0';

クラスメンバー変数を使用せずに、ローカルImagePath変数を作成しています。ローカル変数はメンバー変数をシャドウします。ローカル変数を削除します(上記のスニペットの最初の行)。

また、おそらく(私はSDLにあまり詳しくありませんが)次のようにロードを行うことができます。

temp = SDL_LoadBMP(ImagePath.c_str());

次に、推測するだけですが、画像の読み込みが失敗する可能性があり、その関数はNULLポインタを返します。したがって、戻り値を確認してからエラーを確認してください(呼び出すことができるSDLエラー関数があるか、標準のerrnoグローバル変数を確認する必要があります。

さらなる提案:コンパイラの警告をオンにし(gccの場合:-W -Wall)、理解することを学び(警告をgoogleにコピーすることは良いスタートです)、警告を修正します。ほとんどの場合、これらは実際のバグであり(したがって、警告です!)、そうでない場合でも、警告を修正するとコードが改善されます。

于 2012-12-16T13:49:06.757 に答える
0

あなたはC++でプログラミングを始めたばかりで、おそらくjavascriptのバックグラウンドを持っているので、コンストラクターに関数宣言を入れようとしました。ここでは間違った考えです。(#pragmaは通常、明確な意味を持っています。ここでも誤用します。例を参照してください。#pragma GCC poison

このコードには多くの混乱が見られます。

このコードを先に進める前に、質の高い初心者向けC++の本を入手することをお勧めします。この時点で、このコードから妥当なものを打ち出そうとする理由はわかりません。

于 2012-12-16T13:34:12.813 に答える
0

実装にいくつか問題がありましたが、最終的にはデバッグモードではなくリリースモードでビルドする必要がありました。

于 2012-12-17T12:47:37.607 に答える