Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/12: Рейтинг темы: голосов - 12, средняя оценка - 4.67
glassmaxx
0 / 0 / 0
Регистрация: 17.10.2012
Сообщений: 7
1

переполнение стека

17.10.2012, 10:06. Просмотров 2317. Ответов 6
Метки нет (Все метки)

Здравствуйте.
Пишу пару программ, они постепенно развивались, вместе с моими познаниями. Много вопросов решил читая этот и другие форумы.
Но вот недавно столкнулся с тем , на что не могу найти решение.
Вот суть проблемы:

Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
i:=0;  while i<5 do begin sleep(1); Application.ProcessMessages; inc(i);end;
if CheckBox1.Checked = false then Button2.Click;
 
end;
 
procedure TForm1.Button2Click(Sender: TObject);
var i:integer;
begin
i:=0;  while i<5 do begin sleep(1); Application.ProcessMessages; inc(i);end;
button3.click;
 
end;
 
procedure TForm1.Button3Click(Sender: TObject);
var i:integer;
begin
i:=0;  while i<5 do begin sleep(1); Application.ProcessMessages; inc(i);end;
edit1.text:=inttostr(strtoint(edit1.text)+1);
button1.click;
end;
Данный код выдаёт ошибку- переполнение стека.
Это конечно сильно упрощённая программа После долгих опытов выяснилось что сам код внутри процедур нажатия кнопок тут нипричём.
В отладчике видно, что в стеке много строчек типа c:\windows\syswow64\USP10.dll

может вот это ещё поможет:
Thread Start: Thread ID: 5256. Process Project1.exe (5960)
Process Start: F:\DelPro\test\Win32\Debug\Project1.exe. Base Address: $00400000. Process Project1.exe (5960)
Module Load: Project1.exe. Has Debug Info. Base Address: $00400000. Process Project1.exe (5960)
Module Load: ntdll.dll. No Debug Info. Base Address: $77110000. Process Project1.exe (5960)
Module Load: KERNEL32.dll. No Debug Info. Base Address: $761C0000. Process Project1.exe (5960)
Module Load: KERNELBASE.dll. No Debug Info. Base Address: $765B0000. Process Project1.exe (5960)
Module Load: snxhk.dll. No Debug Info. Base Address: $72F80000. Process Project1.exe (5960)
Module Load: OLEAUT32.dll. No Debug Info. Base Address: $76310000. Process Project1.exe (5960)
Module Load: ole32.dll. No Debug Info. Base Address: $74980000. Process Project1.exe (5960)
Module Load: msvcrt.dll. No Debug Info. Base Address: $75E80000. Process Project1.exe (5960)
Module Load: GDI32.dll. No Debug Info. Base Address: $76100000. Process Project1.exe (5960)
Module Load: USER32.dll. No Debug Info. Base Address: $74850000. Process Project1.exe (5960)
Module Load: ADVAPI32.dll. No Debug Info. Base Address: $75F90000. Process Project1.exe (5960)
Module Load: SECHOST.dll. No Debug Info. Base Address: $76710000. Process Project1.exe (5960)
Module Load: RPCRT4.dll. No Debug Info. Base Address: $763A0000. Process Project1.exe (5960)
Module Load: SspiCli.dll. No Debug Info. Base Address: $747F0000. Process Project1.exe (5960)
Module Load: CRYPTBASE.dll. No Debug Info. Base Address: $747E0000. Process Project1.exe (5960)
Module Load: LPK.dll. No Debug Info. Base Address: $76050000. Process Project1.exe (5960)
Module Load: USP10.dll. No Debug Info. Base Address: $76060000. Process Project1.exe (5960)
Module Load: MSIMG32.dll. No Debug Info. Base Address: $72AD0000. Process Project1.exe (5960)
Module Load: VERSION.dll. No Debug Info. Base Address: $74720000. Process Project1.exe (5960)
Module Load: COMCTL32.dll. No Debug Info. Base Address: $73000000. Process Project1.exe (5960)
Module Load: SHLWAPI.dll. No Debug Info. Base Address: $766B0000. Process Project1.exe (5960)
Module Load: SHELL32.dll. No Debug Info. Base Address: $74CC0000. Process Project1.exe (5960)
Module Load: WINSPOOL.DRV. No Debug Info. Base Address: $721A0000. Process Project1.exe (5960)
Module Load: apphelp.dll. No Debug Info. Base Address: $72EA0000. Process Project1.exe (5960)
Module Load: NULL.dll. No Debug Info. Base Address: $6CB80000. Process Project1.exe (5960)
Module Load: USERENV.dll. No Debug Info. Base Address: $72B70000. Process Project1.exe (5960)
Module Load: profapi.dll. No Debug Info. Base Address: $731E0000. Process Project1.exe (5960)
Module Load: MPR.dll. No Debug Info. Base Address: $72FE0000. Process Project1.exe (5960)
Module Load: IMM32.dll. No Debug Info. Base Address: $75F30000. Process Project1.exe (5960)
Module Load: MSCTF.dll. No Debug Info. Base Address: $75B70000. Process Project1.exe (5960)
Module Load: UxTheme.dll. No Debug Info. Base Address: $72C00000. Process Project1.exe (5960)
Module Load: tv_w32.dll. No Debug Info. Base Address: $19600000. Process Project1.exe (5960)
Module Load: CRTDLL.dll. No Debug Info. Base Address: $6C240000. Process Project1.exe (5960)
Module Load: KERNEL32.dll. No Debug Info. Base Address: $029A0000. Process Project1.exe (5960)
Module Unload: KERNEL32.dll. Process Project1.exe (5960)
Module Load: ADVAPI32.dll. No Debug Info. Base Address: $029A0000. Process Project1.exe (5960)
Module Unload: ADVAPI32.dll. Process Project1.exe (5960)
Thread Start: Thread ID: 5480. Process Project1.exe (5960)
Module Load: dwmapi.dll. No Debug Info. Base Address: $72B50000. Process Project1.exe (5960)
Module Load: WTSAPI32.dll. No Debug Info. Base Address: $73F70000. Process Project1.exe (5960)
Module Load: WINSTA.dll. No Debug Info. Base Address: $73A30000. Process Project1.exe (5960)
Thread Start: Thread ID: 1528. Process Project1.exe (5960)
Module Load: ole32.dll. No Debug Info. Base Address: $03860000. Process Project1.exe (5960)
Module Unload: ole32.dll. Process Project1.exe (5960)
Thread Start: Thread ID: 1416. Process Project1.exe (5960)
Thread Start: Thread ID: 5676. Process Project1.exe (5960)
Thread Exit: Thread ID: 1416. Process Project1.exe (5960)
Thread Exit: Thread ID: 1528. Process Project1.exe (5960)
First chance exception at $7608F9E8. Exception class $C00000FD with message 'stack overflow at 0x7608f9e8'. Process Project1.exe (5960)

