Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.05.20;
Скачать: CL | DM;

Вниз

Как определить что переданный в функцию объект ещё не создан?   Найти похожие ветки 

 
MegaVolt ©   (2007-04-26 10:55) [0]

Как в F2 определить что переданный объект ещё не создан.

Один вариант по AV при обращении к методам объекта. Но как то не очень красиво :( Может естьболее красивые методы? Например как то проверить выделялась ли память на которую указывает объект.

Сравнивать с nil не прошло :(

procedure F1;
var
 x:TBitMap;
...
...
 F2(x);
...
...
end;

procedure F2(x:TBitMap);
begin
...
end;


 
Ega23 ©   (2007-04-26 10:57) [1]


> Сравнивать с nil не прошло :(
>


У меня проходит.


 
Плохиш ©   (2007-04-26 10:58) [2]


> Один вариант по AV при обращении к методам объекта.

это единственный вариант.


 
Ega23 ©   (2007-04-26 10:58) [3]

procedure F2(var x:TBitMap);
begin
 if x=nil then x := TBitmap.Create;
 ....
end;


 
Плохиш ©   (2007-04-26 10:59) [4]


> Ega23 ©   (26.04.07 10:57) [1]
>
> > Сравнивать с nil не прошло :(
> >
> У меня проходит.

Так твоя правая рука знает, что делает левая ;-)


 
Ega23 ©   (2007-04-26 10:59) [5]


> Так твоя правая рука знает, что делает левая ;-)


Всегда!   :)


 
StriderMan ©   (2007-04-26 10:59) [6]

Assigned(x) ?

только х тогда рекомендуется nil"ом проинициализировать. А если он где-то разрушается, то делать FreeAndNil(x);


 
Плохиш ©   (2007-04-26 11:00) [7]


> Ega23 ©   (26.04.07 10:58) [3]

Разве он где-то говорил, что он инициализирует передаваемый указатель? В [0] он сказал обратное :-)


 
Ega23 ©   (2007-04-26 11:02) [8]


> Разве он где-то говорил, что он инициализирует передаваемый
> указатель? В [0] он сказал обратное :-)


Да я вообще не понимаю, чё он хочет...


 
_Аноним ©   (2007-04-26 11:11) [9]

Дада, некрасиво проверять, ожидая AV
это тоже самое, как проверять - не забыл ли разрядить ружье после охоты, пытаясь выстрелить из него в потолок.
А вдруг осечка?


 
stakan ©   (2007-04-26 11:16) [10]


