Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.02.24;
Скачать: [xml.tar.bz2];

Вниз

Переменная в процедуре .. живучая   Найти похожие ветки 

 
Lip   (2008-01-18 19:51) [0]

Можно как-нибудь в локальной процедуре объявить переменную, так чтобы она сохраняла свое значение до конца работы программы, именно до конца работы программы, а не процедуры.
Что-то типа static переменных в С++

Заодно ещё один вопрос.
Как проверить создан ли объект?
Вот создал list := TStringList.Create; а как проверить, создан ли он уже..
например, if list. уже создан, то ...

Подскажите, пожалуйста!

Заранее спасибо!


 
Mystic ©   (2008-01-18 19:53) [1]

1. Просто объявить глобальную переменную.
2. Инициализировать значением nil, потом проверять на nil


 
Lip   (2008-01-18 19:58) [2]


> 1. Просто объявить глобальную переменную.


глобальные переменные Must Die!!!


 
Черный Шаман   (2008-01-18 20:02) [3]

Project->Options->Compiller->Assignable Checked Constants->Checked


procedure TForm1.Button1Click(Sender: TObject);
const
 sLiveVar: Integer = 0;
begin
 sLiveVar := sLiveVar + 1;
 Form1.Caption := IntToStr(sLiveVar);
end;


 
Mystic ©   (2008-01-18 20:02) [4]

> глобальные переменные Must Die!!!

А static в C++ и есть аналог глобальной переменной :)


 
Черный Шаман   (2008-01-18 20:05) [5]


> Lip   (18.01.08 19:58) [2]
>
> > 1. Просто объявить глобальную переменную.
>
> глобальные переменные Must Die!!!


Если с Initialization/Finalization то очень даже Must Live


 
homm ©   (2008-01-18 21:37) [6]

> [5] Черный Шаман   (18.01.08 20:05)
> Если с Initialization/Finalization

Initialization/Finalization  must due :)


 
Сергей Суровцев ©   (2008-01-18 21:51) [7]

>Lip   (18.01.08 19:51)  
>Можно как-нибудь в локальной процедуре объявить переменную, так чтобы
>она сохраняла свое значение до конца работы программы, именно до конца
>работы программы, а не процедуры.

>Lip   (18.01.08 19:58) [2]
>глобальные переменные Must Die!!!

Ты хочешь глобальную переменную. Но не хочешь ее. Как быть?


 
Palladin ©   (2008-01-18 22:00) [8]


> [2] Lip   (18.01.08 19:58)

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


 
ketmar ©   (2008-01-18 22:06) [9]

>[3] Черный Шаман (18.01.08 20:02)
шаман, аднака.


 
rts111 ©   (2008-01-18 22:14) [10]


> Можно как-нибудь в локальной процедуре объявить переменную,
>  так чтобы она сохраняла свое значение до конца работы


Объяви ее не после, а перед ключевым словом procedura.


 
Черный Шаман   (2008-01-18 22:55) [11]


> rts111 ©   (18.01.08 22:14) [10]
>
>
> > Можно как-нибудь в локальной процедуре объявить переменную,
>
> >  так чтобы она сохраняла свое значение до конца работы
>
>
> Объяви ее не после, а перед ключевым словом procedura.


Зачем если есть такой шаманский подход как [3] для инкапсуляции статических переменных внутри функций через типизированные константы. Это типичный хакерский метод программирования.


 
Sergey Masloff   (2008-01-18 23:01) [12]

Черный Шаман   (18.01.08 22:55) [11]
Метод есть но не хакерский а совсем наоборот.


 
korneley ©   (2008-01-18 23:47) [13]

Один мой знакомый, очень сетовал на то,что вроде локальные переменные, но описанные как типизированные константы (батюшки, бред-то какой), не принимают написанного в тексте значения на любой момент вызова процедуры/функции. Одним словом, с трубопаскаля и далее,сложилось мнение - типизированые константы есть суть глобалы. И сохранят запихнутое в них значение до конца  "работы"


 
rts111 ©   (2008-01-18 23:51) [14]


> Черный Шаман   (18.01.08 22:55) [11]


Ну если это одна константа в проекте, то да, покатит и [3].


 
Сергей Суровцев ©   (2008-01-18 23:55) [15]

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


 
korneley ©   (2008-01-19 00:04) [16]


> Как проверить создан ли объект?

Если ссылка не нил (что не гарантирует присутствия объекта), обратись к полю объекта. получишь AV - значит что-то не так...


 
rts111 ©   (2008-01-19 00:09) [17]

