Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Arrays bleiben unverändert - trotz SetLength (https://www.delphipraxis.net/141769-arrays-bleiben-unveraendert-trotz-setlength.html)

LDericher 15. Okt 2009 17:41


Arrays bleiben unverändert - trotz SetLength
 
Komisch.

Wenn ich diese Prozedur (aus einer DLL) calle, bleiben "Vars" und "VarNames" exakt gleich. Muss ich die doch als Referenzparameter oder gar als Zeiger übergeben? :gruebel:
Bin jetzt etwas ratlos... in der Proc werden beide Arrays (die ja intern nur Zeiger sein dürften) nämlich verändert, durch ShowMessage ließ sich das beweisen.
Also, ich lasse den Worten Code folgen:
Delphi-Quellcode:
type
  TParamArray=array of Pointer;
  TVarArray=array of PString;

procedure CREATEVAR(Params:TParamArray; Vars, VarNames:TVarArray);
var
  I:integer;
  Param:string;
begin
Param:=string(GetParam(0, Params, Vars, VarNames));
I:=GetVarIndex(Param, VarNames);
if(I=-1)then
  begin
  SetLength(VarNames, Length(VarNames)+1);
  SetLength(Vars, Length(Vars)+1);
  GetMem(VarNames[I], Length(Param));
  VarNames[I]^:=Param;
  end;
end;
Gruß,
LDer.

jfheins 15. Okt 2009 17:51

Re: Arrays bleiben unverändert - trotz SetLength
 
Jo, ist ja auch i.O.

Bei dem Aufruf werden die Pointer je kopiert. Und mit dem Setlength() erstellst du ja ein neues Array und kopierst das alte da rein. Der Aufrufer behält sein Array ;)

==> Wenn du nich tnur die Inhalte sondern auch das Array ändern willst, musste das wohl per Reference machen (var schlüsselwort)

LDericher 15. Okt 2009 19:52

Re: Arrays bleiben unverändert - trotz SetLength
 
Alles klar, funktioniert, danke ;)
Wusste gar net, dass damit das Array kopiert wird :o

Gruß,
LDer.

himitsu 15. Okt 2009 20:44

Re: Arrays bleiben unverändert - trotz SetLength
 
Bei diesen Parametern wird IMMER kopiert.
Und Arrays/Strings unterliegen einem automatischen Speichermanagement seitens Delphi.

CONST-Parameter werden nicht kopiert, aber sie lassen sich auch nicht ändern

VAR-Parameter werden ebenfalls nicht kopiert und es wird das Original verändert.


Einzig und alleine die Interfaces und Objekte und andere Zeiger fallen etwas aus der Reihe.
Hier wird zwar (ohne CONST/VAR) auch der "Zeiger" kopiert, aber nicht das worauf gezeigt wird.
Also das Objekt (dessen Inhalt) läßt sich so ändern (als wäre es als VAR definiert), aber nicht der Zeiger zum Objekt.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:48 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz