C ++使用1个函数表示多个变量。只有第一次运行

时间:2014-08-05 20:22:07

标签: c++

对C ++有点兴趣,但一直在研究很多,请耐心等待。

我一直在尝试使用1个函数将8个全局双变量[mA mB ... mG,范围从值1到10]与另一个double值相关联。 我首先通过从csv文件获取数据,将它们抛出到数组然后等同设置的全局变量来获得这8个变量。 这一切都运行良好。我正确地评估了这些值。

mA =10, mB=1 ,.... mG=2

但是我需要使用这些变量来关联另一个设定值。所以我使用:

double Function1(double Mvalue1)
{
    if (Mvalue1 == 1) { double value = 10; return value ; } 
    if (Mvalue1 == 2) { double value = 20; return value ; } 
    .... // cont to 10 only increasing value by 10
    if (Mvalue1 == 10) { double value = 110; return value ; }
}

void VarFunction()
{   
    mA2= Function1(mA); **//SHOULD output 110**
    cout << "Vaule A " << mA2 << endl;

    mB2= Function1(mB); **//SHOULD output 10**
    cout << "Vaule B " << mB2 << endl;
     ....//.... 8 times
    mG2 = Function1(mG); **//SHOULD output 20**
    cout << "Vaule G " << mG2 << endl;
}
int main()
{
   VarFunction()
   return 0;
}

所以我到这里的输出是

Value A 110
Value B -1.#IND
.... 
Value G -1.#IND

为什么下一个变量不能正常工作时,下一次调用function1?

5 个答案:

答案 0 :(得分:1)

在你的代码中,mA设置为12,但Function1没有12个案例。所以,我很惊讶你甚至得到了110打印第一行。您无法处理Function1Mvalue1不是所需值之一的案例,因此这是首先要解决的问题。

此外,将数字分配给double然后返回它是不必要的复杂。假设你真的想要传递整数,case语句会运行良好:

double Function1(int Mvalue1)
{
    switch(Mvalue1) {
        case 1: return 10;
        case 2: return 20;
        //...
        case 10: return 110; // are you sure you don't want 100?
        default: return -1; // handle the case here so that you always return a value.
    }
}

当然,如果你真的只想要输入10倍,为什么不呢:

double Function1(double mValue1)
{
    return mValue1*10;
}

答案 1 :(得分:0)

并非函数中的所有路径都返回一个定义的值,即在所有条件之后都没有return语句。 编译器可能会告诉你。如果不是 - 用更高的警告级别编译。

答案 2 :(得分:0)

在构建此类关系时使用std::map容器。

#include <iostream>
#include <map>

typedef std::map<double, double> rel_t;

int main()
{
    rel_t mymap;
    // You can directly
    // std::map<double, double> mymap;


    mymap[1] = 10;
    mymap[2] = 20;
    mymap[10] = 110;

    std::cout << mymap[1] << std::endl;     // Prints 10
    std::cout << mymap[2] << std::endl;     // Prints 20
    std::cout << mymap[10] << std::endl;    // Prints 110

}

答案 3 :(得分:0)

当我运行它时,这个程序似乎对我有用。但是,我必须在mA2中添加mB2mG2VarFunction()的声明。在VarFunction()中致电main()后,您还错过了分号。

我还建议你在函数double Function(double Mvalue1)中返回一些默认的double,以防Mvalue1不满足任何if语句。

答案 4 :(得分:0)

如上所述,Function1()应该返回一个值,以防所有if语句都为假!

如果您正在处理的数字没有小数位数,请对变量使用shortintlong或任何其他整数类型。然后,您可以使用switch() / case构造,或继续使用比较运算符==

如果您必须处理浮点值,请不要使用==运算符!从文本文件(如CSV)或数据库中读取浮点值时,将完成从文本到float / double的转换。这种转换的结果可以以例如9.999999999或10.000000001而不是10.然后与==的比较为false

要比较两个双变量,请使用如下方法:

bool dEqual( double dVal1, double dVal2, double dTolerance)
{
    if( fabs( dVar1 - dVar2) < dTolerance) {
        // dVar1 is nearly equal to dVar2
        return true;
    }

    // dVar1 is not equal to dVar2
    return false;
}

然后这种比较是正确的:

if( dEqual( 10.0, 9.999999998, 0.000001))

应用符合您所需准确度的公差值。