【问题标题】:How to run two procedures in ada如何在ada中运行两个程序
【发布时间】:2017-03-25 11:16:08
【问题描述】:

我有一个具有主程序的 ada 程序,现在我想添加另一个程序,但我收到一条错误消息,提示“预期文件结束,文件只能有一个编译单元”。我做了一些我认为这是因为每个文件只能有 1 个程序。我是否必须创建另一个文件并将程序单独放在其中?如果是这样,我将如何编译这两个代码并运行它?有人可以告诉我如何编译两者并一起运行整个文件。

【问题讨论】:

  • Simon 的评论很受欢迎。但是,如果一个过程调用另一个,您可以简单地将另一个声明为第一个本地的(即在其声明区域中)
  • 声明语法是什么样的?我需要给文件命名吗?
  • “我将如何编译这两个代码并运行它”这个问题的答案取决于您使用的编译器。我假设您使用的是 GNAT,但如果没有,请告诉我们您使用的是什么编译器。

标签: ada


【解决方案1】:

正如编译器所说,每个文件只能有一个编译单元。主程序是编译单元,是一个过程。

如果你想让一个程序运行两个都是编译单元的程序,你什么时候可以这样做:

with One_Procedure,
     Another_Procedure;
procedure Sequential is
begin
   One_Procedure;
   Another_Procedure;
end Sequential;

如果你想并行运行这两个过程,请这样做:

with One_Procedure,
     Another_Procedure;
procedure Parallel is
   task One;
   task Another;

   task body One is
   begin
      One_Procedure;
   end One;

   task body Another is
   begin
      Another_Procedure;
   end Another;
begin
   null;
end Parallel;

程序当然也可以在主程序的声明区域或某些包中声明。

【讨论】:

  • 请注意,“每个文件只有一个编译单元”不是 Ada 规则。这是一个 GNAT 限制。并不是所有的 Ada 编译器都有这个限制。
【解决方案2】:

最近的 GNAT 和 GPRbuild 都有用于指示要编译文件的哪些单元的选项:-gnateINNN 表示 gcc-eInn 表示 gprbuild,如 documented here

另一个选择是熟悉gnatchop 用于从文件中提取编译单元,以及-m 用于最小化重新编译;后者避免了仅仅因为运行gnatchop 而编译世界时编辑没有“语义”触及文件中的所有编译单元。然后 GNAT 会忽略时间戳。我有时会运行类似的命令

gnatchop -r -w -c allofit.ada && gnatmake -Ptest -m someunit.adb

其中someunit.adb是为文件allofit.ada中包含的编译单元Someunit(一个过程,一个包)生成的。

【讨论】:

    【解决方案3】:

    您可以有 1 个主程序,但主程序中有多个程序。

    procedure main is
        ...text...
    
        procedure sub1 () is
        begin
            ...text...
        end sub1;
    
        procedure sub2 () is
        begin
            ...text...
        end sub2;
    
        ...text...
    end main;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 2013-08-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多