2014-10-31 4 views
3

У меня есть программа в Ada95, в которой я должен создать массив строк. Этот массив может содержать строки переменной длины.String Arrays в Ada

Пример: Я объявил массив, в котором все индексы могут хранить строки размером 50. Когда я назначаю меньшую строку указанному выше массиву, я получаю «Ошибка Constraint».

Код:

procedure anyname is 
    input_array : array(1..5) of String(1..50); 
begin 
    input_array(1):="12345"; 
end anyname; 

Я попытался создать массив Unbounded_Strings. Но это тоже не работает. Может ли кто-нибудь сказать мне, как хранить этот «12345» в вышеупомянутом массиве строк?

+0

Решение заключается в использовании 'Unbounded_String'. Пожалуйста, покажите код, в котором вы пытались создать массив 'Unbounded_String'. Тип 'String' не допускает строк переменной длины. – ajb

+0

Для Unbounded_String я использовал следующий код: input_array: = массив (1..5) Unbounded_String; Затем я получил следующее сообщение об ошибке:. «Ожидается частный типа„Ada.Strings.Unbounded.Unbounded_String“ Затем я попытался изменить код на: input_array: массив (1..5) из Ada.Strings.Unbounded .Unbounded_String; Теперь я не могу назначить значения для input_array (1) –

+0

. Если вы попытались использовать ': =' непосредственно со строковым литералом, см. Мой ответ. В целом, пожалуйста, будьте более конкретными, какие проблемы вы используете Сказать, что такие вещи, как «Я не могу этого сделать» или «это не работает», недостаточно хороши для StackOverflow, потому что мы не читаем читателей. Вместо этого разместите код, который вы попробовали, и сообщение об ошибке, которое вы получили. – ajb

ответ

3

Если вы используете Unbounded_String, вы не можете присвоить строковый литерал к нему напрямую. Строковые литералы могут иметь тип String, Wide_String, или Wide_Wide_String, но ничего больше; и назначение в Ada обычно требует, чтобы пункт назначения и источник были одного типа. Чтобы преобразовать String к Unbounded_String, вам нужно вызвать To_Unbounded_String функции:

procedure anyname is 
    input_array : array(1..5) of Ada.Strings.Unbounded.Unbounded_String; 
begin 
    input_array(1) := Ada.Strings.Unbounded.To_Unbounded_String ("12345"); 
end anyname; 

Вы можете сократить имя, используя пункт use; некоторые другие программисты могли бы определить свою собственную функцию переименования, возможно, даже с помощью одинарного "+" оператора:

function "+" (Source : String) return Ada.Strings.Unbounded.Unbounded_String 
    renames Ada.Strings.Unbounded.To_Unbounded_String; 

procedure anyname is 
    input_array : array(1..5) of Ada.Strings.Unbounded.Unbounded_String; 
begin 
    input_array(1) := +"12345"; -- uses renaming "+" operator 
end anyname; 

Не все нравится этот стиль.

+0

Спасибо ajb. Ваш код работает. Я написал следующий код для неограниченной строки. код: процедура anyname is input_array: массив (1..5) от Ada.Strings.Unbounded.Unbounded_String; начало input_array (1): = Ada.Strings.Unbounded.To_Unbounded_String ("12345"); put_line (input_array (1) 'Length); put_line (input_array (1) 'First); put_line (input_array (1) 'Last); конец любого имени; Но я получаю эти ошибки: префикса для атрибута длиной 'не может быть частным типом префикса для «первого» атрибута не может быть частным типом префикса для «последнего» атрибута не может быть частный типом –

+0

'' Length' не работает в 'Unbounded_String'. Чтобы использовать 'Unbounded_String', вы должны использовать процедуры и функции, определенные в RM. Вы не можете использовать материал, который вы используете для типов 'String' или других' array', потому что 'Unbounded_String' не является массивом. Пожалуйста, прочтите документацию RM [здесь] (http://www.ada-auth.org/standards/12rm/html/RM-A-4-5.html) – ajb

1

Вы можете использовать Ada.Strings.Unbounded, проиллюстрированный here, или вы можете использовать статический оборванный массив, иллюстрированный here. В последнем подходе используется массив псевдонимов, каждый из которых может иметь разную длину.

type String_Access is access constant String; 

String_5: aliased constant String := "12345"; 
String_6: aliased constant String := "123456"; 
String_7: aliased constant String := "1234567"; 
... 

Input_Array: array (1..N) of 
    String_Access := 
     (1 => String_5'Access, 
     2 => String_6'Access, 
     3 => String_7'Access, 
     -- etc. up to N 
    );