0

私は怠惰な foo SDL チュートリアルに従ってきましたが、レッスン 2 ですでに障害にぶつかっています。私のコードはまさに彼が望んでいるものですが、次の画像を blit しようとすると常に同じエラーが発生し続けます。

SDLtest.exe の 0x68126030 で未処理の例外: 0xC0000005: アクセス違反の読み取り場所 0x00000004。

このようなエラーを常に生成している次のコードを次に示します。

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

const int SCREEN_WIDTH = 640;
const int SCREEN_HEIGHT = 480;
const int SCREEN_BPP = 32;

SDL_Surface *message = NULL;
SDL_Surface *background = NULL;
SDL_Surface *screen = NULL;

SDL_Surface *load_image(std::string filename)
{
    SDL_Surface* loadedImage = NULL;
    SDL_Surface* optimizedImage = NULL;
    //load the image
    loadedImage = SDL_LoadBMP( filename.c_str() );

    if (loadedImage != NULL)
    {
        optimizedImage = SDL_DisplayFormat(loadedImage);
        SDL_FreeSurface(loadedImage);
    }
    return optimizedImage;
}

void apply_surface(int x, int y, SDL_Surface* source, SDL_Surface* destination)
{
    SDL_Rect offset;

    offset.x = x;
    offset.y = y;
    //blit the surface
    SDL_BlitSurface(source, NULL, destination, &offset);
}

int main(int argc, char* args[])
{
    if (SDL_Init(SDL_INIT_EVERYTHING) == -1)
    {
        return 1;
    }

    screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE);

    if (screen = NULL)
    {
        return 1;
    }

    SDL_WM_SetCaption("Hello World",NULL);
    //loading images
    message = load_image("hello.bmp");
    background = load_image("background.bmp");
    //image blitting
    apply_surface(0,0,background,screen);
    apply_surface(320,0,background,screen);
    apply_surface(0,240,background,screen);
    apply_surface(320,240,background,screen);
    apply_surface(180,140,message,screen);

    if (SDL_Flip(screen) == -1)
    {
        return 1;
    }

    SDL_Delay(2000);

    SDL_FreeSurface(message);
    SDL_FreeSurface(background);

    SDL_Quit();
    return 0;
}
4

2 に答える 2

2

エラーAccess violation reading location 0x00000004は、実際の値ではなく、値が4のポインターを逆参照していることを示しています。

これを追跡する最も簡単な方法は、デバッガーで実行し、問題の原因となっている行を確認することです。次に、バックトラックして、ポインタの値が混乱した場所を特定できます。次に、Bertが指摘したようなエラーが見つかる場合があります。

于 2013-02-15T18:49:19.767 に答える
0

ラインを交換する

if(screen = NULL)

if(screen == NULL)
于 2013-10-14T10:12:04.270 に答える