c++使用一个函数表示多个变量.只有第一次运行有效

C++ using 1 function for multiple varaibles. Only first run works

本文关键字:变量 有效 运行 第一次 表示 函数 一个 c++      更新时间:2023-10-16

c++新手,但研究了很多,所以请原谅我。

我一直在尝试使用一个函数来关联8个全局双变量[mA mB…]mG,取值范围为1 ~ 10],到另一个双精度值。我首先通过从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与下一个变量不工作?

在您的代码中,您将mA设置为12,但Function1没有12的情况。所以,我很惊讶你居然第一行就打印了110。您没有处理Function1内部的情况,其中Mvalue1不是所需值之一,因此这是要修复的第一件事。

同样,将一个数字赋值给双精度类型,然后返回它也不必要地复杂。如果您真的想传递整数,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;
}

不是函数中的所有路径都返回定义值,即在所有条件之后没有return语句。编译器可能会告诉你。

在构建这样的关系时使用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
}

当我运行它时,这个程序似乎正在为我工作。但是,我不得不在VarFunction()中添加mA2, mB2mG2的声明。在main()中调用VarFunction()之后,您还缺少分号。

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

如前所述,在所有if语句为假的情况下,Function1()应该返回一个值!

如果你正在处理的数字没有小数,使用short, int, long或任何其他整数类型的变量。然后可以使用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))

应用满足所需精度的公差值