Отговори на тема  [ 46 мнения ]  Отиди на страница 1, 2, 3, 4  Следваща
Използване на goto и labels в C 
Автор Съобщение
Ранг: Популярен
Ранг: Популярен
Аватар

Регистриран на: Съб Дек 10, 2005 11:44 am
Мнения: 326
Местоположение: Lake Geneva Shoreline
Мнение Използване на goto и labels в C
Според вас, струва ли се понякога да се използва goto или трябва да се избягва на всяка цена? В повечето книги споменават, че го има, но не бива да се ползва. Наскоро взех да чета това-онова за Линукс на по-ниско ниво и се оказва, че в ядрото на доста места има вмъкнати labels и goto. Linus Torvalds твъри, че няма нищо лошо в тази практика и всичко зависи от програмиста. Предимството е, че с goto по-бързо се излиза от вложени цикли и от case-switch. Дали е просто въпрос на дисциплинирано ползване? Те от джабата и C# са махнали указателите уж за по-сигурно, ама в крайна сметка ако наистина има проблеми те са в програмистите, не в указателите...

_________________
Manners maketh man.


Съб Сеп 18, 2010 2:19 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Юни 01, 2008 9:54 pm
Мнения: 1503
Местоположение: Пловдив
Мнение 
николайчо, май няма нищо лошо ако сам си четеш кода. недай боже някой друг да го хване ще му се иска да те :axe: то тогава се разчупва толкова много, та ще е по-лесно четящият да го пренапише отколкото да го разбере. пък навремето нали точно ти ме подритваше да не го ползвам това goto, щот си го бях заобичал от asm за пиковете, сега какво си извъртял лопатата :D


Съб Сеп 18, 2010 3:34 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 9:59 pm
Мнения: 6019
Местоположение: София
Мнение 
Хайде да почнем инициатива да се махне goto инструкцията във всички процесори.

_________________
Warriors of the Night, ASSEMBLER!!!


Съб Сеп 18, 2010 4:17 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Юни 01, 2008 9:54 pm
Мнения: 1503
Местоположение: Пловдив
Мнение 
ike написа:
Хайде да почнем инициатива да се махне goto инструкцията във всички процесори.


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

ама да не спамим темата - човека питаше хубаво ли да лепи такива неща в Ц-то :)


Съб Сеп 18, 2010 4:45 pm
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Вто Юли 31, 2007 2:55 pm
Мнения: 1792
Местоположение: София
Мнение Re: Използване на goto и labels в C
mountaineer написа:
струва ли се понякога да се използва goto

Където, когато и колкото трябва. Като всичко друго. 8)


Съб Сеп 18, 2010 6:37 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пет Фев 04, 2005 9:59 pm
Мнения: 6019
Местоположение: София
Мнение 
head_up написа:
ама да не спамим темата - човека питаше хубаво ли да лепи такива неща в Ц-то :)


Мнението ми е съвсем по темата. Щом инстрокцията я слагат в процесорите - значи си трябва.
Сега дали ще я ползваш да се застреляш в крака, това зависи само от програмиста. Ама ако ще се застреля с goto, то и да му го вземеш все ще намери от някаде един pointer и с него ще се гръмне в главата.

_________________
Warriors of the Night, ASSEMBLER!!!


Съб Сеп 18, 2010 8:19 pm
Профил
Ранг: Почетен член
Ранг: Почетен член
Аватар

Регистриран на: Вто Окт 03, 2006 11:58 am
Мнения: 924
Местоположение: Ботевград
Мнение 
То това goto май го заклеймиха едно време заради Бейсика. То вярно, че там се ползваше през 2-3 реда, ама езика си беше дървен. В С-то спокойно може да си мине и без него, поне до сега не ми се е налагало да го ползвам. А за човек(визирам мен), започнал с Бейсик и после минал на С - това си е постижение. Може би прехода Бейсик-Паскал-С е оказал ползотворно въздействие :)


Съб Сеп 18, 2010 10:16 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Юни 01, 2008 9:54 pm
Мнения: 1503
Местоположение: Пловдив
Мнение 
Zeus написа:
В С-то спокойно може да си мине и без него, поне до сега не ми се е налагало да го ползвам.


+1

В Ц-то всякак може да го въртиш, ще стане без goto, ама човека казва, че е по-бързичко в някой ситуации. от друга страна - ако искаш бързо определено няма да пишеш на Ц, или поне не през ГЦЦ-то. в крайна сметка ако трябва скорост - дерзай на asm, пък ако проца смогва (а на последък повечето смогват за малко пари) - не си струва да си троши главата в стената.


Нед Сеп 19, 2010 12:19 am
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Чет Окт 07, 2004 1:22 pm
Мнения: 1949
Местоположение: София
Мнение 
Виждал съм goto в много сериозни кодове, последно помня и в ffdshow сорса, даже и в quake...аз лично не ползвам, но доколкото знам не пречи


Нед Сеп 19, 2010 2:44 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пет Фев 25, 2005 1:58 pm
Мнения: 4585
Местоположение: US
Мнение 
Щом са го заложили в езика, значи можеш при нужда да го използваш. Това е все едно да наплюем някоя дума от българския език и да започнем да твърдим, че не е хубаво да се използва и да я изключим от речника. Дискусията за goto много напомня на дискусията кое е първично, кокошката или яйцето, с мъдрия отговор на Пурко ( Господин за един ден ), че кокошка може да прелети отвсякъде, но яйцето не.

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

