使用D编程语言修复api

我正在尝试使用神经网络教自己AI。 简而言之,我想创建一个简单的图形,使用ncurses显示我的程序中发生的事情。 我正在使用的教程可以在这里找到。

我的印象是D与C兼容,理论上我可以相对容易地调用C函数。

我发现事实并非如此。 我是一个相对新手的程序员,所以即使是简单的解释也有点高于我的头脑。 我在这里找到了这个。

D旨在与目标系统的C编译器舒适地配合。 D通过依赖目标环境的C运行时库来弥补没有自己的VM。 尝试移植到D或为大量可用的C API编写D包装器将是毫无意义的。 直接调用它们要容易多少。

这是通过匹配C编译器的数据类型,布局和函数调用/返回序列来完成的。

听起来很棒。 有点过头了。 我测试了一个简单的C程序:

#include  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。

随意侮辱我的智慧。

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

然而,它还声称“尝试移植到D或为大量可用的C API写D包装将是毫无意义的。直接调用它们要容易得多。”

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

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

在我看来,除非你需要整个库,否则要省去头疼,只需将一个小的C包装器链接到你的D代码即可。 你只抓住你需要的东西,你还可以将东西重命名成你想要的东西。

有几个项目可以帮助自动化翻译头文件的过程。 dtoh仅适用于Windows,而bcd位于dsource上。 bcd还包括对curses的绑定! 它们被列为仅限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类型的信息。

我真诚地希望有人在某个地方找到这个有用的东西。

好吧,我觉得我有点垃圾邮件,但我希望将来所有信息都有用。

我找到了一个项目名称ycurses。 我发现TLS的问题特定于D2。 我更改了文件以使用D2。 dmd,gdc,一切正常。 我终于使用D了我的ncurses! 这花了很长时间的马拉松编码和研究周末。

由于我发现的代码很旧并且似乎被放弃了,我现在在github上托管它

即使代码声明它可以与Tango一起使用,但它不会。 我本周可能会解决这个问题。

代码包含一个很好的小教程,以及如何链接的说明。 别客气。 我突然觉得很有成就感。

好的,有一个curses.d端口? 我不知道该怎么称呼..它就在这里 。

它仍然需要您链接到ncurses库,但如果使用d1 dmd编译器进行编译,它仍然可以正常工作。 在我目前的项目中似乎有点无用,所以我要么将文件移植到d2(不是一个坏主意,这个项目早已被废弃)或者看看是否有办法链接d1编译文件,d2编译文件和C.这在我看来是直截了当的,但我也认为链接到C将是直截了当的。

所以几天之后,大多数是使用7年前从互联网上获取的文件的试错样式测试,我终于得到了一个使用curses库编译的简单的hellp世界。

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

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