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

Ada 如何阻止控制台窗口立即关闭| GNAT-GPS,ada,gnat-gps,Ada,Gnat Gps,我有一个Ada程序,它可以使用GNAT-GPS完美地运行和编译。当我运行其exe文件并提供用户输入时,exe立即关闭,而不是说“按任意键继续” 我在网上搜索了很多,但我只找到了与c/c++/VisualStudio控制台窗口相关的信息,使用system('pause');或Console.Readline() 在Ada Language中有什么方法可以解决这个问题吗?与您可以使用Console.Readline()的方法相同,您可以从软件包中使用。 在这种情况下,您必须将结果放入一个不使用的字符

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

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


在Ada Language中有什么方法可以解决这个问题吗?

与您可以使用Console.Readline()的方法相同,您可以从软件包中使用。
在这种情况下,您必须将结果放入一个不使用的
字符串中。

除了使用
Get\u Line
Get
,您还可以从包中使用
Get\u Immediate
。不同之处在于,
Get_Line
Get
将继续读取用户输入,直到点击
,而
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
    仍在等待按下
    ,因为它在引擎盖下使用了C标准库(libc)中的
    fgetc
    (请参阅和)。函数
    fgetc
    从C流读取数据。C流最初是为交互设备进行行缓冲的()


    • 来自@DeeDee的答案更具可移植性,只有Ada和更可取的方式,因此我的答案是,如果您正在寻找一种“windows”方式来实现这一点

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

      带有Ada.Text\u IO;使用Ada.Text\u IO;
      使用接口C.string;
      主要程序是
      函数系统(Str:Interfaces.c.strings.chars_ptr)返回Interfaces.c.int
      进口,,
      约定=>C,
      外部名称=>“系统”;
      程序暂停为
      命令:Interfaces.c.Strings.chars\u ptr
      :=Interfaces.C.Strings.New_字符串(“暂停”);
      结果:Interfaces.C.int
      :=系统(命令);
      开始
      接口.C.Strings.Free(命令);
      结束暂停;
      开始
      放线(“你好世界”);
      暂停;
      端干管;
      

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

      效果非常好!非常感谢。