Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
6-61724
0pavel0
2002-10-19 02:24
2002.12.19
Как сделать что-б прога сама обнаружила коннект?


1-61536
LazorenkoX
2002-12-09 14:41
2002.12.19
Помогите с MDI PLEASE!!!


1-61517
Cherepovets
2002-12-09 09:48
2002.12.19
CRC


3-61414
stasSSW
2002-12-03 10:11
2002.12.19
БД


4-61891
Pumpkin
2002-11-04 23:09
2002.12.19
Как в Delphi-шной программе заменить STUB





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский