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

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

Передаю 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]

А по-моему как раз попадешь...


Наверх

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