www.mikrocontroller.net

Forum: PC-Programmierung Escape sequenzen in C


Autor: Hader Ernst (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

weiß jemand wie ich mit C und den Escape- Sequenzen einen Text auf der
Eingabeaufforderung in Farbe, z.B.: grün mache.
lg und vielen Dank.

Ernst

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Schau mal nach ANSI TERMINAL
erfordert natuerlich das dein Ausgabegerät auch ANSI TERMINAL kann.

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt keine Escapesequenzen für C, die Text farbig machen.

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde davon die Finger lassen. Das funktioniert nur bei etwa 1 von 5
  Compilern.

Autor: Marko B. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Hannes Albert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich brauche jetzt auch Escape- Sequenzen. Ich habe ein Menü und hab mir 
einen Background eingeschalten mit \033[40m, ich kann diesen aber leider 
nicht mehr ausschalten sodass alle Menüpunkte einen schwarzen 
Hintergrund haben. Mache ich den Hintergrund mit \033[47 wieder weiß, so 
kann man die Menüpunkte nicht mehr sehen und der Hintergrund ist grau.
Weis jemand, wie man die Attribute wieder ausschalten kann.

Vielen Dank.
lg
Hannes

Autor: Bartli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich würde davon die Finger lassen. Das funktioniert nur bei etwa 1 von 5 
Compilern.

Und was haben deiner Meinung nach ANSI Escape Sequenzen mit dem Compiler 
zu tun ?

Autor: Hannes Albert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich schreib diese nur in einen Buffer und schick diesen dann an einen 
VT100.
Also ist das nicht so tragisch mit dem Compiler, der hat ja nichts zu 
tun damit.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bartli wrote:
>> Ich würde davon die Finger lassen. Das funktioniert nur bei etwa 1 von 5 
Compilern.
>
> Und was haben deiner Meinung nach ANSI Escape Sequenzen mit dem Compiler
> zu tun ?

Das ist nicht meine Meinung, sondern das ist das Ergebnis das ich 
ausprobiert habe. Je nach Compiler werden die Escape Sequenzen garnicht 
oder nur teilweise ausgeführt.
Visualstudio 6.0 igoriert die komplett, bei Dev Cpp (oder so ähnlich) 
gingen glaube ich nur die Escape Sequenzen für Farbe, nicht aber zum 
positionieren des Cursors.
Ich habe dann einen fertigen Code aus dem Internet verwendet 
(conioex.cpp)

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Je nach Compiler werden die Escape Sequenzen garnicht
> oder nur teilweise ausgeführt

So ein Quatsch.
Der Compiler ignoriert überhaupt nichts. Der Compiler
generiert Code der genau das ausgibt, was in deinen
Ausgabeanweisungen steht. Das Gerät an das du die
Codes sendest kann die Codes ignorieren.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn das so ist, dann erklär mal wieso das nicht mit jedem Compiler 
funktioniert !

Hier noch ein paar Beispiele:
ESC[2J solle den Bildschirm löschen
ESC[<farbe1>;<farbe2>m setzt die Textfarbe farbe1 und der Hintergrund 
farbe2

In c währe das dann:
"\x1B[2J" und "\x1B[<farbe1>;<farbe2>m"

Beides funktioniert nur bei manchen Compilern.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ich suche mal den Code, der lief in dieser Form nur auf manchen
> Compilern.

Frohes Suchen.
Wenn du mir nachweisen kannst, dass es tatsächlichen einen
Compiler gibt, der eine Ausgabe nicht so codiert, wie du
sie programmiert hast, geb ich ein 'virtuelles Bier' aus.
Muss allerdings Standard-C sein und das Pgm darf keine
Fehler enthalten.

Mann. Denk doch mal nach. Escape Sequenzen sind einfach
nur Text, der ausgegeben wird. Spezieller Text zwar, aber
doch einfach nur Text. Kein Compiler dieser Welt vergreift
sich an deinem Ausgabetext.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> In c währe das dann:
> "\x1B[2J" und "\x1B[<farbe1>;<farbe2>m"
>
> Beides funktioniert nur bei manchen Compilern.

Wie beweist du mir das jetzt?
Bis jetzt ist das nur eine Behauptung die ich nicht
überprüfen kann. Auf allen Compilern die ich
zur Verfügung habe, wird genau diese Sequenz
ausgegeben wenn ich das ganze in einen printf
packe und auf die serielle ausgeben lasse.


Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nochmal:

Du musst unterscheiden zwischen dem Compiler und dem
Ausgabegerät, dass letztendlich die Ausgabe macht.
Der Compiler wird den Ausgabestring auf keinen Fall
ignorieren. Das wäre ein schwerer Compilerfehler!
Allerdings kann das Ausgabegerät, auf dem die Ausgabe
erfolgt, die Escape Sequenzen ignorieren!

Ausgabegerät könnte zb auch das Konsolenfenster sein,
dass mit deiner Entwicklungsumgebung mitkommt. Je
nachdem, ob dort der ANSI.SYS aktiv ist oder nicht
(oder etwas äquivalentes) kann es schon sein, dass
dann nichts passiert.
Das hat aber nichts mit dem COMPILER zu tun! Der
Compiler übersetzt Code. Das ist seine Aufgabe und
die macht er auch. Und wenn in meinem Programm drinnen
steht, dass ich diesen oder jenen Text ausgeben möchte,
dann ist es seine verdammte Pflicht diesen Text auch
genauso an das Ausgabemedium weiterzuleiten. Was
das Ausgabemedium dann damit macht, ist nicht mehr
Sache des Compilers.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK, ihr habt recht, der Compiler gibt das nur aus, aber eben auf 
unterschiedlichen Konsolenfenstern.

Korrekt müsste es also heißen:
"Ich würde davon die Finger lassen. Das funktioniert nur bei etwa 1 von 
5 Entwicklungsumgebungen und/oder Betriebsystemen (mit den 
Standardeinstellungen)."

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde es so formulieren:

"Ich würde davon die Finger lassen. Das funktioniert nur bei
etwa 1 von 5 Ausgabemedien und erfordert, dass das Ausgabemedium
auch die ANSI-Codes versteht, was nicht immer der Fall ist."

Ausgabemedium ist nicht nur Konsolenfenster (auch wenn der
Thread damit gestartet wurde). Ausgbemedium ist auch ein externes
Terminal, ein Drucker, ein Plotter, ein LCD, etc ...)

Und in dieser Form gebe ich dir absolut recht. Selbst wenn
wir von einer DOS-Box als Ausgabemedium reden (oder einem
guten alten DOS) hängt es davon ab, ob dort der ANSI.SYS
geladen wurde oder nicht.

Letztendlich hängt es immer davon ab, ob ich mein Ausgabemedium
soweit vorschreiben bzw. dessen Konfiguration beeinflussen
kann, ob man dieses 'Risiko' eingeht oder nicht.

Autor: Benedikt K. (benedikt) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die beste Lösung die ich bisher gefunden habe ist das hier, es war für 
mich sehr hilfreich da die normale Konsole ja nichtmal die einfachsten 
Formatierunsbefehle wie die Positionierung des Cursors bietet:

http://www.c-plus-plus-archiv.de/archiv/show.ca/ti...

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt da noch eine kleine Stolperfalle, das wäre ob die File im Text 
oder im Binärmodus defaultmäßig geöffnet wird. Beim Binärmodus werden 
Escapesequenzen ignoriert. Der defaultmodus ist unterschiedlich zwischen 
Windows und Unix und z.B. bei cygwin einstellbar.
siehe:
http://sourceware.org/autobook/autobook/autobook_246.html

Autor: Hannes Albert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weiß jemand die Escape Sequenz für Enter und F4?
Vielen Dank.
lg
Hannes

Autor: Hannes Albert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tschuldige, die ASCII- Zeichen meinte ich natürlich?
lg

Autor: Thomas (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
F4 hat keinen ASCII-Code... Und Enter ist entweder 0x0A oder 0x0D

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Zweifelsfall:

Einfach mal die Verbindung herstellen, am Terminal auf
die Taste drücken und vom Programm die empfangenen Hex-Codes
ausgeben lassen.

Autor: Hannes Albert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke habs,
Wems interessiert: ENTER = ASCII 13
                   F4    = ASCII 27

lg
Hannes

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nö, das ist falsch!

ASCII 13 ist zwar CR (Carriage Return), aber ASCII 27 ist ESC (Escape).

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ASCII 27 ist "ESC".
Die Funktionstasten der Tastatur sind freibelegbar.
Das merkt man daran, dass man bspw. unter Excel damit eine Zelle 
bearbeiten kann und unter Word da scheinbar nichts passiert (ich jetzt 
nicht nachgeguckt, was da passiert).
Die PC-Tastatur liefert übrigens Scancodes. Das sind zwei Bytes.

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Das sind zwei Bytes.
Nee, sind es doch nicht. Das muß was anderes gewesen sein (Unicode?).

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein Terminalprogramm wie Hyperterminal emuliert ein echtes Terminal, wie 
beispielsweise ein VT100. Und das hat auch Funktionstasten 
F1..Firgendwas. Die senden, genauso wie die Cursortasten, beim Drücken 
eine Escape-Sequenz - also mehrere Zeichen.
Welche das sind, sollte der VT100-Dokumentation entnommen werden können.

Den Scancode der PC-Tastatur bekommt man als Nutzer eines 
Terminalprogrammes üblicherweise überhaupt nicht zu Gesicht, die sind 
hier nicht relevant.

Auch ist die Tastaturbelegung unter anderen Programmen völlig 
irrelevant, das Terminalprogramm weist den Tasten eine eigene Bedeutung 
zu.

Solche Programme wie das "Terminal"programm von Tobi oder "Bray" sind 
keine Terminalprogramme im klassischen Sinne, da sie kein Terminal 
emulieren.

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mit der Angabe, dass die Tastatur Scancodes liefert und verschiedene 
Programme die gleiche Taste unterschiedlich benutzen, wollte ich einfach 
nur aufzeigen, dass F4 eben nicht automatisch "ASCII 27" liefert.

Autor: TheMason (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
es liegt wahrscheinlich eher daran das nur das erste byte der 
übertragung nach dem drücken von F4 angezeigt wurde.
wie rufus schon sagte es sind mehrere zeichen. wenn man F1-F12 drückt 
wird man immer 27 bekommen, weil das immer das erste zeichen ist, aber 
auch nur das erste. gleiches gilt für cursor-tasten ...
eine liste findet man beim suchen/googlen nach VT100

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.