AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Rueckgabewerte von ueberladenen Funktionen?
Thema durchsuchen
Ansicht
Themen-Optionen

Rueckgabewerte von ueberladenen Funktionen?

Ein Thema von alcaeus · begonnen am 13. Apr 2005 · letzter Beitrag vom 20. Jul 2005
Antwort Antwort
Seite 1 von 3  1 23      
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#1

Rueckgabewerte von ueberladenen Funktionen?

  Alt 13. Apr 2005, 09:27
Hallo allerseits,

im anderen Thread habe ich ja ein Optionssystem angesprochen. Um die Optionswerte zu holen, wollte ich eigentlich Methoden verwenden, die auch schon den entsprechenden Typecast (von String) vornehmen. Allerdings scheint das mit den ueberladenen Methoden nicht zu funktionieren:

Delphi-Quellcode:
function GetOption(iOptionConst: Integer): String; overload;
function GetOption(iOptionConst: Integer): Integer; overload;
In der zweiten Zeile schimpft der Compiler: "Declaration of GetOption differs from previous declaration". Dass sich die Deklarationen sich unterscheiden ist mir klar, aber sollte das nicht der Sinn und Zweck von ueberladenen Funktionen sein?
Oder muessen sich etwa die Parameterlisten unterscheiden? Wenn ja, wie sollte ich das sonst machen? Die Optionswerte werden als String abgespeichert und es waere natuerlich geschickt wenn ich eine Funktion habe, die mir direkt den gewuenschten Wert auf den richtigen Typ castet und zurueckgibt.
Kann mir jemand helfen?

Thanx and Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von jim_raynor
jim_raynor

Registriert seit: 17. Okt 2004
Ort: Berlin
1.251 Beiträge
 
Delphi 5 Standard
 
#2

Re: Rueckgabewerte von ueberladenen Funktionen?

  Alt 13. Apr 2005, 09:32
