gpt4 book ai didi

c++ - 为什么我不能使用 for 循环更新像素数组?

转载 作者:行者123 更新时间:2023-11-27 23:40:17 26 4
gpt4 key购买 nike

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

最佳答案

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),并且它将只是覆盖一些随机字节,如果幸运的话,也许这是一个完全无效的内存位置,操作系统/处理器会引发错误。

关于c++ - 为什么我不能使用 for 循环更新像素数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55652800/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com