LinkedLists mal anders

Hier kann alles mögliche diskutiert werden. Themen zu Purebasic sind hier erwünscht.
Flames und Spam kommen ungefragt in den Mülleimer.

Welcher Meinung seit ihr, wie LinkedLists ermöglich werden sollen?

Die Aktuelle Methode von PureBasic (also via "NewList")
16
67%
Mein Vorschlag (Dynamische Variante)
6
25%
Hauptsache die LinkedLists sind irgendwie möglich (Brauche keine Datenbäume)
1
4%
Mir ist es egal. Habe sie noch nie wirklich genutzt...
1
4%
 
Insgesamt abgegebene Stimmen: 24

Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Thorium hat geschrieben: ReDim hätte den Vorteil das SizeOf stimmen würde.
SizeOf geht aber auch, mittels eines Tricks:

Code: Alles auswählen

Structure ABYTE
	StructureUnion
	  b.b[0]
	  ThisIsADummyByte.b
	 EndStructureUnion
EndStructure

Structure TEST
  Data1.l
  Data2.s
  *DynamicMem.ABYTE
EndStructure

atest.TEST

atest\DynamicMem = AllocateMemory(30 * SizeOf(ABYTE))

For i = 0 To 29
  atest\DynamicMem\b[i] = i + 47
Next

OpenConsole()

PrintN(PeekS(atest\DynamicMem))
PrintN(Str(SizeOf(test)))
Input()

CloseConsole() 
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

Mein Vorschlag:

Code: Alles auswählen

Structure MeinDings
  NewList Hallo.l()
  Dim Test.b(10)
  x.l=10
  y.l=20
EndStructure

Global NewList Liste.MeinDings()

Das würde bedeuten, dass ein AddElement(Liste())
gleich eine neue Liste in der Liste erstellt, ein Array von 11 Feldern
und die Variablen der Struktur x und y die Standardwerte 10 bzw. 20
zugewiesen bekommen.

Ich hab auch noch nicht den Sinn verstanden, wieso es
überhaupt eckige Klammern gibt.

List()\Test(0)=4
List()\Hallo()=1

Da kann es doch nie zu verwechslungen führen oder doch?

Wozu gibt es eckige Klammern?
Da würde ich es sinnvoller finden, wenn man dann
nur eckige Klammern benutzt, um ein Array leichter von
einer Funktion / Prozerur zu unterscheiden.

A=Hallo(0)
Hier könnte Hallo auch eine Prozedur mit Return-Wert sein.

In Pascal sind Arrays immer [..] so definiert.
Und wozu müssen Listen Klammern haben?


:roll:
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
Thorium
Beiträge: 1722
Registriert: 12.06.2005 11:15
Wohnort: Germany
Kontaktdaten:

Beitrag von Thorium »

Xaby hat geschrieben: Wozu gibt es eckige Klammern?
Da würde ich es sinnvoller finden, wenn man dann
nur eckige Klammern benutzt, um ein Array leichter von
einer Funktion / Prozerur zu unterscheiden.
Das hat schon seinen Hintergrund und Sinn. Die Eckigen Klammern bedeuten das es sich um ein WinAPI konformes Array handelt. Zum einen bedeutet es das es ein statisches Array ist und nicht der Pointer zum Array in der Struktur gespeichert wird, sondern tatsächlich das Array selbst. Zum anderen bedeutet es das bei der Anzahl der Felder die 0 nicht als Feld mitgerechnet wird. Also wenn du ein Array[3] erstellst hast du die Felder 0,1,2 und wenn du ein Array(3) erstellst die Felder 0,1,2,3. Das ist wie gesagt um konform mit der WinAPI zu laufen für direkte Anwendung von WinAPI-Strukturen. Dort wird die 0 nämlich nicht als Feld gezählt.
Zu mir kommen behinderte Delphine um mit mir zu schwimmen.

Wir fordern mehr Aufmerksamkeit für umfallende Reissäcke! Bild
Benutzeravatar
Xaby
Beiträge: 2144
Registriert: 12.11.2005 11:29
Wohnort: Berlin + Zehdenick
Kontaktdaten:

