Что за Out of Stack?

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Nikolka
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 174
Зарегистрирован: 01.01.2004 (Чт) 2:06

Что за Out of Stack?

Сообщение Nikolka » 29.07.2005 (Пт) 1:35

(ошибка 28) Out of Stack. Общими усмлиями перевёл что-то из Helpa, что типа слишком много вызовов-подвызовов и т.д. Возникает и в правду в месте вызова одной (но совсем мелкой процедуры преобразования строки в число). Но заменив вызов функции на код самой функции здесь ошибка исчезает, а начинает появлятся всюду :).

Как тут быть, неужели у Бэйсика ограничение стоит на количество функций. Или просто увеличить размер стёка как-нить. Или может Option Exiplicit мешает... :roll:

Naked
Бывалый
Бывалый
Аватара пользователя
 
Сообщения: 207
Зарегистрирован: 27.10.2004 (Ср) 3:16
Откуда: Дальнегорск столица мира

Сообщение Naked » 29.07.2005 (Пт) 1:48

разбивай код на несколько модулей, в одном все не пиши
у меня была такая же проблемма

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 29.07.2005 (Пт) 5:41

Процедуру-то покажи совсем мелкую преобразования строки в число...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 29.07.2005 (Пт) 6:56

У тебя там что, рекурсия?
А я все практикую лечение травами...

Nikolka
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 174
Зарегистрирован: 01.01.2004 (Чт) 2:06

Сообщение Nikolka » 29.07.2005 (Пт) 19:24

Да вот - пожалуйста:

Код: Выделить всё
Public Function wn(num As Integer) As Integer

'Быстрая функция для получения номера абсолютного значения
'по номеру относительного.

wn = CInt(TS.Tabs(num).Tag)

End Function


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

А в другом довольно большом проекте в одном модуле располагалась вааще вся функциональная часть. Может в этом и причина - их так много?... Хотя...

Nikolka
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 174
Зарегистрирован: 01.01.2004 (Чт) 2:06

Сообщение Nikolka » 29.07.2005 (Пт) 19:32

Ещё пришла идея. Там везде используются ByRef. Может слишком большое количество ссылок :?: Попробую ByVal сделать. Но предложения пока принимаются...

Nikolka
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 174
Зарегистрирован: 01.01.2004 (Чт) 2:06

Сообщение Nikolka » 29.07.2005 (Пт) 20:43

