Форум: "Основная";
Текущий архив: 2002.12.19;
Скачать: [xml.tar.bz2];
ВнизПередаю 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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c