Beitrag von Xaby »

@Thorium

Jetzt wo du es sagst, fällt es mir auch wieder ein :)

Ich versuche so weit es geht, WinAPI zu vermeiden, da ich
gern plattformübergreifend arbeite

Ist halt nur etwas merkwürdig, wenn man Pascal, JAVA und C++/C#
hat und dort die [..] sieht und die eher wie Dim funktionieren.

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>

Was mir etwas unbegreiflich ist:

Ein String ist doch auch ein dynamisches Dim of Char

Oder wie? Nachteil ist natürlich, dass man für Strings immer
spezielle Prozeduren benötigt, um die Strings in Stücke zu schneiden,
oder etwas darin zu suchen oder zu ersetzen

:roll:

Aber letztendlich ist es ja nur ne Interpretationssache vom
Compiler. Vielleicht könnte man auch einen PreCompiler anschließen,
der neue Listen in Form von Strings erstellt.
Und die einzelnen ListenElemente sind dann mit
Trennzeichen abgetrennt aufgefedelt in dem String.

Stelle ich mir aber "Scheiße" langsam vor. /:->
Kinder an die Macht http://scratch.mit.edu/
Benutzeravatar
Hroudtwolf
Beiträge: 1416
Registriert: 30.10.2004 23:33
Kontaktdaten:

Beitrag von Hroudtwolf »

Aber letztendlich ist es ja nur ne Interpretationssache vom
Compiler. Vielleicht könnte man auch einen PreCompiler anschließen,
der neue Listen in Form von Strings erstellt.
Und die einzelnen ListenElemente sind dann mit
Trennzeichen abgetrennt aufgefedelt in dem String.

Stelle ich mir aber "Scheiße" langsam vor. well...
Und hat nichts mehr mit LinkedLists zu tun.

Eine LinkedLists besteht aus unabhängigen miteinander durch Referenzen verknüpfte Datensätzen.

Illustration:
Bild

Jeder Datensatz liegt dabei in einem eigenen Speicherblock.
Insgesamt sind alle Datensätze über ihre Referenz im Sinne ihrer Speicheradressen in einer Kette verknüpft.
Der linke Datensatz kennt die Adresse des Rechten und umgekehrt.
Wobei das lediglich die doppelt verknüpften Listen betrifft.
Bei einfach verknüpften Listen kennt ein Element-Datensatz nur seinen nächsten Nachbarn in der Kette.

Es ist ein Leichtes sich so ne Liste selbst zu basteln.

MfG

Wolf
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

@PMV:
sei dir da nicht so sicher. das bemerkt man nur, wenn man dies sehr oft macht. dabei ist wohl nur die "PB-interne oder Systeminterne" Verwaltung betroffen. der inhalt der Strings ist weg bzw. dessen speicher, nicht aber der für die Verwaltung des Strings in der Struktur verbrauchten platzes (4 Byste glaube ich je String in der5 Struktur und je aufruf).

Ich hatte so z.B. eine Linked simuliert, die ich jedesmal löschte, wenn das PRG auf "idle" stand, um dem system den nicht benötigenten Speicher zurück zu geben. In einem anderen Fall hatte ich daten in einer originalten LL und mußte dann relativ oft eine Dynamische Bäumstruktur als LL erstellen. Das ging super über meine dynamische LL (rudimentäre Funktionen gingen damals). In der simulierten dynamischen LL waren so glaube ich in der Struktur ca. 10 strings neben anderen daten drinn. über 10 000 einträge, oder mehr, weis nicht mehr so genau. das heißt das hier schon 100 000 mal 4 bytes je aufruf wegfallen.
da kam es schon mal vor, das ein speicherleg von hunderten Megabytes in Minuten auftrat.

Leider sind nach einem Festplattencrash die DebugCodes von mir weg die es aufzeigen und durch die einige von euch (oder war es sogar Andre,Fred, der erklären konnte warum dies passiert) einen ASMworkaround aufzeigten. Ich kann daher nicht sagen, ob der folgende Code das Problem richtig darstellt, aber auslösen tut es auf jeden Fall ein Speicherleck. Mal sehn ob ich noch was dazu im forum finde.


