Как скопировать данные из строкового доступа в Ada.String

#ada #gnat

#ada #комар

Вопрос:

У меня есть следующий фрагмент кода

 with GNAT.Command_Line; use GNAT.Command_Line;  with GNAT.Strings; use GNAT.Strings;   ....   Define_Switch  (Config =gt; Config, Output =gt; File_Name'Access,  Long_Switch =gt; "--file=", Switch =gt; "-f=",  Help =gt; "File with Composition");   ....  Getopt  

После анализа командной строки с помощью Getopt у меня есть объект доступа, который указывает на фактическое имя файла Я хотел бы скопировать это имя в Ada.String.Исправлена строка, которая определялась как

 File_Name : String(1 .. 256);  

Я могу распечатать для консоли данные из File_name_access как

 Put_Line(File_Name.all);  

Я думаю, что я должен предоставить что-то вроде операции копирования, а затем объект свободного доступа. Как я могу это сделать?

Спасибо. Алекс

Ответ №1:

Я предполагаю, что имя файла в фрагменте кода определено как » псевдоним GNAT.Strings.String_Access’. Это «жирный указатель» на строковый объект. «Жирный» означает, что это не только адрес, это диапазон индексов строки. Нулевой терминатор в стиле C не используется в Ada, и Ноль является допустимым символом.

Вы можете скопировать данные внутри этого строкового объекта в другой стандартный строковый объект, играя с вычислениями индексов, но обычно вы не должны этого делать: нет нулевого терминатора, вам нужно будет передать длину фактических данных; объект строки назначения может быть меньше, чем необходимо, и данные будут усечены или возникнет исключение; и т.д.

Есть два правильных способа сделать это. Первый-объявить неограниченный строковый объект и присвоить ему значение.

 declare  Fixed_File_Name : String := File_Name.all;  begin  Free (File_Name);  

или используйте строку переменной длины (ограниченную или неограниченную):

 declare  Unbounded_File_Name : Ada.Strings.Unbounded.Unbounded_String;  begin  Unbounded_File_Name :=  Ada.Strings.Unbounded.To_Unbounded_String (File_Name.all);  Free (File_Name.all);  

Использование фиксированной строки имеет важное ограничение: объект string должен быть инициализирован точно в точке объявления объекта и доступен только внутри соответствующего блока/подпрограммы. Использование строки переменной длины позволяет объявлять объект string за пределами области действия конкретного блока/подпрограммы.

Комментарии:

1. Большое Спасибо Вадим