|
Виж темите без отговор | Виж активните теми
Дата и час: Пон Юли 27, 2026 11:04 am
Тест за "добри" С програмисти.
| Автор |
Съобщение |
|
HCL
Ранг: Форумен бог
Регистриран на: Вто Дек 14, 2004 1:31 pm Мнения: 3849
|
А я кажете как се гледа на GOTO в embedded областта. Много ми харесва, като идея, но в обектно ориентираното програмиране много го плюят. Пирев ми обясни преди време защо не е добре да го използва човек, особено в големи сорсове, но аз си мисля, че в малки програмки от по няколко стотин реда няма да се згуби прегледноста, а ще внесе доста гьвкавост.
Какво мислите? Как ще реагирате ако видите такьв код.
|
| Пон Яну 23, 2006 10:41 pm |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
от мои наблюдения с goto може доста добре да се оптимизира програмата. Дали ще го ползваш или не не зависи от големината на програмата. Понякога даже кода става по разбрам и четлив. Самото използване на гото не е нито добро нитоп лошо,зависи как го ползваш.
|
| Пон Яну 23, 2006 11:06 pm |
|
 |
|
ДедоБоре
Ранг: Форумен бог
Регистриран на: Нед Ное 21, 2004 11:31 pm Мнения: 10088
|
абе в embedded системи динамичната памет е ... разтегливо понятие. по принцип паметта е ограничена и трябва да се планира много внимателно, за да си сигурен, че няма да свърши. подходите са два:
1. работиш със статично дефинирани маси, на базата на изскукани от пръстите дефиниции. ако проекта се компилира, не трябва да има в последствие изненади от рода на задействано куче на 2456-тия час от работата.
2. имаш алокатор/деалокатор/дефрагментатор и динамични данни. трябва да си адски сигурен какво прави това животно, за да го сложиш. поне при мен е така. имам една библиотека, писана е преди години и е симулирана в много тежки условия.
но втория начин е единствния, когато се работи със стекове, списъци, дървета и други такива разстения.
|
| Пон Яну 23, 2006 11:15 pm |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
Абе все пак темата беше за добри C програмисти.  Не добри ембедед такива.
По отношение на goto - единственият читав и четлив начин за авариен изход от дадена ф-я ако се налага зачистване някакво.
|
| Пон Яну 23, 2006 11:30 pm |
|
 |
|
HCL
Ранг: Форумен бог
Регистриран на: Вто Дек 14, 2004 1:31 pm Мнения: 3849
|
Значи се използвало. А наш проф не искаше и дума да чуе. Е, аз го писах на 1,2 места на изпита ... и горда 3-ка, ама айде, няма да е било само от това... 
|
| Пон Яну 23, 2006 11:34 pm |
|
 |
|
Реконструктор
Ранг: Форумен бог
Регистриран на: Съб Сеп 25, 2004 12:32 pm Мнения: 8382 Местоположение: София
|
Е, ако слагаш за щяло и нещяло, нормално е да не се хареса.
|
| Пон Яну 23, 2006 11:36 pm |
|
 |
|
HCL
Ранг: Форумен бог
Регистриран на: Вто Дек 14, 2004 1:31 pm Мнения: 3849
|
До колкото си спомням правих проверка за валидност на вход от потребителя и ако се оплескаше нещо просто препращах в началото на функцията. Нямаше време да миля за друго, а и бях оставил прозорче да се измькне от функцията, но предполагам, не е и най-елегантното решение.
|
| Пон Яну 23, 2006 11:48 pm |
|
 |
|
bateAz
Ранг: Форумен бог
Регистриран на: Нед Сеп 26, 2004 4:11 pm Мнения: 3750 Местоположение: София
|
Ами аз си го ползвам. Откъде да знам, че било много лошо?
Рядко е, ама се случва. Много пъти без него се получават едни засукани писания, та ум да ти зайде.
|
| Пон Яну 23, 2006 11:48 pm |
|
 |
