![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Локальные константы подпрограмм
TStas © (2010-06-07 19:57:00)Когда подпрограмма работает, все локальные переменные копируются в стек и при рекурсии каждый экземпляр подпрограммы пользуется своими переменными.
А если в подпрограмме есть локальные константы, для них создаются экземпляры или нет?
По логике не должны, зачем в стек что-то лишнее пихить, но любопытно узнать, как на самом деле.
begin...end (2010-06-24 10:27:00) [1]> TStas (23.06.10 23:10) [20]
Компилятор в данном случае следит только за тем, чтобы внутри Proc значение N не менялось непосредственно, путём присваивания. А косвенно (записав что-либо по адресу @N) изменить это значение вполне можно (другой вопрос, нужно ли?) Да и не всегда получение адреса означает, что по этому адресу в памяти будут что-то менять - см. [21].
RWolf (2010-06-24 09:32:00) [2]
> TStas (23.06.10 23:10) [20]
почему бы нет? может, программист захочет вычислить какой-то внутренний адрес внутри 10-байтного числа, переданного по ссылке.
TStas (2010-06-23 23:10:00) [3]А вот ещё вопрос про константы. Например Procedure Proc(const N: Extended);
var P: Pointer;
Begin
P := @N; //Для чего это разрешено?
Ведь если параметр обохзван константой, зачем на него разрешать брать указатель?
Anatoly Podgoretsky (2010-06-09 07:35:00) [4]> Германн (09.06.2010 01:38:18) [18]
Константы (постоянные), которые у них не совсем постоянные.
Германн (2010-06-09 01:38:00) [5]
> Anatoly Podgoretsky © (08.06.10 09:30) [9]
>
> > Германн (08.06.2010 01:56:08) [8]
>
> Они хотели сделать инициализированные переменные, у них получились
> только
> псевдо константы. А грубо говоря они сели в лужу.
>
Честно говоря не понял ничего, кроме "они сели в лужу". Но почему сели? В какую лужу? Так и не понял.
И тем более не понял
> Leonid Troyanovsky © (07.06.10 22:34) [5]
При чём тут msdn?
_Юрий (2010-06-08 22:45:00) [6]
> Leonid Troyanovsky © (08.06.10 21:35) [16]
> По одежке ж встречают :)
Ну так... программисты весьма часто одеты, мягко говоря, небрежно :-)
Leonid Troyanovsky (2010-06-08 21:35:00) [7]
> _Юрий © (08.06.10 21:23) [14]
> С другой стороны, это совершенно естественно и нормально
Не совсем, бо читают оное описалово отнюдь не двоечники.
По одежке ж встречают :)
--
Regards, LVT.
Leonid Troyanovsky (2010-06-08 21:28:00) [8]
> Leonid Troyanovsky © (08.06.10 21:13) [13]
Вот, уж если посчастливилось быть #13, то имею право предложить
собрать коллекцию кунштюков by Borland (&etc.), из хелпов
(и прочих официальных описалов).
Я даже надеюсь, что АП найдет подобной инфе нужное место на своем
сайте, в случае, конечно, что оная пройдет, хотя бы, местное горнило.
--
Regards, LVT.
_Юрий (2010-06-08 21:23:00) [9]
> Leonid Troyanovsky © (08.06.10 21:13) [13]
С другой стороны, это совершенно естественно и нормально - что классные программисты не хотят сами писать документацию. Не любят они это дело, да и не умеют в основном. А двоечник небось лишний раз боится переспросить программиста, в приличной конторе можно же по голове получить за отвлекание такого важного сотрудника :-) Вот и имеем, что имеем
Leonid Troyanovsky (2010-06-08 21:13:00) [10]
> _Юрий © (08.06.10 21:02) [12]
> Ладно бы ее только двоечники писали, было бы полбеды, так
> ее в большой части пишет автоматический генератор, со статьями
У двоечников случается и явный бред, на манер использования
переменных форм. Но, нет желания ворошить, бо, могут за язык
схватить, а искать в оных справках весьма затруднительно ;)
--
Regards, LVT.
_Юрий (2010-06-08 21:02:00) [11]
> А справки по дельфи писали (и пишут) двоечники
Ладно бы ее только двоечники писали, было бы полбеды, так ее в большой части пишет автоматический генератор, со статьями типа:
"Это метод <имя метода>"
и всё.
Leonid Troyanovsky (2010-06-08 20:49:00) [12]
> Плохиш © (08.06.10 20:28) [10]
> > > с каких щей недокументированная, очень даже документированная
> > Намедни искал инфу в msdn и оказалось, вдруг, что документировано
> > оно осталось лишь на итальянском.
> В msdn есть справка по делфи?
Нет. Я сказал лишь о том, что сегодня - оно документированно,
а завтра - только на итальянском (и только по недосмотру, IMHO).
А справки по дельфи писали (и пишут) двоечники, которым не досталось
участие в кодинге, IMHO. Сравнивать ее с msdn - смысл небольшой.
--
Regards, LVT.
Плохиш (2010-06-08 20:28:00) [13]
> Leonid Troyanovsky © (07.06.10 22:34) [5]
>
>
> > Palladin © (07.06.10 22:25) [4]
>
> > с каких щей недокументированная, очень даже документированная
>
> Намедни искал инфу в msdn и оказалось, вдруг, что документировано
> оно осталось лишь на итальянском.
В msdn есть справка по делфи?
Anatoly Podgoretsky (2010-06-08 09:30:00) [14]> Германн (08.06.2010 01:56:08) [8]
Они хотели сделать инициализированые переменные, у них получились только
псевдо константы. А грубо говоря они сели в лужу.
Германн (2010-06-08 01:56:00) [15]
> Leonid Troyanovsky © (07.06.10 22:56) [7]
>
>
> > Anatoly Podgoretsky © (07.06.10 22:48) [6]
>
> > Изменяемые константы, великое изобретение Борланда.
>
> Полагаю, что плагиат, но пользуются повсеместно
> и не только Борландом :)
Вот только что они все под этим понимают?
Ну до прочих мне как-то пофигу. А вот что под типизированными константами сейчас подразумевает Борланд? Ну понятно (отчасти) желание сохранить совместимость снизу-вверх. Больше не понятно ничего.
Для чего они были изначально придуманы?
Leonid Troyanovsky (2010-06-07 22:56:00) [16]
> Anatoly Podgoretsky © (07.06.10 22:48) [6]
> Изменяемые константы, великое изобретение Борланда.
Полагаю, что плагиат, но пользуются повсеместно
и не только Борландом :)
--
Regards, LVT.
Anatoly Podgoretsky (2010-06-07 22:48:00) [17]> Leonid Troyanovsky (07.06.2010 22:34:05) [5]
Изменяемые константы, великое изобретение Борланда.
Leonid Troyanovsky (2010-06-07 22:34:00) [18]
> Palladin © (07.06.10 22:25) [4]
> с каких щей недокументированная, очень даже документированная
Намедни искал инфу в msdn и оказалось, вдруг, что документировано
оно осталось лишь на итальянском.
В иных языцах успели вытравить, гады :)
--
Regards, LVT.
Palladin (2010-06-07 22:25:00) [19]
> А если в подпрограмме есть локальные константы, для них
> создаются экземпляры или нет?
Константа является константой, это не переменная.
Когда пишется
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.
инспектор (2010-06-07 21:46:00) [20]
> А если в подпрограмме есть локальные константы, для них
> создаются экземпляры или нет?
нет, константы создаются один раз, а локальность объявление влияет только на область видимости. Все видно в окне CPU