problem mit tm*
-
hallo,
ich hab ein problem mit einer tm* struct ich will ihr nacheinander Werte zuweisen aber dass klappt irgendwie ni....tm * srcTime; tm * timeinfo; time ( &rawtime ); timeinfo = localtime ( &rawtime ); srcTime->tm_mon=timeinfo->tm_mon; srcTime->tm_wday=timeinfo->tm_wday; srcTime->tm_yday=timeinfo->tm_yday; srcTime->tm_mday=timeinfo->tm_mday; srcTime->tm_isdst=timeinfo->tm_isdst; //hier stürzt dass programm mit "Appcrash" ab.... srcTime->tm_hour=18; srcTime->tm_min=30; srcTime->tm_sec=8;
Danke schonam für eure Lösungen...
-
klg71 schrieb:
hallo,
ich hab ein problem mit einer tm* struct ich will ihr nacheinander Werte zuweisen aber dass klappt irgendwie ni....tm * srcTime; tm * timeinfo; time ( &rawtime ); timeinfo = localtime ( &rawtime ); srcTime->tm_mon=timeinfo->tm_mon; srcTime->tm_wday=timeinfo->tm_wday; srcTime->tm_yday=timeinfo->tm_yday; srcTime->tm_mday=timeinfo->tm_mday; srcTime->tm_isdst=timeinfo->tm_isdst; //hier stürzt dass programm mit "Appcrash" ab.... srcTime->tm_hour=18; srcTime->tm_min=30; srcTime->tm_sec=8;
Danke schonam für eure Lösungen...
1. Bitte cpp-Tags statt code-Tags benutzen
2. sieht das nicht so aus, als würde srcTime auf irgendein tm-Objekt zeigen, sondern nicht initialisiert sein.
3. Was heißt "Appcrash"?
4. Was ist rawtime?
-
Du dereferenzierst einen Zeiger, srcTime, dem keine gültige Adresse zugewiesen wurde.
time_t rawtime = time ( NULL ); struct tm* timeinfo = localtime ( &rawtime ); struct tm copy = {0}; // Alle Strukturelemente mit 0 initialisieren. // Jedes Element einzeln kopieren, ... copy.tm_hour = timeinfo->tm_hour; copy.tm_isdst = timeinfo->tm_isdst; // ... usw. // Oder einfach: copy = *timeinfo; // Alle Strkuturelemente kopieren.
-
so appcrash heißt dass das programm abstürzt....:)
Ich hab dass prob jetz iwie mit malloc gelöst.
Jetz ist was neues gekommen, wenn ich mit sprintf etwas in einen string schreibe und dabei zweimal asctime benutze bekomme ich zweimal die gleiche zeit bei unterschiedlichen parametern...sprintf(Textout,"Time: %s %s",asctime(timeinfo),asctime(srcTime));
aber so gehts komischerweise...
sprintf(Textout,"Time: %s",asctime (localtime ( &rawtime ))); sprintf(Textout,"%s %s",Textout,asctime(srcTime));
Ich vergleiche die Uhrzeiten danach auch noch aber es kommt immer null raus...
difftime(mktime (srcTime),mktime(timeinfo) )
So jetz möchte ich gerne wissen warum...
Die Codeelemente von letztem beitrag sind alle dafor eingebaut.
-
Ähm...
du kopierst doch den gesamten Inhalt von timeinfo in srcTime, also sollte doch auch die selbe Zeit rauskommen, oder sehe ich das falsch?
Bei der zweiten Variante hingegen fragst du die Zeit erst später ab, deswegen ergibt sich dann auch ein Unterschied.
-
ähm ich kopiere nur einen teil der einen struktur in die andere ich stelle zum beispiel den hour, den sec und den min wert selber ein und jetzt ist es nicht so spät wie ich da angegeben habe(siehe beitrag eins.)
-
Achso, mal wieder zu voreilig...
dann kann ich dir im Moment leider nicht helfen.EDIT: Kannst du mal bitte das ganze Programm posten, dann kann ich es mal selbst testen?
-
Danke für deinen Hinweiß wxSkip der hat mich auf die Lösung gebracht ich habe nämlich nicht alle nötigen informationen von der einen in die andere struktur geladen...
tm_year hat gefehlt.
Ich bin übrigens dabei gewesen einen wecker zu programmieren...
Wenn du den Source-code immernoch sehen willst stell ich ihn rein...
-
klg71 schrieb:
Danke für deinen Hinweiß wxSkip der hat mich auf die Lösung gebracht ich habe nämlich nicht alle nötigen informationen von der einen in die andere struktur geladen...
tm_year hat gefehlt.
Ich bin übrigens dabei gewesen einen wecker zu programmieren...
Wenn du den Source-code immernoch sehen willst stell ich ihn rein...Nein danke, ich dachte eigentlich, du hättest so ein einfaches Konsolenprogramm...
Übrigens:
Wenn du die Reihenfolge der Funktionen vertauschst, wird 2mal srcTime ausgegeben, wenn du es in 2 Anweisungen hintereinander ausgibst, dann stimmt alles. Sehr seltsam, muss irgendwas mit R-Values oder weiß der Geier was zu tun haben.
-
vielleicht ein bug in der time.h?
-
Mit dem Header wird das herzlich wenig zu tun haben, wenn dann in der Library. Als Bug würde ich das schon bezeichnen, aber nur wenn das nicht bei allen Implementierungen auftritt. Welchen Compiler benutzt du? Ich benutze MinGW mit GCC 4.4.1.
-
also es ist glaube ich cygwin von mingw
-
klg71 schrieb:
also es ist glaube ich cygwin von mingw
das gibts so nich
.
es gibt 2 windows-GCCs: Cygwin und MinGW (die unterscheiden sich in der C-Standard-Library), von daher tippe ich auf ein absichtliches oder unumgängliches Verhalten von asctime().
-
also sollte ich lieber mingw benutzen?
-
Nö, weil da tritt ja derselbe Fehler auf.
Der Vorteil von MinGW ist meines Wissens, dass du mit deinen Programmen keine DLL mitliefern musst, wenn du das tolerieren kannst ist es relativ egal.
-
gut nur mal so ne frage aus neugier...
was ist eine r_value?
-
Das ist kein Bug.
Das ist ein statischer Puffer, der bei jedem neuen Aufruf von asctime und ctime Funktionen neuen Inhalt bekommt.
Einfach mal die Referenz lesen.
-
klg71 schrieb:
gut nur mal so ne frage aus neugier...
was ist eine r_value?Ein Rvalue ist ein Wert, den man nicht links von einer Zuweisung stellen kann. Sprich: '1+2+3' ist ein Rvalue, und eine Variable oder eine Referenz oder ein Pointer ein Lvalue.
Die bisherigen Referenzen nehmen nur Lvalues, d.h.void xxx(int &x); int main() { xxx(5); //Fehler!! }
wird nicht funktionieren.
Im neuen C++-Standard wird es auch Rvalue-Referenzen geben, d.h. schreib int &&x statt int &x und es funktioniert!
-
wxSkip schrieb:
Im neuen C++-Standard wird es auch Rvalue-Referenzen geben, d.h. schreib int &&x statt int &x und es funktioniert!
Wir befinden uns im ANSI C-Forum.
Warum willst du eigentlich die Struktur, die die Zeit speichert, kopieren? Kannst du sie nicht stattdessen einfach weiterreichen oder dort anlegen, wo sie tatsächlich gebraucht wird?
Alternativ könnte man sich auch noch selber ein struct basteln, was nur die Elemente enthält, die man wirklich benötigt.
-
fghfghfgh schrieb:
wxSkip schrieb:
Im neuen C++-Standard wird es auch Rvalue-Referenzen geben, d.h. schreib int &&x statt int &x und es funktioniert!
Wir befinden uns im ANSI C-Forum.