gpt4 book ai didi

scope - 使用匿名访问过程或访问过程类型时的差异

转载 作者:行者123 更新时间:2023-12-03 15:48:21 25 4
gpt4 key购买 nike

我已经与Ada合作了一年多,虽然我认为自己掌握了很多东西,并且对非常强大的字体系统感到满意,但我偶尔也会遇到麻烦。

目前,我有一个关于嵌套过程的问题,在该过程中,编译器给了我一个错误,但我无法真正解决这个问题:subprogram must not be deeper than access type。当我声明了一种可以访问过程的类型时,就会出现此错误,但是当使用匿名访问参数时,它会正常工作,如以下MWE所示:

procedure Generaltest is
type T_Access_Procedure is access procedure;

procedure Test_Access (Proc : access procedure) is
begin
null;
end Test_Access;

procedure Test_Type (Proc : in T_Access_Procedure) is
begin
null;
end Test_Type;

procedure Test is
procedure Nested_Procedure is
begin
null;
end;

-- Not allowed; subprogram must not bee deeper than access procedure.
Proc : T_Access_Procedure := Nested_Procedure'Access;

begin
Test_Access (Nested_Procedure'Access); -- This line works fine.
Test_Type (Nested_Procedure'Access); -- This line also generates the error.
end Test;

begin
Test;
end Generaltest;

以我的观点,这可以通过两种不同的方式来解释,具体取决于重点。 子程序的深度不能大于访问类型,或者子程序的深度不能大于 的访问类型。换句话说,是有关子程序本身还是参数类型的错误?我倾向于认为它是前者,因为子程序是访问类型,但是我不确定。

有人可以向我解释在这种情况下使用参数中的类型或使用访问参数之间的真正区别是什么以及为什么前者被认为是“更深层次的”吗?

在我的世界中,使用 T_Access_Procedure类型作为 in参数是一种更优雅的方法,尤其是如果我选择的过程将在许多过程中使用或参数列表很长的情况下。

最佳答案

Ada 95 Rationale, 3.7.2 Access to Subprograms所述,“编译时可访问性规则确保退出值所包含的子程序在其封闭范围退出后不能被调用。”在您的示例中,引用Nested_Procedure的访问值仅在Test的范围内有效,但是可以使用T_Access_Procedure类型的值来调用Nested_Procedure范围之外的TestProc和传递给Test_Type的实际参数均为T_Access_Procedure类型;两者都不被允许。

具体的选择取决于您要做什么。查看Rationale for Ada 2012, 6.3 Iteration可能会有所帮助。正如here所讨论的,“通用形式子程序仍然是通过任意外部指定的子程序对算法进行参数化的最通用方法。”

关于scope - 使用匿名访问过程或访问过程类型时的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62438262/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com