C++, welchen Weg nehmen Streams (iostream)?
Tom
- sonstiges
0 Vinzenz Mai0 Tom
0 Andreas Pflug0 Tom0 Andreas Pflug0 Vinzenz Mai0 Tom
0 Tom
Hello,
Streams (cout) und umschaltung der Konsolenfarbe passen eigentlich nicht zusammen, jedenfalls ist das bis heute meine Meinung...
Wie kann man nun SetConsoleTextAttribute() und cout unter einen Hut bringen?
Wo wird der Stream an den Screenbuffer übergeben?
Wie komme ich da an die Stelle, an der beide Informationen gemeinsam auflaufen? Das wird ja vermutlich von der verwendeten Hardware und deren BIOS abhängig sein.
Mir würde es reichen, da nur für Ix86 eine saubere Lpsung hinzubekommen.
cout
iostream
ios
ios_base
wo sit da der Screenbuffer zu suchen?
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Hallo,
Wo wird der Stream an den Screenbuffer übergeben?
Wie komme ich da an die Stelle, an der beide Informationen gemeinsam auflaufen? Das wird ja vermutlich von der verwendeten Hardware und deren BIOS abhängig sein.
nein, selbstverständlich nicht.
Mir würde es reichen, da nur für Ix86 eine saubere Lpsung hinzubekommen.
unter Linux anders als unter Windows. Welches OS?
Freundliche Grüße
Vinzenz
Hello,
Wo wird der Stream an den Screenbuffer übergeben?
Wie komme ich da an die Stelle, an der beide Informationen gemeinsam auflaufen? Das wird ja vermutlich von der verwendeten Hardware und deren BIOS abhängig sein.nein, selbstverständlich nicht.
Mir würde es reichen, da nur für Ix86 eine saubere Lpsung hinzubekommen.
unter Linux anders als unter Windows. Welches OS?
Gute Frage.
Erstmal Windows. Da habe ich heute den ganzen Tag recherchiert und gebastelt, um zu begreifen, was denn da irgendwo weiter unten geschieht. Wie Du Dir denken kannst, reicht mir ein zufälliges "wieso, funktioniert doch" nicht aus...
Linux wird in ca. vier bis acht Wochen folgen.
Hardware und BIOS, sowie die Methoden aus den guten alten DOSen-tagen sind mir da noch gut vertraut. Mit "Windows-Beschleunigern" in Grafikkarten hört es da aber schon auf, dass ich es noch auswendig hinbekäme.
Die Frage ist ja, wie bekommt man so unterschiedliche Dinge, wie den Informationsstrom (iostream) und dessen Hook-Formatierung (nicht die inline-Formatierung, wie Spaltenbreite, linksbündig, rechtsbündig, ...) unter einen Hut. Da fallen mir eben aus der klassischen Perspektive die Farben, Unterstreichung, Blinken ein.
Der Informationsstrom inclusive fast aller inline-Formatierungen kann umgelenkt werden, die hooked Formate eben nicht. Wir haben versucht, eine Klasse zu erstellen, die sich in den ostream einklinken kann und dann die Farbe steuert. Das war aber nur teilweise erfolgreich.
Ich wüede daher gerne näher ergründen, wann so ein ostream bei der Grafikkarte landet und wann ihm z.B. die Farben beigemsicht werden...
Windows-Konsole ist ja auch wieder etwas anderes, als die gute alte 80*25 Zeichen Konsole mit ihren Tricks und Sonderregeln.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Eine portable Möglichkeit sind ja immer
noch die ANSI Escape Codes. Die Verwendung veranschaulicht
folgendes Code-Beispiel (unter Linux / KDE getestet):
#include<math.h>
#include<iostream>
using namespace std;
int main() {
double x, y1, y2;
char *esc = "\x1b[";
cout << esc << "40m" // Hintergrund schwarz
<< esc << "91m" // Vordergrund rot, intensiv
<< esc << "2J"; // Konsole Loeschen
for(x=-7; x<=7; x+=0.5) {
y1 = floor(fabs(x)+sqrt(49-x*x)+0.5);
y2 = floor(fabs(x)-sqrt(49-x*x)+0.5);
// Im Folgenden jeweils:
// Cursor positionieren und ein '*' ausgeben
cout << esc << (15-y1) << ";" << (2*x+15) << "f*"
<< esc << (15-y2) << ";" << (2*x+15) << "f*";
}
cout << esc << "25;1f\n";
return 0;
}
Unter Linux muss man anschließend 'reset' eingeben,
damit die Konsole wieder normal aussieht ... ;-)
MfG
Andreas
Hello,
Eine portable Möglichkeit sind ja immer
noch die ANSI Escape Codes. Die Verwendung veranschaulicht
folgendes Code-Beispiel (unter Linux / KDE getestet):
#include<math.h>
#include<iostream>using namespace std;
int main() {
double x, y1, y2;
char *esc = "\x1b[";cout << esc << "40m" // Hintergrund schwarz
<< esc << "91m" // Vordergrund rot, intensiv
<< esc << "2J"; // Konsole Loeschenfor(x=-7; x<=7; x+=0.5) {
y1 = floor(fabs(x)+sqrt(49-xx)+0.5);
y2 = floor(fabs(x)-sqrt(49-xx)+0.5);
// Im Folgenden jeweils:
// Cursor positionieren und ein '' ausgeben
cout << esc << (15-y1) << ";" << (2x+15) << "f*"
<< esc << (15-y2) << ";" << (2x+15) << "f";
}cout << esc << "25;1f\n";
return 0;
}
>
> Unter Linux muss man anschließend 'reset' eingeben,
> damit die Konsole wieder normal aussieht ... ;-)
Das habe ich auch schon ausprobiert.
Aber unter Windows komm in der Konsole nur
←[40m←[91m←[2J←[8;1f\*←[8;1f\*←[6;2f\*←[11;2f\*←[5;3f\*←[13;3f\*←[5;4f\*←[14;4f\*←[5;5f\*←[15;5f\*←[5;6f\*←[16;6f\*←[5;7f\*←[17;7f\*←[
5;8f\*←[18;8f\*←[6;9f\*←[18;9f\*←[6;10f\*←[19;10f\*←[6;11f\*←[20;11f\*←[7;12f\*←[20;12f\*←[7;13f\*←[21;13f\*←[8;14f\*←[21;14f\*←[8;15f
\*←[22;15f\*←[8;16f\*←[21;16f\*←[7;17f\*←[21;17f\*←[7;18f\*←[20;18f\*←[6;19f\*←[20;19f\*←[6;20f\*←[19;20f\*←[6;21f\*←[18;21f\*←[5;22f\*
←[18;22f\*←[5;23f\*←[17;23f\*←[5;24f\*←[16;24f\*←[5;25f\*←[15;25f\*←[5;26f\*←[14;26f\*←[5;27f\*←[13;27f\*←[6;28f\*←[11;28f\*←[8;29f\*←
[8;29f\*←[25;1f
Das liegt vermutlich daran, dass die ansi.sys gar nicht mehr geladen ist und das kann man auch nicht vom Nutzer verlangen, der ja "sein Windows" als das beste aller Zeiten hält und "seine Einrichtung" sowieso als das Non plus Ultra.
Es muss direkt über das Programm gehen, das den Bildschirmspeicher entsprechend bedient. Dazu hat dieser ja (im WinDOSen-Konzept) Zeichen:Farbe-Pärchen für Standard VGA und das wird auch für Windows-Konsolen beibehalten. Da landet es ja per ansi.sys auch.
Außerdem interessiert mich natürlich, wie ich erkennen kann, ob der ostream auch auf die Konsole und diese auf den Screenbuffer gerichtet ist. Das muss man ja auch irgendwie abfragen können. Denn wenn dies nicht der fall ist (Bei Umleitung auf Printer oder File z.B.), dann wäre die Farbsteuerung nicht so wirklich sinnvoll.
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg

--
Nur selber lernen macht schlau
<http://bergpost.annerschbarrich.de>
Das habe ich auch schon ausprobiert.
Aber unter Windows komm in der Konsole nur
←[40m←[91m←[2J←[8;1f*←[8;1f*←[6;2f*←[11;2f*←[5;3f*←[13;3f*←[5;4f*←[14;4f*←[5;5f*←[15;5f*←[5;6f*←[16;6f*←[5;7f*←[17;7f*←[
5;8f*←[18;8f*←[6;9f*←[18;9f*←[6;10f*←[19;10f*←[6;11f*←[20;11f*←[7;12f*←[20;12f*←[7;13f*←[21;13f*←[8;14f*←[21;14f*←[8;15f
*←[22;15f*←[8;16f*←[21;16f*←[7;17f*←[21;17f*←[7;18f*←[20;18f*←[6;19f*←[20;19f*←[6;20f*←[19;20f*←[6;21f*←[18;21f*←[5;22f*
←[18;22f*←[5;23f*←[17;23f*←[5;24f*←[16;24f*←[5;25f*←[15;25f*←[5;26f*←[14;26f*←[5;27f*←[13;27f*←[6;28f*←[11;28f*←[8;29f*←
[8;29f*←[25;1f
Hey - genau das sollte herauskommen, ist doch klasse oder?
Mal im Ernst, die Sache mit den ANSI-Escape-Codes ist
dann wohl doch nicht so portabel. In einer Linux-Konsole
sieht's jedenfalls schön bunt aus.
Zu Deiner anderen Frage: Ich habe mit Eclipse bisher
keine Erfahrung sondern verwende bei kleinen Programmen
bisher die Konsole, makefiles, vi & Co. Bei größeren
Projekten habe ich mit kdevelop (als Debian-Paket einfach
installierbar) ganz gute Erfahrungen gemacht.
MfG
Andreas
Hallo,
noch die ANSI Escape Codes. Die Verwendung veranschaulicht
5;8f*←[18;8f*←[6;9f*←[18;9f*←[6;10f*←[19;10f*←[6;11f*←[20;11f*←[7;12f*←[20;12f*←[7;13f*←[21;13f*←[8;14f*←[21;14f*←[8;15f
*←[22;15f*←[8;16f*←[21;16f*←[7;17f*←[21;17f*←[7;18f*←[20;18f*←[6;19f*←[20;19f*←[6;20f*←[19;20f*←[6;21f*←[18;21f*←[5;22f*
←[18;22f*←[5;23f*←[17;23f*←[5;24f*←[16;24f*←[5;25f*←[15;25f*←[5;26f*←[14;26f*←[5;27f*←[13;27f*←[6;28f*←[11;28f*←[8;29f*←
[8;29f*←[25;1f
Das liegt vermutlich daran, dass die ansi.sys gar nicht mehr geladen ist
und gar nicht geladen werden kann, es sei denn, man wollte ein 16-Bit-Legacy-Programm schreiben. Ich zitiere aus oben verlinktem Wikipedia-Artikel:
<zitat>
"32-bit character-mode (subsystem:console) Windows applications don't
write ANSI escape sequences to the console"
</zitat>
Außerdem interessiert mich natürlich, wie ich erkennen kann, ob der ostream auch auf die Konsole und diese auf den Screenbuffer gerichtet ist. Das muss man ja auch irgendwie abfragen können. Denn wenn dies nicht der fall ist (Bei Umleitung auf Printer oder File z.B.), dann wäre die Farbsteuerung nicht so wirklich sinnvoll.
Die MSDN hat ein Kapitel Character-Mode Applications, das Dich interessieren könnte.
Freundliche Grüße
Vinzenz
Hello,
[...] Ok, Schnee von gestern.
Außerdem interessiert mich natürlich, wie ich erkennen kann, ob der ostream auch auf die Konsole und diese auf den Screenbuffer gerichtet ist. Das muss man ja auch irgendwie abfragen können. Denn wenn dies nicht der fall ist (Bei Umleitung auf Printer oder File z.B.), dann wäre die Farbsteuerung nicht so wirklich sinnvoll.
Die MSDN hat ein Kapitel Character-Mode Applications, das Dich interessieren könnte.
Danke für den Link.
Die Console Reference quäle ich schon seit ein paar Tagen. Alle Querverweise habe ich noch nicht durch...
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Hello,
noch eine Frage:
Du programmierst mit gcc oder g++ auf Linux?
Benutzt Du da eclipse?
Ich bekoome es einfach nicht zum Laufen.
Habe es mit apt-get insalliert und versucht cpp (also die cdt) zu installieren. Das ging nur über Callisto überhaupt ansatzweise. Leider kam dann die nächste Hürde: das jdk bzw. die JVM ist dem eclipse zu alt. Da habe ich bisher keider keine Möglichkeit gefunden, eine aktuelle zu installieren.
Auf den SUN-Seiten steht seit kurzem dazu immer "not free"...
Beginnnt jetzt die Zeit des Geldverdienes wieder bei SUN?
Liebe Grüße aus Syburg bei Dortmund
Tom vom Berg
Hai,
Hürde: das jdk bzw. die JVM ist dem eclipse zu alt. Da habe ich bisher
keider keine Möglichkeit gefunden, eine aktuelle zu installieren.
Einfach downloaden, installieren und den Lizenzbestimmungen zustimmen:
http://java.sun.com/javase/downloads/index.jsp
MfG,
Sympatisant