Я долго программист на C++, изучающий Аду для удовольствия. Если какая-либо из нижеперечисленных проблем является плохой, не стесняйтесь указывать ее. Я пытаюсь изучить способ Ады, но старые привычки трудно сломать (и я пропускаю Boost!)Ada Slicing with Strings
Я пытаюсь загрузить файл, который содержит целое число, пробел, а затем строка символов. Там может быть лучший способ сделать это, но я подумал, что я должен загрузить строку в строковый буфер, который, как я знаю, будет не более 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, которую я изучаю (помимо типов и чистой читаемости до сих пор) –
, как подразумевается TED, вы можете определить подтипы, а затем использовать диапазоны этих типов для создания и индексирования массивов, даже диапазонов, которые нестандартный (-5 .. 5), который устраняет необходимость смещения любой индексации до 0 или 1 :) – NWS