AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Typenfehler

Ein Thema von wonkos2 · begonnen am 11. Mär 2015 · letzter Beitrag vom 11. Mär 2015
Antwort Antwort
wonkos2

Registriert seit: 18. Nov 2014
21 Beiträge
 
Delphi XE7 Professional
 
#1

Typenfehler

  Alt 11. Mär 2015, 16:15
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
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#2

AW: Typenfehler

  Alt 11. Mär 2015, 16:19
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.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Typenfehler

  Alt 11. Mär 2015, 16:25
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.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Typenfehler

  Alt 11. Mär 2015, 18:28
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 ...
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#5

AW: Typenfehler

  Alt 11. Mär 2015, 18:45
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.
$2B or not $2B

Geändert von himitsu (11. Mär 2015 um 18:49 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Typenfehler

  Alt 11. Mär 2015, 19:05
Und du solltest besser VAR verwenden, anstatt OUT.
Warum das?
  Mit Zitat antworten Zitat
nuclearping

Registriert seit: 7. Jun 2008
708 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#7

AW: Typenfehler

  Alt 11. Mär 2015, 19:42
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 outserver, branch, appname, version, outsid, outmessage deklariert sind.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Typenfehler

  Alt 11. Mär 2015, 19:49
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 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)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: Typenfehler

  Alt 11. Mär 2015, 21:41
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.
$2B or not $2B

Geändert von himitsu (11. Mär 2015 um 21:43 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:42 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