2014-01-08 145 views
0

我有以下代码:C++ unsigned long类型和<

while(int()(uStartFrame - iFrameOffset) < 1) 
{ 
    iFrameOffset--; 
} 

uStartFrame和iFrameOffset都是无符号长,所以<说法是有点困难,我想。 但是,我认为我使用int()修复了它。 但循环运行不确定,所以我想这是行不通的。

有人可以帮忙吗?

谢谢!

+0

你为什么投(应该是(int)这样)他们?由于它们是同一类型,因此无关紧要。 – Araw

+0

此循环打算实现什么? (我猜'iFrameOffset'初始时大于'uStartFrame'?) – jrok

回答

2
while(uStartFrame < iFrameOffset + 1) 
{ 
    iFrameOffset--; 
} 

甚至更​​好

if(uStartFrame < iFrameOffset + 1) 
    iFrameOffset = uStartFrame - 1; 

最后一行也显示出可能的错误。如果uStartFrame0,那么没有unsigned long变量x可以满足uStartFrame == x + 1

+0

我想你误解了我的代码。当且仅当“a tmighty

+1

a-b <1'为真。这是基本的数学。 – Zeta

+0

@zeta:甚至是'iFrameOffset = std :: min(iFrameOffset,uStartFrame - 1);' – Jarod42

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,并且这可能解释了为什么您的循环永远运行。

0

您正在将测试(uStartFrame-iFrameOffset)转换为int,而不是iFrameOffset。所以,如果iFrameOffset很大(最大值可能是2^64-1--或者根据系统而不同),那么你可能需要2^64个循环才能结束。

这可能高达千兆秒。所以,你应该重新思考这个循环。这不是一个好主意。

相关问题