将字符串分配给Ada中的链接列表的问题

时间:2013-03-15 06:36:40

标签: pointers for-loop linked-list ada

我正在尝试引入一个字符串,并逐个字符地将其分配给链接列表,声明如下:

type lstring is private;
type lstring_node;
type lstring_access is access lstring_node;
type lstring_node is
    record
        Char : character;
        Position : integer;
        Next : lstring_access;
    end record;

private
   type lstring is 
      record
          First : lstring_access := null;
      end record;

分配它的功能如下:

function toLstring (Input : string) return lstring is
    LStr : lstring;
    Current : lstring_access;
begin
    -- Set the first item of LStr as Current.
    -- LStr will from now on inherit the items of Current.
    LStr.First := new lstring_node;
    Current := LStr.First;

    -- Iterate through the string and add it to the lstring.
    for I in 1..Input'Length loop
        if I /= 1 then
            Current := new lstring_node;
        end if;
        Current.Char := Input(I);
        Ada.Text_IO.Put(Current.Char);
        Current.Position := I;
        Current := Current.Next;
    end loop;

    -- Return the new lstring.  
    return LStr;
end toLstring;

我通过调试知道for循环工作正常,并且元素被分配给Current就好了。但由于某种原因,这些物品没有被添加到LStr。我是否需要在for循环后声明一些内容才能完成它?我的印象是因为Current被分配给LStr.First,LStr将继承附加列表的其余部分。我错了吗?

由于

1 个答案:

答案 0 :(得分:3)

在循环结束时,您将Current.Next(此时为空)分配给Current。这是一个价值副本。在下一次迭代中更改Current的值不会更改上一节点中Next的值。 (请注意Current.CharCurrent.Next是实际执行Current.all.Char / Next的隐式取消引用,但Current := new lstring_node不是取消引用,因为它会更改参考。)

相反,您应该将new lstring_node分配给Next,然后提前Current引用:

for I in Input'Range loop
    Current.Char := Input(I);
    Ada.Text_IO.Put(Current.Char);
    Current.Position := I - Input'First + 1;
    if I /= Input'Last then
        Current.Next := new lstring_node;
        Current := Current.Next;
    end if;
end loop;

请注意,我更改了循环范围(字符串不需要从1开始)并调整位置计算,因此您最终会在列表中找到基于1的位置索引。