![]() |
Typinformationen bei Mix aus statischen und dyn. Arrays
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen,
bin gerade dabei eine Methode zu schreiben, die den "Basistyp" für einen gegebenen Array-Typen ausgibt. Beispiel: Bei
Delphi-Quellcode:
soll tkInteger (TTypeKind) herauskommen bzw. eine Referenz auf
array of Integer
Delphi-Quellcode:
. Hier mal die aktuelle Methode:
TypeInfo(Integer)
Delphi-Quellcode:
Und hier das kleine Testprogramm dazu:
function GetArrayBaseType(const ArrayTypeInfo: PTypeInfo; out BaseTypeKind: TTypeKind; out BaseTypeInfo: PTypeInfo): Boolean; overload;
var TD : PTypeData; BaseType : PTypeInfo; begin if (ArrayTypeInfo = nil) or (not (ArrayTypeInfo.Kind in [tkArray, tkDynArray])) then Exit(False); TD := GetTypeData(ArrayTypeInfo); if (ArrayTypeInfo.Kind = tkArray) then begin if (TD.ArrayData.ElType = nil) or (TD.ArrayData.ElType^ = nil) then Exit(False); BaseType := TD.ArrayData.ElType^; end else begin if ((TD.elType = nil) or (TD.elType^ = nil)) and ((TD.elType2 = nil) or (TD.elType2^ = nil)) then Exit(False); if ((TD.elType = nil) or (TD.elType^ = nil)) then BaseType := TD.elType2^ else BaseType := TD.elType^; end; if (BaseType.Kind in [tkArray, tkDynArray]) then Result := GetArrayBaseType(BaseType, BaseTypeKind, BaseTypeInfo) else begin BaseTypeKind := BaseType.Kind; BaseTypeInfo := BaseType; Result := True; end; end;
Delphi-Quellcode:
Das Programm läuft bis zum vorletzten Schritt, der ein "Mixed" Array (hier TDynMatrixA) behandelt, bestehend aus einem statischen und einem dynamischen Teil. Der erste Schritt in der Rekursion von GetArrayBaseType scheitert schon, da GetTypeData() quasi nichts sinnvolles an Daten liefert, siehe Screenshot. Nimmt der Compiler bei sowas interne Optimierungen vor, sodass ich via RTTI hier nicht wirklich was ausrichten kann? Oder woher könnte das Problem sonst noch kommen? Gibt es vielleicht einen anderen Weg an den Basistyp eines Arrays zu gelangen? Kann ja auch gut sein, dass ich hiermit auf dem Holzpfad bin...
function GetArrayBaseTypeInfo(const ArrayTypeInfo: PTypeInfo): PTypeInfo; overload;
var TK : TTypeKind; begin if (not GetArrayBaseType(ArrayTypeInfo, TK, Result)) then raise Exception.Create('Could not read base type info of given array.'); end; type TDynArray = array of Integer; TGenericArray = TArray<String>; TBlub = TArray<TArray<TArray<Variant>>>; TMatrix = array[0..3, 0..3] of Extended; THugeMatrix = array[0..3, 0..3] of array[0..3, 0..3] of Char; TDynMatrixA = array of array[0..3, 0..3] of Int64; TDynMatrixB = array[0..3, 0..3] of array of array[0..3, 0..3] of Int64; begin Writeln(GetArrayBaseTypeInfo(TypeInfo(TDynArray)).Name); Writeln(GetArrayBaseTypeInfo(TypeInfo(TGenericArray)).Name); Writeln(GetArrayBaseTypeInfo(TypeInfo(TMatrix)).Name); Writeln(GetArrayBaseTypeInfo(TypeInfo(THugeMatrix)).Name); // <- hier hagelt es dann eine Exception Writeln(GetArrayBaseTypeInfo(TypeInfo(TBlub)).Name); Writeln(GetArrayBaseTypeInfo(TypeInfo(TDynMatrixA)).Name); Writeln(GetArrayBaseTypeInfo(TypeInfo(TDynMatrixB)).Name); |
AW: Typinformationen bei Mix aus statischen und dyn. Arrays
Schau dir den source von TValue.FromArray an, da müsste alles zu finden sein. Ansonsten -> QC Eintrag machen (
![]() |
AW: Typinformationen bei Mix aus statischen und dyn. Arrays
Das ist ja mal ein Luxus ;) herzlichen dank! Aber ich finde es im Moment nicht so toll wie viele Bugs/Lücken mir über den Weg laufen. Ich sollte die neuen Features einfach nicht mehr nutzen :mrgreen:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:59 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