otacon Geschrieben 22. März 2002 Geschrieben 22. März 2002 Hallo, ich hoffe ihr könnt mir bei meinem Problem helfen. Ich glaube ich sehe den Wald vor lauter Bäumen nicht. Entschuldigt den langen Post, aber es geht kaum kürzer. Mein Problem: Ich habe eine Funktion geschrieben, der zwei char-Arrays übergeben werden. Die char-Arrays sind wie folgt formatiert: 1. 123456#08:25:47#15.01.02 08:25:53# (Eingabeparameter in der Funktion: char *cDaten) 2. 15.01.02 (Eingabeparameter in der Funktion: char *cDatumBeginn) In meiner Funktion sollen diese beiden Arrays in tm-Structs umgewandelt werden und dann der Zeitunterschied in Sekunden ermittelt und zurückgegeben werden. Hier erstmal die Funktion: double ErmittlungUnterschied(char *cDaten, char *cDatumBeginn) { struct tm tmBeginn, tmEnde; // Beginn-Datum tmBeginn.tm_mday=atoi(cDatumBeginn); tmBeginn.tm_mon=atoi(cDatumBeginn+3)-1; tmBeginn.tm_year=atoi(cDatumBeginn+6)+100; // Beginn-Zeit tmBeginn.tm_hour=atoi(cDaten+7); tmBeginn.tm_min=atoi(cDaten+10); tmBeginn.tm_sec=atoi(cDaten+13); // Ende-Datum tmEnde.tm_mday=atoi(cDaten+16); tmEnde.tm_mon=atoi(cDaten+19)-1; tmEnde.tm_year=atoi(cDaten+22)+100; // Ende-Zeit tmEnde.tm_hour=atoi(cDaten+25); tmEnde.tm_min=atoi(cDaten+28); tmEnde.tm_sec=atoi(cDaten+31); time_t tSekBeginn=mktime(&tmBeginn); time_t tSekEnde=mktime(&tmEnde); return (tSekEnde-tSekBeginn); } Die Funktion liefert die richtigen Werte, wenn ich das Programm im Debug-Modus unter DOS (Win2000 und WinME) und Release-Modus unter DOS (allerdings nur WinME) ablaufen lassen. Unter UNIX (Solaris 2.6) und im Debug-Modus unter DOS (Win2000) liefert die Funktion falsche, völlig überhöhte Werte (Ich denke irgendeine Umwandlung funktioniert nicht) zurück. Wenn ich das Teil debugge oder Kontrollausgaben einbaue, läuft das Programm auf allen Plattformen prima und liefert auch die richtigen Werte. Was mache ich falsch oder unsauber? Gruß Michael Zitieren
Woodstock Geschrieben 22. März 2002 Geschrieben 22. März 2002 Kann es sein dass das Struct tm nicht Linux bzw. Unix kompatibel ist? Überprüfe das mal. Bine Zitieren
Orffi Geschrieben 22. März 2002 Geschrieben 22. März 2002 Das struct tm ist völlig losgelöst von Unix, Linux, Windows und allen anderen Betriebssystemen die es gibt. Hier kommt mal wieder der Standard zum tragen. Ich gehe jetzt einfach vom Ansi-C Standard aus. Der besagt, daß in <time.h> struct tm enthalten ist. Allerdings hat tm noch mehr Komponenten als Du initialisierst. Das ist ein Punkt, der nicht ganz sauber ist, denn tm_wday, tm_yday und tm_isdst sind nicht initialisiert und da können jetzt irgendwelche werden drinstehen. tm_wday: Tage seit Sonntag (0..6) tm_yday: Tage seit 1. Jan (0..365) tm_isdst: positiv, wenn Sommerzeit gilt, 0 wenn sie nicht gilt und negativ steht keine Information dazu zur Verfügung... Es ist aber schon komisch, daß das Programm korrekt läuft, wenn Du debugst. Vielleicht hilft es, wenn Du statt tSekEnde-tSekBeginn difftime ( tSekEnde, tSekBeginn ) benutzt. Leider habe ich diesmal nur Vermutungen und kann mit nichts Konkretem aufwarten. Jan Zitieren
otacon Geschrieben 22. März 2002 Autor Geschrieben 22. März 2002 Hallo, erstmal Danke für Eure Bemühungen bis hier hin. struct tm, ist wie Orffi richtig sagt, ANSI-C++ und somit plattformunabhängig. Die Sache mit dem "difftime" habe ich schon probiert. Hat leider nichts geholfen. Naja... Gruß Michael Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.