我正在尝试引入一个字符串,并逐个字符地将其分配给链接列表,声明如下:
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将继承附加列表的其余部分。我错了吗?
由于
答案 0 :(得分:3)
在循环结束时,您将Current.Next
(此时为空)分配给Current
。这是一个价值副本。在下一次迭代中更改Current
的值不会更改上一节点中Next
的值。 (请注意Current.Char
和Current.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的位置索引。