> Как проверить создан ли объект?

if MyObject is TMyClass then ...


 
_xxx_   (2008-01-19 00:15) [18]

procedure qwerty
$J+
const uiop:integer;
$J-
begin
...............
end;

не?


 
_xxx_   (2008-01-19 00:17) [19]

{J+}, скобочки забыл, извиняюсь


 
{RASkov} ©   (2008-01-19 00:22) [20]

В общих случаях так можно проверять:
if Obj<>nil then....
или
if Assigned(Obj) then....

но это не 100%)


 
rts111 ©   (2008-01-19 00:22) [21]


> _xxx_   (19.01.08 00:15) [18]


Блин, точно!


 
korneley ©   (2008-01-19 00:45) [22]


> В общих случаях так можно проверять...

В очень общих... Если нил после освобождения не забыли присвоить...


 
Плохиш ©   (2008-01-19 00:49) [23]


> {RASkov} ©   (19.01.08 00:22) [20]
> В общих случаях так можно проверять:
> if Obj<>nil then....
> или
> if Assigned(Obj) then....

> но это не 100%)

Масло масляное...

В случае Lip 100% не правильно определит...


 
Германн ©   (2008-01-19 00:50) [24]


> korneley ©   (18.01.08 23:47) [13]
>
> Один мой знакомый, очень сетовал на то,что вроде локальные
> переменные, но описанные как типизированные константы (батюшки,
>  бред-то какой), не принимают написанного в тексте значения
> на любой момент вызова процедуры/функции. Одним словом,
> с трубопаскаля и далее,сложилось мнение - типизированые
> константы есть суть глобалы. И сохранят запихнутое в них
> значение до конца  "работы"
>

Не понял. Поясни последнюю фразу.


 
Германн ©   (2008-01-19 00:54) [25]


> rts111 ©   (19.01.08 00:22) [21]
>
>
> > _xxx_   (19.01.08 00:15) [18]
>
>
> Блин, точно!
>

Ес-сно. Это то же самое шаманство, что и в [3]. Только без галочки, а значит "локально-глобальное". Или "глобально-локальное". Хрен их разберёт. :)


 
rts111 ©   (2008-01-19 01:01) [26]

_xxx_ - ты белый шаман


 
homm ©   (2008-01-19 01:01) [27]

> [18] _xxx_   (19.01.08 00:15)
> $J+
> const uiop:integer;
> $J-

А ты вот так вот уверенно снимаешь опцию, а ты уверен, что до тебя она стояла?


 
rts111 ©   (2008-01-19 01:04) [28]

_xxx_ - нет, ты не белый шаман


 
korneley ©   (2008-01-19 01:04) [29]

мой знакомый сокрушался тому,  что если написано внутри процедуры
const i : integer = 0;
то, как он думал, при входе в процедуру i должно (должен?) быть равно/равен нулю. А на практике получал последнее присвоенное значение, т.к. это(т) i пользовал внутри процедуры активно.
 Таки поясняю: типизированные константы = глобальные переменные с инициализацией значения на момент запуска  приложения. Независимо от места описания. Поэтому, что последнее присвоили, то и получим при очередном считывании. Пошёл за бинтами... :)))


 
Германн ©   (2008-01-19 01:17) [30]


> homm ©   (19.01.08 01:01) [27]
>
> > [18] _xxx_   (19.01.08 00:15)
> > $J+
> > const uiop:integer;
> > $J-
>
> А ты вот так вот уверенно снимаешь опцию, а ты уверен, что
> до тебя она стояла?
>

Эээ. Внутри своего модуля всяк хозяин опций компилятора. И всяк уверен. А за пределы модуля это не распространится.


 
Германн ©   (2008-01-19 01:21) [31]


> korneley ©   (19.01.08 01:04) [29]
>
> мой знакомый сокрушался тому,  что если написано внутри
> процедуры
> const i : integer = 0;
> то, как он думал, при входе в процедуру i должно (должен?
> ) быть равно/равен нулю. А на практике получал последнее
> присвоенное значение, т.к. это(т) i пользовал внутри процедуры
> активно.
>  Таки поясняю: типизированные константы = глобальные переменные
> с инициализацией значения на момент запуска  приложения.
>  Независимо от места описания. Поэтому, что последнее присвоили,
>  то и получим при очередном считывании. Пошёл за бинтами.
> .. :)))
>

Понял. Знакомый был не прав. А ты в [29] прав. Посему бинты отдай знакомому. Ему они нужней.


 
korneley ©   (2008-01-19 01:33) [32]

