Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - Problem mit strtotime


GuaAck - Mi 04.07.12 22:59
Titel: Problem mit strtotime
Liebe Experten,

auch mit viel Erfahrung in Delphi gibt es immer wieder Fragen. Ich möchte einfach einen String in TDateTime wandeln:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
VAR
  xxx: tdatetime;
..
GetLocaleFormatSettings(1031,FormatSettings); {1031 = Deutschland }
xxx:=strtotime('10:20:31', Formatsettings);
..

Es gibt keine Fehlermeldung, strtotime erkennt also eine gültige Zeit, aber xxx ist im Debugger immer was mit 1.xxxe+292, also Unsinn, auch bei der weiteren Verarbeitung.

Ähnlich, wenn ich ein Datum mit strtodate konvertiere.

Formatsettings brauche ich eigentlich nicht, aber das sieht ok aus. Unten das, was der Debugger anzeigt. Die 12690 sind für mich nicht verständlich, aber wenn ich die z. B. auf 0 ändere, das hat keinen Einfluss.

Habe xxx auch mal als double deklariert - logisch, kein Einfluss.

Hat jemand einen Tipp? Zur Info: Delphi 7 Professional, Windows XP SP3.

Gruß GuaAck

FormatSettings im Debugger:

Delphi-Quelltext
1:
(38'.'','2'.'':'';''DM''dd.MM.yyyy''dddd, d. MMMM yyyy''''''hh:mm''hh:mm:ss', ('Jan''Feb''Mrz''Apr''Mai''Jun''Jul''Aug''Sep''Okt''Nov''Dez'), ('Januar''Februar''März''April''Mai''Juni''Juli''August''September''Oktober''November''Dezember'), ('So''Mo''Di''Mi''Do''Fr''Sa'), ('Sonntag''Montag''Dienstag''Mittwoch''Donnerstag''Freitag''Samstag'), 12690)                    

Moderiert von user profile iconNarses: Delphi-Tags hinzugefügt


jaenicke - Mi 04.07.12 23:34

Ich habe es mal ausprobiert:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
var
  xxx: TDateTime;
  FormatSettings: TFormatSettings;
begin
  GetLocaleFormatSettings(1031, FormatSettings); { 1031 = Deutschland }
  xxx := strtotime('10:20:31', FormatSettings);
  ShowMessage(FloatToStr(xxx));
Damit kann ich das nicht reproduzieren, das funktioniert bei Delphi 7 problemlos, da kommt korrekt 0,43... heraus. :nixweiss:
(Und bei XE2 genauso)


Narses - Do 05.07.12 10:24

Moin!

user profile iconGuaAck hat folgendes geschrieben Zum zitierten Posting springen:
Delphi 7 Professional, Windows XP SP3.
Soeben genau damit ausprobiert, wie bei user profile iconjaenicke, korrekte 0,43... :nixweiss:

Irgendwelche Seiteneffekte ausgeschlossen? Mal ein neues, leeres Projekt nur mit diesem Code getestet? :lupe:

cu
Narses


mandras - Do 05.07.12 11:06

kann es sein daß die Optimierung zugeschlagen hat?
Ich hab es mit XE2 ausprobiert, Deinen Quelltext 1:1 übernommen ohne das xxx im Folgenden zu verwenden. Beim Debuggen ohne Optimierung enthält xxx korrekt 0,43. MIT Optimierung zeit der Debugger immer 0 an da die Variable nicht weiter verwendet wird. Baue ich nun irgendeine Weiterverwendung von xxx ein zeigt auch der Debugger immer die korrekten 0,43


Narses - Do 05.07.12 11:42

Moin!

user profile iconmandras hat folgendes geschrieben Zum zitierten Posting springen:
kann es sein daß die Optimierung zugeschlagen hat?
[...]
MIT Optimierung zeit der Debugger immer 0 an da die Variable nicht weiter verwendet wird. Baue ich nun irgendeine Weiterverwendung von xxx ein zeigt auch der Debugger immer die korrekten 0,43
Das Verhalten ist - ohne dass ich jetzt ausführlich nachgesehen hätte - korrekt, weil dann der Wert direkt in einem FPU-Register stehen bleibt (nehme ich an).

Ich tippe eher auf überschriebenen Speicher oder sowas. :suspect:

cu
Narses


GuaAck - Do 05.07.12 21:13

Danke an alle,

es ist ein Optimierungsproblem des Compilers: Da der Compiler gemerkt hat, dass ich xxx nicht weiter benutze - ich wollte den Wert ja nur mit dem Debugger ansehen - hat er xxx wohl nicht wirklich als Variable angelegt. Als die Zeile ShowMessage eingefügt hatte, da wurde xxx gebraucht und dann habe ich auch im Debugger den richtigen Wert gesehen.

Wenn ich xxx im PUBLIC-Teil meiner Klasse definiere und nicht lokal, dann geht es auch.

Danke also nochmals,
Gruß
GuaAck