![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как определить что переданный в функцию объект ещё не создан? [D7, XP]
MegaVolt © (2007-04-26 10:55:00)Как в F2 определить что переданный объект ещё не создан.
Один вариант по AV при обращении к методам объекта. Но как то не очень красиво :( Может естьболее красивые методы? Например как то проверить выделялась ли память на которую указывает объект.
Сравнивать с nil не прошло :(
procedure F1;
var
x:TBitMap;
...
...
F2(x);
...
...
end;
procedure F2(x:TBitMap);
begin
...
end;
Германн (2007-04-27 01:37:00) [1]
> {RASkov} © (27.04.07 01:28) [30]
>
> > [29] Германн © (27.04.07 00:54)
> > А может он сам всё видит? :-)
>
> Точно.... а потом БогАм рассказывает ;)
>
В Среднеземь(е,и) богов не было, имхо :)
{RASkov} (2007-04-27 01:28:00) [2]> [29] Германн © (27.04.07 00:54)
> А может он сам всё видит? :-)
Точно.... а потом БогАм рассказывает ;)
Германн (2007-04-27 00:54:00) [3]
> {RASkov} © (27.04.07 00:43) [28]
>
> Боги все видят и, самое главное, помнят.... И, при удобном
> случае, Анатолию сообщают :)
Ты уверен, что ему кто-то сообщает? А может он сам всё видит? :-)
{RASkov} (2007-04-27 00:43:00) [4]Боги все видят и, самое главное, помнят.... И, при удобном случае, Анатолию сообщают :)
Anatoly Podgoretsky (2007-04-26 22:55:00) [5]> Ega23 (26.04.2007 13:29:26) [26]
Какой еще четвертый, когда этот вопрос он уже несколько лет назад задавал.
--
Ega23 (2007-04-26 13:29:00) [6]Блин, ну когда четвёртый круг уже начнётся?
ЮЮ (2007-04-26 12:20:00) [7]Хм, начался третий круг...
Хорошая "дурь", отсыпь немного...
С нею и всё девять пройдём :)
MegaVolt (2007-04-26 12:20:00) [8]>Хорошая "дурь", отсыпь немного...
Немогу самому неватает :))
Плохиш (2007-04-26 12:15:00) [9]И если уж сделана глупость то хоть функция напишет в чём именно. Т.е. просто экономия времени на поиски AV по глупости.
Хорошая "дурь", отсыпь немного...
MegaVolt (2007-04-26 12:11:00) [10]ЮЮ
>Понятно... Только лечение всегда накладнее профилактики.
Знаю :(
>Она и так выругается. Или AV недостаточно сильное ругательство? :)
Сильное. Функцию планируется иссспользовать при отладки и поэтому хотелось бы быть в ней уверенной на все 100%. И если уж сделана глупость то хоть функция напишет в чём именно. Т.е. просто экономия времени на поиски AV по глупости.
Плохиш (2007-04-26 12:10:00) [11]Хм, начался третий круг...
ЮЮ (2007-04-26 12:07:00) [12]>Задача другая. Читай [16]
Понятно... Только лечение всегда накладнее профилактики.
>Т.е. я хочу написать функцию которая сама бы ругалась что в неё не так предали
Она и так выругается. Или AV недостаточно сильное ругательство? :)
MegaVolt (2007-04-26 11:55:00) [13]ЮЮ
>А на такую мелочь ты не смотришь?
Задача другая. Читай [16]
Кстати на счёт варнингов а ты пробовал скомпилить что нибудь из генофонда? Там столько варнингов вылазит что начинаешь сомневатся в их полезности :(
begin...end
А можно ли как то проверить выделялась ли память на которою ссылается переменная?
begin...end (2007-04-26 11:44:00) [14]> MegaVolt © (26.04.07 11:35) [16]
> Есть ли другие варианты?
Есть. См. [11], первый абзац. Других вариантов у меня, увы, нет.
> Он выдаёт неравен.
В [15] написано, почему.
ЮЮ (2007-04-26 11:44:00) [15]А на такую мелочь ты не смотришь?
[Warning] Unit1.pas(37): Variable 'x' might not have been initialized
Или её сложно найти среди сотен Hint-ов и Warning-ов? :)
MegaVolt (2007-04-26 11:35:00) [16]begin...end
>Ввести переменную для индикации существования объекта
Это понятно. Задача сделать защиту от дурака. Т.е. я хочу написать функцию которая сама бы ругалась что в неё не так предали. Т.е. власти над тем что написано вне F2 у меня нет.
>AV Это ошибочный вариант.
Согласен. Есть ли другие варианты?
Плохиш
>Ты делаешь ошибку в 17й строке.
Ну держи код:
procedure F2(x:TBitMap);
begin
if x<>nil
then ShowMessage('Неравно nil')
else ShowMessage('Равно nil');
end;
procedure TForm1.Button1Click(Sender: TObject);
var
x:TBitMap;
begin
F2(x);
end;
Он выдаёт неравен.
begin...end (2007-04-26 11:26:00) [17]> MegaVolt © (26.04.07 11:21) [12]
Если x является локальной переменной, то её начальное значение будет случайным.
stakan (2007-04-26 11:25:00) [18]
> > Один вариант по AV при обращении к методам объекта.
>
> Это ошибочный вариант. Во-первых, если метод написан корректно,
> не является виртуальным или динамическим (и не вызывает
> такие методы) и не содержит обращений к полям объекта, он
> не приведёт к AV, будучи вызванным у объекта, который в
> данный момент не существует. Во-вторых, даже если метод
> будет обращаться к полям, вовсе не обязательно, что адреса
> полей, которые вычисляются на основе значения ссылки на
> объект, не окажутся относящимися к "чужим" областям памяти
> с нужными правами доступа -- а значит, и в этом случае нет
> гарантии, что возникнет AV.
>
Как всегда, исчерпывающий ответ.
Плохиш (2007-04-26 11:22:00) [19]
> Что я делал не так?
Ты делаешь ошибку в 17й строке.
MegaVolt (2007-04-26 11:21:00) [20]Т.е.
var
x:TBitMap;
аналогично
x:=nil; ???
У меня не проходит. Что я делал не так?
Пример выглядит именно так как написано.