Pregunta

¡Hey! como se podría haber dado cuenta de que tengo un problema molesto con ctypes. Estoy tratando de comunicarse con un instrumento y para hacerlo tengo que usar ctypes para comunicarse con el controlador DLL.

hasta ahora he logrado exportar el archivo DLL al hacer esto:

>>> from ctypes import *
>>>maury = WinDLL( 'MLibTuners')
>>> maury
(WinDLL 'MlibTuners', handle 10000000 at 9ef9d0)
>>> maury.get_tuner_driver_version()
(_FuncPtr object at 0x009F6738)
>>> version_string = create_string_buffer(80)
>>> maury.get_tuner_driver_version(version_string)
2258920
>>> print version_string.value
'Maury Microwave MT993V04 Tuner Driver DLL, Version 1.60.00, 07/25/2007'

Y funciona bastante bien, de acuerdo con la documentación que se supone que guardar el archivo DLL Tuner Driver en la cadena de 80 bytes como parámetro. Sin embargo, cuando intento usar la función llamada add_tuner de que falle. Esto es lo que dice la documentación:

short add_tuner(short tuner_number, char model[], short serial_number,
               short ctlr_num, short ctlr_port, short *no_of_motors, long max_range[],
               double *fmin, double *fmax, double *fcrossover, char error_string[])

así es como he tratado de llamar a la función anterior: Los parámetros que se cambian son todos los punteros y max_range [], de acuerdo con el manual de los valores siguientes son correctos también, sólo que no sé por qué me siguen dando un escritura ventanas de acceso violación 0x00000000

no_motors = pointer(c_short())
f_min = pointer(c_double())
f_max = pointer(c_double())
f_crossover = pointer(c_double())
maury.add_tuner(c_short(0), c_char_p('MT982EU'), c_short(serial_number), c_short(0),
                                c_short(1),no_motors, c_long(),
f_min,f_max,f_crossover, create_string_buffer(80))

El número de serie se Habida cuenta sin embargo censurado por refiriéndose a una variable. Alguien sabe qué hacer ?, ¿ves algún error con mi entrada?

Gracias / Mazdak

¿Fue útil?

Solución

Me imagino que es el valor que pasa en el argumento long max_range[]. La función espera un puntero a un entero long allí (que pide una matriz de enteros long), pero estás pasando un largo valor de cero (resultado de la llamada c_long()), que se convierte implícitamente a un puntero nulo. Sospecho que la función a continuación, intenta escribir en la dirección pasada en max_range, es decir. el puntero nulo, por lo tanto, la violación de acceso en la dirección 0x00000000.

Para crear una matriz de longs para pasar en max_range, primero debe crear el tipo de matriz multiplicando el tipo de datos de matriz con el tamaño de la matriz (algo detallado para mayor claridad):

array_size = 3
ThreeLongsArrayType = c_long * array_size

A continuación, puede crear una instancia de una matriz como lo haría con cualquier otra clase de Python:

array = ThreeLongsArrayType()
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top