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 处理的种类,适用于二阶和可能的三阶。


以上是ada指向局部变量编译和运行时错误的指针的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>