2016-01-15 5 views
0

Привет всем,Ada Струны Fixed

type String is array (Positive range <>) of Character; 

Хорошо, но где предел, когда мы объявляем переменную?

Когда мы делаем это:

max_String : String(1 .. integer'last) ; 

Это не удалось.


Например:

With Ada.Text_IO ;   Use Ada.Text_IO ; 

Procedure fixed is 

    max_String : String(1 .. integer'last) ; 

begin 
    get (max_String) ; 
    put (max_String) ; 

End fixed ; 

составителя: "fixed.adb: 3: 1: ошибка: общий размер локальных объектов слишком больших"

Спасибо.

+0

Как это произошло? –

+0

тема отредактирована – infinite

+0

Системная зависимость. Локальная переменная будет выделена в стеке, поэтому, если вам нужна строка 2 ГБ, вам нужно установить более высокий размер стека или что-то вроде 'max_String: access String: = new String (1 .. integer'last) ; 'выделить строку в куче. –

ответ

3

Когда вы создаете строку, она имеет указанную длину. Таким образом,

S : String (1 .. 5); 

резервирует место для 5 символов.

L : String := “foo”; 

резервирует место для 3 символов и заполняет его «f», «o», «o».

Integer’Last составляет около 2 миллиардов; Я не думаю, что у вас столько RAM!

Вы, вероятно, хотите использовать функцию версии Ada.Text_IO.Get_Line:

with Ada.Text_IO; use Ada.Text_IO; 
procedure Fixed is 
    S : constant String := Get_Line; 
begin 
    Put_Line (S); 
end Fixed; 

Это инициализирует S с тем, что первая строка ввода случается.

Большинство людей, которые имеют дело со строками использовать Unbounded_Strings (требуется ссылка - сайт ARM вниз на данный момент)

+0

Да, Unbounded_Strings более уместны в примере. Кроме того, я не хочу использовать get_line. Я действительно хочу ответить на мой первый вопрос. – infinite

+0

спасибо в любом случае. – infinite

1

Объекты, объявленные в декларативной блоке выделяются в стеке задачи они выполняются в .

Это означает, что предел получен из того, сколько стека пространство вашей операционной системы дает программе, когда вы ее запускаете.

Я использую ЗШ на Linux, где я могу проверить/отрегулировать назначенный размер стека с помощью команды limit stacksize:

% limit stacksize stacksize 8MB %

Я также могу изменить его:

% limit stacksize 2100m % limit stacksize stacksize 2100MB %

Если Я начал свою программу в этот момент (из той же оболочки), она может работать нормально.

+0

спасибо, я использую bash, я ищу аналогичную команду. – infinite

+0

Проверьте 'ulimit', но следует предупредить, что он применим только к потомкам текущего сеанса, и он может служить только для ограничения (не увеличивать), если вы не root. – Alex

+0

IIRC, вы также можете настроить размер стека, запрошенный приложением во время компиляции. Я просто не могу вспомнить, как это сделать. –