3

この記事を読んで D プログラミング言語で演習を行ってみましたが、最初の演習で問題が発生しました。

(1) 一連の数字 (1、2、3、4、5....など) を無限ループで表示します。誰かが特定のキー (ESCAPE キーと言う) を押すと、プログラムは終了します。

もちろん、無限ループは大きな問題ではありませんが、残りは問題です。D/Tango でキー ヒットを取得するにはどうすればよいですか? tango FAQ では、C 関数 kbhit() または get() を使用すると書かれていますが、私が知っているように、これらは C 標準ライブラリにはなく、プログラミングに使用する Linux マシンに付属する glibc には存在しません。

ncursesのようなサードパーティのライブラリを使用できることはわかっていますが、kbhit() または get() と同じ問題があり、C または D の標準ライブラリではなく、Windows にプリインストールされていません。私が望んでいるのは、D/Tango だけを使用してこの演習を実行でき、Linux と Windows マシンの両方で実行できることです。

どうすればできますか?

4

5 に答える 5

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
于 2008-11-04T11:30:58.317 に答える
2

kbhit は実際には標準 C インターフェースの一部ではありませんが、conio.h で見つけることができます。

ただし、tango.stdc.stdio から getc/getchar を使用できるはずです。これを反映するために、言及した FAQ を変更しました。

于 2008-09-19T06:34:12.873 に答える
0

通常、D ではすべての C stdlib (Tango または Phobos) が利用可能であるため、GNU C に関するこの質問への回答は D でも機能するはずです。

tango に必要な機能がない場合、バインディングの生成は簡単です。(CPP を見て、マクロジャンクを切り抜けてください。)

于 2008-09-19T04:15:56.917 に答える
0

お二方ともお返事ありがとうございます。

残念ながら、私のメインの開発環境は Linux + GDC + Tango で、C コンパイラとして DMC を使用していないため、conio.h はありません。

また、私の開発環境では 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;
}
于 2008-09-19T08:02:51.990 に答える
0

Lars が指摘したように、conio.h で定義され、(私が信じている) msvcrt for Windows に実装されている _kbhit と _getch を使用できます。_kbhit と _getch を使用するための C++ コードを含む記事を次に示します。

于 2009-04-01T13:43:54.533 に答える