Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Unverständliche CASE-Anweisung (https://www.delphipraxis.net/168222-unverstaendliche-case-anweisung.html)

Daniel 10. Mai 2012 09:32

Delphi-Version: 2007

Unverständliche CASE-Anweisung
 
Moin,

manchmal weiß man nicht, warum es geht. Aber es geht - zumindest unter Delphi 2007:

Delphi-Quellcode:
program Project4;
{$APPTYPE CONSOLE}
uses
  SysUtils;

var myValue : integer;
     myText : string;
begin
   myValue:= 0;
   case myValue of
      1 : myText:= FormatFloat( '0.00', 4711.123 / 100 );
      2 : myText:= FormatFloat( '0.00', 4711.456 /  60 );
      else ''; /// <-- wat? wer bist DU denn?
   end;
end.
Am Ende steht
Delphi-Quellcode:
else '';
Keine Zuweisung - nichts. Und Delphi übersetzt den Code traumhaft schön und ist glücklich wie ein Schaf im Klee. Das sollte ich zwar auch sein, solange es geht - aber da stellt sich doch die Frage, was das da am Ende ist. Jemand eine Ahnung, aus welcher Ecke das kommen mag?

jaenicke 10. Mai 2012 09:37

AW: Unverständliche CASE-Anweisung
 
Bei Delphi XE gibt es dort eine Fehlermeldung.

Vermutlich wurde das bei Delphi 2007 einfach als nop akzeptiert. :mrgreen:

relocate 10. Mai 2012 09:38

AW: Unverständliche CASE-Anweisung
 
In D5 geht es nicht mit der Meldung:

Anweisung erforderlich, aber Ausdruck vom Typ 'String' gefunden.

p80286 10. Mai 2012 09:39

AW: Unverständliche CASE-Anweisung
 
Wie bitte??
unter D7:
[Fehler] Project2.dpr(13): Anweisung erforderlich, aber Ausdruck vom Typ 'String' gefunden

was hast Du da getrickst?
Gruß
K-H

UliBru 10. Mai 2012 09:41

AW: Unverständliche CASE-Anweisung
 
XE2 meldet
[DCC Error] MainUnit.pas(...): E2014 Statement expected, but expression of type 'string' found

DeddyH 10. Mai 2012 09:46

AW: Unverständliche CASE-Anweisung
 
XE meckert, aber Delphi 2007 nimmt das tatsächlich (übrigens auch andere Konstanten wie true, 1 oder Pi). Was sagt denn Dein XE3 Architect dazu? :mrgreen:

himitsu 10. Mai 2012 10:07

AW: Unverständliche CASE-Anweisung
 
Hab mein 2007 grad nicht dabei. :cry:
Was macht der Compiler denn für Code daraus?

Eventuell wird dieser String wie eine Funktion behandelt?
Deren Ergebnis muß man ja auch nicht unbedingt irgendwo zuweisen. (außer dieses Verhalten wurde deaktiviert)

Daniel 10. Mai 2012 10:09

AW: Unverständliche CASE-Anweisung
 
Zitat:

Zitat von himitsu (Beitrag 1165809)
Was macht der Compiler denn für Code daraus?

Tja - da muss ich gestehen, dass Assembler meine schwache Seite ist. :oops: Ich kann nur sagen, dass da 'ne EXE-Datei rauskommt und dass die eher merkwürdig aussieht, wenn ich sie in Word öffne. :stupid:

Vielleicht kannst Du mir in zwei, drei Stichworten sagen, wie ich hier hilfreiche Informationen erhalten kann. :-)

uligerhardt 10. Mai 2012 10:25

AW: Unverständliche CASE-Anweisung
 
Mein D2007 schluckt's auch. Folgender Code
Delphi-Quellcode:
function Blah(myValue: Integer): string;
begin
  case myValue of
    1: Result := 'OK';
    2: Result := 'OK';
    else
      '666'; /// <-- wat? wer bist DU denn?
  end;
end;

function Blubb(myValue: Integer): string;
begin
  case myValue of
    1: Result := 'OK';
    2: Result := 'OK';
    else
      Result := '666'; /// <-- wat? wer bist DU denn?
  end;
end;
liefert folgenden Assembler-Code:
Code:
MainF.pas.39: case myValue of
004570E4 8B45FC          mov eax,[ebp-$04]
004570E7 48               dec eax
004570E8 7405             jz $004570ef
004570EA 48               dec eax
004570EB 7411             jz $004570fe
004570ED EB1C            jmp $0045710b
MainF.pas.40: 1: Result := 'OK';
004570EF 8B45F8           mov eax,[ebp-$08]
004570F2 BA18714500       mov edx,$00457118
004570F7 E86CD7FAFF      call @LStrAsg
004570FC EB0D            jmp $0045710b
MainF.pas.41: 2: Result := 'OK';
004570FE 8B45F8           mov eax,[ebp-$08]
00457101 BA18714500       mov edx,$00457118
00457106 E85DD7FAFF      call @LStrAsg
MainF.pas.45: end;
bzw.
Code:
MainF.pas.49: case myValue of
00457134 8B45FC          mov eax,[ebp-$04]
00457137 48               dec eax
00457138 7405             jz $0045713f
0045713A 48               dec eax
0045713B 7411             jz $0045714e
0045713D EB1E            jmp $0045715d
MainF.pas.50: 1: Result := 'OK';
0045713F 8B45F8           mov eax,[ebp-$08]
00457142 BA78714500       mov edx,$00457178
00457147 E81CD7FAFF      call @LStrAsg
0045714C EB1C            jmp $0045716a
MainF.pas.51: 2: Result := 'OK';
0045714E 8B45F8           mov eax,[ebp-$08]
00457151 BA78714500       mov edx,$00457178
00457156 E80DD7FAFF      call @LStrAsg
0045715B EB0D            jmp $0045716a
MainF.pas.53: Result := '666'; /// <-- wat? wer bist DU denn?
0045715D 8B45F8           mov eax,[ebp-$08]
00457160 BA84714500       mov edx,$00457184
00457165 E8FED6FAFF      call @LStrAsg
MainF.pas.55: end;
Scheinbar wird der ominöse else-Fall einfach ignoriert.

Nersgatt 10. Mai 2012 10:26

AW: Unverständliche CASE-Anweisung
 
Sowas ist mir letztens aus passiert mit D2010. Hat der Compiler ohne zu meckern gefressen und ich wunder mich, warum das Programm nicht das mach, was ich will.... :stupid:


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:02 Uhr.
Seite 1 von 2  1 2      

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