私は楽しみのために Ada を学んでいる C++ プログラマーです。以下のいずれかが不適切な形式である場合は、お気軽にご指摘ください。Ada のやり方を学ぼうとしていますが、古い習慣はなかなか直りません (それに、Boost が恋しいです!)
整数、スペース、文字列を含むファイルを読み込もうとしています。これを行うためのより良い方法があるかもしれませんが、80 文字を超えないことがわかっている文字列バッファーに行をロードする必要があると考えました。適切な場所で、次のようなバッファー変数を宣言します。
Line_Buffer : String(1..80);
ファイルを開いた後、各行をループし、スペース文字でバッファーを分割します。
while not Ada.Text_IO.End_Of_File(File_Handle) loop
Ada.Text_IO.Get_Line(File_Handle, Item=>Line_Buffer, Last=>Last);
-- Break line at space to get match id and entry
for String_Index in Line_Buffer'Range loop
if Line_Buffer(String_Index) = ' ' then
Add_Entry(Root_Link=>Root_Node,
ID_String=> Line_Buffer(1..String_Index-1),
Entry_String=> Line_Buffer(String_Index+1..Last-1)
);
end if;
end loop;
end loop;
Add_Entry で何が起こるかはそれほど重要ではありませんが、その仕様は次のようになります。
procedure Add_Entry(
Root_Link : in out Link;
ID_String : in String;
Entry_String : in String);
あちこちでサイズを指定しなければならないことを心配したくないので、制限付き文字列ではなく制限なし文字列を使用したかったのです。これはコンパイルして正常に動作しますが、Add_Entry 内で Entry_String の各文字をループしようとすると、インデックスが 1 から始まるのではなく、元の文字列のオフセットから始まります。たとえば、Line_Buffer が「14 シリコン」の場合、次のようにループすると、インデックスは 4 から 10 になります。
for Index in Entry_String'Range loop
Ada.Text_IO.Put("Index: " & Integer'Image(Index));
Ada.Text_IO.New_Line;
end loop;
Add_Entry に渡す文字列が 1 で始まる境界を持つように、この解析を行うより良い方法はありますか? また、スライスされた文字列を「in」パラメータとしてプロシージャに渡すと、スタック上にコピーが作成されますか、それとも元の文字列への参照が使用されますか?