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

在可变参数函数中,浮点参数将被转换为双精度值。尝试

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++,那么这不再是正确的做事方式了。可变参数模板优于可变参数(来自 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;
}

可变参数模板是类型安全的,并且生成更具可读性的无错误代码 imo。

于 2013-05-09T20:49:27.970 回答