ncurses api с языком программирования D - PullRequest
9 голосов
/ 15 октября 2011

Я пытаюсь научить себя искусственному интеллекту, используя нейронные сети.Короче говоря, я хотел создать простую графику, которая отображала бы то, что происходит в моей программе, используя ncurses.Учебник, который я использую, находится здесь .

. У меня сложилось впечатление, что D совместим с C, и я теоретически могу вызывать функции C относительно легко.

Iнайти, что это не так.Я относительно начинающий программист, поэтому даже упрощенные объяснения немного выше моей головы.Я обнаружил, что здесь .

D предназначен для комфортного размещения с компилятором C для целевой системы.D восполняет отсутствие собственной виртуальной машины, полагаясь на библиотеку времени выполнения C целевой среды.Было бы бессмысленно пытаться портировать на D или писать D-оболочки для огромного массива доступных C-API.Насколько проще просто вызывать их напрямую.

Это делается путем сопоставления типов данных компоновки 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

Я абсолютно уверен, что пытаюсь сделать что-то действительно глупое.

Есть ли простой способ использовать ncurses в D-программе?

Я бегаю без сна и кофеина, поэтому, пожалуйста, будьте осторожны!Буду очень признателен даже за ссылку на веб-сайт!

Я, вероятно, не включил все, что у меня должно быть, поэтому AMA.

И не стесняйтесь оскорблять мой интеллект.

Ответы [ 4 ]

5 голосов
/ 15 октября 2011

Хорошо, после примерно 8 часов копания в этом дерьме я определил, что действительно можно вызывать функции Си изначально.

ОДНАКО, также утверждается, что «было бы бессмысленно пытаться портировать на D или писать оболочки D для огромного множества доступных API C. Насколько проще просто вызывать их напрямую».

Да, я собираюсь позвонить Б.С. Вам НЕОБХОДИМО портировать на D. Разве это не считается портированием, когда вы переходите от макроподключенной предварительной обработки файла .h к. Это определенно нетривиально. Поэтому, по моему мнению, они намеренно упускают сложную часть и стараются, чтобы она выглядела лучше, чем есть на самом деле.

В случае, если кому-то интересно, если у вас есть C api, который вы хотели бы вызвать в своем D-коде: перейдите к файлу заголовка и попытайтесь преобразовать его во что-то, что D может прочитать. Затем просто скомпилируйте свой код, импортируйте новый файл .d и свяжите его с тем, с чем вы взаимодействуете. Если вы все сделали правильно, это сработает, и у вас будет много утечек памяти.

По моему мнению, если вам не нужна вся библиотека, избавьте себя от головной боли и просто привяжите небольшую оболочку C к вашему D-коду. Вы берете только то, что вам нужно, и у вас есть дополнительное преимущество, заключающееся в возможности переименовывать вещи в любое, что вы хотите.

Существует несколько проектов, которые помогут автоматизировать процесс перевода заголовочных файлов. dtoh только для windows и bcd, который находится на dsource. BCD также включает в себя привязки для проклятий! они перечислены только как альфа, но они, кажется, работают. Я пытаюсь вызвать их файл curses.d из моего файла main.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.

Я искренне надеюсь, что кто-то найдет это полезным где-то внизу.

3 голосов
/ 16 октября 2011

Хорошо, я чувствую, что спам немного, но надеюсь, что вся информация будет полезна в будущем.

Я нашел название проекта ycurses.Я обнаружил, что проблема с TLS специфична для D2.Я изменил файлы для работы с D2.DMD, GDC, все это работает.У меня наконец есть мои ncurses, использующие D!Потребовались долгие выходные на марафонское кодирование и исследования.

Поскольку код, который я нашел, устарел и, похоже, заброшен, я теперь размещаю его на github

Хотя в коде говорится, что он будет работать с Tango, ЭТО НЕ БУДЕТ.Возможно, я исправлю это на этой неделе.

В коде есть хороший небольшой учебник, а также инструкция о том, как сделать ссылку.Пожалуйста.Я чувствую себя очень совершенным внезапно.

1 голос
/ 16 октября 2011

Хорошо, есть порт curses.d?Я не знаю, как это назвать .. Он расположен здесь .

Все еще требуется, чтобы вы связались с библиотекой ncurses, но она прекрасно работает, если вы скомпилируете с d1 dmdкомпилятор.что кажется бесполезным в моем текущем проекте, поэтому мне нужно либо портировать файлы на d2 (неплохая идея, этот проект давно заброшен), либо посмотреть, есть ли способ связать файлы, скомпилированные d1, d2 скомпилированные файлы и C. Это может показаться простым, но я также подумал, что связать с C было бы просто.

Так что после нескольких дней и в основном тестов методом проб и ошибок с использованием файловдатированный 7 лет назад, извлеченный из интернета, я наконец-то получил простой адский мир, скомпилированный с использованием библиотеки curses.

Я настоятельно рекомендую перенести файлы dcurses на D2 и разместить их самостоятельно ... Я просто хотел бы иметьбольше опыта с этим типом вещи ...

0 голосов
/ 23 ноября 2011

Могу ли я предложить посмотреть на Python? Я знаю, что это не D и это совершенно другой язык, но если ваша цель - изучить ИИ и не настаивать на использовании D, тогда Python очень хорош. Это позволит вам делать то, что вы обычно делаете в D в 1/10 времени. ncurses в Python это легко. Я думаю, что был какой-то парень, который написал игру в тетрис примерно в 55 строк (что является стандартным).

...