2014-01-08 4 views
0

나는 다음과 같은 코드가 있습니다C++ 긴 부호와 <

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 변수 xuStartFrame == x + 1을 충족 할 수 없습니다.

+0

제 코드를 잘못 읽은 것 같아요. 나는 (uStartFrame-iFrameOffset) <1이 아닌 (uStartFrame tmighty

+1

'a - b + 1'이 참일 경우'a - b <1'가 true 인 경우에만 쿼리를 수행합니다. 그것은 기본적인 수학입니다. – Zeta

+0

@zeta : 또는 'iFrameOffset = std :: min (iFrameOffset, uStartFrame - 1); – Jarod42

1

캐스트가 잘못, 당신은 static_cast 바람직하다 귀하의 경우, ++

(int)(uStartFrame - iFrameOffset) < 1 

하지만 C 스타일 캐스트가 정말 C 아니라,이 같은 스타일을 캐스팅해야합니다

static_cast<int>(uStartFrame - iFrameOffset) < 1 
static_cast<unsigned long>(uStartFrame - iFrameOffset) < 1 

그 외에도 int()(x)을 작성할 때 정수를 반환하고 매개 변수를 허용하지 않는 함수를 정의한 다음 uStartFrame - iFrameOffset을 인수로 호출합니다. 그것은 컴파일되지 않아야합니다. 적어도 gcc 4.8은 이에 대해 불평하지 않습니다.

당신의 컴파일러는 분명히 그것을 컴파일하고 아마도 초기화되지 않은 정수, 아마도 0을 반환하는 함수로 잘못 처리 할 수도 있습니다. 그리고 그 이유는 루프가 영원히 계속 실행되는 이유를 설명 할 수 있습니다.

0

테스트 (uStartFrame-iFrameOffset)를 iFrameOffset이 아닌 int로 형변환합니다. 따라서 iFrameOffset이 큰 경우 (최대 값은 2^64-1 또는 시스템에 따라 더 큽니다), 끝까지 도달하려면 2^64 루프가 필요할 수 있습니다.

이것은 기가 초 정도 될 수 있습니다. 따라서이 루프를 재고해야합니다. 그것은 끈적 거리는 생각이 아닙니다.

관련 문제