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

时间:2019-05-28 17:45:22

标签: ada gnat-gps

我有Ada程序,可以使用GNAT-GPS完美运行和编译。当我运行其exe文件并提供用户输入时,而不是说“按任意键继续”,该exe将立即关闭。

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

在Ada lanaguage中有什么办法解决这个问题吗?

3 个答案:

答案 0 :(得分:4)

除了使用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引擎盖(请参见herehere)。函数fgetc从C流中读取。 C流最初是为交互设备(source)行缓冲的。

答案 1 :(得分:3)

@DeeDee的答案更具可移植性,只有Ada才是可取的方式,所以我的答案就是您正在寻找一种“ Windows”方式来实现它。

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

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;

我知道您已经提到过有关暂停的信息,但只是想举一个例子。

答案 2 :(得分:1)

使用Console.Readline()的方式相同,可以使用软件包Get_Line中的Ada.Text_IO。 在这种情况下,您必须将结果放入不会使用的String中。