Wie umgschrieben?

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
DonnerCobra
User
Beiträge: 53
Registriert: Mittwoch 9. April 2008, 19:35

Hi,

ich nutze gerade eine kleine Erweiterung die eine C Lib wrappt.
Dort gibt es eine Funktion die wie folgt funktioniert:

Code: Alles auswählen

int a=0;
while(IterateThrough(&a)!=FINISH_END)
{
    /*...*/
}
Jetzt ist diese Funktion gewrappt und funktioniert so:

Da int ja unveränderlich sind, haben se den Wert zurückgegeben.

Code: Alles auswählen

end, a = IterateThrough()
Wie würde ich das am besten in Python konvertieren? Derzeit sieht es so aus:

Code: Alles auswählen

end, a = IterateThrough()
while end==FINISH_END:
    # do some stuff
    end, a = IterateThrough()
Hat jemand eine Idee?

Danke euch!!

Edit (Leonidas): In das extra dafür angelegte, neue Forum verschoben.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Genau so? :-) Oder wie? Kannst du mal etwas mehr Kontext geben?
DonnerCobra
User
Beiträge: 53
Registriert: Mittwoch 9. April 2008, 19:35

Naja, die umgeschrieben Variante sieht sehr unhübsch aus. Vor allem muss ich vor jedem continue in der Schleife wieder "end, a = IterateThrough" schreiben.

Ich hatte gehofft es geht sowas:

Code: Alles auswählen

while (end, a = IterateThrough()) and end==FINISH_END:
    # code
Ich weiß, das geht nicht, aber evtl. sowas in der Art?
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

Naja, wie wäre sowas:

Code: Alles auswählen

def whilebody(a, end):
  # ...

a, end = UPDATEIT()
while(end...):
  whilebody(a, end)
  a, end = UPDATEIT()
Dann kannst du aus dem `Body` der Whileschleife rausspringen, wann du willst.
DonnerCobra
User
Beiträge: 53
Registriert: Mittwoch 9. April 2008, 19:35

Sieht deutlich besser aus, als meins :)

Da ich in der Uni an den Code komme, wie hättet ihr den IterateThrough gewrappt? Also nicht aus C++ Sicht, sondern wie würde die denn bei euch aussehen?
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

DonnerCobra hat geschrieben:Da ich in der Uni an den Code komme, wie hättet ihr den IterateThrough gewrappt? Also nicht aus C++ Sicht, sondern wie würde die denn bei euch aussehen?
Da IterateThrough offensichtlich einen Iterator darstellt hätte ich ihn auch als Iterator gewrappt, so dass man for verwenden kann.

Code: Alles auswählen

from ctypes import byref, c_int, cdll
lib = cdll.LoadLibrary(... # Library öffnen... 
FINISH_END = c_int.in_dll(lib, "FINISH_END") # oder was auch immer FINISH_END ist...

def IterateThrough():
    a = c_int()
    while lib.IterateThrough(byref(a)) != FINISH_END:
        yield a.value

for a in IterateThrough():
     # do something
Oder so in der Art, habs nicht getestet, speziell der Wrapper-Code könnte crashen ;)
Antworten