Я пишу модуль Python, который обертывает некоторый код на C++. Я использовал, чтобы использовать эту функцию, чтобы передать указатель с C++ на Python (указатель будет освобожден другой функциейPython ctypes, pass c_void_p как параметр out для функции c
DLLEXPORT void* run(double input1, double input2)
Я добавил возвращаемые коды ошибок, так моя новая функция выглядит
DLLEXPORT int run(double input1, double input2, void* output)
Но теперь я не могу показаться, чтобы получить значение указателя, в Python Я создал функцию с ctypes следующего
from ctypes import *
mydll = cdll.mydll
mydll.run.argtypes = [c_double, # input 1
c_double, # input 2
c_void_p] # output pointer
mydll.run.restype = c_int
Затем я использую функцию, создавая новый пустой указатель в Python и мимоходом его функции длл
p = c_void_p()
retval = mydll.run(1.2, 3.4, p)
print p
После выполнения этого кода я оставил с p
равным c_void_p(None)
.
Передача этого указателя на другие функции вызывает незаконные исключения доступа по адресу 0x0, поэтому я не думаю, что он обновляется.
Ожидается, что какой-то адрес будет заполнен p
после выполнения. Я что-то пропустил с помощью ctypes? Я могу создать двойной массив, выделив (c_double * 10)()
и передав это функции c для записи, почему я не могу передать указатель void для этой же цели?
Если 'run' ожидает' 'недействительным ** оно должно быть набраны как таковой. В этом случае передайте 'byref (p)' в качестве аргумента в Python. В C или C++ вы разыскиваете указатель для сохранения значения, например. '* output = some_address'. – eryksun
@eryksun wow, вся моя проблема была 'run' ** not ** ожидающая' void ** '. просто исправить, спасибо! – colinbrownec