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

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.041 c
6-1163677053
dima_shapkin
2006-11-16 14:37
2007.05.20
IP


9-1150619554
Ricks
2006-06-18 12:32
2007.05.20
Бильярд...


15-1177331169
NewUser2
2007-04-23 16:26
2007.05.20
Найти....


4-1166529534
cktor
2006-12-19 14:58
2007.05.20
IExplorer


2-1178087507
DelphiLexx
2007-05-02 10:31
2007.05.20
Динамический двумерный массив





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