Seite 1 von 1

Wie umgschrieben?

Verfasst: Freitag 12. März 2010, 13:34
von DonnerCobra
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.

Verfasst: Freitag 12. März 2010, 14:30
von Dauerbaustelle
Genau so? :-) Oder wie? Kannst du mal etwas mehr Kontext geben?

Verfasst: Freitag 12. März 2010, 14:47
von DonnerCobra
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?

Verfasst: Freitag 12. März 2010, 14:57
von Dauerbaustelle
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.

Verfasst: Freitag 12. März 2010, 15:39
von DonnerCobra
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?

Verfasst: Freitag 12. März 2010, 15:56
von Darii
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 ;)