我有以下代码:
num1=10.1234
int1=10
ret=GetOutput(int1,num1)
函数GetOutput定义为
def GetOutput(int2, num2):
lib = ctypes.WinDLL("mydllname.dll")
prototype = ctypes.WINFUNCTYPE(ctypes.c_int, ctypes.c_int, ctypes.POINTER(ctypes.c_double * 4096))
paramflags = (1, "int2",), (1, "num2",),
GetOutput = prototype(("GetOutput", lib), paramflags)
ret=GetOutput(int2, num2)
return ret
我收到以下错误,我正在请求您的帮助。
LP_c_double_Array_4096 instance instead of float
如果我将num1转换为:
num1=list(range(4096))
int1=10
ret=GetOutput(int1,num1)
我收到以下错误:
LP_c_double_Array_4096 instance instead of list
如果我将num1转换为数组,如下所示:
num1=list(range(4096))
int1=10
for item in num1:
arrayA = array("i", num1)
ret=GetOutput(int1,arrayA)
我遇到以下错误:
<class 'TypeError'>: expected LP_c_double_Array_4096 instance instead of array.array
请尽可能多地向我解释编程知识,并且仅对OOPS,列表,元组,指针等有非常初步的/基本的了解,而对ctypes则一无所知。
谢谢
答案 0 :(得分:0)
谢谢,下面的代码可以正常工作-我在理解dll在做什么时犯了一个错误。
num2不是输入而是输出,因此paramflags将会改变。这样做可以允许对num1进行任意声明。由于参数已更改,因此调用函数Getoutput_Sub现在仅需要一个输入。以前,我通过使用相同的函数名感到困惑。
num1=10.1234
int1=10
ret=GetOutput_Main(int1,num1)
上面是调用函数的地方,下面是函数的定义方式
def GetOutput_Main(int2, num2):
lib = ctypes.WinDLL("mydllname.dll")
prototype=ctypes.WINFUNCTYPE(ctypes.c_int,ctypes.c_int,ctypes.POINTER(ctypes.c_double * 4096))
paramflags = (1, "int2",), (2, "num2",),
GetOutput_Sub = prototype(("GetOutput", lib),paramflags)
ret=GetOutput_Sub(int2)
return ret
在前面的评论中,我说了两个功能和一个结构。它实际上是三个功能。我正在编写的两个文件和一个是dll标准功能的函数(在引号中传递字符串)。