Отговори на тема  [ 10 мнения ] 
оплетох се с връщането от една подпрограма към предишна 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пет Фев 05, 2010 7:53 pm
Мнения: 25
Мнение оплетох се с връщането от една подпрограма към предишна
Тоест не мога да схвана как да го направя. :rolleyes:

Примерно от главната съм отишъл в Х от там в У, искам да се върна в главната.
Ако от У извикам главната, няма ли да прибавя още еднин запис в стека, което не ми се вижда добра идея?
Искам да го използвам за менюта, примерно след известно време без натиснат бутон да се върне към изпълнението на главната програма. Обаче през това време съм влязал от главното меню в някое под или под-под меню. :)
Идеята ми е да ползвам стражевия таймер, ама не ме кефи особено да рестртирам програмата.
Има ли някакъв по-елегантен начин, сигурно има, ама аз не мога да го измисля. :mrgreen:

Мерси.


Вто Ное 22, 2011 5:36 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: оплетох се с връщането от една подпрограма към предишна
Това с прякото извикване ще ти вкара една рекурсия, едни проблеми ... има много варианти да си решиш елегантно проблема.
Примерно - нарави един статичен указател към функция за текущото меню на екрана, тогава главния цикъл ти става викане на функцията в този указател докато не се изключи системата, а във всяко едно от менютата ти като човек натисне нещо записваш в указателя нова процедура. Ако искаш да сработи някакъв тайм ауто си сложи един таймер който във всяко меню се инициализира при какво да е действие на човек да започва да брои и стигне ли 0 да записва симулира влизане в главното меню. Има и доста други начини, но този е сравнително прост.

_________________
Мразя да мразя ...


Вто Ное 22, 2011 6:11 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Съб Ное 12, 2011 9:21 pm
Мнения: 62
Мнение Re: оплетох се с връщането от една подпрограма към предишна
това се нарича non-local goto; може да се ползват функции setjmp()/longjmp(), ако са налични в библиотеките ти, но по принцип ако ти трябва нещо такова, най-вероятно нещо в организацията на програмата е най-добре да се промени


Вто Ное 22, 2011 10:26 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: оплетох се с връщането от една подпрограма към предишна
loser написа:
това се нарича non-local goto; може да се ползват функции setjmp()/longjmp(), ако са налични в библиотеките ти, но по принцип ако ти трябва нещо такова, най-вероятно нещо в организацията на програмата е най-добре да се промени

Като гледам въпроса ме съмнява дали ще се справи със set/long jump ...
@iivantodorov - я постни кода да можем да ти дадем по практичен съвет.

_________________
Мразя да мразя ...


Сря Ное 23, 2011 12:01 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пет Фев 05, 2010 7:53 pm
Мнения: 25
Мнение Re: оплетох се с връщането от една подпрограма към предишна
Със setjmp и longjmp стана, верно новак съм и не съм знаел за тези функции. Но чак пък да не мога да се справя, особено след като прочета хелпа на компилатора.
Друг е въпроса, че щом loser казва да се промени нещо из кода, явно употребата им все пак не е много удачна.

Мерси, за сега и така става. Ще помисля и други варианти. :)


Сря Ное 23, 2011 10:56 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: оплетох се с връщането от една подпрограма към предишна
iivantodorov написа:
Със setjmp и longjmp стана, верно новак съм и не съм знаел за тези функции. Но чак пък да не мога да се справя, особено след като прочета хелпа на компилатора.
Друг е въпроса, че щом loser казва да се промени нещо из кода, явно употребата им все пак не е много удачна.

Мерси, за сега и така става. Ще помисля и други варианти. :)

Браво! Има хляб в теб :)
Но все пак имай в предвид, че със setjump/longjump не е много добро решение, проблема ти е алгоритъма на програмата, следователно и решенито трябва да е по алгоритмично - т.е. да се разместят викания на функции и т.н. за да се изчисти структурата и логиката на програмата.

_________________
Мразя да мразя ...


Сря Ное 23, 2011 11:12 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пет Фев 05, 2010 7:53 pm
Мнения: 25
Мнение Re: оплетох се с връщането от една подпрограма към предишна
А мерси. :)
Програмата съм я написал без да се замисля за това в началото, и сега да я променям ще се отели вола. :)
Друго ми дойде на акъля, с бутона с който съм влязал в менюто или подменюто с него излизам, като ми изтече времето, ще симулирам натиснат бутон. :D


Сря Ное 23, 2011 11:42 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Окт 11, 2011 11:53 pm
Мнения: 4582
Местоположение: Brussels / Пловдив
Мнение Re: оплетох се с връщането от една подпрограма към предишна
Само имай в предвид че setjump и longjump ще работят правилно ако ги викаш longjump преди да си излезнал от скопа на setjump, иначе ще ти се омаже структурата на стека и почти 100% ще ти забие програмата. Т.е. longjump може да се вика само от подфункции на тази в която си извикал setjump - същия ефект можеш да постигнеш и като връщаш някакъв специален резултат то функциите. Ако можеш дебъгни всичко на асемблер да ти се изясни какво точно става с тия функции - пак ти казвам, не са за препоръчване за да си изчистиш логиката на програмата.

_________________
Мразя да мразя ...


Сря Ное 23, 2011 3:57 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Юни 01, 2008 9:54 pm
Мнения: 1503
Местоположение: Пловдив
Мнение Re: оплетох се с връщането от една подпрограма към предишна
palavrov написа:
Само имай в предвид че setjump и longjump ще работят правилно ако ги викаш longjump преди да си излезнал от скопа на setjump, иначе ще ти се омаже структурата на стека и почти 100% ще ти забие програмата. Т.е. ...

Иначе казано - не ги ползвай. Има начин да напишеш един фрагмент код без дробиш програмата с такива примитивни действия насред C-то. Всичко е въпрос на структура на програмата. И не си помисляй "да викаш главната програма" - ти там трябва да се върнеш, не да я викаш иначе ще стане :rolleyes:


Сря Ное 23, 2011 4:23 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Ное 22, 2004 11:24 pm
Мнения: 1923
Местоположение: Габрово
Мнение Re: оплетох се с връщането от една подпрограма към предишна
Няма ли да е най лесно с стейт машина? :idea:


Нед Ное 27, 2011 4:19 pm
Профил ICQ
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 10 мнения ] 

Кой е на линия

Потребители разглеждащи този форум: 0 регистрирани и 1 госта


Вие не можете да пускате нови теми
Вие не можете да отговаряте на теми
Вие не можете да променяте собственото си мнение
Вие не можете да изтривате собствените си мнения
Вие не можете да прикачвате файл

Търсене:
Иди на:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group.
Designed by ST Software for PTF.
Хостинг и Домейни