Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Как определить что переданный в функцию объект ещё не создан? [D7, XP]


Страницы:   1 2

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; ???

У меня не проходит. Что я делал не так?
Пример выглядит именно так как написано.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо