Wie bekomme ich einen einzelnen Tastendruck in D2 (Phobos)?

8

Gibt es einen einfachen, plattformübergreifenden Weg, um mit Phobos einen einzigen Tastendruck in D2 zu erhalten?

Zum Beispiel eine Eingabeaufforderung "Drücken Sie eine beliebige Taste, um fortzufahren ..." oder ein Brainfuck-Interpreter.

Alle Methoden, die ich ausprobiert habe, erfordern eine Enter-Taste, bevor Sie die Eingabe übergeben (zB getchar ()).

    
bfops 21.03.2011, 00:27
quelle

2 Antworten

5

Ich habe etwas zu diesem Thema recherchiert, und ich habe herausgefunden, dass, während die Phobos-Bibliothek unter D 1.0 genau das hatte, was Sie in Form von std.c.stdio.getch() brauchen, D 2.0 diese Funktion nicht besitzt. Keine der anderen Standard-Eingabefunktionen in Phobos scheint das gewünschte Verhalten aufzuweisen.

Wie ich es verstehe, liegt das daran, dass das gewünschte Verhalten (dh das Erhalten eines einzelnen Zeichens ohne die Notwendigkeit eines Enter-Tastendrucks) eher nicht standardisiert ist und relativ hässlich, plattformspezifisch implementiert werden muss. (In seiner ursprünglichen Form existierte die Funktion getch in Cs <conio.h> , einem DOS-spezifischen Header, der ist zu einem de facto plattformübergreifenden Standard geworden, obwohl er nicht Teil der Standard-C-Bibliothek ist.) Offensichtlich entschieden sich die Betreuer der Phobos-Laufzeitbibliothek dazu, dieses spezielle Stück rückwärtskompatibler Funktionalität im Namen einer saubereren Bibliothek auszustreifen, aber auf Kosten dieser Funktionalität.

Manuelle Deklaration

Berichten zufolge Sie können diese fehlende Funktionsdeklaration umgehen, indem Sie dies Ihrer Quelldatei hinzufügen:

%Vor%

Ich habe jedoch festgestellt, dass dies zu einem Linker-Fehler führt, der darauf hindeutet, dass die Funktion vollständig aus der Laufzeitbibliothek entfernt wurde, anstatt lediglich ihre Deklaration aus std.c.stdio zu entfernen. Es ist sicherlich einen Versuch wert - es könnte passieren, dass Sie an Ihrem System und Compiler arbeiten, ich weiß es wirklich nicht.

Edit 2: Das scheint tatsächlich unter Windows zu funktionieren; es ist auf der Linux-Seite für mich gescheitert. Es scheint, dass DMD unter Windows zuerst eine Verbindung zur Phobos / D-Laufzeit (phobos.lib) herstellt, dann die C-Laufzeit (snn.lib); Unter Linux ist DMD jedoch mit einer Laufzeitbibliothek verbunden, die beide Teile bereitstellt. Dieser Unterschied scheint eine Verknüpfung zu nicht deklarierten Funktionen ( getch unter ihnen) zu verursachen, um nur unter Windows zu funktionieren. Wenn Windows die einzige Plattform ist, die Sie interessieren, ist diese Lösung wahrscheinlich geeignet. Wenn Sie mehr plattformübergreifende Kompatibilität benötigen, lesen Sie weiter.

ncurses

Eine andere Möglichkeit besteht darin, die ncurses -Bibliothek zu verwenden. Es implementiert eine getch Funktion, die auf jeden Fall das macht, was Sie wollen - sofern Sie mit der Suche nach D cool sind Bindungen für die Bibliothek oder nur über die C-Schnittstelle. Beachten Sie, dass es ein wenig mehr Setup erfordert, als nur die gewünschte Funktion aufzurufen; Dieser Thread enthält weitere Informationen zu diesem Thema.

D 1.0

Nun, für einige wesentlich hässlichere Lösungen. Die Verwendung von D 1.0 würde Ihnen ermöglichen, das zu finden, was Sie in der Phobos-Standardbibliothek benötigen - aber dies beinhaltet natürlich die Verwendung der älteren, krustigeren Version der Sprache, und ich persönlich finde das Fehlen einer Konsolen-IO-Funktion in der Standardbibliothek nicht gerechtfertigt für die Verwendung der alten Version von D.

Ich glaube, dass Tango auch seine getch -Deklaration (unter tango.stdc.stdio ) über den Wechsel zu D 2.0 verloren hat, aber meine Kenntnisse über Tango sind extrem begrenzt, also kann ich mich irren.

Schreibe es selbst

Wenn Sie entschlossen sind, könnten Sie einfach Ihre eigene getch schreiben. Ich konnte mithilfe der Google-Codesuche keine plattformübergreifende C-Implementierung von getch finden, was mich pessimistisch macht über die Wahrscheinlichkeit einer relativ einfachen 10-Zeilen-oder-so-Funktion Implementierung, die einfach an D angepasst werden könnte.

Auf der anderen Seite, Walter Bright - wissen Sie, der Typ, der die D-Sprache entworfen hat - bietet eine D-Implementierung genau dieser Art von Funktion hier . Dies scheint jedoch etwas veraltet zu sein, da eines der Symbole, cfmakeraw , unter der aktuellen Version des DMD2-Compilers nicht definiert ist. Es ist jedoch sehr nahe daran, eine praktikable Lösung zu sein.

    
jgottula 21.03.2011, 21:31
quelle
5

Die einfachste Lösung, die mit D2 unter Windows funktioniert:

%Vor%

Es könnte sogar mit D1 funktionieren, aber ich habe es nicht ausprobiert.

Hier ist eine Linux-Version, modifiziert von Walters Post :

%Vor%     
Andrej Mitrović 21.03.2011 21:40
quelle

Tags und Links