|
vlado
Ранг: Популярен
Регистриран на: Чет Ное 10, 2005 9:26 pm Мнения: 393 Местоположение: Buffalo, NY, USA
|
Аз по принцип се пазя от ползване на GOTO. Само ако не мога да ползвам нищо друго, тогава се замислям. И пак слагам много коментари че да се знае...
|
| Вто Яну 24, 2006 12:03 am |
|
 |
|
¶
Ранг: Форумен бог
Регистриран на: Пет Фев 25, 2005 1:58 pm Мнения: 4585 Местоположение: US
|
Аз не сещам какво съм обяснил преди време на HCL за goto  , тъй като общо взето не помня вчера какво съм работил
Не приемам че трябва да има догми в програмирането, хардуера или в каква да е друга област на техниката. Защото иначе ще мирише на инквизиция.
Това че някой си твърди, че дадена езикова конструкция не бива да се използва поради неясни негови си професорски причини, не означава че трябва да приемаме всичко казано от него за вярно. По скоро бих приел този професор, ако те накара, мислейки самостоятелно, да достигнеш сам до отговора защо и къде не бива да използваш goto, и защо и къде бива да го използваш.
Не харесвам оператора goto, защото когато ми се наложи да го използвам, осъзнавам, че алгоритъма ми не е напълно избистрен. Но понякога се примирявам и го използвам, защото това е единствения начин да постигнеш определена цел. Когато пишеш бази данни е неприемлив, но обаче когато пишеш драйвери спестява много писаници и излишни проверки.
Забраненото е най-сладкото нещо. Керниган и Ритчи са заложили goto в езика преди 30-тина години. Имало е защо. Който иска да го използва, който иска да не го използва. Не може професорът да забранява оператора goto. Може да го забранят Керниган и Ритчи или комисията по ANSI C.
Относно конвенцията, използвам унгарската нотация, тъй като много лесно се поддържа такъв код. Дори и след години да се върна на такъв код, доста бързо си припомням какво съм правил. Да не говорим, ако трябва на друг програмист да поддържам програмата. Освен това се старая да използвам винаги английски имена за имена на променливи, функции и т.н. Представете си ситуацията, че този код един ден го продам на някой чужденец (македонците не влизат в кюпа). Как ще се оправи с имена от рода на: Tarsene, Savpadanie, Prekasvane, IzhodOtPrekasvane и т.н. ?
А коментарите са ми най-отвратителното нещо. В момента на писане на кода, не намирам ползата от тях. Обаче след 2-3 седмици като се върна на същия код, гледам като българин входа на месарския магазин, с облещени очи и пресъхнала уста. Аджи-ба тва аз ли съм драскал или съм отворил грешен файл  Затова си пиша коментарите и по време на създаването на кода и най-вече след приключване на даден програмен сегмент.
_________________ Ето аз дишам, работя, живея и програми пиша тъй както умея, с проца под вежди се гледаме строго и боря се с него доколкото мога....
|
| Вто Яну 24, 2006 12:23 am |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
За embedded програмирането изискването да не се ползва goto e безпочвено. Колкото по детаилно му укажеш на компилатора какво искаш от него толкова резулатата които ще ти даде ще е по близо до очакваното. А какво по естествено има от goto. Направо си е чиста асемблерска инструкция,няма какво да го мъдри компилатора просто отива там. Разбира се goto пречи донякъде на компилатора да направи оптимизация. За това в ситуациите когато се използва goto не е добре да се ползват сложни C конструкции,тогава може да се окаже че генерирания код ще е доста неоптимизиран. Абе ако човек си гледа asm листинга които прави компилатора бързо свиква кога какъв подход да ползва.
|
| Вто Яну 24, 2006 12:36 am |
|
 |
|
Dimitar
Ранг: Форумен бог
Регистриран на: Пет Ное 12, 2004 3:38 pm Мнения: 9103 Местоположение: Chicago, IL
|
Аз може да несъм много читав ембедед програмист - ама тука немога да се съглася. GOTO винаги са ми казвали, че не е за препоръчване - особенно пък в ембедед системи. Така може да се замоташ с него, че накрая да не си сигурен изпълнението на програмата през къде ще мине и къде ще се върне. С него става най-лесно, но не е нито най-прегледно, нито най-сигурно.
|
| Вто Яну 24, 2006 1:44 am |
|
 |
