1

可変引数をメソッドに適切に渡すのに問題があります。このメソッドは、加重分布内でランダムな値を選択し、選択した結果のインデックスを返すことを目的としています。

使用例は次のとおりです。

int pickupType = randomManager->ByWeights( 3, 0.60f, 0.20f, 0.20f );
switch( pickupType ) {
    // ... pickupType should be 0 to 2, which we can then branch on
}

関数は次のように定義されます。

#include <cstdarg>

int RandomManager::ByWeights( int weightCount, ... ) {

    va_list argList;

    // Get the total of all weights
    va_start( argList, weightCount );
    float weightTotal = 0;
    for ( int i = 0; i < weightCount; i++ ) {
        weightTotal += va_arg( argList, float );
    }
    va_end( argList );

    // Roll a number in that range
    // ... (further processing - problem occurs above)
}

デバッガーで実行すると、 への呼び出しは、渡された値ではなく、va_arg( argList, float )ガベージ値を返します。( 2.0, 1.77499998, -1.08420217e-019 )( 0.60f, 0.20f, 0.20f )

私が間違っていることはありますか?私が知る限り、私は仕様に正確に従っています。http://www.cplusplus.com/reference/cstdarg/を参照として使用しています。

4

3 に答える 3

5

可変引数関数では、float パラメーターは double に変換されます。試す

weightTotal += va_arg( argList, double );
于 2013-05-09T20:48:44.597 に答える
1

問題は、それが通過したときにfloat昇格されますdouble...

あなたのループは

for ( int i = 0; i < weightCount; i++ ) {
    weightTotal += va_arg( argList, double );
}
于 2013-05-09T20:50:50.367 に答える
0

C++ を使用している場合、これは実際には正しい方法ではありません。Variadic テンプレートは、可変引数 (c からのもの) よりも優れています。少し前にクラスで行った可変和のより良い例を次に示します。

#include <iostream>

namespace cs540 {
    template <typename T>
    const T & sum(const T & v) {
        return v;
    }

    template <typename T, typename T2, typename ... Ts>
    T sum(const T & v, const T2 & w, const Ts & ... params) {
        return sum(w+v,params...);
    }
}

int main() {
    using namespace cs540;
    using namespace std;
    cout << sum(1.1,2,3,4,6,8,9,1.1) << endl;
}

Variadic テンプレートはタイプ セーフであり、読みやすいエラーのないコード imo を生成します。

于 2013-05-09T20:49:27.970 に答える