Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.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脚本中将C函数的指针参数与ctype参数链接_Python_C_Pointers_Ctypes - Fatal编程技术网

在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)