Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2562
Erhaltene Danke: 46

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 11.03.11 17:21 
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:
ausblenden 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.
ausblenden 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?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19338
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Fr 11.03.11 17:23 
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2562
Erhaltene Danke: 46

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 11.03.11 17:40 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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:
ausblenden 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 ?

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
bummi
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 1248
Erhaltene Danke: 187

XP - Server 2008R2
D2 - Delphi XE
BeitragVerfasst: Fr 11.03.11 17:47 
ausblenden Delphi-Quelltext
1:
else Result := aBoard[l, t];					

_________________
Das Problem liegt üblicherweise zwischen den Ohren H₂♂
DRY DRY KISS
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2562
Erhaltene Danke: 46

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Fr 11.03.11 17:57 
user profile iconbummi hat folgendes geschrieben Zum zitierten Posting springen:
ausblenden 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! :)

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19338
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2562
Erhaltene Danke: 46

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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!

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!