Hierarchie-sensitive BreakCycle / BreakLoop Befehle. (wenn man diese außerhalb jeglicher Loops ausführt, dann springt das Skript an das Ende des Events)
Also hat das nur Probleme mit verschachtelten Loops?
Das heißt ich müsste also nur aufpassen, wo ich denn jetzt meine Break Loop-Befehle hinpacke und dann ist alles gut oder?
Ich hab mal den Patch von bugmenot ausprobiert:
Zitat von EasyEventExporter
- SCRIPT -
<> Change Variable: [1] = 0
<> Change Variable: [2] = 0
<> Loop
. <> Change Variable: [1] += 1
. <> Change Variable: [3] = V[2]
. <> Change Variable: [3] *= 2
. <> Show Message: test:
. : \v[1]
. : \v[2]
. <> Fork Condition: If Variable [1] >= 10 then ...
. . <> Show Message: lbreak1
. . <> Break Loop
. . <>
. : End of fork
. <> Loop
. . <> Change Variable: [2] += 1
. . <> Fork Condition: If Variable [2] >= V[3] then ...
. . . <> Show Message: lbreak2
. . . <> Break Loop
. . . <>
. . : End of fork
. . <>
. : End of loop
. <>
: End of loop
<> Show Message: test fertig
...
Ohne seinen Patch, läuft das ganze immer weiter, auch wenn Variable 1 größer als 10 ist. Die zweite Schleife wird dabei übersprungen.
Mit seinem Patch, springt das ganze nach dem ersten "lbreak2" scheinbar ganz an den Eventanfang, da mir die erste Nachricht dann die Werte 1 und 0 ausgibt. Das ganze bricht also früher ab als es soll und die Nachricht "test fertig" wird gar nicht erst ausgegeben.
@Corti: Ich benutze den 2k9 Ultimate und kommentiere auch, aber finde es trotzdem schöner wenn ich den Loop-Block anklicke und sofort alles markiert wird, was auch zur Schleife gehört.
@MagicMaker: Genau so würde ich es dann einfach machen, auch wenn man dann eventuell ein bisschen gucken muss, dass eine Unterschleife nicht 1x zu oft abgearbeitet wird. Allerdings sollte das kein großes Problem sein.
Korrektur: Ich meinte, die TreeDepth muss natürlich kleiner als die aktuelle sein. Nicht gleich (und auch nicht einfach nur um eins kleiner oder so). Ich hatte vergessen dass man ja wahrscheinlich noch andere Treestrukturen braucht.
EDIT: Damn, ich muss wir was anderes überlegen. Weil:
0...<> Loop
1......<> Fork If ...
2.........<> Break Loop
2.........<>
1......: End Case
1......<> Loop
2.........<>
1......: End Loop
1......<> Message "Hello"
0...: End Loop
Dieses Beispiel würde dann nämlich trotzdem "Hello" ewig ausgeben, anstatt nichts.
Man müsste alle Zeilen durchgehen, einen Counter für jedes Loop um 1 erhöhen und für jedes End Loop um 1 verringern. Und wenn der Counter (angenommen er startet mit 0) kleiner 0 ist, DANN haben wir das richtige End Loop gefunden.
--
Mir war nichtmal bewusst dass ich nominiert wurde, aber: Cool! Hälfte des Lobes muss aber unbedingt an Archeia!
Also der Beispielcode den ich oben aufgeführt habe, funktioniert jetzt mit dieser Version.
Beide Schleifen laufen so durch wie sie sollen und am Ende kriege ich auch das "test fertig" ausgegeben.
@bugmenot: Warum so kompliziert? Was war an meiner Lösung denn falsch? (Der aus dem Edit)
Ich meinte das so:
......<> Break Loop --- Counter=0, mal End Loop suchen gehen
......<>
...: End Case
...<> Loop --- Counter=1
......<>
...: End Loop --- Counter=0
: End Loop --- Counter=-1, richtiges End Loop gefunden!
--
Mir war nichtmal bewusst dass ich nominiert wurde, aber: Cool! Hälfte des Lobes muss aber unbedingt an Archeia!
Habe mich wohl zu sehr auf eb!'s Code eingelassen und die aufgepickten :EndLoops auf richtige Zugehörigkeit überprüft... anstatt gleich das erste richtige :EndLoop suchen zu lassen...