![]() |
Overload: Merkwürdige Funktionswahl
Hallo!
Ich benutze Delphi 7 und habe folgendes Codebeispiel:
Delphi-Quellcode:
Beim Aufruf von TestIt bekomme ich eine Meldung mit 'Byte' bzw. eine Fehlermeldung wenn die Bereichsprüfung aktiviert ist.
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; 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 |
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". |
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. |
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... |
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 |
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:
Hier gibt es keine Fehlermeldung obwohl Byte Maxwert überschritten wurde. Hier wird 65535 einfach als Byte mit Überlauf gesehen. Wahrscheinlich auch in deinem Beispiel.
var
a: Byte; begin a := 255; a := a + 100; ShowMessage(IntToStr(a)); end; |
AW: Overload: Merkwürdige Funktionswahl
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:24 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 by Thomas Breitkreuz