【问题标题】:problem with function call in c++c++中函数调用的问题
【发布时间】:2011-06-15 18:09:25
【问题描述】:

我的程序有问题,我实际上是在使用 Cubic BSplines 进行插值,但是当我在 main() 中调用我的插值函数时,我得到了错误的结果,当我直接在 main() 中编写函数时它可以工作:(。 我看不出两者有什么区别。

void CubicBSpline::interpolation(){
  Point3d point;
  for(unsigned int i = 3; i < (knots->m_points).size(); i++){
    for(double t=0; t<1; t+=0.1){
      point = bSplineCubicUniform(i, t);
      cout << point.x << " " << point.y <<endl;
    }
  }
}

int main(){
  CubicBSpline cbs(4, 4);
  cbs.interpolation(); //this is the call of my function but I got a wrong result

  // and here I write directly my function and that's work good
  Point3d point;
  for(unsigned int i = 3; i < (cbs.knots->m_points).size(); i++){
    for(double t=0; t<1; t+=0.1){
      point = cbs.bSplineCubicUniform(i, t);
      cout << point.x << " " << point.y <<endl;
    }
  }
  return 0;
}

【问题讨论】:

  • “错误结果”是什么意思?
  • 很难在没有看到其余代码的情况下判断...可能是例如未初始化变量的问题。如果在 main 中的显式调用之后移动 cbs.interpolation 调用会发生什么?
  • 顺便说一句,这是一个方法而不是一个函数!
  • @Amokrane:如果你想学究气,那就是成员函数,一种函数。在 C++ 中,没有方法之类的东西。
  • 我找到了错误的根源,它是Point3d,在我的例子中我是这样使用它的:struct Point3d{ double x, y, z};我用 vector 替换了它,这就是工作。但我不知道Point3d有什么问题。

标签: c++ function main


【解决方案1】:

您的描述显然没有提供更多信息(而且您似乎宁愿用磨蚀性的 cmets 来回应,也不愿提供更多信息)所以我只能给您一个一般性的答案。这两种情况之间可能有很多不同之处。首先,大概这两个函数是在不同的文件中定义的,因此根据包含的内容,不同的类型可能会有完全不同的定义。据我所知,您没有任何范围界定问题,但也许我错了。而且由于您没有向我们提供这些其他功能的代码,他们知道它们有什么副作用。

但老实说,我认为您的问题很可能是由于编译器在函数内联时进行的优化。 (尝试不优化编译)。

最后,这里最明显的坏事是你有一个使用双精度数作为迭代器的循环......你在开玩笑吗?谁知道该循环执行了多少次。它完全依赖于编译器的浮点四舍五入,这意味着它不仅是不可预测的,而且即使你很幸运并且它可以在你的机器上运行,谁知道它是否可以在其他机器上运行。

【讨论】:

  • 这里有一个不错的答案,隐藏在分散注意力的负面语气下。
  • 浮点问题的解决方案是使用整数计数器i(在本例中为0到10),然后将i * 0.1传递给函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-07
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多