Форум программистов, компьютерный форум, киберфорум
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.95/19: Рейтинг темы: голосов - 19, средняя оценка - 4.95
0 / 0 / 0
Регистрация: 17.10.2012
Сообщений: 7
1

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

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

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

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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.10.2012, 10:06
Ответы с готовыми решениями:

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

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

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

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

6
2664 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
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
0 / 0 / 0
Регистрация: 17.10.2012
Сообщений: 7
17.10.2012, 15:21  [ТС] 3
я имел ввиду то что я убрал всё остальное и оставил только это.
Другая странность, что у меня есть программа, где информация берётся из WebBrowser , он такая же как и новая только работает с Indy(собственно я её скопировал и правил). Она такой ошибки не выдавала.

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

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

Есть ещё какието догадки, как победить это? Может я в самом компиляторе чтото сделал?
0
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
17.10.2012, 15:28 4
glassmaxx, тебе же mss указал в чём причина. - Что при CheckBox1.Checked = false возникает бесконечная рекурсия. Из-за этого стек переполняется и т. п.
0
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
13104 / 5885 / 1706
Регистрация: 19.09.2009
Сообщений: 8,808
17.10.2012, 15:33 6
Цитата Сообщение от glassmaxx Посмотреть сообщение
Щас запустил, результат тотже, переполнение.
Так об этом и речь. - Если у тебя будет оформлено таким образом, как сейчас, то возникает бесконечная рекурсия. Т. е., методы по кругу будут бесконечно вызывать друг друга:
Button1Click() -> Button2Click() -> Button3Click() ->
Button1Click() -> Button2Click() -> Button3Click() ->
...
И т. д. - до момента, когда произойдёт переполнение стека и возникнет ошибка.
Т. е. логику в этом месте программы надо поменять.
1
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.10.2012, 16:02
Помогаю со студенческими работами здесь

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

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

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

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

Выводит ошибку переполнение
Если в строке находится выражение t+x^2+1, то выдает ошибку EOleException with message...

Как перехватить переполнение вещественного типа?
Есть присваивание которое часто вызывает переполнение вещественного типа. Надо сделать так, что бы...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru