Python C和C类型计算的奇怪行为
我有一个C扩展,它通过ctypes在python中调用。 C代码如下所示:Python C和C类型计算的奇怪行为,python,c,ctypes,Python,C,Ctypes,我有一个C扩展,它通过ctypes在python中调用。 C代码如下所示: double new(int t){ double sum; sum = (double)t*(double)1.5; return sum; } import ctypes fun = ctypes.CDLL("C:/test.so") fun.new.argtypes = [ctypes.c_int] fun.new.restypes = ctypes.c_double fun.new(2) P
double new(int t){
double sum;
sum = (double)t*(double)1.5;
return sum;
}
import ctypes
fun = ctypes.CDLL("C:/test.so")
fun.new.argtypes = [ctypes.c_int]
fun.new.restypes = ctypes.c_double
fun.new(2)
Python代码如下所示:
double new(int t){
double sum;
sum = (double)t*(double)1.5;
return sum;
}
import ctypes
fun = ctypes.CDLL("C:/test.so")
fun.new.argtypes = [ctypes.c_int]
fun.new.restypes = ctypes.c_double
fun.new(2)
因此,人们期望输出为“3.0”,但我得到的输出是“-1398886288”。
我把它分解成这个简单的例子。我的实际应用程序要大得多,但在那里我也得到了一些奇怪的输出。也许我对ctypes有什么错误?它的拼写是
restype
,而不是restypes
:
fun.new.restype = ctypes.c_double
有了这一变化,代码“起作用”。但它不计算“和”,它是一个数字。它还包含不必要的强制转换,并且不必要地分割声明和初始化
以下通常被视为实现此功能的首选方式:
双三分之一(int x){
双结果=x*1.5;
返回结果;
}
或者,如果这就是这个函数的全部内容,请省略不必要的中间变量:
双三分之一(int x){
返回x*1.5;
}
它的拼写是重新键入
,而不是重新键入
:
fun.new.restype = ctypes.c_double
有了这一变化,代码“起作用”。但它不计算“和”,它是一个数字。它还包含不必要的强制转换,并且不必要地分割声明和初始化
以下通常被视为实现此功能的首选方式:
双三分之一(int x){
双结果=x*1.5;
返回结果;
}
或者,如果这就是这个函数的全部内容,请省略不必要的中间变量:
双三分之一(int x){
返回x*1.5;
}
输出打印在哪里?如果需要方括号,如[ctypes.c_int]
,那么为什么它们不在ctypes.c_double
附近?(如您所见,我对Python中的ctypes一无所知).OT:调用产品sum
很奇怪。@PaulOgilvie因为argtypes必须是一个序列,并且只重新键入一个变量。输出打印在哪里?
问题我想问的是python
中的打印语句在哪里?输出打印在哪里?如果需要方括号,如[ctypes.c_int]
,那么为什么它们不存在于ctypes.c_double
?(如您所见,我对Python中的ctypes一无所知).OT:调用产品sum
很奇怪。@PaulOgilvie因为argtypes必须是一个序列,并且只重新键入一个变量。输出打印在哪里?
问题我想问的是python
代码中打印语句在哪里?天哪****。谢谢。有时候我再也看不到这样的错误了。还有谢谢你的额外建议。我从一个更大的脚本中提取了代码,所以看起来很奇怪。天哪****。谢谢你。有时候我再也看不到这样的错误了。也谢谢你的额外建议。我从一个更大的脚本中提取了代码,所以看起来很奇怪。