![]() |
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:
Gruß,
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; LDer. |
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) |
Re: Arrays bleiben unverändert - trotz SetLength
Alles klar, funktioniert, danke ;)
Wusste gar net, dass damit das Array kopiert wird :o Gruß, LDer. |
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 10:40 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