ctypes + Pointer auf Funktionen

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
PyPy496
User
Beiträge: 2
Registriert: Sonntag 6. November 2011, 10:59

Hallo zusammen,

ich will mit Python auf einem Tool der IO-Karten bedient zugreifen. Dafür bietet dieses Tool ein DLL, die ich mit ctypes verwenden kann. In der DLL habe ich Get/SET-funktion mit denen ich die Werte der IO-Kanäle lesen bzw. verändern kann.

Meine Frage: Gibt es eine möglichkeit, dass ich über ein Pointer die Werte der Kanäle lesebzw. schreibe ohne jedes mal set bzw. get zu benutzen? z.b. IF(Get(Kanal_1) == 1) -> IF(ptr_Kanal_1 == 1)

Vielen Dank im Voraus!
deets

Ich hoffe nicht. Das wuerde naemlich bedeuten, dass deine IO-Karte ihren im Kernel angesiedelten IO-Raum in deinen Prozess einblenden kann/darf - und damit ist dann Polen offen, wie man so schoen sagt.

Und was genau stoert dich denn an den Gettern/Settern? Performance? Wenn nicht, und es geht nur um die aesthetik - dann kannst du dir ja ganz einfach ein Proxy-Objekt schreiben, welches Properties hat mit deren Hilfe du die getter/setter-calls versteckst, und in Python sieht's dann nach simplem Attributzugriff aus.
PyPy496
User
Beiträge: 2
Registriert: Sonntag 6. November 2011, 10:59

ich muss oft mit vielen diesen IO-Werten rechnen bzw. prüfen und ich meine, dass es besser für die lesbarkeit.

z.B. SET(AD1, get(Input_0) + get(Input_1)) ==> *ptr_AD1 = (*ptr_Input_0 + *ptr_Input_1)

Für Das Tool worauf ich über die DLL zugreife sind die IO-Kanäle variablen, die er im RAM des PCs verwaltet. daher wollte ich auf die RAM-Adresse direkt zugreiffen!?
deets

Also, ohne genaues ueber deine Karte zu wissen kann ich da mehr zu der Speicher-Geschichte nicht sagen.

Aber wenn deine DLL dir keinen Call anbietet, mit dem du eben genau die Speicher-Adresse bekommst, dann kommst du da auch nicht dran.

Und das, was du da machen magst, das liesse sich eben mit einem Proxy-Object erreichen, welches dir die Get/Set-calls kapselt.
Antworten