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

Вниз

Как обойтись без Access violation?   Найти похожие ветки 

 
panov ©   (2004-08-04 21:01) [0]

1. Нажимаем кнопку и выполняем процедуру work.
  Естественно, получаем Stack overflow.

2. После этого кнопку нажимаем повторно.
  Получаем уже не Stack overflow, а Access violation.

И теперь вопрос - как избежать Access violation??

procedure Work;
begin
 with TObject.Create do
 try
   Work;
 finally
   Free;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 work;
end;


 
Fay ©   (2004-08-04 21:11) [1]

Не очень красива, но, похоже, работает

procedure Work;
var
 b : Boolean;
begin
 b := True;
 with TObject.Create do
 try
   try
     Work;
   except
     b := False;
   end;
 finally
   if b then Free;
 end;
end;


 
Fay ©   (2004-08-04 21:18) [2]

Я бы даже сказал

procedure Work;
var
 b : Boolean;
begin
 b := True;
 with TObject.Create do
   try
     try
       Work;
     except
       on E : EStackOverflow do b := False;
     end;
   finally
     if b then Free;
   end;
end;


 
panov ©   (2004-08-04 21:19) [3]

>Fay ©   (04.08.04 21:18) [2]

При повторном нажатии - AV.


 
Sergey Kaminski ©   (2004-08-04 21:24) [4]

Не знаю у меня просто скомпилированную программу выбрасывает БЕЗ всяких сообщений при первом же нажатии. Д6, WinXP


 
panov ©   (2004-08-04 21:26) [5]

В w2000 сначала Stack overflow


 
Fay ©   (2004-08-04 21:26) [6]

Понимаю, что вопрос очень дерзкий (и даже хамский), но нельзя ли обойтись без переполнения стека? 8)


 
Гаврила ©   (2004-08-04 21:27) [7]

>>panov ©   (04.08.04 21:26) [5]

Думаю, никак.
Ты что хочешь получить то ? второй Stack overflow ?
Думаю, после первого ничего предсказуемого уже не получишь


 
Игорь Шевченко ©   (2004-08-04 21:28) [8]


> И теперь вопрос - как избежать Access violation??


Встречный вопрос - нафига ?


 
Sergey Kaminski ©   (2004-08-04 21:29) [9]

Долго, кстати, думает, перед тем, как выбросить. У меня 1Гб ОЗУ, может там overflow такой глубокий-глубокий......


 
Sergey Kaminski ©   (2004-08-04 21:30) [10]

Встречный вопрос - нафига ?

А интересно. Вон вариантов, оказывается сколько :)))


 
panov ©   (2004-08-04 21:30) [11]

>Игорь Шевченко ©   (04.08.04 21:28) [8]
Встречный вопрос - нафига ?

Хотя бы для того, чтобы обработать потенциально возможную бесконечную рекурсию в коде без терминирования программы. -)


 
Sergey Kaminski ©   (2004-08-04 21:31) [12]

И теперь вопрос - как избежать Access violation??

Ответ: не нажимать кнопку. Я угадал?


 
panov ©   (2004-08-04 21:33) [13]

>Sergey Kaminski ©   (04.08.04 21:31) [12]
Хм... А зачеи мне кнопка, если я на нее нажимать не буду?


 
Гаврила ©   (2004-08-04 21:34) [14]


> Хотя бы для того, чтобы обработать потенциально возможную
> бесконечную рекурсию в коде без терминирования программы.
> -)


после выбивания стека начинается такой бардак, что нереально, имхо


 
Тестировщица ©   (2004-08-04 21:34) [15]

panov ©   (04.08.04 21:26) [5] StackOwerflow - под отладчиком. А если скомпилируешь и запустишь - приложение просто тихо исчезнет -)))


 
Sergey Kaminski ©   (2004-08-04 21:36) [16]

Хм... А зачеи мне кнопка, если я на нее нажимать не буду?

Хм... убедил - и кнопка такая не нужна.
%-\


 
Игорь Шевченко ©   (2004-08-04 21:38) [17]


> Хотя бы для того, чтобы обработать потенциально возможную
> бесконечную рекурсию в коде без терминирования программы.
> -)


