![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Взбесившийся указатель [D6, Win2k]
VDen © (2002-06-12 20:17:00)Есть указатель - глобальный, в Initialization модуля он обnilяется,затем начинает указывать на какой-то объект.
После этого вызывается процедура, где этот указатель используется и программа намертво виснет.
Как выяснилось указатель при входе в процедуру просто уничтожается. Такого не было пока не расставил комментарии в тексте программы(прямо полтергейст какой-то). Объясните, пожалуйста, почему и отчего так происходит.
Виктор Щербаков (2002-06-13 11:36:00) [1]Если BegL объявлена как статическая, то в строчке
BegL:=nil;
и необходимости-то нет.
А вот функцию Createlogic я б помучил отладчиком. Ну это для начала.
Игорь Шевченко (2002-06-13 11:23:00) [2]
> BegL:=nil;
> BegL:=CreateLogic;
Это на случай, если первой или второе присваивание не сработает ? :-)
Digitman (2002-06-13 11:15:00) [3]Чудес не бывает !
Предже чем выяснять детали касаемые собственно вопроса, поясни-ка, что это за форма такая ViewForm, которая в момент работы блока инициализации (!) модуля уже существует ? Ты же ссылаешься на нее в строчке Parent:=ViewForm ! Или это вообще не форма, а несто иное ?
Где, статически ли и как объявлена переменная BegL ? Где, в какой момент и как вызывается GetChain() ?
Игорь Шевченко (2002-06-13 10:56:00) [4]Ночной кошмар программиста :-)
VDen (2002-06-13 10:54:00) [5]Function Createlogic: PTLogic;
begin
result:=TLogic.Create;
with result do begin
Name:="Log0";
Parent:=ViewForm;
SetBounds(25,25,30,30);
end;
end;
...
Initialization
BegL:=nil;
BegL:=CreateLogic;
Виктор Щербаков (2002-06-13 09:52:00) [6]Еще неплохо посмотреть на код, где:
> в Initialization модуля он обnilяется,затем начинает указывать
> на какой-то объект.
VDen (2002-06-13 09:47:00) [7]
function GetChain(num: integer): PTLogic;{это класс, на объект которого указывает BegL}
var i: integer;
p: PTLogic; //Дополнительный указатель
begin
P := BegL; //Здесь обнаруживаю, что BegL ни на что не указывает
if num > EndL^.GetIndex then AViol("Main.pas, GetChain proc");
for i := 2 to num do
p := p^.SimplePtr;// указатель на следующий элемент цепочки
Result := p;
end;
Вот код. Извините что только сегодня.
YurijNT (2002-06-12 22:28:00) [8]Бывают загадки природы и у Delphi. В таких случаях я выясняю на каком операторе виснет (вставляю тросировочные выводы) и делаю "пробуксовку" программе (Delay или Application.ProcessMessage).
Но в любом случае брось кусок кода - возможно ошибка.
Anatoly Podgoretsky (2002-06-12 21:23:00) [9]Страшные вещи ты рассказываешь
Sasha9 (2002-06-12 21:11:00) [10]кусок кода, если можно