endl ohne Zeilenumbruch


  • Mod

    Code Blocks?



  • Wir benötigen klare Fehlermeldungen. C++ 11 klappt nur mit neueren Compilern, z.B. MS VS 2015 Community (kostenlos). Code::Blocks bringt ein antikes gcc mit, kann man allerdings austauschen.



  • Ich verwende Open Watcom IDE

    MfG Train



  • Was exotischeres hättest du dir nicht aussuchen können, oder?


  • Mod

    Erhard Henkes schrieb:

    Code::Blocks bringt ein antikes gcc mit, kann man allerdings austauschen.

    Ich wollte eigentlich da drauf hinaus, dass, wenn ich mich recht erinnere, die Testkonsole bei Code::Blocks ein paar merkwürdige Eigenheiten hat.



  • SeppJ schrieb:

    Erhard Henkes schrieb:

    Code::Blocks bringt ein antikes gcc mit, kann man allerdings austauschen.

    Ich wollte eigentlich da drauf hinaus, dass, wenn ich mich recht erinnere, die Testkonsole bei Code::Blocks ein paar merkwürdige Eigenheiten hat.

    Ist die Konsole von Eclipse nicht noch merkwürdiger?

    @Train
    Existiert das PRoblem auch, wenn du das Programm in der Standardkonsole (bei Windows cmd) vom System ausführst?



  • Ich habe das C++ 11 "sleep" in eine Funktion gepackt, damit das im Sourcecode nicht so schrecklich hässlich wirkt, und wegen des C++ Subforums string aus C++ verwendet: 😃

    #include <iostream>   // cin, cout
    #include <chrono>     // milliseconds
    #include <thread>     // this_thread::sleep_for
    #include <string>
    
    using namespace std;
    
    void sleep(long long int ms)
    {
    	this_thread::sleep_for(chrono::milliseconds(ms));
    }
    
    int main()
    {
    	const string str = "Hallo du da! Kennst Du schon C++ 11?";
    	int i = 0;
    	while (str[i] != '\0')
    	{
    		cout << str[i] << flush;
    		sleep(200);
    		++i;
    	}
    	cout << endl << endl;
    }
    


  • @DirkB Ja es treten exakt die selben Probleme auf, wie beim ausführen mit Watcom

    @Erhard Henkes ich habe die sleep() Methode nach Vorlage selber geschrieben, da mir diese files nicht zur Verfügung stehen.

    #include <time.h>
    
    void sleep(unsigned int mseconds)
    {
        clock_t goal = mseconds + clock();
        while (goal > clock());
    }
    

    MfG Train



  • Vielleicht haste die delay() in der <dos.h>


  • Mod

    DirkB schrieb:

    SeppJ schrieb:

    Erhard Henkes schrieb:

    Code::Blocks bringt ein antikes gcc mit, kann man allerdings austauschen.

    Ich wollte eigentlich da drauf hinaus, dass, wenn ich mich recht erinnere, die Testkonsole bei Code::Blocks ein paar merkwürdige Eigenheiten hat.

    Ist die Konsole von Eclipse nicht noch merkwürdiger?

    Ich glaube, ich habe die beiden durcheinander geworfen. Eclipse hatte die Konsole mit dem merkwürdigen Verhalten.

    @Train
    Existiert das PRoblem auch, wenn du das Programm in der Standardkonsole (bei Windows cmd) vom System ausführst?

    Train schrieb:

    @DirkB Ja es treten exakt die selben Probleme auf, wie beim ausführen mit Watcom

    Das ist dann aber definitiv merkwürdig. Ich hege aufgrund deiner anderen Beschreibungen den Verdacht, dass du unsere Codes nicht 1:1 übernommen hast beziehungsweise uns nicht 1:1 den Code gezeigt hast, den du benutzt. Und in den Teilen, die du uns nicht zeigst, steckt der Fehler. So erfahren wir ja beispielsweise erst jetzt auf Seite 3, dass du die ganze Zeit über eine eigene sleep-Implementierung benutzt hast.

    Wie man Probleme nachstellbar und nachvollziehbar macht



  • -> 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("....."))


Anmelden zum Antworten