Я пытаюсь передать структуру в Ctypes. Но вызов функции вызывает ошибку формата.Передача структур в Ctypes
Это моя C функция:
typedef struct Point2Struct {
double x, y;
} Point2;
Point2 test(Point2 k)
{
return k;
}
Вызов питона выглядит следующим образом:
class Point2(Structure):
_fields_ = [('x',c_double),('y',c_double)]
lib.test.argtypes=[Point2]
lib.test.restype=Point2
p = Point2(1.1, 2.2)
g = lib.test(p)
print g.x, g.y
Когда я вызываю функцию через CDLL, я получаю:
ValueError: Procedure called with not enough arguments (4 bytes missing) or wrong calling convention
с WinDLL, я получаю:
ValueError: Procedure probably called with too many arguments (16 bytes in excess)
Я скомпилировал код C в DLL, используя (Mingw) GCC под Windows 7.
gcc -shared -o test.dll test.o
Я также попытался использовать файл .so с:
gcc -shared -Wl,-soname,test-o test.so -fPIC test.c
Но я получаю то же самое ошибки.
Что я делаю неправильно? Должен ли я компилироваться с какой-либо конкретной опцией?
Вы пытались явно добавить функцию '__declspec (dllexport)' и '__cdecl' в функцию? Или, наоборот, вы пробовали написать код C, который загружает и использует вашу DLL так же, как вы хотите, с помощью 'ctypes'? – abarnert