endl ohne Zeilenumbruch



  • -> Also zeig mal den Code vor, den du inzwischen verwendest. Dann können wir sehen, ob du das mit flush richtig umgesetzt hast.



  • Erhard Henkes schrieb:

    ... oder in C++ 11:

    ... oder in C++ 14:

    #include <iostream>   // cin, cout
    #include <string>     // string, ""s literals
    #include <chrono>     // milliseconds, ""ms literals
    #include <thread>     // this_thread::sleep_for
    
    using namespace std;
    using namespace std::chrono;
    
    int main()
    {
    	for (auto ch : "Hallo du da! Kennst Du schon C++ 14?"s)
    	{
    		cout << ch << flush;
    		this_thread::sleep_for(200ms);
    	}
    	cout << endl << endl;
    }
    

    Und in C++17 können wir dann noch das auto weglassen 🤡



  • Train schrieb:

    Also ich möchte gerne eine Ausgabe auf dem Bildschirm erzeugen, die eben nicht einfach so erscheint (also sofort da ist wie üblich), sondern wo man sieht wie es geschrieben wird, also Zeichen für Zeichen.

    Hallo Train,

    ich glaube Du meinst das hier: https://www.c-plusplus.net/forum/p1040897#1040897

    Wenn es nicht gleich funktioniert ggf. hinter Zeile 30 - vor dem Sleep - noch ein

    m_target->pubsync();
    

    einfügen.

    Gruß
    Werner



  • hustbaer schrieb:

    for (auto ch : "Hallo du da! Kennst Du schon C++ 14?"s)
    

    Warum das s-Suffix? Range-based for geht auch mit String-Literalen.



  • void sleep(unsigned int mseconds)
    {
    clock_t goal = mseconds + clock();
    while (goal > clock());
    }

    Da fehlt noch CLOCKS_PER_SEC zum Kalibrieren auf ms. Das klappt oben nur mit CLOCKS_PER_SEC = 1000 😃



  • rip performance schrieb:

    hustbaer schrieb:

    for (auto ch : "Hallo du da! Kennst Du schon C++ 14?"s)
    

    Warum das s-Suffix? Range-based for geht auch mit String-Literalen.

    Ah, OK, ja.

    Ich hatte erst ne auto Variable für den String. Und da zerfällt der Literal dummerweise zu nem Zeiger. Daher "..."s.

    Und natürlich macht range based for über den Literal auch einen Durchlauf für den Null-Terminator -- also mit ch == '\0' . Was vermutlich nicht erwünscht ist.

    Und ad "rip performance": LOL, get real. Ein einziges cout << ch << flush wird mehr Rechenzeit verschlingen als das ganze Erzeugen + Zerstören des std::string Objekts. -> Vollkommen irrelevant.



  • ... oder in C++ 14: ...

    MS VS 2015 schluckt den Code bereits. 👍

    In <chrono> ist schon alles drinnen: h, min, s, ms, us, ns
    auto muss eigentlich nicht sein.

    #include <iostream>   // cin, cout
    #include <chrono>     // h, min, s, ms, us, ns
    #include <thread>     // this_thread::sleep_for
    
    using namespace std;
    using namespace std::chrono;
    
    int main()
    {
    	for (char c : "Hallo du da! Kennst Du schon C++ 14?")
    	{
    		cout << c << flush;
    		this_thread::sleep_for(200000us);
    	}
    	cout << endl << endl;
    }
    


  • Erhard Henkes schrieb:

    void sleep(unsigned int mseconds)
    {
    clock_t goal = mseconds + clock();
    while (goal > clock());
    }

    Da fehlt noch CLOCKS_PER_SEC zum Kalibrieren auf ms. Das klappt oben nur mit CLOCKS_PER_SEC = 1000 😃

    Ist es unter Windows wohl auch (aber davon darf man nicht ausgehen).

    Aber, die Schrittweite vom Rückgabeweret von clock() ist nicht unbedingt 1.
    Die Genauigkeit von clock() ist dann kleiner, als CLOCKS_PER_SEC es vorgaukelt.



  • ok also hier estmal mein vollständiger Code, dass ihr nachvollziehen könnt wie ich es getestet habe:

    #include <iostream>
    #include <time.h>
    
    void sleep(unsigned int mseconds)
    {
        clock_t goal = mseconds + clock();
        while (goal > clock());
    }
    
    int main()
    {
        char example [] = "Hallo du da !";
        for ( int i = 0; i < 13; i++ )
    	{
    		cout << example[ i ] << flush;
    		sleep(200);
    	}
    }
    

    Resultat ist, dass er einfach die Zeit wartet bis der Prozess abgelaufen ist und dann alles auf einmak ausgibt.

    Setze ich statt dem flush ein endl...

    char example [] = "Hallo du da !";
    for ( int i = 0; i < 13; i++ )
    	{
    		cout << example[ i ] << endl;
    		sleep(200);
    	}
    

    ...kommt der Text zwar verzögert aber vertikal.

    Weiterhin stehen mir files wie <windows.h>, <chrono> und <thread> nicht zur Verfügung, deshalb das "altertümliche" Programmieren hier. 😃

    Danke im voraus

    MfG Train


  • Mod

    hustbaer schrieb:

    Und in C++17 können wir dann noch das auto weglassen 🤡

    Ne, terse range-based for loops sind raus. Leider. Ich kann nicht nachvollziehen, warum es nicht lesbar sein soll...

    Und natürlich macht range based for über den Literal auch einen Durchlauf für den Null-Terminator -- also mit ch == '\0'. Was vermutlich nicht erwünscht ist.

    => for (auto ch : boost::range::as_literal("....."))



  • Arcoth schrieb:

    hustbaer schrieb:

    Und in C++17 können wir dann noch das auto weglassen 🤡

    Ne, terse range-based for loops sind raus. Leider. Ich kann nicht nachvollziehen, warum es nicht lesbar sein soll...

    Argh.
    Wieder mal ne Entscheidung des Comittee die ich nicht ganz nachvollziehen kann.
    Na gut, die paar Zeichen für auto&& bringen mich auch nicht um.



  • Arcoth schrieb:

    Ne, terse range-based for loops sind raus. Leider. Ich kann nicht nachvollziehen, warum es nicht lesbar sein soll...

    Gibts dafür ne verlässliche Quelle welche Proposals drin und welche draußen sind? Irgendwo habe ich das auch gehört aber weiß nicht mehr wo.


  • Mod

    sebi707 schrieb:

    Arcoth schrieb:

    Ne, terse range-based for loops sind raus. Leider. Ich kann nicht nachvollziehen, warum es nicht lesbar sein soll...

    Gibts dafür ne verlässliche Quelle welche Proposals drin und welche draußen sind? Irgendwo habe ich das auch gehört aber weiß nicht mehr wo.

    http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4252.pdf

    CWG Motion 13 straw poll results were:
    In favor: 8 Opposed: 43 abstain: 18
    Motion not carried



  • Wäre jetzt nur noch interessant was da vor der Abstimmung besprochen wurde. Muss ja fast einen guten Grund dagegen gegeben haben wenn die Abstimmung so eindeutig ausgegangen ist.



  • Train schrieb:

    Weiterhin stehen mir files wie <windows.h> ... nicht zur Verfügung, deshalb das "altertümliche" Programmieren hier. 😃

    Auf welchem Betriebssystem bist du unterwegs?

    Ich würde mal cerr statt cout probieren.



  • hustbaer schrieb:

    Wäre jetzt nur noch interessant was da vor der Abstimmung besprochen wurde. Muss ja fast einen guten Grund dagegen gegeben haben wenn die Abstimmung so eindeutig ausgegangen ist.

    Laut hier war der Grund wohl das:

    int i = 0;
    
    for (i : vec) // Ist dass das 'i' von oben oder ein neues 'i'?
       ;
    

    Fände ich auch ein bisschen verwirrend.



  • Es muss ein neues i sein weil bei der "alten" Range Based For Loop kann man keine vorhandenen Variablen nutzen, sondern muss immer eine neue anlegen.



  • sebi707 schrieb:

    Es muss ein neues i sein weil bei der "alten" Range Based For Loop kann man keine vorhandenen Variablen nutzen, sondern muss immer eine neue anlegen.

    Schon klar, aber das ist dann halt nicht mehr konsistent zur "normalen" for loop.



  • Ah, OK, Verwirrung vermeiden.
    Gut, das ist irgendwie verständlich. Und wie gesagt - auto&& zu schreiben ist nicht SO schlimm 😉
    (Einzig doof dass viele Leute dann vermutlich auto statt auto& bzw. auto&& schreiben werden -- an Stellen wo man gar nicht kopieren will. Was natürlich doof ist, aber Leute sind halt doof.)



  • @manni66 ich benutze derzeit Windows 10


Anmelden zum Antworten