_________________
Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....


Нед Сеп 19, 2010 2:55 am
Профил WWW
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Пон Сеп 27, 2004 9:22 am
Мнения: 15501
Местоположение: София
Мнение 
goto обикновенно се използва за доизкърпване. Като имаш написан много сложен код с купища вложени цикли и условности и ти се наложи да сложиш някакво разклонение. Тогава goto те спасява. Щото понякога е рисковано да седнеш да пренаписваш всичко изначало та да промениш дървото. Току виж си пропуснал нещо, не го доистестваш и после съжаляваш. А така ръгаше едно goto и си вкарваш новия клон в дървото без да го сечеш и садиш отново.

Но като пишеш първичния код - спокойно можеш и без него.

Затуй в Лайнукс ядрото предполагам е пълно с него. Щото и то горкото е кръпка до кръпка. При това го кърпи кой отде го хване, после се почват едни кръпки на кръпките и накрая като го погледнеш отстрани и ти се вие свят. Орташка му работа :)

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


Пон Сеп 20, 2010 9:05 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог
Аватар

Регистриран на: Сря Апр 27, 2005 12:48 pm
Мнения: 6094
Мнение 
по-бързо било с него, спасявал каруцата, достъпен и ясен бил.....

Анатема, няма да го ползвате!!!... програмисти...

_________________
main[-1u]={1};


Пон Сеп 20, 2010 9:50 am
Профил ICQ
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Нед Фев 26, 2006 6:52 pm
Мнения: 11266
Местоположение: Добрич
Мнение 
Цецо написа:
Затуй в Лайнукс ядрото предполагам е пълно с него. Щото и то горкото е кръпка до кръпка. При това го кърпи кой отде го хване, после се почват едни кръпки на кръпките и накрая като го погледнеш отстрани и ти се вие свят. Орташка му работа :)


Бе че се ползва goto, ползва се... ей тука пуснах едно търсене в 2.6 и цели 6757 ц-файла съдържащи перверзната думичка...
Така погледнато изглежда страшно, но то просто си е огромно. Иначе в сорсовете дето аз съм се ровил няма goto. Не бих казал и че е "кръпка до кръпка".
Напротив, повечето сорсове са доста изчистени. Функциите масово са с размер под 20-30 реда, простички и разбираеми.


Не казвам че всичко като краен резултат е цвете, но съм имал шанса да видя много неща от бозата на М$ в сорс. Разликата е просто оооогромна!! Линукс като сорс е 100 пъти по-четим и 100 пъти по-изчистен. И не мисля че преувеличавам изобщо. Самият факт, че всеки по-добър програмист *може* и *се* ориентира в компилации от 30 до 100 000 файла говори само по себе си.
В М$ е *невъзможно* да се ориентираш само от сорса. Най-малкият проблем е, че липсват сорсовете на куп. Ние навремето успяхме да изтръгнем къде официално къде не едва 20-30 файла, но не това е проблема. Значи и всичките да ги има човек е все тая, просто при М$ сорсовете са безполезни, ако нямаш документацията и съпорта. За щастие те имат и двете, като особено документацията им е направо на светлинни години спрямо линукса...


Пон Сеп 20, 2010 11:13 am
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Пон Дек 19, 2005 12:21 pm
Мнения: 1037
Мнение 
В Линукс goto много често се ползва за освобождаване на заделени ресусри при неуспех в инициализацията. Обикновено при зареждането на драйвер трябва да се заделят N ресурса и съответно при неуспех в някоя от стъпките да се освободят само тези, които са вече заделени. Примерно:

в началото на функцията:

Задели ресурс 1, при неуспех goto L1;
Задели ресурс 2, при неуспех goto L2;
Задели ресурс 3, при неуспех goto L3;
...
Задели ресурс N, при неуспех goto LN;

тука e основния код на функцията;

и към края на функцията:

LN: освободи ресурс N;
...
L3: освободи ресурс 3;
L2: освободи ресурс 2;
L1: освободи ресурс 1;

Така много елегантно при проблем в инициализацията се освобождават само тези ресурси, които вече са били заделени и то в обратен ред. При успех пък и достигане на края на функцията се освобождават всички, пак в подходящия ред. Това вместо с goto може да се направи естествено и с други средства, но или ще има повторение на код, или сложни вложени условни оператори. Та ето един пример в който употребата на goto прави кода по-лесен за четене и поддръжка.


Пон Сеп 20, 2010 4:14 pm
Профил
Ранг: Форумен бог
Ранг: Форумен бог

Регистриран на: Вто Фев 06, 2007 8:44 pm
Мнения: 3175
Местоположение: Пловдив
Мнение 
Още един глас за използване на ГОТО-то.

Разбира се, че правилното му използване води до по-ефективен код като скорост.
Разбира се и че правилното му използване води и до по-ефективен код като размер.
Та на всичко отгоре може да доведе и до по-четим код ... Зависи от случая ...

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

Не мога да схвана каква е тази самоцел - дайте да се гърчим и да мислим идиотски констрикции от оператири само за да не използваме Goto ? Това ми звучи малко смахнато, не мислите ли ?


Пон Сеп 20, 2010 5:26 pm
Профил
Покажи мненията от миналия:  Сортирай по  
Отговори на тема   [ 46 мнения ]  Отиди на страница 1, 2, 3, 4  Следваща

Кой е на линия

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


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

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