【问题标题】:Why does this for-loop in my function will only run once, even when it's supposed to run multiple times?为什么我的函数中的这个 for 循环只会运行一次,即使它应该运行多次?
【发布时间】:2017-06-19 11:07:11
【问题描述】:

有人可以向我解释为什么无论 n 是多少,这个 for 循环都只运行一次:

double CalcDist(unsigned int n, Point p, Point* s)
{
    double sd[n];
    for(int i = 0; i < n; i++)
    {
        sd[i] = s[i].Dist_To(p);
        return sd[i];
    }
}

提前感谢您的帮助。

【问题讨论】:

  • n 不是编译时间常数时,double sd[n]; 在 C++ 中是不允许的。您似乎在使用 gcc 扩展。
  • 您预计会发生什么?
  • n 在运行时声明,然后传递给这个函数。我希望循环运行 n 次
  • return sd[i]; 不仅会导致循环中断,还会将函数返回给调用线程。
  • @Raindrop7 如何将值返回到数组中?

标签: c++ arrays class c++11 for-loop


【解决方案1】:

return 提前退出函数,并在 for 循环体中。

此外,在使用i &lt; n 之类的表达式时,在混合unsignedsigned 类型时要非常小心。你知道如果n 为 0 会发生什么吗?

【讨论】:

  • 感谢您的回复。不,我不知道。我使用的是无符号的,因为在我的情况下,n 永远不应该是负数,我想在正方向上扩展范围。我的理解很初步。
  • 我想把这个值返回到一个数组中。如果我不能使用return,而不会提前结束我的循环,我该怎么做呢?
  • 相当于s在调用者中被修改。无需显式返回任何内容。
  • 如果你想返回一个值数组,那么声明函数返回一个指向数据类型的指针;在您的情况下double*,正如您在@Steranoid 的答案中看到的那样。
  • 如果你想保持 s 不变,我宁愿看到 std::vector&lt;double&gt; 作为返回类型。现代编译器都可以使用 NRVO 消除值复制。
【解决方案2】:

如果您的目标是确定一个点与数组中每个点之间的距离,则如下所示:

double * CalcDist(unsigned int n, Point p, Point* pointsArray) {
    double * result = new double[n]; //Iso C++ forbids veriable length array
                                     //so don't use result[i] but this instead
    for (unsigned int i = 0; i < n; i++) { //set i as an unsigned int as n is one
        result[i] = pointsArray[i].Dist_To(p);
    }

    return result;
}

【讨论】:

  • 感谢您的帮助。现在,我如何在这个函数之外访问那个数组?假设我想在别处对数组进行排序。
  • return 为您提供了数组的地址,因此您可以在收到 return 时访问它: double * foo = CalcDist(8, p, array); // 用 foo 做一些事情不要忘记在用 delete[] 结果后删除它;
  • 为了安全起见,您还应该使用 shared_ptr,这样如果您不使用结果和/或忘记删除操作,您就没有任何内存泄漏。
猜你喜欢
  • 1970-01-01
  • 2014-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多