Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2010.09.19;
Скачать: CL | DM;

Вниз

Локальные константы подпрограмм   Найти похожие ветки 

 
TStas   (2010-06-07 19:57) [0]

Когда подпрограмма работает, все локальные переменные копируются в стек и при рекурсии каждый экземпляр подпрограммы пользуется своими переменными.
А если в подпрограмме есть локальные константы, для них создаются экземпляры или нет?
По логике не должны, зачем в стек что-то лишнее пихить, но любопытно узнать, как на самом деле.


 
Jeer ©   (2010-06-07 20:04) [1]

На мой взгляд, ничего не изменилось со времен Pascal.
Локальное (var, const, proc, func) - оно навсегда и имеет приоритет перед глобальным одноименным.


 
Jeer ©   (2010-06-07 20:12) [2]

Хотя и была недокументированная фишка (в D7 точно еще работает) - значение типизированных констант ( дир. {$J+} ) сохраняется при при последующих вызовах процедурыж


 
инспектор   (2010-06-07 21:46) [3]


> А если в подпрограмме есть локальные константы, для них
> создаются экземпляры или нет?


нет, константы создаются один раз, а локальность объявление влияет только на область видимости. Все видно в окне CPU


 
Palladin ©   (2010-06-07 22:25) [4]


> А если в подпрограмме есть локальные константы, для них
> создаются экземпляры или нет?

Константа является константой, это не переменная.
Когда пишется
const
c = 5;
var
b: Integer;
begin
b := c * 10;

то компилятор сразу интерпритирует как b := 5 * 10 и тут же соптимизирует как b := 50;

ps {$J+} не рассматривается


> Хотя и была недокументированная фишка (в D7 точно еще работает

с каких щей недокументированная, очень даже документированная, по крайней мере в D6

Type Switch
Syntax {$J+} or {$J-}
{$WRITEABLECONST ON} or {$WRITEABLECONST OFF}
Default {$J-}
{$WRITEABLECONST OFF}
Scope Local
The $J directive controls whether typed constants can be modified or not. In the {$J+} state, typed constants can be modified, and are in essence initialized variables. In the {$J-} state, typed constants are truly constant, and any attempt to modify a typed constant causes the compiler to report an error.
Writeable consts refers to the use of a typed const as a variable modifiable at runtime. For example:

const

  foo: Integer = 12;
begin
   foo := 14;

end.

With $WRITEABLECONST OFF, this code produces a compile error on the assignment to the foo variable in the begin..end block.  To fix it, change the const declaration to a var declaration.

In previous versions of Delphi and Borland Pascal, typed constants were always writeable, corresponding to the {$J+} state. Old source code that uses writeable typed constants must be compiled in the {$J+} state, but for new applications it is recommended that you use initialized variables and compile your code in the {$J-} state.


 
Leonid Troyanovsky ©   (2010-06-07 22:34) [5]


> Palladin ©   (07.06.10 22:25) [4]

> с каких щей недокументированная, очень даже документированная

Намедни искал инфу в msdn и оказалось, вдруг, что документировано
оно осталось лишь на итальянском.

В иных языцах успели вытравить, гады :)

--
Regards, LVT.


 
Anatoly Podgoretsky ©   (2010-06-07 22:48) [6]

> Leonid Troyanovsky  (07.06.2010 22:34:05)  [5]

Изменяемые константы, великое изобретение Борланда.


 
Leonid Troyanovsky ©   (2010-06-07 22:56) [7]


> Anatoly Podgoretsky ©   (07.06.10 22:48) [6]

> Изменяемые константы, великое изобретение Борланда.

Полагаю, что плагиат, но пользуются повсеместно
и не только Борландом :)

--
Regards, LVT.


 
Германн ©   (2010-06-08 01:56) [8]


> Leonid Troyanovsky ©   (07.06.10 22:56) [7]
>
>
> > Anatoly Podgoretsky ©   (07.06.10 22:48) [6]
>
> > Изменяемые константы, великое изобретение Борланда.
>
> Полагаю, что плагиат, но пользуются повсеместно
> и не только Борландом :)

Вот только что они все под этим понимают?
Ну до прочих мне как-то пофигу. А вот что под типизированными константами сейчас подразумевает Борланд? Ну понятно (отчасти) желание сохранить совместимость снизу-вверх. Больше не понятно ничего.
Для чего они были изначально придуманы?


 
Anatoly Podgoretsky ©   (2010-06-08 09:30) [9]

> Германн  (08.06.2010 01:56:08)  [8]

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


 
Плохиш ©   (2010-06-08 20:28) [10]


> Leonid Troyanovsky ©   (07.06.10 22:34) [5]
>
>
> > Palladin ©   (07.06.10 22:25) [4]
>
> > с каких щей недокументированная, очень даже документированная
>
> Намедни искал инфу в msdn и оказалось, вдруг, что документировано
> оно осталось лишь на итальянском.

В msdn есть справка по делфи?


 
Leonid Troyanovsky ©   (2010-06-08 20:49) [11]


> Плохиш ©   (08.06.10 20:28) [10]

> > > с каких щей недокументированная, очень даже документированная

