【问题标题】:SDL2 access violation error whilst initializing window初始化窗口时 SDL2 访问冲突错误
【发布时间】:2021-10-18 13:01:09
【问题描述】:

我们刚刚开始学习如何使用 SDL2,在学习教程时遇到了这个访问冲突错误。我们正在尝试初始化一个绿色窗口。我们熟悉 C 和 C#,但我们对 C++ 的经验并不多。

在搞砸的同时,我们确定最后四行之一似乎包含问题。我们希望有人能提供帮助。

在 PWS.exe 中的 0x00007FF801C69BB9 (SDL2.dll) 处引发异常:0xC0000005:访问冲突写入位置 0x00000000000000FF。

#include "SDL.h"
#undef main

int main(int argc, char* argv[])
{

    SDL_Init(SDL_INIT_EVERYTHING);
    SDL_Window* window = SDL_CreateWindow("title", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 600, 400, SDL_WINDOW_SHOWN);
    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0);

    SDL_GetRenderDrawColor(renderer, 0, (uint8_t*)255, 0, (uint8_t*)255);

    SDL_RenderClear(renderer);

    SDL_RenderPresent(renderer);

    SDL_Delay(3000);

    return 0;
}

【问题讨论】:

  • 不确定这是否是您崩溃的原因,但您没有按照 SDL 期望的方式处理 mainwiki.libsdl.org/SDL_SetMainReady
  • 请注意,许多 SDL 调用可能会失败,但您不会检查这些失败案例。有关示例,请参阅SDL_GetError 的文档。
  • 这是#undef main 的一些 SDL 魔法吗?看起来很吓人……
  • @TedLyngmo SDL 执行 #define main 以便它可以预订一些围绕它的东西,但 #undef'ing 这不是规避它的正确方法(有关更多信息,请参阅我评论中的链接)。

标签: c++ sdl-2


【解决方案1】:

您看到的崩溃来自以下行:

SDL_GetRenderDrawColor(renderer, 0, (uint8_t*)255, 0, (uint8_t*)255);

您必须将颜色值强制转换为指针的事实是这里发生问题的直接线索。

SDL_GetRenderDrawColor()(注意 Get)将渲染颜色的当前值写入作为参数传递的地址,因此您要求 SDL 将当前颜色的红色和蓝色分量写入0 内存地址,以及255 内存地址的绿色和 alpha 分量。这些将导致访问冲突,因为0255 不是可写入的有效内存地址。

255 在 64 位十六进制中是 0x00000000000000FF,这恰好是错误告诉您无效写入位置的内容。这就是为什么我可以如此确信这条特定线路是罪魁祸首。

注意SDL 可能会跳过对0 的写入,因为0 意味着没有一个通用的约定。

您可能打算改用SDL_SetRenderDrawColor()

SDL_SetRenderDrawColor(renderer, 0, 255, 0, 255);

但是,您的程序中至少还有一个主要问题:您没有按照 SDL 期望的方式设置 main() 函数。如果你HAVE要绕过SDL接管主要功能,你应该使用SDL_SetMainReady()

【讨论】:

  • 非常感谢您的帮助!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-27
  • 1970-01-01
  • 2018-01-12
  • 1970-01-01
  • 2018-05-10
相关资源
最近更新 更多