Seite 1 von 1
ForEach() verursacht Fehler, NextElement() nicht...?!
Verfasst: 17.02.2007 23:34
von AND51
Hallo!
Weiß nicht woran es liegt, aber es tritt ein re-produzierbarer Fehler im Programm auf, wenn ich sehr viele BMPs lade (Gesamtgröße > 250 MB) und dabei Daten in mehreren LLs wälze.
Ich verwende an einer Stelle im Programm folgenden
Code: Alles auswählen
ForEach einstellungen_liste()
If \key = LCase(key)
res=\value
Break
EndIf
Next
Dieser Code funktioniert einwandfrei, er verursacht nur unter ganz bestimmten Umständen einen Absturz. Diese Umstände habe ich aber noch nicht genau erforscht.
Nun bin ich auf diesen Code umgestiegen:
Code: Alles auswählen
ResetList(einstellung_liste())
While NextElement(einstellung_liste())
If \key = LCase(key)
res=\value
Break
EndIf
Wend
Dieser Code tut ja genau das gleiche, wie der alte Code.
Wenn ich aber nun die selben Schritt im Programm ausführe, die beim alten Code einen ABsturz hervorriefen, so bleibt der neue Code standhaft und arbeitet korrekt.
Weiß jemand woran es liegen kann?
Verfasst: 18.02.2007 11:18
von Mr.X
Hi AND51,
(klingt wie Hi-End 51, egal)
ich halte es für Zufall, daß Deine While-Next-Schleife mit NextElement() funktioniert. Um ein Element einer (strukturierten) Liste anzusprechen solltest Du korrekterweise immer
schreiben.
In Deinem Fall also:
Code: Alles auswählen
ForEach einstellungen_liste()
If einstellungen_liste()\key = LCase(einstellungen_liste()\key)
res=einstellungen_liste()\value
Break
EndIf
Next
oder
Code: Alles auswählen
ResetList(einstellung_liste())
While NextElement(einstellung_liste())
If einstellung_liste()\key = LCase(einstellung_liste()\key)
res=einstellung_liste()\value
Break
EndIf
Wend
Alternativ kannst Du die Felder einer Struktur in einem "With ... EndWith"-Block ansprechen. Also etwa
Code: Alles auswählen
With einstellung_liste()
If \key = LCase(\key)
res=\value
Break
EndIf
EndWith
aber nicht den "\" for Deinem Element-Namen vergessen !!
Mr.X
Verfasst: 18.02.2007 11:23
von AND51
> klingt wie Hi-End 51, egal)
Hat noch nie einer gesagt... Ist ja lustig
Übrigens: Ich habe das ganze in einen
With/
EndWith Block gepackt (warum habe ich das nur nicht dahingeschrieben?)
Schlimm ist es ja nicht, es funktioniert ja. Nun eigentlich ist es schon schlimm, denn ich will lieber ForEach als was anderes...
Falls noch jemand eine Idee hat, kann er sie ja posten.
Ich greife übrigens nur innerhalb einer Procedure auf diese LinkedList zu, die innerhalb dieser Procedure als Static definiert wurde. Somit kann kein anderer Code en Absturz verursacht haben.
Verfasst: 18.02.2007 12:42
von Kaeru Gaman
Lo, AND
probier doch mal, ob der error auch auftritt, wenn du in deiner for-each
den elementnamen ausschreibst und das With/EndWith wegläßt....
Verfasst: 18.02.2007 12:59
von AND51
Könnt ich machen, habe ich noch nicht versucht.
Das wäre aber einzig ein Beweis dafür, dass PB buggy ist; ob ich nun With benutze oder es ausschreibe...
Verfasst: 18.02.2007 13:39
von THEEX
rofl.... ich frag mich grad, versteh ich da etwas nicht oder steht AND51 auf'm Schlauch.... In Deinem ersten Beispiel schreibst den Listennamen anders, als im 2. Beispiel. Das würde auch erklären, warum das Erstere nicht geht. Oder hast Dich nur hier im Forum vertippt?
Das war's doch, auf was Kearu hinaus wollte?
Verfasst: 18.02.2007 14:21
von #NULL
AND51 hat geschrieben:...
Ich greife übrigens nur innerhalb einer Procedure auf diese LinkedList zu, die innerhalb dieser Procedure als Static definiert wurde.
...
es gab unter PB mal probleme mit static string variablen. ich weiß aber weder ob das behoben wurde, noch ob das bei LLs eine rolle spielt(e).
<edit>
http://www.purebasic.fr/german/viewtopi ... static+bug
scheint mittlerweile in 4.02 nochmal anders zu sein, aber funktioniert immernoch nicht..
Verfasst: 18.02.2007 15:09
von Kaeru Gaman
> In Deinem ersten Beispiel schreibst den Listennamen anders, als im 2. Beispiel.
> Das war's doch, auf was Kearu hinaus wollte?

nein, das hab ich auch übersehen.
dann ist allerdings zu vermuten, dass lediglich der listenname falsch war...
meine intension war lediglich, zu prüfen,
ob es ein With <-> ForEach konflikt ist,
oder ein LocalList <-> ForEach konflikt.

Verfasst: 18.02.2007 17:01
von AND51
Ja, ich hatte den alten ForEach Code schon gelöscht.
Ich arbeite mit EnableExplicit, es kann also nicht an Tpipfelhrn liegen. Selbst wenn ich ohne EnableBlablabla arbeiten würde, käme eine Fehlermeldung.