Frage an C-Spezialisten - Datum/Zeitdifferenz

  • Hallo??


    Liest hier noch ein C-Spezi mit?


    Ich hänge mal wieder.....

    Einmal editiert, zuletzt von karomue ()

  • Zitat

    Original von karomue
    Liest hier noch ein C-Spezi mit?


    Jetzt ja. Ich hatte dein Posting vom 15.1. nicht gesehen, da es wohl schon nach wenigen Tagen auf der 2. Seite stand...


    Was hast du denn auf dem Herzen?




    Und nein, ich würde nicht 18 Einzelargumente an eine Funktion übergeben. Das sieht nicht nur "Scheiße" aus, sondern kostet natürlich auch Zeit. Ich würde höchstens drei Zeiger auf start, ausw & end übergeben (und damit 18-3 Takte pro Aufruf sparen). Wenn du die drei Variablen global anlegst, brauchst du gar nichts übergeben, da sie dann programmweit Gültigkeit besitzen.


    bfn hevo2

  • Hallo Heiko.


    Schön Dich wieder mal zu sehen.


    Gibt es die Möglichkeit sich mal irgendwie, irgendwo kurz zu treffen?


    Du weißt, mein grundsätzliches Problem ist der Umgang mit den "tieferen" Dingen wie Structuren, Zeigern...


    Momentan versuche ich mich - immer noch - an time.h.


    Das weiter unten genannte Problem wurde durch Hilfestellung von Jörg schon mal gelöst. Jetzt ginge es darum, Datum/Zeit zu addieren und/oder zu subtrahieren. Also Tag1 - Tag2 gibt welchen Tag?


    Die Eingaben sind schon mal rel klar über struct tm start/start.tm_year=... Damit läßt sich aber schwerlich eine Summe/Differenz bilden. Über mktime(&start) etc. geht das zwar, jetzt fehlt mir aber die (genaue) Syntax für die Gegenfunktion localtime() (oder gmtime() ?? ).


    Im Buch C von A bis Z ist ein Beispiel Alter seit Geburtsdatum. Toll, dass dieses Beispiel nicht läuft, wenn man z.B. als "Geburtstag" 31.1.2008 eingibt, kommt als Ergebnis "sie sind 0 Jahre 1 Monat und -17 Tage alt". Und da versagt nun meine Kunst, denn jetzt eine Differenz der neg. Tage einzurechnen scheitert an den wechsenden Tagen jedes Monats. Also bliebe nur (soweit ich es verstehe) der Weg über mktime übrig. Nur, wie komme ich da wieder aus der Darstellung der Sek seit 1.1.1970 01:00:00 in Jahr/Monat/Tag/.. zurück?


    Ganz konkret: ich habe eine Osterberechnung nach Gauss und möcht nun die anderen beweglichen Feiertage - die ja in festem Zusammenhang mit Ostern stehen - auch haben. Muss also Tage addieren oder Tage subtrahieren.


    Ja, wenn man keine Sorgen hat, macht man sich welche.


    Hm, ich sage jetzt nicht, da hast Du was angefangen, mich "zu C zu führen".... ;)

  • Hallo Charly


    Wenn du dir keinen Streß mit der Addition/Subtraktion von Datumsangaben machen willst, dann rechne mit den "Julian Day Numbers".


    Also Datum nach "JD" umrechnen. Dann meinetwegen


    JD+= 500;


    und JD wieder zurück. Fertig.




    Oder eben


    Geburtdatum ---> JD1
    Heutiges Datum - > JD2


    Alter in Tagen = JD2 - JD1




    Das ist (d)eine Website zum Thema:
    http://de.wikipedia.org/wiki/Julianisches_Datum



    Es gibt noch andere Formeln zur Umrechung. Beispielsweise hier:
    http://www.hermetic.ch/cal_stud/jdn.htm#comp


    Einfach mal googeln.




    bfn hevo2

  • Hi, danke erst mal.


    Was aber immer noch nicht meine Neugierde nach time_t, struct tm und die Hin-und Herrechnungen mit mktime() und localtime() befriedigt.


    Ich weiß, da sind gewaltige (Verständniß-) Löcher, leider sind im Internet auch keine so tollen Fundstellen dazu. Das immer auftauchende Standard-Buch ist halt C von A bis Z, auf der Autorenseite pronix steht auch nichts dazu....


    Und JD, hm, schau ih mir sicher an. Aber da fürchte ich, dass es dann wieder an der Umsetzung nach C mangelt.


    Vielleicht probieren wir mal was.


    Ich hänge mal ein test.c an. Störe Dich nicht daran, dass es sehr "schrecklich" aussieht, bis auf den Punkt 1 Testroutinen sind es Buchbeispiele - teilweise etwas verändert und mit test-printf-s versehen - aus dem Kapitel 21 Zeitroutinen.


    Lasse mal 1 laufen. Da wir dann ausgegeben ein End, Start, Auswerte Datum/Zeit als Y/M/D/h/min/sek/yd/Sommer_Winter, darunter End/Start/Auswert in mktime-Darstellung. Auswert = End - Start. Wenn es jetzt gelingen sollte, die mktime-Darstellung von Ausw wieder in eine Y/M/D/.... Darstellung zurück zu orgeln (sollte localtime() sein nach Graphik im Buch) wäre das wohl die Lösung. Nur, es mangelt an der Kenntnis wie localtime() anzuwenden ist...


    Geburtstag ist übrigens die Routine bei der dem Autor was "eingeschlafen" ist. :(

  • Nachtrag:


    Heiko, wenn Du dazu kommst, schau auch mal in die Zeile 35.Da ist auskommentiert time(&tStart). Lasse ich das (oder auch in Zeile 91 in printf) wird in tAusw offensichtlich der aktuelle Wert von Dazum/Zeit reingenommen.


    Nicht, dass ich es verstehen würde.... :(



    Und, wir werden auch hier wieder das alte Problem bekommen, dass ich nicht auf Anhieb verstehen werde, was Du evtl. dazu sagen wirst.


    Hihi, Aua oder auch wie, ich sage nur mal: Zauberlehrling...

  • Zitat

    Original von hevo2




    Ähm - dein "Gewurschtel" ist mir etwas zu kompliziert. ;)



    Dacht ichs doch... :D


    Im Gegenzug: möchte gerne hoffen, dass ich mit Deinem Experten-Prog zurecht komme.... :]


    Und Du weißt ja, mein Dank verfolgt Dich ständig... ;)


    Ach ja, da habe ich ja wieder was zum tagelangen Nachdenken. Hm, geschieht mir recht. Aber, schaun mer mal.

  • ... und falls Du nochmal hier vorbeikommst: isdst ist - zumindest zum Teil - schon "bemerkt" worden. Aber Frage dazu, Du und auch das Buch nennen als Untergrenze für "diese" Art Zeit... den 1.1.1970 00:00:00. Da kommt bei mir Fehler, es geht erst ab 01:00:00


    Zeitunterschied UTC - GM'T??

  • Hallo nochmal, Charly!


    > Du und auch das Buch nennen als Untergrenze für "diese" Art Zeit...
    > den 1.1.1970 00:00:00. Da kommt bei mir Fehler, es geht erst ab
    > 01:00:00


    Ach komm, stell dich nicht so an - denk doch mal nach!


    MEZ = UT(C) + 1h


    mktime & Co rechnen in "lokaler Zeit", so steht es zumindest in meiner Dokumentation, bei uns also MEZ.


    Der absolute Nullpunkt der UNIX-Zeitskala liegt bei


    1.1.1970 00:00:00 UTC


    das entspricht


    1.1.1970 01:00:00 MEZ


    Alle Zeitangaben darunter (meinetwegen 1.1.1970 0:30 MEZ) sind also "falsch".



    Darum habe ich dir empfohlen über "JD" zu gehen. Die Anzahl der Tage, die du auf der Welt "rumgeistert" sind damit problemlos berechnet...




    Anderes Thema:


    So richtig kann ich dir nicht folgen...



    Im Folgenden beziehe ich mich auf die Zeilen 87-91 deines Progis. Wir sehen also nur dies:



    Code
    printf("tEnd  : %10d\r\ntStart: %10d\r\ntAusw : %10d\r\n",
    		tEnd,
    		tStart,
    		tAusw);
    //		time(&tStart));



    Würde man nun time(&tStart) "scharfmachen" und die Klammern (wieder) richtig setzen, sähe der printf-Aufruf so aus:


    Code
    printf("tEnd  : %10d\r\ntStart: %10d\r\ntAusw : %10d\r\n",
    		tEnd,
    		tStart,
    		tAusw,
    		time(&tStart));



    Zunächst wird time() aufgerufen und verändert damit natürlich unmittelbar die Variable tStart, die etwas später von printf() benutzt wird. Der "richtige" Rückgabewert von time() wird zwar auch als vierter Parameter an printf() übergeben, aber printf() nimmt nur die ersten drei Parameter des Aufrufs entgegen, da im "Formatstring" nur drei Parameter (hier durch "%d") "angekündigt" sind.



    In "C" kannst du noch "tonnenweise" weitere, nicht notwendige, Parameter in Richtung einer x-beliebigen "C-Funktion" schaufeln. Es passiert nix. "C" erlaubt "variable Parameterlisten".



    Ich kann im Moment wirklich keine Aus/Nebenwirkungen auf die von dir oben genannte Variable "tAusw" erkennen.



    Kürze dein Programm bitte mal auf das Notwendigste, um mir den vermeintlichen Fehler reproduzierbar zeigen zu können.




    bfn hevo2

  • Hallo Heiko,


    mal abgesehen davon, dass man einfach manchmal den Wald vor lauter Bäumen nicht sieht....


    Ich sagte ja schon, ich habe so meine Probleme mit tieferer Logik und mit C schon überhaupt. Da hilft auch kein Ansehen der includes, denn wenn man die Syntax grundsätzlich nicht versteht hat man einfach Pech. Und da habe ich ein seit langer Zeit angewandtes Mittel: versuche Beispiele zu finden, bepflastere die mit - hier - printf-s und schaue was sich tut. Verändere die oder jene Variable und schau wieder.


    So besehen sind mir Deine (und anderer Leute) Source Files eine gute Hilfe, denn man kann immer wieder mal sehen, wie machen es andere.


    Nun ist aber das Kapitel 21 im Buch für mich reichlich unverständlich, die Beispiele - so sie denn auch richtig laufen, was ja beim "Geburtstag" schon nicht der Fall ist- vermutlich auf Kenntnissen vorhergehender Kapitel aufgebaut, die ich noch nicht verinnerlicht habe.


    U.a. habe ich schon bemerkt, dass mktime () auch alleine stehend "was bewirkt", siehe Dein Beispiel. Ich hatte es einer Variablen (Zeiger???) zugeordnet, was 1. wohl nicht nötig und 2. krottenfalsch war, denn diese war als "time_t tStart" deklariert. Also einfach aus Unkenntnis Fehler über Fehler. Und wenn mal Fehler geschachtelt sind, dann steckt man fest.


    Zum MEZ/UTC-Fehler: darüber steht halt im Buch auch kein Hinweis und wegen allg. Fehlersucherei ist mir erst sehr spät eingefallen, dass dies ja eben mit UTC zu haben könnte. Man weiß es oder nicht, ich wusste es nicht und habe mich an die Grenze wieder durch meine printf-s herangetastet. Hätte man ja im Buch auch erwähnen können.


    Und so geht es weiter, der ganze Header time.h ist einfach ein Buch mit 7 Siegel, hm, vielleicht sind es jetzt nur noch 6.


    Und zur Zeile 91: sorry, da war natürlich schon auch noch ein weiteres %d vorhanden, das musste ich nach auskommentieren von time(&tStart) wieder herausnehmen.


    Und was heißt "steht es in meiner Dojumentation"? In welcher? Ein (Lehr-)Buch oder was? Hätte ich da irgendwie Zugriff darauf?


    Ich sagte glaube ich auch schon, im Internet findet man außer C von A bis Z kaum was anderes. Und wie das so ist, ich könnte sicher x-erlei Bücher ansehen ohne mich richtig entscheiden zu können, was denn nun für meinen Fall das vernünftigste wäre. Und einfach immer mal so Bücher im ca.-Wert von 50,-- zu kaufen um dann festzustellen, das war doch nicht das Richtige, das läuft dann schon zu sehr ins Geld.


    Nein, C ist für den Selbstunterricht ohne Hilfe für mich nicht so ganz gut geeignet. Es stellt doch erheblich mehr Ansprüche (an mich) als die anderen Programmiersprachen mit denen ich mich bislang hobbymäßig beschäftigt habe (Excel-VBA). Und wenn man dann auch noch ein Sprachproblem (engl.) hat, dann sieht es schon recht mies aus.


    Das ist auch der tiefere Grund warum ich hier ab und zu mal einen Hilferuf loslasse, bislang gab es ja immer jemand der freundlicherweise wieder ein Mosaiksteinchen dazu beigetragen hat, wofür ich sehr dankbar bin. Denn in einem hast Du ja Recht, C ist schon faszinierend, man sollte nur ein wenig mehr davon verstehen. Und ich weiß leider immer noch nicht den richtigen Weg meine grundlegenden Löcher zu schließen.


    Wie gesagt, die von Dir erhaltenen Files sind sehr hilfreich. Du darfst aber nun nicht davon ausgehen, dass ich sie voll verstehe. Beispiel ist alleine Deine Art etwas in ein Ausgabefile zu schreiben. Ich kann es anwenden in dem ich alles kopiere, wirklich verstanden habe ich es noch nicht. Auch wenn Deine Kommentare sehr ausführlich gehalten sind, Du bist viel zu weit weg von meinem Verständnis, das auch nur einigermaßen aufzuholen dürfte recht schwer werden.


    Nun gut, ich werde weiter mit C spielen, das Eine oder Andere wird einen Ahaeffekt auslösen, andere Dinge werden wieder zu Fragen hier führen mit der Hoffnung, dass dann wieder jemand einen kleinen Schubs gibt.


    Und mit JD werde ich auch noch was tun. Du weißt ja, Progammiersparchen kann man nur erlernen wenn man damit umgeht, dazu gehören aber Aufgabe die ma versucht zu lösen. Und JD ist wieder so eine "Herausforderung". ;)


    Hm, was sagt denn der C-Kenner zu Geburtstag wenn - wie vorbesetzt wenn ich es noch richtig weiß - vom 31.1.2008 ausgegangen wird, oder allg. wohl einem Tag der "größer" ist als der momentane? Wäre das über diese Methode überhaupt zu machen? Auf die Art wie in Deinem Beispielfile müsste es ja gehen. Da hat der liebe Herr Jürgen Wolf als Autor von C von A bis Z m.E. daneben gelangt....