Отговори на тема  [ 35 мнения ]  Отиди на страница 1, 2, 3  Следваща
Незабавен изход от функция в С 
Автор Съобщение
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пет Фев 05, 2010 7:53 pm
Мнения: 25
Мнение Незабавен изход от функция в С
Здравейте и ме извинете за глупавия въпрос. :D

Как най-елегантно да прекратя изпълнението на дадена функция, при определено условие?

Примерно:

void функция(void)
{
код
код
......
условие за предварителни прекратяване изпълнението на фукнцията
......
код
}

Пробвах с конструкцията break за изход от цикъл, става но не ми се струва удачно, ако използвам return без да връщам някаква стойност, се получават сакатлъци. Начинаещ съм и още не съм на ясно с много неща, а в книгите които чета няма всичко и се налага да питам тук там. :)


Пет Мар 25, 2011 4:33 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Юни 03, 2005 9:39 pm
Мнения: 2283
Мнение 
goto :D


Пет Мар 25, 2011 4:46 pm
Профил
Ранг: Напреднал
Ранг: Напреднал
Аватар

Регистриран на: Нед Сеп 17, 2006 12:00 pm
Мнения: 450
Местоположение: Plovdiv
Мнение 
Организирай така нещата, че да няма нужда от return - примерно с if - else. Но и да сложиш return не виждам никакъв проблем освен, че кодът става по-трудно разбираем.


Пет Мар 25, 2011 4:46 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение Re: Незабавен изход от функция в С
iivantodorov написа:
ако използвам return без да връщам някаква стойност, се получават сакатлъци.


Какви сакатлъци да се получават? Няма сакатлъци, използването на return по средата на функцията си е нормална програмистка практика. Дали ще връщаш стойност или не, няма отношение по въпроса, сакътлъци не би трябвало да се получават.

Ако компилатора ти е нормален ANSI C, де :)

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Пет Мар 25, 2011 6:00 pm
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 9:59 pm
Мнения: 6019
Местоположение: София
Мнение 
И аз си мисля, че точно return е за това.

А за да не стават сакатлъци промени функцията:

int функция(void)
{
код
код
......
условие за предварителни прекратяване изпълнението на фукнцията; return -1;
......
код
return 5;
}

_________________
Warriors of the Night, ASSEMBLER!!!


Пет Мар 25, 2011 6:31 pm
Профил
Online
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Нед Юли 24, 2005 10:28 am
Мнения: 2692
Мнение 
директен ретърн се ползва, а ако имаш някакви затваряния - с гото.
аз обаче подозирам че въпроса ти не е до ретърна, а просто не си си изчистил представата какво трябва да прави тая функция :) в смисъл, не си си отговорил на въпроса какво правим от извикващата страна ако излезе в средата, на което разбира се ние не можем да отговорим :)


Съб Мар 26, 2011 8:22 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пет Фев 05, 2010 7:53 pm
Мнения: 25
Мнение 
Благодаря за отговорите.
Ами правя едно меню с 4 подменюта, и ако от някое под меню трябва да изляза преждевременно и използвам return вместо в главното ме праща в някое от другите подменюта. Иначе с break, всичко е точно.
Но мисля, че zaphod може да излезе прав :lol:
Не пускам код, защото знам, че правя менюто по лаишки начин и ще има бъзикни :D


Пон Мар 28, 2011 8:30 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Май 01, 2009 4:01 pm
Мнения: 1438
Мнение 
RETURN те връща точно там, където си извикал функцията. Ако от едното подменю отиваш към следващото с CALL, нормално e след RETURN да се върнеш в предишното подменю.


Пон Мар 28, 2011 9:06 am
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пет Фев 05, 2010 7:53 pm
Мнения: 25
Мнение 
Aбе май се оправих, да видим ...
Благодаря ви за отговорите.
Последно имам едно малко питане, че макар готото да деструктурира кода (както пишат по учедниците :D ), понякога се налага да се ползва и то доста облекчава задачата но и вкарва питанки. :)

if(условие) {
код;
код;
if(условие) goto label1;
код;

}
else if(условие){
label1:код1;
код2;
код3;
}
else {
код;
код;
}

Тук след като се прескочи на label1 и се изпълни поредицата от конструкции (код1,2,3), ще се изпълни ли else или ще се прескочи?


