Zum Inhalt springen

Probleme bei der Umwandlung von Datentypen?


otacon

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...