【问题标题】:Crashes due to no access to SDL functions outside of main function由于无法访问主函数之外的 SDL 函数而导致崩溃
【发布时间】:2014-10-01 07:40:10
【问题描述】:

我一直在尝试提高我的 C++ 技能,并通过使用 SDL 等库探索不同的编程方式。

这个特殊的程序是一个粒子系统,我遵循了 youtube 上的指南,可以在这里找到:http://www.youtube.com/watch?v=6Z5FI5180oo&list=UU6A2B9G_y-fzAXEu2hHPlMg

问题是本指南使用的是 SDL 1.2,而我一直在尝试将此处使用的废弃函数转换为 SDL 2.0。

除了我尝试从 Windowsurface 检索宽度/高度/像素/间距的某些功能外,它基本上可以正常工作。 SDL 1.2 使用函数 GetVideoSurface() 而我相信 SDL2.0 应该使用 GetWindowSurface()。

在我的主函数之外访问此函数时遇到问题,我不确定问题到底是什么。

例如,在我的particle::show() 函数中,我有以下代码:

void particle::show()
{
        Uint8* pixels=(Uint8*)SDL_GetWindowSurface(window)->pixels;
        Uint8* pixel=pixels+(int)y*SDL_GetWindowSurface(window)->pitch+(int)x;
        *pixel=color;
}   

在这里我无法访问这些功能,我没有收到错误消息。即使我尝试使用 SDL_GetError()。程序因分段错误而崩溃,没有其他错误(我可以看到。)

这是我的主要功能:

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

    SDL_Init(SDL_INIT_EVERYTHING);
    SDL_Window *window = SDL_CreateWindow("My Particles",
                         SDL_WINDOWPOS_UNDEFINED,
                         SDL_WINDOWPOS_UNDEFINED,
                         640, 480, SDL_WINDOW_OPENGL);
    bool running = true;
    const int FPS = 30;
    Uint32 start;
    srand(time(0));
    particleEngine ps (100, SDL_GetWindowSurface(window)->w/2, SDL_GetWindowSurface(window)->h/2);
    SDL_Renderer* renderer = SDL_CreateRenderer(window, -1, 0);



    while(running)
    {
        start = SDL_GetTicks();
        SDL_Event event;

        while(SDL_PollEvent(&event))
        {
            switch(event.type)
            {
            case SDL_QUIT:
                running = false;
                break;
            }
        }

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

        ps.refresh();

        SDL_RenderClear(renderer);

        SDL_RenderPresent(renderer);


    }

    SDL_Quit();
    return 0;
}

我已在每个函数之外将我的 SDL_Window *window 定义为全局变量。 我正在运行 SDL 2.0 和 Mac OS X 10.10 Yosemite Beta 2

任何想法我应该如何解决这个问题?

【问题讨论】:

  • 您应该尝试发布一个简短的完整示例。在您发布的代码中,我看到的唯一 SDL_Window* 是 main 的本地变量,它不是全局变量。也许,由于您使用的是particle 成员函数,您应该将指针传递给类的实例并将其缓存在那里。
  • 请注意,SDL 1.2 的 SDL_GetVideoSurface() 没有替代品。在 SDL 2.0 中,您必须传递您在 main() 中创建的 window。另外,您的particle::show() 调用SDL_GetWindowSurface(window) - window 来自哪里?它在哪里创建/初始化?
  • 如上所述,我已将其声明为 SDL_Window *window;然而,这显然不起作用。可能是因为我想我主要重新启动它?我应该尝试将它传递给 ps.refresh 函数吗?像 ps.refresh(window) 一样,然后将其从那里传递给particle::show() 函数?
  • 如果你有一个定义为SDL_Window *window;的全局变量,你必须在某个地方初始化它。也许你在 main() 中的 SDL_Window *window = SDL_CreateWindow(...) 应该只是 window = SDL_CreateWindow(...)

标签: c++ sdl sdl-2


【解决方案1】:

SDL_Window *windowint main(int argc, char** argv) 函数中的局部变量。它在main 之外不可见,除非您将其设为全局变量(不好)或将其设为您创建实例的类的成员。

或者,您可以将指向 SDL_Window 的指针传递给您需要它的函数。

我注意到您说您已将其声明为全局变量,在这种情况下,这就是它编译但不起作用的原因。 particle::show() 中使用的变量将使用全局变量,该变量将指向任何内容(默认情况下,全局变量始终为零初始化)。当您在 main() 中再次声明 SDL_Window 时,这就是分配给创建的窗口的内容。

【讨论】:

  • 全局变量总是零初始化。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-17
相关资源
最近更新 更多