![]() |
Speicheradressen von Array ändern sich nach setlength()
Hallihallo
Ich bin gerade ein bissl am rumbasteln, und habe in meiner aktuellen bastellage pointer auf Arrayelemente
Delphi-Quellcode:
Soweit sogut Funktioniert alles einwandfrei
myarray: Array of Meintyp;
meinzeiger:^Meintyp; .... meinzeiger := @myarray[index]; nur sobald ich im Array rumbastel
Delphi-Quellcode:
fliegen mir die AV's nur so um die Ohren.
setlength(array,length(array) + 1);
//und setlength(array,high(array)); Nach Stundenlangem Debuggen habe ich nun Mitbekommen, das die Speicheradressen des Array nach jedem rumpfuschen im Array ganz andere sind. --> Pointer fürn Arsch Könnt ihr mir erklären warum ein solches Verhalten auftritt? Kann man das irgendwie unterbinden? sicherlich nicht oder? Der Noobi :-D |
Re: Speicheradressen von Array ändern sich nach setlength()
Der Speichermanager teilt dir für das dynamische Array einen Speicherbereich zu. Wenn du das Array nun vergrößern willst, kann es passieren, dass hinter diesem Speicherbereich etwas anderes liegt und er deshalb nicht einfach vergrößert werden kann. In diesem Fall wird ein neuer Speicherbereich alloziert und das Array verschoben. Das kannst du nur verhindern, indem du dein Array gleich zu Beginn groß genug dimensionierst. Dann kannst du allerdings auch gleich ein statisches Array verwenden.
|
Re: Speicheradressen von Array ändern sich nach setlength()
Das ist ein ganz normales Verhalten. Ist an der Stelle nicht genügend Platz den Speicherbereich zu erweitern, wird er an einer anderen Stelle komplett neu angelegt. Deshalb ist ein stückweises Erweitern eines dynamischen Arrays auch nicht gerdae performant.
|
Re: Speicheradressen von Array ändern sich nach setlength()
Zitat:
|
Re: Speicheradressen von Array ändern sich nach setlength()
Zitat:
|
Re: Speicheradressen von Array ändern sich nach setlength()
Hallo Apollonius,
da ist Dir eine kleine Ungenauigkeit durchgerutscht: Zitat:
Gruß K-H |
Re: Speicheradressen von Array ändern sich nach setlength()
Wobei man halt anmerken sollte, dass beim Ändern der Arraygröße eventuell der gesammte Inhalt des Arrays an die neue Speicheradresse kopiert werden muss. Man sollte sich also genau überlegen, ob man nicht mit Listen besser arbeitet.
Gruß, SirTwist |
Re: Speicheradressen von Array ändern sich nach setlength()
Das Problem kannst du umgehen wenn du dir ein Pointer auf das Array nimmst anstelle ein Pointer auf ein Element des Arrays
|
Re: Speicheradressen von Array ändern sich nach setlength()
@p80286: Da hast du natürlich prinzipiell recht. Für die meisten Anwendungen jedoch sollte das keinen großen Unterschied machen. Falls ein Array tatsächlich zu so vielen verschiedenen Zwecken verwendet wird, sollte man vermutlich mehrere Variablen nehmen. Und wenn es wirklich, wirklich auf Speicherauslastung ankommt, würde ich ein großes statisches Array nehmen und die nicht genutzten Elementbereiche (die müssen dann aber schon ziemlich groß sein) mit VirtualAlloc und MEM_RESET als unbenutzt kennzeichnen.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:01 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 by Thomas Breitkreuz