我的程序有问题,我实际上在使用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;
}
答案 0 :(得分:3)
你的描述显然没有信息(似乎你更愿意回应磨练性评论而不是提供更多信息),所以我能给你的是一般答案。这两种情况之间可能有很多不同之处。首先,可能这两个函数是在不同的文件中定义的,因此根据所包含的内容,不同的类型可能具有完全不同的定义。从我可以看到你没有任何范围问题,但也许我错了。此外,由于您没有向我们提供其他功能的代码,这些功能知道他们有什么副作用。
但老实说,我认为您的问题很可能是由于编译器在内联函数时进行的优化。 (尝试编译而不进行优化)。
最后,最明显的坏处是你有一个使用double作为迭代器的循环......你在开玩笑吗?谁知道循环执行了多少次。它完全取决于编译器的浮点数舍入,这意味着它不仅不可预测,而且即使你运气好并且它在你的机器上运行,谁知道它是否适用于其他机器。