silicon Geschrieben 21. August 2003 Geschrieben 21. August 2003 Hallo, ich bin silicon, mein erstes post hier. seit tagen versuche ich über difftime die differenz von 2 zeiten auszuwerten, die als STRING schon vorhanden sind. (Über Sql_select etc. andere Geschichte). Ich versuche diese Strings im Format von z.B 02.09.2003 in das benötigte zeitformat für difftime umzuwandeln. das ganze spielt sich in folgender funktion ab (typ ist jetzt erstmal uninteressant) int validate_date (char *datum, int typ) { char *s; struct tm *sysdate,*carddate; int day; s = select_sysdate (30); /*funktioniert, kommt aus nem select woanders her* strptime( datum, "%m.%d.%Y", &carddate ); strptime( s, "%m.%d.%Y", &sysdate ); day = difftime( carddate, sysdate); return day; } Mag sein das int Day als Return nicht richtig ist, aber da kommt keine Fehlermeldung. validate.c: In function `validate_date': validate.c:213: warning: assignment from incompatible pointer type validate.c:214: warning: passing arg 3 of `strptime' from incompatible pointer type validate.c:216: warning: passing arg 3 of `strptime' from incompatible pointer type validate.c:218: warning: passing arg 1 of `difftime' makes integer from pointer without a cast validate.c:218: warning: passing arg 2 of `difftime' makes integer from pointer without a cast Ist meine bisherige Fehlermeldung. Sorry, ich spreche noramleweise nicht C und tu mir momentan etwas schwer... cheers, silicon Zitieren
Goos Geschrieben 21. August 2003 Geschrieben 21. August 2003 Tach auch und Herzlich Willkommen Du haettest vielleicht noch etwas ausfuehrlicher schreiben sollen, z.B. was du fuer nen Compiler benutzt und sowas. Wenn ich mir das so anschau, dann wuerd ich erstmal meinen, dass es nix mit Windows zutun hat. (ich kann dann hier auch nur die meldungen interpretieren) validate.c:218: warning: passing arg 1 of `difftime' makes integer from pointer without a cast validate.c:218: warning: passing arg 2 of `difftime' makes integer from pointer without a cast das sagt wohl nur aus, dass dein difftime() zwei integer Werte haben mag und nicht zwei Pointer so wie du sie uebergibst. validate.c:214: warning: passing arg 3 of `strptime' from incompatible pointer type validate.c:216: warning: passing arg 3 of `strptime' from incompatible pointer type dabei rate ich dann mal, dass strptime als dritten Parameter nen entsprechenden Pointer verlangt...ich wuerde es also zuerst mal ohne das & vor carddate und sysdate probieren. So.....hoffentlich hilfts dir ein wenig. Ich konnte hier nur Vermutungen anstellen, da ich ja ansich nur mit Windows arbeite und deine Funktionen gar nicht kenne Goos Zitieren
Guybrush Threepwood Geschrieben 21. August 2003 Geschrieben 21. August 2003 Ich hab mal nach strptime() gegoggelt. Du darfst deine Time Strukturen nicht als Pointer anlegen. Sondern ganz normal so: struct tm sysdate,carddate; Zitieren
silicon Geschrieben 21. August 2003 Autor Geschrieben 21. August 2003 Hi, ich arbeie unter Unix Solaris 9. Sorry, hätte ich vergessen. Hab hier nen GNU-Compiler laufen. ist über man page time.h aufgeführt (indirekt). das ist einfach krass. so mein code sieht jetzt besser aus: struct tm sysdate,carddate; . . . . strptime( datum, "%m.%d.%Y", &carddate ); strptime( s, "%m.%d.%Y", &sysdate ); Das mache ich, weil strptime ja eine Funktion ist, die ohne die & nur den Wert von carddate etc. und nicht die tatsächliche Adressierung ändern würde. Oder? Jetzt muss ich nur noch difftime soweit dazu bringen. Zitieren
Goos Geschrieben 21. August 2003 Geschrieben 21. August 2003 Original geschrieben von silicon strptime( datum, "%m.%d.%Y", &carddate ); strptime( s, "%m.%d.%Y", &sysdate ); Das mache ich, weil strptime ja eine Funktion ist, die ohne die & nur den Wert von carddate etc. und nicht die tatsächliche Adressierung ändern würde. Oder? Nene die aendert wohl nicht die Adresse, sondern den Wert, greift aber ueber die Adresse darauf zu. Das difftime sollte nun aber auch wieder in der urspruenglichen Variante laufen (day = difftime( carddate, sysdate); ) da du ja nun keine Pionter mehr hast. Goos Zitieren
silicon Geschrieben 21. August 2003 Autor Geschrieben 21. August 2003 So, habs jetzt nochmal ohne pointer von tm laufen lassen: difftime sieht so aus: validate.c: In function `validate_date': validate.c:217: incompatible type for argument 1 of `difftime' validate.c:217: incompatible type for argument 2 of `difftime' day = difftime( carddate, sysdate); muss ich da irgendwie noch die structure tm mit reinbringen in das difftime??? :confused: Zitieren
nic_power Geschrieben 21. August 2003 Geschrieben 21. August 2003 Hallo, die Fehlermeldung ist eigentlich eindeutig. Du uebergibst die falschen Datentypen an difftime(). difftime erwartet kein "struct tm" sondern ein "time_t" als Parameter, dieses laesst sich mit "mktime" erzeugen. Nic Zitieren
silicon Geschrieben 22. August 2003 Autor Geschrieben 22. August 2003 @nic-power: wenn du dir meine posts weiter oben angeschaut hättest, würdest du merken, dass ich 2 strings vorliegen habe, die ich versuche in ein kompatibles zeitformat für mein difftime umzuwandeln. ich will keine zeit neu generieren, mit mktime oder was auch immer. :floet: Zitieren
Guybrush Threepwood Geschrieben 22. August 2003 Geschrieben 22. August 2003 Original geschrieben von silicon @nic-power: wenn du dir meine posts weiter oben angeschaut hättest, würdest du merken, dass ich 2 strings vorliegen habe, die ich versuche in ein kompatibles zeitformat für mein difftime umzuwandeln. ich will keine zeit neu generieren, mit mktime oder was auch immer. :floet: und wenn du dir die Dokumentationen zu den verschiedenen Befehlen angeschaut hättest, hättest du gemerkt das nic-power vollkommen recht hat. difftime erwartet zwei Variablen vom Typ time_t, mit mktime kannst du deine Variablen vom Typ tm in den Typ time_t konvertieren. Zitieren
hmaas Geschrieben 22. August 2003 Geschrieben 22. August 2003 Versuch mal: double day = difftime(mktime(&carddate), mktime (&sysdate)); Du bekommst den Zeitunterschied in Sekunden zurück. cardate/sysdate muss ein Pointer auf auf struct tm sein. Pönk Zitieren
Guybrush Threepwood Geschrieben 22. August 2003 Geschrieben 22. August 2003 Ich häng die Antwort auf deine Frage im anderen Thread mal hierhin, weils hier besser passt:) Du mußt doch jetzt nur noch deine beiden Variablen mit mktime() konvertieren, also so: day = difftime( mktime(&carddate), mktime(&sysdate)); [/PHP] Zitieren
nic_power Geschrieben 22. August 2003 Geschrieben 22. August 2003 Hallo, Original geschrieben von silicon @nic-power: wenn du dir meine posts weiter oben angeschaut hättest, würdest du merken, dass ich 2 strings vorliegen habe, die ich versuche in ein kompatibles zeitformat für mein difftime umzuwandeln. ich will keine zeit neu generieren, mit mktime oder was auch immer. :floet: Hast Du ueberhaupt schon mal in die Manual-Pages zu den von Dir verwendeten Funktionen geschaut? Dann wuerde Dir auffallen, dass Du die falschen Datentypen verwendest. Um difftime() zu verwenden, musst Du die Daten vorher konvertieren (siehe oben und man-pages). Nic Zitieren
silicon Geschrieben 22. August 2003 Autor Geschrieben 22. August 2003 jetzt bin ich verwirrt. brauche ich überhaupt noch strptime, wenn ich mit mktme arbeite? was ist mit der zeitangabe? muss ich noch " 00:00:00" anhängen, wenn ich z.B. "21.03.2003" als 1.ten wert habe? Zitieren
Guybrush Threepwood Geschrieben 22. August 2003 Geschrieben 22. August 2003 So ich hab die Funktion mal komplett mit ein paar Kommentaren erstellt: int validate_date (char *datum, int typ) { char *s; struct tm sysdate,carddate; int day; s = select_sysdate (30); /*funktioniert, kommt aus nem select woanders her* //datumsstring (datum) in tm Struktur(carddate) speichern strptime( datum, "%m.%d.%Y", &carddate ); //datumsstring (s) in tm struktur (sysdate) speichern strptime( s, "%m.%d.%Y", &sysdate ); //carddate und sysdate in Sekunden umwandeln //und die differenz berechnen day = difftime( mktime(&carddate), mktime(&sysdate)); return day; } Zitieren
silicon Geschrieben 22. August 2003 Autor Geschrieben 22. August 2003 Achso! Ok, jetzt hab ichs verstanden. Hatte mktime ausserhalb der Funktion versucht zu nützen. So ists aber perfekt! Der Compiler spuckt keine Fehler. Jetzt geht´s weiter! Vielen Vielen Dank ! :uli Zitieren
silicon Geschrieben 22. August 2003 Autor Geschrieben 22. August 2003 so, progrämmchen läuft soweit, aber ich krieg nur 0.00000 heraus. (habe natürlich double day initialisiert, weil difftime ja einen double-wert zurückgibt.) irgendwas mog der noch net. muss ich eventuell noch " 00:00:00" an den string anhängen und dementsprechend strptime mit %M etc. erweitern? Zitieren
hmaas Geschrieben 22. August 2003 Geschrieben 22. August 2003 Original geschrieben von Guybrush Threepwood //carddate und sysdate in Sekunden umwandeln //und die differenz berechnen day = difftime( mktime(&carddate), mktime(&sysdate)); return day; Hi, Def: double difftime(time_t time1, time_t time0); Rechnen tut difftime: time1 - time0 cardate < sysdate (Geh ich mal von aus:)) Ich würde die beiden Zeiten gegenainander tauschen! Ansonst debug dein Programm und schau mal was mktime(carddate/sysdate) zurück gibt. Gruß Pönk Zitieren
nic_power Geschrieben 22. August 2003 Geschrieben 22. August 2003 int validate_date (char *datum, int typ) ist falsch, da ein double zurueckgeliefert wird. Nic 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.