Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 双精度到PyFloat的转换不正确_Python_C_Swig - Fatal编程技术网

Python 双精度到PyFloat的转换不正确

Python 双精度到PyFloat的转换不正确,python,c,swig,Python,C,Swig,我正在学习SWIG,用于在Python中使用C。我已经编写了这个函数,但我不明白为什么包装的myfunc返回错误的浮点/双精度值: mfuncs.c #include <stdlib.h> float myfunc(int n) { float result; result = 100 / n; return result; } 最后我得到的是1107558400.0,而不是33.33333 >>> import mfuncs >>> mfuncs.myf

我正在学习SWIG,用于在Python中使用C。我已经编写了这个函数,但我不明白为什么包装的
myfunc
返回错误的浮点/双精度值:

mfuncs.c

#include <stdlib.h>

float myfunc(int n) {
    float result;
    result = 100 / n;
    return result;
}
最后我得到的是1107558400.0,而不是33.33333

>>> import mfuncs >>> mfuncs.myfunc(3) 1107558400.0 >>> >>>导入MFUNC >>>mfuncs.myfunc(3) 1107558400 >>>
错误在哪里?

不需要SWIG类型映射-它是默认提供的,您只需要为“深奥”类型编写类型映射,这里提供的默认
double
/
float
类型就可以了

这里真正的问题是,编译时没有启用警告或忽略警告养成使用“-Wall-Wextra”或编译器要求的任何工具进行编译的习惯是非常值得的,以启用最大警告并注意它们。

SWIG接口只告诉SWIG函数
myfunc
,但该接口中没有任何内容可以让编译器使用声明来编译生成的myfunc\u wrap.c。这意味着,当您编译共享库时,您依赖于
myfunc
的隐式声明。我的机器上带有-Wall的GCC报告如下:

test_wrap.c:3139:3:警告:函数“myfunc”的隐式声明

隐式声明假定它返回
int
。这就是C语言中的规则,如果没有声明,就好像你写了:

#include <stdlib.h>

int myfunc(int n);

int main() {
  printf("%d\n", myfunc(3));   
  return 0;
}
这是因为
%{
%}
之间的代码直接传递给生成的包装器,这使得编译器在构建包装器时知道
myfunc
的真正声明

但在我看来,有一个更好的解决方案:在头文件中只提供一次声明,然后您的接口文件变成:

%module mfuncs
%{
#include "myfunc.h"
%}

%include "myfunc.h"

(显然,
#在myfunc.c中包含“myfunc.h”
)。这样,您只需编写一次声明,如果有不太符合预期的内容,编译器将发出警告/错误,而不是进行(通常是错误的)最佳猜测。

此代码中有两个错误,它们阻止
myfunc(3)
返回您预期的33.3333。柔印极好地解释了包装问题。另一个问题是这条线

    result = 100 / n;
100
是一个int,
n
是一个int,除法的结果将是一个int,然后转换为float。所以
myfunc(3)
==33。 Python2的作用方式与此相同,在Python3中对其进行了更改,使两个int的除法产生一个浮点

把那行改成

    result = 100.0 / n;

或者将
n
设为float/double.

这在我看来不像通常的swig-typemap语法。你为什么要使用类型映射进行转换?swig无论如何都是正确的?@Voo-类型映射是合法的语法-它是一个(不要与多参数类型映射混淆),但你是对的,它是不必要的。@Flexo我对他将其定义为字符串的事实感到困惑,这是以前从未见过的。对我来说似乎没有必要(我喜欢我的自动完成),但允许。顺便说一句,很好。@Alexander,你应该通过他帖子左侧的复选标记将Flexo的答案标记为正确答案。
    result = 100 / n;
    result = 100.0 / n;