Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Compiler Warnung (https://www.delphipraxis.net/122816-compiler-warnung.html)

Yoda2k3 22. Okt 2008 14:42


Compiler Warnung
 
Hallo,

ich hab folgende Funktion geschrieben:
Delphi-Quellcode:
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;
Der Compiler spuckt mir aber immer folgende Warnung aus:
[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

Dunkel 22. Okt 2008 14:45

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.

Daniel 22. Okt 2008 14:46

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.

nahpets 22. Okt 2008 14:47

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.

DeddyH 22. Okt 2008 14:50

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;

hazard999 22. Okt 2008 14:59

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.

Fussball-Robby 22. Okt 2008 15:07

Re: Compiler Warnung
 
Zitat:

Zitat von DeddyH
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;

Wie wärs stattdessen einfach so:
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;

DeddyH 22. Okt 2008 15:09

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;

Yoda2k3 22. Okt 2008 16:41

Re: Compiler Warnung
 
Vielen Dank für eure aufschlussreichen Antworten.
Compilewarnung ist weg ;)


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