我是一個很長時間的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