【问题标题】:SDL Access violation writing location 0x02a251c8SDL 访问冲突写入位置 0x02a251c8
【发布时间】:2023-12-28 13:38:02
【问题描述】:

我已经阅读了我能找到的所有访问冲突写入位置问题,也许我遗漏了一些东西,但我似乎遇到了不同的错误。我已经初始化了所有指针(据我所知)。

void putpixel( SDL_Surface* surface, int x, int y, Uint32 pixel )
{
    int k = GetWidth(surface);
    //Convert the pixels to 32 bit
    Uint32 *pixels = (Uint32 *)surface->pixels;

   //Set the pixel
    pixels[ ( y * surface->w ) + x ] = pixel; //This is the line the debugger points to.
}

程序显示 Mandelbrot 集。这是我用来访问像素数据的函数。当我第一次编写程序时,它都在 int main() 中,并且使用这个函数可以正常工作。我打算把它写成一个使用 SDL 和指针的练习,所以我把它拆开,让 Mandelbrot 成为它自己的类来学习一点关于 OOP 的知识。只有当我把它分开时,我才开始遇到这些问题。我有什么明显的遗漏吗?我很乐意发布其余的代码,我只是不想用不相关的代码淹没你们。当我追溯问题时,它指向实际代码中用于绘制集合的 putpixel 函数,这是有道理的。问题可能源于那里吗?

编辑:从头开始。我做了一些错误处理,我肯定正确地锁定了表面。

【问题讨论】:

    标签: location sdl access-violation


    【解决方案1】:

    关心直接操作数据,取决于表面的类型,你需要SDL_LockSurface/SDL_UnlockSurface。

    如果您的访问位置错误没有改变任何内容,请检查/打印 ysurface->wx 的值

    【讨论】:

    • 查看我的编辑。我认为我正确地锁定了表面,但我觉得我犯了一个愚蠢的错误。
    【解决方案2】:

    问题解决了。我是个彻头彻尾的白痴。我收到此错误的原因是因为我超出了像素数组的范围。问题来自我如何定义设置集合参数的函数。我将高度设置为宽度,将宽度设置为高度。我知道这是显而易见的。让这对像我这样的其他新手程序员来说是一个教训。如果你遇到这样一个奇怪的神秘错误,请检查简单的东西。像这样的疏忽可能会花费您很多时间。

    【讨论】: