在python脚本中将C函数的指针参数与ctype参数链接
以下是显示数字除法的简单代码:在python脚本中将C函数的指针参数与ctype参数链接,python,c,pointers,ctypes,Python,C,Pointers,Ctypes,以下是显示数字除法的简单代码: //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 quo
//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;
}
下面是我得到的错误
mydll.divide(4,32,3)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
mydll.divide(4,32,3)
ctypes.ArgumentError:参数3::应为LP_c_long实例,而不是int
编辑
看起来您正在使用三个整数参数调用包装的divide函数(mydll.divide(4,32,3)
)。那不行。请参阅下面的代码,了解您可能希望如何指定第三个参数。我的文章的其余部分可能是不必要的,但我还是把它留给未来有不同问题的读者
我首先要确保编译DLL时使用的位与python发行版相同(例如32位与64位) 接下来,您的代码有一个错误,
rements=a%b代码>应为*余数=a%b代码>(可能您是从中工作的。)
最后,以下代码适用于我(在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;
}
运行时,它会正确打印(3,1)
注:
- 使用gcc,这是用以下代码编译的:
gcc-g-Wall-shared-fPIC-I/usr/include/python2.7/pointer.c-o pointer.so
- 我能够删除
\uu declspec
,因为如果您使用的是其他编译器,可能需要将其保留在中
- 我没有使用.h文件
非常感谢:)问题解决了。由于我是Python新手,您能给我介绍一些教程或网站吗?在这些教程或网站上,我可以学习用Python脚本链接具有结构、指针等的共享库?因为我在某个地方也被一个结构代码卡住了。你已经看到了我在问题中引用的链接,对吗?(). 这是非常有用的,以及文档的部分。是的,我参考了您在链接中提到的代码:)。再次感谢您,我们将看一看ctypes文档和扩展python文档。
#include<stdio.h>
int divide(int a, int b, int *remainder)
{
int quot = a / b;
*remainder = a % b;
return quot;
}
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)