如何防止控制台窗口立即关闭 | GNAT - GPS

4

我有一个Ada程序,使用GNAT - GPS编译和运行都非常完美。但是当我运行exe文件并提供用户输入时,它不会显示“按任意键继续”的提示,而是立即关闭。

我在网上搜索了很多,但是只找到了与c / c ++ / visual studio控制台窗口相关的信息,使用system('pause'); OR Console.Readline()。

在Ada语言中是否有其他解决方法?

3个回答

6
除了使用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内部运行程序时,仍然需要按Enter键才能退出程序。

  • 这可能是太多细节了,但我认为Get仍然等待按下<Enter>,因为它在底层使用C标准库(libc)的fgetc函数(见这里这里)。函数fgetc从C流中读取。对于交互设备,C流最初是带行缓冲区的(来源)。


工作得非常好!谢谢! - John Bravo

3

@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;

我知道你已经提到了关于暂停的事情,但是我想展示一个例子。


1
与使用 Console.Readline() 相同,您可以使用 Get_Line 来自 Ada.Text_IO 包。 在这种情况下,您将不得不将结果放入一个您不会使用的 String 中。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接