![]() |
TList / dyn. Array - Was steckt dahinter?
Hallo zusammen,
mein Info-Lehrer hat mir gesteckt, dass sich hinter dynamsichen Arrays auch nur verkettete Listen verbergen und ich habe herausgefunden, dass die TList wiederum nur das OOP Pendant zu einem dynamischen Array ist. Nun hätte ich mal rein interessehalber die Frage, wie das denn nun funktioniert. Gruß Mr_G |
Re: TList / dyn. Array - Was steckt dahinter?
Das ein dynamisches Array ein verkettete Liste ist, glaube ich nicht. Das interessante bei einem Array ist doch die konstante Zugriffszeit. Bei einer Liste hast du immer eine Zugriffzeit, die linear zur Größe der Liste ist.
Ich habe gelernt, dass ein dynamisches Array ein normales Array ist, dessen Größe automatisch verdoppelt wird, wenn es voll ist, bzw halbiert, wenn es nur noch zu 25% gefüllt ist. (Werte ohne Gewähr, sollte auch von der Implmenetierung abhängen.) Damit hast du (amortisiert) alle Aktionen (lesen, schreiben, löschen) in konstanter Zeit. |
Re: TList / dyn. Array - Was steckt dahinter?
'n dyn. array ist keine verkettet liste. denn die verkettete liste ist eine dynamische datenstruktur, das dyn.array nicht.
das dyn.array ist nix anderes als eine array of pointer, welche dynamisch vergrössert und verkleinert wird. das macht man entweder mit der hand oder man lässt es machen (z.b. tList, welches die entsprechenden routinen bereits integriert hat). |
Re: TList / dyn. Array - Was steckt dahinter?
Ein dynamisches Array ist in Delphi definitiv keine verkettete Liste. Es handelt sich bei Arrays in Delphi um zusammenhängenden Speicher. Schreibt man also über Elemte X drüber hinaus schreibt man in Element X+1 hinein. Da die Elemente direkt hintereinander liegen macht es auch keinen Sinn zusätzlich diese miteinander durch Pointer zu verketten da durch Berechnung klar ist wo ElementX liegt.
Zitat:
|
Re: TList / dyn. Array - Was steckt dahinter?
Wird bei einer Vergrößerung dann das alte Array in einen anderen Bereich kopiert oder besteht dass Array dann aus verschiedenen Stücken auf der Platte?
|
Re: TList / dyn. Array - Was steckt dahinter?
Danke für die zügigen Antworten!
Ich habe mir das irgendwie schon gedacht. Also entweder habe ich mich verhört oder mein Lehrer(:shock:) hat unrecht... Zitat:
|
Re: TList / dyn. Array - Was steckt dahinter?
dein info lehrer hat unrecht.
ganz einfach, weil du in das array alles mögliche verpacken kannst. vorteil von der array struktur ist, dass du auf die jeweiligen elemente direkt zugreifen kannst, das ging mit einer liste oder baum nicht, somit hast du die möglichkeit effiziente sortieralgorithmen darauf zu implementieren. 'n pointer ist einfach die effizienteste datengrösse, welche dein prozessor abarbeiten kann (integer), und ist einfach eine adresse im speicher... nicht mehr, nicht weniger. |
Re: TList / dyn. Array - Was steckt dahinter?
Zitat:
|
Re: TList / dyn. Array - Was steckt dahinter?
Natürlich ist ein Array auch ein Pointer aber praktisch alle Datentypen in Delphi sind Zeiger, auch wenn man davon meist nichts direkt mitbekommt.
Die treffenste Beschreibung hier ist der zusammenhängende Speicherbereich. Da der Datentyp ja feststeht hat der Speicherbereich die Größe der Summe aller Elemente mal der Datentypgröße. (n * SizeOf(TDatenTyp)) |
Re: TList / dyn. Array - Was steckt dahinter?
Zitat:
|
Re: TList / dyn. Array - Was steckt dahinter?
Genau. Ein array ist in Delphi ersteinmal ein Pointer auf dem Stack (oder in einem Prozessorregister), der auf einen Bereich im Heap zeigt. Dieser Bereich hat eine feste Größe. Wenn man setlength aufruft, verändert der Speichermanager diese Größe. Überschneidet sich die neue Größe mit anderen Daten, wird das Array - glaube ich - an eine andere Stelle kopiert, die groß genug ist, und dann vergrößert.
Dass ein Array in Delphi eine verkettete Liste ist, ist eine Aussage, für die man einen Infolehrer erschießen sollte. Ich kenne keine Sprache, in der das so ist. |
Re: TList / dyn. Array - Was steckt dahinter?
Zitat:
Und um nun ganz sicher zu sein: Zitat:
Zitat:
|
Re: TList / dyn. Array - Was steckt dahinter?
Zitat:
Integer: Nein Record: Nein *was auch immer*: Wenn es ein String mit variabler Länge, eine Klasse oder ein dynamisches Array ist. Oder anders gesagt: Ein Datentyp, der irgendwie eine Finalisation benötigt, wenn ich mich nicht recht irre. Und bei statischen ist das auch nicht anders. Genaugenommen ist es nicht mal bei einer normalen Variable anders. |
Re: TList / dyn. Array - Was steckt dahinter?
Wunderbar...
Dann ist die Struktur eines dynamsiches Arrays also genau die gleiche wie die eines statischen Arrays und der einzige Unterschied liegt darin, dass die Speicherallokation dynamisch zur Laufzeit stattfindet (wobei aber auch immer ein zusammenhängender Speicherbereich genutzt wird)? P.S.: Sorry das ich mich hier andauernd rückversichere, aber ich habe meinen Lehrer komplett gegenteilig verstanden... |
Re: TList / dyn. Array - Was steckt dahinter?
ja richtig, es wird immer ein ausreichender speicherbereich verwendet, sofern du ausreichend speicher hast. im anderen fall bekommst du 'n out of memory error.
|
Re: TList / dyn. Array - Was steckt dahinter?
Zitat:
Zitat:
Das ist doch der einzige Vorteil gegenüber Klassen: Records sind Wertetypen. Also nochmal:
|
Re: TList / dyn. Array - Was steckt dahinter?
Zitat:
Ja - Die Struktur ist dieselbe. Dein Array fängt irgendwo im speicher bei Adresse X an und jedes weitere Element N liegt bei X+N*sizeof(ArrayElement) Der Unterschied liegt darin, dass beim Statischen Array deine Variable direkt den Wert X hat, beim dynamischen Array hast du einen Zeiger auf X. (Ich hoffe ich habe jetzt nicht wieder verwirrt.) |
Re: TList / dyn. Array - Was steckt dahinter?
Zitat:
|
Re: TList / dyn. Array - Was steckt dahinter?
Auch, und weil die Größe eben dynamisch ist, das ist ja nur über Zeiger zu realisieren.
|
Re: TList / dyn. Array - Was steckt dahinter?
Zitat:
wie das ansatzweise funktioniert, hat dir sirius kurz aufgezeigt. wobei nicht immer die grösse auch die grösse ist... da z.t. die zeiger wiederum auf eigene daten und/oder objekte zeigen können. aber das wollt ich ich meinen ersten post gar nicht erwähnen, um keine verwirrung zu stiften. |
Re: TList / dyn. Array - Was steckt dahinter?
Zitat:
|
Re: TList / dyn. Array - Was steckt dahinter?
Liste der Anhänge anzeigen (Anzahl: 1)
So, Lehrer interviewt und folgendes rausbekommen:
Wird ein dynamisches Array erstellt so wird der Speicher nach dem hier schon beschriebenen Muster alloziert. Wird das Array nun jedoch erweitert so wird lediglich ein "neuer" Speicherblock für die Erweiterung reserviert und am Ende des ersten Speicherblocks findet sich ein Zeiger auf den nächsten. Zur Indexberechnung wird dann zusätzlich eine "Tabelle" herangezogen, die den Startindex und die dazugehörige Adresse des Bereichs enthält. Diese Art der Verknüpfung ähnelt der verketteten Liste und hätte theoretisch den Vorteil, das keine riesigen Datenmengen durch den Speicher geschoben werden müssen. Ich hab mal die kleine schematische Darstellung dieser Erklärung angehängt. Was nun Delphi letztendlich aus dem dynamischen Array macht konnte mir mein Lehrer nicht mit Gewissheit sagen (evtl. könnte sich da im Laufe der Versionen was an der Implementierung verändert haben) aber ich finde das Prinzip schon einleuchtend. In wie weit hat denn nun wer Recht? |
Re: TList / dyn. Array - Was steckt dahinter?
Wir haben natürlich Recht :mrgreen:
In Delphi ist es immer so, dass ein Array zusammenhängt. Dazu muss es, wenn es verlängert wird ggf. umkopiert werden. |
Re: TList / dyn. Array - Was steckt dahinter?
Jub, Delphi kopiert um. Wäre das nicht so, könnte man Indizierung via Pointerarithmetik auch vergessen, und gelegentlich ist das auch heutzutage noch eine schön performante Alternative. Es mag sein, dass manche andere Sprachen diese Form von Fragmentierung eines dyn. Arrays betreiben, Delphi macht es allerdings definitiv nicht.
Spaßig ist in Delphi auch die mitgelieferte TList. Der Name suggeriert eine Linked-List, aber hinter TList steckt wieder nichts anderes als ein dyn. Array (of Pointer in diesem Fall). TList verwaltet lediglich das Wachsen/Schrumpfen des Arrays automatisch, und bietet ein ähnliches Interface wie eine doppelt verkettete Liste. Das hat seine Vor- aber auch Nachteile. Eine Liste im allgemeinen Sinne ist es jedoch nicht. Hier gilt also: Im Spezialfall Delphi stimmt die Aussage, dass ein TList auf einem dyn. Array basiert - allgemein ist eigentlich eine Menge von Objekten gemeint, von denen jedes einen Verweis auf seinen Nachfolger (und ggf. Vorgänger) besitzt, und sonst keine Organisation in Arrays o.ä. passiert. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:13 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz