2012-11-29 6 views
-1
bool ordered(int args, double num, ...) 
{ 
    bool order = true; 
    double holder1, holder2; 
    va_list arguments; 
    va_start(arguments, num); 
    holder1 = va_arg(arguments, double); 
    for(int x = 2; x < args + 1; x++) 
    { 
     if(x % 2 == 0) 
     { 
      holder2 = va_arg(arguments, double); 
      if(holder1 > holder2) 
       order = false; 
     } 
     else if(x % 2 != 0) 
     { 
      holder1 = va_arg(arguments, double); 
      if(holder2 > holder1) 
       order = false; 
     } 
    } 
    va_end(arguments); 
    return order; 
} 

이 함수는 숫자가 오름차순으로 입력되었지만 함수를 전달한 것과 상관없이 false를 반환하는지 확인하려고합니다.다음 함수가 항상 false를 반환하는 이유를 알아낼 수 있습니까?

+1

무엇이'holder2 = va_arg (arguments, double); '입니까? –

+1

for-loop 안의 모든 것이 false를 반환하기 때문에 어쩌면 다른 것의 가능성이 없기 때문일 수 있습니까? – lifetimes

+2

디버깅을 시도 했습니까? –

답변

0

당신이 반환을 의미 않았다 대신 true?

if(x % 2 == 0) 
     { 
      holder2 = va_arg(arguments, double); 
      if(holder1 > holder2) 
       order = true; 
     } 
0

로 변경하고 선언에서 num을 제거하면 올바르지 않은 수의 복식을 처리하고 마지막 arg 이후 가비지와 비교하게됩니다.

+0

1. args를 계산하는 것입니다. 2. 어느 쪽도 도움이 될 것입니다. 3. num이 있으면이 함수를 하나의 매개 변수로 호출하는 것을 명시 적으로 금지합니다. 아마도 유용 할 수 있습니다. –

+0

이것이 왜 투표 취소되었는지 확실하지 않습니다. 그것은 절대적으로 올바른 발언입니다. 질문에있는 코드는 결코'num'을 검사하지 않고 대신에'args' 매개 변수를 검사합니다. –

0

가끔은 더 간단한 것으로 시작하는 것이 더 쉬울 때가 있습니다.이 경우 내가하는 일이라고 생각합니다. 먼저 인터페이스를 약간 단순화합니다.

bool ordered(int args, ...) { // ... 

그런 다음 코드를 단순화합니다. 번호를 검색합니다. 이전보다 작 으면 false를 반환합니다. 그렇지 않으면, 이전에 현재로 설정하고 다음 번호를 읽으십시오. 모든 숫자를 계속하십시오. 루프에서 벗어난 경우 (즉, 순서가 잘못된 번호를 보지 않고 끝까지 도달 한 경우) true를 반환합니다.

0

몇 가지 문제가 의견에서 지적되었습니다 (예 : num이 무시 됨) - 해결 방법은 해결 방법은 냉기의 답변을 참조하십시오. 문제가 해결되지 않으면 문제가 해결 될 가능성이 큽니다. 부동 소수점 값 (float 또는 double)을 함수의 매개 변수로 전달하지 않습니다.

이 같은 함수를 호출하는 경우합니다 (num 문제를 가정은 고정) :

bool result = ordered(3, 1, 2, 3); 

다음이 대신처럼 호출 시도 :

여기 if(x % 2 == 0)
bool result = ordered(3, 1.0, 2.0, 3.0); 
관련 문제