Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Typinformationen bei Mix aus statischen und dyn. Arrays (https://www.delphipraxis.net/161141-typinformationen-bei-mix-aus-statischen-und-dyn-arrays.html)

s.h.a.r.k 18. Jun 2011 23:15

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:
array of Integer
soll tkInteger (TTypeKind) herauskommen bzw. eine Referenz auf
Delphi-Quellcode:
TypeInfo(Integer)
. Hier mal die aktuelle Methode:
Delphi-Quellcode:
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;
Und hier das kleine Testprogramm dazu:
Delphi-Quellcode:
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);
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...

Stevie 19. Jun 2011 02:44

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 (QC#95340)

s.h.a.r.k 19. Jun 2011 11:45

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 21:23 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