Code: Alles auswählen

Structure LL_demo
  *last
*next
ersterwert.b
zweiterwert.s
EndStructure

OpenConsole()

For i = 1 To 30000000
  *atest.LL_demo= AllocateMemory(30)
  *atest\zweiterwert = "So knnte man ein Addelement simulieren, nach dem freememory aber wird nicht alles freigegben. Siehe Taskmanager"
  ; im taskmanager solltet iihr unter "prozesse" unbedingt die Spalte "Virtueller Speicher" anzeigen, das zeigt dann auf jeden Fall das ganze Ausma
  ;*atest\zweiterwert = "" ;selbst mit der Zeile knnt ih rnoch erkennen was ich meine.
  FreeMemory(*atest)
  If display.l = 1000
    display = 0
    PrintN(Str(i))
  Else
    display + 1
  EndIf
Next

Input()

CloseConsole() 
Delay(50000)
habe mein altes Thema noch gefunden. Den alten Code unter
http://www.purebasic.fr/german/viewtopi ... ght=memory
aber noch nicht wieder getestet. Ist mir heute zu spät geworden.

ICh weiß zwar noch, das es sich hierbei um keinen Bug im eigendlichen Sinne handelt, aber wenn man eine eigene dynamische LL bauen will, dann muß man dies UNBEDINGT beachten. Gruß
Toshy
1. Win10
PB6.1
Benutzeravatar
PMV
Beiträge: 2765
Registriert: 29.08.2004 13:59
Wohnort: Baden-Württemberg

Beitrag von PMV »

Toshy hat geschrieben:@PMV:
sei dir da nicht so sicher. das bemerkt man nur, wenn man dies sehr oft macht.
Ich bin mir sicher, habs extra ausführlich getestet ... ohne das Freigeben
mit der Prozedur von mk-soft steigt der Verbrauch kontinuierlich stark an,
mit seiner Prozedur keine Speicherlecks. Das ist übrigends so ein ASM-
Workaround :wink:

Glaub 1 Million mal 500 Elemente erstellt und wieder freigegeben. Jedes
Element besteht aus einer Struktur, die min. 1 String beinhaltet.

Das was ich da hab ist übrigends eine DLL, die eine Linked-Liste zurück
gibt, aber nicht die von PB :wink: ... so lang die Rückgabe nur zum lesen
verwendet wird und die Liste dann zum freigeben wieder an die DLL
abgegeben wird, keine Probleme :D

Sollte mir doch mal was auffallen, meld ich mich :D

MFG PMV
alte Projekte:
TSE, CWL, Chatsystem, GameMaker, AI-Game DLL, Fileparser, usw. -.-
Toshy
Beiträge: 713
Registriert: 22.03.2005 00:29
Computerausstattung: Computer und Strom vorhanden
Wohnort: LK Wolfenbüttel

Beitrag von Toshy »

Dann ist gut. Hatte dazu nur nix im Beitrag gelesen. Muß wohl übersehen haben bzw. vergessen, daß MK-soft hier im Beitrag was "freestructurestrings" schrieb.

Nur wer den Beitrag damals bzw. nachträglich nicht gelesen hatte oder vergessen (du warst ja glaube einer die mit in dem Beitrag von damals geschrieben haben), dem muß das halt gesagt werden. Da auch andere diesen Beitrag nachträglich lesen, denke ich ist der Hinweis darauf ok.

Aber wir sollten trotz der "Laberecke" mal auf das eigendliche Thema zurückkommen.

Die Diskussion um eine dynamische LinkedList.
Man kann sich zwar behelfsmäßig einiges zusammenbasteln, aber es wird nie so gut sein wie die originalen LinkedList. Ich nutze seit kurzem sehr gerne die Sortierbefehle der LL weil diese super schnell ist, selbst könnte ich das nie so schnell nachbauen. Daher wäre mir sobald als möglich eine dynamische zu erstellende Version der LL sehr lieb. Auch wenn es nicht so schnell kommen sollte, man könnte hier ja mal überlegen wie dies im Ergeniss aussehen müßte.
1. Win10
PB6.1
Antworten