![]() |
Re: Array of String als Konstante klappt nicht...
Zitat:
Delphi-Quellcode:
:?:
dynarray:= staticArray;
(Dass dieser Weg nicht geht, hab ich schon gemerkt ;-) Ansonsten muss ich das statischen eben durchlaufen. |
Re: Array of String als Konstante klappt nicht...
Geht copy() nicht?
|
Re: Array of String als Konstante klappt nicht...
Ne leider nicht. Mit Copy() kann man nur von dynamischen Arrays kopieren, nicht aber auf :?
|
AW: Re: Array of String als Konstante klappt nicht...
Weil ich's grade sehe.
Gab es nicht irgendwo einen Array-Helper (paar mal gesehn, aber immer wenn ich es suche, dann finde ich nichts :stupid:), der ein OpenArray (array of T) als Parameter entgegen nimmt und ein dynmaisches TArray<T> zurück gibt? Bei OpenArrays kann man alle Array-Typen reingeben und der Compiler kopiert notfalls automatisch um. Drinnen in dem Helper wäre dann aber auch wieder nur der StandardCode: * SetLength und dann umkopieren der Items |
AW: Re: Array of String als Konstante klappt nicht...
Zitat:
Bezüglich
Delphi-Quellcode:
gibt es meines Wissens nach auch keine vorgefertigte Lösung, aber auch das lässt sich relativ einfach realisieren. (
array of const
Delphi-Quellcode:
)
function (A: array of const): TArray<TVarRec> begin Pointer(Result) := Pointer(A); end
Bei Strings ginge ja sowas wie
Delphi-Quellcode:
, und bei anderen Typen muss man halt immer vorsichtig sein, da sie ja nicht alle Typen eines TVarRec-Objekts darstellen können. Andersherum wäre das ja, wie du sagst, eh implizit möglich.
String.Join(',', MyArrayOfConst).Split(',')
|
AW: Re: Array of String als Konstante klappt nicht...
Zitat:
Delphi-Quellcode:
ist nicht gleich
array of const
Delphi-Quellcode:
!
array of const
Als Parameter sind array of-Definitionen ein eigener Typ/Mechianismus, der intern auch komplett anders arbeitet und aufgebaut ist. ![]() |
AW: Array of String als Konstante klappt nicht...
Was du wohl eigentlich sagen wolltest:
Zitat:
Und ja, da hast du natürlich recht. Zumindest so teilweise. Nur habe ich deshalb nicht Unrecht. Schauen wir es uns etwas genauer an: Ein
Delphi-Quellcode:
wird vom Compiler wie ein statisches Array behandelt, obwohl es intern ein PVarRec ist. Deshalb brauchen wir einen
array of const
Delphi-Quellcode:
-Operator vor dem array (welchen ich gestern nicht geschrieben habe, weil ich gerade keinen Bock hatte, den Code zu testen und so nicht gemerkt habe, dass er eben nur fast richtig ist).
@
Somit wird folgende Funktion eben funktionieren:
Delphi-Quellcode:
etwas typsicherer wäre es dann aber doch, nicht beides nach
function ArrayOfConstToArrayOfTVarRec(a: array of const): TArray<TVarRec>;
begin Pointer(Result) := Pointer(@a); end;
Delphi-Quellcode:
zu casten, sondern das Rechte nach
Pointer
Delphi-Quellcode:
. Dann sieht das ganze so aus:
TArray<TVarRec>
Delphi-Quellcode:
Kannst du ja gern testen, wenn du es mir nicht glaubst. Aber es funktioniert. ;)
function ArrayOfConstToArrayOfTVarRec(a: array of const): TArray<TVarRec>;
begin Result := TArray<TVarRec>(@a); end;
Delphi-Quellcode:
Showmessage(String(ArrayOfConstToArrayOfTVarRec(['hello'])[0].VUnicodeString)); // Zeigt "hello"
|
AW: Array of String als Konstante klappt nicht...
ich meinte natürlich
Typ/Variable: array of xyz (das enstspricht intern TArray<xyz>) Parameter-Definition: array of xyz Bei deinem TVarRec mußt du aber aufpassen, dass das worauf das VarRec zeig, auch nach Aufruf der Funktion noch existiert. Ja, dass dieses const = TVarRect, das kann ich nicht abstreiten. Allerdings ist der Inhalt dieses Arrays nur wärend der Laufzeit der Methode gültig, aber später können enthaltene Zeiger schnell ungültig sein. (und Strings sind Zeiger)
Delphi-Quellcode:
Und nun noch ein bissl Umstellen, damit der Test aus dem Scope der temporären Variable läuft, welche der Compiler für das
function ArrayOfConstToArrayOfTVarRec(A: array of const): TArray<TVarRec>;
begin Result := TArray<TVarRec>(@A); end; procedure TForm7.Button1Click(Sender: TObject); var A: TArray<TVarRec>; begin A := ArrayOfConstToArrayOfTVarRec(['hello' + IntToStr(0)]); Showmessage(String(A[0].VUnicodeString)); // zeigt "hello0" end;
Delphi-Quellcode:
erzeugt hatte.
'hello'+...
Delphi-Quellcode:
function ArrayOfConstToArrayOfTVarRec(A: array of const): TArray<TVarRec>;
begin Result := TArray<TVarRec>(@A); end; procedure Test(var A: TArray<TVarRec>); begin A := ArrayOfConstToArrayOfTVarRec(['hello' + IntToStr(0)]); end; procedure TForm7.Button1Click(Sender: TObject); var A: TArray<TVarRec>; begin Test(A); // peng Showmessage(String(A[0].VUnicodeString)); end; TVarRec ist leider nicht so "leicht" zu benutzen, ist jedenfalls nicht vergleichbar mir Variant, TValue und allen anderen Delphi-Typen. |
AW: Array of String als Konstante klappt nicht...
Jo, so wie bei jedem anderen Array-Parameter. Dafür kann man ja den Wert kopieren via
Delphi-Quellcode:
:
Copy
Delphi-Quellcode:
Und Schwupps-die-Wupps funktioniert alles wieder problemlos.
function ArrayOfConstToArrayOfTVarRec(A: array of const): TArray<TVarRec>;
begin Result := Copy(TArray<TVarRec>(@A), Low(A), Length(A)); end; Was du mit dem
Delphi-Quellcode:
erreichen wolltest ist mir allerdings bisher schleierhaft. Damit funktioniert das nämlich logischerweise nicht mehr, bzw. gibt
+ IntToStr(0)
Delphi-Quellcode:
dann einen leeren String zurück.
A[0]
|
AW: Array of String als Konstante klappt nicht...
Joar, ich hätte auch ein S:=Copy(S) oder UniqueString(S) benutzen können.
Wollte damit einfach erreichen, dass der String nur eine Referenz besitzt und kein Link auf eine Konstante ist, damit er eine echte Variable wird und am Ende auch wirklich abgeräumt wird. Nja, für den perfekten Test müsste man noch FastMM dazu bringen den Speicher wirklich freizugeben.
Delphi-Quellcode:
war mir in dem Moment nicht eingefallen. :oops:
StringOfChar('x', genügendspeicher)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:57 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