Wieso existiert der time_t Datentyp?



  • Hallo,
    Ich bin gerade dabei mich in der Bibliothek time.h einzufinden.
    In dem Buch, mit dem ich arbeite wird beschrieben, das time_t ein long unsigned int ist, aber wozu brauche ich den, wenn ich selbst einen long unsigned int deklarieren kann. Dazu wurde noch gesagt, das time_t die Zeit der Unix Epoche enthält, doch bei der Ausgabe der Variable mit printf() wird der Wert 0 ausgegeben.
    Ich blicke bei diesem einfachen Thema nicht ganz durch, auch nach Stundenlanger Recherche bei Google.
    Tut mir Leid wenn euch diese Frage blöd vorkommt, aber ich muss es wissen.
    Hier noch mal ein kleines Beispiel,

    #include <stdio.h>
    #include <time.h>
    
    int main(void)
    {
        //Deklaration
        time_t zeit = 0;
        //zeit2 das gleiche wie zeit?
        long unsigned int zeit2 = 0;
    
        //Verarbeitung
        time(&zeit); 
        for(int i = 0; i<=100000; i++);
        time(&zeit2);
    
        //Ausgabe
        printf("\n%ld\n",zeit);
        printf("\n%ld\n",zeit2);
        return 0;
    }
    

    Beide time Variablen bekommen den selben Wert raus, ist das normal, weil die Schleife doch den Prozess um mind. 1 Sekunde verzögern sollte.

    Danke schonmal



  • siehe http://www.cplusplus.com/reference/ctime/time_t/
    -> es ist nicht vom Standard garantiert, dass das so ist.

    Im C11-Standard (zumindest im n1570 draft) heißt es: "The range and precision of times representable in clock_t and time_t are implementation-defined."

    weil die Schleife doch den Prozess um mind. 1 Sekunde verzögern sollte.

    Warum sollte sie das? Sie tut gar nichts und kann vom Compiler komplett wegoptimiert werden.



  • wob schrieb:

    siehe http://www.cplusplus.com/reference/ctime/time_t/
    -> es ist nicht vom Standard garantiert, dass das so ist.

    Im C11-Standard (zumindest im n1570 draft) heißt es: "The range and precision of times representable in clock_t and time_t are implementation-defined."

    Heißt das, ich kann auf time_t komplett verzichten wenn ich mit der "time.h" Bibliothek arbeite?



  • Sand_am_Meer schrieb:

    Hallo,
    Ich bin gerade dabei mich in der Bibliothek time.h einzufinden.
    In dem Buch, mit dem ich arbeite wird beschrieben, das time_t ein long unsigned int ist,

    Es ist nicht garantiert, dass time_t ein vorzeichenloser oder gar Ganzzahltyp ist.

    Auf vielen Systemen ist es ein vorzeichenbehafteter Typ.
    Daraus resultiert auch das https://de.wikipedia.org/wiki/Jahr-2038-Problem (das wird ein Spaß :p )

    Mit dem Vorzeichen können auch Daten vor 1970 beschrieben werden.

    Einige Funktionen aus time.h hätten gerne time_t. Dafür wurde es definiert.
    Wieso willst du darauf verzichten?



  • DirkB schrieb:

    Sand_am_Meer schrieb:

    Hallo,
    Ich bin gerade dabei mich in der Bibliothek time.h einzufinden.
    In dem Buch, mit dem ich arbeite wird beschrieben, das time_t ein long unsigned int ist,

    Es ist nicht garantiert, dass time_t ein vorzeichenloser oder gar Ganzzahltyp ist.

    Auf vielen Systemen ist es ein vorzeichenbehafteter Typ.
    Daraus resultiert auch das https://de.wikipedia.org/wiki/Jahr-2038-Problem (das wird ein Spaß :p )

    Mit dem Vorzeichen können auch Daten vor 1970 beschrieben werden.

    Einige Funktionen aus time.h hätten gerne time_t. Dafür wurde es definiert.
    Wieso willst du darauf verzichten?

    Das wurde mir schon zich mal erklärt, aber danke das du das noch mal aufgreifst 😃

    Wieso ich auf time_t verzichten möchte?
    Einfach weil es (anscheinend) auch ohne time_t geht und wenn es ohne geht, dann kann ich mir mein eigenes time Datentyp definieren 🙂
    Habe nämlich ein wenig damit rumgespielt und es stellte sich heraus, das ich darauf verzichten kann.



  • Ich sehe überhaupt keinen Vorteil, darauf zu verichten, aber massive Nachteile.

    Wenn Du die entsprechenden Funktionen der Standardbibliothek benutzt, solltest Du auch time_t benutzen. Du kannst zwar einen eigenen Typ definieren. Das mag dann zwar mit Deinem aktuellen Compiler funktionieren, nach einem Wechsel des Compilers kann muß das aber nicht mehr so sein.

    VG



  • Sand_am_Meer schrieb:

    In dem Buch, mit dem ich arbeite wird beschrieben, das time_t ein long unsigned int ist,

    Sand_am_Meer schrieb:

    Wieso ich auf time_t verzichten möchte?
    Einfach weil es (anscheinend) auch ohne time_t geht und wenn es ohne geht, dann kann ich mir mein eigenes time Datentyp definieren 🙂

    Und welchen Typ möchtest du stattdessen nehmen?
    Die muss ja zu den Funktionen aus time.h passen.
    Die Bibliothek wurde mit time_h compiliert, das kannst du im nachhinein nicht ändern.

    Die Aussage aus deinem Buch stimmt nicht immer (eher selten, da dort unsigned steht).

    Sand_am_Meer schrieb:

    Habe nämlich ein wenig damit rumgespielt und es stellte sich heraus, das ich darauf verzichten kann.

    Der Typ long ist auf verschiedenen Compilern/Systemen unterschiedlich groß. (gilt auch für int )
    Du kennst Alle?

    Deine Aussage klingt nach "Ich habe mir ein Feld auf einem Schachbrett angesehen. Alle schwarz."



  • Wieso ich auf time_t verzichten möchte?
    Einfach weil es (anscheinend) auch ohne time_t geht und wenn es ohne geht

    das bricht aber alle Regeln der Portier- und Wartbarkeit - und noch absolut 100% Grundlos - also driften wir Richtung dämlich

    , dann kann ich mir mein eigenes time Datentyp definieren

    typischer Anfänger-Denk-Fehler - du schaffst keine Abstraktion in dem du unten auf irgendwas verzichtest - sondern einfach oben was drauf setzt - dein eigener time Datentyp nutzt einfach time_t und außen siehst du die Verwendung nicht mehr - wenn es richtig gemacht ist, jede Form von Micro-Optimierung ist völlig sinnlos

    und bitte nicht schon die 1Mio pseudo Abstraktion auf time weil dir so langweilig ist - das lohnt sich echt gar nicht



  • Sand_am_Meer schrieb:

    Wieso ich auf time_t verzichten möchte?
    Einfach weil es (anscheinend) auch ohne time_t geht und wenn es ohne geht, dann kann ich mir mein eigenes time Datentyp definieren 🙂
    Habe nämlich ein wenig damit rumgespielt und es stellte sich heraus, das ich darauf verzichten kann.

    ja natürlich kannst du darauf verzichten. aber jetzt stellt dir mal vor, du hast ein (riesengroßes) programm mit zigtausend "int time"-deklarationen, die dann, dank der weisheit der leute, die c99 entwickelt haben, auch noch überall im quelltext verstreut sind und plötzlich ist int nicht mehr ausreichend um diese große zahl aufzunehmen.
    wenn du fleißig überall time_t hingeschrieben hast, änderst du einfach in den headern definition für time_t von int auf int64 und das programm funktioniert. hast du dagegen überall nur int hingeschrieben, darfst du (oder noch besser: jemand anderes) bei größeren projekten schnell mal 10 mio codezeilen durchsuchen, um dieses int durch ein int64 zu ersetzen und die wahrscheinlichkeit nach einem halben jahr immer noch nicht alle gefunden zu haben ist recht hoch.

    und genau deshalb geht es nicht ohne time_t.
    also bei experimenten in deinem zimmerchen geht das schon und auch goto, globale variablen und abfragen der art if(zahl==123), aber sobald es ein wenig professioneller wird, solltest du es eben "richtig" machen.



  • Wade1234 schrieb:

    änderst du einfach in den headern definition für time_t von int auf int64

    lol

    Wade1234 schrieb:

    und das programm funktioniert.

    lol
    lollol
    lollollol


  • Mod

    Wutz schrieb:

    Wade1234 schrieb:

    änderst du einfach in den headern definition für time_t von int auf int64

    lol

    Wade1234 schrieb:

    und das programm funktioniert.

    lol
    lollol
    lollollol

    Ich glaube nicht, dass Wade1234 das als ernsthafte Hilfestellung gemeint hat, sondern als Beispiel, wieso es gut ist, typedefs zu benutzen.



  • #define und typedef sind unterschiedliche Dinge.
    Änderungen an Standard-Headern sind tabu - immer und überall.


Log in to reply