Микроконтролери и електроника
http://mcu-bg.com/mcu_site/

Незабавен изход от функция в С
http://mcu-bg.com/mcu_site/viewtopic.php?f=16&t=8740
Страница 1 от 3

Автор:  iivantodorov [ Пет Мар 25, 2011 4:33 pm ]
Заглавие:  Незабавен изход от функция в С

Здравейте и ме извинете за глупавия въпрос. :D

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

Примерно:

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

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

Автор:  syscop [ Пет Мар 25, 2011 4:46 pm ]
Заглавие: 

goto :D

Автор:  MidNighT_SpiRiT [ Пет Мар 25, 2011 4:46 pm ]
Заглавие: 

Организирай така нещата, че да няма нужда от return - примерно с if - else. Но и да сложиш return не виждам никакъв проблем освен, че кодът става по-трудно разбираем.

Автор:  Цецо [ Пет Мар 25, 2011 6:00 pm ]
Заглавие:  Re: Незабавен изход от функция в С

iivantodorov написа:
ако използвам return без да връщам някаква стойност, се получават сакатлъци.


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

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

Автор:  ike [ Пет Мар 25, 2011 6:31 pm ]
Заглавие: 

И аз си мисля, че точно return е за това.

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

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

Автор:  zaphod [ Съб Мар 26, 2011 8:22 am ]
Заглавие: 

директен ретърн се ползва, а ако имаш някакви затваряния - с гото.
аз обаче подозирам че въпроса ти не е до ретърна, а просто не си си изчистил представата какво трябва да прави тая функция :) в смисъл, не си си отговорил на въпроса какво правим от извикващата страна ако излезе в средата, на което разбира се ние не можем да отговорим :)

Автор:  iivantodorov [ Пон Мар 28, 2011 8:30 am ]
Заглавие: 

Благодаря за отговорите.
Ами правя едно меню с 4 подменюта, и ако от някое под меню трябва да изляза преждевременно и използвам return вместо в главното ме праща в някое от другите подменюта. Иначе с break, всичко е точно.
Но мисля, че zaphod може да излезе прав :lol:
Не пускам код, защото знам, че правя менюто по лаишки начин и ще има бъзикни :D

Автор:  CarBeta [ Пон Мар 28, 2011 9:06 am ]
Заглавие: 

RETURN те връща точно там, където си извикал функцията. Ако от едното подменю отиваш към следващото с CALL, нормално e след RETURN да се върнеш в предишното подменю.

Автор:  iivantodorov [ Пон Апр 04, 2011 2:43 pm ]
Заглавие: 

Aбе май се оправих, да видим ...
Благодаря ви за отговорите.
Последно имам едно малко питане, че макар готото да деструктурира кода (както пишат по учедниците :D ), понякога се налага да се ползва и то доста облекчава задачата но и вкарва питанки. :)

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

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

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

Автор:  head_up [ Пон Апр 04, 2011 3:29 pm ]
Заглавие: 

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

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

Автор:  Цецо [ Пон Апр 04, 2011 3:31 pm ]
Заглавие: 

Ха, ха - ей с тоя код направо ме умори от смях!

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

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


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

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

Автор:  Reader [ Пон Апр 04, 2011 3:52 pm ]
Заглавие: 

Ако вземе да номерира условията (да се знае дали някои съвпадат), може още да се оптимизира.

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

Автор:  iivantodorov [ Пон Апр 04, 2011 3:57 pm ]
Заглавие: 

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

И да прави сте, че е кофти структурирано така, ... но за това и питам, да се уверя няма ли все пак да стане.
Можех и да не пестя място и да го напиша като Цецо го драсна, можеше и функцийка да направя, но рекох, че с гото ще скочи по-бързо от колкото да вика функция и да се губи време. Пък и за такива дреболии ако пишем фунции, то ще стане 100 пъти по-голяма плетеница.
Примерно този код1,2,3 имам да го ползвам 2 пъти във функцията, точно в тези 2 иф-а и той има да изпълни 8 прости неща. :)
Но щом е по-добре, ще го напиша 2 пъти. :)

Автор:  Цецо [ Пон Апр 04, 2011 4:32 pm ]
Заглавие: 

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


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

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


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

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

Автор:  iivantodorov [ Пон Апр 04, 2011 4:55 pm ]
Заглавие: 

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

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

Страница 1 от 3 Часовете са според зоната UTC + 2 часа [ DST ]
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/