2 Funktionen die ich nicht ganz verstehe



  • void f1(bool b)
    {
      time_t ti;
      unsigned int st;
    
      if (b)
        st = 0U;  
      else
      {
        ti = time((time_t *) 0);
        st = (unsigned int) ti;
      }
    
      srand(st);
    }
    
    void f2(bool b)
    {
      time_t ti;
      unsigned int st;
    
      if (b)
        return;
      else
      {
        ti = time((time_t *) 0);
        st = (unsigned int) ti;
      }
    
      srand(st);
    }
    

    Hi kann mir jemand kurz erklären was die Funktionen machen und was der unterschied ist?

    Speziell diese Zeilen:

    ti = time((time_t *) 0);
    st = (unsigned int) ti;
    srand(st);
    

    Was genau macht die time Funktion, ich verstehe die Dokumentation leider nicht in der cpp-Referenz. Es wird ja als Argument eine 0 übergeben die zu einem time_t Pointer gecastet wurde? Danach wird der ti-Wert zu einem unsigned int gecastet, was genau bedeutet das? Unsigned int sind doch alle quasi nur positive integers, wie kann die Zeit ti überhaupt negativ sein? Und was genau macht srand?

    Hoffe ihr könnt mir helfen 😃

    lg


  • Mod

    Das sind ungeheuer umständliche Schreibweisen für:
    f1 ist das gleiche wie if (b) srand(0) else srand(time(0));
    f2 ist das gleiche wie if (!b) srand(time(0));

    Der Autor hatte anscheinend keine Ahnung, dass die ganzen hier genutzten Typen sowieso implizit ineinander konvertierbar sind.

    Der Sinn von srand:
    https://www.c-plusplus.net/forum/172876

    Die time-Funktion gibt einen Zeitstempel zurück. Auf den allermeisten Systemen entspricht dieser der Anzahl der Sekunden, die seit dem 1. Januar 1970 vergangen sind. Der Sinn ist, dass dies eine sehr einfache Quelle ist, um bei jedem Programmstart einen anderen Seed für srand zu erhalten. Die Methode versagt natürlich, wenn das Programm häufiger als 1x pro Sekunde aufgerufen wird.

    Seit dem Sprachstandard von 2011 gibt es auch bessere Methoden für Zufallszahlen und Zeitstempel in C++, das was du hier siehst ist die alte C-Bibliothek. Mit der neuen Zufallszahlenbibliothek hat man - unter anderem - Zufallsgeneratoren ohne globalen Zustand und Zugriff auf echte Zufallszahlen zum Seeden der Generatoren (das alles konnte man natürlich auch schon vorher haben, aber nun ist es offizieller Sprachstandard). Die Behandlung von Zeitstempeln und Zeitdifferenzen wurde ebenfalls überarbeitet, aber das dies hier keine große Rolle spielt, gehe ich nicht näher darauf ein.

    Es wird ja als Argument eine 0 übergeben die zu einem time_t Pointer gecastet wurde?

    Ja, wobei dieser Cast in C++ unnötig ist, da die Zahl 0 ohnehin implizit in jede Art von Pointertyp konvertierbar ist.

    Danach wird der ti-Wert zu einem unsigned int gecastet, was genau bedeutet das?

    Kommt drauf an, was time_t genau ist. In den meisten Fällen wird das ohnehin ein Integertyp sein sein, das heißt es wird der Wert genommen, der heraus kommt, wenn man den Wert modulo dem Maximum eines unsigned int nimmt. Dies würde ebenfalls passieren, wenn der Cast nicht da stünde, dieser Cast ist also ebenfalls unnötig.

    Der Code ist ... nicht so gut. Nimm dir das nicht als Vorbild. Woher ist der?

    edit: time_t ist natürlich in der Regel signed



  • danke schonmal.
    Ist eine Aufgabe aus einem Uni-Übungblatt



  • cppbeginna schrieb:

    ..., wie kann die Zeit ti überhaupt negativ sein?

    Um Zeiten vor dem 01.01.1970 darzustellen.

    Auch wenn time() nicht gerade negative Werte zurückgibt, so gibt es noch andere Funtkionen, die mit dem Typ time_t arbeiten. Siehe http://www.cplusplus.com/reference/ctime/


Anmelden zum Antworten