Форум: "Прочее";
Текущий архив: 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