|
Виж темите без отговор | Виж активните теми
Дата и час: Пет Авг 21, 2026 10:34 am
Незабавен изход от функция в С
| Автор |
Съобщение |
|
iivantodorov
Ранг: Минаващ
Регистриран на: Пет Фев 05, 2010 7:53 pm Мнения: 25
|
 Незабавен изход от функция в С
Здравейте и ме извинете за глупавия въпрос.
Как най-елегантно да прекратя изпълнението на дадена функция, при определено условие?
Примерно:
void функция(void)
{
код
код
......
условие за предварителни прекратяване изпълнението на фукнцията
......
код
}
Пробвах с конструкцията break за изход от цикъл, става но не ми се струва удачно, ако използвам return без да връщам някаква стойност, се получават сакатлъци. Начинаещ съм и още не съм на ясно с много неща, а в книгите които чета няма всичко и се налага да питам тук там. 
|
| Пет Мар 25, 2011 4:33 pm |
|
 |
|
syscop
Ранг: Форумен бог
Регистриран на: Пет Юни 03, 2005 9:39 pm Мнения: 2283
|
goto 
|
| Пет Мар 25, 2011 4:46 pm |
|
 |
|
MidNighT_SpiRiT
Ранг: Напреднал
Регистриран на: Нед Сеп 17, 2006 12:00 pm Мнения: 450 Местоположение: Plovdiv
|
Организирай така нещата, че да няма нужда от return - примерно с if - else. Но и да сложиш return не виждам никакъв проблем освен, че кодът става по-трудно разбираем.
|
| Пет Мар 25, 2011 4:46 pm |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
 Re: Незабавен изход от функция в С
Какви сакатлъци да се получават? Няма сакатлъци, използването на return по средата на функцията си е нормална програмистка практика. Дали ще връщаш стойност или не, няма отношение по въпроса, сакътлъци не би трябвало да се получават.
Ако компилатора ти е нормален ANSI C, де 
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Пет Мар 25, 2011 6:00 pm |
|
 |
|
ike
Ранг: Форумен бог
Регистриран на: Пет Фев 04, 2005 9:59 pm Мнения: 6019 Местоположение: София
|
И аз си мисля, че точно return е за това.
А за да не стават сакатлъци промени функцията:
int функция(void)
{
код
код
......
условие за предварителни прекратяване изпълнението на фукнцията; return -1;
......
код
return 5;
}
_________________ Warriors of the Night, ASSEMBLER!!!
|
| Пет Мар 25, 2011 6:31 pm |
|
 |
|
zaphod
Ранг: Форумен бог
Регистриран на: Нед Юли 24, 2005 10:28 am Мнения: 2692
|
директен ретърн се ползва, а ако имаш някакви затваряния - с гото.
аз обаче подозирам че въпроса ти не е до ретърна, а просто не си си изчистил представата какво трябва да прави тая функция  в смисъл, не си си отговорил на въпроса какво правим от извикващата страна ако излезе в средата, на което разбира се ние не можем да отговорим 
|
| Съб Мар 26, 2011 8:22 am |
|
 |
|
iivantodorov
Ранг: Минаващ
Регистриран на: Пет Фев 05, 2010 7:53 pm Мнения: 25
|
Благодаря за отговорите.
Ами правя едно меню с 4 подменюта, и ако от някое под меню трябва да изляза преждевременно и използвам return вместо в главното ме праща в някое от другите подменюта. Иначе с break, всичко е точно.
Но мисля, че zaphod може да излезе прав
Не пускам код, защото знам, че правя менюто по лаишки начин и ще има бъзикни 
|
| Пон Мар 28, 2011 8:30 am |
|
 |
|
CarBeta
Ранг: Форумен бог
Регистриран на: Пет Май 01, 2009 4:01 pm Мнения: 1438
|
RETURN те връща точно там, където си извикал функцията. Ако от едното подменю отиваш към следващото с CALL, нормално e след RETURN да се върнеш в предишното подменю.
|
| Пон Мар 28, 2011 9:06 am |
|
 |
|
iivantodorov
Ранг: Минаващ
Регистриран на: Пет Фев 05, 2010 7:53 pm Мнения: 25
|
Aбе май се оправих, да видим ...
Благодаря ви за отговорите.
Последно имам едно малко питане, че макар готото да деструктурира кода (както пишат по учедниците  ), понякога се налага да се ползва и то доста облекчава задачата но и вкарва питанки.
if(условие) {
код;
код;
if(условие) goto label1;
код;
}
else if(условие){
label1:код1;
код2;
код3;
}
else {
код;
код;
}
Тук след като се прескочи на label1 и се изпълни поредицата от конструкции (код1,2,3), ще се изпълни ли else или ще се прескочи?
|
| Пон Апр 04, 2011 2:43 pm |
|
 |
