For Schleife zählt 0,2,3,4,5,...
-
Hallo Leute,
wieder ein Bug der mich und meine bescheidenen Programmierkünste zum verzweifeln bringt.
Ich lade mittels einer for Schleife ein StringList in ein Memo. Die FOR Schleife verzählt sich jetzt aber und lädt Zeile 0,2,3,4,5,6,7,8,9,10,11 hinein und verschluckt Zeile 1 (bzw. 2). Für mich nur mehr WTF!!for (counter = 0; counter < 12; counter++) Edit->Lines->Add (Script->Strings[counter]);
Macht man das ganze brutal manuell funktioniert es, aber so nen Code möchte ich nicht in meinem Quelltext drinnen haben
Interface->Edit->Lines->Add (Script->Strings[0]); Interface->Edit->Lines->Add (Script->Strings[1]); Interface->Edit->Lines->Add (Script->Strings[2]); Interface->Edit->Lines->Add (Script->Strings[3]); Interface->Edit->Lines->Add (Script->Strings[4]); Interface->Edit->Lines->Add (Script->Strings[5]); Interface->Edit->Lines->Add (Script->Strings[6]); Interface->Edit->Lines->Add (Script->Strings[7]); Interface->Edit->Lines->Add (Script->Strings[8]); Interface->Edit->Lines->Add (Script->Strings[9]); Interface->Edit->Lines->Add (Script->Strings[10]); Interface->Edit->Lines->Add (Script->Strings[11]);
Mir kommt grad, dass ich die FOR Schleife vllt überhaupt nicht brauche^^, hoffe ihr könnt mir trotzdem helfen.
Grüße, Kennedy
-
Kennedy schrieb:
wieder ein Bug der mich und meine bescheidenen Programmierkünste zum verzweifeln bringt.
Mit Sicherheit nicht ! Der Bug sitzt zu 99.9% vorm Monitor.
Vielleicht liegt es ja an den Steuerzeichen, die in der jeweiligen Zeile sind. Mit Sicherheit 'verzählt' sich die Schleife nicht. abgesehen davon ist 'counter' irgendwo anders definiert, vielleicht hängt es ja da. Einfach den Debugger benutzen, dann siehst Du wo es klemmt.
Aber wie Du schon selbst bemerkt hast, brauch man da keine Schleife.
-
wenn beide Elemente TStrings beinhalten kann man auch Assign verwenden
Interface->Edit->Lines->Assign(Script);
-
Hallo
Ich sehe keinen Grund warum die Schleife nicht korrekt ablaufen sollte, wenn die manuelle Version auch funktioniert.
Aber die Schleife brauchst du wirklich nicht, das hier kopiert alles von Script ins MemoInterface->Edit->Lines->Assign (Script);
/edit : Ach nicht schon wieder...
bis bald
akari
-
Jap vielen Dank Problem gelöst (FOR Schleife entfernt), leider sind jez wieder zig weitere Bugs entstanden, die wohl auf gepfuschten Code zurückzuführen sind (die bei mir mittlerweile typischen ListIndexOutOfBounds Errors^^)
@OldMan:
Das der Bug von mir verursacht wurde ist mir klar, das die FOR Schleife ansich nicht funktioniert wäre schon recht komisch... Mit dem Debugger komm ich noch nicht recht klar, werd mir den mal zu Gemute führen müssen.
-
Kennedy schrieb:
Das der Bug von mir verursacht wurde ist mir klar
ok, dachte nur Du meinst es wäre ein bug vom Programm und JA beschäftige Dich mal mit dem Debugger, ist sehr hilfreich und im Grunde genommen unerläßlich.
-
Was war denn nun der Fehler?
-
Geht aus dem Beitrag nicht hervor.
Potentiell ist so etwas aber gefährlich:
for (counter = 0; counter < 12; counter++) Edit->Lines->Add (Script->Strings[counter]);
Hier wird nicht überprüft, ob in 'Script' überhaupt 12 Zeilen enthalten sind. Wenn nicht -> Index out of bounds... Man sollte immer überprüfen, ob eine Zeile tatsächlich vorhanden ist, bevor man auf sie zugreift. Das gilt für alle Listen.
Also lieber in der Art:
for (counter = 0; counter < Script->Count; counter++) Edit->Lines->Add (Script->Strings[counter]);
Oder aber wenn nur eine Teilmenge verwendet werden soll:
for (counter = 0; counter < 12; counter++) { if (counter >= Script->Count - 1) break; // Abbrechen, wenn Counter großer als die Anzahl der Einträge in der Liste Edit->Lines->Add (Script->Strings[counter]); }
-
Joe_M. schrieb:
Also lieber in der Art:
for (counter = 0; counter < Script->Count; counter++) Edit->Lines->Add (Script->Strings[counter]);
Noch lieber so:
for (int counter = 0, count = Script->Count; counter != count; ++counter) ...
Das spart u.U. (Script->Count - 1) Aufrufe des Property-Getters.
-
audacia schrieb:
Das spart u.U. (Script->Count - 1) Aufrufe des Property-Getters.
Dann sollten wir vielleicht erst mal rauskriegen, ob dieser Getter als O(n) oder als O(1) realisert ist.
-
witte schrieb:
Dann sollten wir vielleicht erst mal rauskriegen, ob dieser Getter als O(n) oder als O(1) realisert ist.
Warum? Selbst im letzten Fall sparst du ggf. jedesmal einen Funktionsaufruf.
-
Was nützt Dir das Einsparen eines Aufrufes, wenn Script->Count als O(n) implementiert ist. Dann ist
const unsigned int count = Script->Count; for (counter = 0; counter < count ; counter++) Edit->Lines->Add (Script->Strings[counter]);
erste Sparmaßnahme.
-
und wo ist jetzt dein Unterschied zu audacias Code? Mal abgesehen davon, dass count einmal in und einmal außerhalb der Schleife definiert wird.
-
Stimmt, ich habe sein Beispiel unter "Noch lieber so: " übersehen.
-
audacia schrieb:
Noch lieber so:
for (int counter = 0, count = Script->Count; counter != count; ++counter) ...
Das spart u.U. (Script->Count - 1) Aufrufe des Property-Getters.
Es ging aber doch um die 'index out of bounds' Problematik. Dies habe ich versucht am gegebenen Beispiel zu erklären.
Eine Optimierung wollte ich gar nicht einbringen und ist - in diesem Fall - wohl auch ziemlich sinnlos, da die Schleife nur 12 Durchgänge hat, wird wohl auch kaum viel mehr in der StringList sein. Außerdem ist der Getter bei TStringList::Count recht fix. Bei weniger als 1000 Zeilen in der StringList wird man keinen Unterschied bemerken. Sogar bei einer Million Zeilen liegt der Unterschied bei wenigen Millisekunden. IMHO vernachlässigbar...
-
Joe_M. schrieb:
Es ging aber doch um die 'index out of bounds' Problematik. Dies habe ich versucht am gegebenen Beispiel zu erklären.
Das mag ja sein, aber deine Anregung ist hinreichend allgemein (sie trifft auf fast alle VCL-Container zu), daher dachte ich, es wäre ganz sinnvoll, sie gleich möglichst optimal umzusetzen. Analog vielleicht dazu, daß man im Gebrauch von for-Schleifen auch Anfängern eher zum Vergleich auf Ungleichheit anstatt auf Relation sowie zum Präfix-Inkrementoperator rät, damit der Ansatz auch funktioniert, wenn sie eines Tages mal Iteratoren benutzen.
-
Auch wieder wahr...