Форум: "Начинающим";
Текущий архив: 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.04 c