2014-02-11 2 views
2

С питоном Я пытаюсь использовать С функцией, которая возвращает динамически выделяемую нулевой -завершённый массив целых чисел:нулю прекращается динамический массив в качестве возвращаемого значения в Python

int* my_func(void) 
{ 
    int i; 
    int *ret = (int*)malloc((LEN + 1) * sizeof(int)); 

    for (i = 0; i < LEN; i++) ret[i] = 1; 
    ret[LEN] = 0 

    return ret; 
} 

мне нужно что-то вроде

from ctypes import * 

l = cdll.LoadLibrary("lib.so") 
my_func = l.my_func 
my_func.restype = c_int * LEN 

for x in my_func(): print x 

Проблема в том, что LEN неизвестен в коде python, мне нужно прочитать массив до первого нулевого элемента.

+0

ctypes позволяет установить 'restype' в массив, но он не делает то, что вы думаете. Он сохраняет возвращенный указатель как первый элемент массива. – eryksun

ответ

1

ли на самом деле не работал с ctypes еще, но как насчет:

from ctypes import * 

l = cdll.LoadLibrary("lib.so") 
my_func = l.my_func 
my_func.restype = POINTER(c_int) 

i = 0; 
rv = my_func() 
while rv[i]: 
    print rv[i] 
    i += 1 
+0

Возможно, это была хорошая причина для реализации c-реализации или нет. Например. во многих случаях 'ctypes' используются с библиотеками, которые вы никак не можете изменить. Пусть OP решит, что имеет смысл ... – sebastian

+0

Если массив нужен, используйте 'rv_array = cast (rv, POINTER (c_int * i)) [0]'. Вы можете установить атрибут ['errcheck'] (http://docs.python.org/2/library/ctypes#ctypes._FuncPtr.errcheck)' my_func' функции, которая возвращает массив. – eryksun

Смежные вопросы