10

ニューラルネットワークを使ってAIを独学しようとしています。簡単に言うと、ncurses を使用してプログラムで何が起こっているかを表示する単純なグラフィックを作成したかったのです。私が使用しているチュートリアルはこちらにあります

D は C と互換性があり、理論的には C の関数を比較的簡単に呼び出すことができるという印象を受けました。

そうではないと思います。私は比較的初心者のプログラマーなので、単純化した説明でさえ私の頭の上に少しあります。私はこれをここで見つけました。

D は、ターゲット システムの C コンパイラに快適に適合するように設計されています。D は、ターゲット環境の C ランタイム ライブラリに依存することで、独自の VM を持たないことを補っています。D への移植や、利用可能な膨大な数の C API 用の D ラッパーの作成を試みることは無意味です。それらを直接呼び出す方がはるかに簡単です。

これは、C コンパイラのデータ型、レイアウト、および関数呼び出し/戻りシーケンスを一致させることによって行われます。

それは素晴らしいと思う。私の頭の上に少し。私は簡単なCプログラムをテストして動作させました:

#include <curses.h>

int main(void) {
    int ch;

    initscr();
    noecho();
    cbreak();
    printw("Hit Ctrl+C to exit ...\n\n");
    for (;;) {
      ch = getch();
      printw("Value of char: %d (%02x)\n", ch, ch);
    }
    endwin();
    return 0;
}

SOに関する別の質問から恥知らずにコピーして貼り付けました。少なくとも私は宿題をしました。

簡単なDプログラムから基本的に同じことを試しました。このエラーが発生しました:

Error: module curses is in file 'curses.d' which cannot be read

私は本当にばかげたことをしようとしていることを絶対に確信しています。

D プログラムで ncurses を使用する簡単な方法はありますか?

睡眠ゼロ、カフェインゼロで頑張ってますのでお手柔らかにお願いします!ウェブサイトへのリンクでも大歓迎です!

私が持っているべきものをすべて含めていなかったので、AMA.

そして、私の知性を侮辱してください。

4

4 に答える 4

6

OK、このがらくたを約8時間掘り下げた後、C関数をネイティブに呼び出すことが実際に可能であると判断しました。

ただし、「利用可能な膨大な数の C API を D に移植したり、D ラッパーを作成したりすることは無意味です。それらを直接呼び出す方がはるかに簡単です。」とも述べられています。

ええ、私はそれでBSに電話するつもりです。D に移植する必要があります。マクロが有効な前処理 .h ファイルから .d ファイルに移行する場合、移植とは見なされませんか? それは間違いなく重要です。だから私の意見では、彼らは意図的に難しい部分を省き、実際よりも見栄えを良くしようとしています.

誰かが疑問に思っている場合に備えて、D コードで呼び出したい C API がある場合: ヘッダー ファイルを取得して、D が読み取れるものに変換してみてください。次に、コードをコンパイルし、新しい .d ファイルをインポートして、接続している対象とリンクするだけです。正しく行った場合、それは機能し、多くのメモリ リークが発生します。

私の意見では、ライブラリ全体が必要でない限り、頭痛の種を省き、小さな C ラッパーを D コードにリンクするだけで済みます。必要なものだけを取得し、必要なものに名前を変更できるという追加の利点があります。

ヘッダー ファイルの変換プロセスを自動化するのに役立つプロジェクトがいくつかあります。Windows のみの dtoh と、dsource にある bcd です。bcd には curses のバインディングも含まれています。それらはアルファ版のみとしてリストされていますが、機能しているようです。main.d ファイルから curses.d ファイルを呼び出そうとしていますが、次のようになっています。

main.d:13: Error: cannot implicitly convert expression ("ype any character to see it in bold\x0a") of type string to char[]
main.d:15: Error: function aphrodite.curses.printw (char*,...) is not callable using argument types (char[])
main.d:15: Error: cannot implicitly convert expression (stuff) of type char[] to char*
main.d:20: Error: function aphrodite.curses.printw (char*,...) is not callable using argument types (string)
main.d:20: Error: cannot implicitly convert expression ("F1 Key pressed") of type string to char*
main.d:26: Error: function aphrodite.curses.printw (char*,...) is not callable using argument types (string)
main.d:26: Error: cannot implicitly convert expression ("The pressed key is ") of type string to char*
main.d:28: Error: function aphrodite.curses.printw (char*,...) is not callable using argument types (string,int)
main.d:28: Error: cannot implicitly convert expression ("%c") of type string to char*

したがって、私の問題は、C が文字列を処理する方法と、D が文字列を処理する方法にあります。それらは一致せず、私の非常に限られたCの知識では、それを修正する方法を教えてくれません。幸いなことに、C 関数の呼び出しに関する反文書化のすべてについて、D 型が C 型にどのように変換されるかについての情報がかなりあります。

誰かがこれがどこかで役立つことを心から願っています。

于 2011-10-15T08:52:33.193 に答える
3

わかりました、少しスパム行為をしているように感じますが、今後すべての情報が役立つことを願っています。

プロジェクト名 ycurses を見つけました。TLS の問題は D2 に固有のものであることがわかりました。D2 で動作するようにファイルを変更しました。dmd、gdc、すべて動作します。私はついにDを使ってncursesを手に入れました!マラソンのコーディングと調査に長い週末を費やしただけです。

私が見つけたコードは古く、放棄されているように見えるので、現在githubでホストしています

コードには Tango で動作すると記載されていますが、動作しません。たぶん今週中に修正します。

コードには、素敵な小さなチュートリアルと、リンク方法の説明が含まれています。どういたしまして。いきなりとても達成感があります。

于 2011-10-16T15:14:13.127 に答える
1

わかりました、curses.d ポートはありますか? 私はそれを何と呼ぶべきかわかりません.. それはここにあります

ncurses ライブラリにリンクする必要がありますが、d1 dmd コンパイラでコンパイルすると完全に機能します。これは私の現在のプロジェクトでは役に立たないように思われるので、ファイルをd2に移植する必要があります(悪い考えではありません。このプロジェクトは長い間放棄されています)、d1コンパイルファイルをリンクする方法があるかどうかを確認します、d2 でコンパイルされたファイル、および C です。

それで、インターネットから引っ張ってきた 7 年前の日付のファイルを使用して、数日間試行錯誤を繰り返した結果、curses ライブラリを使用してコンパイルされた単純なヘルプ ワールドが完成しました。

dcurses ファイルを D2 に移植して自分でホストすることを強く検討しています...この種のことについてもっと経験があればいいのにと思います...

于 2011-10-16T12:37:21.527 に答える
-3

Python を見てみることをお勧めしますか? それが D ではなく、まったく別の言語であることは知っていますが、目的が AI を学ぶことであり、D を使用することに固執しない場合、Python は非常に優れています。これにより、D で通常行うことを 1/10 の時間で行うことができます。Python の ncurses は簡単です。テトリスのゲームを 55 行 (標準) で書いた人がいたと思います。

于 2011-11-23T00:07:36.107 に答える