Problem mit den LinkedLists

Für allgemeine Fragen zur Programmierung mit PureBasic.
phoffman
Beiträge: 7
Registriert: 04.11.2004 12:24
Wohnort: Oberelbert

Problem mit den LinkedLists

Beitrag 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
Benutzeravatar
stbi
Beiträge: 685
Registriert: 31.08.2004 15:39
Wohnort: Cleverly Hills

Beitrag von stbi »

läuft mit PB 3.91 wunderbar und ohne Fehler ... mit PB 3.92 crashts ... /:->

OS: XP Pro mit SP2
PB 4.02 XP Pro SP2 "Der Code ist willig, aber der Prozessor ist schwach."

Es gibt keine Vista-Witze. Es ist alles wahr!
Benutzeravatar
bobobo
jaAdmin
Beiträge: 3873
Registriert: 13.09.2004 17:48
Kontaktdaten:

Beitrag von bobobo »

was soll den das ganze Zeigergedöns?? .. lass das mal weg und es geht
‮pb aktuel 6.2 windoof aktuell und sowas von 10
Ich hab Tinnitus im Auge. Ich seh nur Pfeifen.
Benutzeravatar
DrShrek
Beiträge: 1970
Registriert: 08.09.2004 00:59

Beitrag 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:
Siehste! Geht doch....?!
PB*, *4PB, PetriDish, Movie2Image, PictureManager, TrainYourBrain, ...
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag 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.
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
Falko
Admin
Beiträge: 3535
Registriert: 29.08.2004 11:27
Computerausstattung: PC: MSI-Z590-GC; 32GB-DDR4, ICore9; 2TB M2 + 2x3TB-SATA2 HDD; Intel ICore9 @ 3600MHZ (Win11 Pro. 64-Bit),
Acer Aspire E15 (Win11 Home X64). Purebasic LTS 6.11b1
HP255G8 Notebook @AMD Ryzen 5 5500U with Radeon Graphics 2.10 GHz 3.4GHz, 32GB_RAM, 3TB_SSD (Win11 Pro 64-Bit)
Kontaktdaten:

Beitrag 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
Bild
Win11 Pro 64-Bit, PB_6.11b1
DarkDragon
Beiträge: 6291
Registriert: 29.08.2004 08:37
Computerausstattung: Hoffentlich bald keine mehr
Kontaktdaten:

Beitrag 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
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
NicTheQuick
Ein Admin
Beiträge: 8808
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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
Benutzeravatar
Andre
PureBasic Team
Beiträge: 1765
Registriert: 11.09.2004 16:35
Computerausstattung: MacBook Core2Duo mit MacOS 10.6.8
Lenovo Y50 i7 mit Windows 10
Wohnort: Saxony / Deutscheinsiedel
Kontaktdaten:

Beitrag von Andre »

@DarkDragon: also mit anderen Worten müsste die Dokumentation + Beispiele zu den LinkedLists angepasst werden ?
Bye,
...André
(PureBasicTeam::Docs - PureArea.net | Bestellen:: PureBasic | PureVisionXP)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag 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.
Antworten