LinkedList läuft endlos durch

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Benutzeravatar
Hyper
Beiträge: 194
Registriert: 19.04.2005 19:14

LinkedList läuft endlos durch

Beitrag 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...
PB 5.72
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
Hyper
Beiträge: 194
Registriert: 19.04.2005 19:14

Beitrag 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...
PB 5.72
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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.
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7032
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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() ...
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag von ts-soft »

test ist ein geschütztes Keyword, wenn Inline ASM enabled ist.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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_".
Angenommen es gäbe einen Algorithmus mit imaginärer Laufzeit O(i * n), dann gilt O((i * n)^2) = O(-1 * n^2) d.h. wenn man diesen Algorithmus verschachtelt ist er fertig, bevor er angefangen hat.
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag 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
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Benutzeravatar
Hyper
Beiträge: 194
Registriert: 19.04.2005 19:14

Beitrag 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...
PB 5.72
Benutzeravatar
Kiffi
Beiträge: 10715
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Beitrag 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
a²+b²=mc²
Antworten