ada指向局部变量编译和运行时错误的指针
我是一名 C 程序员,正在尝试实现我之前在 C 中实现的数据结构,但在 Ada 中实现。在我的头撞墙几次后,我决定向堆栈神寻求帮助。
procedure Ok is
type Node;
type Node is record
Next : access Node;
Prev : access Node;
end record;
begin
declare
a : aliased Node;
begin
a.Prev := a'Access;
end;
end;
编译失败的原因是:
ok.adb:14:19: non-local pointer cannot point to local object这对我来说没有意义。哪个指针是非本地的?(如果在过程范围中定义了 a,则它有效)。
然后
procedure Ok is
type Node;
type Node is record
Next : access Node;
Prev : access Node;
end record;
procedure func(NodeOne : aliased in out Node) is
NodeP : access Node := NodeOne'Access;
begin
NodeOne.Next := NodeP;
NodeOne.Prev := NodeP;
end func;
begin
declare
a : aliased Node;
begin
func(a);
end;
end;
这其中得到了运行时的辅助功能检查失败的
NodeOne.Next := NodeP;行
为什么可访问性不正确?
回答
在 Ada 中永远不需要访问类型*。那些来自像 C 这样的语言,如果没有无处不在的指针,就没有任何用处,他们必须学习一种不同的方式来思考创建软件。思维方式的差异就像 C 语言和函数式语言之间的差异一样大。
我建议您学习 Ada,就好像它没有访问类型一样,直到您对这门语言感到满意为止。然后您应该了解访问类型,以便您可以理解使用它们的代码(通常是不必要的)。
如果您打算使用访问类型,则永远不要使用匿名访问类型。编写它的 ARG 将 ARM 中定义匿名访问类型规则的部分称为“黑暗之心”,他们承认没有人真正理解这些规则。这意味着使用匿名访问类型会导致令人不快的意外,并且不可移植。
*符合一阶近似;对于 S/WI 处理的种类,适用于二阶和可能的三阶。