Zainspirowany innym answer tutaj, mam funkcję ctypes że wzywam użyciu ctypeslib.ndpointer
:Jak mogę przekazać wartość null do biblioteki zewnętrznej, używając ctypes, z argumentem zadeklarowanym przy pomocy ctypeslib.ndpointer?
lib.foo.argtypes = [ctypeslib.ndpointer(np.complex64, ndim=1, flags='C'), POINTER(c_int)]
Funkcja zewnętrzna jest zadeklarowany tak:
void foo(cmplx_float *array, int *length)
Mój problem jest, że chcę zadzwonić funkcja dwa razy. Po raz pierwszy chcę przekazać nullptr
do argumentu array
, dzięki czemu mogę znaleźć wymaganą długość. Za drugim razem przejdę w tablicy numpy.
więc zrobić tak:
lib.foo(None, length)
ten nie powiedzie się z powodu następującego błędu:
ctypes.ArgumentError: argument 1: : argument must be an ndarray
Czy jest możliwe dla mnie przechodzą nullptr
?
jestem trochę zardzewiały na 'ctypes', ale wygląda na to, czy ty [utwórz wskaźnik bez żadnych argumentów] (https://docs.python.org/2/library/ctypes.html#pointers), powinien utworzyć wskaźnik zerowy. –
Prawdopodobnie najbardziej czystą opcją jest podklasy typ zwracany przez 'ctypeslib.ndpointer', który sam jest podklasą [' ctypeslib._ndptr'] (https://github.com/numpy/numpy/blob/v1.9.2/numpy/ctypeslib.py#L150). Zastąp swoją metodę klasy 'from_param', aby zwrócić' obj', jeśli jest 'Brak', w przeciwnym razie zwróci wynik wywołania metody rodzica' from_param'. – eryksun
Alternatywnie możesz tymczasowo zmodyfikować 'argtypes', ale nie podoba mi się to, ponieważ nie jest bezpieczne dla wątków. Można również utworzyć drugą instancję wskaźnika funkcji, która używa 'argtypes = [c_void_p, POINTER (c_int)]', ale wymaganie dwóch wskaźników funkcji jest niezdarne. – eryksun