Ada_Ru форум

Обсуждение языка Ада

Распределение памяти компилятором.

Оставить новое сообщение

Сообщения

Konstantin I. Tajtoorov
Распределение памяти компилятором.
2003-12-10 06:01:01

Добрый день!

 

В документации не нашел ответа на вопрос, касательно одной языковой конструкции:

 

declare

Message : String := String'Input (Channel);

 

1. Как компилятор распределяет память под переменную Message, ведь ее размер на этапе компиляции не известен.

 

2. String'Input (Channel), как я понял из ARM, сперва считывает размер блока данных, а потом сам блок. Сразу возникает вопрос, в каком виде передается размер блока данных ? Каков максимальный размер блока, который может быть принят этой конструкцией ? Не опасна ли эта конструкция с точки зрения переполнения переменной?

 

Regards,

Konstantin Tajtourov.

Konstantin I. Tajtoorov wrote:

В документации не нашел ответа на вопрос, касательно одной языковой

конструкции:

 

declare

Message : String := String'Input (Channel);

 

1. Как компилятор распределяет память под переменную Message, ведь ее

размер на этапе компиляции не известен.

 

Это одно из базовых преимуществ Ада от других языков. В Ада размер локального массива процедуры, или

declare

begin

end; блока не обязан быть известен на этапе компиляции.

Тем самым часто удается избежать динамических распределений памяти, которые чреваты ошибками утечки памяти,

и всякими access_violation.

 

Конструкция

 

procedure Sample (Size : Natural) is

Data : array (1 .. Size) of Integer;

begin

null;

end;

 

Вполне корректна.

То есть размер распределенного стека для процедуры не определен на этапе компиляции.

 

2. String'Input (Channel), как я понял из ARM, сперва считывает размер блока

данных, а потом сам блок. Сразу возникает вопрос, в каком виде передается

размер блока данных ?

 

Они вместе передаются. в одной внутренней структуре.

 

Каков максимальный размер блока, который может быть

принят этой конструкцией ? Не опасна ли эта конструкция с точки зрения

переполнения переменной?

 

Не более опасна чем рекурсивные вызовы процеруд в других языках

с заранее не известной глубиной.

 

Если попытаешься слишком много стека занять вылезет exception Storage_Error.

Dmitriy Anisimkov wrote:

Konstantin I. Tajtoorov wrote:

 

В документации не нашел ответа на вопрос, касательно одной языковой

конструкции:

 

declare

Message : String := String'Input (Channel);

 

1. Как компилятор распределяет память под переменную Message, ведь ее

размер на этапе компиляции не известен.

 

 

Это одно из базовых преимуществ Ада от других языков. В Ада размер локального массива процедуры, или

declare

begin

end; блока не обязан быть известен на этапе компиляции.

 

Но вот named number должен быть известен :-) Т.е. написать так не удасться:

 

procedure Sample (Size : Natural) is

N : constant := Size + 1;

 

 

2. String'Input (Channel), как я понял из ARM, сперва считывает размер блока

данных, а потом сам блок. Сразу возникает вопрос, в каком виде передается

размер блока данных ?

 

 

Они вместе передаются. в одной внутренней структуре.

 

 

Каков максимальный размер блока, который может быть

принят этой конструкцией ? Не опасна ли эта конструкция с точки зрения

переполнения переменной?

 

 

Не более опасна чем рекурсивные вызовы процеруд в других языках

с заранее не известной глубиной.

 

Если попытаешься слишком много стека занять вылезет exception Storage_Error.

 

Если хочется зачитать аккуратно, то можно сначала прочесть границы и дискриминанты, а потом решать, что делать:

 

declare

First : constant Positive := Positive'Input (Channel);

Last : constant Natural := Natural'Input (Channel);

begin

if Last - First > Maximum_Size then

riase ...;

end if;

declare

Value : String (First .. Last);

begin

String'Read (Channel, Value);

end;

end;

 

Что явно длиннее и корявее, но зато предохранит от "кривого" поведения при разных "косяках".

 

Правда стоит отметить, что последовательнось записи на определяется RM, т.е. запись через Output с поледующим чтением указанным способом работать не обязана (но как побочный эффект - может).

 

 

-- Vadim Godunko

Vadim Godunko wrote:

Dmitriy Anisimkov wrote:

2. String'Input (Channel), как я понял из ARM, сперва считывает размер блока

данных, а потом сам блок. Сразу возникает вопрос, в каком виде передается

размер блока данных ?

 

Они вместе передаются. в одной внутренней структуре.

 

Тут я был неточен. Не сразу понял что речь идет о чтении из потока.

 

Каков максимальный размер блока, который может быть

принят этой конструкцией ? Не опасна ли эта конструкция с точки зрения

переполнения переменной?

 

Если хочешь читать и писать файлы, думаю лучше пользоваться каким нибудь специальным форматом, например

XML. Или на худой конец что то типа ini файлов в виндах.

Ада чтение записть конечно же сгенериует исключение если ей подсунуть битый или некорректный файл.

Но и это исключение можно перехватить и обработать.

Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти