gpt4 book ai didi

python - 通过 Python 中的 c 函数传递和返回 double 组

转载 作者:太空宇宙 更新时间:2023-11-04 04:11:26 26 4
gpt4 key购买 nike

我在 Python 代码中成功调用了一个 dll 库。所有按值函数都运行顺利。问题是我的 c 函数需要一个 double 组的指针来返回结果。我不知道如何定义这个数组。

from ctypes import *


testlib = cdll.LoadLibrary(".\\testdll.dll")


def wrap_func(lib, funcname, restype, argtypes):
func = lib.__getattr__(funcname)
func.restype = restype
func.argtypes = argtypes
return func


test1 = wrap_func(testlib, 'testfun1', c_double, [c_double, POINTER(c_double), POINTER(c_char)])
test2 = wrap_func(testlib, 'testfun2', c_double, [c_double])

a = 2.5
b = Pointer(c_double)
tstr = Pointer(c_char)
d = test1(a, b, tstr)
print(b.values)

test1 有问题。 test2 成功运行。原函数test1 n C为:

double testfun1(double x, double* y, char* str)

我希望函数的输出通过数组 b 恢复。错误是:

ctypes.ArgumentError: argument 2: <class 'TypeError'>: expected LP_c_double instance instead of _ctypes.PyCPointerType

谁能帮帮我?

最佳答案

在 ctypes 中,POINTER(c_double) 是表示指向 c_double 的指针的类。你要传递的不是这个类本身,而是这个类的一个实例。这就是您收到错误消息的原因,这意味着“需要一个‘ double 指针’实例而不是‘ double 指针’类型”。

由于 C 函数的这些参数没有关联的大小,我假设它们是输入/输出参数,在这种情况下,您需要让它们指向真实的对象。这应该有效:

b = c_double()
c = c_char()
d = test1(a, byref(b), byref(c))

如果它们是数组,您可以在 Python 中创建数组,然后使用您找到的 POINTER 类来创建实例:

DoublePointer = POINTER(c_double)
CharPointer = POINTER(c_char)
b = DoublePointer.from_buffer(some_array)
d = test1(a, b, tstr)

如果将 C 函数的参数声明为 c_char_p,则可以直接在其中使用 Python 字符串,而无需将它们显式转换为指针。

关于python - 通过 Python 中的 c 函数传递和返回 double 组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56883980/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com