1

文字列を取り込んで、文字ごとにリンクリストに割り当てようとしており、次のように宣言されています。

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 に問題なく割り当てられていることがわかりました。しかし、何らかの理由で項目が L​​Str に追加されていません。for ループを終了するには、for ループの後に何かを宣言する必要がありますか? Current が LStr.First に割り当てられているため、LStr は追加されたリストの残りを継承するという印象を受けています。私は間違っていますか?

ありがとう

4

1 に答える 1

3

ループの最後に、Current.Next(この時点ではnullです)をに割り当てますCurrent。これはバリューコピーです。Current次の反復での値を変更Nextしても、前のノードのの値は変更されません。(Current.Charとは実際に/をCurrent.Next実行する暗黙の逆参照ですが、参照の値を変更するため、逆参照ではありません。)Current.all.CharNextCurrent := 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ベースの位置インデックスが表示されることに注意してください。

于 2013-03-15T07:11:12.760 に答える