Ada:在 public 函数的前提条件中使用私有变量
Ada: Using a private variable in a precondition of a public function
以下是尝试用最少的代码产生我的问题(它不是一个有用的程序)。
我的问题是我想在依赖于私有变量的 public 函数上设置前提条件。我必须在“私有”指标之前声明我的函数,并在该指标之后声明我的变量。这意味着我得到了编译错误
problem.ads:10:16:“secondPrivateVariable”未定义
problem.ads:10:40:“firstPrivateVariable”未定义
我曾尝试将占位符定义放在函数上方,但随后出现有关定义冲突的编译错误。
package Problem is
pragma Elaborate_Body (Problem);
function publicAPI(which : Positive) return Natural with
Pre => secondPrivateVariable > firstPrivateVariable;
-- should only be called when second > first
private
-- the following variables are used by many procedures and
-- should be kept private
firstPrivateVariable : Natural := 7;
secondPrivateVariable : Natural := 465;
end Problem;
欢迎任何帮助。
您可以将检查包装在一个函数中:
function Call_Permitted return Boolean;
function publicAPI(which : Positive) return Natural with
Pre => Call_Permitted;
private
firstPrivateVariable : Natural := 7;
secondPrivateVariable : Natural := 465;
function Call_Permitted return Boolean is
(secondPrivateVariable > FirstPrivateVariable);
如果 Call_Permitted
仅在本地使用并且仅在启用断言时生成目标代码,您可以说
function Call_Permitted return Boolean with Ghost;
(这是一个 SPARK-related 功能,可能仅在 GNAT 中可用)
以下是尝试用最少的代码产生我的问题(它不是一个有用的程序)。
我的问题是我想在依赖于私有变量的 public 函数上设置前提条件。我必须在“私有”指标之前声明我的函数,并在该指标之后声明我的变量。这意味着我得到了编译错误
problem.ads:10:16:“secondPrivateVariable”未定义 problem.ads:10:40:“firstPrivateVariable”未定义
我曾尝试将占位符定义放在函数上方,但随后出现有关定义冲突的编译错误。
package Problem is
pragma Elaborate_Body (Problem);
function publicAPI(which : Positive) return Natural with
Pre => secondPrivateVariable > firstPrivateVariable;
-- should only be called when second > first
private
-- the following variables are used by many procedures and
-- should be kept private
firstPrivateVariable : Natural := 7;
secondPrivateVariable : Natural := 465;
end Problem;
欢迎任何帮助。
您可以将检查包装在一个函数中:
function Call_Permitted return Boolean;
function publicAPI(which : Positive) return Natural with
Pre => Call_Permitted;
private
firstPrivateVariable : Natural := 7;
secondPrivateVariable : Natural := 465;
function Call_Permitted return Boolean is
(secondPrivateVariable > FirstPrivateVariable);
如果 Call_Permitted
仅在本地使用并且仅在启用断言时生成目标代码,您可以说
function Call_Permitted return Boolean with Ghost;
(这是一个 SPARK-related 功能,可能仅在 GNAT 中可用)