10

我正在尝试使用神经网络自学人工智能。长话短说,我想创建一个简单的图形,使用 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

好的,经过大约 8 个小时的挖掘,我已经确定确实可以本地调用 C 函数。

但是,也有人说“尝试移植到 D 或为大量可用的 C API 编写 D 包装器是毫无意义的。直接调用它们要容易得多。”

是的,我要打电话给BS。您必须移植到 D。当您从启用宏的预处理 .h 文件转到 .d 文件时,是否不考虑移植?这绝对是不平凡的。所以在我看来,他们故意忽略了困难的部分,并试图让它看起来比实际更好。

如果有人想知道,如果你有一个 C api,你想在你的 D 代码中调用:去获取头文件并尝试将它转换为 D 可以读取的东西。然后只需编译您的代码,导入您的新 .d 文件,并将它与您正在与之交互的任何内容链接。如果你做对了,它会起作用,你现在会有很多内存泄漏。

在我看来,除非您需要整个库,否则只需将一个小型 C 包装器链接到您的 D 代码即可。您只获取您需要的内容,并且您还可以将内容重命名为您想要的任何内容。

有几个项目可以帮助自动翻译头文件的过程。dtoh 仅适用于 Windows,bcd 可在 dsource 上找到。bcd 还包括诅咒绑定!它们仅被列为 alpha,但它们似乎正在工作。我试图从我的 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。这在我看来是直截了当的,但我也认为链接到 C 将是直截了当的。

因此,在使用从互联网上提取的 7 年前的文件进行了几天的反复试验后,我终于得到了一个使用 curses 库编译的简单的 hellp 世界。

我正在强烈考虑将 dcurses 文件移植到 D2 并自己托管它们......我只是希望我对这类事情有更多的经验......

于 2011-10-16T12:37:21.527 回答
-3

我可以建议看看 Python 吗?我知道它不是 D 并且是一种完全不同的语言,但是如果您的目标是学习 AI 并且不坚持使用 D,那么 Python 非常好。它将允许您在 1/10 的时间内完成通常在 D 中所做的事情。Python 中的 ncurses 很容易。我认为有人用大约 55 行(这是标准的)编写了俄罗斯方块游戏。

于 2011-11-23T00:07:36.107 回答