我是一个长期学习 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”参数传递给过程时,是在堆栈上创建了一个副本,还是使用了对原始字符串的引用?