Я провел некоторое исследование по этому вопросу и обнаружил, что хотя в библиотеке Phobos для D 1.0 было именно то, что вам нужно, в виде std.c.stdio.getch()
, в D 2.0 эта функция отсутствует. Ни одна из других стандартных функций ввода в Phobos не имеет нужного вам поведения.
Насколько я понимаю, это связано с тем, что желаемое поведение (то есть получение одного символа без необходимости нажатия клавиши Enter) довольно нестандартно и должно быть реализовано относительно уродливыми, специфичными для платформы способами. (В своей первоначальной форме функция getch
существовала в языке C <conio.h>
, специфичном для DOS заголовок, который стал своего рода кросс-платформенным стандартом де-факто, несмотря на то, что он не является частью стандартной библиотеки C.) Очевидно, разработчики библиотеки времени выполнения Phobos решили убрать эту конкретную часть обратно совместимой функциональности во имя очистки библиотеку, но за счет этого функционала.
Ручное объявление
По сообщениям, вы можете обойти это отсутствующее объявление функции, добавив это в исходный файл:
extern (C) int getch();
Однако я обнаружил, что это приводит к ошибке компоновщика, предполагая, что функция была полностью удалена из библиотеки времени выполнения, а не просто удалена ее объявление из std.c.stdio
. Это, безусловно, стоит попробовать — может случиться так, что это сработает в вашей системе и компиляторе, я действительно не знаю.
Редактировать 2: похоже, что это действительно работает в Windows; это не удалось для меня на стороне Linux. Похоже, что DMD под Windows сначала ссылается на среду выполнения Phobos/D (phobos.lib), а затем на среду выполнения C (snn.lib); однако в Linux DMD ссылается на одну библиотеку времени выполнения, которая содержит обе части. Это различие, по-видимому, приводит к тому, что привязка к необъявленным функциям (среди них getch
) работает только в Windows. Если вас интересует только Windows, это решение, вероятно, подойдет. Если вам нужно больше кроссплатформенной совместимости, читайте дальше.
ругает
Другая возможность — использовать библиотеку ncurses
. Он реализует функцию getch
, которая определенно сделает то, что вы хотите, при условии, что вы круто с поиском привязок D для библиотеки или просто с использованием интерфейса C. Имейте в виду, что для этого требуется чуть больше настройки, чем просто вызов нужной функции; эта ветка содержит дополнительную информацию по этому вопросу.
D 1.0
Теперь о некоторых значительно более уродливых решениях. Использование D 1.0 позволит вам найти то, что вам нужно, в стандартной библиотеке Phobos, но это, очевидно, влечет за собой использование более старой, более жесткой версии языка, и лично я не считаю отсутствие одной консольной функции ввода-вывода в стандартной библиотеке оправданием. за использование старой версии D.
Я считаю, что Tango также потерял свою декларацию getch
(под tango.stdc.stdio
) при переходе на D 2.0, но мои знания о Tango крайне ограничены, поэтому я могу ошибаться.
Напиши это сам
Если вы полны решимости, вы можете просто написать свой собственный getch
. Мне не удалось найти кроссплатформенную реализацию getch
на C с помощью поиска Google Code, что оставляет меня пессимистичным в отношении вероятности относительно простой реализации функции из 10 строк или около того, которую можно было бы просто адаптировать к D.
С другой стороны, Уолтер Брайт — вы знаете, парень, разработавший язык D, — обеспечивает реализацию D именно такой функции здесь. Однако даже это кажется несколько устаревшим, потому что один из символов, cfmakeraw
, не определен в текущей версии компилятора DMD2. Тем не менее, это действительно близко к рабочему решению.
person
jgottula
schedule
21.03.2011
getch
из нестандартного заголовкаconio.h
делает то, что вы хотите. Однако из того, что я могу сказать, этого нет в D'sstd.c.*
. Я буду искать. - person jgottula   schedule 21.03.2011Press ENTER to continue...
и с этим покончено. :\ - person user541686   schedule 22.03.2011