Это неверно. Лучше установить разумную глубину и сигнализировать о ее нарушении.


 
Sergey Kaminski ©   (2004-08-04 21:41) [18]

А так у меня вообще намертво вешает, без всяких оверфлоу:

procedure Work;
begin
 Work;
end;


Встречный Вопрос: почему?


 
Sergey Kaminski ©   (2004-08-04 21:44) [19]



const
 MaxWork = 100;
var
 WorkCounter: Integer;

procedure Work;
begin
 if WorkCounter > MaxWork then
 begin
   ShowMessage ("Хватит баловаться!");
   Exit;
 end;

 Inc (WorkCounter);
 Work;
 Dec (WorkCounter);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
 WorkCounter := 0;
 Work;
end;



 
Anatoly Podgoretsky ©   (2004-08-04 22:20) [20]

Игорь Шевченко ©   (04.08.04 21:38) [17]
Глубина может быть не контолируемой.
При такой ошибке, все таки нужен перезапуск программы.


 
y-soft ©   (2004-08-04 22:21) [21]

>panov ©

А кнопка-то небось красная и с надписью "Самоуничтожение"? :))


 
Anatoly Podgoretsky ©   (2004-08-04 22:31) [22]

Sergey Kaminski ©   (04.08.04 21:41) [18]
У тебя наверно контроль стека отключен


 
Sergey Kaminski ©   (2004-08-04 22:56) [23]

Anatoly Podgoretsky ©   (04.08.04 22:31) [22]

У тебя наверно контроль стека отключен

включал


 
panov ©   (2004-08-05 10:23) [24]

Все же интересно, что происходит при переполнении стека в коде из топика.
В каком порядке обрабатывается всё.


 
Игорь Шевченко ©   (2004-08-05 10:29) [25]


> Все же интересно, что происходит при переполнении стека
> в коде из топика.


Теряется адрес возврата из функции, к примеру.

Anatoly Podgoretsky ©   (04.08.04 22:20) [20]


> Глубина может быть не контолируемой.
> При такой ошибке, все таки нужен перезапуск программы.


Или изменение алгоритма.


 
Prohodil Mimo ©   (2004-08-05 11:12) [26]

Var
  FLastCol, FFirstCol, FColsCount : Word;
  CnvSize : Word;
  FColWidths:Array[0..255] of Integer;

  Procedure CalcLastCol;
  Begin
     FLastCol:=FFirstCol;
     CnvSize:=FColWidths[0]+FColWidths[FLastCol];
     While (CnvSize<ClientWidth) and (FLastCol<FColsCount) do
     Begin
        Inc(FLastCol);
        CnvSize:=CnvSize+FColWidths[FLastCol];
     End;
     FLastFullCol:=FLastCol;
     If (FLastCol>1) and (CnvSize>ClientWidth) then
        Dec(FLastFullCol);
  End;


А у меня эта процедура иногда выдаёт Stack overflow.
Возможно я смотрел не внимательно, но делал это неоднократно, а так и не нашёл в чом дело. Мож подскажете?
Спасибо!


 
Cobalt ©   (2004-08-09 23:06) [27]

Попробуй включить контроль границ (Range Checking)


 
GuAV ©   (2004-08-09 23:19) [28]


> А у меня эта процедура иногда выдаёт Stack overflow.

Имхо эта как есть не выдаст. локальных переменных нет из процедур тока inc/dec но может правда где не переменная а свойтво. короче ошибка похоже вне её.



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

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

Наверх




Память: 0.53 MB
Время: 0.035 c
14-1091792413
Bless
2004-08-06 15:40
2004.08.29
Чем просматривается формат djvu...


14-1091891267
bender
2004-08-07 19:07
2004.08.29
gprs


3-1091462964
ceval
2004-08-02 20:09
2004.08.29
как упаковать базу(dbf-файл) с помощью ADO


8-1085918904
Ivolg
2004-05-30 16:08
2004.08.29
Изменить размер изабражения?


14-1091961456
Agent13
2004-08-08 14:37
2004.08.29
BSOD: Inaccessible boot device