ByVal не помогает. Если сделать вместо функции - Sub, который возвращает результат в переменную, а после она считывается прогой. Но это будет большая лажа, т.к. эту мелкую функцию я вызываю ОЧЕНЬ часто. Даже если её заранее посчитать, перед каждым sub`ом... , то блин - тоже лажа, хотя идея...

Нет не идея, т.к. слишком много функций её вызывающих.

(Простите за оффтопик, но: где вы ещё видели сумашедшего, который разговаривает сам с собой :)))))) :lol:

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 30.07.2005 (Сб) 6:26

Сия ошибка Out Of Stack происходит например при большом количестве рекурсивных вызовов. При этом происходит переполнение стека вызовов и генериркется ошибка. В примере твоем примере никакой рекурсии нет, так что ищи в другом месте
Весь мир матрица, а мы в нем потоки байтов!

Nikolka
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 174
Зарегистрирован: 01.01.2004 (Чт) 2:06

Сообщение Nikolka » 31.07.2005 (Вс) 14:08

А что такое "рекурсивные вызовы"? Если (из моих малых познаний) рекурсия - это возврат, то рекурсивный вызов - это что-та типа:

Dim xyz as integer

xyz=wn(5)

?

Если вы имеете это ввиду то - вроде не более 4-5 уровней вызовов-подвызовов. Обычно - 2-3 уровня.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 01.08.2005 (Пн) 6:28

Ну вот я и вернулся...

А что такое "рекурсивные вызовы"?


Рекурсия - вызов процедурой/функцией самой себя.
А я все практикую лечение травами...

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Сообщение Vi » 01.08.2005 (Пн) 13:30

Чтобы была понятна рекурсия без указания функций (пример дубовый, только для демонстрации):
Код: Выделить всё
Private Sub Form_Load()
    Text1.Text = "1"
End Sub

Private Sub Text1_Change()
  If Right(Text1.Text, 1) = "1" Then
    Text1.Text = Text1.Text & "1"
  End If
End Sub

Т.е. иногда изменение параметров контрола(ов) приводит к появлению события, в котором этот параметр снова изменяется прямо (в моем примере Text1.Text и событие Text1_Change на изменение Text1.Text) или косвенно.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 01.08.2005 (Пн) 13:36

Да, это и есть рекурсия, только вданном примере не виден вызов функции функцией - просто при смене значения свойства Text вызывается событие Change, а по Change ты меняешь Text: эта функция должна зациклить прогу, так как нет выхода из рекурсивной функции...
А я все практикую лечение травами...

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 01.08.2005 (Пн) 14:57

Classic =)
Код: Выделить всё
Function Factorial(ByVal Num As Long) As Double
If Num = 1 Then Factorial = 1 Else Factorial = Factorial(Num - 1) * Num
End Function
Нет меня больше

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 01.08.2005 (Пн) 15:01

Классический пример рекурсии - вычисление факториала (VB.NET):

Код: Выделить всё
Function Factorial(n As Integer) As Double
If n = 0 Then
Return 1
Else
Return n*Factorial(n -1)
End If
End Function
Весь мир матрица, а мы в нем потоки байтов!

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 01.08.2005 (Пн) 15:04

Мож мне тоже вычисление факториала сюда добавить, только в синтаксисе SQL? :wink:
А я все практикую лечение травами...

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 01.08.2005 (Пн) 15:09

и на SQL вариант можно посмотреть :D
Весь мир матрица, а мы в нем потоки байтов!

ism
Постоялец
Постоялец
 
Сообщения: 337
Зарегистрирован: 12.12.2001 (Ср) 12:59
Откуда: Russia, Saint-Petersburg

Сообщение ism » 02.08.2005 (Вт) 1:07

При ошибке такого типа лутше отлаживать пошагово примерные места возникновения. Тогда стопудово заметишь место зацикливания.

В функции факториала, в условии, лутше ставить IF n<2 Then, т.к. 1!=1 :-)

Alex Mals
Новичок
Новичок
 
Сообщения: 45
Зарегистрирован: 11.12.2004 (Сб) 18:09

Сообщение Alex Mals » 02.08.2005 (Вт) 4:58

Нажми в окне ошибки Debug, затем Ctrl+L, увидишь список функций и процедур, последовательно вызывающих одна другую в данный момент - может помочь.

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 02.08.2005 (Вт) 9:38

ism, все бы хорошо, но так у тебя (-1)! вычислится :)
Самый правильный (хотя, видимо, не самый быстрый) с точки зрения математики вариант - у !Viper!.

Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 02.08.2005 (Вт) 9:43

Давайте вынесем отдельную тему: "Обсуждение быстроты вычисления факториала на VB" и создадим конкурс на самый быстрый алгоритм... :lol:
А я все практикую лечение травами...

uhm
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1597
Зарегистрирован: 02.12.2004 (Чт) 15:21

Сообщение uhm » 02.08.2005 (Вт) 9:53


Twister
Теоретик
Теоретик
Аватара пользователя
 
Сообщения: 2251
Зарегистрирован: 28.06.2005 (Вт) 12:32
Откуда: Алматы

Сообщение Twister » 02.08.2005 (Вт) 9:57

За ссылочку спасибо, очень интересный портал...
А я все практикую лечение травами...

Nikolka
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 174
Зарегистрирован: 01.01.2004 (Чт) 2:06

Сообщение Nikolka » 02.08.2005 (Вт) 15:15

Челы, пасиба, разобрался. Тут дело не в рекурсии (как я понял это похоже на циклическую ссылку), а в том, что элемент TabStrip пятой версии: при малейшем его задевании (изменение свойства или просто чтение оного) возвращает событие Click (что за лажа - всё начинаю искать alt или писать свой контрол). Да не просто возвращает, а возвращает его сотни раз (я конечно не считал - задолбало - нажал Stop:). Отсюда от большого количества одновременных вызовов и происходило переполнение стёка. Когда ставил что-то вроде:

Код: Выделить всё
Dim fakStart as boolean

Private Sub TabStrip_Click()

If fakStart=False then
fakStrart=True
... Моя программа ...
fakStart=False
end if

end sub


Всё работало как надо. Скорее всего это и было. Так что пасиба всем!


Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 8

    TopList