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

Вниз

Передаю nil в кач. параметра процедуры, а в процедуре не nil   Найти похожие ветки 

 
Diouzshev   (2002-12-10 11:55) [0]

есть такая процедура (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}
мне это непонятно :(
может знает кто, как это победить?


 
Виктор Щербаков ©   (2002-12-10 12:01) [1]

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


 
Skier ©   (2002-12-10 12:04) [2]

>Diouzshev
И потом что это за тип TNode, может
всё-таки T TreeNode &?


 
Diouzshev   (2002-12-10 12:13) [3]

2 Виктор Щербаков © (10.12.02 12:01)
и я так думал когда писАл, а компилятор говорит обратное и Access violation at 00000004 :(

2 Skier © (10.12.02 12:04)
а есть принципиальная разница?


 
VaS ©   (2002-12-10 12:15) [4]

Значит у тебя объект по адресу Node уже уничтожен, а ссылка на него осталась. Очищай ссылки (напр. FreeAndNil() вместо Free()).


 
han_malign ©   (2002-12-10 12:17) [5]

А ParentID ниже используется?
Если нет то компилятор эту строку просто выкинет при оптимизации.
{$O-}


 
Diouzshev   (2002-12-10 12:23) [6]

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


 
VaS ©   (2002-12-10 12:28) [7]

Извини, не заметил насчет чистого nil.
Что-то мыслей нет :( Ну, поменяй имя параметра на на ANode...
А лучше побольше кода покажи.


 
VaS ©   (2002-12-10 12:31) [8]

А еще лучше :) встань отладчиком на begin твоей процедуры и посмотри что действительно передано в параметр и откуда (стэк).


 
Diouzshev   (2002-12-10 12:34) [9]

2 VaS © (10.12.02 12:28)
кода щас, к сожалению, нет дома он...
Придется пошаманить с буковкой A и пр.
завтра если что переспрошу :)
такое ощущение, что вся эта беда работает как
procedure SomeProc( var Node : TNode);


 
VaS ©   (2002-12-10 12:39) [10]

Если TNode - класс, то да, Node является указателем на объект. Передать его по значению нельзя (только вручную клонировав).


 
Юрий Федоров ©   (2002-12-10 13:01) [11]

>>VaS © (10.12.02 12:39)
"По значению" в данном случае передается указатель(Pointer), так что вполне можно так передавать экземпляры классов, var параметр нужен, если адрес объекта в процессе выполнения процедуры изменился(например его разрушили и создали заново).

Тут дело в какой-то опечатке или конфликте имен, или в оптимизации (han_malign © (10.12.02 12:17)), в принципе должно работать


 
han_malign ©   (2002-12-10 13:22) [12]

Попробуй финт ушами:
ParentID:=0;
if(Assigned(Node))then ParendID:=integer(Node.Data);


 
Diouzshev   (2002-12-10 14:22) [13]

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 становится ненужен...


 
Diouzshev   (2002-12-10 14:25) [14]

Народ пока не парьтесь я проверю
а) Конфликт имен
б) {$O-}
и напишу что получится завтра!


 
Anatoly Podgoretsky ©   (2002-12-10 14:29) [15]

Лучше поставь точки останова, хотя бы как первый шаг


 
Diouzshev   (2002-12-10 14:33) [16]

дык, не маленький!!!
правда токо хинт смотрел, но хватило "Node = ()", это значит, что переменная определена (Assigned(Node) = True), вот и полез в форум...


 
han_malign ©   (2002-12-10 14:51) [17]

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, если исключение возникло - это уже пакость.



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

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

Наверх




Память: 0.5 MB
Время: 0.018 c
14-61751
MalkoLinge
2002-11-27 13:46
2002.12.19
Разработка компонет. Конопка


3-61426
Андрей Л.
2002-11-29 08:17
2002.12.19
Запись в БД


1-61679
baryjul
2002-12-08 15:15
2002.12.19
Как на панели StatusBar отобразить объект TGaude ?


3-61444
Шурик Ш
2002-11-29 14:08
2002.12.19
Роли на SQL-сервере и аутентификация через БДЕ


6-61731
Alek_1
2002-10-23 01:38
2002.12.19
E-Mail