Escape sequenzen in C

Gast #424990
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
#425032
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)
#425035
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.
#425050
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.
#425057
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.
#425068
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.

#425070
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.
#425076
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)."
#425086
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.
Gast #425624
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.
Persönliche Seite #425631
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.
Gast #425635
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.
Gast #426578
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren