Error al usar el módulo ctypes para acceder a una DLL escrita en C

Tengo una DLL con una sola función que obtiene cinco dobles y una int:

__declspec(dllexport) struct res ITERATE(double z_r,double z_i,double c_r, double c_i, int iterations, double limit) 

Retorna una estructura personalizada que consta de una matriz de tres dobles:

 struct res { double arr[3]; }; 

Para devolver los valores hago esto:

 struct res result; /*earlier in the code */ result.arr[0] = z_real; /*Just three random doubles*/ result.arr[1] = z_imag; result.arr[2] = value; return result; 

Lo he comstackdo con MinGW y estoy tratando de usarlo en python para hacer algo como esto:

 form ctypes import * z = [0.0,0.0] c = [1.0,1.0] M = 2.0 MiDLL = WinDLL("RECERCATOOLS.dll") MiDLL.ITERATE.argtypes = [c_double, c_double, c_double, c_double,c_int,c_double] MiDLL.ITERATE(z[0],z[1],c[0],c[1],100,M) #testing out before assigning the result to anything. 

Pero, siempre que intente llamar a la función con esos valores, me lo enviará:

 WindowsError: exception: access violation writing 0x00000000 

Tampoco sé cómo capturar la estructura personalizada que declaré y convertir cada uno de sus elementos en puntos flotantes de Python. He mirado en este enlace PyDocs pero en vano.

Gracias de antemano.

EDITAR:

Este es el encabezado original (modificado de acuerdo con las sugerencias) utilizado (“mydll.h”):

 #ifndef MYDLL_H #define MYDLL_H extern "C" __declspec(dllexport) #define EXPORT_DLL __declspec(dllexport) EXPORT_DLL void ITERATE(struct res*, double z_r,double z_i,double c_r, double c_i, int iterations, double limit) #endif 

Y, en caso de que algo esté mal, el archivo de código (es muy corto, solo una función):

 #include  #include  struct res { double arr[3]; }; void __declspec(dllexport) ITERATE(struct res* result,double z_r,double z_i,double c_r, double c_i, int iterations, double limit) { /* The purpose of this function is, given two complex numbers, an iteration number and a limit, apply a formula to these two numbers for as many iterations as specified. If at any iteration the result of the formula is bigger than the limit, stop and return the number and the iteration it reached. If after iterating they are still inside the limit, return the number after all the iterations and the number of iterations it has gone through. Complex numbers are composed of a real part and an imaginary part, and they must be returned separately. */ double complex z = z_r + z_i*I; double complex c = c_r + c_i*I; int actual_iter; for (actual_iter = 1; actual_iter  limit) { double value = actual_iter; double z_real = creal(z); double z_imag = cimag(z); result.arr[0] = z_real; result.arr[1] = z_imag; result.arr[2] = value; } } double value = iterations; double z_real = creal(z); double z_imag = cimag(z); result.arr[0] = z_real; result.arr[1] = z_imag; result.arr[2] = value; } int main() { return 0; } 

Hay un problema con devolver estructuras como esa. No todos los comstackdores devuelven tales estructuras de la misma manera. Prefiero cambiar la statement de función a esto:

 void __declspec(dllexport) ITERATE(struct res* result, double z_r,double z_i, double c_r, double c_i, int iterations, double limit); 

De esa manera, la estructura está en la memoria del usuario y no hay ambigüedad sobre cómo se devolverá la estructura.

Por supuesto, como dijo David, es posible que tenga que usar una convención de llamadas diferente.