0 / 0 / 0
Регистрация: 17.10.2012
Сообщений: 7
|
||||||
1 | ||||||
переполнение стека17.10.2012, 10:06. Показов 3940. Ответов 6
Метки нет (Все метки)
Здравствуйте.
Пишу пару программ, они постепенно развивались, вместе с моими познаниями. Много вопросов решил читая этот и другие форумы. Но вот недавно столкнулся с тем , на что не могу найти решение. Вот суть проблемы:
Это конечно сильно упрощённая программа После долгих опытов выяснилось что сам код внутри процедур нажатия кнопок тут нипричём. В отладчике видно, что в стеке много строчек типа 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
|
17.10.2012, 10:06 | |
Ответы с готовыми решениями:
6
Переполнение стека Переполнение стека переполнение стека переполнение стека! |
3530 / 2270 / 279
Регистрация: 24.12.2010
Сообщений: 13,723
|
|
17.10.2012, 10:26 | 2 |
Еще как причем.
Любуйся: Код
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
|
13107 / 5888 / 1707
Регистрация: 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 |
0
|
13107 / 5888 / 1707
Регистрация: 19.09.2009
Сообщений: 8,808
|
|
17.10.2012, 15:33 | 6 |
Так об этом и речь. - Если у тебя будет оформлено таким образом, как сейчас, то возникает бесконечная рекурсия. Т. е., методы по кругу будут бесконечно вызывать друг друга:
Button1Click() -> Button2Click() -> Button3Click() -> Button1Click() -> Button2Click() -> Button3Click() -> ... И т. д. - до момента, когда произойдёт переполнение стека и возникнет ошибка. Т. е. логику в этом месте программы надо поменять.
1
|
0 / 0 / 0
Регистрация: 17.10.2012
Сообщений: 7
|
||||||
17.10.2012, 16:02 [ТС] | 7 | |||||
Ну да, если добавить четвёртую кнопочку которая в цикле вызывает по очереди те 3, то всё ок работает.
Добавлено через 11 минут Или когда 4 кнопка запускает 1, а та вторую, вторая третью. Тоже всё гуд. Куда копать теперь понятно. Добавлено через 3 минуты Кажись такой способ всё решает
0
|
17.10.2012, 16:02 | |
17.10.2012, 16:02 | |
Помогаю со студенческими работами здесь
7
Ошибка: Переполнение стека Переполнение стека. Модуль Задан указатель P1 на вершину непустого стека. Создать два новых стека Стек: Переместить все элементы из первого стека во второй и вывести адрес новой вершины стека Выводит ошибку переполнение Как перехватить переполнение вещественного типа? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |