Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Case-Anweisung wird nicht ausgeführt
Defe - So 12.10.14 16:28
Titel: Case-Anweisung wird nicht ausgeführt
Hallo liebe Community,
Ich knobel jetzt seit 1 Stunde.
Warum zur Hölle überspringt mein Compiler unten stehende Case-Anweisung, bzw. findet keinen richtigen Eingabewert?
Hier mal 2 von mir ausprobierte Varianten;
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| function TForm1.checkdat(s:string):boolean; var hilf:string; a,int,startpos,charcount,i:integer; begin case length(s) of 0..6,8,9,11..350:result:=false; 7: charcount:=1; 10:charcount:=2; end; ... |
ODER:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| function TForm1.checkdat(s:string):boolean; var hilf:string; a,int,startpos,charcount,i:integer; begin case length(s) of 7: charcount:=1; 10:charcount:=2 else result:=false; end; ... |
verschiedene Stringlängen habe ich übrigens durch eine "Showmessage" vor der Case-Anweisung ausprobiert, beispielsweise 4,9,11.
Er will aber einfach nicht auf den ELSE-Bereich hüpfen....
Moderiert von
Narses: Topic aus Sonstiges (Delphi) verschoben am So 12.10.2014 um 22:16
WasWeißDennIch - So 12.10.14 17:16
Und wenn Du das mal so umformulierst, dass die Optimierung nicht ggf. greift?
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| function TForm1.checkdat(s:string):boolean; var hilf: string; a,int,startpos,charcount,i: integer; begin case length(s) of 7: charcount := 1; 10: charcount := 2; else charcount := 0; end; Result := charcount > 0; end; |
Horst_H - So 12.10.14 17:23
Hallo,
dieser Schnipsel funktioniert doch:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45: 46: 47: 48: 49:
| {$IFDEF FPC} {$MODE DELPHi} {$ELSE} {$APPTYPE CONSOLE} {$ENDIF}
function checkdat1(s:string):boolean; var hilf:string; a,int,startpos,charcount,i:integer; begin charcount:=0; result := true; case length(s) of 7: charcount:=1; 10: charcount:=2; else result := false; end; end;
function checkdat2(s:string):boolean; var hilf:string; a,int,startpos,charcount,i:integer; begin charcount:=0; result:=false; case length(s) of 7: begin charcount :=1; result := true; end; 10: begin charcount :=2; result := true; end; end; end;
Var i: integer; s:string;
BEGIN s := ''; For i := 0 to 10 do begin s := s+chr(i+Ord('A')); writeln(s,' ',checkdat1(s)); writeln(s,' ',checkdat2(s)); end; END. |
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| A FALSE A FALSE AB FALSE AB FALSE ABC FALSE ABC FALSE ABCD FALSE ABCD FALSE ABCDE FALSE ABCDE FALSE ABCDEF FALSE ABCDEF FALSE ABCDEFG TRUE ABCDEFG TRUE ABCDEFGH FALSE ABCDEFGH FALSE ABCDEFGHI FALSE ABCDEFGHI FALSE ABCDEFGHIJ TRUE ABCDEFGHIJ TRUE ABCDEFGHIJK FALSE ABCDEFGHIJK FALSE |
Gruß Horst
mandras - So 12.10.14 21:45
Defe hat folgendes geschrieben : |
Hallo liebe Community,
Er will aber einfach nicht auf den ELSE-Bereich hüpfen.... |
Lokale Variablen in einer Func/Proc. sind vordefiniert - booleans als false, ints als 0, strings als leer etc.
result ist eine lokale Variable - somit ab Func-Beginn false.
Wenn Optimierung eingeschaltet ist (standard) wird der else-Zweig nicht codiert, da der Compiler weiß, daß er am Wert der Result-Variable nichts ändert.
WasWeißDennIch - So 12.10.14 22:16
Lokale Variablen sind eben nicht initialisiert, deshalb sollte man sie ggf. vorbelegen.
OlafSt - So 12.10.14 22:22
Das würde aber auch nichts ändern, außer man initialisiert Result mit true. Beläßt man es bei false, wird nach wie vor der else-Zweig vom Optimizer komplett entfernt, ergo scheint man im Debugger niemals im else-Zweig zu landen (wie auch, er existiert ja nicht mehr). So oder so: Anschließend gibts ne Warnung, das die auf Result und charcount zugewiesenen Werte nie benutzt werden ;)
Blup - Mo 13.10.14 10:09
OlafSt hat folgendes geschrieben : |
Das würde aber auch nichts ändern, außer man initialisiert Result mit true. |
Das ist nicht richtig. Der Rückgabewert wird beim Eintritt in die Funktion
nicht automatisch initialisiert.
Tatsächlich wird die Funktion wie eine Prozedur mit einem var-Parameter "Result" übersetzt.
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28:
| function Test1(AValue: Boolean): string; begin if AValue then Result := 'Test1(True)'; end;
procedure Test2(var Result: string; AValue: Boolean); begin if AValue then Result := 'Test2(True)'; end;
var s: string; begin s := 'Test1(False)'; s := Test1(False); Application.MessageBox('Testergebnis', s); s := Test1(True); Application.MessageBox('Testergebnis', s);
s := 'Test2(False)'; Test2(s, False); Application.MessageBox('Testergebnis', s); Test2(s, True); Application.MessageBox('Testergebnis', s); end; |
mandras - Mo 13.10.14 12:09
Ich nehme alles zurück..
Lokale Variablen werden nicht initialisiert.
Blup - Mo 13.10.14 14:20
Im Gegensatz zu Parametern werden einige lokale Variablen-Typen tatsächlich mit nil initialisiert.
String-Variable (nil = Leerstring)
Array-Variable (nil = Array mit 0 Elementen)
Interface-Variable (nil = nicht zugewiesen)
Alle anderen lokalen Variablen z.B. auch Object-Variablen sind nicht initialisiert.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!