【问题标题】:Getting c++ runtime error when using a vector of SDL_Rect in SDL_blitsurface在 SDL_blitsurface 中使用 SDL_Rect 向量时出现 c++ 运行时错误
【发布时间】:2012-07-03 03:02:09
【问题描述】:

l SDL_BlitSurface(tileSheets.at(sheet), &clip[tile], screen, &tileBox);

工作得很好,我像这样初始化剪辑:

clip[ 0 ].x = x;
clip[ 0 ].y = y;
clip[ 0 ].w = 48;
clip[ 0 ].h = 48;
x += 48;
clip[ 1 ].x = x;
clip[ 1 ].y = y;
clip[ 1 ].w = 48;
clip[ 1 ].h = 48;

然而这根本不起作用

SDL_BlitSurface(tileSheets.at(sheet), &clip.at(tile), screen, &tileBox);

我这样初始化它们:

for(int i = 0; i < number; i++)
    {
        SDL_Rect clipBox = {x,y,48,48};
        clip.push_back(clipBox);
    }

这是我得到的错误:http://imageshack.us/photo/my-images/836/83468944.png/

有什么线索吗?

【问题讨论】:

  • 您似乎对数组进行了过度索引(at() 在索引超出范围时抛出一个 excaption,[] 在同一索引上是未定义的行为)- 确保您的 tile在 0 和 number-1 内(包括边界)

标签: c++ sdl codeblocks block


【解决方案1】:

不知道变量clip的类型,但可能是您将堆栈中的变量推送到向量,因此一旦您退出for循环的范围,它们就会变为无效。

【讨论】:

  • 当您在集合上调用 push_back() 时,它会创建传递对象的副本,因此范围在这里不是问题——即使是这样,[] 也会失败at()
  • 这取决于剪辑的类型。如果是存储引用的向量,则不会创建副本。
  • 这就是我创建它们的方式(不是同时创建):vector clip; SDL_Rect 剪辑[2];
  • 是的,但是[] 也应该失败
  • 谁知道呢?可能是 SDL 库是使用不同的向量选项构建的,并且两者不兼容。我们这里没有足够的信息。我们看不到这个东西是如何被创造出来的,我们不知道sheettile等的值。这只是一个大的猜谜游戏。
【解决方案2】:

尝试以下方法之一:

 /* 1) */  SDL_Rect clipBox(x,y,48,48);
 /* 2) */  clip.push_back(SDL_Rect(x,y,48,48));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-24
    • 1970-01-01
    • 1970-01-01
    • 2014-10-29
    相关资源
    最近更新 更多