|
HCL
Ранг: Форумен бог
Регистриран на: Вто Дек 14, 2004 1:31 pm Мнения: 3849
|
Dimitar аз дори не сьм програмист, но ще си позволя да отбележа, че намирам мнението ти най-малкото за необосновано. И на мен така ми казаха, но когато попитах защо, последва отговор "Просто е така" Смятам, че сьм разсьждаващо сьщество и имам някакви базови познания, които ми позволяват да видя, известни удобства в употребата на GOTO. В моя случай, го използвах за изход от функция. Не виждам кое тук внася неяснота в кода. Проверявам някакво условие с if и ако нещо не ми харесва врьщам в точка А и наново докато ми хареса. Затова ми допадна толкова, по ясно нещо просто няма накьде. Може да е признак за недомислен алгоритьм, както каза Пирев, но в дадени ситуации си пасва на мястото и не бих тьрпял повторно да ми се натяква, че сорса ми не струвал заради използването му. Пьк знам ли, може и след време да огелпя конците някьде и да си променя мнението 
|
| Вто Яну 24, 2006 2:07 am |
|
 |
|
Dimitar
Ранг: Форумен бог
Регистриран на: Пет Ное 12, 2004 3:38 pm Мнения: 9103 Местоположение: Chicago, IL
|
Ами незнам, но аз мисля, че с един while ще стане доста по прегледно. Поне ще знаеш за какво става въпрос още като го срещнеш, докато като видиш етикета на goto-то още нищо няма да знаеш. Незнам - мои си мисли, но и аз подкрепям Пирев, че ако се стигне до него, значи нещо с алгоритъма не е наред - поне до такъв извод съм стигнал във моя опит досега. Не е правилно да се казва и, че понеже е нормален за асемблера - значи е естествен и за С-то, щото ако беше така, щеше да си ползваме асемблера само.
|
| Вто Яну 24, 2006 2:30 am |
|
 |
|
Nikola Kirov
Ранг: Форумен бог
Регистриран на: Нед Окт 31, 2004 9:19 pm Мнения: 4464 Местоположение: Stara Zagora
|
Е добре де какво му е непрегледното на goto.
Ето сега правих еднин комуникационен протокол доста усложнен. Ами имам си един участък в края на функцията
----------------------------
----------------------------
----------------------------
ок:
push_command(command);
error:
counter = 0;
conterbytes = 0;
timeout = 0;
state = 0;
}
имам 2 типа команди които се опознават на различни места но и двата типа команди в краина сметка правят push_comand() тоест слагат в опашката от задачи съответната приета kоманда след което се ресетва всичко.
едната краина точка директо излиза на ок: но от другата идвам с goto:
има и 7 проверки за грешки и всичките излизат с goto err:
Няма по прегледно решение без goto. И ако все пак се намери няма да даде толкова стегнат код. Това е протокол които се декодира направо на самото прекъсване и извикването на други функции от програмата на прекъсването генерира съхраняване на много регистри. push_command(command); e inline функция.
Често начина да избегнеш goto е да си разбиеш функцията на няколко по малки но това е свързано с увеличаването на необходимата памет за стек и на всичкото отгоре дава доста по бавен код че и по голям като обем. Embedded програмирането не е съвсем програмиране на високо ниво и нормите които са мислени за програмиране на високо ниво не са винаги приложими в него. Аз като пиша за PC поччти не се замислям за ресурсите които гълта програмата,даже не знам къде студиото показва размера на генерираното exe. Разбира се като пиша за PC почти не ползвам goto. Предпочитам да си разбивам задчата в повече функции и почти не ми се налага да го ползвам.
|
| Вто Яну 24, 2006 5:45 am |
|
|
Кой е на линия |
Потребители разглеждащи този форум: 0 регистрирани и 4 госта |
|
Вие не можете да пускате нови теми Вие не можете да отговаряте на теми Вие не можете да променяте собственото си мнение Вие не можете да изтривате собствените си мнения Вие не можете да прикачвате файл
|
|