【发布时间】:2019-03-12 14:51:18
【问题描述】:
按照我在tutorial 中找到的方法,我编写了以下代码来使用ctypes 库修改我的自定义python 类Point。 wrap_function 只是一个便于使用的小帮手,因为这是来自更大项目的 MWE。
在python方面:
import ctypes
import numpy as np
libc = ctypes.WinDLL(r'C:\Path\lib.dll')
def wrap_function(lib, funcname, restype, argtypes):
func = lib.__getattr__(funcname)
func.restype = restype
func.argtypes = argtypes
return func
class Point(ctypes.Structure):
_fields_ = [('x', ctypes.c_int), ('xdata', ctypes.c_void_p)]
list_of_points = [] #unused for now
xdata = np.zeros((40000,), dtype=np.double)
a = Point(1,xdata.ctypes.data)
b = Point(3,xdata.ctypes.data)
change_data_for_point = wrap_function(libc,'change_data_for_point', None, [ctypes.POINTER(Point)])
change_data_for_point(a)
在 C 端:
---header:
const int N = 40000;
typedef struct {
double x;
double xdata[N];
} Point;
extern "C" LIB_API void change_data_for_point(Point* p);
---source:
void change_data_for_point(Point* p) {
p->x++;
for (int i = 0; i < 40000; i++) {
p->xdata[i] = 2.0*i;
if (i % 1000 == 0) printf("xdata at index %d is %f\n", i, p->xdata[i]);
}
}
在 Windows 7 cmd 中执行 python 文件时,它会打印以下输出:
xdata at index 0 is 0.000000
xdata at index 1000 is 2000.000000
// ... some more ...
xdata at index 17000 is 34000.000000
xdata at index 18000 is 36000.000000
Traceback (most recent call last):
File "test.py", line 40, in <module>
为什么它会停在 18.000 ?我试了几次,有时循环达到 19 或 20k,但它从来没有比这更高。它与C端的数组初始化有关吗?我是不是弄乱了python端的参数传递?
额外问题:如何使用 ctypes 将这些点的列表传递给 C 端?
【问题讨论】:
-
用
try-catch-block包围python中的关键行现在让我打印exception: access violation writing 0x0000000006F60000,所以我认为我很可能在C端搞砸了。 -
Point 定义在 C 和 Python 不匹配 ( xdata).