Исправлены строки Ады

Всем привет ,

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: ошибка: общий размер локальных объектов слишком велик"

Спасибо.


person infinite    schedule 15.01.2016    source источник
comment
Зависит от системы. В стеке будет выделена локальная переменная, поэтому, если вам нужна строка размером 2 ГБ, вам нужно либо установить больший размер стека, либо что-то вроде max_String : access String := new String(1 .. integer'last);, чтобы разместить строку в куче.   -  person user_1818839    schedule 15.01.2016
comment
В данный момент я предпочитаю не иметь дело с указателями. я понятия не имею, как установить больший размер стека, но это может быть лучшим решением.   -  person infinite    schedule 15.01.2016
comment
Зависит от системы. Итак, есть ли способ узнать, каков предел для моей системы, когда я использую строку?   -  person infinite    schedule 15.01.2016
comment
Вам почти наверняка не нужно выделять 2 гигабайта для хранения строки. Изменение конфигурации вашей ОС, чтобы позволить вам сделать это (а) бесполезно, и (б) может быть даже невозможно.   -  person Keith Thompson    schedule 15.01.2016
comment
Я просто хочу знать предел. :-(   -  person infinite    schedule 15.01.2016
comment
Сообщение взято из недр gcc, поэтому оно не специфично для Ады (хотя я думаю, что оно было предоставлено GNAT). Функция, проверяющая размер кадра стека, находится в файле gcc/function.c. Возможно, этот вопрос следует сначала задать в справочном списке GCC. Если нет пользовательской документации, в которой рассматривается эта системная зависимость соответствующей установки GCC, то я бы сказал, что это ошибка, поскольку она влияет на переносимость совершенно нормальных объявлений массивов.   -  person B98    schedule 17.01.2016
comment
В древние времена в винде по умолчанию было 2Мб, если мне не изменяет память. Руководство пользователя должно дать вам способ изменить это. Или можно было примерно найти методом проб и ошибок ;-)   -  person Álex    schedule 19.01.2016


Ответы (2)


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

S : String (1 .. 5);

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

L : String := “foo”;

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

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

Вероятно, вы захотите использовать версию функции 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 в данный момент не работает)

person Simon Wright    schedule 15.01.2016
comment
Да, Unbounded_Strings больше подходят для примера. Кроме того, я не хочу использовать get_line. Я очень хочу ответить на свой первый вопрос. - person infinite; 15.01.2016

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

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

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

% limit stacksize stacksize 8MB %

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

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

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

person Jacob Sparre Andersen    schedule 16.01.2016
comment
Отметьте ulimit, но имейте в виду, что это относится только к потомкам текущего сеанса и может служить только для ограничения (не увеличения), если вы не являетесь пользователем root. - person Álex; 19.01.2016
comment
IIRC, вы также можете настроить размер стека, запрашиваемый приложением во время компиляции. Я просто не могу вспомнить, как. - person Jacob Sparre Andersen; 19.01.2016