Statusanzeige, wie? (Text)
-
Kann mir in etwa denken, wie du es meinen könntest.
Ich nehme ja mal an du verwendest cout in der Konsole? Ich weiß nicht, ob es so Konsolenfunktionen wie SetCursorPos() oder so gibt, kanns mir aber nicht vorstellen (so wie in Pascal mit der Unit Crt :-)).
Jedenfalls musst du eben einfach den Ausgabestring dynamisch anpassen, ist ja eigentlich sehr einfach: Jedesmal, wenn der Status voranschreitet, schreibst du eben ein "=" mehr und ein " " weniger in den String, und am Ende immer "]".
Kann sein, dass ich dich vollkommen falsch verstanden habe, wenn ja, dann erklär alles bitte etwas genauer.
-
Ich würd einfach das Rücksprungzeichen ('\r') rausschreiben:
#include <iostream> #include <string> #include <unistd.h> int main() { std::string s = "[ ]"; int i; std::cout << s << std::flush; for(i = 1; i < 11; ++i) { sleep(1); s[i] = '='; std::cout << '\r' << s << std::flush; } std::cout << std::endl; return 0; }
-
Mit \r kannst du an den Anfang der Zeile zurückspringen (Wenn die Terminalemulation das unterstützt)
#include <iostream> #include <cassert> //#include <unistd.h> void display_status(const char *pre,unsigned int n) { assert(pre); assert(n<=100); std::cout << '\r' << pre << "["; n/=10; unsigned int i=0; for(;i<=n;++i) std::cout << '='; while(++i<=10) std::cout << ' '; std::cout << ']' << std::flush; } int main() { for(unsigned int i=0;i<=100;++i) { display_status("Status: ",i); //usleep(10000); //hier was tun } std::cout << '\n'; }
-
achja, es gibt auch eine Boost-Library dafür http://www.boost.org/libs/timer/index.html
-
0xdeadbeef schrieb:
#include <iostream> #include <string> #include <unistd.h> int main() { std::string s = "[ ]"; int i; std::cout << s << std::flush; for(i = 1; i < 11; ++i) { sleep(1); s[i] = '='; std::cout << '\r' << s << std::flush; } std::cout << std::endl; return 0; }
Hallo,
Ich hab das nun verwendet... ABER:
http://nopaste.php-q.net/92782 (ist nur ein teil der schleife)
erzeugt bei mir einen Speicher zugriffsfehler!
[ ]Speicherzugriffsfehler
Wenn ich
if ((ic+1) % bar_size == 0) { s[g] = '='; cout << '\r' << s << flush; }
rausmache geht es!
Der gdb melded folgendes:
(gdb) bt
#0 0x0804b34d in main (argc=3, argv=0xfeeebed4) at basic_string.h:441Koennt ihr mir da evtl. auc noch helfen *g*
-
Irgendwann wird g einfach zu gross. Da g in der Schleife inkrementiert wird, solltest du die Laufbedingung !infile.eof() nochmal überprüfen.
-
groovemaster schrieb:
Irgendwann wird g einfach zu gross.
Kann man was dagegen machen?
groovemaster schrieb:
Da g in der Schleife inkrementiert wird, solltest du die Laufbedingung !infile.eof() nochmal überprüfen.
Sorry, das hab ich nicht verstanden
kannst du mir das evtl. kuurz erklaeren?
-
Irgendwie versteh ich nicht, was du nicht verstehst? Ich dachte du hast die Schleife implementiert?
String s ist doch 12 Zeichen lang, dh g darf maximal den Wert 11 haben, da ansonsten mit s[g] auf einen Speicherbereich zugegriffen wird, der dir nicht gehört. Abbruchbedingung der Schleife ist das Ende von infile, dazu wird bei jedem Durchlauf ein Byte aus infile gelesen und g inkrementiert. Dh wenn infile zB 100 Byte lang ist, kann g 100 werden. Und das ist, wie oben bereits gesagt, nicht gut. Allerdings bin ich momentan zu müde, um mir die restlichen Bedingungen anzuschaun, da auf s[g] ja bedingt zugegriffen wird.
-
Hallo,
Okay, ich habs glaube ich jetzt kapiert
Danke, ich teste nacher mal was
-
kingruedi schrieb:
achja, es gibt auch eine Boost-Library dafür http://www.boost.org/libs/timer/index.html
Ich glaub er sollte lieber die Suchfunktion benutzen und nach "spiele contest" (o.ä.) suchen. Da gabs einen Wettbewerb wo es eine helper.h und helper.cpp gab, damit konntest du total einfach Farben verwenden, Cursor platzieren usw. ist dann zwar nicht mehr plattformunabhängig aber who cares.
Imho der leichteste Weg.