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

Code: Alles auswählen

Liste()\StrukturFeld
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 :lol:


Ü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... :freak:

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 Bild

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?

:lol: 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.