2015-11-19 3 views
1

Я пишу модуль 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 для этой же цели?

+0

Если 'run' ожидает' 'недействительным ** оно должно быть набраны как таковой. В этом случае передайте 'byref (p)' в качестве аргумента в Python. В C или C++ вы разыскиваете указатель для сохранения значения, например. '* output = some_address'. – eryksun

+0

@eryksun wow, вся моя проблема была 'run' ** not ** ожидающая' void ** '. просто исправить, спасибо! – colinbrownec

ответ

2

Как комментарий eryksun указывается, для void* быть выходной параметр, он должен быть void**:

# DLLEXPORT int run(double input1, double input2, void** output) 

from ctypes import * 
mydll = cdll.mydll 

mydll.run.argtypes = [c_double, # input 1 
         c_double, # input 2 
         POINTER(c_void_p)] # output pointer 
mydll.run.restype = c_int 

p = c_void_p() 
retval = mydll.run(1.2,3.4,byref(p)) 

print p.contents 
Смежные вопросы