Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Typenfehler (https://www.delphipraxis.net/184239-typenfehler.html)

wonkos2 11. Mär 2015 15:15

Typenfehler
 
Hallo liebe Delphi-Praktiker,

heute bitte Ich um Eure Unterstützung bei einem relativ komplexen Typenfehler. Die Meldung des Compilers lautet:

"Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen". Die Zeile, welche die Fehlermeldung produziert, ist wie folgt:

check := update_listFiles(outserver, branch, appname, version, outsid, outmessage, FilesList); // Funktionsaufruf

Check ist eine boolsche Variable.

Die Funktion ist wie folgt deklariert:

function update_listFiles(server, branch, appname, version, sid: String; out OUTMessage: String; out OUTList: TFileListArray):Boolean;

Ein Ausschnitt aus der Typendeklaration folgt hier:

Delphi-Quellcode:
  TFileList = record
    name,
    checksum: String;
  end;

  TFileListArray = Array of TFileList;
Dazu habe ich eine Variable FilesList wie folgt deklariert:

var FilesList : TFileListArray;



1. Muß TFileListArray eine feste Größe haben oder ist die Deklaration so in Ordnung?

2. Müssen die Namen der nach außen gegenenen Parameter mit denen in der aufrufenden Unit exakt identisch sein?


Beste Grüße,

wonkos2

DeddyH 11. Mär 2015 15:19

AW: Typenfehler
 
Die Namen müssen nicht identisch sein, die Typen hingegen schon. Die Out-Parameter müssen Variablen, die Werteparameter können Konstanten sein. Und Du musst das Array nicht vorher initialisieren, das sollte die Funktion übernehmen.

Der schöne Günther 11. Mär 2015 15:25

AW: Typenfehler
 
Also folgendes kompiliert und läuft ohne Probleme:

Delphi-Quellcode:
program Project22;
uses System.SysUtils;

type
  TFileList = record
    name, checksum: String;
   end;

   TFileListArray = Array of TFileList; // Warum nicht TArray<TFileList>?

function update_listFiles(
   server, branch, appname, version, sid: String;
   out OUTMessage: String;
   out OUTList: TFileListArray
): Boolean;
begin
   Result := False;
end;

var
   filesList:   TFileListArray;
   check:      Boolean;
   someMsg:   String;
begin
  try
   check := update_listFiles(
      '', '', '', '', '',
      someMsg,
      FilesList
   );
  except
   on E: Exception do
     Writeln(E.ClassName, ': ', E.Message);
  end;
end.

Sir Rufo 11. Mär 2015 17:28

AW: Typenfehler
 
Warum sollte es auch nicht? ;)

Aber wenn der TE nur die Spitze vom Eisberg zeigt, dann darf er sich nicht wundern, wenn er die Titanic macht ...

himitsu 11. Mär 2015 17:45

AW: Typenfehler
 
Zitat:

Zitat von wonkos2 (Beitrag 1293041)
Ein Ausschnitt aus der Typendeklaration folgt hier:

Delphi-Quellcode:
  TFileList = record
    name,
    checksum: String;
  end;

  TFileListArray = Array of TFileList;
Dazu habe ich eine Variable FilesList wie folgt deklariert:

var FilesList : TFileListArray;

Und wie ist die Prozedur deklariert,
auch mit genau den selben Typen? (die Selben ... nicht nur gleich aussehend)


Und du solltest besser VAR verwenden, anstatt OUT.
Ich hoffe ja, aß der Compiler bei diesen gemanageten Typen von sich us ein VAR daraus macht, aber Vertrauen sollte man da besser nicht drauf.

Der schöne Günther 11. Mär 2015 18:05

AW: Typenfehler
 
Zitat:

Zitat von himitsu (Beitrag 1293065)
Und du solltest besser VAR verwenden, anstatt OUT.

Warum das?

nuclearping 11. Mär 2015 18:42

AW: Typenfehler
 
Zitat:

Zitat von wonkos2 (Beitrag 1293041)
check := update_listFiles(outserver, branch, appname, version, outsid, outmessage, FilesList); // Funktionsaufruf
[...]
function update_listFiles(server, branch, appname, version, sid: String; out OUTMessage: String; out OUTList: TFileListArray):Boolean;

Es wäre hilfreich zu wissen, wie
Delphi-Quellcode:
outserver, branch, appname, version, outsid, outmessage
deklariert sind.

Sir Rufo 11. Mär 2015 18:49

AW: Typenfehler
 
Zitat:

Zitat von nuclearping (Beitrag 1293071)
Zitat:

Zitat von wonkos2 (Beitrag 1293041)
check := update_listFiles(outserver, branch, appname, version, outsid, outmessage, FilesList); // Funktionsaufruf
[...]
function update_listFiles(server, branch, appname, version, sid: String; out OUTMessage: String; out OUTList: TFileListArray):Boolean;

Es wäre hilfreich zu wissen, wie
Delphi-Quellcode:
outserver, branch, appname, version, outsid, outmessage
deklariert sind.

Es wäre hilfreich die gesamte Deklaration zu sehen (ohne den ganzen sontswas Code) ... also so wie der Günther das vorgemacht hat und eben nicht nur ein paar Brotkrumen (Spitze des Eisberges) ;)

himitsu 11. Mär 2015 20:41

AW: Typenfehler
 
Zitat:

Zitat von Der schöne Günther (Beitrag 1293068)
Warum das?

Weil OUT von der Definition her den Eingabewert ignoriert und nur bei erfolgreichem Aufruf (siehe z.B. Delphi-Referenz durchsuchenSupports) der Variable einen Wert zuweist.

Bei gemanageten Typen darf der Eingangswert aber niemals ignoriert werden, bzw. nicht undefiniert sein.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:28 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