c linker d ncurses gdc

ncurses api con el lenguaje de programación D



linker gdc (4)

De acuerdo, creo que he estado enviando correos no deseados un poco, pero espero que toda la información sea útil en el futuro.

Encontré un nombre de proyecto ycurses. Descubrí que el problema con TLS es específico de D2. Cambié los archivos para trabajar con D2. dmd, gdc, todo funciona. ¡Finalmente tengo mi ncurses usando D! Simplemente tomó un largo fin de semana de codificación e investigación de maratón.

Como el código que encontré es antiguo y parece estar abandonado, ahora lo estoy alojando en github

Aunque el código indica que funcionará con Tango, NO LO HARÁ. Probablemente lo arregle un poco esta semana.

El código tiene un pequeño y agradable tutorial incluido, así como instrucciones sobre cómo vincularlo. De nada. Me siento muy logrado de repente.

Estoy tratando de enseñarme a mí mismo a usar redes neuronales. Para resumir, quería crear un gráfico simple que mostrara lo que está sucediendo en mi programa usando ncurses. El tutorial que estoy usando se encuentra aquí .

Tenía la impresión de que D era compatible con C y, teóricamente, podía llamar funciones C con relativa facilidad.

Encuentro que no es el caso. Soy un programador relativamente novato, por lo que incluso las explicaciones simplistas están un poco por encima de mi cabeza. Encontré esto aquí .

D está diseñado para encajar cómodamente con un compilador de C para el sistema de destino. D compensa por no tener su propia máquina virtual al confiar en la biblioteca de tiempo de ejecución de C del entorno de destino. No tendría sentido intentar exportar D o escribir D wrappers para la gran variedad de API C disponibles. Cuánto más fácil es simplemente llamarlos directamente.

Esto se hace coincidiendo con los tipos de datos del compilador C, los diseños y las secuencias de llamada / retorno de función.

Eso suena maravilloso. Un poco sobre mi cabeza Probé y obtuve un simple programa de C trabajando:

#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; }

descaradamente copiado y pegado de otra pregunta en SO. Al menos hice mi tarea.

Intenté básicamente lo mismo con un simple programa D. Tengo este error:

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

Estoy absolutamente seguro de que estoy intentando algo realmente estúpido.

¿Hay alguna manera fácil de usar ncurses en un programa D?

Me estoy quedando sin sueño y con cafeína, así que por favor sean amables. ¡Incluso un enlace a un sitio web sería muy apreciado!

Probablemente no incluí todo lo que debería tener, entonces AMA.

Y no dude en insultar mi inteligencia.


Ok, después de aproximadamente 8 horas de excavar a través de esta basura, he determinado que, de hecho, es posible llamar a las funciones C de forma nativa.

SIN EMBARGO, también se afirma que "Sería absurdo tratar de portar D o escribir envoltorios D para la gran variedad de API C disponibles. Cuánto más fácil es simplemente llamarlos directamente".

Sí, voy a llamar a BS en eso. DEBE portar a D. ¿No se considera portar cuando se va de un archivo .h de preprocesamiento macro habilitado a un archivo .d? Definitivamente no es trivial. Entonces, en mi opinión, están dejando de lado intencionadamente la parte difícil e intentando que se vea mucho mejor de lo que realmente es.

En caso de que alguien se pregunte, si tiene una api C a la que desea llamar en su código D: vaya a buscar el archivo de encabezado e intente convertirlo en algo que D pueda leer. Luego, simplemente compila tu código, importa tu nuevo archivo .d y vincúlalo con lo que sea que estés interactuando. Si lo hiciste bien, funcionará y ahora tendrás muchas pérdidas de memoria.

En mi opinión, a menos que necesites toda la biblioteca, ahórrate un dolor de cabeza y simplemente vincula un pequeño envoltorio de C con tu código D. Agarras solo lo que necesitas, y tienes el beneficio adicional de poder cambiar el nombre de las cosas a lo que quieras.

Hay un par de proyectos para ayudar a automatizar el proceso de traducción de archivos de encabezado. dtoh solo para Windows y bcd que se encuentra en dsource. ¡bcd también incluye enlaces para maldiciones! se enumeran como alfa solamente, pero parecen estar trabajando. Intento llamar a su archivo curses.d desde mi archivo main.d y he estado recibiendo:

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*

así que mi problema radica en la forma en que C maneja las cadenas y la manera en que D maneja las cadenas. No coinciden y mi conocimiento extremadamente limitado de C no me dice cómo solucionarlo. Afortunadamente, para toda la anti-documentación sobre llamar a las funciones C, hay bastante información acerca de cómo los tipos D se traducen en tipos C.

Sinceramente espero que alguien encuentre esto útil en algún momento.


Ok, hay un puerto curses.d? No sé cómo llamarlo ... Está ubicado aquí .

Todavía requiere que establezca un vínculo con la biblioteca ncurses, pero funciona perfectamente si compila con el compilador d1 dmd. que parece ser un poco inútil en mi proyecto actual, así que tengo que portar los archivos a d2 (no es una mala idea, este proyecto ha sido abandonado desde hace mucho tiempo) o ver si hay una forma de vincular los archivos d1 compila , d2 compiló archivos y C. Esto me parece sencillo, pero también pensé que vincularlo a C sería sencillo.

Así que después de unos días y la mayoría de las pruebas de estilo de prueba y error que utilizan archivos de hace 7 años sacados de internet, finalmente obtuve un simple mundo infernal compilado usando la biblioteca de curses.

Estoy considerando seriamente portar los archivos dcurses a D2 y alojarlos yo mismo ... Solo desearía tener más experiencia con este tipo de cosas ...


¿Puedo sugerir echar un vistazo a Python? Sé que no es D y es un idioma completamente diferente, pero si su objetivo es aprender IA y no insiste en usar D, Python es muy bueno. Le permitirá hacer lo que normalmente hace en D en 1/10 del tiempo. ncurses en Python es una facilidad. Creo que hubo un tipo que escribió un juego de tetris en aproximadamente 55 líneas (que es estándar).