Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Overload: Merkwürdige Funktionswahl (https://www.delphipraxis.net/167490-overload-merkwuerdige-funktionswahl.html)

blablab 2. Apr 2012 09:19

Overload: Merkwürdige Funktionswahl
 
Hallo!

Ich benutze Delphi 7 und habe folgendes Codebeispiel:
Delphi-Quellcode:
procedure Test(Value: Byte); overload;
begin
   ShowMessage('Byte');
end;

procedure Test(Value: Word); overload;
begin
   ShowMessage('Word');
end;

procedure TestIt;
var int: LongWord;
begin
   int := 65535;
   Test(int);
end;
Beim Aufruf von TestIt bekomme ich eine Meldung mit 'Byte' bzw. eine Fehlermeldung wenn die Bereichsprüfung aktiviert ist.

Ist diese Wahl der Test-Funktion nicht ein bisschen merkwürdig? Es wäre doch viel sinnvoller die 2. Funktion zu verwenden...

Weiß jemand warum das so ist oder ob sich dieses Verhalten mit einer höheren Delphi-Version geändert hat?

Grüße
blablab

Bernhard Geyer 2. Apr 2012 09:23

AW: Overload: Merkwürdige Funktionswahl
 
Beide Versionen passen ja nicht. Du hast LongWord und nur eine Byte/Word-Methode.

Was passiert wenn du die Reihenfolge der beiden überladenen Funktionen vertauscht so das der Compiler erst die Word-Version "sieht".

himitsu 2. Apr 2012 09:24

AW: Overload: Merkwürdige Funktionswahl
 
Wenn Delphi sich nicht entscheiden kann, was hier der Fall ist, da der übergebene Parameter mit keiner der möglichen Parameterlisten übereinstimmt, dann versucht es gerne die erste gefundene Deklaration. (bei den Typen, wo eine automatische Umrechnung möglich wäre)

Deklariere mal das Word als Erstes.

PS: Ohne aktive Überlaufprüfung bekommt man hier auch keine Fehlermeldung.

blablab 2. Apr 2012 09:46

AW: Overload: Merkwürdige Funktionswahl
 
Also die Reihenfolge in der die Funktionen definiert sind ändert nichts. Der Compiler bevorzugt hier wirklich die Byte-Funktion. Ich frag mich nur warum...

Edit:
Wenn man das Problem undreht, also man hat einen "kleinen" Datentypen und verschiedene überladene Funktionen mit "größeren" Datentypen, dann macht der Compiler alles richtig. Er schaut als erstes nach dem Vorzeichen, bevorzugt also bei Vorzeichenlosen Datentypen auch vorzeichenlose Funktionen und vice versa. Und dann verwendet er die Funktion mit dem kleinstmöglichen Datentyp.

Z.B beim Shortint bevorzugt er Funktionen in dieser Reihenfolge:
Shortint
Smallint
Longint
Int64
Byte
Word
Longword

Wobei das ein besonderes Beispiel ist, da er bei anderen Datentypen sich oft nicht entscheiden kann, z.B:
Datentyp: Int64
Funktion1: Shortint
Funktion2: Byte
ergibt den Fehler: "Doppeldeutiger überladener Aufruf von 'Funktionsname'".
Wobei es hier doch auch wieder logisch wäre sich für den Shortint zu entscheiden...

brechi 7. Apr 2012 20:56

AW: Overload: Merkwürdige Funktionswahl
 
Auch wenns für dich Sinnvoller erscheint:
1) solltest sowas beim programmieren nicht vorkommen (weil 2. bzw wenn doch)
2) caste den Aufruf in ein Word oder Byte

Popov 7. Apr 2012 21:28

AW: Overload: Merkwürdige Funktionswahl
 
Also Overload ist schön und gut, aber wer zweideutige Funktionen überlädt ist eigentlich selber schuld. Es wird wohl deswegen Byte genommen, weil es auf Byte passt. Beweis:
Delphi-Quellcode:
var
  a: Byte;
begin
  a := 255;
  a := a + 100;
  ShowMessage(IntToStr(a));
end;
Hier gibt es keine Fehlermeldung obwohl Byte Maxwert überschritten wurde. Hier wird 65535 einfach als Byte mit Überlauf gesehen. Wahrscheinlich auch in deinem Beispiel.

himitsu 7. Apr 2012 21:55

AW: Overload: Merkwürdige Funktionswahl
 
Zitat:

Zitat von Popov (Beitrag 1160647)
Hier gibt es keine Fehlermeldung

Wenn man die Überlaufprüfung aktiviert, dann ....


Alle Zeitangaben in WEZ +1. Es ist jetzt 23: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