|
head_up
Ранг: Форумен бог
Регистриран на: Нед Юни 01, 2008 9:54 pm Мнения: 1503 Местоположение: Пловдив
|
iivantodorov, не би трябвало да се изпълни кода в else-а, защото след приключване на кода в if-a ще последва branch always нейде след else{ ... }
Само, че ако искаш да пишеш код и изобщо да си вадиш хляба с тая работа - забрави тоя стил на писане. Не е случайно дето са ти го казали в учебниците. Да, удобно е понякога да сложиш goto, дори се случва да е приемливо в редки случай. Но да го ползваш както си се засилил - не си познал. Първия път, в който някой ти прегледа кода ще те прати подяволите и ще си търсиш работа другаде. Учи се да пишеш четлив код, такива изцепки с goto да те хвърля вътре в if-ове ... няма да прокопсаш така.
С повече търсене тук някъде ще намериш тема за употребата на goto и можеш да почетеш наволя "за" и "против". Препоръчвам ти го.
|
| Пон Апр 04, 2011 3:29 pm |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
Ха, ха - ей с тоя код направо ме умори от смях!
Как я измисли тая плетеница, честно незнам как би реагирал един ANSI компилатор на подобен безумен код.
За какво въобще го навря това goto??? Що не написа просто:
Ако искаш да пестиш място от код123, т.е. да не ти се дублира, ми хората са ти дали функции за това.
Бе ти да не си писал някога на някакъв извратен компютърен език? Щото аз никога не съм срещал начинаещ програмист, на който да му хрумват подобни извратени алгоритмични структури.....
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Пон Апр 04, 2011 3:31 pm |
|
 |
|
Reader
Ранг: Новодошъл
Регистриран на: Нед Апр 17, 2005 9:23 am Мнения: 112
|
Ако вземе да номерира условията (да се знае дали някои съвпадат), може още да се оптимизира.
Цецо, примерът ти не пасва по функционалност на неговия код. 
|
| Пон Апр 04, 2011 3:52 pm |
|
 |
|
iivantodorov
Ранг: Минаващ
Регистриран на: Пет Фев 05, 2010 7:53 pm Мнения: 25
|
Ми писал съм преди много години на бейсик, после писах малко на асемблер.
И да прави сте, че е кофти структурирано така, ... но за това и питам, да се уверя няма ли все пак да стане.
Можех и да не пестя място и да го напиша като Цецо го драсна, можеше и функцийка да направя, но рекох, че с гото ще скочи по-бързо от колкото да вика функция и да се губи време. Пък и за такива дреболии ако пишем фунции, то ще стане 100 пъти по-голяма плетеница.
Примерно този код1,2,3 имам да го ползвам 2 пъти във функцията, точно в тези 2 иф-а и той има да изпълни 8 прости неща.
Но щом е по-добре, ще го напиша 2 пъти. 
|
| Пон Апр 04, 2011 3:57 pm |
|
 |
|
Цецо
Ранг: Форумен бог
Регистриран на: Пон Сеп 27, 2004 9:22 am Мнения: 15501 Местоположение: София
|
Със сигурност не мога да постигна неговата "функционалност"  :):) Пак добре, че е ръгнал goto към вътрешноста на структура if-else, можеше да направи goto към вътрешността на функция
Да точно това прозрях като те питах дали не си ползвал някакви извратени езици за програмиране. Структурното програмиране ти е тотално непознато, за теб програмата е просто една плетеница от точки и линии през които трябва да намериш най-краткия път.
Обучението по бейсик върху правец 82 е най-добрия начин да опрапастиш един начинаещ програмист.
_________________ "Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.
|
| Пон Апр 04, 2011 4:32 pm |
|
 |
|
iivantodorov
Ранг: Минаващ
Регистриран на: Пет Фев 05, 2010 7:53 pm Мнения: 25
|
Не ми е баш непознато, доста време се блъсках да чета, добре, че са форумите, иначе сам само с книгите е трудно.
В сегашната ми програма, си имам хедърен файл в който съм си описал глобалните променливи, прототипите на функциите, разните му дефиниции ...
по-големите функции съм ги отделил в отделни файлове и са инклууд-нати в основния. Ползвам си всички основни управляващи конструкции, ползвам си указатели, ползвам си масиви ... обаче има дреболии и тънкости които все пак се налага да попитам и не всеки път мога да ги схвана сам.
Примерно, готото в асемблер е супер удобно, и в С ми се вижда удобно но вреди на кода.
Основно ми куцат алгоритмите, за което ще помоля за някаква литература, където да прочета основни похвати. В момента чета един самоучител по С на Хърбърт Шилдт.
|
| Пон Апр 04, 2011 4:55 pm |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 1 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|