Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Überladene Funktionen - Delphi erkennt keine Eindeutigkeit? (https://www.delphipraxis.net/154211-ueberladene-funktionen-delphi-erkennt-keine-eindeutigkeit.html)

RSE 1. Sep 2010 09:02

Delphi-Version: 2005

Überladene Funktionen - Delphi erkennt keine Eindeutigkeit?
 
Hallo!

Ich arbeite mit Delphi 5 (nicht 2005). Dort habe ich folgende überladene Funktionen deklariert:
Delphi-Quellcode:
    function BestellGrpSendExist(Typ: Integer = 0): Boolean; overload;
    function BestellGrpSendExist(aTyp: array of Integer): Boolean; overload;
    function BestellGrpSendExist(ProdNames: array of string; Typ: Integer = 0): Boolean; overload;
    function BestellGrpSendExist(ProdNames: array of string; aTyp: array of Integer): Boolean; overload;
Beim Aufruf von
Delphi-Quellcode:
BestellGrpSendExist(['bla','je'],[21,22])
meldet Delphi:
Code:
[Fehler] CCCHemopharm1003Ergebnis.pas(1145): Doppeldeutiger überladener Aufruf von 'BestellGrpSendExist'
Ich kann mir das nicht erklären. In meinen Augen ist der Aufruf eindeutig. Vielleicht weiß ja einer von Euch woran das liegt?

himitsu 1. Sep 2010 09:11

AW: Überladene Funktionen - Delphi erkennt keine Eindeutigkeit?
 
Was passiert, wenn du mal die Defaultwerte (=0) in den Deklarationen wegläßt?

uligerhardt 1. Sep 2010 09:15

AW: Überladene Funktionen - Delphi erkennt keine Eindeutigkeit?
 
Hmmm, ist in D2007 immer noch so. Das kann ich mir auch nicht erklären. Wenn ich die BestellGrpSendExist(aTyp: array of Integer)-Überladung auskommentiere, geht's.
Vielleicht kannst du die Überladungen ohne ProdNames entfernen und in ihren Aufrufen [] als ersten Parameter übergeben?

RSE 1. Sep 2010 09:19

AW: Überladene Funktionen - Delphi erkennt keine Eindeutigkeit?
 
Also die Funktionen sind historisch gewachsen und rufen sich auch gegenseitig auf, ich werd also probieren müssen, was ich "umstrukturieren" kann.

Danke!

himitsu 1. Sep 2010 09:20

AW: Überladene Funktionen - Delphi erkennt keine Eindeutigkeit?
 
Tja, wenn man mal genau hinsieht, wo der Cursor steht, nach/nei dieser Fehlermeldung, dann wird es klar.

Es wird direkt nach dem [ geprüft ob es "irgendwelche" Arrays gibt und da es mehrere Arrays gibt, kann sich der Kompiler nicht entscheiden, da er den Inhalt des Arrays wohl erst später auswertet und so noch nicht weiß was es für ein Array wird ... nun findet er aber mehrere Array-Deklarationen und muß aufgeben.


Ein Umweg wäre ['bla','je'] nicht als direkte Konstante, sondern über eine externe Array-Konstante/Variable zu übergeben-

uligerhardt 1. Sep 2010 09:25

AW: Überladene Funktionen - Delphi erkennt keine Eindeutigkeit?
 
Zitat:

Zitat von himitsu (Beitrag 1046570)
Tja, wenn man mal genau hinsieht, wo der Cursor steht, nach/nei dieser Fehlermeldung, dann wird es klar.

Es wird direkt nach dem [ geprüft ob es "irgendwelche" Arrays gibt und da es mehrere Arrays gibt, kann sich der Kompiler nicht entscheiden, da er den Inhalt des Arrays wohl erst später auswertet und so noch nicht weiß was es für ein Array wird ... nun findet er aber mehrere Array-Deklarationen und muß aufgeben.

Bin grad zu einem ähnlichen Schluss gekommen:
Delphi-Quellcode:
procedure P(const AStrings: array of string); overload;
procedure P(const ANumbers: array of Byte); overload;
und z.B.
Delphi-Quellcode:
P(['bla', 'je']);
führen zum gleichen Fehler. Scheinbar wirft Delphi bei der Auflösung von Überladungen alle (offenen?) Array-Typen in einen Topf.

Edit: Dieser QC-Eintrag beschreibt ein verwandtes Problem. Den Fehler aus dem OP konnte ich in der QC nicht finden.

himitsu 1. Sep 2010 09:35

AW: Überladene Funktionen - Delphi erkennt keine Eindeutigkeit?
 
Das Problem hab ich auch ständig mit überladenen Stringparametern.

AnsiString, UnicodeString/WideString und UTF8String ... gibt man nun direkt einen String 'xyz' an, dann kann sich Delphi nicht entscheiden.
Warum weiß ich nicht, denn es wäre doch sooo einfach:
Ist kein zu nutzender Typ vorgegeben (z.B. über eine Zielvariable oder einen eindeutigen Parameter), dann wird String genommen und schon wäre klar, welcher Aufruf genommen werden müßte
und/oder mam schaut, was an Möglichleiten zur Verfügung steht und versucht dann den angegebenen Typ irgendwo zuzuordnen und so auf ein eindeutiges Ergebnis zu kommen. :wall:

Hier ist es halt so, daß der Compiler das [ findet, nun schaut er nach welchen Typ das Array haben kann/muß, anhand von den Parametern (hier findet er leider mehrere und kann sich nicht entscheigen, da er zu doof ist jetzt mal in die Werte zu schauen und zu erkennen, daß dort Strings oder Integer enthalten sind und demnach dann nur noch eine Deklaration passen würde) baut er nun das Array auf.
Dann nimmt er sich erst den Inhalt vor und versucht die "Strings" in das Zielarray einzubauen. (wenn jetzt als einziges das Zielformat ein Integer(LongInt)-Array erkannt worden wäre und man übergibt Strings, dann hätte er beim String gemeckert, weil es kein Integer ist).

Es wünschen sich ja schon lange welche einen mehrphasigen oder zumindestens (wenn nötig) vorausschauenden Compiler, welcher dann solche Probleme nicht hätte.

blackfin 1. Sep 2010 09:41

AW: Überladene Funktionen - Delphi erkennt keine Eindeutigkeit?
 
Öhm...bin noch nicht ganz wach, aber bei dem Aufruf übergibst du doch ein SET, kein Array (bzw. der Compiler nimmt da ein Set an):

Delphi-Quellcode:
BestellGrpSendExist(['bla','je'],[21,22])

uligerhardt 1. Sep 2010 09:44

AW: Überladene Funktionen - Delphi erkennt keine Eindeutigkeit?
 
Zitat:

Zitat von blackfin (Beitrag 1046581)
Öhm...bin noch nicht ganz wach,

Sieht so aus. :P

Zitat:

Zitat von blackfin (Beitrag 1046581)
aber bei dem Aufruf übergibst du doch ein SET, kein Array:

Delphi-Quellcode:
BestellGrpSendExist(['bla','je'],[21,22])

Kuckst du hier unter "Open array constructors".

himitsu 1. Sep 2010 09:47

AW: Überladene Funktionen - Delphi erkennt keine Eindeutigkeit?
 
Delphi-Quellcode:
['bla','je']
kann nur ein "offenes Array" sein, denn es gibt keine SETs mit Strings.
Delphi-Quellcode:
[21,22]
könnte ein SET sein oder ein "offenes Array".

Darum schaut sich der Kompiler vorher das Ziel an, entscheidet dann was es nun werden soll und versucht danach die Werte dort einzufügen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:54 Uhr.
Seite 1 von 2  1 2      

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