如何阻止控制台 window 立即关闭 |全球定位系统

How to stop console window from closing immediately | GNAT - GPS

我有 Ada 程序 运行s 并使用 GNAT - GPS 完美编译。当我 运行 它的 exe 文件并提供用户输入时,exe 会立即关闭,而不是说 "Press any key to continue"。

我在网上搜索了很多,但我只找到了与 c/c++/visual studio console window using system('pause') 有关的信息;或 Console.Readline().

在 Ada 语言中有解决这个问题的方法吗?

与使用 Console.Readline() 的方法相同,您也可以使用 Get_Line from the package Ada.Text_IO。 在这种情况下,您必须将结果放入您不会使用的 String

除了使用 Get_LineGet,您还可以使用 Ada.Text_IO 包中的 Get_Immediate。不同之处在于 Get_LineGet 将继续读取用户输入直到 <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 中 运行 程序时,您仍然需要按回车键才能真正退出程序。

  • 这可能太详细了,但我认为 Get 仍然等待 <Enter> 被按下,因为它使用了 C 标准库中的 fgetc (libc) 底层(参见 here and here). The function fgetc reads from a C stream. C streams are initially line-buffered for interactive devices (source)。

@DeeDee 的答案更便携,只有 Ada 和更可取的方式,所以我的答案只是如果你正在寻找一种 "windows" 的方法。

我认为它有一个链接器选项,但我找不到它。一种更手动的方法是从 C 绑定 system() 命令并给它一个 "pause" 命令并将其放在程序的末尾:

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;

我知道您已经提到看到暂停,但只是想举个例子。