Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.004 c
11-1216304360
neccasalmor
2008-07-17 18:19
2010.09.19
как в компоненте montcalendar выделить интервал дней?


15-1276582543
12
2010-06-15 10:15
2010.09.19
Мысль. Сельское хоз-во. Давление и полив.


15-1276780683
shaman
2010-06-17 17:18
2010.09.19
объектно-ориентированное програмирование


2-1277491678
New555
2010-06-25 22:47
2010.09.19
if Key = VK_F1 then


2-1276942888
TStas
2010-06-19 14:21
2010.09.19
Засечь вставку флешки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский