Question

Hey! comme vous avez sans doute remarqué que j'ai un problème ennuyeux avec ctypes. Je suis en train de communiquer avec un instrument et de le faire, je dois utiliser ctypes pour communiquer avec le pilote de DLL.

jusqu'à présent, je suis parvenu à exporter la DLL en faisant ceci:

>>> 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'

Et cela fonctionne assez bien, d'après la documentation qu'il est censé enregistrer la DLL du pilote Tuner dans la chaîne 80 octets donnée comme paramètre. Cependant, lorsque je tente d'utiliser la fonction appelée add_tuner il échoue. Voici ce que dit la documentation:

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[])

est de savoir comment j'ai essayé d'appeler la fonction ci-dessus: Les paramètres qui sont modifiés sont tous les pointeurs et max_range [], selon le manuel les valeurs ci-dessous sont correctes aussi, je ne sais pas pourquoi je continue à obtenir un fenêtres violation d'accès écrit 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))

Le numéro de série est cependant censuré par laissé à une variable se référant. Quelqu'un sait quoi faire ?, vous voyez des erreurs avec mon entrée?

Merci / Mazdak

Était-ce utile?

La solution

Je figure c'est la valeur que vous passez à l'argument long max_range[]. La fonction attend un pointeur vers un entier long il (elle demande un tableau d'entiers de long), mais vous passez une longue valeur de zéro (résultat de l'appel c_long()), qui est implicitement jeté à un pointeur nul. Je soupçonne que la fonction essaie alors d'écrire à l'adresse passée à max_range, à savoir. le pointeur nul, d'où la violation d'accès à l'adresse 0x00000000.

Pour créer un tableau de longs pour passer max_range, vous créez d'abord le type de tableau en multipliant le tableau type de données avec la taille du tableau (un peu bavarde pour plus de clarté):

array_size = 3
ThreeLongsArrayType = c_long * array_size

Vous pouvez instancier un tableau comme vous le feriez avec une autre classe Python:

array = ThreeLongsArrayType()
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top