Zum Inhalt springen

strptime, difftime, please help


Empfohlene Beiträge

Geschrieben

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

Geschrieben

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 :D

Goos

Geschrieben

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.

Geschrieben
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

Geschrieben

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:

Geschrieben

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

Geschrieben

@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:

Geschrieben
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.

Geschrieben

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

Geschrieben

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

Geschrieben

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?

:(

Geschrieben

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;

}

Geschrieben

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

Geschrieben

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?

Geschrieben
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

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...