Форум: "Начинающим";
Текущий архив: 2010.09.19;
Скачать: [xml.tar.bz2];
ВнизЛокальные константы подпрограмм Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.005 c