gpt4 book ai didi

c++ - 使用 C++/SDL2 加载图像 - "unhandled exception", "access violation reading location"

转载 作者:行者123 更新时间:2023-11-28 02:26:19 25 4
gpt4 key购买 nike

我正在研究其他人针对早期版本的 SDL 的 Pong 代码,并试图让它与 SDL2 一起运行。下面是我的代码的摘录,它只加载图像。运行这段代码时,我会弹出一个窗口告诉我:The Pong.exe 中 0x00A065AD 处的未处理异常:0xC0000005:访问冲突读取位置 0x00000004。在调试时,它还指向这一行:

optimizedImage = SDL_ConvertSurface(loadedImage, windowSurface->format, 0);

错误列表显示警告 LNK4098:defaultlib 'msvcrt.lib' 与其他库的使用冲突;使用/NODEFAULTLIB:library

我不确定如何理解这一切。最重要的是,SDL 窗口会显示、卡住,有时甚至在调试结束后也不会关闭。 (当我尝试时它告诉我存在访问冲突。)

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

const int WINDOW_WIDTH = 640;
const int WINDOW_HEIGHT = 475;
const int SCREEN_BPP = 2;

SDL_Window *window = NULL;
SDL_Surface *windowSurface = NULL;
SDL_Surface *ball = NULL;
SDL_Surface *background = NULL;
SDL_Surface *paddleL = NULL;
SDL_Surface *paddleR = NULL;

SDL_Event event;

SDL_Surface *loadImage(std::string fileName)
{
SDL_Surface *loadedImage = NULL;
SDL_Surface *optimizedImage = NULL;

loadedImage = SDL_LoadBMP(fileName.c_str());

if (loadedImage != NULL)
{
optimizedImage = SDL_ConvertSurface(loadedImage, windowSurface->format, 0);

SDL_FreeSurface(loadedImage);

if (optimizedImage != NULL)
{
SDL_SetColorKey(optimizedImage, SDL_TRUE,
SDL_MapRGB(optimizedImage->format, 255, 255, 255));
}
}

return optimizedImage;
}

bool init()
{
if (SDL_Init(SDL_INIT_EVERYTHING) == -1)
return false;

window = SDL_CreateWindow("Pong", SDL_WINDOWPOS_CENTERED,
SDL_WINDOWPOS_CENTERED, WINDOW_WIDTH,
WINDOW_HEIGHT, SDL_WINDOW_SHOWN);

if (window == NULL)
return false;

return true;
}

bool loadFiles()
{
ball = loadImage("ball.bmp");
background = loadImage("background.bmp");
paddleL = loadImage("paddleRed.bmp");
paddleR = loadImage("paddleBlue.bmp");

if (ball == NULL)
return false;

if (background == NULL)
return false;

if (paddleL == NULL || paddleR == NULL)
return false;

return true;
}

int main(int argc, char* args[])
{
windowSurface = SDL_GetWindowSurface(window);

if (init() == false)
return 1;
if (loadFiles() == false)
return 1;

SDL_FreeSurface(windowSurface);
SDL_FreeSurface(ball);
SDL_FreeSurface(background);
SDL_FreeSurface(paddleL);
SDL_FreeSurface(paddleR);
windowSurface = ball = background = paddleL = paddleR = nullptr;
SDL_DestroyWindow(window);
window = nullptr;

SDL_Quit();
return 0;
}

最佳答案

你在打电话

windowSurface = SDL_GetWindowSurface(window);

之前

window = SDL_CreateWindow("Pong", SDL_WINDOWPOS_CENTERED,

所以window还是会为NULL,导致windowSurface为NULL,导致windowSurface->format导致崩溃。

关于c++ - 使用 C++/SDL2 加载图像 - "unhandled exception", "access violation reading location",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30518631/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com