![]() |
Inkompatible Datentypen in Procedures bei Arrays mit Double bzw. Extended
Hallo zusammen,
ich habe ein kleines Verständnisproblem bei der Kompatibilität der Datentypen bei den Parametern: Und zwar liegen in meinem Programm folgende Procedures vor:
Delphi-Quellcode:
Die Datenlage ist folgende:
procedure procExtended(AExt: Extended); //2022-01-24
begin ShowMessage('procExtended'); end; procedure procDouble(ADouble: Double); //2022-01-24 begin ShowMessage('procDouble'); end; procedure procArrDouble(AArrDouble: Array of Double); //2022-01-24 begin ShowMessage('procArrDouble'); end; procedure procArrExtended(AArrExt: Array of Extended); //2022-01-25 begin ShowMessage('procArrExtended'); end;
Delphi-Quellcode:
Beim Aufrufen der Procedures klappt es mit den Datentypen bei folgendem:
varDouble := 1.2;
varExt := 7.3; arrDouble: array[0..2] of Double = (1.1, 2.2, 3.3); arrExt: array[0..2] of Double = (1.0, 2.0, 3.0);
Delphi-Quellcode:
Bei den Arrays kommt aber die Meldung "Inkompatible Typen":
procExtended(varDouble);
procDouble(varExt);
Delphi-Quellcode:
Ich freue mich über jeden Hinweis
procArrExtended(arrDouble);
procArrDouble(arrExt); |
AW: Inkompatible Datentypen in Procedures bei Arrays mit Double bzw. Extended
definiere deine array typen außerhalb, in der proc nimmst du dann diese definition. sollte funktionieren.
falls das unverständlich war ->
Delphi-Quellcode:
type
TMyArr: Array of WasAuchImmer; ... procedure Tada(AArr: TMyArr); |
AW: Inkompatible Datentypen in Procedures bei Arrays mit Double bzw. Extended
Hallo KodeZwerg,
danke für deinen Tipp mit der externen Typdefinition ;-) Ich brauche aber keine speziellen Typen, sondern einfach Array of Double bzw. Array of Extended. Meine procedure soll beide, also Double und Extended akzeptieren, was ja bei normalen Parametern klappt. Was meinst du zu meiner Aussage? |
AW: Inkompatible Datentypen in Procedures bei Arrays mit Double bzw. Extended
Ich meine das es nur so funktionieren kann.
Delphi-Quellcode:
type
TExtArr: Array of Extended; TDblArr: Array of Double; ... procedure ExtArr(AArr: TExtArr); begin end; procedure DblArr(AArr: TDblArr); begin end; ... var MeinExt: TExtArr; MeinDbl: TDblArr; begin SetLength(MeinExt, 1); SetLength(MeinDbl, 1); MeinExt[0] := 0.0; MeinDbl[0] := 0.0; ExtArr(MeinExt); DblArr(MeinDbl); |
AW: Inkompatible Datentypen in Procedures bei Arrays mit Double bzw. Extended
Hallo Enigma,
als Ergänzung zur korrekten Lösung von KodeZwerg nur so viel: Für den strengen Delphi-Compiler sind zwei Typendeklarationen nicht dann gleich, wenn sie auf die gleiche Art deklariert worden sind, sondern nur dann, wenn sie denselben Typen haben. Und das geht nur über eine benannte Typen-Deklaration, die Du verwendest. Mein Tipp dazu: Lege Dir eine globale Unit mit oft verwendeten Typendeklarationen, die Du als eigene Daten-Typen konsequent verwendest. Beispiel:
Delphi-Quellcode:
Gruß, Andreas
Unit My_Types;
interface uses System.Types; … Type TDynDoubleVektor = System.Types.TDoubleDynArray; // oder: TArray<Double>; TDynExtendedVektor = TArray<Extended>; TDynIntegerVektor = System.Types.TIntegerDynArray; // oder: TArray<Integer>; TDynStringVektor = System.Types.TStringDynArray; // oder: TArray<String>; TDynPAnsiCharVektor = TArray<PAnsiChar>; usw. Implementation Begin End. |
AW: Inkompatible Datentypen in Procedures bei Arrays mit Double bzw. Extended
Eine Type-Deklaration deklariert ein dynamisches Array.
Wird ein ein Parameter von diesem Typ übergeben, so ist der Parameter in Wirklichkeit ein Zeiger auf das ursprüngliche Array. Da gibt es keine Typumwandlung der Elemente. Die Direktive "overload" ermöglicht Procedure mit gleichem Namen mit unterschiedlichen Parametern. Eine direkte Array-Deklaration als Parameter deklariert eine sogenanntes "offenes Array".
Delphi-Quellcode:
Hier wird jeder einzelne Parameter in den Zieltyp umgewandelt und in ein offenes Array gepackt.
procedure procArrDouble(const AArrDouble: Array of Double);
procedure Test; var a: Double; b: Extendet; c: Integer; begin procArrDouble([a, b, c]); end; |
AW: Inkompatible Datentypen in Procedures bei Arrays mit Double bzw. Extended
Von der Verwendung von "offenen Arrays" möchte ich warnen: Dem Vorteil, daß man mit derselben Routine sowohl statische (1-basierte Zählung), wie auch dynamische Arrays (0-basierte Zählung) bearbeiten lassen, steht der gravierende Nachteil entgegen, daß z.B. das 5-te Element in beiden Fällen verschiedene Inhalte bezeichnet. Damit kann man bei direktem Zugriff auf ein bestimmtes Element ziemlich schnell durcheinanderkommen.
Gruß, Andreas |
AW: Inkompatible Datentypen in Procedures bei Arrays mit Double bzw. Extended
Zitat:
|
AW: Inkompatible Datentypen in Procedures bei Arrays mit Double bzw. Extended
Zitat:
Andreas |
AW: Inkompatible Datentypen in Procedures bei Arrays mit Double bzw. Extended
Zitat:
Delphi-Quellcode:
nun kannst du "AcceptMe" mit vielen verschiedenen typen aufrufen und der name der procedure bleibt immer gleich.
type
TExtArr = array of Extended; TDblArr = array of Double; ... procedure AcceptMe(s: string); overload; begin end; procedure AcceptMe(i: Integer); overload; begin end; procedure AcceptMe(i64: Int64); overload; begin end; procedure AcceptMe(AArr: TExtArr); overload; begin end; procedure AcceptMe(AArr: TDblArr); overload; begin end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:38 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