Подскажите пожалуйста как эту проблемку решить.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.10.2012, 10:06
Ответы с готовыми решениями:

Переполнение стека
Добрый вечер)пытаюсь написать программу, но возникла ошибка с переполнением стека в данной...

переполнение стека!
вот кодprocedure TForm1.CheckBox7Click(Sender: TObject); begin if checkbox7.Checked=false then...

переполнение стека
Помогите довести программу до ума. Все, что я могла с ней сделать - я уже сотворила. В...

Переполнение стека
Вот пробую писать программку по поиску в реестре битых ссылок на файлы но столкнулся с такой...

Переполнение стека. Модуль
Требуется написать программу вывода таблицы функции, которую оформить в виде процедуры. Функций...

6
mss
2638 / 2262 / 277
Регистрация: 24.12.2010
Сообщений: 13,725
17.10.2012, 10:26 2
Цитата Сообщение от glassmaxx Посмотреть сообщение
код внутри процедур нажатия кнопок тут нипричём
Еще как причем.

Любуйся:

Код
procedure TForm1.Button1Click(Sender: TObject);
begin
  Button2.Click;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  button3.click;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  button1.click;
end;
0
glassmaxx
0 / 0 / 0
Регистрация: 17.10.2012
Сообщений: 7
17.10.2012, 15:21  [ТС] 3
я имел ввиду то что я убрал всё остальное и оставил только это.
Другая странность, что у меня есть программа, где информация берётся из WebBrowser , он такая же как и новая только работает с Indy(собственно я её скопировал и правил). Она такой ошибки не выдавала.

