Почему этот цикл бесконечен?

У меня есть некоторый код для рисования ребер полигонов, который должен рисовать, например, в треугольнике с вершинами 0, 1 и 2, ребрами (0, 1), (1, 2) и (2, 0). Я думал, что смогу сделать это так:

for(size_t j = 0, k = 1; j <= vertices.size()-1; j++, k++){
if(j == vertices.size()-1){k = 0;} //For j to k final edge
...
//draw edges, etc.
...
}

…Но это заставляет значение k взрываться в бесконечный цикл. Я просмотрел это и подозреваю, что проблема может заключаться в моем индексировании здесь, но если все зависит от j, я бы подумал, что возможно vertices.size () испорчен. Я что-то упустил в этом коде, или я должен более внимательно посмотреть на фактический вектор вершин?

0

Решение

Если вы не уверены, что vertices имеет как минимум одну запись вычитания vertices.size()-1 может привести к недостаточному (т.е. очень большое значение из вычитания size_t(0)-1) и ваш цикл может работать намного дольше, чем вы хотите.

Более идиоматическим решением будет цикл

for (size_t j = 0, k = 1; j < vertices.size(); j++, k++) {
if ( j == vertices.size()-1) { //works, vertices has at least one entry
k = 0;
}
...
//draw edges, etc.
...
}
2

Другие решения

Вам не нужно считать более k:

size_t const count = vertrices.size()
for(size_t j = 0; j < count; j++) {
size_t k = (j + 1) % count;
// draw
}

Сюда k является j+1 кроме случаев, когда j является максимальным, в этом случае это 0.

6

Если вектор «вершины» пуст, цикл будет примерно бесконечным. В условии вы используете целочисленную арифметику без знака, поэтому -1 будет 0xFFFFFFF или больше.

2

Это не будет бесконечный цикл, если все, что вы дали здесь, является правильным. Поэтому лучший ответ — внимательно проверьте остальные части кода.

0
По вопросам рекламы [email protected]