> Сравнивать с nil не прошло :(
>
> procedure F1;
> var
>  x:TBitMap;
> ...
> ...
>  F2(x);
> ...
> ...
> end;

У меня сравнение с nil проходит если с х вообще ничего не делать:

procedure TForm2.Button1Click(Sender: TObject);
var
 x: TMy;
begin
 F(X);
end;

х на момент вызова = nil.
И насчёт AV: Если метод не обращается к полям объекта, то AV  не будет.


 
begin...end ©   (2007-04-26 11:18) [11]

> MegaVolt ©   (26.04.07 10:55)

> Как в F2 определить что переданный объект ещё не создан.

Ввести переменную для индикации существования объекта и самостоятельно изменять её значение при создании и разрушении объекта. Этой переменной может быть, как уже сказали, и сама ссылка на объект -- в этом случае нужно будет позаботиться (опять же, самостоятельно) о том, чтобы для ещё не созданного или уже разрушенного объекта она была равна nil.

> Один вариант по AV при обращении к методам объекта.

Это ошибочный вариант. Во-первых, если метод написан корректно, не является виртуальным или динамическим (и не вызывает такие методы) и не содержит обращений к полям объекта, он не приведёт к AV, будучи вызванным у объекта, который в данный момент не существует. Во-вторых, даже если метод будет обращаться к полям, вовсе не обязательно, что адреса полей, которые вычисляются на основе значения ссылки на объект, не окажутся относящимися к "чужим" областям памяти с нужными правами доступа -- а значит, и в этом случае нет гарантии, что возникнет AV.


 
MegaVolt ©   (2007-04-26 11:21) [12]

Т.е.
var
x:TBitMap;

аналогично
x:=nil; ???

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


 
Плохиш ©   (2007-04-26 11:22) [13]


> Что я делал не так?

Ты делаешь ошибку в 17й строке.


 
stakan ©   (2007-04-26 11:25) [14]


> > Один вариант по AV при обращении к методам объекта.
>
> Это ошибочный вариант. Во-первых, если метод написан корректно,
>  не является виртуальным или динамическим (и не вызывает
> такие методы) и не содержит обращений к полям объекта, он
> не приведёт к AV, будучи вызванным у объекта, который в
> данный момент не существует. Во-вторых, даже если метод
> будет обращаться к полям, вовсе не обязательно, что адреса
> полей, которые вычисляются на основе значения ссылки на
> объект, не окажутся относящимися к "чужим" областям памяти
> с нужными правами доступа -- а значит, и в этом случае нет
> гарантии, что возникнет AV.
>


Как всегда, исчерпывающий ответ.


 
begin...end ©   (2007-04-26 11:26) [15]

> MegaVolt ©   (26.04.07 11:21) [12]

Если x является локальной переменной, то её начальное значение будет случайным.


 
MegaVolt ©   (2007-04-26 11:35) [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;

Он выдаёт неравен.


 
ЮЮ ©   (2007-04-26 11:44) [17]

А на такую мелочь ты не смотришь?

[Warning] Unit1.pas(37): Variable "x" might not have been initialized

Или её сложно найти среди сотен Hint-ов и Warning-ов? :)


 
begin...end ©   (2007-04-26 11:44) [18]

> MegaVolt ©   (26.04.07 11:35) [16]

> Есть ли другие варианты?

Есть. См. [11], первый абзац. Других вариантов у меня, увы, нет.

> Он выдаёт неравен.

В [15] написано, почему.


 
MegaVolt ©   (2007-04-26 11:55) [19]

ЮЮ
>А на такую мелочь ты не смотришь?

Задача другая. Читай [16]

Кстати на счёт варнингов а ты пробовал скомпилить что нибудь из генофонда? Там столько варнингов вылазит что начинаешь сомневатся в их полезности :(

begin...end

А можно ли как то проверить выделялась ли память на которою ссылается переменная?


 
ЮЮ ©   (2007-04-26 12:07) [20]

>Задача другая. Читай [16]

Понятно... Только лечение всегда накладнее профилактики.

>Т.е. я хочу написать функцию которая сама бы ругалась что в неё не так предали
Она и так выругается. Или AV недостаточно сильное ругательство? :)


 
Плохиш ©   (2007-04-26 12:10) [21]

Хм, начался третий круг...


 
MegaVolt ©   (2007-04-26 12:11) [22]

ЮЮ
>Понятно... Только лечение всегда накладнее профилактики.

Знаю :(

>Она и так выругается. Или AV недостаточно сильное ругательство? :)

Сильное. Функцию планируется иссспользовать при отладки и поэтому хотелось бы быть в ней уверенной на все 100%. И если уж сделана глупость то хоть функция напишет в чём именно. Т.е. просто экономия времени на поиски AV по глупости.


 
Плохиш ©   (2007-04-26 12:15) [23]

И если уж сделана глупость то хоть функция напишет в чём именно. Т.е. просто экономия времени на поиски AV по глупости.

Хорошая "дурь", отсыпь немного...


 
MegaVolt ©   (2007-04-26 12:20) [24]

>Хорошая "дурь", отсыпь немного...

Немогу самому неватает :))


 
ЮЮ ©   (2007-04-26 12:20) [25]

Хм, начался третий круг...
Хорошая "дурь", отсыпь немного...


С нею и всё девять пройдём :)


 
Ega23 ©   (2007-04-26 13:29) [26]

Блин, ну когда четвёртый круг уже начнётся?


 
Anatoly Podgoretsky ©   (2007-04-26 22:55) [27]

> Ega23  (26.04.2007 13:29:26)  [26]

Какой еще четвертый, когда этот вопрос он уже несколько лет назад задавал.

--


 
{RASkov} ©   (2007-04-27 00:43) [28]

Боги все видят и, самое главное, помнят.... И, при удобном случае, Анатолию сообщают :)


 
Германн ©   (2007-04-27 00:54) [29]


> {RASkov} ©   (27.04.07 00:43) [28]
>
> Боги все видят и, самое главное, помнят.... И, при удобном
> случае, Анатолию сообщают :)

Ты уверен, что ему кто-то сообщает? А может он сам всё видит? :-)


 
{RASkov} ©   (2007-04-27 01:28) [30]

> [29] Германн ©   (27.04.07 00:54)
> А может он сам всё видит? :-)

Точно.... а потом БогАм рассказывает ;)


 
Германн ©   (2007-04-27 01:37) [31]


> {RASkov} ©   (27.04.07 01:28) [30]
>
> > [29] Германн ©   (27.04.07 00:54)
> > А может он сам всё видит? :-)
>
> Точно.... а потом БогАм рассказывает ;)
>

В Среднеземь(е,и) богов не было, имхо :)



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

Текущий архив: 2007.05.20;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.056 c
15-1176199472
vasIZmax
2007-04-10 14:04
2007.05.20
Тестирование... на знание


2-1178034619
aht
2007-05-01 19:50
2007.05.20
DB Chart


2-1177648851
sergeyst
2007-04-27 08:40
2007.05.20
Совместная работа над проектом


15-1176901225
parus
2007-04-18 17:00
2007.05.20
PHP


1-1174552782
Cooller
2007-03-22 11:39
2007.05.20
try finally end