2008-09-19 4 views
3

J'ai lu ceci article et j'essaie de faire l'exercice en langage de programmation D, mais je rencontre un problème dans le premier exercice.Comment puis-je saisir une touche unique dans D Programming Language + Tango?

(1) Afficher les séries de nombres (1,2,3,4, 5 etc ....) dans une boucle infinie . Le programme doit quitter si quelqu'un touche une touche spécifique (Dites touche ESCAPE).

Bien sûr, la boucle infinie n'est pas un gros problème, mais le reste est. Comment est-ce que je pourrais attraper un coup clé dans D/Tango? Dans la FAQ du tango, il est dit d'utiliser la fonction C kbhit() ou get(), mais comme je le sais, elles ne sont pas dans la bibliothèque standard C et n'existent pas dans la glibc qui accompagne ma machine Linux. Je sais que je peux utiliser une bibliothèque tierce comme ncurses, mais elle a le même problème que kbhit() ou get(), ce n'est pas une bibliothèque standard en C ou D et elle n'est pas pré-installée sur Windows. Ce que j'espère, c'est que je pourrais faire cet exercice en n'utilisant que D/Tango et que je pourrais l'utiliser sur Linux et Windows.

Comment pourrais-je le faire?

Répondre

0

D a généralement tous les C stdlib disponibles (Tango ou Phobos) donc les réponses à cette question pour GNU C devraient également fonctionner dans D.

Si le tango n'a pas la fonction nécessaire, il est facile de générer les liaisons. (Jetez un coup d'œil à CPP pour passer au travers de n'importe quelle macro.)

2

kbhit ne fait en effet partie d'aucune interface C standard, mais peut être trouvé dans conio.h.

Cependant, vous devriez pouvoir utiliser getc/getchar de tango.stdc.stdio - J'ai changé la FAQ que vous mentionnez pour refléter cela.

0

Merci pour vos deux réponses.

Malheureusement, mon environnement de développement principal est Linux + GDC + Tango, donc je n'ai pas conio.h, puisque je n'utilise pas DMC comme compilateur C.

Et j'ai également trouvé à la fois getc() et getchar() sont également mis en mémoire tampon dans mon environnement de développement, donc il ne pouvait pas réaliser ce que je voudrais pouvoir faire. En fin de compte, j'ai fait cet exercice en utilisant la bibliothèque GNU ncurses. Puisque D peut directement interfacer la bibliothèque C, cela ne demande pas beaucoup d'efforts. Je viens de déclarer le prototype de fonction que j'ai utilisé dans mon programme, appelez ces fonctions et reliez mon programme directement à la bibliothèque ncurses.

Cela fonctionne parfaitement sur ma machine Linux, mais je ne comprends toujours pas comment je pourrais le faire sans une bibliothèque tierce et je pourrais encore utiliser Linux et Windows.

import tango.io.Stdout; 
import tango.core.Thread; 

// Prototype for used ncurses library function. 
extern(C) 
{ 
    void * initscr(); 
    int cbreak(); 
    int getch(); 
    int endwin(); 
    int noecho(); 
} 

// A keyboard handler to quit the program when user hit ESC key. 
void keyboardHandler() 
{ 
    initscr(); 
    cbreak(); 
    noecho(); 
    while (getch() != 27) { 
    } 
    endwin(); 
} 

// Main Program 
void main() 
{ 
    Thread handler = new Thread (&keyboardHandler); 
    handler.start(); 

    for (int i = 0; ; i++) { 
     Stdout.format ("{}\r\n", i).flush; 

     // If keyboardHandler is not ruuning, it means user hits 
     // ESC key, so we break the infinite loop. 
     if (handler.isRunning == false) { 
      break; 
     } 
    } 

    return 0; 
} 
6

Voilà comment vous le faites dans le langage de programmation D:

import std.c.stdio; 
    import std.c.linux.termios; 

    termios ostate;     /* saved tty state */ 
    termios nstate;     /* values for editor mode */ 

    // Open stdin in raw mode 
    /* Adjust output channel  */ 
    tcgetattr(1, &ostate);      /* save old state */ 
    tcgetattr(1, &nstate);      /* get base of new state */ 
    cfmakeraw(&nstate); 
    tcsetattr(1, TCSADRAIN, &nstate);  /* set mode */ 

    // Read characters in raw mode 
    c = fgetc(stdin); 

    // Close 
    tcsetattr(1, TCSADRAIN, &ostate);  // return to original mode 
Questions connexes