Tom: C++, welchen Weg nehmen Streams (iostream)?

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

--
Nur selber lernen macht schlau
http://bergpost.annerschbarrich.de
  1. 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

    1. 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

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
  2. 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

    1. 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 Loeschen

      for(x=-7; x<=7; x+=0.5) {
          y1 = floor(fabs(x)+sqrt(49-xx)+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) << ";" << (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  
      ![](http://selfhtml.bitworks.de/Virencheck.gif)  
        
      
      -- 
      Nur selber lernen macht schlau  
      <http://bergpost.annerschbarrich.de>
      
      1. 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

      2. 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

        1. 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

          --
          Nur selber lernen macht schlau
          http://bergpost.annerschbarrich.de
    2. 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

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      1. 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

        --
        "If the future isn't bright, at least it is colorful"