以下是显示数字除法的简单代码:
//pointer.h
#include<stdio.h>
int divide(int , int , int *);
//pointer.c
#include<stdio.h>
__declspec(dllexport) int divide(int a, int b, int *remainder)
{
int quot = a / b;
remainder = a % b;
return quot;
}
如pointer.c所示,余数是一个指针类型参数,其值将在函数本身中计算。任何人都可以告诉我如何从这个函数链接到python脚本的值如下所示:
//python script
import ctypes as C
from ctypes import *
mydll=CDLL('pointer.dll')
mydll.divide.argtypes=(C.c_int,C.c_int,C.POINTER(C.c_int))
mydll.divide.restype=C.c_int
以下是我得到的错误。
mydll.divide(4,32,3) Traceback(最近一次调用最后一次): 文件“”,第1行,in mydll.divide(4,32,3) ctypes.ArgumentError:参数3 ::预期的LP_c_long实例而不是int
答案 0 :(得分:0)
修改强>
看起来你用三个整数参数(mydll.divide(4,32,3)
)调用你的包裹除法函数。那不行。请参阅以下代码,了解您可能希望如何指定第三个参数。我的帖子的其余部分可能是不必要的,但无论如何我还是会留下任何未来读者有不同的问题。
我首先要确保你使用与python发行版相同的位数编译你的DLL(例如32位与64位)。
接下来,您的代码有一个错误,remainder = a % b;
应为*remainder = a % b;
(大概您是在here工作。)
最后,以下代码适用于我(在Linux下,因此使用gcc和.so文件而不是.dll文件):
<强> pointer.c 强>
#include<stdio.h>
int divide(int a, int b, int *remainder)
{
int quot = a / b;
*remainder = a % b;
return quot;
}
<强> test.py 强>
import ctypes as C
from ctypes import *
mydll=CDLL('pointer.so')
mydll.divide.argtypes=(C.c_int, C.c_int, C.POINTER(C.c_int))
mydll.divide.restype=C.c_int
rem = C.c_int()
res = mydll.divide(10, 3, rem)
print(res, rem.value)
运行时,这会正确打印(3, 1)
。
注意:
gcc -g -Wall -shared -fPIC -I/usr/include/python2.7/ pointer.c -o pointer.so
__declspec
因为gcc exports all symbols by default,如果您使用的是其他编译器,则可能需要将其保留。