Ich habe letztens irgendwo gelesen, dass Loops im Gegensatz zu Label-Schleifen fehleranfällig sind.Kann jemand etwas genaueres dazu sagen?
Der einzige Unterschied der mir aufgefallen ist, ist dass Loops langsamer sind.
Ich würde gerne wegen der deutlich besseren Übersicht die Loops benutzen, da mir gerade bei aufwändigeren Sachen Übersicht wichtig ist.
Sollte es nämlich nur die Sache mit den Wiederholungen sein, kann ich darauf verzichten und habe dafür lieber mehr Übersicht.
Afair/afaik:
Der Breakloop-Befehl springt zum nächsten Loop-Ende. Das muss nicht das Loop-Ende sein, dass du damit zu erreichen meinst. Dadurch könntest du Code erhalten, der sich völlig anders verhält als du es erwartest.
Tipp: Nimm den 2k9 Ultimate, da gibts gute Färbung der Befehlszeilen und ein größeres Codefenster damit kannst du es dir selbst übersichtlicher machen. Ansonsten Kommentare. ich setze gerne <BEGIN FOREACH MONSTER > </END FOREACH MONSTER> oder sowas um meine Schleifen.
Oder war es so, dass Break ans Ende der äußersten Schleife springt?
...
Irgendwo hat das schonmal jemand gesagt. Kann selber nichts rekonstruieren. Edit:
Ich glaube, es ging darum, dass die Schleife, in welcher der Break-Befehl auftrat eben nicht beendet werden konnte, weil stromabwärts des Breaks eine untergeordnete Schleife auftrat ...was rede ich da, der RM2k(3) kümmert sich nicht um Hierarchien.
Der StopLoop / BreakCycle Befehl merkt sich das nächste auftretende Ende einer Schleife als neuen Script-Entry vor ( [...+18] ). Wenn man den Befehl vor eine Schleife packt, wird diese beim ersten Ausführen übersprungen.
Edit:
@Cherry:
489AA5 | mov eax,[eax+8]//get found LoopCommand's data
489AA8 | cmp eax,[edi+8]//Is this <>Loop the one that triggered sub_489A78?
489AAB <<jnz loc_489AB3 //jump if not
Ganz recht, ich wollte da eh mal einen Bugfix machen - man braucht ja nur überprüfen ob die TreeDepth (scriptline+8 afair) des Endloop-Befehls dieselbe wie die des aktuellen ist.
--
Mir war nichtmal bewusst dass ich nominiert wurde, aber: Cool! Hälfte des Lobes muss aber unbedingt an Archeia!
Ich halte es ja sowieso für ratsam, immer am Ende einer Schleife den Break zu setzen.
Oder zumindest an einem Punkt, wo möglicherweise vorhandene Unterschleifen schon abgearbeitet sind.
--
Solange es hier falschzitierende Ärsche gibt, dulde ich keinerlei Zitatboxen, die von mir sein sollen.
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!