Forum: PC-Programmierung Escape sequenzen in C


von Hader Ernst (Gast)


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

von Wolfram (Gast)


Lesenswert?

Schau mal nach ANSI TERMINAL
erfordert natuerlich das dein Ausgabegerät auch ANSI TERMINAL kann.

von Thomas (Gast)


Lesenswert?

Es gibt keine Escapesequenzen für C, die Text farbig machen.

von Benedikt (Gast)


Lesenswert?

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

von Marko B. (Gast)


Lesenswert?


von Hannes Albert (Gast)


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

von Bartli (Gast)


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 ?

von Hannes Albert (Gast)


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.

von Benedikt K. (benedikt)


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)

von Karl heinz B. (kbucheg)


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.

von Benedikt K. (benedikt)


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.

von Karl heinz B. (kbucheg)


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.

von Karl heinz B. (kbucheg)


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.


von Karl heinz B. (kbucheg)


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.

von Benedikt K. (benedikt)


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)."

von Karl heinz B. (kbucheg)


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.

von Benedikt K. (benedikt)


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/title/conioex/author/Geri/file/CONIOEX.ZIP/?offset=0&noclass=&nolist=&sort=type&dir=up&type=

von Wolfram (Gast)


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

von Hannes Albert (Gast)


Lesenswert?

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

von Hannes Albert (Gast)


Lesenswert?

Tschuldige, die ASCII- Zeichen meinte ich natürlich?
lg

von Thomas (Gast)


Lesenswert?

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

von Karl heinz B. (kbucheg)


Lesenswert?

Im Zweifelsfall:

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

von Hannes Albert (Gast)


Lesenswert?

Danke habs,
Wems interessiert: ENTER = ASCII 13
                   F4    = ASCII 27

lg
Hannes

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Nö, das ist falsch!

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

von inoffizieller WM-Rahul (Gast)


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.

von inoffizieller WM-Rahul (Gast)


Lesenswert?


von inoffizieller WM-Rahul (Gast)


Lesenswert?

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

von Rufus Τ. F. (rufus) Benutzerseite


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.

von inoffizieller WM-Rahul (Gast)


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.

von TheMason (Gast)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.