ForEach() verursacht Fehler, NextElement() nicht...?!

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

ForEach() verursacht Fehler, NextElement() nicht...?!

Beitrag 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?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
Mr.X
Beiträge: 66
Registriert: 10.08.2005 22:46
Wohnort: im schönen OWL

Beitrag 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
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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....
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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...
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
THEEX
Beiträge: 804
Registriert: 07.09.2004 03:13

Beitrag 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?
Benutzeravatar
#NULL
Beiträge: 2237
Registriert: 20.04.2006 09:50

Beitrag 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..
my pb stuff..
Bild..jedenfalls war das mal so.
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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. ;)
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten