Voraussetzung: Verwenden von C-Codes in Python | Set 1 , Set 2

Problem Nr. 1: Wenn Sie ctypes verwenden, besteht das Problem, dass der ursprüngliche C-Code möglicherweise eine Sprache verwendet, die Python nicht sauber zugeordnet ist.

Nehmen wir das Beispiel einer divide()Funktion, die über eines ihrer Argumente einen Wert zurückgibt. Es ist eine übliche C-Technik, aber es ist oft nicht klar, wie sie in Python funktionieren soll.

divide = _mod.divide 
divide.argtypes = (ctypes.c_int, ctypes.c_int, ctypes.POINTER(ctypes.c_int)) 
x = 0
divide(10, 3, x) 

Ausgabe :

Traceback (letzter Anruf zuletzt):
  Datei "", Zeile 1, in
ctypes.ArgumentError: Argument 3 :: erwartet LP_c_int
Instanz statt int

 
Problem Nr. 2:
Auch wenn es funktioniert, liegt ein Verstoß gegen Pythons Unveränderlichkeit von ganzen Zahlen vor. Für Argumente mit Zeigern muss ein kompatibles ctypes- Objekt erstellt werden, das wie im folgenden Code übergeben wird.



x = ctypes.c_int() 
print ("divide(10, 3, x) : ", divide(10, 3, x)) 
  
print ("x.value : ", x.value) 

Ausgabe :

Teilen (10, 3, x): 3
x.Wert: 1

 

Problem Nr. 3:

Im folgenden Code wird eine Instanz einer ctypes.c_int erstellt und übergeben, da das Zeigerobjekt .c_int- Objekt im Gegensatz zu einer normalen Python-Ganzzahl mutiert werden kann. Um den Wert entweder abzurufen oder zu ändern, kann das Attribut .value verwendet werden.

_divide = _mod.divide 
  
_divide.argtypes = (ctypes.c_int, ctypes.c_int, ctypes.POINTER(ctypes.c_int)) 
_divide.restype = ctypes.c_int 
  
def divide(x, y): 
    rem = ctypes.c_int() 
    quot = _divide(x, y, rem) 
    return quot, rem.value 

 
Problem Nr. 4: Die avg()Funktion ist eine Herausforderung.

Der zugrunde liegende C-Code erwartet eine Länge, die ein Array darstellt, und empfängt einen Zeiger. In der Praxis kann ein Python-Array in der Praxis jedoch viele verschiedene Formen annehmen. Es kann sich um ein Array, eine Liste, ein Tupel oder ein Numpy-Array handeln, und Sie möchten möglicherweise mehrere Möglichkeiten unterstützen.