Anfängerfragen



  • Hallo zusammen,

    habe eine (wahrscheinlich) sehr leichte Frage... aber fange gerade erst mit C++.

    Wie benutzt ihr am einfachsten die Zeit-Funktion von "time.h"?

    Ich würde gerne die aktuelle Zeit an eine Variable übergeben.

    In Ruby geht das so: variable=Time.now
    fertig...

    wie macht ihr das in C++?

    Ich möchte das 2x machen, einmal am Anfang und einmal am Ende des Programmes.
    Sozusagen einen Benchmark.
    Kann mir da jemand weiterhelfen? Danke schon einmal! 🙂


  • Mod

    Ich hab's jetzt nicht getestet, aber ungefähr so:

    #include <ctime>                 // In C++ nimmt man andere Header
    
    int main ()
    {
      time_t start;                       // Zeiten sind vom Typ time_t
      time (&start);                      // Zeit am Anfang speichern
    
      // Rest des Programms
    
      time_t end;
      time (&end);                        // Zeit am Ende speichern
      double diff = difftime (end,start); // Differenz berechnen
    
    }
    


  • Wenn es nur darum geht, eine Zeit zu messen, mach es am besten so:

    #include <ctime>
    #include <iostream>
    
    int main()
    {
       unsigned int StartZeit = static_cast<unsigned int>(time(0));
    
       //programm arbeiten lassen
    
       std::cout<<"Zeit vergangen: "<<time(0)-StartZeit<<" Sekunden."<<std::endl;
    }
    

    Falls du unter Windows arbeitest und eine Millisekunden genaue Auswetung brauchst nimm die Funktion "GetTickCount()". Dazu brauchst du <windows.h>



  • SeppJ schrieb:

    Ich hab's jetzt nicht getestet, aber ungefähr so:

    #include <ctime>                 // In C++ nimmt man andere Header
    
    int main ()
    {
      time_t start;                       // Zeiten sind vom Typ time_t
      time (&start);                      // Zeit am Anfang speichern
    
      // Rest des Programms
    
      time_t end;
      time (&end);                        // Zeit am Ende speichern
      double diff = difftime (end,start); // Differenz berechnen
    
    }
    

    Danke, dass klappt sehr gut! 🙂
    Nur bekomm' ich in meinem kleinen Test einfach nur 0 heraus...
    wie kann ich die Ergebniszahl den genauer (Milisekunden) bestimmen lassen?



  • Barcelona schrieb:

    SeppJ schrieb:

    Ich hab's jetzt nicht getestet, aber ungefähr so:

    #include <ctime>                 // In C++ nimmt man andere Header
    
    int main ()
    {
      time_t start;                       // Zeiten sind vom Typ time_t
      time (&start);                      // Zeit am Anfang speichern
    
      // Rest des Programms
    
      time_t end;
      time (&end);                        // Zeit am Ende speichern
      double diff = difftime (end,start); // Differenz berechnen
    
    }
    

    Danke, dass klappt sehr gut! 🙂
    Nur bekomm' ich in meinem kleinen Test einfach nur 0 heraus...
    wie kann ich die Ergebniszahl den genauer (Milisekunden) bestimmen lassen?

    idR macht man das, indem man die zu testende Operation x mal ausführt - aber es gibt auch noch OS-abhängige Fkt, die eine höhere Auflösung haben...

    bb



  • Der Code den ich also jetzt gerade benutze, gibt nur ganze Sekunden an? Oder auch Zehntel-Sekunden?



  • bei solchen fragen lohnt sich immer ein blick in die referenz deiner wahl
    ich z.bsp. bevorzuge http://www.cplusplus.com/reference/

    dort header ctime -> fkt time -> http://www.cplusplus.com/reference/clibrary/ctime/time/

    wird aber erst im bsp. ausdrücklich erwähnt, dass es sekunden sind^^

    bb


  • Mod

    In der Referenz siehst du dann auch die Funktion clock, die eine (etwas) genauere Zeitmessung ermöglicht, aber dafür nicht geeignet ist, die Uhrzeit zu bestimmen.



  • Also Clock hab ich mal genommen, um zu messen wie lange ich auf eine Antwort an eine Socketschnittstelle warten musste.... War ne blöde Idee, weil die CPU in derzeit (fast) nix gemacht hat. Daher kam 0 raus, obwohl es eigentlich rund 1sec gedauert hat 😉

    Also bitte nicht versuchen Zeit zu messen 😉



  • SeppJ schrieb:

    time_t start;                       // Zeiten sind vom Typ time_t
      time (&start);                      // Zeit am Anfang speichern
    

    sadfsg schrieb:

    unsigned int StartZeit = static_cast<unsigned int>(time(0));
    

    Warum macht ihr es eigentlich immer so kompliziert? Anfänger verwirren? 😉

    time_t start = time(0); // fertig
    


  • [quote="LordJaxom"]

    SeppJ schrieb:

    time_t start = time(0); // fertig
    

    Was macht der Code jetzt genau?

    start ist die Variable vom Typ time_t?
    Diese bekommt den Wert time(0), also beginnt bei Null???

    Und wie würde ich damit den 2. Wert messen, am Ende des Programmes? 😕


  • Mod

    Barcelona schrieb:

    Was macht der Code jetzt genau?

    start ist die Variable vom Typ time_t?
    Diese bekommt den Wert time(0), also beginnt bei Null???

    Und wie würde ich damit den 2. Wert messen, am Ende des Programmes? 😕

    Lies die verlinkte Referenz. Da steht drin, was es mit der 0 auf sich hat.

    Soviel zum Thema 'Anfänger verwirren' 😃



  • jupp und was soll er mit time_t denn anfangen, ist in nem integer doch hundertmal besser für ihn.



  • Habt ihr auch einen Befehl, um das Skript (oder die Befehlsleiste, weiß nicht wie das in C++ richtig genannt wird...) schlafen zu lassen?

    In Ruby macht man das mit: sleep(5) zum Beispiel

    Gibt es den Befehl auch in C++?



  • Hat sich erledigt... 😃

    #include <windows.h>

    Sleep(2000)

    Wenn noch wer einen guten Vorschlag hat, um auch die Zehntelsekunden anzeigen zu lassen... immer raus damit 😉

    Wieso ist das Sleep eigentlich großgeschrieben? Konsonante?


  • Mod

    Barcelona schrieb:

    Wieso ist das Sleep eigentlich großgeschrieben? Konsonante?

    Weil das nicht zu C++ gehört sondern eine spezielle Microsoft-Bibliothek. Die können ihren Kram nennen wie sie wollen.

    Für Zehntelsekunden: Wie schon gesagt, clock kann dies möglicherweise leisten. Aber da sind eher weitere betriebssystemabhängige Funktionen gefragt.



  • Tim06TR schrieb:

    jupp und was soll er mit time_t denn anfangen, ist in nem integer doch hundertmal besser für ihn.

    Rate mal, was time_t mit allergrösster Wahrscheinlichkeit für ein Datentyp ist.

    Mit time_t spart er sich aber die unnötige Casterei und allfällige (unter Umständen berechtigte) Warnungen und kann direkt mit dem passenden Datentypen arbeiten.



  • :p 🙄 ups



  • Nochmal eine Anfängerfrage... zu einer anderen Sache.

    Hab' ein Programmbeispiel gesehen zur Speicherzuweisung, welches
    checkt wieviel Speicher zur Verfügung steht.

    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        char *p;
        for (int i=1; ; i++) 
        {
            p = new char[10000]; // Pointer auf einen Array mit 10000 Stellen
            if (p==0) break;
            cout << "RAM zugeteilt: " << 10 * i << "kb\n"; // 10 kb pro Charakter
        }
        return 0;
    }
    

    Hab dazu ein paar Fragen:
    1. In der for-Schleife: Was genau kommt in so eine Schleife?
    Zuerst Deklaration von Variablen? Dann Endbedingung? Dann Schritt, wenn Schleife durchlaufen wurde???

    2. Ist mein Kommentar zu "p" richtig?
    Wenn ja, wieso findet das Programm dann bei mir zB 2 GB Ram, bei 10.000 Stellen
    im Array je 10 kb, wär das nur 1 GB maximal? Oder wie ist das?

    Weiß da jemand weiter, danke schon einmal! 🙂



  • 1. Ja, aber das hättest du auch aus einem Anfängerbuch erfahren können..

    2. Ja, allerdings ist p eigentlich lediglich ein Zeiger auf ein char, aber da ein Array von char implizit in ein char Zeiger umgewandelt werden kann stimmt das so.
    Den zweiten Teil verstehe ich nicht so ganz.. Du allokierst da ja in jedem Schritt 10'000 Byte. Und das geht einfach so lange, bis new fehl schlägt, was nicht bereits sein muss, wenn dein RAM voll ist. Es könnte theoretisch auch was auf die HD ausgelagert werden o.ä. So kannst du also die Grösse des RAMs nicht ausmessen. 😉

    Und bitte gib den Speicher am Ende wieder frei. Auch wenn es wahrscheinlich dein OS für dich macht sollte ein Programm den Speicher, denn es allokiert wieder frei geben. (siehe delete)


Anmelden zum Antworten