Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 调用一个函数并从多个函数中获取一个返回值_C++_Visual Studio 2010_Function_Declaration - Fatal编程技术网

C++ 调用一个函数并从多个函数中获取一个返回值

C++ 调用一个函数并从多个函数中获取一个返回值,c++,visual-studio-2010,function,declaration,C++,Visual Studio 2010,Function,Declaration,我有一个函数,它计算一些值的平均值作为输入,输出是两种计算平均值的方法:正态平均值和对数平均值 void average_function(double nb1, double nb2, double &avr1, double &avr2) { .... } 在主程序中:我只想调用第一个返回,我的意思是,avr1,我不想有输出avr2。我认为,如果它是一个指针,您应该将其设置为avr2=NULL,但在这种情况下不应设置为NULL double avr1; average_fu

我有一个函数,它计算一些值的平均值作为输入,输出是两种计算平均值的方法:正态平均值和对数平均值

void average_function(double nb1, double nb2, double &avr1, double &avr2)
{
....
}
在主程序中:我只想调用第一个返回,我的意思是,avr1,我不想有输出avr2。我认为,如果它是一个指针,您应该将其设置为avr2=NULL,但在这种情况下不应设置为NULL

double avr1;
average_function(nb1, nb2, avr1, avr2)

在这种情况下,有没有办法只输出avr1?或者,我将把不同的平均函数分为两个:一个返回avr1,另一个返回avr2(我真的不想这么做)。

您应该将它们分为两个函数。您应该将结果返回给调用者,并带有(令人震惊的?)返回值

double Average(double nb1, double nb2);
double LogarithmicMean(double nb1, double nb2);

您应该将它们分为两个函数。您应该将结果返回给调用者,并带有(令人震惊的?)返回值

double Average(double nb1, double nb2);
double LogarithmicMean(double nb1, double nb2);

我肯定会将其分解为两个函数,并将平均值作为这些函数的返回参数,例如:

double normalAverage(double nb1, double nb2);
double logarithmicMean(double nb1, double nb2);

...

double normalAvg = normalAverage(15.25, 99.12);
double logMean = logarithmicMean(15.25, 99.12);

我肯定会将其分解为两个函数,并将平均值作为这些函数的返回参数,例如:

double normalAverage(double nb1, double nb2);
double logarithmicMean(double nb1, double nb2);

...

double normalAvg = normalAverage(15.25, 99.12);
double logMean = logarithmicMean(15.25, 99.12);

有一些解决方案,但没有一个是特别有益的(事实上,我觉得两者都有问题)。但出于教育目的:

您可以创建一个函数重载函数来丢弃第二个参数

void average_function(double nb1, double nb2, double &avr1, double &avr2)
{
  ....
}

void average_function(double nb1, double nb2, double &avr1)
{
     double dummy;
     average_function(nb1, nb2, avr1, dummy);

}
此外,如果在某处定义了全局双精度值,则可以将其用作默认参数:

static double dummy;

void average_function(double nb1, double nb2, double &avr1, double &avr2= dummy)
{
  ....
}

有一些解决方案,但没有一个是特别有益的(事实上,我觉得两者都有问题)。但出于教育目的:

您可以创建一个函数重载函数来丢弃第二个参数

void average_function(double nb1, double nb2, double &avr1, double &avr2)
{
  ....
}

void average_function(double nb1, double nb2, double &avr1)
{
     double dummy;
     average_function(nb1, nb2, avr1, dummy);

}
此外,如果在某处定义了全局双精度值,则可以将其用作默认参数:

static double dummy;

void average_function(double nb1, double nb2, double &avr1, double &avr2= dummy)
{
  ....
}

将参数作为指针传递,如果它是
nullptr
,则不计算相应的平均值,这是非常常见且绝对正确的


但是,在设计方面,您可能应该将功能分为两个功能。我的回答是基于你说你不想这样做。将其保存在一个函数中的唯一原因是,如果要处理的数据量太大,以致于CPU缓存被吹走,因此只需要遍历一次。

将参数作为指针传递,如果它是
nullptr
,则不计算相应的平均值是非常常见的,而且绝对正确


但是,在设计方面,您可能应该将功能分为两个功能。我的回答是基于你说你不想这样做。将其保存在一个函数中的唯一原因是,如果要处理的数据量太大,以致于CPU缓存被吹走,因此只需要遍历一次。

在函数声明中使用的
&
运算符是引用运算符。这意味着传递到函数中的任何参数都是通过引用传递的,这意味着函数对值所做的任何更改都将在函数结束后保留。(以正常方式通过值传递到函数中的参数将有效地复制到函数中;函数所做的任何更改都不会应用于外部值)。引用不完全是指针,因此不能将其传递为NULL

最好的选择是分离这些功能。最好是让每个函数都做一件“事情”,如果有不同的事情要做,就用不同的方式去做

如果仍然只想使用一个函数,则可以将无效值传递给
&avr2
(例如,如果该值实际上无效,则传递给0),并在函数内传递该值,无论该值是否为0;如果是,则执行不涉及使用
&avr2
的功能操作。如果不是0,请使用
&avr2

void average_function(double nb1, double nb2, double &avr1, double &avr2)
{
    if(avr2==0)
    {
        //non-avr2 option
    } else {
        //avr2 option
    }
}

在函数声明中使用的
&
运算符是引用运算符。这意味着传递到函数中的任何参数都是通过引用传递的,这意味着函数对值所做的任何更改都将在函数结束后保留。(以正常方式通过值传递到函数中的参数将有效地复制到函数中;函数所做的任何更改都不会应用于外部值)。引用不完全是指针,因此不能将其传递为NULL

最好的选择是分离这些功能。最好是让每个函数都做一件“事情”,如果有不同的事情要做,就用不同的方式去做

如果仍然只想使用一个函数,则可以将无效值传递给
&avr2
(例如,如果该值实际上无效,则传递给0),并在函数内传递该值,无论该值是否为0;如果是,则执行不涉及使用
&avr2
的功能操作。如果不是0,请使用
&avr2

void average_function(double nb1, double nb2, double &avr1, double &avr2)
{
    if(avr2==0)
    {
        //non-avr2 option
    } else {
        //avr2 option
    }
}

提供两个功能,每个平均类型一个。这将减少混淆。提供两个函数,每个平均类型一个。这将减少混乱。是的,如果这是1999年,那“绝对没问题”。在这个你永远不知道的世界里:我能通过空值吗?为什么我要传递一个指针,他们会读吗?存储它?写信给它?那个世界已经不复存在了。谢天谢地糟糕的API。如果它是常量,他们只会读取,如果不是,应该记录下来。这个论点也适用于引用。传递指针以指示可选参数本身并不是坏的API设计,唯一不好的是在引用也能完成工作的地方使用指针。如果API在这方面是一致的,指针参数总是被解释为“可能为null”。虽然我很欣赏你的咆哮,但这无助于事情的发展。是的,如果这是1999年的话,那“绝对没问题”。在这个你永远不知道的世界里:我能通过空值吗?为什么我要传递一个指针,他们会读吗?存储它?写信给它?那个世界已经不复存在了。谢天谢地糟糕的API。如果是cons