![]() |
Compiler Warnung
Hallo,
ich hab folgende Funktion geschrieben:
Delphi-Quellcode:
Der Compiler spuckt mir aber immer folgende Warnung aus:
function DTS(x:real): real;
var i: integer; begin for i := 0 to 10 do begin if x = i then result := (i / 2); end end; [Warnung] Unit1.pas(111): Rückgabewert der Funktion 'DTS' könnte undefiniert sein Wichtig ist noch, dass x nur ganze Zahlenwerte von 0 bis 10 annehmen kann, darum muss an sich ja die Funktion DTS immer definiert sein, oder? Jetzt meine Frage, wie bekomm ich die Warnung weg, bzw. kann ich sie einfach ignorieren? Denn laufen tut das Programm einwandfrei. mfg Yoda2k3 |
Re: Compiler Warnung
Hallo!
Warnungen sollte man (eigentlich) nie ignorieren! Der Grund für die Warnung bei Dir ist die nur bedingte Rückgabe eines Wertes (Result:= xyz;). Entweder Du setzt ganz am Anfang der Funktion einen Rückgabewert oder Du spendierst dem IF noch ein ELSE und gibst dort einen Wert zurück. |
Re: Compiler Warnung
hm. Du probierst zehn Zahlen durch, und wenn X zufällig dem Wert einer dieser Zahlen entspricht, teilst Du es durch 2. :gruebel:
Der Delphi-Compiler sagt Dir, dass Dein Code nicht garantiert, dass die Bedingung x = i eintritt. Und demzufolge kann es sein, dass die Funktion ohne definierten Rückgabewert verlassen wird. Im Endeffekt fehlt da einfach ein ELSE-Zweig, sprich: Die Antwort auf die Frage, was passieren soll, wenn Deine Bedingung doch mal nicht zutrifft. |
Re: Compiler Warnung
Hallo,
da könnte der Kompiler recht haben. x kann beim Aufruf der Funktion größer 10 oder kleiner 0 sein und damit ist die IF-Bedingung nie erfüllt und in dem Fall hat die Funktion keinen Rückgabewert. |
Re: Compiler Warnung
Eine Möglichkeit:
Delphi-Quellcode:
function DTS(x:real): real; //wieso ist der Parameter real?
var i: integer; begin Result := -1; //initialer Rückgabewert for i := 0 to 10 do begin if x = i then result := (i / 2); end end; |
Re: Compiler Warnung
ausserdem ist es tödlich einen ganzzahltyp mit einem fließkommatyp auf gleichheit zu prüfen.
immer abs(x - i) < eps nehmen. wo bei eps für ein frei wählbares epsilon gilt. das gleiche gilt für den vergleich zweier fließkommatypen. |
Re: Compiler Warnung
Zitat:
Delphi-Quellcode:
function DTS(x:real): real;
begin Result := -1; if (x >= 0) and (x <= 10) and (Frac(x) = 0) then //Wenn x zwischen 0 und 10, und nach dem Komma nix steht Result := x / 2; end; |
Re: Compiler Warnung
Ich würde es ja so machen:
Delphi-Quellcode:
function DTS(x:integer): real;
begin Result := -1; if (x in [0..10]) then //Wenn x zwischen 0 und 10 Result := x / 2; end; |
Re: Compiler Warnung
Vielen Dank für eure aufschlussreichen Antworten.
Compilewarnung ist weg ;) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:50 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-2025 by Thomas Breitkreuz