AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Overload: Merkwürdige Funktionswahl

Ein Thema von blablab · begonnen am 2. Apr 2012 · letzter Beitrag vom 7. Apr 2012
Antwort Antwort
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#1

Overload: Merkwürdige Funktionswahl

  Alt 2. Apr 2012, 10:19
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
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Overload: Merkwürdige Funktionswahl

  Alt 2. Apr 2012, 10:23
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".
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Overload: Merkwürdige Funktionswahl

  Alt 2. Apr 2012, 10:24
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
blablab

Registriert seit: 3. Jan 2006
509 Beiträge
 
Delphi 7 Enterprise
 
#4

AW: Overload: Merkwürdige Funktionswahl

  Alt 2. Apr 2012, 10:46
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...

Geändert von blablab ( 2. Apr 2012 um 11:07 Uhr)
  Mit Zitat antworten Zitat
brechi

Registriert seit: 30. Jan 2004
823 Beiträge
 
#5

AW: Overload: Merkwürdige Funktionswahl

  Alt 7. Apr 2012, 21:56
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
  Mit Zitat antworten Zitat
Popov
(Gast)

n/a Beiträge
 
#6

AW: Overload: Merkwürdige Funktionswahl

  Alt 7. Apr 2012, 22:28
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.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Overload: Merkwürdige Funktionswahl

  Alt 7. Apr 2012, 22:55
Hier gibt es keine Fehlermeldung
Wenn man die Überlaufprüfung aktiviert, dann ....
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort


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 20:47 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