在Ada 2012中,我希望在声明的数组中有一个链表,而不是分配。我希望通过一个过程设置链接指针。
我已将我的程序简化为以下内容,演示了我想要使用的原理,但我无法在Raspi上运行的Gnat 4.9.2(Debian Jessie)中编译...
procedure Arr is
type Cell;
type Cell_Ptr is access all Cell;
type Cell is
record
Number : Integer := 0;
Next : Cell_Ptr := null;
end record;
type Chain is array (1 .. 100) of aliased Cell;
procedure Make_Links (Ch : in out Chain);
procedure Make_Links (Ch : in out Chain) is
begin
for I in Ch'First .. Ch'Last - 1 loop
Ch (I).Next := Ch (I + 1)'Access; -- ERROR HERE
end loop;
end Make_Links;
My_Chain : Chain;
begin
Make_Links (My_Chain);
end Arr;
我收到此编译器错误: " 非本地指针不能指向本地对象"在上面指出的那条线上。
我知道我试图做一些有点奇怪的事情,但我打算让一些其他函数以不同的方式(向后或随机等)执行链接,这取决于我通过这个单元格数组的过程到。
如何修复此代码以便编译?无法理解这一点(我还是新手,但享受学习过程)。
答案 0 :(得分:3)
因为你实际上没有分配&释放内存,没有看到需要指针。我会通过这样的方式实现相同的功能:
procedure Arr is
type Cell_Index is new Integer range 0 .. 100;
subtype Valid_Cell_Index is Cell_Index range 1 .. Cell_Index'Last;
type Cell is
record
Number : Integer := 0;
Next : Cell_Index := 0;
end record;
type Chain is array (Valid_Cell_Index) of Cell;
procedure Make_Links (Ch : in out Chain);
procedure Make_Links (Ch : in out Chain) is
begin
for I in Valid_Cell_Index'First .. Valid_Cell_Index'Last - 1 loop
Ch (I).Next := I+1;
end loop;
end Make_Links;
My_Chain : Chain;
begin
Make_Links (My_Chain);
end Arr;
这样您仍然使用Next作为同一数组的索引,并且可以使用您想要的任何链接模式预加载数组。
答案 1 :(得分:0)
不使用’Access
,而是使用’Unrestricted_Access
。这是one of GNAT’s “implementation-defined” attributes:
Unrestricted Access 属性类似于 Access ,但省略了所有辅助功能和别名视图检查。这是一个用户要小心的属性。
答案 2 :(得分:0)
我最终想通了。以下代码是OP中的代码的修改版本。它做了我原本想做的事情而没有做任何不愉快的事......
class SwipeStep : ORKActiveStep {
static func stepViewControllerClass() -> SwipeStepViewController.Type {
return SwipeStepViewController.self
}
}
我没有直接传递数组,而是传递了一个指向数组的指针,而Gnat似乎很满意。我认为之前我试图做的是被程序参数的“复制传递”规则所打破。