Entwickler-Ecke

Sonstiges (Delphi) - Result von Funktionen - undefinierter Rückgabewert


galagher - Fr 11.03.11 17:21
Titel: Result von Funktionen - undefinierter Rückgabewert
Hallo zusammen!

Was ich schon immer wissen wollte: Wie macht ihr das mit Delphi's Compiler-Meldung "Rückgabewert von Funktion XY kann undefiniert sein", wenn ihr aber ganz genau wisst, dass das nicht eintreten kann?
Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
function TForm1.ElementsToInt(aElement: TElements): Integer;
begin
  case aElement of
    elPlayer: Result := iPlayer;
    elBorder: Result := iBorder;
//...
  end;

Es muss definitiv ein Result aus case sein, undefiniert kann hier niemals eintreten, da aElement IMMER kompatibel zu TElements sein wird, denn, wenn man voraussestzt, dass das case alle Möglichkeiten abdeckt, es zwangsläufig zu einem dieser Results kommen muss.

Eine Möglichkeit wäre es, ein "Default" zu definieren, also zB.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
function TForm1.ElementsToInt(aElement: TElements): Integer;
begin
  Result := iBorder;  //Default-Wert

  case aElement of
    elPlayer: Result := iPlayer;
    elBorder: Result := iBorder;
//...
  end;

Ich mag das aber nicht so recht. Dennoch meine Frage: Wie macht man das, was ist sozusagen üblich?


jaenicke - Fr 11.03.11 17:23


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function TForm1.ElementsToInt(aElement: TElements): Integer;
begin
  case aElement of
    elPlayer: Result := iPlayer;
    elBorder: Result := iBorder;
  else
    Result := iBorder;
  end;


galagher - Fr 11.03.11 17:40

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function TForm1.ElementsToInt(aElement: TElements): Integer;
begin
  case aElement of
    elPlayer: Result := iPlayer;
    elBorder: Result := iBorder;
  else
    Result := iBorder;
  end;

Ok, eine Lösung.
Kompatibilität bei Änderungen des Programmes im Sinne von "wer weiss, was sich noch alles ändert und ich nicht (mehr) bedenke. Dann kracht's hier womöglich, also sicher ist sicher.".

Jetzt knack mal diese Nuss - aBoard ist ein zweidimensionales Array:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
  function DestField(Key: Word; l, t: Integer): TElements;
  begin
    if Key = VK_UP then    Result := aBoard[l, t-1];
    if Key = VK_DOWN then  Result := aBoard[l, t+1];
    if Key = VK_LEFT then  Result := aBoard[l-1, t];
    if Key = VK_RIGHT then Result := aBoard[l+1, t];
  end;  {end von DestField}

Was soll denn hier sonst kommen, wir wissen doch genau, eines wird, ja muss zutreffen, weil nämlich DestField immer - und IMMER NUR DANN! - aufgerufen wird, wenn wir eine der Pfeiltasten drücken?

Ist hier die Lösung auch im Sinne von case Key of ... else ?


bummi - Fr 11.03.11 17:47


Delphi-Quelltext
1:
else Result := aBoard[l, t];                    


galagher - Fr 11.03.11 17:57

user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:

Delphi-Quelltext
1:
else Result := aBoard[l, t];                    

Hm... das passt für meine Zwecke überhaupt nicht, wäre sogar falsch, eine Unmöglichkeit, da das nicht vorkommen kann, weil l,t einmalig ist.

Ich werde aber meine Funktionen in diesem Sinne überarbeiten! Vielen Dank! :)


jaenicke - Fr 11.03.11 18:07

Wenn der Fall else nie auftreten kann bzw. darf, kannst du dort auch eine Exception werfen. Natürlich mit aussagekräftiger Meldung für dich. Dann kommt auch keine Warnung.


galagher - Fr 11.03.11 18:52

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Wenn der Fall else nie auftreten kann bzw. darf, kannst du dort auch eine Exception werfen. Natürlich mit aussagekräftiger Meldung für dich. Dann kommt auch keine Warnung.

Danke, ist besser!