将别名记录数组传递给过程

时间:2015-08-04 14:59:07

标签: list pointers compilation ada

在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;

我收到此编译器错误: " 非本地指针不能指向本地对象"在上面指出的那条线上。

我知道我试图做一些有点奇怪的事情,但我打算让一些其他函数以不同的方式(向后或随机等)执行链接,这取决于我通过这个单元格数组的过程到。

如何修复此代码以便编译?无法理解这一点(我还是新手,但享受学习过程)。

3 个答案:

答案 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似乎很满意。我认为之前我试图做的是被程序参数的“复制传递”规则所打破。