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
autoweglassen
-
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
autoVariable 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 << flushwird mehr Rechenzeit verschlingen als das ganze Erzeugen + Zerstören desstd::stringObjekts. -> 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
automuss 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, alsCLOCKS_PER_SECes 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
-
hustbaer schrieb:
Und in C++17 können wir dann noch das
autoweglassen
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
autoweglassen
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ürauto&&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.
-
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 vermutlichautostattauto&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