Ada_Ru форум

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

блок

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

Сообщения

Aleksey Ulasevich
блок
2005-08-09 19:31:35

 

 

 

 

п■п╬п╠я─я▀п╧ п╢п╣п╫я▄!

 

п▓п╬п©я─п╬я│ я┌п╣п╬я─п╣я┌п╦я┤п╣я│п╨п╦п╧ )

 

declare

 

-- п╩п╬п╨п╟п╩я▄п╫я▀п╣ п╬п©п╦я│п╟п╫п╦я▐

 

begin

 

-- п©п╬я│п╩п╣п╢п╬п╡п╟я┌п╣п╩я▄п╫п╬я│я┌я▄ п╦п╫я│я┌я─я┐п╨я├п╦п╧

 

exeption

 

-- п╬п╠я─п╟п╠п╬я┌я┤п╦п╨п╦ п╦я│п╨п╩я▌я┤п╣п╫п╦п╧

 

end;

 

п≈п╟я┤п╣п╪ п╫я┐п╤п╫п╟ я┌п╟п╨п╟я▐ п╨п╬п╫я│я┌я─я┐п╨я├п╦я▐?

--

п║ я┐п╡п╟п╤п╣п╫п╦п╣п╪,

п░п╩п╣п╨я│п╣п╧ п╝. пёп╩п╟я│п╣п╡п╦я┤

(A.STAKANOV)

http://www.livejournal.com/users/a_stakanov/

Hello Aleksey,

 

Wednesday, August 10, 2005, 6:31:35 AM, you wrote:

 

AU> Добрый день!

 

AU> Вопрос теоретический )

AU> declare-- локальные описанияbegin-- последовательность

AU> инструкцийexeption-- обработчики исключенийend;

 

 

 

AU> Зачем нужна такая конструкция?

 

для лучшего структурирования кода.

Т.е. внутри процедуры можно выделить какуюто часть кода в единый

логический блок со своими переменными (временными) и своим блоком обработки исключений. Впринципе это аналогично созданию вложеной

процедуры, только она как бы анонимнаяф и вызываеться один раз :)

Тоже самое что в с++

void f() {

int i

....

{

int j;

...

}

...

}

 

 

--

Best regards,

Alexey mailto:lial@...

Hello!

 

On Wed, 10 Aug 2005, Alexey V. Litvinov wrote:

 

Hello Aleksey,

 

Wednesday, August 10, 2005, 6:31:35 AM, you wrote:

 

AU> Добрый день!

 

AU> Вопрос теоретический )

 

AU> declare-- локальные описанияbegin-- последовательность

AU> инструкцийexeption-- обработчики исключенийend;

 

 

 

AU> Зачем нужна такая конструкция?

 

для лучшего структурирования кода.

Т.е. внутри процедуры можно выделить какуюто часть кода в единый логический блок со своими переменными (временными) и своим блоком обработки исключений. Впринципе это аналогично созданию вложеной процедуры, только она как бы анонимнаяф и вызываеться один раз :)

Тоже самое что в с++

void f() {

int i

....

{

int j;

...

}

...

}

 

 

Вовсе не то же самое, а, как всегда, намного лучше !-), благодаря возможности локальной обработки исключения, и исторически раньше!

 

........

FREQUENCY : SOME_TYPE ;

 

begin

 

 

declare

CONTINUANCE : SOME_TYPE ;

 

begin

......

CONTINUANCE := .... ;

if CONTINUANCE <= ZERO_LEVEL then raise CONSTRAINT_ERROR ; elsif CONTINUANCE >= HIGH_LEVEL then raise SOME_OTHER_ERROR ; end if ;

FREQUENCY := .... / CONTINUANCE ;

 

exception

when CONSTRAINT_ERROR => raise ;

when SOME_OTHER_ERROR => FREQUENCY := 0.0 ;

when others => raise ;

 

end ;

 

........

 

 

end ;

Очень часто подобным образом окаймляются одиночные предложения, могущие вызвать летальную ошибку вычисления. Например, при вводе/выводе или как в приведённом примере.

 

Кроме того, удобно подобным образом локализовать промежуточные переменные при, допустим, начальной инициализации программы, когда неудобно городить для этого процедуру. Я так делал ещё на PL/1 -- у меня была куча массивов

неизвестного до выполнения размера, я их втаскивал через стек ( в PL/1 стек делался очень дёшево ). !-)

 

Sincerely yours Cyril Sazonov

On Wed, Aug 10, 2005 at 08:00:24AM +1100, Alexey V. Litvinov wrote:

Hello Aleksey,

 

Wednesday, August 10, 2005, 6:31:35 AM, you wrote:

 

AU> Добрый день!

 

AU> Вопрос теоретический )

 

AU> declare-- локальные описанияbegin-- последовательность

