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
: