У меня есть некоторый код для рисования ребер полигонов, который должен рисовать, например, в треугольнике с вершинами 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 () испорчен. Я что-то упустил в этом коде, или я должен более внимательно посмотреть на фактический вектор вершин?
Если вы не уверены, что 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.
...
}
Вам не нужно считать более 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.
Если вектор «вершины» пуст, цикл будет примерно бесконечным. В условии вы используете целочисленную арифметику без знака, поэтому -1 будет 0xFFFFFFF или больше.
Это не будет бесконечный цикл, если все, что вы дали здесь, является правильным. Поэтому лучший ответ — внимательно проверьте остальные части кода.