> > Намедни искал инфу в msdn и оказалось, вдруг, что документировано
> > оно осталось лишь на итальянском.

> В msdn есть справка по делфи?

Нет. Я сказал лишь о том, что сегодня - оно документированно,
а завтра - только на итальянском (и только по недосмотру, IMHO).

А справки по дельфи писали (и пишут) двоечники, которым не досталось
участие в кодинге, IMHO. Сравнивать ее с msdn - смысл небольшой.

--
Regards, LVT.


 
_Юрий ©   (2010-06-08 21:02) [12]


> А справки по дельфи писали (и пишут) двоечники


Ладно бы ее только двоечники писали, было бы полбеды, так ее в большой части пишет автоматический генератор, со статьями типа:

"Это метод <имя метода>"

и всё.


 
Leonid Troyanovsky ©   (2010-06-08 21:13) [13]


> _Юрий ©   (08.06.10 21:02) [12]

> Ладно бы ее только двоечники писали, было бы полбеды, так
> ее в большой части пишет автоматический генератор, со статьями

У двоечников случается и явный бред, на манер использования
переменных форм. Но, нет желания ворошить, бо, могут за язык
схватить, а искать в оных справках весьма затруднительно ;)

--
Regards, LVT.


 
_Юрий ©   (2010-06-08 21:23) [14]


> Leonid Troyanovsky ©   (08.06.10 21:13) [13]


С другой стороны, это совершенно естественно и нормально - что классные программисты не хотят сами писать документацию. Не любят они это дело, да и не умеют в основном. А двоечник небось лишний раз боится переспросить программиста, в приличной конторе можно же по голове получить за отвлекание такого важного сотрудника :-) Вот и имеем, что имеем


 
Leonid Troyanovsky ©   (2010-06-08 21:28) [15]


> Leonid Troyanovsky ©   (08.06.10 21:13) [13]

Вот, уж если посчастливилось быть #13, то имею право предложить
собрать коллекцию кунштюков by Borland (&etc.),  из хелпов
(и прочих официальных описалов).

Я даже надеюсь, что АП найдет подобной инфе нужное место на своем
сайте, в случае, конечно, что оная пройдет, хотя бы, местное горнило.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2010-06-08 21:35) [16]


> _Юрий ©   (08.06.10 21:23) [14]

> С другой стороны, это совершенно естественно и нормально

Не совсем, бо читают оное описалово отнюдь не двоечники.
По одежке ж встречают :)

--
Regards, LVT.


 
_Юрий ©   (2010-06-08 22:45) [17]


> Leonid Troyanovsky ©   (08.06.10 21:35) [16]


> По одежке ж встречают :)


Ну так... программисты весьма часто одеты, мягко говоря, небрежно :-)


 
Германн ©   (2010-06-09 01:38) [18]


> Anatoly Podgoretsky ©   (08.06.10 09:30) [9]
>
> > Германн  (08.06.2010 01:56:08)  [8]
>
> Они хотели сделать инициализированные переменные, у них получились
> только
> псевдо константы. А грубо говоря они сели в лужу.
>

Честно говоря не понял ничего, кроме "они сели в лужу". Но почему сели? В какую лужу? Так и не понял.

И тем более не понял
> Leonid Troyanovsky ©   (07.06.10 22:34) [5]

При чём тут msdn?


 
Anatoly Podgoretsky ©   (2010-06-09 07:35) [19]

> Германн  (09.06.2010 01:38:18)  [18]

Константы (постоянные), которые у них не совсем постоянные.


 
TStas   (2010-06-23 23:10) [20]

А вот ещё вопрос про константы. Например Procedure Proc(const N: Extended);
var P: Pointer;
Begin
P := @N; //Для чего это разрешено?
Ведь если параметр обохзван константой, зачем на него разрешать брать указатель?


 
RWolf ©   (2010-06-24 09:32) [21]


> TStas   (23.06.10 23:10) [20]

почему бы нет? может, программист захочет вычислить какой-то внутренний адрес внутри 10-байтного числа, переданного по ссылке.


 
begin...end ©   (2010-06-24 10:27) [22]

> TStas   (23.06.10 23:10) [20]

Компилятор в данном случае следит только за тем, чтобы внутри Proc значение N не менялось непосредственно, путём присваивания. А косвенно (записав что-либо по адресу @N) изменить это значение вполне можно (другой вопрос, нужно ли?) Да и не всегда получение адреса означает, что по этому адресу в памяти будут что-то менять - см. [21].



Страницы: 1 вся ветка

Текущий архив: 2010.09.19;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.014 c
2-1277699293
linuxoid
2010-06-28 08:28
2010.09.19
treeview &amp; memo


8-1178559147
BB2000
2007-05-07 21:32
2010.09.19
GDI+ <> canvas.copyrect


15-1277555904
Иксик
2010-06-26 16:38
2010.09.19
Прочитал Хаксли. ИШ, спасибо!


2-1276167910
dimds
2010-06-10 15:05
2010.09.19
Подключение к серверу из среды Delphi


15-1277411728
DevilDevil
2010-06-25 00:35
2010.09.19
Валидация нескольких XML по одному XSD