Как остановить закрытие окна консоли сразу |GNAT - GPS - PullRequest
3 голосов
/ 28 мая 2019

У меня есть программа Ada, которая отлично работает и компилируется с использованием GNAT - GPS. Когда я запускаю его исполняемый файл и предоставляю пользовательский ввод, вместо того чтобы сказать «Нажмите любую клавишу для продолжения», исполняемый файл немедленно закрывается.

Я много раз искал его в Интернете, но нашел только информацию, относящуюся к окну консоли c / c ++ / visual studio, используя system ('pause'); ИЛИ Console.Readline ().

Есть ли способ обойти это в Ada lanaguage?

Ответы [ 3 ]

5 голосов
/ 28 мая 2019

Помимо использования Get_Line или Get, вы также можете использовать Get_Immediate из пакета Ada.Text_IO. Разница в том, что Get_Line и Get будут продолжать читать пользовательский ввод, пока не будет нажата <Enter>, а Get_Immediate будет блокироваться только до тех пор, пока не будет нажата одна клавиша, когда стандартный ввод подключен к интерактивному устройству (например, клавиатура).

Вот пример:

with Ada.Text_IO; use Ada.Text_IO;

procedure Main is
begin

   --  Do some interesting stuff here...   

   declare
      User_Response : Character;
   begin
      Put_Line ("Press any key to continue...");
      Get_Immediate (User_Response);
   end;

end Main;

ПРИМЕЧАНИЯ

  • Вы должны запустить программу в интерактивном терминале (Bash, PowerShell и т. Д.), Чтобы реально увидеть эффект Get_Immediate. Когда вы запускаете программу из GPS, вам все равно нужно нажать Enter для фактического выхода из программы.

  • Это может быть слишком много деталей, но я думаю, что Get все еще ждет нажатия <Enter>, потому что он использует fgetc из стандартной библиотеки C (libc) под капотом (см. * 1030) * здесь и здесь ). Функция fgetc читает из потока C. Первоначально C-потоки буферизуются для интерактивных устройств ( source ).

3 голосов
/ 29 мая 2019

Ответ от @DeeDee более переносим и предпочтителен только Ada, поэтому мой ответ - просто если вы ищете способ «Windows» сделать это.

Я думаю, что есть опция компоновщика, но я не смог ее найти. Более ручным способом является привязка команды system () из C и назначение ей команды «пауза» и ее размещение в конце вашей программы:

with Ada.Text_IO; use Ada.Text_IO;
with Interfaces.C.Strings;

procedure Main is

   function System(Str : Interfaces.c.strings.chars_ptr) return Interfaces.C.int
      with Import,
      Convention => C,
      External_Name => "system";

   procedure Pause is
      Command : Interfaces.c.Strings.chars_ptr
         := Interfaces.C.Strings.New_String("pause");
      Result  : Interfaces.C.int
         := System(Command);
   begin
      Interfaces.C.Strings.Free(Command);
   end Pause;

begin
   Put_Line("Hello World");
   Pause;
end Main;

Я знаю, что вы уже упоминали о паузе, но просто хотели показать пример.

1 голос
/ 28 мая 2019

Так же, как вы могли бы использовать Console.Readline(), вы можете использовать Get_Line из пакета Ada.Text_IO .В этом случае вам нужно будет поместить результат в String, который вы не будете использовать.

...