Programmiersprache C/C++
Language/C 2012. 3. 16. 18:10 http://www.imb-jena.de/~gmueller/kurse/c_c++/escfolge.html
Beispielfolge 6
Anwendung von ANSI-Escape-Steuerfolgen
Beispiel 1:
Realisierung einiger Funktionen zur Arbeit mit Bildschirm und Cursor - Variante 1
#include <stdio.h> #define ESC 27 void home(void) { printf("%c%s", ESC, "[1;1H"); } void cursor(unsigned zeile, unsigned spalte) { printf("%c%c%02d%c%02d%c", ESC, '[', zeile, ';', spalte, 'H'); } void store_cursor(void) { printf("%c%s", ESC, "[s"); } void reset_cursor(void) { printf("%c%s", ESC, "[u"); } void color(unsigned bg, unsigned fg) { printf("%c%c%02d%c%02d%c", ESC, '[', bg, ';', fg, 'm'); } void colour(unsigned bg, unsigned fg, unsigned fmt) { printf("%c%c%02d%c%02d%c%1d%c", ESC, '[', bg, ';', fg, ';', fmt, 'm'); } void normal() { printf("%c%s", ESC, "[0m"); } void clear(void) { printf("%c%s", ESC, "[2J"); home(); } void bell(int n) { int i; for ( i=0; i<n; i++) printf("%c", 7); } int main(void) { clear(); printf("Das ist links oben !\n"); store_cursor(); cursor(2,2); printf("2,2"); color(1,1); cursor(22,22); printf("22,22"); (void)getchar(); reset_cursor(); colour(32,40,7); printf("ENDE"); color(30,42); (void)getchar(); bell(5); normal(); return 0; }
Beispiel 2:
Realisierung einiger Funktionen zur Arbeit mit Bildschirm und Cursor - Variante 2
#include <stdio.h> void home(void) { printf("\033[1;1H"); } void cursor(unsigned zeile, unsigned spalte) { printf("\033[%02d;%02dH", zeile, spalte); } void store_cursor(void) { printf("\033[s"); } void reset_cursor(void) { printf("\033[u"); } void color(unsigned bg, unsigned fg) { printf("\033[%02d;%02dm", bg, fg); } void colour(unsigned bg, unsigned fg, unsigned fmt) { printf("\033[%02d;%02d;%1dm", bg, fg, fmt); } void normal() { printf("\033[0m"); } void clear(void) { printf("\033[2J\033[1;1H"); } void bell(int n) { int i; for ( i=0; i<n; i++) printf("\a"); } int main(void) { /* analog wie bei Variante 1 */ }Variante 2 ist im Vergleich zur Variante 1 effektiver programmiert, der Quelltext ist jedoch schwerer zu lesen.
Beispiel 3:
Realisierung einiger Makros zur Arbeit mit Bildschirm und Cursor
#include <stdio.h> #define HOME printf("\033[1;1H") #define STORE_CURSOR printf("\033[s") #define RESET_CURSOR printf("\033[u") #define NORMAL printf("\033[0m") #define CLEAR printf("\033[2J\033[1;1H") #define CURSOR(zeile,spalte) printf("\033[%02d;%02dH", zeile, spalte) #define COLOR(bg, fg) printf("\033[%02d;%02dm", bg, fg) #define COLOUR(bg, fg, fmt) printf("\033[%02d;%02d;%1dm", bg, fg, fmt) #define BELL(n) do { \ int i; \ for ( i=0; i<n; i++) \ printf("\a"); \ } \ while ( 0 ) int main(void) { CLEAR; printf("Das ist links oben !\n"); STORE_CURSOR; CURSOR(2,2); printf("2,2"); COLOR(1,1); CURSOR(22,22); printf("22,22"); (void)getchar(); RESET_CURSOR; COLOUR(32,40,7); printf("ENDE"); COLOR(30,42); (void)getchar(); BELL(5); NORMAL; return 0; }Die Anwendung von Makros anstelle von Funktionen führt noch einmal zu effektiverem Code.
Funktionen bieten jedoch einen besseren Schutz gegenüber falscher Anwendung als Makros !
Vergleich der Programmgrößen
AIX xlc AIX gcc Beispiel 1 5462 6920 2 4910 6348 3 4006 4850
'Language > C' 카테고리의 다른 글
아스키 코드 0x00 ~ 0x20 까지 (0) | 2012.04.10 |
---|---|
How to print out thread id from pthread_t (0) | 2012.04.06 |
getprocs64() (get process information on aix) (0) | 2012.03.16 |
fork, wait, waitpid, zombie(좀비) (0) | 2012.03.15 |
strerror (0) | 2012.03.14 |