Hallo,
Ich weiß dieser Thread ist 4 Jahre alt und als Erledigt markiert, der Grund warum ich dennoch hierzu meinen Senf dazugeben möchte:
Dieser Thread ist bei Googlesuche nach CStringArray ganz oben mit dabei und imho ist zu diesem Thema hier noch etwas zu sagen.
@BadMourning
Man muss die Größe vorher nicht festlegen man sollte es aber zumindest eine ungefähre Größe angeben! Dass man es so unbeschwert wie eine verkettete List verwenden kann da geb ich dir Recht.
Ein Array und eine verkettete Liste haben aber einen entscheidenden Unterschied!
Bei einem Array müssen alle Elemente hintereinander im Speicher abgelegt werden, eine verkettete Liste hat mehrere Elemente die beliebig an verschiedenen Adressen im Speicher hinterlegt sind. Die einzelnen Elemente kennen die Adresse des jeweils nächsten Elements (je nachdem auch des vorherigen).
Wenn ich einem Array dynamisch ein neues Element hinzufüge funktioniert das vom Prinzip her so:
Der Prozess allkoiert (reserviert) im Arbeitsspeicher soviele Adressen hintereinander, dass das Array plus das neue Element hineinpassen, kopiert das Array von seiner alten Position im AB an die Neue und fügt das zusätzliche Element an. Der Speicher an der alten Position wird freigegeben.
Das passiert natürlich nicht bei jedem Element. Ich denke, dass gleich Platz für mehrere Elemente allokiert wird, so dass nur alle 5, 10 oder 20 Mal das Array kopiert werden muss die genaue Größenordnung kenne ich da nicht.
Ich weiß aber, dass zu häufiges Herumkopieren ineffizient ist!
Prinzip einer verketteten Liste:
Der Prozess kennt die Adresse des ersten Elements, das wiederum die Adresse des jeweils Nächsten kennt und das letzte Element muss wissen, dass es momentan das Letzte ist.
Der Rest funktioniert dann wie Flüsterpost aus der Grundschule..
Ich sage dem Element, dass ich kenne, dass ich die Adresse des letzten Elements haben möchte. Das letzte Element fühlt sich angesprochen und teilt seine Adresse mit.
mit der Adresse habe ich direkten Zugriff auf das Element.
Wenn ich ein neues Element hinzufüge, allokiere ich an einer beliebigen Adresse im AB genügend Speicher, sage per Flüsterpost, dass das bisher letzte Element absofort nicht mehr das letzte ist und die Adresse des gerade neu angelegten Elements speichern soll.
Kurz und knapp zum Schluss:
Über den ganzen Ablauf muss man sich keine Gedanken machen! Man kann damit auch arbeiten ohne, dass man von dem ganzen komplizierten Sch*** etwas mitbekommt.
All diejenigen, die CStringArrays benutzen, sollten wirklich daran denken SetSize() zu verwenden, oder in Erwägung ziehen eine verkettete Liste zu benutzen.
Genug über Arrays hergezogen ;-)
Man sollte sich auf jeden Fall zuersteinmal mit den Grundlagen beschäftigen bevor man sich mit komplexeren Themen heranwagt. Als ich mit C++ angefing, habe ich mich mit char-Arrays herumschlagen! Strings sind schon ein Luxus^^
Back to the Roots - es kann wirklich nicht schaden
All the Best
Jonas