在SPARK Ada中实例化非库级包

时间:2017-06-30 00:42:31

标签: ada spark-ada spark-2014

如何在SPARK Ada中实例化非库级别的包?

说我有类似的东西:

subtype Die is Integer range 1..6;
package Random_Die
is
  new Ada.Numerics.Discrete_Random(Die);

这给了我错误:

instantiation error at a-nudira.ads.45
incorrect placement of "Spark_Mode"
Random_Die is not a libray level package

据推测,我需要关闭Ada.Numerics.Discrete_Random的SPARK_Mode,但我无法找到合适的地方来放置编译指示。

2 个答案:

答案 0 :(得分:1)

泛型仅在实例化时由SPARK检查。 : - (

错误消息看起来像是试图将SPARK_Mode方面放在泛型中的某个位置。那样不行。您应该将SPARK_Mode => On方面放在实例化通用包的单元上。

答案 1 :(得分:1)

关于Ada.Numerics.Discrete_Random的消息并不多。 Spark-2014希望你将未命名的软件包Unnamed设置为库级,就像Jacob Sparre Andersen在his answer中提到的那样。即:

with Ada.Numerics.Discrete_Random;

--procedure Outer is
   package Unnamed
      with Spark_Mode => On
   is
      subtype Die is Integer range 1..6;
      package Random_Die
      is
        new Ada.Numerics.Discrete_Random(Die);
   end Unnamed;
--begin
--   null;
--end Outer;

删除评论'连字符和翻译Outer会产生错误信息。按原样翻译Unnamed可以正常工作,gnatprove没有投诉。换句话说,Unnamed是一个库级包。在Outer范围内,它不会使GNAT发出诊断消息。