(wiem, że jest to stara sprawa, ale myślę, że przyjęte rozwiązanie jest niepotrzebne obejście, więc chcę zostawić to tutaj dla potomności.)
Właściwie ctypes powinny explicitly support użyciu byref()
zdać wskaźnik taki:
ctypes eksportuje funkcję byref()
, która jest używana do przekazywania parametrów przez odniesienie. Ten sam efekt można osiągnąć za pomocą funkcji pointer()
, chociaż pointer()
wykonuje o wiele więcej pracy, ponieważ konstruuje obiekt rzeczywistego wskaźnika, więc szybciej jest użyć byref()
, jeśli nie potrzebujesz obiektu wskaźnika w samym Pythonie.
prawdopodobną przyczyną jest to, że zostały zdefiniowane swoje struct w więcej niż jednym miejscu (na przykład w różnych modułów) - jeśli przydział argtypes
widzi jedną definicję i wywołanie funkcji widzi drugi nasuwa to mylące błąd. Innymi słowy, ctypes próbuje dopasować dwa typy, które są (prawdopodobnie) identyczne pod względem treści i mają dokładnie taką samą nazwę, ale nie są one tym samym typem .Tak długo, jak podstawowy typ struktury jest obiektem pojedynczego typu, nie ma znaczenia, czy skonstruujemy wskaźnik do niego przy użyciu pointer()
, byref()
lub POINTER()()
- ctypes wykryje, że podstawowy (wskazany) typ jest taki sam.
Aby sprawdzić, czy tak jest, spróbuj najpierw przed wywołaniem funkcji zewnętrznej assert(_lib.mymethod.argtypes[0]._type_ == type(s))
.
Dzięki! Użyłem drugiej metody, którą powiedziałeś i działa bez problemu. – mete
coś podobnego tutaj - https://codexample.org/pytania/238108/python-ctypes-sending-pointer-to-structure-as-parametr-to-native-library.c –
Który jest wyższy poziom typ POINTER w ctypes ? –