错误:'operator /'的模糊重载

时间:2010-07-26 19:10:16

标签: python c numpy math overloading

我是c的新手,以下是让我感到悲伤的一切:

int i,j,ll,k;
double ddim,ddip,ddjm,ddjp,ddlm,ddlp;
for(i=1; i<(mx-1); i++){
for(j=1; j<(my-1); j++){
 for(ll=1; ll<(mz-1); ll++){

 ddim=0.5*k
 ddip=0.5*k
 ddjm=0.5*k
 ddjp=0.5*k
 ddlm=0.5*k
 ddlp=0.5*k

  Wijl(i,j,ll) =  ((1.0/h_x)*(ddip) \
     ((1.0/h_x)*(ddim))   \
     ((1.0/h_y)*(ddjp))   \
     ((1.0/h_y)*(ddjm))   \
     ((1.0/h_z)*(ddlp))   \
     ((1.0/h_z)*(ddlm)) ; 
          }
     }
}

然后我用gcc使用python和scipy编译它,传递它未初始化的所有内容,但我知道问题出在代码的1.0 / h_x部分。如果我使用python / gcc编译基本的c语句就行了,所以我没有python / gcc问题。

我得到的错误是:“错误:'运营商/'在'1.0e + 0 / h_x'中的模糊重载

似乎它正在尝试进行分配重载,而我想做的就是分裂!

任何帮助将不胜感激! :)

谢谢,

泰勒

3 个答案:

答案 0 :(得分:1)

我认为它试图说不清楚h_x是什么类型,所以它不知道使用哪个重载/运算符(double / int,double / double等)。你可以尝试将它(h_x)转换为int或double来告诉它使用什么版本。

答案 1 :(得分:0)

如果h_xfloat,则将1.0(默认为double)除以它会让C想知道是以浮点运算还是双数学运算。

如果您想在花车中执行此操作,请将1.0更改为1.0f;如果加倍,请将h_x声明或投射到double

如果h_xint(这就是我害怕的话)你可能会把你的h_?分配到三个相应的浮点或双倍温度变量之外循环,以保存编译器(可能)执行大量不必要的int-to-float转换。作为副作用,这会使你的类型歧义消失。


您还可以通过删除那些1.0来简化代码:您可以简单地将这些表达式除以h_whatever,而不是乘以倒数。特别是因为每条线的右半部分已经做了类似的事情。

答案 2 :(得分:0)

我强烈建议你仔细查看所有完全冗余的括号,仔细检查剩下的内容。

例如,此代码段:

((1.0/h_x)*(ddim)*((q(i,j,ll) - q(i-1,j,ll)))/h_x)

归结为:

ddim * (q(i,j,ll) - q(i-1,j,ll)) / h_x / h_x

请注意,/ h_x两次出现的原始分离让人不知道原意是什么。