Wie bekommt man eine Zeit in eine If-Bedingung?



  • Danke für den Vorschlag.

    Leider funktioniert er nicht.
    Die zweite If-Bedingung wird nie wahr.

    Es gibt keine Fehlermeldung, aber wenn ich das zweite If auskommentiere, läuft das Programm wie zu Anfang.

    Ein "static" vor der Deklaration des time_point t hilft leider auch nicht.

    Mit der suboptimalen globalen Variable lief es.



  • Das macht 0 Sinn, erklär mal in Worten was du erreichen willst. Warum sollte die Definition und Initialisierung einer Variablen von irgendeinem flag abhängen? wtf?



  • Ok, ich probiere es mal in Pseudocode zu erklären.

    while(1)
    {
    Zeitflag=0;
    Wenn (Zeitflag ==0){Deklariere und initialisiere Zeitpunkt t mit Systemzeit;}
    
    Wenn (Systemzeit jetzt - t größer als 500 ms,) 
       {führe nachfolgend Dinge aus;
        Speichere jetzige Systemzeit für späteren erneuten Vergleich;
        Setzte Zeitflag 1, damit soeben gespeicherte Zeit nicht durch erneute initialisierung überschrieben wird. } }
    

    Ich habe eine Schleife. In dieser muss ich zu Beginn meinen Zeitpunkt, mit dem ich später vergleiche festlegen.
    Hier deklariere und initialisiere ich diesen Zeitpunkt t.

    Die zweite If-Bedingung prüft dann, ob seit dem letzten Zeitpunkt schon 500 ms rum sind, um dann ggf. etwas auszuführen. Hierbei wird ein neuer Zeitpunkt festgelegt, mit dem dann später wieder verglichen wird.
    Jetzt muss ich mit einem Flag die Deklaration des ersten Zeitpunktes außer Funktion setzen, weil sonst durch die Schleife der in der zweiten If-Bedingung zuletzt gespeicherte Zeitpunkt überschrieben würde.

    Ich hoffe das ist so halbwegs verständlich 😉



  • Das ist kein Pseudocode das ist exakt der gleiche Code wie vorher auch nur nicht mehr gültig nach den Regeln von C...



  • Nathan schrieb:

    Das ist kein Pseudocode das ist exakt der gleiche Code wie vorher auch nur nicht mehr gültig nach den Regeln von C...

    Ich weiß, dass es derselbe Code ist.
    Ich wollte damit verdeutlichen, warum ich meiner Meinung nach einen Flag brauche.

    Ich bin wirklich C++ Beginner und leider weiß nicht nicht, warum das Beispiel ohne globale Variable nicht funktioniert während das mit der globalen Variable einwandfrei läuft.



  • Um... dann definiere die Variable halt außerhalb der Schleife? Ich seh das Problem gerade nicht.



  • cooky451 schrieb:

    Um... dann definiere die Variable halt außerhalb der Schleife? Ich seh das Problem gerade nicht.

    Dann wäre es eben eine globale Variable und zumindest der Vorredner Nathan schrieb hier, dass man für sowas wie hier niemals eine globale Variable nehmen sollte.

    Ich muss aber auch sagen, dass meine Programme einfach und überschaubar sind.
    Daher denke ich, dass es villeicht für mich am besten ist, einfach wirklich eine globale Variable zu nutzen.

    Danke nochmals für die super Hilfe hier.
    Echt prima! 🙂



  • Britzi schrieb:

    cooky451 schrieb:

    Um... dann definiere die Variable halt außerhalb der Schleife? Ich seh das Problem gerade nicht.

    Dann wäre es eben eine globale Variable

    Nein. Globale Variablen sind anders, sie werden nämlich außerhalb von Funktionen deklariert.
    Sie sind fehleranfällig, weil sie von jeder Funktion verändert werden kann und außerdem kann man ein einmal geschriebenes Programm mit globalen Variablen schwer fehlerfrei erweitern.
    Bei deinem Programm wird sie nur außerhalb des Schleife angelegt, aber immer noch innerhalb der Funktion.



  • Britzi schrieb:

    Dann wäre es eben eine globale Variable

    Eh... nein. :p



  • Ok, ich habs verstanden.
    Alles außerhalb der Main ist global und sonst nicht 🙂

    Wenn ich aber nun die Variable in der Main und nicht global deklariere, ist sie in einer Funktion in der späteren Schleife nicht deklariert und somit nicht verfügbar.

    void  Zeitfunktion ()
     {
      //Hier muss t verfügbar sein
     }
    
    int main( int argc, const char** argv )
    {
       auto t = std::chrono::high_resolution_clock::now();
       for(;;)
        {
          Zeitfunktion ();
        }
    }
    

    Wie kann ich sie dort verfügbar machen?
    Ich möchte dabei t nicht als Parameter der Funktion übergeben.
    Die hat schon genug Parameter 😉

    Ich weiß, das sind sicherlich triviale Basics, aber jeder fängt mal klein an 😉

    Vielen Dank 🙂



  • Britzi schrieb:

    Ok, ich habs verstanden.
    Alles außerhalb der Main ist global und sonst nicht 🙂

    Eher Variablen, die ausserhalb von Funktionen und Klassen definiert sind, nicht nur main() .

    Britzi schrieb:

    Wie kann ich sie dort verfügbar machen?

    Parameter.

    Britzi schrieb:

    Ich möchte dabei t nicht als Parameter der Funktion übergeben.
    Die hat schon genug Parameter 😉

    Dann ist das dein Problem. Verringere die Anzahl der Parameter; z.B. indem du zusammengehörige Werte gruppierst.



  • Britzi schrieb:

    Ok, ich habs verstanden.
    Alles außerhalb der Main ist global und sonst nicht 🙂

    Von der Formulierung her nicht ganz richtig: Alles außerhalb von Funktionen, Klassen etc. ist global (Die Aussage ist nicht auf die main begrenzt).

    Britzi schrieb:

    Wenn ich aber nun die Variable in der Main und nicht global deklariere, ist sie in einer Funktion in der späteren Schleife nicht deklariert und somit nicht verfügbar.

    Selbst wenn du das nicht hören willst: Funktionsparameter (Oder als Member einer Klasse, das führt deinem Code nach aber bereits zu weit). Wenn ich die Rückgabe von std::chrono::high_resolution_clock::now richtig interpretiere:

    void Zeitfunktion(std::chrono::time_point & t)
    {
        //...
    }
    
    int main(int argc, const char** argv)
    {
        auto t = std::chrono::high_resolution_clock::now();
        for(;;)
        {
            Zeitfunktion(t);
        }
    }
    


  • Ok, vielen Dank 🙂

    Dann übergebe ich das halt als Parameter.

    Leider funktioniert es so aber nicht.
    Ich bekomme folgenden Fehler bei der Übergabe:

    'std::chrono::time_point' is not a type

    Ich habe auch schon ein paar Datentypen probiert, aber ich habe keine Idee, was der richtige Datentyp ist. 😞



  • Britzi schrieb:

    Ich habe auch schon ein paar Datentypen probiert, aber ich habe keine Idee, was der richtige Datentyp ist. 😞

    Probier nicht aus, sondern finde systematisch heraus, was das Problem sein könnte. Zum Beispiel kannst du auf cppreference.com oder cplusplus.com den Typ chrono::time_point nachschlagen und schauen, ob du den entsprechenden Header eingebunden hast.



  • Britzi schrieb:

    Ich habe auch schon ein paar Datentypen probiert, aber ich habe keine Idee, was der richtige Datentyp ist. 😞

    Weiterprobieren! Nach wenigen Milliarden Jahren haste die richtige Buchstabenfolge gefunden.

    Oder schnell nachschauen, http://en.cppreference.com/w/cpp/chrono/high_resolution_clock



  • Danke für die Referenzen.

    Mir war bis eben nicht bewusst, dass es sowas praktisches gibt 👍 🙂

    Als Parameter

    std::chrono::high_resolution_clock::time_point &t
    

    funktioniert einwandfrei 🙂

    Danke nochmals 🙂


Anmelden zum Antworten