Форум: "Потрепаться";
Текущий архив: 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