0

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

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

在主程序中:我只想调用第一个返回,我的意思是,avr1,我不想输出avr2。我认为如果它是一个指针,你应该把 avr2=NULL 但不是在那种情况下。

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

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

4

5 回答 5

3

您应该将它们分成 2 个函数。而且您应该使用(令人震惊的?)返回值将结果返回给调用者...

double Average(double nb1, double nb2);
double LogarithmicMean(double nb1, double nb2);
于 2013-06-14T13:49:05.613 回答
1

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

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);
于 2013-06-14T13:50:53.073 回答
0

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

您可以制作一个丢弃第二个参数的功能重载函数

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)
{
  ....
}
于 2013-06-14T13:51:21.903 回答
0

nullptr将参数作为指针传递,如果它很常见并且绝对可以,则不计算相应的平均值。

不过,在设计方面,您可能应该将功能拆分为两个功能。我的回应是基于你说你不想这样做。将其保留在一个函数中的唯一原因是,如果要处理的数据量如此之大,以至于它会耗尽 CPU 缓存,因此最好只遍历一次。

于 2013-06-14T13:51:28.793 回答
0

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

最好的选择是将功能分开。最好让每个函数都应该做一件“事情”,如果有不同的事情要做,那就做不同的事情。

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

void average_function(double nb1, double nb2, double &avr1, double &avr2)
{
    if(avr2==0)
    {
        //non-avr2 option
    } else {
        //avr2 option
    }
}
于 2013-06-14T13:55:28.973 回答