2008-09-19 4 views
3

Я прочитал это article и попытаюсь выполнить упражнение на языке программирования D, но столкнулся с проблемой в первом упражнении.Как я могу захватить одиночный ключ в D Language Language + Tango?

(1) Показать ряд чисел (1,2,3,4, 5 .... и т.д.) в бесконечном цикле . Программа должна выйти, если кто-то попадает на определенный ключ (скажите ключ ESCAPE).

Конечно, бесконечный цикл не является большой проблемой, но остальное. Как я мог захватить ключевой удар в D/Tango? В FAQ по танго он говорит, что использует функцию C kbhit() или get(), но, как я знаю, они не находятся в стандартной библиотеке C и не существуют в glibc, которые поставляются с моей машиной Linux, которую я использую для программирования.

Я знаю, что могу использовать некоторую стороннюю библиотеку, такую ​​как ncurses, но у нее такая же проблема, как kbhit() или get(), это не стандартная библиотека на C или D, а не предустановленная в Windows. Я надеюсь, что я мог бы выполнить это упражнение, используя только D/Tango и мог бы запускать его как на Linux, так и на Windows.

Как я мог это сделать?

ответ

0

D обычно имеет все доступные C stdlib (Tango или Phobos), поэтому ответы на этот вопрос для GNU C также должны работать в D.

Если у танго нет необходимой функции, создание привязок очень просто. (Взгляните на CPP, чтобы разрезать любой макрос.)

2

kbhit действительно не является частью каких-либо стандартных интерфейсов C, но может быть найден в conio.h.

Однако вы можете использовать getc/getchar из tango.stdc.stdio - я изменил часто задаваемые вопросы, которые вы упомянули, чтобы отразить это.

0

Спасибо за оба ваших ответа.

К сожалению, моя основная среда разработки - Linux + GDC + Tango, поэтому у меня нет conio.h, так как я не использую DMC как мой компилятор C.

И я также обнаружил, что getc() и getchar() также привязаны к строке в моей среде разработки, поэтому он не мог достичь того, чего я хотел бы сделать.

В конце концов, я сделал это упражнение, используя библиотеку GNU ncurses. Поскольку D может напрямую взаимодействовать с библиотекой C, так что это не требует больших усилий. Я просто объявляю прототип функции, который использовал в своей программе, вызываю эту функцию и напрямую связываю свою программу с библиотекой ncurses.

Он отлично работает на моей машине Linux, но я до сих пор не понимаю, как я мог это сделать без какой-либо сторонней библиотеки и мог работать как в Linux, так и в 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

Вот как вы это делаете на языке программирования 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