Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Потрепаться";
Текущий архив: 2004.08.29;
Скачать: [xml.tar.bz2];

Вниз

Как обойтись без 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.035 c
1-1092633681
ancot
2004-08-16 09:21
2004.08.29
Количество параметров процедуры


1-1092283960
Fynjy
2004-08-12 08:12
2004.08.29
Изменение высоты Combobox а


3-1091797385
mouse_web
2004-08-06 17:03
2004.08.29
Проблемы с полями при поиске


1-1092399868
begin...end
2004-08-13 16:24
2004.08.29
TForm.OnShow


1-1092395892
NikeOLD
2004-08-13 15:18
2004.08.29
Отловить изменение ширины колонки ListView





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский