带有DLL的Python ctypes参数 - 指向双精度数组的指针

时间:2018-01-14 23:25:52

标签: python c dll ctypes

我是一名新手编写器,使用Python中的ctypes,并尝试使用C语言编写的DLL中的函数。我在SO上发现了很多类似的问题,但没有任何东西能解决这类难题。

我已经加载了DLL就好了,但我需要调用的函数之一要求指向一个包含6个双精度数组的指针来转储值,我无法弄清楚如何通过Python为函数提供所需的功能。 (我在C中尝试这样做的失败是另一回事。)

我尝试了各种ctypes.POINTER(c_double)的排列,使用了byref(),POINTER(c_double * 6)等,最糟糕的是我遇到了类型错误,或者对所有这些错误都是访问冲突

从DLL文档:

int swe_calc_ut (double tjd_ut, int ipl, int iflag, double* xx, char* serr)

该函数使用Julian Days中的时间进行计算,以将行星体的经度,纬度等返回为双倍。

我最接近传递DLL将接受的数据类型是使用此代码,只是尝试从swe_calc_ut获取6个双打中的任何一个:

dll = windll.LoadLibrary(# file path)

# retype the args for swe_calc_ut
py_swe_calc_ut = dll.swe_calc_ut
py_swe_calc_ut.argtypes = [c_double, c_int, c_int, c_double, c_char_p]
py_swe_calc_ut.restype = None

tjd = c_double(# some value from elsewhere)

returnarray = c_double()
errorstring = create_string_buffer(126)

py_swe_calc_ut(tjd, c_int(0), c_int(64*1024), returnarray, errorstring)

当我尝试按原样运行时,我收到错误:

OSError: exception: access violation writing 0x0000000000000000

使用byref()给我一个类型错误等。

如果有人能指出我正确的方向,从原来的DLL功能中获得所需的双打,我会永远感激;我很难过,并且无法将其发现。

1 个答案:

答案 0 :(得分:3)

这(未经测试)应该有效。第四个参数是类型t。 C&#39 Foldable类型的等价物为POINTER(c_double),该类型的实例为double returnarray[6]。此外,如果您已声明参数类型,则不需要包含输入参数,例如c_double * 6;通过returnarray= (c_double * 6)()很好:

int(0)