![]() |
Dynamisches Array erzeugen
Hi,
ist es möglich ein Dynamisches Array während der laufzeit zu erzeugen ? z.b. x : array of array of array of array ..... : string |
Hi,
so einfach gehts nicht. Was für ein Typ soll das sein ? Gruß Hansa |
string :)
|
Hi,
als erstes wären Pointer zu benutzen. Dann kannst Du machen, was Du willst. Was Deine Frage aber wahrscheinlich genauer trifft (array of array usw.) :
Code:
Findest Du dazu eine Hilfe in der deutschen Version, so sag mir es bitte, bin nämlich jetzt zu faul, das zu übersetzen.
To declare multidimensional dynamic arrays, use iterated array of ... constructions. For example,
type TMessageGrid = array of array of string; var Msgs: TMessageGrid; declares a two-dimensional array of strings. To instantiate this array, call SetLength with two integer arguments. For example, if I and J are integer-valued variables, SetLength(Msgs,I,J); allocates an I-by-J array, and Msgs[0,0] denotes an element of that array. You can create multidimensional dynamic arrays that are not rectangular. The first step is to call SetLength, passing it parameters for the first n dimensions of the array. For example, var Ints: array of array of Integer; SetLength(Ints,10); allocates ten rows for Ints but no columns. Later, you can allocate the columns one at a time (giving them different lengths); for example SetLength(Ints[2], 5); makes the third column of Ints five integers long. At this point (even if the other columns haven’t been allocated) you can assign values to the third column—for example, Ints[2,4] := 6. The following example uses dynamic arrays (and the IntToStr function declared in the SysUtils unit) to create a triangular matrix of strings. var A : array of array of string; I, J : Integer; begin SetLength(A, 10); for I := Low(A) to High(A) do begin SetLength(A[I], I); for J := Low(A[I]) to High(A[I]) do A[I,J] := IntToStr(I) + ',' + IntToStr(J) + ' '; end; end; Gruß Hansa P.S.: Lese gerade, da werden auch Pointer benutzt, gehen tut es also anscheinend, wie ich anfangs vermutet habe. |
Hi,
das hier habe ich gemeint (falscher Beitrag gepostet), ohne Englisch wärs natürlich jetzt schlecht : Zitat:
Gruß Hansa |
hi,
ich habe beide beiträge gerade überflogen, der letzte beschreib aber nur ein eindemensionales array ich lese eine baumstrucktur ein, vergleichbar mit xml, da ich nicht weiss wieviele "blätter" ein "ast" hast brauche ich ein mehrfach dynamisches array. es sollten auf die "blätter" mit einem index zugegriffen werden |
Zitat:
Der letzte Artikel beschriebt einfach nur das Verhalten eines dynamischen arrays anhand eines 1-Dimensionalen arrays, was nicht heißt, dass das nicht auch genauso mit mehrdimensionalen arrays funktioniert. Gruß Jan |
Uff,
Zitat:
Gruß Hansa |
Hallo Hansa,
was jagt dir denn da so einen großen Schrecken ein? Ich würde das über einen rekursiven Algorythmus lösen, ähnlich dem des Dateistruktur Auslesens und dann dementsprechend im rekursiven Algorythmus den dynamischen Array erweitern. Klingt doch garnicht so schwer.... Für Belehrungen bin ich natürlich immer dankbar! Gruß Jan |
Hi,
für mich ist das da im Moment ein Gruselkabinett. :spin: Zeiger kann ich schon nicht sehen. Was noch schlimmer ist : rekursive Prozeduren und dann noch zusammen mit Zeigern. Aber Du hast schon Recht wenn so etwas in der Art und Weise aufgebaut werden muß, dann wirklich schon rekursiv. Mit dynamischen Arrays habe ich mich noch nicht so beschäftigt, aber ist es nicht so, daß diese nur in sofern dynamisch sind, daß die Größe erst zur Laufzeit festgelegt wird ? Dies würde aber bedeuten, daß Du eine Maximallänge z.B. von 20 festlegst und eine Exception kriegst falls es doch 21 Elemente sind. Bei einem mehrdimensionalen Baum glaube ich, ist es sehr wahrscheinlich, daß der sehr unausgeglichen ist. Hast Du nun aber einen Baum mit 4 Ästen von jeweils 2,10,15 und 200 Blättern, mußt Du für jeden Ast 200 Blätter vorsehen ! Da stehts ja sogar : Zitat:
Gruß Hansa |
Hm, seltsam, ich dachte, es wäre umgekehrt. Zugegeben, ich kenne C++ nur sehr oberflächlich und hab noch nie Code darin geschrieben, aber soweit ich weiß, sind dyn. Arrays in C++ nur insoweit dynamisch, als dass zur Laufzeit die Größe bei der Instantiierung beliebig festgelegt werden kann. Danach ist Schluss. Hier könnt ihr micg aber gerne eines Besseren belehren, da ich wie gesgt, noch kaum Umgamg mit C++ hatte.
Bei ObjektPascal sieht das aber anders aus. Da gibt es eine schöne Funktion namens SetLength, die nicht nur für Strings, sondern auch für dyn. Arrays gillt. Und man kann sie nicht nur beim Erstellen des Arrays aufrufen, sondern so oft wie man will. Und das Tollste ist, dass die Daten im Array innerhalb der neuen Größe erhalten bleiben. Also entweder sprecht ihr von einer anderen Sprache oder ich träumte die letzten zwei, drei Jahre einen langen, schönen Traum... :freak: |
Hier hab ich was zu Array gefunden (mehrdimensional, dynamisch,...), vielleicht hilft das ja weiter:
![]() Beschränkte Arrays haben mir bisher immer gereicht, deshalb warte ich mal ab wie sich das hier so entwickelt :) . |
Hallo,
das hört sich ja interessant an. Baumstrukturen und deren dynamische Verwaltung bearbeite ich immer mittels TTreeNode-Objekten. Ehrlich habe ich die noch nicht ohne TTreeView verwendet, aber ich glaube der muß nicht unbedingt sein. Der Vorteil ist, dass einige nützliche Methoden für die "Zweige" mitgeliefert werden wie "GetNext", GetFirstChild" etc. Die Eigenschaft TTreeNode.Data kann man gut für Zeiger auf eigene Records verwenden. Jetzt bitte nicht schimpfen, ich nenne es Iteration, aber von mir aus können wir es auch Recursion nennen (ich meine Methode ruft sich selbst auf) ist der beste Ansatzt um einen Baum zur Laufzeit mit x-beliebigen Ästen abzuarbeiten. Ich mach es jedenfalls immer so. Gruß Oki |
Hallo
@oki: Nur mal so nebenbei: Soweit ich weiß spricht man von Iteration, wenn man mit Schleifen arbeitet, die irgendeinen Wert hoch- bzw. runterzählen. Von Rekursion spricht man wenn sich eine Methode selbst aufruft oder so ähnlich. Jetzt noch eine Frage an alle: Muss der Speicher der mit SetLength reserviert wurde auch von Hand wieder freigeben werden, oder erledigt das Delphi automatisch? |
Hallo Lodda,
ja ja, ich hab ja schon gesagt dass ich das nicht so piniebel sehe. Du hast sicher Recht. Mir ist ja wichtiger dass ich jemandem helfen kann. Mit SetLength belegten Speicher kannst du automatisch mit der Zuweisung von nil auf die Variable (dyn Array) frei geben. Das Drumherum macht Delphi. Weist du der Variablen eine neue Länge zu (zweites mal SetLength) brauchst du dich nicht um den Speicher zu kümmern. Macht alles Delphi. Also ganz easy. Gruß Oki |
Warum wird der Speicher freigeben, wenn ich der Variable nil zuweise :?: :?: :?: Ich dachte eine Variable darf den Wert nil besitzen.
|
ich glaube das mein anliegen etwas falsch verstanden wurde
ich weiss wie ich mit dynmischen array's arbeite, diese sind mir auch lieber als statische mein problem bei der sache ist nur, es wird ja von vornherein festgelegt was für ein array man haben möchte ein eindemensionales x array of string ein zweidemensionales x array of array of integer usw. ... bei mir sollte es aber ein n demensionales array sein genau das was oki angesprochen hat, an TreeNodes habe ich nicht gedacht ich glaube das hilft mir ungemein :) danke allen die hier gepostet haben :) |
Hallo Snoop 007,
schön, dass dir meine Idee was gebracht hat. Da ich selber gerade an TreeNodes rumprogrammiere kannst du dich gene weiter direkt an mich wenden wenn du da auf Probleme stößt. So ich kann helf ich gerne. Für lodda, schau einfach mal in der Delphi Hilfe unter dem Index dynamische Arrays nach. Da steht alles drin. Es ist wirklich so wie ich sagte. Gruß Oki |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:31 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