Ja, bei Überladenene Funktionen müssen sich die Parameter unterscheiden, denn sonst weiß der Compiler nicht welche Funktion genutzt werde soll. Entweder nutzt du Variants (was natürlich wesentlich langsamer ist) oder du musst einfach die Funktionen unterschiedlich benennen, so wie es bei verschiedenen Inkarnationen von TRegistry und ähnlichem der Fall ist.
Christian Reich
Schaut euch mein X-COM Remake X-Force: Fight For Destiny ( http://www.xforce-online.de ) an.
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#3

Re: Rueckgabewerte von ueberladenen Funktionen?

  Alt 13. Apr 2005, 10:09
Na gut, dann werde ich wohl mit solchen "Aushilfsmethoden" arbeiten (muessen).

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von SubData
SubData

Registriert seit: 14. Sep 2004
Ort: Stuhr
1.078 Beiträge
 
Delphi 11 Alexandria
 
#4

Re: Rueckgabewerte von ueberladenen Funktionen?

  Alt 13. Apr 2005, 10:16
Ich verwende dafür nen Variant, das geht auch wunderbar
Delphi-Quellcode:
function Config(Section, Value: String; Default: Variant; Typ: String = 'V'): Variant; Overload;
var
  Read : Variant;
  ReadInt : Integer;
begin
  // Einen Konfigurationswert zurückgeben...
  if (Typ <> 'R') then Read := CfgValues.Values[Section + '_' + Value];
  if (Typ = 'R') then
  begin
    Read := CfgRegExp.Values[Section + '_' + Value];
    if not (Read <> '') then Read := Default;
    if not (Read <> '') then Read := '$';
    Result := Read;
  end;
  if ((Typ = 'V') or (Typ = 'S')) then
  begin
    if not (Read <> '') then Read := Default;
    Result := Read;
  end;
  if (Typ = 'B') then
  begin
    Result := Default;
    if (Read = '1') then Result := True;
    if (Read = '0') then Result := False;
  end;
  if (Typ = 'I') then
  begin
    if not (TryStrToInt(Read, ReadInt)) then Result := Default
    else Result := ReadInt;
  end;
end;

Edit: Es gibt die Funktion nochmal deswegen der Overload...

Delphi-Quellcode:
function Config(Section, Value: String; Typ: String = 'V'): Variant; Overload;
begin
  Result := Config(Section, Value, '', Typ);
end;
Ronny
/(bb|[^b]{2})/
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#5

Re: Rueckgabewerte von ueberladenen Funktionen?

  Alt 13. Apr 2005, 10:32
Zitat von SubData:
Ich verwende dafür nen Variant, das geht auch wunderbar
Ja, allerdings moechte ich die Verwendung von Variants soweit wie moeglich vermeiden, weil Fehler nicht ganz so ersichtlich sind. Ich behalte deine Loesung aber mal im Hinterkopf.

Greetz
alcaeus
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
Benutzerbild von SubData
SubData

Registriert seit: 14. Sep 2004
Ort: Stuhr
1.078 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Rueckgabewerte von ueberladenen Funktionen?

  Alt 13. Apr 2005, 10:35
Aus dem Grund kannste ja den Typ angeben der zurück gegeben werden soll

Aber hast schon Recht, ich versuche auch weitgehend auf Variants zu verzichten :>
Ronny
/(bb|[^b]{2})/
  Mit Zitat antworten Zitat
DevilsCamp
(Gast)

n/a Beiträge
 
#7

Re: Rueckgabewerte von ueberladenen Funktionen?

  Alt 19. Jul 2005, 09:20
Da ich gerade das selbe Problem habe habe ich diesen Thread gefunden


Zitat von jim_raynor:
Ja, bei Überladenene Funktionen müssen sich die Parameter unterscheiden, denn sonst weiß der Compiler nicht welche Funktion genutzt werde soll. Entweder nutzt du Variants (was natürlich wesentlich langsamer ist) oder du musst einfach die Funktionen unterschiedlich benennen, so wie es bei verschiedenen Inkarnationen von TRegistry und ähnlichem der Fall ist.
Ich habe folgenden Code:

Delphi-Quellcode:
interface
  function Test(Bla: String): String; overload;
  function Test(Bla: String): Integer; overload;

implementation

function Test(Bla: String): String;
begin
  Result := 'Hallo '+Bla;
end;

function Test(Bla: String): Integer;
begin
  Result := StrToIntDef(Bla, 0);
end;

procedure Hallo;
var
  i : Integer;
  s : String;
begin
  s := Test('Peter');
  i := Test('12345');
end;

end.
Der Compiler weiß doch, dass s ein String und i ein Integer ist. Wieso ist er also nicht in der Lage herauszufinden, dass s die Funktion benötigt, die ein String zurückgibt und i die entsprechende Integer-Variante?

Das das bei Prozeduren mit selben Parametern nicht funktionieren kann ist klar, aber bei Funktionen ist diese Einschränkung doch etwas unlogisch.

Ich verweise da mal auf die nette Funktion Explode aus der Code-Library. Die gibt dort ein String-Array zurück. Genauso gut kann man die aber auch so umschreiben, dass ein Integer-Array zurück gegeben wird. Und das bei der selben Parameter-Liste.

Und genau das ist z.Z. mein Problem.
Dass ich die Funktion wohl nicht beliebig nutzen kann, nur weil der Compiler es nicht mag, wenn nur der Ergebnis-Typ unterschieldich ist
  Mit Zitat antworten Zitat
Benutzerbild von mirage228
mirage228

Registriert seit: 23. Mär 2003
Ort: Münster
3.750 Beiträge
 
Delphi 2010 Professional
 
#8

Re: Rueckgabewerte von ueberladenen Funktionen?

  Alt 19. Jul 2005, 09:26
Hi,

Diese Entscheidung kann der Compiler nicht (immer) treffen.

Was sollte er denn in diesem Fall tun:

Delphi-Quellcode:
var
  V: Variant;
begin
  V := Test('Peter');
end;
Soll er nun einen Integer oder String zurückgeben?

Es wäre zu zeitaufwendig für den Compiler immer herauszufinden, in welchem Kontext die Funktion benutzt wird. Bei Parametern ist es da einfacher.

mfG
mirage228
David F.

May the source be with you, stranger.
PHP Inspection Unit (Delphi-Unit zum Analysieren von PHP Code)
  Mit Zitat antworten Zitat
Benutzerbild von leddl
leddl

Registriert seit: 13. Okt 2003
Ort: Künzelsau
1.613 Beiträge
 
Delphi 2006 Professional
 
#9

Re: Rueckgabewerte von ueberladenen Funktionen?

  Alt 19. Jul 2005, 09:44
Außerdem könnte man theoretisch die Funktion auch ohne Zuweisung aufrufen.
Axel Sefranek
A programmer started to cuss, cause getting to sleep was a fuss.
As he lay there in bed, looping round in his head
was: while(!asleep()) ++sheep;
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#10

Re: Rueckgabewerte von ueberladenen Funktionen?

  Alt 19. Jul 2005, 10:14
Zitat von leddl:
Außerdem könnte man theoretisch die Funktion auch ohne Zuweisung aufrufen.
Richtig!
Genau deshalb gehört der Rückgabewert nicht zur Signatur einer Funktion. (Ein Prozedur ist ja auch nur ein Funktion, die nüscht zurückgibt )
Da für Overloads die Signatur eindeutig sein muss, sollte klar sein warum das nicht geht.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 07: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