【问题标题】:Why can't I update an array of pixels using a for loop?为什么我不能使用 for 循环更新像素数组?
【发布时间】:2019-04-12 13:30:34
【问题描述】:

我正在使用 SFML 中的 Uint8 像素数组,并尝试将它们全部更新为显示为白色/0xFF/255 作为测试,但由于某种原因,使用 for 循环什么也没做,我不知道为什么,逻辑应该是完全合理的。

使用 memset() 将每个字节设置为 0xFF 效果很好,但运行时偶尔会向我抛出 EXC_BAD_ACCESS。将数组中单个像素的每个 RGBA 设置为 0xFF 效果很好,我在屏幕上的正确位置得到一个白点。但是使用for循环将每个像素设置为0xFF什么都没有,没有错误,但没有结果,这是没有意义的。

// Create buffer

sf::Uint8 *buffer = new sf::Uint8[SCREEN_WIDTH*SCREEN_HEIGHT*4];

for(int i; i < SCREEN_WIDTH*SCREEN_HEIGHT*4; i+=4) {
    buffer[i] = 0xFF;
    buffer[i+1] = 0xFF;
    buffer[i+2] = 0xFF;
    buffer[i+3] = 0xFF;
}

从逻辑上讲,这个 for 循环应该可以完美运行,但它没有,当我运行它时,我有一个黑屏,中间散布着一些绿点(来自正在使用的内存位置的垃圾)。如果有人能向我解释为什么会发生这种情况以及如何解决它,我将不胜感激!

【问题讨论】:

  • i的初始值是多少?投票以拼写错误结束
  • 顺便说一句,如果您将所有像素设置为相同的值,则无需手动展开循环

标签: c++ sfml


【解决方案1】:
for(int i; i < SCREEN_WIDTH*SCREEN_HEIGHT*4; i+=4) { 

您从未在此处为i 设置初始值,因此它将具有一些不确定的值,实际上可能大到足以使其永远不会循环。 c 和 c++ 默认不初始化本地原始类型,必须设置一个值。

for(int i = 0; i < SCREEN_WIDTH*SCREEN_HEIGHT*4; i+=4) { 

至于EXC_BAD_ACCESS,你一定是给memset传递了错误的内存地址或大小。也许是另一个未初始化的变量?

在 C/C++ 中,访问对象外部的内存通常无法捕获错误(与许多其他语言不同,它们会检查每个数组访问以给出 IndexOutOfRangeException),它只会覆盖一些随机字节,如果你很幸运,那可能是一个完全无效的内存位置并且操作系统/处理器会引发错误。

【讨论】:

  • 对每个访问“问题”的元素调用不进行范围检查有点倒退:P
  • “限制”?不确定最好的措辞。
  • 哇,我不敢相信我错过了。我对 c++ 很陌生,我才学习了大约 3 个月,但我真的应该看到这一点。非常感谢!
  • 我的意思是,您不必总是进行范围检查,这实际上是一件好事。作为一个人为的例子,我不想检查t 是否在每次迭代的范围内for (int i=0; i&lt;10000000;++i) { some_array[ t ].do_something(i); }
猜你喜欢
  • 2012-10-12
  • 1970-01-01
  • 1970-01-01
  • 2019-10-30
  • 1970-01-01
  • 2019-08-20
  • 1970-01-01
  • 1970-01-01
  • 2012-06-24
相关资源
最近更新 更多