如何在ada中运行两个过程

如何在ada中运行两个过程,ada,Ada,我有一个ada程序,它有一个主程序,现在我想添加另一个程序,但我得到一个错误,说应该是文件结尾,文件只能有一个编译单元。我做了一些检查,我想这是因为每个文件只能有一个过程。我是否必须创建另一个文件并将过程单独放在其中?如果是这样,我将如何编译这两个代码并运行它?有人能告诉我如何编译这两个文件并一起运行整个文件吗 正如编译器所说,每个文件只能有一个编译单元。主程序是编译单元,它是一个过程 procedure main is ...text... procedure sub1 ()

我有一个ada程序,它有一个主程序,现在我想添加另一个程序,但我得到一个错误,说应该是文件结尾,文件只能有一个编译单元。我做了一些检查,我想这是因为每个文件只能有一个过程。我是否必须创建另一个文件并将过程单独放在其中?如果是这样,我将如何编译这两个代码并运行它?有人能告诉我如何编译这两个文件并一起运行整个文件吗

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

procedure main is
    ...text...

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

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

    ...text...
end main;
如果希望一个程序运行两个都是编译单元的过程,可以这样做:

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;
如果要并行运行这两个过程,请执行以下操作:

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;

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

最近的gnat和GPRbuild都有选项来指示要编译的文件单元:gcc为-gnateinn,GPRbuild为-eInn,如图所示

另一个选择是熟悉gnatchop以从文件中提取编译单元,熟悉-m以最小化重新编译;后者可以防止仅因为在编辑未在语义上触及文件中的所有编译单元时运行gnatchop而不得不编译世界。然后,GNAT忽略时间戳。我有时运行命令,比如

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

如果为编译单元someunit a过程生成someunit.adb,则文件allofit.ada中包含一个包。

您可以有一个主过程,但主过程中有几个过程

procedure main is
    ...text...

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

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

    ...text...
end main;

西蒙的评论很可能重复。但是,如果一个过程调用另一个过程,您可以简单地将另一个本地过程声明为第一个过程,即在其声明区域中,声明语法是什么样的?我必须给文件命名吗?问题的答案是如何编译这两个代码并运行它取决于您使用的编译器。我假设您使用的是GNAT,但如果不是,请告诉我们您使用的编译器。请注意,每个文件只有一个编译单元不是Ada规则。这是一种蚊虫限制。并非所有Ada编译器都有此限制。