【问题标题】:error: ambiguous overload for 'operator/'错误:“操作员/”的重载不明确
【发布时间】:2010-07-26 19:10:15
【问题描述】:

我是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)) ; 
          }
     }
}

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

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

好像是在做赋值重载,我想做的就是除法!

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

谢谢,

泰勒

【问题讨论】:

  • 出色的混淆代码,这是故意的吗? ;-)
  • 你能包含更多的代码吗?例如,h_x 在哪里声明?
  • 你为什么使用 C++ 编译器?
  • 哈哈,是啊....不是我写的,是队友写的,只是想了解一下!
  • @tylerthe miler:我回滚了代码的删除,因为只有两个代码右括号,这个问题完全没有意义。我宁愿不要看到围绕 SO 的无意义的问题。如果出于某种原因您不想显示代码,请将此标记为版主注意。

标签: python c numpy math overloading


【解决方案1】:

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

【讨论】:

  • 这正是问题所在!我该如何解决?是说 h_x 不是 double/int/ect 吗??
  • 我想你是从 python 传递 h_x 的?我不确定你将如何做到这一点,但 C 代码不应该在你从 python 调用的函数中,以 h_x 作为参数(使用类型集)。我没有在任何地方看到 h_x 声明,所以我不知道(像编译器一样)它应该是什么类型。在最坏的情况下,您应该能够像我在(编辑的)答案中建议的那样进行投射。
  • 发现这个关于编译要在 python 中使用的 C 代码模块,也许它会有所帮助:kortis.to/radix/python_ext 我看到他们在那里做了!PyArg_ParseTuple(args, "i", &amp;input) 将输入参数从 python 对象转换为 int (输入是 int 类型,args 是 PythonObject 类型),也许你需要类似的东西。
  • 所以我让它运行(或者至少该分配没有引发错误并且它正在编译)!我现在只是得到一个不同的与 python 相关的错误......如果我在它打印的循环中放置一个 fprint 语句,那么看起来代码正在工作,但这是我使用 pytho/scipy 编译它的方法。 code = """ 我原帖中的所有内容 """ weave.inline(code,['Wijl','q','diff','mx','my','mz','h_x','h_y ','h_z'],type_converters=converters.blitz,compiler='gcc') SystemError: NULL 结果在 PyObject_Call 中没有错误
  • 感谢您的帮助!事实证明,这与任何一个都完全无关,但它们确实需要双打。
【解决方案2】:

如果h_xfloat,那么将1.0(默认为double)除以它会让C 想知道是在浮点数还是双精度数中进行运算。

如果你想在浮动中进行,请将1.0 更改为1.0f;如果是双精度,则声明或将您的 h_x 转换为 double

如果h_xint(这就是我所担心的),您最好将您的h_? 分配给循环外的三个相应的浮点或双临时变量,以保存编译器从(可能)做很多不必要的整数到浮点数的转换。作为副作用,这将使您的类型歧义消失。


您还可以通过去掉那些1.0 来稍微简化代码:您可以简单地将这些表达式除以h_whatever,而不是乘以倒数。尤其是这些行的右半部分已经在做类似的事情。

【讨论】:

  • C 在混合类型的算术运算中并不“奇怪”。语言规范对在这种情况下应该做什么有明确而明确的规则。
  • 你是对的。如果 h_x 的类型是 floatdouble,则预期的操作类型不应该有任何歧义。也许这个问题被 Python 的链接搞糊涂了。
【解决方案3】:

我强烈建议你仔细去掉所有完全多余的括号并仔细检查剩下的内容。

比如这个sn-p:

((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 的两次出现的原始分离让人想知道最初的意图是什么。

【讨论】:

    猜你喜欢
    • 2011-10-17
    • 1970-01-01
    • 2022-12-21
    • 2021-11-02
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-27
    相关资源
    最近更新 更多