Anfängerfragen



  • 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)



  • drakon schrieb:

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

    Ja, stimmt wohl. Hab auch eins 😉 Mich wunderte nur, dass man die 2. Stelle einfach leer lassen kann

    drakon schrieb:

    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)

    Aber was sagt denn dann die 10000 in

    p = new char[10000];
    

    aus?

    Und den delete Befehl... einfach

    delete p
    

    am Ende, oder?



  • Man kann alle Stellen leer lassen. 😉 (das gibt dann das pendant zu while(1))

    Die 10'000 sagen aus, dass du da ein Array mit 10'000 char's anforderst. Zurückgegeben wird ein Zeiger auf das erste Element.

    Nein. Das freigeben klappt in deinem Fall nicht so einfach.
    1. Wenn du new hast, dann gibst du mit delete frei und wenn du new [] hast, dann gibst du den Speicher auch wieder mit delete[] frei.

    In deinem Falle verlierst du die den Zeiger auf die Arrays, weil du sie jedes mal überschreibst. Du musst dir also die Zeiger merken und nicht jedes mal überschreiben. (z.B in einem Array, oder einem Container der Standardbibliothek, wie z.B std::vector, std::list o.ä). Dann kannst du am Ende deines Programmes den ganzen Container durchlaufen und jedes Element freigeben.

    Also ich würde dir dringend raten Speicherverwaltung in C++ nochmal genau anzuschauen. Das scheint dir noch nicht ganz soo klar zu sein. (ist aber recht wichtig).


Anmelden zum Antworten