Seite 1 von 2

LinkedList läuft endlos durch

Verfasst: 17.03.2009 13:23
von Hyper
Hallo Gefährten,

ich bin jetzt schon den zweiten Tag an einem sehr hartnäckigen Problem. Mir sind zuerst fast die Augen rausgefallen: Ich habe mich gewundert, dass mein Programm in eine Endlosschleife läuft. Debugging zeigt, dass eine Liste mit 2 Elementen nach ForEach wieder vorn anfängt. Im Debugger sehe ich:
aktuelles Element 0, 1, 0, 1 usw.
Ebenso Endlosschleife bei

Code: Alles auswählen

While NextElement
;...
Wend
Durch Vergleich meiner Versionen habe ich dann den Verursacher gefunden: In einer Procedure stand

Code: Alles auswählen

Protected l_var1.s, l_ 
Mache ich dieses l_ weg, ist alles ok! Ich hatte hier eigentlich eine andere Variable und hatte aus Versehen den Schwanz gelöscht.
Ich habe nun vergeblich versucht, ein Minitestprogramm zu erstellen. Prinzipiell ist die Situation die:

Code: Alles auswählen

Structure st_s1
  s1.s
  i1.l  
EndStructure

; Definition der globalen Liste 
Global NewList li_l1.st_s1() 

Structure st_s2
  s2.s
  i2.l  
EndStructure

Global VariableY.st2
Define.Byte 

; ...

; Zufügen von Elementen zu li_l1()...

Procedure   ProcA()
  ;/ -----------------------------------------------------------------------------
  ;/ ...
  ;/ -----------------------------------------------------------------------------    
  Protected l_var1.s, l_  ; Mache ich dieses l_ weg, ist alles ok!
  
  ; ...
  
EndProcedure


; in einer Procedure Durchlauf durch die Liste, und er läuft endlos durch. 
; While NextElement erkennt nicht, dass die Liste zu Ende ist
; ForEach ebenfalls nicht.

Jetzt habe ich im Debugger mal geschaut, was in ProcA() in Variable l_ steht. Erst einmal sehe ich: Sie hat eine Struktur, die ich für eine andere Variable verwende (st2). Da steht auch in den Stringvariablen was drin!

Vielleicht noch wichtig: Der Fehler kommt nur in einer Liste vor (nicht bei allen Listen) und nur, wenn diese mehr als 1 Element hat. Es ist mir ein Rätzel. Ich habe leider keine Ahnung, wie ich den Fall besser beschreiben soll. Eine Zerpflückung des Programms kommt nicht in Frage. Evtl. wäre ein Debugging per YouTube aufschlussreich.

Ich lösche die Variable l_ und komme weiter. Evtl. hilft meine Beschreibung...

Verfasst: 17.03.2009 14:22
von PMV
Jedes mal wenn ich so ein verhalten hatte lag es darann, weil ich
ausversehen das aktuelle Element der Linked Liste in der Schleife verändert
habe. Ich kann mir nicht vorstellen, dass der Fehler bei PB liegt. Du hast
sicher irgend wo einfach nur einen Denkfehler.

Aber egal welcher Grund wirklich dahinter steckt, du musst dein Programm
zerflücken wenn du den Fehler finden möchtest. Weder du noch wir können
mit einer Glaskugel arbeiten :D Und leider ist es nun mal so, dass wirklich
Fehler jeder Zeit in PB auftreten können ... weshalb bei großen
Projekten mit PB es um so wichtiger ist, dass man auch wirklich jeder Zeit
sein Programm auf herz und Nieren prüfen kann.

MFG PMV

Verfasst: 17.03.2009 17:35
von Hyper
Hallo PMV,

ich denke, ich hätte zunächst eine ähnliche Antwort gegeben. Aber schau, ich habe wirklich nur in einer vollkommen anderen Prozedur in der lokalen Datendeklaration diese Zeichen entfernt: ", l_" und damit lief alles wieder. Mir ist vollkommen unklar, was die PB-eigenen LinkedList-Befehle hiermit zu tun haben können.

Das mit dem zerpflücken ist leicht gesagt, aber ich kann nicht einfach bestimmte Funktionen ausbauen: Sind die Fenster nicht definiert, können keine Gadgets drauf. Ohne Gadgets, kann ich die Inhalte nicht in Listen befüllen, usw., usw.

Evtl. hat einer der PB-Entwickler bei meiner Beschreibung eine Idee, ich helfe auch gern bei der Fehlersuche...

Verfasst: 17.03.2009 17:54
von DarkDragon
Hyper hat geschrieben:Hallo PMV,

ich denke, ich hätte zunächst eine ähnliche Antwort gegeben. Aber schau, ich habe wirklich nur in einer vollkommen anderen Prozedur in der lokalen Datendeklaration diese Zeichen entfernt: ", l_" und damit lief alles wieder. Mir ist vollkommen unklar, was die PB-eigenen LinkedList-Befehle hiermit zu tun haben können.