Про бинты - как знать... А в чем не прав? С удовольствием подправлю концепцию мироздания :)


 
Германн ©   (2008-01-19 01:46) [33]


> korneley ©   (19.01.08 01:33) [32]
>
> Про бинты - как знать... А в чем не прав?

Кто не прав? Знакомый? В том что полагал, что при входе в процедуру типизированная константа описанная в ней (процедуре) должна принимать значение написанное в коде. А на деле она (типизированная константа описанная в данной процедуре) это значение (описанное в коде) принимает только один раз при старте программы. Последующие входы в данную процедуру на её значение не влияют.


 
Германн ©   (2008-01-19 01:49) [34]


> Германн ©   (19.01.08 01:17) [30]
>
>
> > homm ©   (19.01.08 01:01) [27]
> >
> > > [18] _xxx_   (19.01.08 00:15)
> > > $J+
> > > const uiop:integer;
> > > $J-
> >
> > А ты вот так вот уверенно снимаешь опцию, а ты уверен,
>  что
> > до тебя она стояла?
> >
>
> Эээ. Внутри своего модуля всяк хозяин опций компилятора.
>  И всяк уверен. А за пределы модуля это не распространится.
>
>

Кстати те манипуляции с опциями компилятора описанные в [18] не распространятся даже за пределы той процедуры.


 
korneley ©   (2008-01-19 01:51) [35]

С формальной точки зрения, переменная, описанная внутри процедуры/функции должна хранить данные на время работы кода этой самой процедуры и не более. А  тут мы получаем неявные глобалы. Естественно, человек, читавший Вирта, в недоумениии. И все, что я могу ему сказать: есть такие штуки, как недокументированые возможности, ну, или "фичи"...


 
uw ©   (2008-01-19 01:56) [36]

Mystic ©   (18.01.08 20:02) [4]
А static в C++ и есть аналог глобальной переменной :)

void foo()
{
 static int non_global = 0;
 ...
}


 
Германн ©   (2008-01-19 02:02) [37]


> korneley ©   (19.01.08 01:51) [35]
>
> С формальной точки зрения, переменная, описанная внутри
> процедуры/функции должна хранить данные на время работы
> кода этой самой процедуры и не более. А  тут мы получаем
> неявные глобалы. Естественно, человек, читавший Вирта, в
> недоумениии. И все, что я могу ему сказать: есть такие штуки,
>  как недокументированые возможности, ну, или "фичи"...
>

Эээ. Пардон. А причем тут Вирт. Не ну мы конечно ему благодарны, но реальный язык Паскаль уже во многом ушел от того первого стандарта.
Да и кстати. Типизированные константы были нормальным явлением вплоть до Д1. В более поздних версиях они "поддерживаются для совместимости".


 
rts111 ©   (2008-01-19 02:06) [38]


> Германн ©   (19.01.08 01:49) [34]


> Кстати те манипуляции с опциями компилятора описанные в
> [18] не распространятся даже за пределы той процедуры.


Что-то у меня распространяются, сейчас проверил:


procedure Tw0.Button1Click(Sender: TObject);
{$j+}
const
rrr :integer = 10;
begin
beep;
end;

procedure Tw0.Button2Click(Sender: TObject);
const
rrr :integer = 10;
begin
rrr := rrr+1;
beep;
end;


 
rts111 ©   (2008-01-19 02:09) [39]


> rts111 ©   (19.01.08 02:06) [38]


Т.е. если глобально стоит $j+ и сделать так:

> [18] _xxx_   (19.01.08 00:15)
> $J+
> const uiop:integer;
> $J-

то, далее в модуле будет уже $J-


 
Германн ©   (2008-01-19 02:33) [40]


> rts111 ©   (19.01.08 02:06) [38]
>
>


> ts111 ©   (19.01.08 02:09) [39]
>
>

Завтра(сегодня) проверю, если понадобится. Сейчас - занят. Нет времени.



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

Форум: "Прочее";
Текущий архив: 2008.02.24;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.044 c
15-1200851799
Alex_xelA
2008-01-20 20:56
2008.02.24
Модель предметной области


15-1200844425
Мистер Шок
2008-01-20 18:53
2008.02.24
сплэшь-скрин как в Фотошопе


8-1173158554
OlegM
2007-03-06 08:22
2008.02.24
Склеить несколько WAV в один


2-1201537907
oleg_teacher
2008-01-28 19:31
2008.02.24
out of memory


15-1200733009
Vernutoring
2008-01-19 11:56
2008.02.24
asm - ошибка...





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский