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 |
