Насколько я вижу, код будет генерировать бесконечный цикл при вставке последнего свободного индекса в массив.
Предположим, что:
1) im->height
равно 500, поэтомуэтот действительный индекс находится в диапазоне [0 .. 499]
2) Вы уже вставили 499 значений, т.е. *visitedPixelsIndex
равно 499
Так, когда функция вызывается, это условие *visitedPixelsIndex == im->height
будет ложным, поэтому вы не выйдете, а продолжите работу и вставите в массив значение 500.
Затем вы делаете (*visitedPixelsIndex)++;
, так что *visitedPixelsIndex
становится 500.
Послечто вы входите в цикл while
, пытаясь найти новый неиспользованный index
.Однако, поскольку вы уже использовали все 500 допустимых значений индекса, вы никогда не найдете неиспользуемый индекс.
Другими словами - бесконечный цикл
Может быть, вы должны сделать:
(*visitedPixelsIndex)++;
if(*visitedPixelsIndex == im->height) {
perror("Cannot encode anymore: pixels limit reached");
exit(1);
}
Я также думаю, что вы должны сгенерировать новый index
до цикл while
.
Однако в целом я думаю, что ваш код будет более понятным, если вы разделите текущую функцию на две функции.Как
int isPresent(int index, int *visitedPixels, int N)
{
for(int i = 0; i<N; ++i)
{
if (index == visitedPixels[i]) return 1;
}
return 0;
}
int getNewIndex(PPM *im, int index, int *visitedPixels, int *visitedPixelsIndex)
{
visitedPixels[*visitedPixelsIndex] = index;
(*visitedPixelsIndex)++;
if (*visitedPixelsIndex == im->height) {
perror("Cannot encode anymore: pixels limit reached");
exit(1);
}
do
{
index = rand() % im->height;
} while(isPresent(index, visitedPixels, *visitedPixelsIndex));
return index;
}