【问题标题】:Ada, check out my package. ("compilation unit expected"?)艾达,看看我的包裹。 (“预期的编译单元”?)
【发布时间】:2010-12-16 19:21:11
【问题描述】:

我已经摆脱了所有其他编译时错误,除了“预期的编译单元”,它在我的导入语句之后开始。我猜我需要创建一个包?如果是这样,我该怎么做?我有几个函数都存在于同一个 .ADB 文件中。

编辑:所以我试了一下......

查看我的包裹:

-- Import Statements
with Ada.Text_Io;
use Ada.Text_Io;

package body MyPackage is

-- Declarations
-- Functions

end MyPackage;

但是 gcc 在看到 MyPackage 时会尖叫:

a_.adb:27:18: loop or block statement must follow label
a_.adb:27:18: reserved word "array" cannot be used as identifier
a_.adb:28:01: declarations must come before "begin"

最大的恩典

【问题讨论】:

  • 这些编译器错误在使用包包装代码之前不存在。
  • 那些编译器消息不能属于您发布的代码(因为它没有 28 行)。 GCC 会期望这段代码在文件mypackage.adb 中;并且需要在mypackage.ads 中有一个包规范。
  • 确实,我把它删掉了。并感谢 .ads 中的包装规格建议。这可能是诀窍,因此请随时将此评论推广为答案。

标签: package ada compilationunit


【解决方案1】:

包体是包规范的实现。

无意冒犯,但您需要熟悉一些基本的 Ada 编程概念。

也许以Lovelace Tutorial 开头,这是一个老歌,但很好。

【讨论】:

    【解决方案2】:

    那些编译器消息不能属于您发布的代码(因为它没有 28 行)。

    无论如何,GCC 都希望这段代码在文件mypackage.adb 中;并且需要在mypackage.ads 中有一个包规范。

    【讨论】:

    • 这是一个重要的注意事项。 gcc 的 Ada 实现采取了一个相当不寻常的步骤,即强制文件名与文件内容的标识符名称相匹配。具体来说,如果文件包含名为fnord 的包体或子例程,则文件必须(无论如何默认)命名为fnord.adb。如果它包含名为fnord 的包装规范,则文件必须 命名为fnord.ads。这是 gcc 的 gnat Ada 实现的一个怪癖,而不是一般的 Ada 编译器
    【解决方案3】:

    有同样的错误,我忘记了它是如何工作的,所以经过反复试验,我发现了

    WITH Ada.Text_IO;
    USE Ada.Text_IO;
    WITH Ada.Integer_Text_Io;
    USE Ada.Integer_Text_IO;
    WITH Ada.Float_Text_IO;
    USE Ada.Float_Text_IO;
    --ecrire(x) lire(x) put(x) get(x);
    --errors handling
    WITH Ada.IO_Exceptions;
    
    
    --Additionnal log functions alike
    WITH Ada.Numerics.Elementary_Functions;
    USE Ada.Numerics.Elementary_Functions;
    
    --  WITH Ada.Text_Io;
    --  USE Ada.Text_Io;
    --  WITH Ada.Integer_Text_Io;
    --  USE Ada.Integer_Text_Io;
    
    procedure remplit is
    
       type tablo is array(1.. 5) of float;
       
    
    Procedure toto ( Init : in float ; T : out tablo ) is
    
    Begin
    
    For I in T'first + 1..T'last loop
          T(i) := Init * float(i);
          put(t(i));
       End loop;
    
       End toto;
       
       T : tablo;
       
    begin
       toto(1.5, T);
       
       end remplit;
    

    而不是这个会产生这个错误......

    WITH Ada.Text_IO;
    USE Ada.Text_IO;
    WITH Ada.Integer_Text_Io;
    USE Ada.Integer_Text_IO;
    WITH Ada.Float_Text_IO;
    USE Ada.Float_Text_IO;
    --ecrire(x) lire(x) put(x) get(x);
    --errors handling
    WITH Ada.IO_Exceptions;
    
    
    --Additionnal log functions alike
    WITH Ada.Numerics.Elementary_Functions;
    USE Ada.Numerics.Elementary_Functions;
    
    --  WITH Ada.Text_Io;
    --  USE Ada.Text_Io;
    --  WITH Ada.Integer_Text_Io;
    --  USE Ada.Integer_Text_Io;
    
    
    
       type tablo is array(1.. 5) of float;
       
    
    Procedure remplit ( Init : in float ; T : out tablo ) is
    
    Begin
    
    For I in T'first + 1..T'last loop
          T(i) := Init * float(i);
          put(t(i));
       End loop;
    
    
       
       end remplit;
    

    顺便说一句,这与包裹无关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-10-13
      • 2015-04-29
      • 2016-03-14
      • 2015-07-10
      • 2018-12-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多