Das mit dem zerpflücken ist leicht gesagt, aber ich kann nicht einfach bestimmte Funktionen ausbauen: Sind die Fenster nicht definiert, können keine Gadgets drauf. Ohne Gadgets, kann ich die Inhalte nicht in Listen befüllen, usw., usw.

Evtl. hat einer der PB-Entwickler bei meiner Beschreibung eine Idee, ich helfe auch gern bei der Fehlersuche...
Den kompletten Quelltext rausrücken wär vllt. eine Idee.

Verfasst: 17.03.2009 18:13
von STARGÅTE
ich habe da nur so n Ahnung als hätte was was mit ASM zu tun,

da ist ja p_Test auch der Pointer in PB also *Test

vllt ist dann auch l_Test die Liste Test() ...

Verfasst: 17.03.2009 18:17
von ts-soft
test ist ein geschütztes Keyword, wenn Inline ASM enabled ist.

Verfasst: 17.03.2009 18:17
von DarkDragon
STARGÅTE hat geschrieben:ich habe da nur so n Ahnung als hätte was was mit ASM zu tun,

da ist ja p_Test auch der Pointer in PB also *Test

vllt ist dann auch l_Test die Liste Test() ...
Nein. Bei variablen wird ja stets "v_" bzw. "v." davorgehängt, dann kann es keine Störung durch internal Symbols geben. Sonst könnte man auch nicht PB_ResizeWindow oder _PB_ResizeWindow als Variable verwenden. Das wär ja Blödsinn.

"l_" ist allerdings tatsächlich ein präfix, welches in internals verwendet wird (Labels), doch da es hier ja als Variable benutzt wird, wird es umgewandelt nach "v_l_" bzw. "v.l_".

Verfasst: 17.03.2009 20:11
von PMV
Hyper hat geschrieben:Hallo PMV,

ich denke, ich hätte zunächst eine ähnliche Antwort gegeben. Aber schau, ich habe wirklich nur in einer vollkommen anderen Prozedur in der lokalen Datendeklaration diese Zeichen entfernt: ", l_" und damit lief alles wieder. Mir ist vollkommen unklar, was die PB-eigenen LinkedList-Befehle hiermit zu tun haben können.
ich weis was du meinst ... vorallem wenn es wirklich an PB liegt ist die
suche meist sehr Problematisch. Man kann aber immer Code Stück für
Stück weg nehmen wenn man ordentlich strukturiert hat :mrgreen:

Du hast ja ne Ahnung worann es liegt ... entsprechend kannst du z.b.
das Fenster auf diese eine Liste beschränken oder anstelle des Fensters
einfach den Debugger als Ausgabe nehmen. Ich vermute mal, dass du
irgend wo in den Speicher schreibst, wo du nicht rein schreiben dürftest.
Wenn ich neuen Code schreib und da noch blöde Schreibfehler drinn sind
hab ich schon die abenteuerlichsten Ergebnisse gehabt :lol: bei dir kann ich
mir auch ein Logikfehler vorstellen ... passiert mir auch manchmal :|

Fals du denn dann deinen Code zerpflückt hast oder 100% sicher bist,
dass es an PB liegt und 100% ist ohne zerpflücken eigentlich nicht
erreichbar ... dann würd ich dir empfehlen freak hier ne PN zu schreiben ob
der dir helfen könnte oder noch besser, das englische Forum bemühen. Die
letzten male wo ich tatsächlich mit PB kollidiert bin war dort freak auch zu
meiner freude sofort zur Stelle (allerdings war das eher zu
nachtschlafender Zeit :lol: )

MFG PMV

Verfasst: 17.03.2009 22:53
von Hyper
Wie ich vermutete, gibt es Menschen, die sich hier auskennen und sich evtl. vorstellen können, woran es liegt. Evtl. tritt ein ähnlicher Fehler auf und mit meinem kann man sich dann, so wie in einem PM-Rätzel, den Fall erklären.

Was kann ich noch tun?
- Kompletten Quelltext veröffentlichen scheidet aus, da ich das Programm als Produkt verkaufe, ich bitte um Verständnis.
- Quelltext zerpflücken, und Stück für Stück nachschauen, ob der Fehler noch da ist, sorry PMV die Zeit habe ich nicht.
- Wenn sich den Fall jemand bei mir anschauen möchte, der sich damit auskennt: Ich wohne in Südhessen und hab auch immer ein Fläschchen Bier im Haus...

PS: Was mir noch auffällt: Normalerweise deklariere ich Variablen ja so:

Code: Alles auswählen

Protected {Variable}.{Typ}
Hier hatte ich ja durch den Tippfehler gar keinen Typ angegeben (Im Debugger sah ich dann, dass er einen von mir definierten Strukturtyp verwendete)... evtl. hilft es...

Verfasst: 17.03.2009 23:17
von Kiffi
Hyper hat geschrieben:Was kann ich noch tun?
wenn die Version in Deiner Sig stimmt, dann könntest Du das mal mit PB 4.3
ausprobieren. U.u. tritt dieses Phänomen dort nicht mehr auf.

Grüße ... Kiffi