使用D编程语言来修复api

时间:2011-10-14 22:47:35

标签: c linker d ncurses gdc

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

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

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

  

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 个答案:

答案 0 :(得分:5)

好的,经过大约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类型的信息。

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

答案 1 :(得分:3)

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

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

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

即使代码声明它可以与Tango一起使用,但它不会。 我可能会在本周修复一段时间。

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

答案 2 :(得分:1)

好的,有一个curses.d端口?我不知道该怎么称呼它.. 它位于here

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

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

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

答案 3 :(得分:-3)

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