Пон Апр 04, 2011 2:43 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Юни 01, 2008 9:54 pm
Мнения: 1503
Местоположение: Пловдив
Мнение 
iivantodorov, не би трябвало да се изпълни кода в else-а, защото след приключване на кода в if-a ще последва branch always нейде след else{ ... }
Само, че ако искаш да пишеш код и изобщо да си вадиш хляба с тая работа - забрави тоя стил на писане. Не е случайно дето са ти го казали в учебниците. Да, удобно е понякога да сложиш goto, дори се случва да е приемливо в редки случай. Но да го ползваш както си се засилил - не си познал. Първия път, в който някой ти прегледа кода ще те прати подяволите и ще си търсиш работа другаде. Учи се да пишеш четлив код, такива изцепки с goto да те хвърля вътре в if-ове ... няма да прокопсаш така.

С повече търсене тук някъде ще намериш тема за употребата на goto и можеш да почетеш наволя "за" и "против". Препоръчвам ти го.


Пон Апр 04, 2011 3:29 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
Ха, ха - ей с тоя код направо ме умори от смях!

Как я измисли тая плетеница, честно незнам как би реагирал един ANSI компилатор на подобен безумен код.

За какво въобще го навря това goto??? Що не написа просто:
Код:
if(условие) {
   код;
   код;
   if(условие) {
      код1;
      код2;
      код3;
   }
   код;
}
else if(условие){
   код1;
   код2;
   код3;
}
else {
   код;
   код;
}


Ако искаш да пестиш място от код123, т.е. да не ти се дублира, ми хората са ти дали функции за това.

Бе ти да не си писал някога на някакъв извратен компютърен език? Щото аз никога не съм срещал начинаещ програмист, на който да му хрумват подобни извратени алгоритмични структури.....

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Пон Апр 04, 2011 3:31 pm
Профил ICQ
Ранг: Новодошъл
Ранг: Новодошъл

Регистриран на: Нед Апр 17, 2005 9:23 am
Мнения: 112
Мнение 
Ако вземе да номерира условията (да се знае дали някои съвпадат), може още да се оптимизира.

Цецо, примерът ти не пасва по функционалност на неговия код. :wink:


Пон Апр 04, 2011 3:52 pm
Профил
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пет Фев 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
Местоположение: София
Мнение 
Reader написа:
Цецо, примерът ти не пасва по функционалност на неговия код. :wink:


Със сигурност не мога да постигна неговата "функционалност" :):):) Пак добре, че е ръгнал goto към вътрешноста на структура if-else, можеше да направи goto към вътрешността на функция :)

iivantodorov написа:
Ми писал съм преди много години на бейсик, после писах малко на асемблер. :)


Да точно това прозрях като те питах дали не си ползвал някакви извратени езици за програмиране. Структурното програмиране ти е тотално непознато, за теб програмата е просто една плетеница от точки и линии през които трябва да намериш най-краткия път.

Обучението по бейсик върху правец 82 е най-добрия начин да опрапастиш един начинаещ програмист.

_________________
"Да еба и шибаната държава" мислеше си Гошо, докато се опитваше да улучи кофата за боклук от балкона на осмия етаж.


Пон Апр 04, 2011 4:32 pm
Профил ICQ
Ранг: Минаващ
Ранг: Минаващ

Регистриран на: Пет Фев 05, 2010 7:53 pm
Мнения: 25
Мнение 
Не ми е баш непознато, доста време се блъсках да чета, добре, че са форумите, иначе сам само с книгите е трудно. :)
В сегашната ми програма, си имам хедърен файл в който съм си описал глобалните променливи, прототипите на функциите, разните му дефиниции ...
по-големите функции съм ги отделил в отделни файлове и са инклууд-нати в основния. Ползвам си всички основни управляващи конструкции, ползвам си указатели, ползвам си масиви ... обаче има дреболии и тънкости които все пак се налага да попитам и не всеки път мога да ги схвана сам.
Примерно, готото в асемблер е супер удобно, и в С ми се вижда удобно но вреди на кода. :?

Основно ми куцат алгоритмите, за което ще помоля за някаква литература, където да прочета основни похвати. В момента чета един самоучител по С на Хърбърт Шилдт.


Пон Апр 04, 2011 4:55 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 35 мнения ]  Отиди на страница 1, 2, 3  Следваща

Кой е на линия

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


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

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