2017-03-13 2 views
0

Ich habe die Adresse einer Funktion und auch ihre "c-like" Darstellung (von llvmlite, aber das ist nicht so wichtig).Ctypes: DataTypes von C-Definition

Für eine Funktion, die zwei Doppel Werte addiert und gibt ihr den Code würde wie folgt aussehen: cfunc = CFUNCTYPE(c_double, c_double, c_double)(func_ptr)

die ganz gut in Art und Anzahl variiert jedoch Argument meiner Funktion der funktionieren würde. In Python ist dies mit einigen Generatoren lösbar.

Allerdings habe ich kein Werkzeug (oder zumindest habe ich keine gefunden), wie ich meine Typen zu denen von ctype "konvertieren" oder analysieren.

Die Argumente sind llvmlite-Type Objekte, so habe ich eine C-ähnliche Darstellung zur Verfügung.


Mein Ansatz wäre ein dict zu schaffen, die llvmlite-Type-Objekte abbilden, oder die c-Darstellung auf die Type-Objekten von ctypes. Ein kleiner Parser könnte auch helfen.

Bietet ctype nicht schon so etwas an? Eine magische Funktion: ctypes.magic("double") == ctypes.c_double

Ich bin nicht an Ctypes gebunden. Ich weiß, dass CFFI existiert, aber ich habe 0 Erfahrung damit, und so weit ich in den Dokumenten schaue, konnte ich nicht einmal die grundlegende Lösung für eine einzelne Funktionsadresse finden.

Ich bin mir bewusst, dass mein Anwendungsfall eher selten ist, da beide Bibliotheken sich eher um Bibliotheken und nicht um die Adresse einer bestimmten Funktion kümmern.

Antwort

0

Ok, ich benutze nur ein Diktat mit allen Möglichkeiten. Da ich wahrscheinlich nur an llvmlite gebunden bin, gibt es nicht so viele Optionen. {str(ir.DoubleType()): ct.c_double, ....}