AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Funktion Überladen --> Doppeldeutiger überladener Aufruf
Thema durchsuchen
Ansicht
Themen-Optionen

Funktion Überladen --> Doppeldeutiger überladener Aufruf

Ein Thema von Ares · begonnen am 16. Nov 2007 · letzter Beitrag vom 3. Feb 2010
Antwort Antwort
Seite 2 von 2     12   
messie

Registriert seit: 2. Mär 2005
Ort: Göttingen
1.592 Beiträge
 
Delphi 2009 Professional
 
#11

Re: Funktion Überladen --> Doppeldeutiger überladener Auf

  Alt 16. Nov 2007, 23:28
[OT] heute nicht mehr...[/OT]
Aber die Deklarationen sollten mal ohne die gegenseitigen Aufrufe probiert werden. Vielleicht läßt sich das damit etwas entflechten.

Grüße, Messie
  Mit Zitat antworten Zitat
Ares

Registriert seit: 5. Dez 2002
269 Beiträge
 
#12

Re: Funktion Überladen --> Doppeldeutiger überladener Auf

  Alt 19. Nov 2007, 10:13
Hallo!

Vielen Dank für eure zahlreichen Beiträge. Ich hatte am Wochenende leider keine Gelegenheit zu antworten.

Code:
procedure Confused([color=red]Integer[/color]);
procedure Confused([color=red]Integer[/color]; [color=silver]Integer=0[/color]);
Das dies zu Problem führt verstehe ich. Bei einem Aufruf von Confuses(42) weiß der Compiler nicht, ob er die erste Variante aufrufen soll, oder die zweite Variante mit der Defaultbelegung für den zweiten Paramter (Confuses(42, 0)). Dieses Problem tritt bei meinen Funktionen aber eigentlich nicht auf. Hier sollte anhand der Paramter immer ganz eindeutig klar sein, welche Funktion genutzt werden soll.

Um das Problem mit dem Default Paramter zu umgehen, habe ich noch eine weitere Funktion eingführt:
Delphi-Quellcode:
{#1} function GetString(ID: Integer): String; overload;
{#2} function GetString(ID: Integer; StringOptions: TStringOptions): String; overload;
{#3} function GetString(ID: Integer; Args: array of TVarRec): String; overload;
{#4} function GetString(ID: Integer; StringOptions: TStringOptions;
       Args: array of TVarRec): String; overload;
Wenn ich das Ganz nun mit folgenden Aufrufen teste, erhalte ich bei den 2, 3 und 4 die Meldung mit der doppeldeutigen Überladung:
Delphi-Quellcode:
// 1. Parameter (Integer) --> Funktion #1
str := GetString(42);

// 2. Parameter (Integer, TStringOptions) --> Funktion #2
str := GetString(42, [soQuoted]);

// 3. Parameter (Integer, TVarRec) --> Funktion #3
str := GetString(42, ['hallo']);

// 4. Parameter (Integer, TStringOptions, TVarRec) --> Funktion #4
str := GetString(42, [soQuoted], ['hallo']);
Soweit ich das verstehe ich eigentlich in jeder Situation durch die Parameter ganz eindeutig bestimmt, welche Funtkion genutzt werden soll.

Zitat von messie:
Aber das erste Argument ist immer ein integer. Das entspricht genau dem, was die OH als abschreckendes Beispiel genannt hat. Woher soll die Funktion wissen, wieviel Speicherplätze mit welcher Speicherstruktur sie beim Aufruf für die Parameter reservieren soll?
So wie bei jeder anderen überladenen Funktion auch: Durch die Zahl und den Typ der übrigen Paramter. Ich dachte eigentlich immer, dass sollte so funktionieren. Folgendes funktioniert prima obwohl der erste Parameter immer Integer ist:
Delphi-Quellcode:
function OverloadTest(ID: Integer): String; overload;
function OverloadTest(ID: Integer; Str: String): String; overload;
..
OverloadTest(42);
OverloadTest(42, 'hallo');

Zitat von RavenIV:
Wenn Du bei der dritten Schreibweise den zweiten und dritten Parameter vertauschst, dann könnte es klappen.
Das änder leider nichts. Die Fehler treten ganz genauso auf.


Zitat von messie:
Aber die Deklarationen sollten mal ohne die gegenseitigen Aufrufe probiert werden. Vielleicht läßt sich das damit etwas entflechten.
Das Spielt keine Rolle. Dann tritt der Fehler auf, wenn man die Funktion im sonstigen Programm verwendet.


Zitat von DeddyH:
IMHO sollte es so ohne Probleme gehen:
Delphi-Quellcode:
function GetString(ID: Integer; StringOptions: TStringOptions=[]): String; overload;
function GetString(Args: array of TVarRec; ID: Integer): String; overload; //Argumente getauscht
function GetString(ID: Integer; StringOptions: TStringOptions;
  Args: array of TVarRec): String; overload;
Falls nicht, möge man mich korrigieren.
Das funktioniert wirklich. Allerdings habe ich dann das Problem, dass ich alle Stelle an denen GetString(Integer; array of TVarRec) vorkommt ändern muss. Und das sind ziemlich viele.

Falls es gar nicht anders geht werde ich es also so machen. Wenn aber noch jemand eine Idee für eine elegantere Lösung hat wäre ich dafür wirklich dankbar!

Besten Dank
Ares
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#13

Re: Funktion Überladen --> Doppeldeutiger überladener Auf

  Alt 3. Feb 2010, 13:44
Hallo,

ich wollte wegen meiner Frage kein neues Them aufmachen. Vielleicht kann mir ja hier schon jemand sagen, warum ich bei folgendem die besagte Fehlermeldung bekomme:
Delphi-Quellcode:
Function ExpandAz(Var Value: String): String; Overload;
Function ExpandAz(Value: TCaption): String; Overload;
...

// -----------------------------------------------------------
// Erweitert ein Aktenzeichen, bei dem führende Nullen oder
// die führenden "19" oder "20" bei der Jahreszahl weggelassen
// wurden
Function ExpandAz(Var Value: String): String;
Var
  S : String;
  I : Integer;
Begin
  Result:='';
  If Value <> 'Then
  Begin
    S:=SepString(Value, '/'); // Aktenzeichen und Jahr trennen
    If TryStrToInt(S, I) Then // numerisches Aktenzeichen ?
      S:=FormatFloat('0000', I); // mit führenden Nullen
    If TryStrToInt(Value, I) Then
    Begin
      If I < 1999 Then Inc(I, 2000); // ggf. Dekaden ergänzen (1900er egal)
        S:=IntToStr(I); // kompl. Jahr in Str. umwandeln
      Result:=S + '/' + Value; // Az. und Jahr wieder zusammensetzen
    End;
  End;
End;
Function ExpandAz(Value: TCaption): String;
Var
  S : String;
Begin
  S:=Value; // auf String übertragen
  Result:=ExpandAz(S);   
End;
Mein Ziel - falls ich es auch anders erreichen kann - ist es, die Function auch mit TEdit.Text vom Typ TCaption als Parameter aufrufen zu können.

Danke und Gruß, Alex
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

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

Re: Funktion Überladen --> Doppeldeutiger überladener Auf

  Alt 3. Feb 2010, 13:48
Zitat:
Delphi-Quellcode:
type
  TCaption = type string;
Ist also auch nichts anderes und somit für den Compiler nicht unterscheidbar.
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
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#15

Re: Funktion Überladen --> Doppeldeutiger überladener Auf

  Alt 3. Feb 2010, 16:15
Zitat von DeddyH:
Ist also auch nichts anderes und somit für den Compiler nicht unterscheidbar.
Ich habe das Problem jetzt anders gelöst. Bei mir (TurboDelphi) ist TCaption übrigens ein AnsiString. Den habe ich für die Function genommen und der Compiler akzeptiert dann auch einen "normalen" String. Vorteil: Nur noch eine Function ohne zu überladen etc.
Es stellt sich mir aber die Frage, warum ich dann eine Fehlermeldung bekomme. Denn wenn TCaption = String ist, dann müsste das auch der Compiler wissen () und es wäre keine Fehlermeldung zu erwarten.

Gruß und Danke, Alex
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

Re: Funktion Überladen --> Doppeldeutiger überladener Auf

  Alt 3. Feb 2010, 16:53
Der String ist in TDE eine Weiterleitung zum AnsiString.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 00:11 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