Так то конечно прикольно что прога без кода в процедурах, работает. Но хотелось бы чтоб работало с кодом.

Щас тоже убрал весь код, оставил только нажатие на кнопку.
Количество строк в стеке растёт прикаждом переходе, таким образом он всёравно забьётся.
Прибавляется такая строка - 00485ed1 Vd + $485ED1

Есть ещё какието догадки, как победить это? Может я в самом компиляторе чтото сделал?
0
Mawrat
12853 / 5756 / 1701
Регистрация: 19.09.2009
Сообщений: 8,807
17.10.2012, 15:28 4
glassmaxx, тебе же mss указал в чём причина. - Что при CheckBox1.Checked = false возникает бесконечная рекурсия. Из-за этого стек переполняется и т. п.
0
glassmaxx
0 / 0 / 0
Регистрация: 17.10.2012
Сообщений: 7
17.10.2012, 15:30  [ТС] 5
Цитата Сообщение от mss Посмотреть сообщение
Еще как причем.

Любуйся:

Код
procedure TForm1.Button1Click(Sender: TObject);
begin
  Button2.Click;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  button3.click;
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  button1.click;
end;
Щас запустил, результат тотже, переполнение.
0
Mawrat
12853 / 5756 / 1701
Регистрация: 19.09.2009
Сообщений: 8,807
17.10.2012, 15:33 6
Цитата Сообщение от glassmaxx Посмотреть сообщение
Щас запустил, результат тотже, переполнение.
Так об этом и речь. - Если у тебя будет оформлено таким образом, как сейчас, то возникает бесконечная рекурсия. Т. е., методы по кругу будут бесконечно вызывать друг друга:
Button1Click() -> Button2Click() -> Button3Click() ->
Button1Click() -> Button2Click() -> Button3Click() ->
...
И т. д. - до момента, когда произойдёт переполнение стека и возникнет ошибка.
Т. е. логику в этом месте программы надо поменять.
1
glassmaxx
0 / 0 / 0
Регистрация: 17.10.2012
Сообщений: 7
17.10.2012, 16:02  [ТС] 7
Цитата Сообщение от Mawrat Посмотреть сообщение
Так об этом и речь. :) - Если у тебя будет оформлено таким образом, как сейчас, то возникает бесконечная рекурсия. Т. е., методы по кругу будут бесконечно вызывать друг друга:
Button1Click() -> Button2Click() -> Button3Click() ->
Button1Click() -> Button2Click() -> Button3Click() ->
...
И т. д. - до момента, когда произойдёт переполнение стека и возникнет ошибка.
Т. е. логику в этом месте программы надо поменять.
Ну да, если добавить четвёртую кнопочку которая в цикле вызывает по очереди те 3, то всё ок работает.

Добавлено через 11 минут
Или когда 4 кнопка запускает 1, а та вторую, вторая третью. Тоже всё гуд.

Куда копать теперь понятно.

Добавлено через 3 минуты
Кажись такой способ всё решает
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
procedure TForm1.Button1Click(Sender: TObject);
begin
  Button2.Click;
//  i:=0;  while i<5 do begin sleep(1); Application.ProcessMessages; inc(i);end;
  if CheckBox1.Checked = false then Button2.Click;
end;
 
procedure TForm1.Button2Click(Sender: TObject);
begin
  button3.click;
  edit1.text:=inttostr(strtoint(edit1.text)+1);
end;
 
procedure TForm1.Button3Click(Sender: TObject);
begin
 Timer1.Enabled:=true;
end;
 
 
 
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Timer1.Enabled:=false;
button1.click;
end;
0
17.10.2012, 16:02
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.10.2012, 16:02

Ошибка: Переполнение стека
Помогите разобраться непойму в чем дело! Выдает ошибку Переполнение стека! Вот прога моя! В...

Задан указатель P1 на вершину непустого стека. Создать два новых стека
Добрый вечер, у меня возникла проблемка с такой программкой. Вывести в компонент Label. ...

Стек: Переместить все элементы из первого стека во второй и вывести адрес новой вершины стека
Даны указатели P1 и P2 на вершины двух непустых стеков. Переместить все элементы из первого стека...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru