Seite 1 von 2

Problem mit den LinkedLists

Verfasst: 04.11.2004 12:49
von phoffman
Hallo alle zusammen,

ich will ein Programm unter verwendung der LinkedLists schreiben. Leider bekomme ich immer wieder eine Fehlermeldung, die besagt, daß das Programm wegen eines ungültigen Vorgangs geschlossen wird. Es wird ein Fehler durch eine ungültige Seite gemeldet. Ich habe jetzt den Beispielcode aus der Hilfe übernommen und erweitert. Hier tritt jetzt der gleiche Fehler auf...

Hier der Code:

Code: Alles auswählen

; Eine kleine Struktur, um die Beschreibung für "fortgeschrittene Anwender" (siehe oben) zu demonstrieren 
Structure supergeek 
*next.supergeek 
*previous.supergeek 
name.s 
strength.b 
EndStructure 
    
DefType.supergeek *dev           ; Dies wird für den Zugriff auf die Listenelemente benutzt 
NewList programmers.supergeek()  ; Die Liste zum Speichern der Elemente 
    
*dev = AddElement(programmers()) 
If *dev<>0 
  MessageRequester("TEST","0")
  *dev\name = "dave" 
  *dev\strength = 4   ; Wow, super-strong geek! ;) 
Else 
  MessageRequester("Fehler!", "Kein Speicherplatz zum Reservieren des neuen Elements", #PB_MessageRequester_Ok) 
EndIf 
*dev = AddElement(programmers()) 
If *dev<>0 
  MessageRequester("TEST","1")
  *dev\name = "dave" 
  *dev\strength = 3   ; Wow, super-strong geek! ;) 
Else 
  MessageRequester("Fehler!", "Kein Speicherplatz zum Reservieren des neuen Elements", #PB_MessageRequester_Ok) 
EndIf 
*dev = AddElement(programmers()) 
If *dev<>0 
  MessageRequester("TEST","2")
  *dev\name = "dave" 
  *dev\strength = 2   ; Wow, super-strong geek! ;) 
Else 
  MessageRequester("Fehler!", "Kein Speicherplatz zum Reservieren des neuen Elements", #PB_MessageRequester_Ok) 
EndIf 
*dev = AddElement(programmers()) 
If *dev<>0 
  MessageRequester("TEST","3")
  *dev\name = "dave" 
  *dev\strength = 1   ; Wow, super-strong geek! ;) 
Else 
  MessageRequester("Fehler!", "Kein Speicherplatz zum Reservieren des neuen Elements", #PB_MessageRequester_Ok) 
EndIf 
*dev = FirstElement(programmers())
MessageRequester("TEST " + Str(i), "Name: " + *dev\name + Chr(13) + "Strength: " + Str(*dev\strength))
*dev = NextElement(programmers()) ;<--- genau hier tritt der Fehler auf !!!
MessageRequester("TEST " + Str(i), "Name: " + *dev\name + Chr(13) + "Strength: " + Str(*dev\strength))
*dev = NextElement(programmers())
MessageRequester("TEST " + Str(i), "Name: " + *dev\name + Chr(13) + "Strength: " + Str(*dev\strength))
*dev = NextElement(programmers())
MessageRequester("TEST " + Str(i), "Name: " + *dev\name + Chr(13) + "Strength: " + Str(*dev\strength))
Der Fehler tritt am Ende des Programms bei der ersten Zeile *dev = NextElement(programmers()) auf
Ich nutze für dieses Programm Windows 98 SE als System, aber auch unter Windows XP gibt es den Fehler.

Wer kann mir weiterhelfen ?

Vielen Dank im Voraus

Gruß

Peter

Verfasst: 04.11.2004 13:43
von stbi
läuft mit PB 3.91 wunderbar und ohne Fehler ... mit PB 3.92 crashts ... /:->

OS: XP Pro mit SP2

Verfasst: 04.11.2004 14:00
von bobobo
was soll den das ganze Zeigergedöns?? .. lass das mal weg und es geht

Verfasst: 04.11.2004 14:40
von DrShrek
So ist es besser:

Code: Alles auswählen

*dev = AddElement(programmers()) 
If *dev<>0 
  MessageRequester("TEST","0") 
  programmers()\name = "dave" 
  programmers()\strength = 4   ; Wow, super-strong geek! ;) 
Else 
....
Uebrigends der 'orginal Beispiel Source Code zu 'AddElement' lautet:

; Eine kleine Struktur, um die Beschreibung für "fortgeschrittene Anwender" (siehe oben) zu demonstrieren

Code: Alles auswählen

  Structure supergeek 
    *next.supergeek 
    *previous.supergeek 
    
    name.s 
    strength.b 
  EndStructure 
    
  DefType.supergeek *dev           ; Dies wird für den Zugriff auf die Listenelemente benutzt 
  NewList programmers.supergeek()  ; Die Liste zum Speichern der Elemente 
    
  *dev = AddElement(programmers()) 
  If *dev<>0 
    *dev\name = "dave" 
    *dev\strength = 3   ; Wow, super-strong geek! ;) 
  Else 
    MessageRequester("Fehler!", "Kein Speicherplatz zum Reservieren des neuen Elements", #PB_MessageRequester_OK) 
  EndIf 
...
usw...
Was issen hier etzt richtig :shock:

Verfasst: 04.11.2004 15:15
von Andre
@Peter: bei crashst auch unter PB3.92 (Version vom 25.10.04) gar nichts, wenn auch die Anzeige erst beim vierten Element korrekt funktioniert (vorher "Test" +0, 1, 2) !? Habe allerdings keine Ahnung über evtl. interne Änderungen bei den LinkedLists seit v3.91...

Ansonsten würde ich - wie schon bobobo sagte - die ganze "Pointer-Spielerei" weglassen. Die ganze Handhabung lässt sich auch bequem ohne bewerkstelligen.

Verfasst: 04.11.2004 15:24
von Falko
stbi hat geschrieben:läuft mit PB 3.91 wunderbar und ohne Fehler ... mit PB 3.92 crashts ... /:->

OS: XP Pro mit SP2
Das meine ich auch, warum in PB 3.91 und nicht in PB3.92?
Was ist denn anders, könnte man hier fragen, oder?

MfG Falko

Verfasst: 04.11.2004 15:36
von DarkDragon
Der aufbau von LLs ist nun anders. Seht euch mal die beschleunigten funktionen an. Die sind nicht umsonst schneller geworden.

[EDIT] Hier mal ein beispiel, das unter PB 3.92 sicher funktioniert:

Code: Alles auswählen

Structure Test
  ID.l
  X.l
  Y.l
  Z.l
EndStructure

NewList Test.Test()

Procedure GetElement(*LL, Index, StructSize)
  *P = AllocateMemory(StructSize)
  CopyMemory(*LL+(Index*(2*StructSize)), *P, StructSize)
  ProcedureReturn *P
EndProcedure

For k=0 To 3
  AddElement(Test())
  Test()\ID = k
  Test()\X = 1
  Test()\Y = 2
  Test()\Z = 3
Next

FirstElement(Test())

*P.Test = GetElement(@Test(), 0, SizeOf(Test))
Debug *P\ID
Debug *P\X
Debug *P\Y
Debug *P\Z

Debug "---"

*P.Test = GetElement(@Test(), 1, SizeOf(Test))
Debug *P\ID
Debug *P\X
Debug *P\Y
Debug *P\Z

Debug "---"

*P.Test = GetElement(@Test(), 2, SizeOf(Test))
Debug *P\ID
Debug *P\X
Debug *P\Y
Debug *P\Z

Verfasst: 04.11.2004 15:43
von NicTheQuick
Das merwürdige ist, dass es so funktioniert:

Code: Alles auswählen

i.l = 0
ForEach programmers()
  *dev = @programmers() - 8
  MessageRequester("TEST " + Str(i), "Name: " + *dev\Name + Chr(13) + "Strength: " + Str(*dev\strength)) 
Next

Verfasst: 04.11.2004 16:20
von Andre
@DarkDragon: also mit anderen Worten müsste die Dokumentation + Beispiele zu den LinkedLists angepasst werden ?

Verfasst: 04.11.2004 16:50
von NicTheQuick
Nanu? Was hat sich denn alles verändert?

@DarkDragon: Weißt du genaueres über die Änderungen bei den LinkedLists? Eine ausführliche Beschreibung wäre wohl mal angebracht. Denn deinen Code hier verstehe ich noch nicht so wirklich.