-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 を返します。

4

4 に答える 4

0

ここでは、代わりにif(x % 2 == 0) 戻るつもりでしたか?truefalse

if(x % 2 == 0)
        {
            holder2 = va_arg(arguments, double);
            if(holder1 > holder2)
                order = true;
        }
于 2012-11-29T19:42:09.727 に答える
0

コメントでいくつかの問題が指摘されています(numたとえば、無視されるという事実-その解決策についてはchillの回答を参照してください)が、それらを修正しても問題が解決しない場合は、浮動小数点値を渡していない可能性があります( または のいずれfloatdouble) 関数へのパラメーターとして。

このように関数を呼び出している場合 (num問題が修正されたと仮定):

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

次に、代わりに次のように呼び出してみてください。

bool result = ordered(3, 1.0, 2.0, 3.0);
于 2012-11-29T17:23:32.217 に答える
0

単純なものからやり直す方が簡単な場合もありますが、この場合はそうすると思います。まず、インターフェースを少し単純化します。

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

次に、コードを単純化します。数値を取得します。前よりも小さい場合は、false を返します。それ以外の場合は、previous を current に設定し、次の番号を読み取ります。すべての数字について続けます。ループから抜けた場合 (つまり、順不同の数値を表示せずに最後まで到達した場合) は、true を返します。

于 2012-11-29T17:19:32.570 に答える
0

これに変更して、宣言からva_start(arguments, args);を削除するとnum、誤った数の double を処理し、最後の引数の後にゴミと比較してしまいます。

于 2012-11-29T17:15:08.133 に答える