【问题标题】:C++ Initialized Variable Keeps Printing out as Zero Even though Function is Passed即使传递了函数,C++ 初始化变量仍保持打印为零
【发布时间】:2021-10-22 10:53:36
【问题描述】:

我传递了一个函数来计算数组中所有数字的总和,但它输出为 0,这是我将它初始化为的值。该函数位于与实际程序不同的文件中(我还创建了一个名为 Stats 的类)。当我在函数中显示总和时,它会显示正确的数字。只有当我将它初始化为 0 时才会出错。当我通过函数时,我怎样才能使它在哪里,总数实际上更新到正确的数量而不是零。

const int num = 12;
class Stats
{
private:
    double stats[num];
    double total = 0;
public:
    void setValue(double stats[num], int);
    double calcTotal(double stats[num], double);

};

double Stats::calcTotal(double stats[num], double total)
{
    total = 0;
    for (int i = 0; i < num; i++)
    {
        total += stats[i];
    }
    cout << total;
    return total;
}

int main()
{
    double rainFall[num];
    double total = 0;

    Stats rainStats;

    for (int i = 0; i < num; i++)
    {
        cout << "What was the rain fall for month #" << i + 1 << " ?" << endl;
        cin >> rainFall[i];
        rainStats.setValue(rainFall, num);
    }

    rainStats.calcTotal(rainFall, total);
    cout << total;
    return 0;
}

它在 int main() 中打印出 0,但在 calcTotal 中,它是正确的数量。

【问题讨论】:

  • 显示的代码中有很多部分没有意义或不需要。但问题是 calcTotal 返回 total 但你只是扔掉(忽略)返回的结果。
  • @Someprogrammerdude 你能告诉我什么没有意义,什么是不必要的
  • 没有意义:将total 作为参数传递给calcTotal,而不是将其定义为局部变量。不必要的:整个班级,真的。 calcTotal 可能是非成员函数,并且根本不需要该类。只提两件事。

标签: c++ arrays function object parameter-passing


【解决方案1】:

total 是按值传递的,所以它只是参数的副本,在calcTotal() 中对其进行的任何修改都与传入的原始参数无关(即main() 中的total )。

你可以改成pass-by-reference(这样就不需要返回值了)。

void calcTotal(double stats[num], double&);

或者在main()中使用返回值。

total = rainStats.calcTotal(rainFall, total);

【讨论】:

    【解决方案2】:

    跟进@Someprogrammerdude's comment。您必须将total 的值重新分配给从calcTotal() 返回的值,如下所示:

    total = rainStats.calcTotal(rainFall, total);
    

    【讨论】:

    • 我的大脑今天真的不工作了哈哈哇。
    • 哈哈,我们都有这样的日子。
    • 你也不应该将total作为输入参数,因为该函数不使用旧值
    【解决方案3】:

    这样做是因为你没有给 num 我的朋友任何价值

    【讨论】:

      【解决方案4】:

      您的函数签名令人困惑(尽管语法正确):

      double Stats::calcTotal(double stats[num], double total)
      

      这意味着该函数将接收 num 元素的数组,并且您在循环中使用该 num 作为限制。

      其实就是用全局变量const int num = 12;作为循环限制,和你的声明一样

      double Stats::calcTotal(double stats[], double total)
      

      double Stats::calcTotal(double* stats, double total)
      

      这被称为“指向指针衰减的数组”

      【讨论】:

        猜你喜欢
        • 2014-05-19
        • 2010-12-26
        • 1970-01-01
        • 2023-03-06
        • 1970-01-01
        • 2015-12-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多