Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Qt и кроссплатформенное программирование С/С++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.06.2015, 15:21   #1
DemonSinusa
Пользователь
 
Регистрация: 20.06.2015
Сообщений: 10
Лампочка Маленький вопрос по поводу стека и рекурсии

Доброго времени суток уважаемые форумчане!
На днях столкнулся с проблемой выпадения из стека при виртуализации кода в собственном качане
Т.е. при проверке работоспособности своего кода зашел достаточно далеко, и не хотелось бы врезаться в ничем_не_разрушимую_стену, пока еще можно свернуть с более оптимального направления на другое, более универсальное)

Код адаптирую под чистый Cи с обертками-облегчалками кодинга на приплюсе.
Есть некие функции:
Код:
long _SaveLinkListXmode(LINKL *list, NEURON *container, bool InList){
...
	    ((LINKL *) it->link->to)->IDOffset = it->IDOffset + sizeof (LICL);

	    tlink = (NEURON *) ((LINKL *) (it->link->to))->Neuron;
	    if (tlink->IDOffset == (-1))_SaveNeuronWOLists(tlink);
...
}
long _SaveNeuronWOLists(NEURON *it){
...
    //ReportToLog(L"Сохранен одиночный нейрон",0x041,it,2);
    //BugFix save freedoom neuron with(out) connected freedoom neurons
    if (!it->Layer && it->outcount) {
	//			ListOut=SaveLinkList(it->out,it,false);
	ListOut = SaveLinkListXmode(it->out, it, false);
	SetListsPointerToNeuro(it->IDOffset, -1, ListOut);
    }
...
}
Так вот самих одиночных нейронов(не подрубленных к какому либо слою), может быть сколько угодно и 0 и 1 и 2^9999...
И большинство из них будет вызывать функцию
Код:
long _SaveLinkListXmode(LINKL *list, NEURON *container, bool InList);
А это может быть out of stack error, по сути цикличная многосвязная хвостовая рекурсия иногда с подпиленным хвостом иногда нет ))) Такие дела. Оно все работает,и правильно работает, но на малых объемах, протекающих данных.
Суть самого вопроса проста- как мне создать динамический стек только для этих функций.
И получиться ли избежать этой ошибки при использовании такой структуры:
Вместо вызова
Код:
ListOut = SaveLinkListXmode(it->out, it, false);
поместить ее в некое хранилище указателей на функцию:
Код:
FIDL *_CreateFDL(long IDOffSet, char type);
//а именно:
long (* TempSaveLinkListXmode)(LINKL *list, NEURON *container, bool InList);
fifi=_CreateFDL((long)SaveLinkListXmode, 5);
TempSaveLinkListXmode=(long (*)(LINKL *list, NEURON *container, bool InList))fifi->data.FreedoomID;
ListOut =TempSaveLinkListXmode(it->out, it, false);
_DeleteFDL(fifi);
...
Обойдет ли это проблему выпадания из стека на практически бесконечной глубине рекурсии?
Если не обойдет, то как это сделать? Хотя это все может оказаться всего лишь моей параноей...
Спасибо за оказанное внимание.

Последний раз редактировалось DemonSinusa; 20.06.2015 в 17:27.
DemonSinusa вне форума Ответить с цитированием
Старый 05.01.2016, 22:19   #2
DemonSinusa
Пользователь
 
Регистрация: 20.06.2015
Сообщений: 10
По умолчанию

Вопрос решился, всем спасибо!
Да действительно пришлось делать динамический древовидный разносторонний стек для всего.
А из рекурсии лучше не выходить...
DemonSinusa вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Маленький вопрос) pokosmosu22 Помощь студентам 4 30.09.2014 22:10
маленький вопрос peq Microsoft Office Excel 2 04.09.2014 17:27
Переполнение стека при рекурсии (в бинарном дереве) LordJohn Помощь студентам 0 11.11.2012 18:28
маленький вопрос по поводу копи рования файлов kakawkin Общие вопросы Delphi 4 06.10.2009 17:21
маленький вопрос 1234 Общие вопросы Delphi 1 10.03.2008 12:18