Почему я не могу обновить массив пикселей, используя цикл for? - PullRequest
0 голосов
/ 12 апреля 2019

Я работаю с массивом пикселей Uint8 в SFML и пытаюсь обновить их все, чтобы они стали белыми / 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;
}

Логически это для цикла должно работать идеально, но это не так, когда яЗапустите это, у меня есть черный экран с зелеными точками, разбросанными по середине (мусор из используемых мест памяти).Если кто-нибудь может объяснить мне, почему это происходит и как это исправить, я был бы очень признателен!

1 Ответ

2 голосов
/ 12 апреля 2019
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),и он просто перезапишет несколько случайных байтов, и, возможно, если вам повезет, это абсолютно неверное расположение в памяти, а ОС / процессор выдаст ошибку.

...