我是一个很长时间的C++程序员学习Ada的乐趣。如果以下任何一种情况不好,请随时指出。我试图学习Ada的方式来做事,但旧习惯很难打破(我错过了助推器!)Ada与字符串切片
我试图加载一个文件,其中包含一个整数,一个空格,然后字符串。可能有更好的方法来做到这一点,但我认为我应该加载到一个字符串缓冲区,我知道不会超过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”参数传递给过程时,是在堆栈上创建的副本,还是对使用的原始字符串的引用?
这些属性很光滑。不用担心索引值是很好的。 Ada的另一个特点是,我正在学习欣赏(除了类型和目前为止的纯可读性) – 2011-02-07 21:19:18
如TED所暗示的那样,您可以定义子类型,然后使用这些类型的范围来创建和索引数组,甚至是范围非标准像(-5 .. 5),它不需要将任何索引抵消到0或1 :) – NWS 2011-02-15 15:12:18