AU> инструкцийexeption-- обработчики исключенийend;

 

 

Часто используется, например, такая конструкция

declare

X : Some_Array (1 .. N);

begin

...

end;

 

Это позволяет выдилить массив (или другой объект

заранее неизветсного размера) в стеке, что избавляет

от необходимости выделять его в куче и затем уничтожать.

 

--

Maxim Reznik

В Срд, 10/08/2005 в 13:25 +0300, Maxim Reznik пишет:

On Wed, Aug 10, 2005 at 08:00:24AM +1100, Alexey V. Litvinov wrote:

Hello Aleksey,

 

Wednesday, August 10, 2005, 6:31:35 AM, you wrote:

 

AU> Добрый день!

 

AU> Вопрос теоретический )

 

AU> declare-- локальные описанияbegin-- последовательность

AU> инструкцийexeption-- обработчики исключенийend;

 

 

Часто используется, например, такая конструкция

declare

X : Some_Array (1 .. N);

begin

...

end;

 

Это позволяет выдилить массив (или другой объект

заранее неизветсного размера) в стеке, что избавляет

от необходимости выделять его в куче и затем уничтожать.

 

Это особенно удобно для типа string

 

 

 

 

Maxim Reznik п©п╦я┬п╣я┌:

 

On Wed, Aug 10, 2005 at 08:00:24AM +1100, Alexey V. Litvinov wrote:

Hello Aleksey,

 

Wednesday, August 10, 2005, 6:31:35 AM, you wrote:

 

AU> п■п╬п╠я─я▀п╧ п╢п╣п╫я▄!

 

AU> п▓п╬п©я─п╬я│ я┌п╣п╬я─п╣я┌п╦я┤п╣я│п╨п╦п╧ )

AU> declare-- п╩п╬п╨п╟п╩я▄п╫я▀п╣ п╬п©п╦я│п╟п╫п╦я▐begin-- п©п╬я│п╩п╣п╢п╬п╡п╟я┌п╣п╩я▄п╫п╬я│я┌я▄

AU> п╦п╫я│я┌я─я┐п╨я├п╦п╧exeption-- п╬п╠я─п╟п╠п╬я┌я┤п╦п╨п╦ п╦я│п╨п╩я▌я┤п╣п╫п╦п╧end;

 

п╖п╟я│я┌п╬ п╦я│п©п╬п╩я▄п╥я┐п╣я┌я│я▐, п╫п╟п©я─п╦п╪п╣я─, я┌п╟п╨п╟я▐ п╨п╬п╫я│я┌я─я┐п╨я├п╦я▐

declare

X : Some_Array (1 .. N);

begin

...

end;

 

п╜я┌п╬ п©п╬п╥п╡п╬п╩я▐п╣я┌ п╡я▀п╢п╦п╩п╦я┌я▄ п╪п╟я│я│п╦п╡ (п╦п╩п╦ п╢я─я┐пЁп╬п╧ п╬п╠я┼п╣п╨я┌

п╥п╟я─п╟п╫п╣п╣ п╫п╣п╦п╥п╡п╣я┌я│п╫п╬пЁп╬ я─п╟п╥п╪п╣я─п╟) п╡ я│я┌п╣п╨п╣, я┤я┌п╬ п╦п╥п╠п╟п╡п╩я▐п╣я┌

п╬я┌ п╫п╣п╬п╠я┘п╬п╢п╦п╪п╬я│я┌п╦ п╡я▀п╢п╣п╩я▐я┌я▄ п╣пЁп╬ п╡ п╨я┐я┤п╣ п╦ п╥п╟я┌п╣п╪ я┐п╫п╦я┤я┌п╬п╤п╟я┌я▄.

 

 

я┌.п╣. п©п╬я│п╩п╣ end X я┐п╤п╣ п╫п╣ п╠я┐п╢п╣я┌ я│я┐я┴п╣я│я┌п╡п╬п╡п╟я┌я▄?

--

п║ я┐п╡п╟п╤п╣п╫п╦п╣п╪,

п░п╩п╣п╨я│п╣п╧ п╝. пёп╩п╟я│п╣п╡п╦я┤

(A.STAKANOV)

http://www.livejournal.com/users/a_stakanov/

Hello!

 

On Thu, 11 Aug 2005, Aleksey Ulasevich wrote:

 

Часто используется, например, такая конструкция

declare

X : Some_Array (1 .. N);

begin

...

end;

 

Это позволяет выдилить массив (или другой объект

заранее неизветсного размера) в стеке, что избавляет

от необходимости выделять его в куче и затем уничтожать.

 

 

 

т.е. после end X уже не будет существовать?

 

В этом и прелесть данной конструкции!

 

Sincerely yours Cyril Sazonov

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

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