![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передаю nil в кач. параметра процедуры, а в процедуре не nil [D6, WinXP]
Diouzshev © (2002-12-10 11:55:00)есть такая процедура (info : дерево я строю):
procedure SomeProc(Node : TNode);
var
ParentID : integer;
begin
// if not Assigned(Node) then {1}
if Node = nil then {1}
ParentID := 0{2}
else {3}
ParentID := Integer(Node.Data); {4}
........
end;
так вот, если я пишу
SomeProc( nil);
или что-нить ещё, то я никогда не попаду в строку {2}
мне это непонятно :(
может знает кто, как это победить?
han_malign (2002-12-10 14:51:00) [1]try except end - IMHO криво: в случае если исключения нет то только лишние 3 push DWORD + mov DWORD + 3 pop DWORD + jmp (сохранить EBP, сохранить точку возврата(на секцию обработки), сохранить старый ESP(из FS:[0]($5FFF:0)) и прописать текущий по абсолютному адресу(FS:[0]($5FFF:0)), восстановить как было, прыгнуть через секцию обработки), а вот jmp @HandleAnyException, если исключение возникло - это уже пакость.
Diouzshev (2002-12-10 14:33:00) [2]дык, не маленький!!!
правда токо хинт смотрел, но хватило "Node = ()", это значит, что переменная определена (Assigned(Node) = True), вот и полез в форум...
Anatoly Podgoretsky (2002-12-10 14:29:00) [3]Лучше поставь точки останова, хотя бы как первый шаг
Diouzshev (2002-12-10 14:25:00) [4]Народ пока не парьтесь я проверю
а) Конфликт имен
б) {$O-}
и напишу что получится завтра!
Diouzshev (2002-12-10 14:22:00) [5]2 VaS © (10.12.02 12:39)
>Если TNode - класс, то да, Node является указателем на объект.
Ага, именно, а в случае с var указателем на указатель, но var нет :(
Юрий Федоров © (10.12.02 13:01)
>Тут дело в какой-то опечатке или конфликте имен, или в
>оптимизации (han_malign © (10.12.02 12:17)), в принципе
>должно работать
вот проверял все, пока не нашел, думал, может кто сталкивался...
han_malign © (10.12.02 13:22)
дык, это почти ничем не отличается от
if not Assigned(Node) then {1}
ParentID := 0 {2}
else {3}
ParentID := Integer(Node.Data); {4}
и даст тот же AV. Упихивать все это в try...except?
я уже об этом писАл... и if становится ненужен...
han_malign (2002-12-10 13:22:00) [6]Попробуй финт ушами:
ParentID:=0;
if(Assigned(Node))then ParendID:=integer(Node.Data);
Юрий Федоров (2002-12-10 13:01:00) [7]>>VaS © (10.12.02 12:39)
"По значению" в данном случае передается указатель(Pointer), так что вполне можно так передавать экземпляры классов, var параметр нужен, если адрес объекта в процессе выполнения процедуры изменился(например его разрушили и создали заново).
Тут дело в какой-то опечатке или конфликте имен, или в оптимизации (han_malign © (10.12.02 12:17)), в принципе должно работать
VaS (2002-12-10 12:39:00) [8]Если TNode - класс, то да, Node является указателем на объект. Передать его по значению нельзя (только вручную клонировав).
Diouzshev (2002-12-10 12:34:00) [9]2 VaS © (10.12.02 12:28)
кода щас, к сожалению, нет дома он...
Придется пошаманить с буковкой A и пр.
завтра если что переспрошу :)
такое ощущение, что вся эта беда работает как
procedure SomeProc( varNode : TNode);
VaS (2002-12-10 12:31:00) [10]А еще лучше :) встань отладчиком на begin твоей процедуры и посмотри что действительно передано в параметр и откуда (стэк).
VaS (2002-12-10 12:28:00) [11]Извини, не заметил насчет чистого nil.
Что-то мыслей нет :( Ну, поменяй имя параметра на на ANode...
А лучше побольше кода покажи.
Diouzshev (2002-12-10 12:23:00) [12]2 VaS © (10.12.02 12:15)
ну дык, я же nil передаю, какой там объект?
(а за FreeAndNil - спасибо, я гдето видел, забыл, не мог найти и мучался %) )
2 han_malign © (10.12.02 12:17)
да используется, и у меня щас работает так:
procedure SomeProc(Node : TNode);
var
ParentID : integer;
begin
try
ParentID := Integer(Node.Data);
except
ParentID := 0
end;
........
end;
но мне так не хочется %( т.к. в процессе работы, создается лишний, никому не нужный, объект Exception
han_malign (2002-12-10 12:17:00) [13]А ParentID ниже используется?
Если нет то компилятор эту строку просто выкинет при оптимизации.
{$O-}
VaS (2002-12-10 12:15:00) [14]Значит у тебя объект по адресу Node уже уничтожен, а ссылка на него осталась. Очищай ссылки (напр. FreeAndNil() вместо Free()).
Diouzshev (2002-12-10 12:13:00) [15]2 Виктор Щербаков © (10.12.02 12:01)
и я так думал когда писАл, а компилятор говорит обратное и Access violation at 00000004 :(
2 Skier © (10.12.02 12:04)
а есть принципиальная разница?
Skier (2002-12-10 12:04:00) [16]>Diouzshev
И потом что это за тип TNode, может
всё-таки T TreeNode &?
Виктор Щербаков (2002-12-10 12:01:00) [17]А по-моему как раз попадешь...