У меня есть следующий код:
while( int()(uStartFrame - iFrameOffset) < 1)
{
iFrameOffset--;
}
uStartFrame и iFrameOffset имеют длину без знака, поэтому < утверждение немного сложнее, я думаю.
Тем не менее, я думал, что я исправил это с помощью int ().
Но цикл работает бесконечно, поэтому я думаю, что он не работает.
Может кто-нибудь помочь?
Спасибо!
while( uStartFrame < iFrameOffset + 1)
{
iFrameOffset--;
}
Или даже лучше
if(uStartFrame < iFrameOffset + 1)
iFrameOffset = uStartFrame - 1;
Последняя строка также показывает возможную ошибку. Если uStartFrame
является 0
тогда нет unsigned long
переменная x
которые могут выполнить uStartFrame == x + 1
,
Актерский состав неправильный, вы должны сыграть его так,
(int)(uStartFrame - iFrameOffset) < 1
но это приведение в стиле C не совсем стиль C ++, в вашем случае static_cast
предпочтительнее:
static_cast<int>(uStartFrame - iFrameOffset) < 1
static_cast<unsigned long>(uStartFrame - iFrameOffset) < 1
Кроме того, когда вы пишете int()(x)
Вы определяете функцию, которая возвращает целое число и не принимает никаких параметров, а затем вызываете ее с uStartFrame — iFrameOffset в качестве аргумента. Он даже не должен компилироваться, по крайней мере, gcc 4.8 справедливо жалуется на это.
Ваш компилятор, очевидно, компилирует его и, возможно, даже неправильно обрабатывает его как функцию, которая возвращает неинициализированное целое число, скорее всего, 0, и это возможно объясняет, почему ваш цикл работает вечно.
Вы переводите тест (uStartFrame-iFrameOffset) в int, а не в iFrameOffset. Итак, если iFrameOffset большой (max может быть 2 ^ 64-1 — или больше в зависимости от системы), то вам может понадобиться 2 ^ 64 цикла, чтобы добраться до конца.
Это может быть как гига секунд. Итак, вы должны переосмыслить этот цикл. Это не глупая идея.