AGB  ·  Datenschutz  ·  Impressum  







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

Compiler Warnung

Ein Thema von Yoda2k3 · begonnen am 22. Okt 2008 · letzter Beitrag vom 22. Okt 2008
Antwort Antwort
Yoda2k3

Registriert seit: 22. Okt 2008
2 Beiträge
 
#1

Compiler Warnung

  Alt 22. Okt 2008, 14:42
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
  Mit Zitat antworten Zitat
Benutzerbild von Dunkel
Dunkel

Registriert seit: 26. Mär 2007
Ort: Klingenstadt
541 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Compiler Warnung

  Alt 22. Okt 2008, 14:45
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.
Es ist zu wahr um schön zu sein...
  Mit Zitat antworten Zitat
Daniel
(Co-Admin)

Registriert seit: 30. Mai 2002
Ort: Hamburg
13.919 Beiträge
 
Delphi 10.4 Sydney
 
#3

Re: Compiler Warnung

  Alt 22. Okt 2008, 14:46
hm. Du probierst zehn Zahlen durch, und wenn X zufällig dem Wert einer dieser Zahlen entspricht, teilst Du es durch 2.

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.
Daniel R. Wolf
mit Grüßen aus Hamburg
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#4

Re: Compiler Warnung

  Alt 22. Okt 2008, 14:47
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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#5

Re: Compiler Warnung

  Alt 22. Okt 2008, 14:50
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von hazard999
hazard999

Registriert seit: 2. Okt 2008
38 Beiträge
 
#6

Re: Compiler Warnung

  Alt 22. Okt 2008, 14:59
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.
  Mit Zitat antworten Zitat
Benutzerbild von Fussball-Robby
Fussball-Robby

Registriert seit: 22. Okt 2007
Ort: Nähe Köln
1.063 Beiträge
 
Delphi 7 Enterprise
 
#7

Re: Compiler Warnung

  Alt 22. Okt 2008, 15:07
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;
Robert L.
Der folgende Satz ist richtig!
Der vorherige Satz ist falsch!

Paradox
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.542 Beiträge
 
Delphi 11 Alexandria
 
#8

Re: Compiler Warnung

  Alt 22. Okt 2008, 15:09
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;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Yoda2k3

Registriert seit: 22. Okt 2008
2 Beiträge
 
#9

Re: Compiler Warnung

  Alt 22. Okt 2008, 16:41
Vielen Dank für eure aufschlussreichen Antworten.
Compilewarnung ist weg
  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 09:37 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