2012-11-29 74 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循環中的所有內容都返回false,所以沒有其他任何可能? – lifetimes

+2

你試過調試過嗎? –

回答

0

這裏if(x % 2 == 0)你的意思返回true而不是false

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

更改爲此va_start(arguments, args);並從聲明中刪除num,您正在處理不正確的雙打數並最終與最後一個參數後的垃圾進行比較。

+0

1.它是關於計算'args' - 也許它只是1索引; 2.這也有助於; 3.存在'num'明確禁止用一個參數調用該函數 - 可能有用。 –

+0

不知道爲什麼這是倒票。這是一個絕對正確的評論。問題中的代碼從不檢查'num',而是在它後面檢查'args'參數。 –

0

有時候用簡單的東西重新開始會更容易,我認爲在這種情況下我會這樣做。首先,我簡化接口:

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

然後,我會簡化代碼:檢索一個數字。如果它比以前小,則返回false。否則,先設置當前值,然後讀取下一個數字。繼續所有的數字。如果你不在循環中(即,你到達最後而沒有看到一個無序的數字)則返回true。

0

在評論中已經指出了一些問題(num被忽略的事實,例如 - 見冷酷的解決方案的答案),但如果解決這些問題不能解決您的問題,那麼您很可能不傳遞浮點值(floatdouble)作爲函數的參數。

如果調用這樣的函數(假設num問題是固定的):

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

然後嘗試調用它像這樣代替:

bool result = ordered(3, 1.0, 2.0, 3.0);