AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Überladene Funktionen - Delphi erkennt keine Eindeutigkeit?

Überladene Funktionen - Delphi erkennt keine Eindeutigkeit?

Offene Frage von "himitsu"
Ein Thema von RSE · begonnen am 1. Sep 2010 · letzter Beitrag vom 1. Sep 2010
Antwort Antwort
Benutzerbild von himitsu
himitsu

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

AW: Überladene Funktionen - Delphi erkennt keine Eindeutigkeit?

  Alt 1. Sep 2010, 09:20
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-
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 1. Sep 2010 um 09:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.749 Beiträge
 
Delphi 2007 Professional
 
#2

AW: Überladene Funktionen - Delphi erkennt keine Eindeutigkeit?

  Alt 1. Sep 2010, 09:25
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. 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.
Uli Gerhardt

Geändert von uligerhardt ( 1. Sep 2010 um 09:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Überladene Funktionen - Delphi erkennt keine Eindeutigkeit?

  Alt 1. Sep 2010, 09:35
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.

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.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 1. Sep 2010 um 09:42 Uhr)
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#4

AW: Überladene Funktionen - Delphi erkennt keine Eindeutigkeit?

  Alt 1. Sep 2010, 09:41
Ö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):

BestellGrpSendExist(['bla','je'],[21,22])

Geändert von blackfin ( 1. Sep 2010 um 09:44 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.749 Beiträge
 
Delphi 2007 Professional
 
#5

AW: Überladene Funktionen - Delphi erkennt keine Eindeutigkeit?

  Alt 1. Sep 2010, 09:44
Öhm...bin noch nicht ganz wach,
Sieht so aus.

aber bei dem Aufruf übergibst du doch ein SET, kein Array:

BestellGrpSendExist(['bla','je'],[21,22])
Kuckst du hier unter "Open array constructors".
Uli Gerhardt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Überladene Funktionen - Delphi erkennt keine Eindeutigkeit?

  Alt 1. Sep 2010, 09:47
['bla','je'] kann nur ein "offenes Array" sein, denn es gibt keine SETs mit Strings.
[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.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
blackfin
(Gast)

n/a Beiträge
 
#7

AW: Überladene Funktionen - Delphi erkennt keine Eindeutigkeit?

  Alt 1. Sep 2010, 09:51
Ok, man lernt nie aus
So habe ich das noch nie benutzt, ich übergebe sowas normalerweise dann immer als Variable...

Komischerweise funktionieren die offenen Var-Parameter nicht mehr, sobald man das array als einen Typ kapselt:

Delphi-Quellcode:
type
  TSArray = array of string ;
...
  function ATest(aParam: TSArray): boolean ;
...
ATest(['bla','möp']) ;

=> Fehler "ordinaltyp erforderlich" ;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Überladene Funktionen - Delphi erkennt keine Eindeutigkeit?

  Alt 1. Sep 2010, 09:54
Offene Array-Parameter dürfen nicht als Typ vorliegen.

function ATest(aParam: TSArray): boolean; "normaler" Array-Parameter
function ATest(aParam: array of String): boolean; offener Array-Parameter

Und nur beim Letzen kann man [...] direkt übergeben.
Beim Ersten muß eine Variable/Konstante mit genau diesem Typen übergeben werden.

aParam: TSArray übergibt nur einen Pointer auf die Variable/Konstante.
Beim offenen Arrayparameter wird etwas mehr intern gemacht (die Werte werden einzeln in ein temporäres Array kopiert, mit der Länge versehn und erst dann an die Funktion übergeben).
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu ( 1. Sep 2010 um 09:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von uligerhardt
uligerhardt

Registriert seit: 19. Aug 2004
Ort: Hof/Saale
1.749 Beiträge
 
Delphi 2007 Professional
 
#9

AW: Überladene Funktionen - Delphi erkennt keine Eindeutigkeit?

  Alt 1. Sep 2010, 10:01
Ok, man lernt nie aus
So habe ich das noch nie benutzt, ich übergebe sowas normalerweise dann immer als Variable...

Komischerweise funktionieren die offenen Var-Parameter nicht mehr, sobald man das array als einen Typ kapselt:

Delphi-Quellcode:
type
  TSArray = array of string ;
...
  function ATest(aParam: TSArray): boolean ;
...
ATest(['bla','möp']) ;

=> Fehler "ordinaltyp erforderlich" ;
Nochmal hier, unter "Confusion".
Uli Gerhardt
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 09:23 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-2025 by Thomas Breitkreuz