convert timeval to int



  • Hallo,

    ich möchte der Zeitstempel ausgeben. Kann aber keine gettimeofday(&time, NULL); benutzen, weil meine Entsicklungumgebung es nicht unterstützt.

    Meine Codeausschnitt:

    time_t t;
    		struct timeval tv;
    		t = time(0);
    		tv =  (long int)((int)localtime(((const time_t*)(& t))));
    

    Problematisch ist die Zeile tv = (long int)((int)localtime(((const time_t*)(& t)))); error: no match for 'operator=' in 'tv = (long int)((int)localtime(((const time_t*)(& t))))'

    kennt jemand due Lösung?
    vielen Dank



  • Du willst einen Zeitstempel ausgeben?

    Mach es in C++98/03 einfach so:

    std::time_t sec = std::time(NULL);
    std::cout << std::asctime(std::localtime(&sec));
    

    Ideone: http://ideone.com/YoxczF

    Seit C++11 geht das mit std::ctime aus Chrono einfacher.


  • Mod

    #include <iostream>
    #include <ctime>
    int main()
    {
        std::cout << std::time(0);
    }
    

    ?

    Es ist zwar streng genommen nicht garantiert, aber du darfst davon ausgehen, dass time_t ein arithmetischer, ja sogar ein Ganzzahltyp ist. Und die kann man direkt ausgeben.



  • SeppJ schrieb:

    #include <iostream>
    #include <ctime>
    int main()
    {
        std::cout << std::time(0);
    }
    

    ?

    Es ist zwar streng genommen nicht garantiert, aber du darfst davon ausgehen, dass time_t ein arithmetischer, ja sogar ein Ganzzahltyp ist. Und die kann man direkt ausgeben.

    Ähm, er will doch einen Zeitstempel, nicht die Anzahl der Sekunden seit dem 1.1.1970?


  • Mod

    Sone schrieb:

    Ähm, er will doch einen Zeitstempel, nicht die Anzahl der Sekunden seit dem 1.1.1970?

    Eine eineindeutige Zuordnung zwischen einer Zeichenfolge und einer Zeit. Klingt für mich schon irgendwie nach einem Zeitstempel. Und erfüllt trivial die geforderte Randbedingung, einen Ganzzahltypen zu benutzen.



  • Btw, zum Anfangsproblem:

    tv = (long int)((int)localtime(((const time_t*)(& t)))); error: no match for 'operator=' in 'tv = (long int)((int)localtime(((const time_t*)(& t))))'

    (long int)((int)localtime(((const time_t*)(& t))));
    //<=> 
    (long int)localtime(&t);
    

    Man sieht sofort: Zuerst castest du einen Zeiger in eine Ganzzahl, dann weist du diese Ganzzahl wieder einem Zeiger zu... und letzteres ist (Ausnahme: 0, bzw. NULL) verboten.

    Wenn du die Anzahl der vergangenen Sekunden seit dem 1.1.1970 in einem timeval-Objekt speichern möchtest, dann geht das so:

    timeval tv;// elaborated type specifiers kannst du bei Deklarationen in C++ weglassen
    tv.tv_sec =  time(NULL);
    

    Allerdings bin ich mittlerweile irritiert was er überhaupt will 😕



  • SeppJ schrieb:

    Sone schrieb:

    Ähm, er will doch einen Zeitstempel, nicht die Anzahl der Sekunden seit dem 1.1.1970?

    Eine eineindeutige Zuordnung zwischen einer Zeichenfolge und einer Zeit. Klingt für mich schon irgendwie nach einem Zeitstempel. Und erfüllt trivial die geforderte Randbedingung, einen Ganzzahltypen zu benutzen.

    geforderte Randbedingung? Wo denn das?



  • Hallo,

    danke für die ihre Hilfe. Ich brauche wirklich einen zeistempel. Dabei ist am wichtigste in diesem Fall aktuelle Millisekunden. Da meine Entwicklunsumgebung sehr empfindlich ist, kann ich

    structur timeval tv [code] benutzen und microsekunden
    

    tv->tv_usec;[code="cpp"] berechnen, klappt aber mit der Konvertierung (long int) to (int) nicht.

    Die Windows Funktionen kann ich auch nicht Benutzen.

    Grüße, Nino



  • Mit C++98/03 gibt es keine Standardwege, die aktuelle Zeit millisekundengenau zu berechnen. In einem anderen Thread habe ich gezeigt wie es geht, wenn dein Compiler aktuell genug ist (bzw. du Boost hast, aber dann geht es auch mit Boost.Date_Time und einfacher).


Anmelden zum Antworten