#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. Большое Спасибо Вадим