Тут перевод TADS-мануала неожиданно натолкнул меня на мысль: что может заставить современнх программистов использовать оператор безусловного перехода a.k.a. goto? Речь, естественно, идет не о программировании на Ассемблере, Fortran 66 и т. п., а о более-менее структурированных языках, позволяющих теоретически вообще без него обойтись. Обращаюсь к программистам среди наших форумчан (их, к счастью, есть у нас:): пользуетесь ли вы оператором goto и в каких целях?
Начну, как положено, с себя. Я goto пользуюсь, пожалуй, исключительно при программировании на Visual Basic for Applications. Делаю это по следующим причинам: во-первых, ряд процедур удобнее генерировать при помощи встроенных "визардов", а они их генерят как раз с активным использованием goto. Править каждый раз такую процедуру вручную, убирая goto - значит сводить на нет все преимущества автоматизации;). Во-вторых, безусловный переход на метку в VBA удобно использовать при проверке на возникновение ошибки. В этом случае все обработчики ошибок локализуются в конце процедуры, что делает код в целом более читаемым. И, хотя теоретически подобной группировки можно добиться и другими средствами (и, например, программируя на Паскале, я бы совершенно точно организовал такую группировку без goto), в VBA такой способ кажется почему-то наиболее естественным и удобным.
Отредактировано uux (17.08.2007 21:40)
Неактивен
Один мой коллега с работы (все пишут на C/C++) очень любит использовать goto. Причем, никто его не заставляет. А даже наоборот, уговаривают не использовать. Но не помогают даже угрозы. Ну не может человек мыслить структурно. Научился программировать во времена ассемблера, с этим и остался. Его исходники никто не трогает, и вникать в них не возьмётся. Вот такая страшная история. %)
Неактивен
Статрая, но всё ещё актуальная статья на эту тему: http://kalinin.ru/programming/cpp/14_04_01.shtml
Сам я использовал goto за последние десяток лет всего раз — был выбор: либо использовать одну метку и один оператор goto, либо раздувать программу до немыслимых размеров…
Неактивен
Каждый раз когда пишу чтото в урке, пользуюсь гоуту ![]()
А вот в "нормальной" жизни уже года 4 использовать этот прекрасный оператор не было нужды
Неактивен
goraph написал:
Каждый раз когда пишу чтото в урке, пользуюсь гоуту
Вот-вот:). Кто скажет, что урка - не структурный язык?
) А вообще да, в те далекие времена, когда ваш покорный осваивал Си (в котором он, впрочем, безнадежный любитель), оным оператором не пользовался вообще.
Неактивен
U> Во-вторых, безусловный переход на метку в VBA удобно использовать при проверке на возникновение ошибки. В этом случае все обработчики ошибок локализуются в конце процедуры, что делает код в целом более читаемым.
Аналогично. Вообще я только в хендлерах и использую.
Просто меня еще в лицее научили, что использование GOTO плохой тон. ![]()
ЧТо касается урки, то там дело вкуса, можно использовать proc, можно goto.
Отредактировано - VampirE - (19.08.2007 19:43)
Неактивен
- VampirE - написал:
ЧТо касается урки, то там дело вкуса, можно использовать proc, можно goto.
интересно, и как ты без помощи гото предложишь написать например любой цикл? ![]()
Неактивен
Согласен. Тут промах вышел. Про циклы в урке совсем забыл. ![]()
Неактивен
Учусь на математика-программиста и поэтому призераю goto. В теории алгоритов есть постулат, что и без этого оператора можно создать ЛЮБОЙ алгоритм.
Использование этого оператора показывает несостоятельность программиста как такового.
Неактивен
VoLk88 написал:
В теории алгоритов есть постулат, что и без этого оператора можно создать ЛЮБОЙ алгоритм.
Разумеется. Но это не всегда целесообразно. Внимательно прочитай весь тред с начала, сходи по ссылке на статью. Попробуй разобраться сам, прежде чем "рубить с плеча".
VoLk88 написал:
Использование этого оператора показывает несостоятельность программиста как такового.
И ты сразу поверил? Какой наивный.
Неактивен
VoLk88 написал:
Учусь на математика-программиста и поэтому призераю goto. В теории алгоритов есть постулат, что и без этого оператора можно создать ЛЮБОЙ алгоритм.
Использование этого оператора показывает несостоятельность программиста как такового.
Чем громче слово, тем грамотней оно должно быть написано… А так, по теории русского языка употреблённое слово "призерать" напоминает глагол "призирать", и означает, наоборот, сочувственное отношение…
Ну а теперь по факту: за давностью лет я не помню точно, что была за задача, но ситуация была что-то типа этого:
УСЛОВИЕ 1
действие 1
действие 2
действие 3 <---------------------------------+
действие 4 |
УСЛОВИЕ 2 |
действие 5 |
действие 6 |
УСЛОВИЕ 3 |
действие 7 |
действие 8 |
УСЛОВИЕ 4 |
возможный переход к действию 3 ---+
КОНЕЦ УСЛОВИЯ 4
действие 9
КОНЕЦ УСЛОВИЯ 3
действие 10
КОНЕЦ УСЛОВИЯ 2
действие 11
КОНЕЦ УСЛОВИЯ 1Знающие люди (Dan Dare, привет!) отмечают, что именно эту схему можно было бы решить рекурсией, если бы не ограниченность в некоторых устройствах размеров стека.
Неактивен
Использую goto в самых редких и крайних случаях, иначе говоря когда он либо упрощает алгоритм и тем сокращает затраты времени на выполнение кода алгоритма или, когда без него не обойтись. Одно точно известно, что повсеместное использование goto - дурной тон программирования в ЯВУ всех мастей. Это только программисты "старички", наученные еще с времен DOS, могут использовать goto правильно и при этом не портить и не усложнять алгоритм. В IF языках программирования и даже в УРКе goto имеет свою обоснованность и его использование нормальное явление, но уж мне то, точно сложновато читать огромный исходник написаный на урке с применением goto (хотя он там повсеместно
).
В данный период времени применяю goto, только в сложном алгоритме в синтаксическом анализаторе команд СТК для считывания постоянной строки (заключена между " ). В этом алгоритме с применением goto кол-во команд C# составило минимум 50, а без него получилось бы минимум 100, а о затратах памяти в этом случае вообще молчу (цифры условны и приведены для ощущения разницы).
Так что использовать goto рекомендуется тогда и только тогда, когда он действительно необходим. ![]()
Отредактировано Eten (21.08.2007 17:57)
Неактивен
Для начала хочу отметить, что обсуждаем тут не опечатки и даже не грубейшие ошибки в словах русского, а конкретный вопрос программирования.
Я не говорю про Урок - там просто глупо делать циклы и условия, а исходный код старой версии я видел - там всё очень локанично и красиво реализовано, так что программирование квестов с обычным программированием сравнить можно только закрыв глаза.
Можно не лезть в рекурсию и обойти её в большенстве случаев, а приведённый выше пример решается без ГоТо, хоть и не так просто как с ним, с пмощью цикла с условием (или вообще с помощью любого цикла).
Неактивен
VoLk88 написал:
Можно не лезть в рекурсию и обойти её в большенстве случаев, а приведённый выше пример решается без ГоТо, хоть и не так просто как с ним, с пмощью цикла с условием (или вообще с помощью любого цикла).
Например? Можно привести пример? И, желательно, не просто демонстрацию, что данную задачу можно сделать без goto или рекурсии, а чтобы текст читался.
Неактивен
Olegus t.Gl. написал:
VoLk88 написал:
Можно не лезть в рекурсию и обойти её в большенстве случаев, а приведённый выше пример решается без ГоТо, хоть и не так просто как с ним, с пмощью цикла с условием (или вообще с помощью любого цикла).
Например? Можно привести пример? И, желательно, не просто демонстрацию, что данную задачу можно сделать без goto или рекурсии, а чтобы текст читался.
Спину вареньем не намазть? На грубость только так и могу ответить.
Олегус, дорогой, на кого учишься? По роду своей специализации я однозначно знаю, что GoTo - ненужный и не незаменимый оператор.
Неактивен
Я конечно знаю, что каждый следующий выпуск программистов хуже предыдущего, но...
VoLk88 написал:
Учусь на математика-программиста и поэтому призераю goto.
Почему-то вспомнилось "я не верю в гороскопы потому что я Лев, а все Львы большие скептики" (с)
Неактивен
VoLk88 написал:
Спину вареньем не намазть? На грубость только так и могу ответить.
Причем тут грубость? Олегус совершенно резонно попросил привести пример реализации приведенного им алгоритма без goto после того, как Вы, уважаемый Volk88, отделались общими словами.
Кстати, для пуристов и апологетов структурного программирования - вот как это можно сделать без ГоуТу:
ДолойГоуту=false
УСЛОВИЕ 1 ИЛИ ДолойГоуту
Если НЕ ДолойГоуту
действие 1
действие 2
КонецЕсли
действие 3
ДолойГоуту=false
действие 4
УСЛОВИЕ 2 И (НЕ ДолойГоуту)
действие 5
действие 6
УСЛОВИЕ 3 И (НЕ ДолойГоуту)
действие 7
действие 8
УСЛОВИЕ 4 И (НЕ ДолойГоуту)
Если НАМ ОЧЕНЬ НУЖНО НА ДЕЙСТВИЕ 3
ДолойГоуту=true
КонецЕсли
КОНЕЦ УСЛОВИЯ 4
Если НЕ ДолойГоуту
действие 9
КонецЕсли
КОНЕЦ УСЛОВИЯ 3
Если НЕ ДолойГоуту
действие 10
КонецЕсли
КОНЕЦ УСЛОВИЯ 2
Если НЕ ДолойГоуту
действие 11
КонецЕсли
КОНЕЦ УСЛОВИЯ 1(Я молчаливо предполагал, что пара УСЛОВИЕ-КОНЕЦ УСЛОВИЯ - это цикл. Если это не так, то как минимум УСЛОВИЕ 1-КОНЕЦ УСЛОВИЯ 1 придется сделать циклом).
В целом, наверное, код читается, хотя, конечно, громоздко... да и эффективность упадет в разы (в связи с тем, что количество условных операторов резко возросло).
VoLk88 написал:
Олегус, дорогой, на кого учишься? По роду своей специализации я однозначно знаю, что GoTo - ненужный и не незаменимый оператор.
Незаменимых операторов вообще нет (за исключением, пожалуй, условного;).
Отредактировано uux (21.08.2007 21:07)
Неактивен
Всем привет!
Эх, сколько же споров я провел на эту тему...
Итак:
1. Действительно, без готы можно обойтись. Всегда.
2. С точки зрения перформанца другие способы, в большинстве случаев - проигрывают.
3. С точки зрения асма все другие способы тоже не лишены готов.
4. Иногда читабельней готу использовать, нежеле лепить маниакально что-то другое. См. MSDN.
Пока всё ![]()
Неактивен
VoLk88 написал:
Спину вареньем не намазть? На грубость только так и могу ответить.
А какое варенье?..
VoLk88 написал:
Олегус, дорогой, на кого учишься? По роду своей специализации я однозначно знаю, что GoTo - ненужный и не незаменимый оператор.
Уже отучился и давно, знаешь ли. Экономист, если что. Однако работаю как раз программистом (на стыке программирования и экономики). И занимаясь программированием как хобби примерно с 1989 года, я даже в машинных кодах успел повозиться. Так что я работал и с goto, и без него. Я (да и никто здесь) не призываю использовать этот оператор напропалую. Просто он есть, и иногда (ну очень редко) его использование оправдано.
А юношескую горячность лучше направить в другое русло. Подобный радикализм в таких вот пустых темах — не лучший способ сублимации…
Неактивен
Сам я очень редко использую goto- стараюсь обходится без него. За последние лет 7 использовал может раза два... Но есть куча НО...
VoLk88 написал:
Учусь на математика-программиста и поэтому призераю goto. В теории алгоритов есть постулат, что и без этого оператора можно создать ЛЮБОЙ алгоритм.
Использование этого оператора показывает несостоятельность программиста как такового.
Если ты математик-программист, то должен знать несколько вещей:
"Постулат" (или аксиома) - это то, что принимается без доказательств. Однако, насколько я знаю, доказатаельство ненужности goto - имеется. Так что это теорема, а не "постулат".
Структурный или неструктурный стиль программирования - абсолютно никак не пересекается с использованием goto.
В молодости, когда мне было лет 15 и я писал только на ассемблере, я это хорошо понял.
Имеется масса хорошо структурированных программ на ассемблере, где без goto (он же jp, он же jmp и так далее) вообще программу никак не напишешь.
И имеется масса поделок любителей всяких визуал-пофиговин, которые своими корявыми ручёнками накалякали безобразнейший код без goto в котором чёрт ногу сломит... Увы... нонче такой код скорее правило. Мало кто пишет с хорошими комментариями...
Кстати, загляни в исходники прекрасной ОС Linux - там есть довольно много goto. В целях увеличения скорости и уменьшения объёма кода. Хотя золотое правило - ограничиваться goto внутри одной процедуры...
Надеюсь не будешь утверждать, что у программистов ядра линукс - плохой стиль ? Или что они несостоятельны ?
Неактивен
Господа, а че вы к циклам то пристали >
. Если при написании цикла на языке Т нельзя вообще обойтись без goto, то это сильный минус для языка Т и его автора. И этому автору не помешает намекнуть, что его язык не может быть высокоуровневым если у него нет стандартных операторов, которые не могут не то, что выполнить команду цикл, даже позволить реализовать все команды основанные на общем алгоритмическом языке. А этот общий алгоритмический язык пишется схем-блоками. А раз уж в языке есть синтаксические конструкции основанные на определенных операторах, то уж точно, что goto будет использоваться в промежуточном коде, но самой программой. А вы господа, ломитесь на уровень промежуточного кода с примерами goto. Еще бы продемоснтрировали древную работу похожую на работу с массивами. ![]()
Мне чем C# нравится, так это возможностью не дать сделать те вещи, как это делалось в C++, которые потом губят всю прогу из-за простой нелепости. И goto там можно использовать только внутри одной функции, а не делать переход за ее границы, во время выполнения этой же функции. Поэтому, может показаться, что вариант C# строже и конкретней C++, но он дает гарантии разумного использования команд, так чтобы не было возможности нарушить логичность кода.
З.Ы.
Урку привел, как пример широкого использования goto.
Под языком Т, можно понимать любой язык, который реализует все стандартные действия алгоритма на уровне школьного.
И отмечу на последок, редко встречаются языки, где нет такого понятия в синтаксисе, как цикл. Его изучить не сложнее, чем оператор условного ветвления и возможностей он даст больше, нежели примение goto.![]()
Неактивен
Такой резонанс! Спасибо! Так вот, что хочу сказать:
Blob написал:
Кстати, VoLk88. А как ты "по роду специализации" относишься к "switch, case" стэйтменту?
Хорошая коснтрукция, с помощью которой как раз можно обойти рекурсию во многих случаях (ну, например при вычислениии факториала).
"Постулат" (или аксиома) - это то, что принимается без доказательств. Однако, насколько я знаю, доказатаельство ненужности goto - имеется. Так что это теорема, а не "постулат".
Доказательства для бесполезного оператора? Можно ещё напридумывать кучу операторов и надоказывать теорем, не правда ли?
Я не знал, сколько тебе лет, Олегус, но теперь уважаю твой возраст. А то, что ты экономист, а не программист по образованию очень жаль - ты пропустил множество предметов касающихся алгоритмов и программирования.
А не использую гоуту, так как про него и не помнил никогда - всегда на "подсознательном" уровне обхожусь и причём легко.
Кстати, загляни в исходники прекрасной ОС Linux - там есть довольно много goto. В целях увеличения скорости и уменьшения объёма кода. Хотя золотое правило - ограничиваться goto внутри одной процедуры...
Надеюсь не будешь утверждать, что у программистов ядра линукс - плохой стиль ? Или что они несостоятельны ?
Не люблю линух - я люблю пользоваться нужными мне программами, а не воевать всё время с пингвинами, уж простите.
Неактивен
VoLk88 написал:
Хорошая коснтрукция, с помощью которой как раз можно обойти рекурсию во многих случаях (ну, например при вычислениии факториала).
А ты в курсе, что switch-case - это полный, 100% аналог if-goto ?
VoLk88 написал:
Доказательства для бесполезного оператора? Можно ещё напридумывать кучу операторов и надоказывать теорем, не правда ли?
Бесполезного ? Ну ты хватил... Нука мне примерчик цикла на ассемблере без goto явного или неявного ? Или скажешь, что и ассемблер не нужен ?
В итоге - любой цикл и любое ветвление на уровне машкодов раскладывается в ненавистные тебе goto...
Не люблю линух - я люблю пользоваться нужными мне программами, а не воевать всё время с пингвинами, уж простите.
А при чём тут любовь ? Я тебе реальный пример привёл, что в реальной ОС, в которую вливаются миллиарды зелёных и которая гораздо удобнее и недёжнее убогой микрософтовской поделки, используется довольно много операторов goto... Кстати - в книжке по программированию, тоже есть рекомендации, как написать компактный и культурный код, используя goto...
Неактивен
2Sfunx
Какая глупость про if-goto... в селект-кейс (на С) вообще все пункты выполняются до бреак, начиная с отмеченого, и он является "полуаналагом" if then else (elseif elseif elseif...) end if (это для пущей понятливости)
И линух - не самая удобная (это 100%) и надёжная уж п(р)оверь. Виндой пользуются в России 95% пользователей и софт в основном под неё пишут. Дрова хрен под линух найдёшь, да просто КУЧА НЕДОСТАТКОВ! Но не о линухе...
А какая у тебя книжка "по программированию" - синияя или толстая? по программированию на чём? Наверное, у тебя клёвая книжка...
Вообще чё напали-то все? Если никто из вас не может без GoTo обойтись это совсем не значит, что больше никто не сможет! Короче, GoTo не есть истина и всегда обхожу эту дрянь, а ты, дорогой Sfunx можешь и дальше пользоваться чем тебе угодно, в любых целях и количествах. А если бы ты был повнимательнее при работе с отладчиком, то заметил бы, что jmp, jp, jnz не всегда используются как GoTo, чаще это тот самый If. А с машиной Тьюринга игрался? Читал статьи самого Тьюринга или Поста? Нет? Оно и видно...
Неактивен
VoLk88 написал:
Вообще чё напали-то все?
Никто, собственно, на тебя не нападает. Просто были поставлены вопросы, выдвинуты аргументы, приведены выдержки из реального практического опыта. Всё это спокойно и степенно. Ты же, VoLk88, не привёл ни одного рационального аргумента — всё сплошь эмоциональные, я уж не говорю про оскорбления. Все отсылки к авторитетам также сделаны «в общем ключе». Попробуй продавить народ конкретикой — горлопаны всегда тушуются перед голыми прозрачными фактами. Глядишь, народ и уважительней отнесётся к твоему мнению.
Это типа как спорить на тему, что можно всю жизнь прожить, ни разу человека по яйцам не ударив, — дурной тон это, всегда можно решить проблему по-другому, более цивилизованно…
Неактивен
Olegus t.Gl. написал:
VoLk88 написал:
Вообще чё напали-то все?
Никто, собственно, на тебя не нападает. Просто были поставлены вопросы, выдвинуты аргументы, приведены выдержки из реального практического опыта. Всё это спокойно и степенно. Ты же, VoLk88, не привёл ни одного рационального аргумента — всё сплошь эмоциональные, я уж не говорю про оскорбления. Все отсылки к авторитетам также сделаны «в общем ключе». Попробуй продавить народ конкретикой — горлопаны всегда тушуются перед голыми прозрачными фактами. Глядишь, народ и уважительней отнесётся к твоему мнению.
Это типа как спорить на тему, что можно всю жизнь прожить, ни разу человека по яйцам не ударив, — дурной тон это, всегда можно решить проблему по-другому, более цивилизованно…
Знаете, мне вот больше делать нечего, как каждому расписывать всё и выжимать примеры. По-моему не маленькие тут, чтобы "вынь да положь". Так обычно в технарях учат - делай так и вот так, а теория лишняя. Я сам начал программировать и учился в основном по исходникам, а теперь сам же могу из теории и общих положений вынести для себя что-то. Может новый топик начать: "Великий и могучий Вайл Неубиваемый", так там найдутся те, кто скажет, что без него никак и всё тут и скрещивать самому цикл с условием можно, но геморно, хотя в машинном коде всё будет аналогично, просто дело удобства.
Пусть тушуются все кому не лень над голыми фактами, но киселём расплываться перед недопрограммистами я не собираюсь (и врядли кто-то хочет).
А проблемы собственно и нет никакой - Фон Нейман сказал, что принцип модульности один из основополагающих, а его перевирают те самые горлопаны и сами же удивляются: "а почему этот процессор(ОЗУ, видеокарта...) мне не подходят".
Неактивен
Eten написал:
Урку привел, как пример широкого использования goto.
Под языком Т, можно понимать любой язык, который реализует все стандартные действия алгоритма на уровне школьного.
И отмечу на последок, редко встречаются языки, где нет такого понятия в синтаксисе, как цикл. Его изучить не сложнее, чем оператор условного ветвления и возможностей он даст больше, нежели примение goto.
1. URQL - НЕ универсальный язык программирования. Она никогда не предназначалась для написания любых программ и реализации стандартных алгоритмов. В менюшных квестах потребность в использовании циклов встречается достаточно редко. Там же где надо - легко реализуется при помощи goto - который является переходом на метку. А если учесть, что URQL - сплошь состоит из меток (начало локации), то goto конкретно в URQL является вполне обоснованным и необходимым.
2. Там вам не тут, господа программисты ![]()
3. Сам предпочитаю использовать побольше goto
И читабельность от этого не нарушается.
Неактивен
VoLk88 написал:
но киселём расплываться перед недопрограммистами я не собираюсь
Ты попутался, студент! Уровень твоих познаний в программировании уже всем ясен. Вопросов нет. Вопрос в другом. Какие такие заслуги на програмерском поприще позволяют тебе такие высказывания? Ты не Страус часом?
Неактивен
Елки-палки, вы бы так игры обсуждали... а еще лучше - писали, вовсю используя свои программистские таланты (хотя, ясное дело, профессиональным программистам среди форумчан и так более чем хватает практики).
Неактивен
VoLk88 написал:
2Sfunx
Какая глупость про if-goto... в селект-кейс (на С) вообще все пункты выполняются до бреак, начиная с отмеченого, и он является "полуаналагом" if then else (elseif elseif elseif...) end if (это для пущей понятливости)
Sfunx говорил не о внешнем сходстве (о котором толкуете Вы), а о внутреннем представлении... Говоря примитивно, select-case - это своего рода мнемокод для "структурированной" записи конструкции if-goto.
VoLk88 написал:
И линух - не самая удобная (это 100%) и надёжная уж п(р)оверь. Виндой пользуются в России 95% пользователей и софт в основном под неё пишут. Дрова хрен под линух найдёшь, да просто КУЧА НЕДОСТАТКОВ! Но не о линухе...
Я не разделяю мнения Sfunx'а об однозначном и безоговорочном преимуществе Linux перед Windows, но цель его ссылки была не в этом. Он привел это как пример серьезной программы на структурном языке программирования, где, тем не менее, используется goto. И привел он этот пример в качестве контр-аргумента на Ваше безапелляционное (и ничем, кроме апломба, не подтвержденное) утверждение о том, что "использующий goto несостоятелен как программист" (поскольку считать несостоятельными авторов Linux - очевидная нелепость).
VoLk88 написал:
Если никто из вас не может без GoTo обойтись это совсем не значит, что больше никто не сможет! Короче, GoTo не есть истина и всегда обхожу эту дрянь, а ты, дорогой Sfunx можешь и дальше пользоваться чем тебе угодно, в любых целях и количествах.
Уверен, Sfunx необычайно счастлив и польщен таким милостивым разрешением.
VoLk88 написал:
А если бы ты был повнимательнее при работе с отладчиком, то заметил бы, что jmp, jp, jnz не всегда используются как GoTo, чаще это тот самый If.
Т. е. и в Ассемблере можно обойтись без goto? Да, это действительно новое слово в программировании.
VoLk88 написал:
А с машиной Тьюринга игрался? Читал статьи самого Тьюринга или Поста? Нет? Оно и видно...
А Вы омуля на Байкале ели, уважаемый Volk88?
VoLk88 написал:
Знаете, мне вот больше делать нечего, как каждому расписывать всё и выжимать примеры. По-моему не маленькие тут, чтобы "вынь да положь". Так обычно в технарях учат - делай так и вот так, а теория лишняя. Я сам начал программировать и учился в основном по исходникам, а теперь сам же могу из теории и общих положений вынести для себя что-то.
VoLk88 написал:
Пусть тушуются все кому не лень над голыми фактами, но киселём расплываться перед недопрограммистами я не собираюсь (и врядли кто-то хочет).
Если уж Вы высказываете свое мнение, то будьте любезны (и готовы) его обосновать. А если не можете и не хотите, то либо держите его при себе, либо как минимум не удивляйтесь, что на Вас "нападают".
Вы тут ссылаетесь на "технари" (я только не понял, на технические ВУЗы или на техникумы), а сами ведете спор именно в таком ключе: не пользуйтесь goto, потому что это низзя! Раз пользуетесь goto - значит, козлы!
VoLk88 написал:
Может новый топик начать: "Великий и могучий Вайл Неубиваемый", так там найдутся те, кто скажет, что без него никак и всё тут и скрещивать самому цикл с условием можно, но геморно, хотя в машинном коде всё будет аналогично, просто дело удобства.
А вот это уже будет банальный плагиат.
Неактивен
VoLk88 написал:
Знаете, мне вот больше делать нечего, как каждому расписывать всё и выжимать примеры. По-моему не маленькие тут, чтобы "вынь да положь" … но киселём расплываться перед недопрограммистами я не собираюсь (и врядли кто-то хочет).
Не хочешь делать лишних телодвижений — не влезай в дискуссию будучи вооружён лишь крикливыми заявлениями. Парируя оскорблениями, ты лишь смешишь оппонентов, ибо, как заметил Blob, ничего такого, что позволило бы принять твою точку зрения на веру или почувствовать себя уязвлённым, ты пока не продемонстрировал. Так — воздух сотрясаешь…
P.S. Йоу! Почти всю мысль, оказывается, спёр у uux'а… Вот что значит медленно печатать!
Неактивен
Xlomid[оманад] написал:
Елки-палки, вы бы так игры обсуждали... а еще лучше - писали, вовсю используя свои программистские таланты (хотя, ясное дело, профессиональным программистам среди форумчан и так более чем хватает практики).
Хлом, в десятку!![]()
Неактивен
VoLk88 написал:
2Sfunx
Какая глупость про if-goto... в селект-кейс (на С) вообще все пункты выполняются до бреак, начиная с отмеченого, и он является "полуаналагом" if then else (elseif elseif elseif...) end if (это для пущей понятливости)
Я не спорю с тем, что любую конструкцию можно сделать как с goto, так и без оного (хоть на уровне маш-кода всё равно всё будет через goto). Но вот выдержка из книги "Brian W. Kernighan, Dennis M. Ritchie The C programming Language" :
"В Си имеются порицаемая многими инструкция goto и метки для перехода на них. Строго говоря, в этой инструкции нет никакой необходимости, и на практике почти всегда легко без нее обойтись. До сих пор в нашей книге мы не использовали goto.
Однако существуют случаи, в которых goto может пригодиться. Наиболее типична ситуация, когда нужно прервать обработку в некоторой глубоко вложенной структуре и выйти сразу из двух или большего числа вложенных циклов. Инструкция break здесь не поможет, так как она обеспечит выход только из самого внутреннего цикла. В качестве примера рассмотрим следующую конструкцию:
for (...)
for (...) {
...
if (disaster) /* если бедствие */
goto error; /* уйти на ошибку */
error: /* обработка ошибки */
ликвидировать беспорядок
Такая организация программы удобна, если подпрограмма обработки ошибочной ситуации не тривиальна и ошибка может встретиться в нескольких местах.
"
С Керниганом и Ричи тоже будешь спорить ? Да, goto запутывает программы ПРИ НЕУМЕЛОМ использовании, НО ИНОГДА очень удобна - и я с ними согласен.
VoLk88 написал:
И линух - не самая удобная (это 100%) и надёжная уж п(р)оверь. Виндой пользуются в России 95% пользователей и софт в основном под неё пишут. Дрова хрен под линух найдёшь, да просто КУЧА НЕДОСТАТКОВ! Но не о линухе...
"Не спорь о вкусе устриц с тем, кто их ел"(С).
Я окончил учиться в 99м году и имею опыт профессионального программирования под DOS, Windows около 8 лет и под Linux около 5 лет.
Занимался программированием на ассемблерах и С кроме персоналок таких процессоров z80, КР580, '51, AVR, ARM7, ARM9, 1878BE1 и ещё кое-что помелочи... Кроме этого пользовался Delphi, forth, fortran, lisp и prolog (совсем немного, но пользовал)...
И с таким опытом могу смело утверждать, что Linux (для меня, как для программиста... но о вкусах не спорят!) более удобная система. Сказки про "дрова" в прошлом уже давно. Система ставится без проблем несколькими кликами. Но вот попробуй мне поставить Windows на не-x86 проц? Такие компании как Siemens (только неделю назад разговаривал с её представителем), IBM, Goolgle - отказались или отказываются от Windows в пользу Linux. А пользователь - в 99% случаев = лемминг. За что посадили на том и работает. Это вообще не аргумент. Сейчас даже в школы у нас Linux ставят. И без проблем.
VoLk88 написал:
А какая у тебя книжка "по программированию" - синияя или толстая? по программированию на чём? Наверное, у тебя клёвая книжка...
Например, та, что я привел - Кернигана и Ричи. Их авторитет тебя не убеждает ? могу ещё десяток названий привести. Везде goto не рекомендуется, но в то же время делается оговорка, что иногда этот оператор полезен...
VoLk88 написал:
Вообще чё напали-то все? Если никто из вас не может без GoTo обойтись это совсем не значит, что больше никто не сможет!
Потому что ты выдаёшь то, что тебе сказал какойто глупец, который не писал больших программ никогда, за истину в последней инстанции... Потому люди и возражают. Причём, заметь, не какие-нибудь студенты, а люди, имеющие реальный (и зачастую немалый) опыт в написании РЕАЛЬНЫХ программ. Может стоит прислушаться ?
Никто ни разу тебе не возразил, что без goto обойтись можно. Но "можно" и "нужно" - разные вещи. Иногда (особенно в устройствах с малыми ресурсами) - скорость и объём программы гораздо важнее, чем "принципиально обходится без goto". И я тоже стараюсь не использовать goto, но иногда приходится. Раз в год-два ![]()
VoLk88 написал:
Короче, GoTo не есть истина и всегда обхожу эту дрянь, а ты, дорогой Sfunx можешь и дальше пользоваться чем тебе угодно, в любых целях и количествах. А если бы ты был повнимательнее при работе с отладчиком, то заметил бы, что jmp, jp, jnz не всегда используются как GoTo, чаще это тот самый If. А с машиной Тьюринга игрался? Читал статьи самого Тьюринга или Поста? Нет? Оно и видно...
"Остапа понесло"(с)...
Помоему я уже писал, что тоже стараюсь НЕ пользоваться этим оператором. Но ИНОГДА приходится.
Интересно - как ты jp x, jmp x используешь как if ? Это ж БЕЗУСЛОВНЫЙ переход - goto ? Пример, пожалуйста
Кстати об отладчике, я начинал программировать, ассемблируя программу ручкой на листочке, потом вгонял её в машкодах в комп и запускал
Эх... Были времена! И программы были структурные ![]()
jp x, jmp x = goto x
jz x = if ноль goto x
jnz x = if не ноль goto x
Так что не if, а if условие goto метка
"И никуда-никуда нам не деться от ээээтогоооо..."(С)
В общем - кончай с юношеским максимализмом
У всего есть две стороны... Когда ты это поймёшь - станешь неплохим программистом.
Отредактировано Sfunx (23.08.2007 07:26)
Неактивен
На ассемблере вчистую не программировал, но как я вижу (как понял) там goto=then, т.е. слово по-другому пишется, а смысл тот же.
Специально смотрел исходники: звезда номер 5, зомби 2, приключения маленького пупса написаны без GoTo. Также смотрел исходники некоторых крактро от Razor1911, тоже нет никаких GoTo.
Знаешь, Sfunx, лемминиги не лемминги, но не все же программёры, некоторым нужно просто печатать, другим рисовать, а третьим играть и для таких людей и работает программист.
А ассемблер и яву очень различаются, что приемлимо в ас-ре, то несовсем в яву. Я конечно понимаю, что в асме без этого никак (достаточно открыть любую прогу в отладчике и всё будет в сплошных переходах, но без этого-то там никак!)
В Java есть причудливая форма try{} (пытаться) и для неё catch (exception x){}, что является условным переходом, выполняющимся при появлении исключительной ситуации.
А Линухи стали ставить по школам и универам из-за дорогой лицензии Окон, вот и всё.
И вобщем мы тут говорим не о программировании огромнейших длиннющих программ, а о текстовых квестах.
Спасибо за замечания, конечно, но пока я GoTo ни разу не использовал за всю свою жизнь.
Неактивен
Куда мы залезли с этим GoTo? Тут люди вообще целые топики создают:
КАК НА ПАСКАЛЕ ЗАДАТЬ МССИВ?
Сегодня 15:12:41 : Nex
)))))))
Неактивен
for (...)
for (...) {
...
if (disaster) /* если бедствие */
goto error; /* уйти на ошибку */
error: /* обработка ошибки */
ликвидировать беспорядоканалогично что и
for (...)
for (...) {
...
if (disaster) /* если бедствие */
[b]call sub_error();[/b] /* вызвыть событие обработки ошибки */
sub_error(){} /* обработка ошибки */
ликвидировать беспорядоквремя сейчас немного другое...
Неактивен
Вот решил спросить у друга-программиста (программист из онлайн-игры "империя звёзд").
простите за ненорматив, но из песни слова не выкинешь.
VoLk88 (17:20) :
ты на чём щас программируешь?
777 (17:36) :
вкрадце если, то на С++.
VoLk88 (17:37) :
скажи мне друг, сколько раз ты использовал goto?
777 (17:37) :
ниразу, а что?
VoLk88 (17:39) :
да тут утверждают, что блядь гото клёвый и частенько приходиться им пользоваться, чтобы не раздувать прогу до немыслимых размеров, но ведь это же всю структуру нарушает!
777 (17:41) :
но ведь switch() - это тот же goto... только стандартизованный.. а свитчей у меня тут пиздец сколько.... ))
VoLk88 (17:42) :
он больше на if похож...
777 (17:43) :
это if и goto вместе, я б сказал...
потому что каждый case - это метка.
777 (17:43) :
и это, сука, факт. )))
VoLk88 (17:45) :
в vb (хоть и говно) канает if... elseif...elseif...elseif...end if так он тоже как свич!
777 (17:46) :
это та же хуйня, что и просто } else { if() {} } написать.. после компиляции то работает одинаково... просто синтаксис позволяет сократить запись..
VoLk88 (17:48) :
ну да, я это и имел ввиду
спасибо
777 (17:48) :
не за что.. рад был повыебываться по всякой хуйне вместе с Вами. бляяя...
Неактивен
VoLk88 написал:
На ассемблере вчистую не программировал, но как я вижу (как понял) там goto=then, т.е. слово по-другому пишется, а смысл тот же.
Специально смотрел исходники: звезда номер 5, зомби 2, приключения маленького пупса написаны без GoTo. Также смотрел исходники некоторых крактро от Razor1911, тоже нет никаких GoTo.
goto - это "переход". Если по-русски. А как он там записан - jp, goto, if then goto - смысла это не меняет.
VoLk88 написал:
Знаешь, Sfunx, лемминиги не лемминги, но не все же программёры, некоторым нужно просто печатать, другим рисовать, а третьим играть и для таких людей и работает программист.
Логично. Вот и работают программисты и под Windows и под Linux и под FreeBSD и под eCos и под ещё сотню операционных систем
И им за это платят. Слово "лемминги" я употребил в том смысле, что часто выбор средств вообще от пользователя не зависит. "Начальство заставило", "сосед вася поставил"... Большинству вообще пофиг... Работает - и ладно. Только когда отдел К придёт - начинают думать...
VoLk88 написал:
А ассемблер и яву очень различаются, что приемлимо в ас-ре, то несовсем в яву. Я конечно понимаю, что в асме без этого никак (достаточно открыть любую прогу в отладчике и всё будет в сплошных переходах, но без этого-то там никак!)
Согласен. Стили программирования отличаются. Но не ПРИНЦИПЫ. Вот два примера:
C:
for(i=0;i<10;i++)
{
// Тело цикла.
}
ассемблер:
ldr R0,#00
1: cmp R0,#00
beq 2f
/* Тело цикла */
inc R0
b 1b
2:
Оба абсолютно структурны, делают одно и то же. Несмотря на то, что второй, на ассемблере использует goto в инкарнации b
Так что не в языке дело, а в прокладке между монитором и креслом
Сможет прокладка программу написать удобоваримо и структурно- тогда она и на асме получится красивой... А не сможет... так никакой с-шарп не спасёт...
VoLk88 написал:
А Линухи стали ставить по школам и универам из-за дорогой лицензии Окон, вот и всё.
Неа. Лицензия на Windows - копейки стоит... Беда в том, что виндовс - пустой... То есть в его комплект не входит ни графических редакторов (паинт не в счёт) ни текстовых (блокнот тоже не в счёт)... Ничего. Вот это, то чего в виндовсе нет стоит очень и очень бешенные бабки. А зачем их платить, когда можно поставить бесплатное и не хуже ? Я 5 лет пользуюсь для редактирования документов OpenOffice, для рисования и редактирования фоток - Gimpом... Более чем достаточно. Ну а школьникам-студентам - и подавно.
VoLk88 написал:
И вобщем мы тут говорим не о программировании огромнейших длиннющих программ, а о текстовых квестах.
Так с того и началось, что некий язык для программирования квестов не имеет циклов иначе как с goto ![]()
VoLk88 написал:
Спасибо за замечания, конечно, но пока я GoTo ни разу не использовал за всю свою жизнь.
Молодец. Стиль - это прекрасно. Я тоже стараюсь не пользоваться.
Я, кстати, тоже раньше жутким максималистом был. Потом переболел. Понял простую истину - плохи те правила программирования, которые для достижения цели нельзя скорректировать. ![]()
Неактивен
Вот так уже не аналогично :
for (...)
for (...) {
...
if (disaster) /* если бедствие */
goto error; /* уйти на ошибку */
if (disaster1) /* если бедствие */
goto error; /* уйти на ошибку */
if (disaster2) /* если бедствие */
goto error; /* уйти на ошибку */
if (disaster3) /* если бедствие */
goto error; /* уйти на ошибку */
if (disaster4) /* если бедствие */
goto error; /* уйти на ошибку */
....
error: /* обработка ошибки */
ликвидировать беспорядокВ С нет вложенных процедур, поэтому если в разделе "ликвидировать беспорядок" используются локальные переменные (а они дам почти всегда используются) остаётся только goto или куча флагов... goto обычно проще.
Правила использования goto:
1. Если можешь не использовать goto без кардинального ухудшения читаемости-объёма-скорости программы - НЕ ИСПОЛЬЗУЙ его.
2. Если всё ж никак без goto не обойтись - то переходи им ТОЛЬКО внутри одной процедуры.
3. Никогда не делай циклы через goto. Всегда есть while() for() и break;
Вот собственно и всё... Итог всей темы...
Отредактировано Sfunx (23.08.2007 13:36)
Неактивен
VoLk88 написал:
Код:
for (...) for (...) { ... if (disaster) /* если бедствие */ goto error; /* уйти на ошибку */ error: /* обработка ошибки */ ликвидировать беспорядоканалогично что и
Код:
for (...) for (...) { ... if (disaster) /* если бедствие */ [b]call sub_error();[/b] /* вызвыть событие обработки ошибки */ sub_error(){} /* обработка ошибки */ ликвидировать беспорядоквремя сейчас немного другое...
Ну и как ты будешь удалять локальные объекты в call sub_error();? GC состряпаешь? А когда вернешся из call sub_error();, что делать будешь?
Неактивен
VoLk88 написал:
Код:
for (...) for (...) { ... if (disaster) /* если бедствие */ goto error; /* уйти на ошибку */ error: /* обработка ошибки */ ликвидировать беспорядоканалогично что и
Код:
for (...) for (...) { ... if (disaster) /* если бедствие */ [b]call sub_error();[/b] /* вызвыть событие обработки ошибки */ sub_error(){} /* обработка ошибки */ ликвидировать беспорядоквремя сейчас немного другое...
try {
for (...)
for (...) {
...
if (disaster) /* если бедствие */
throw(); /* уйти на ошибку */
...
}
}
catch(...) {
/* обработка ошибки */
ликвидировать беспорядок
}время сейчас совсем другое! ![]()
Неактивен
Sfunx написал:
Так что не в языке дело, а в прокладке между монитором и креслом
Сможет прокладка программу написать удобоваримо и структурно- тогда она и на асме получится красивой... А не сможет... так никакой с-шарп не спасёт...
+1
Неактивен
Хыхы, оборжаться, ребята. Топик - сахар.
Volk, имхо, типичный продукт 21го века, путающийся в причинно-следственной связи. Ну научили так человека. А отрицание пресвятого джампа и поклонение перед свитч кейсом это было очень забавно
По аналогии: "я не работаю с атомами, атомы - отстой, вот молекулы это да-а, я и них любое вещество сделаю". С одной стороны с этим не поспоришь, с другой сразу видно где проблема.
VoLk88 написал:
А ассемблер и яву очень различаются, что приемлимо в ас-ре, то несовсем в яву. Я конечно понимаю, что в асме без этого никак (достаточно открыть любую прогу в отладчике и всё будет в сплошных переходах, но без этого-то там никак!)
Без этого везде никак, ты сам пишешь сплошными гоуту, просто об этом не догадывается
Просто заботливый компилятор потом за тебя вставляет наши любимые гоуту вместо всяких заумных конструкций.
VoLk88 написал:
Спасибо за замечания, конечно, но пока я GoTo ни разу не использовал за всю свою жизнь.
Когда внезапно понадибится использовать(для оптимизации кода, написании асемблерной вставки или ещё в какой ситуаци) снововка в использовании гоуту не помешает ![]()
"Поэтому, может показаться, что вариант C# строже и конкретней C++, но он дает гарантии разумного использования команд, так чтобы не было возможности нарушить логичность кода."
Честно говоря, боюсь, такую гарантию могут дать только правильно настроенные мозги.
А на урке гоуту не пишут, ими там дышат и живут
На том и стоим.
ЗЫ: главное, теперь понятно какой теме надо было посвятить сайт
А то, фи, игры какие-то.
Отредактировано Евг (23.08.2007 16:17)
Неактивен
Евг написал:
Volk, имхо, типичный продукт
Вряд ли это продукт, если только основательно переработанный .
VoLk88 написал:
Так обычно в технарях учат - делай так и вот так, а теория лишняя.
Ишь ты, спеси то сколько .... какие мы гуманитарии, млин. И откуда такие познания о учебном процессе "технарей", милый? Дал бы я тебе от имени всех технарей в твое интеллигентное рыло, сынок... да, Заратустра не позволяет. Ты сам-то, прежде, чем игрулину свою написать, много if-теории прочитал, теоретик хренов?
Отредактировано zerrr (24.08.2007 04:01)
Неактивен
VoLk88 написал:
Может новый топик начать: "Великий и могучий Вайл Неубиваемый", так там найдутся те, кто скажет, что без него никак и всё тут и скрещивать самому цикл с условием можно, но геморно, хотя в машинном коде всё будет аналогично, просто дело удобства.
Хыы, ещё одно предложение месяца. Давай! ![]()
Неактивен
Народ, читать очень интересно, только держите себя в руках. Давайте без мата (и производных типа «мля») в прямой речи! Разве что как цитату диалога (можно даже воображаемого) по аське с «близким другом». Типа как VoLk88 привёл лог общения с приятелем…
Неактивен
VoLk88 написал:
И вобщем мы тут говорим не о программировании огромнейших длиннющих программ, а о текстовых квестах.
На сайте в целом - да. Но не в разделе "Флейм" (где мы разговариваем в т. ч. "обо всем на свете") и не в этом конкретном топике (где был вопрос, кто как пользуется goto в программировании вообще, в не только текстовых квестов).
Неактивен
Ишь ты, спеси то сколько .... какие мы гуманитарии, млин. И откуда такие познания о учебном процессе "технарей", милый? Дал бы я тебе от имени всех технарей в твое интеллигентное рыло, сынок... да, Заратустра не позволяет. Ты сам-то, прежде, чем игрулину свою написать, много if-теории прочитал, теоретик хренов?
Зерр, дружок, я кондидат в мастера спорта по боксу и жили бы мы в одном городе - рыло бы бито у тебя было, не сомневайся.
А игрулина моя - это всего 4 дня на программирования движка, написание сюжета и текстов, а также на весь дизайн. Игры я пишу не претендуя на всемирную славу, а просто от нечего делать.
Уважаемые, самые умные и хорошие, самые талантливые и честные, самые клёвые программисты и самые учёные из доучившихся, к вам обращаюсь. Мы тут говорили о конкретном операторе goto, а не о переходах как таковых. Логично предположить, что первое сообщение выглядело бы примерно так:
"Как вы относитесь к многострочным программам? Можно ли обойтись одной строчкой?".
Переходы всегда есть, а вот конекретно goto - нет!
Я про одно, а вы про другое, как малые дети всё равно что.
Разве что как цитату диалога (можно даже воображаемого) по аське с «близким другом». Типа как VoLk88 привёл лог общения с приятелем…
Меня обвиняют в фальсификации или я что-то не так понял?
...и не аська, а агент.
А ты, зеррр уважаемый, программист или писатель? Может и моё упущение, но в игры твои я не играл, да и как писателя тебя совсем не знаю, только вот на форуме и в ЖЖ читал, да и только.
Неактивен
VoLk88 написал:
Меня обвиняют в фальсификации или я что-то не так понял?
Расслабься, ты как всегда ничего не понял. Судя по тексту, диалог настоящий, поскольку твой собеседник как раз понимает в программировании. Даже тени мысли о том, что его ответы ты сочинил самостоятельно, не возникло. Цени таких людей, тем более что мнение его ты вроде как ценишь, учитывая как ты стушевался, стоило ему рассказать тебе то же самое, что и другие участники форума.
Но чтобы твоя мнительность не пропадала зря, отмечу, что твоя фраза «да тут утверждают, что блядь гото клёвый и частенько приходиться им пользоваться, чтобы не раздувать прогу до немыслимых размеров, но ведь это же всю структуру нарушает!» самое что ни на есть наглое враньё, поскольку ни одно утверждение из него не соответствует действительности.
Если же ты хочешь вернуться к теме использования goto, то в дальнейших рассуждениях (я надеюсь это будут рассуждения, а не очередная истерика — кандидату в мастера по боксу это, право, не пристало) учитывай тот факт, что народ программирует на разных языках и на разных устройствах, поэтому приводимые тобой примеры как можно легко обойти применение goto в других условиях просто не реализуемы. Ту задачу, что я приводил, реализовывать без goto было бы глупостью, поскольку это была не какая-нибудь программулька «hello, world», а написанная с нуля библиотека для работы КПК Palm с фискальным регистратором (кассовый аппарат в простонародье). В этой задаче главное было — чтобы всё работало чётко, чтобы код читался, чтобы работоспособность в наименьшей степени зависела от усложнённости алгоритмов (а это всё как раз дополнительные флаги, вынесенные в функции куски кода, добавленные циклы и всё остальное, что любители сказочных стандартов добавляют в программу, лишь бы goto не использовать). И библиотека эта работает вот уже несколько лет без единого сбоя. Так что в следующий раз, когда ты захочешь что-нибудь написать по теме, попробуй писать действительно по теме, а не оскорблять окружающих или повторять какие-то общие (пусть и громкие/авторитетные) фразы — большинство присутствующих все эти фразы уже слышали по сто раз и имели время обдумать и проверить их жизненность на практике.
Неактивен
VoLk88 написал:
Уважаемые, самые умные и хорошие, самые талантливые и честные, самые клёвые программисты и самые учёные из доучившихся, к вам обращаюсь. Мы тут говорили о конкретном операторе goto, а не о переходах как таковых. Логично предположить, что первое сообщение выглядело бы примерно так:
"Как вы относитесь к многострочным программам? Можно ли обойтись одной строчкой?".
Переходы всегда есть, а вот конекретно goto - нет!
Я про одно, а вы про другое, как малые дети всё равно что.
Наверное, я тупой, но в этом абзаце вообще ничего не понял.
А вообще эта тема была задумана не как повод к "священной войне" (хотя, каюсь, мог бы догадаться, чем оно все закончится) - мне просто действительно любопытно было узнать, для каких задач (в идеале - так с конкретными примерами) в современных условиях может применяться оператор безусловного перехода. Такая информация для меня особенно интересна в связи с тем, что я не являюсь профессиональным программистом (хотя в принципе программировать люблю), и теоретических знаний в этой области мне, увы, не хватает. То есть фактически я самым наикорыстнейшим образом собирался нагнуть весь наш форумский коллектив на бесплатные курсы повышения моей программерской квалификации;).
И, кстати, несмотря на весь флейм в прямом смысле этого слова, кое-что полезное я тем не менее почерпнул. Поэтому огромное спасибо всем участникам дискуссии.
VoLk88 написал:
А ты, зеррр уважаемый, программист или писатель? Может и моё упущение, но в игры твои я не играл, да и как писателя тебя совсем не знаю, только вот на форуме и в ЖЖ читал, да и только.
Zer, может, и не программист и не писатель (на это он гораздо лучше ответит сам), но одно могу сказать точно - для популяризации ИЛ в России он сделал (и делает) очень и очень немало... А обзоры его так точно читаются как классный приключенческий роман (в отличие от постов некоторых товарищей на форуме;)...)
Отредактировано uux (27.08.2007 06:42)
Неактивен
Уважаемый Olegus t.Gl.. (правда уважаемый), спасибо за мудрые замечания, но оскорблять я стал только в ответ и совсем этого не хотел, но "грубостью на грубость" - только так. Человек я мирный и спокойный, даже не смотря на спортивные достижения.
Только такой мудрый человек мог разрешить эту ситуацию. Я не могу похвастать программированием прошивок для кассовых аппаратов, но для многих компаний в нашем городе писал узкоспециализированный софт.
Боюсь моя вспыльчивсоть только из-за моего недопонимания (и не только моего как следствие) вот и всё.
Зерр конечно же великий популяризатор (да и в Красноярске я был. Даже возможно, что ещё приеду на какие-нибудь соревнования или сборы
), но после такой популяризации моя страсть к текстовым квестам немного поостыла.
У меня до сих пор чувство, что говорили мы о разных вещах... Всем спасибо!
Неактивен
Товарищи, если мне не изменяет память, то изначальная тема топика была о целесообразности использования оператора безусловного перехода goto в СТРУКТУРНЫХ языках программирования (речь шла о ТАДС). Коим не являются машинный код или ассемблер. Какой машинный код генерирует компилятор языка -- сугубо на совести компилятора. Язык -- это абстракция от машинного кода.
Моё мнение: goto в структурных языках не нужен. За 8 лет работы программистом (даже раньше, когда я перестал писать на Басике и Ассемблере) я ни разу не использовал оператор goto, и даже сейчас не могу представить случая, где его действительно стоит использовать. Наверное, сказывается уход от императивного программирования (вся программа -- большой main() ).
"Язык определяет то, о чём мы можем мыслить". Это из предисловия какой-то книги о программировании, может быть даже Страуструпа, не помню. Человек, изо дня в день программирующий только на ассемблере не найдёт общего языка с человеком, пищущим на Луа. ![]()
Пример из Кернигана и Ричи на языке C++ решается с помощью предназначенного для этого механизма исключений (exceptions). На худой конец, можно обойтись разбиением на функции, так, чтобы goto превратился в return. Я лично не люблю перебарщиваний и запихивания длиннющего алгоритма в одну функцию. Хорошее разбиение на функции только улучшает читабельность программы.
Кстати, для общего развития. Программистам на C/C++ будет интересно. http://digitalmars.com/d/overview.html
Язык D. Выглядит очень вкусно, захлебнулся слюной. Есть компилятор для Линуха.
Отредактировано Gremour (26.08.2007 22:58)
Неактивен
Gremour написал:
Товарищи, если мне не изменяет память, то изначальная тема топика была о целесообразности использования оператора безусловного перехода goto в СТРУКТУРНЫХ языках программирования (речь шла о ТАДС). Коим не являются машинный код или ассемблер. Какой машинный код генерирует компилятор языка -- сугубо на совести компилятора. Язык -- это абстракция от машинного кода.
Это в общем-то правильно (за исключением того, что о TADS речь не шла), просто потом дискуссия сместилась в сторону флейма;).
Gremour написал:
Пример из Кернигана и Ричи на языке C++ решается с помощью предназначенного для этого механизма исключений (exceptions). На худой конец, можно обойтись разбиением на функции, так, чтобы goto превратился в return. Я лично не люблю перебарщиваний и запихивания длиннющего алгоритма в одну функцию. Хорошее разбиение на функции только улучшает читабельность программы.
А как реализовать поэлегантнее пример Олегуса со вложенными условиями без goto? (Не в порядке возобновления священной войны, а просто действительно интересно;).
Неактивен
uux написал:
А как реализовать поэлегантнее пример Олегуса со вложенными условиями без goto? (Не в порядке возобновления священной войны, а просто действительно интересно;).
Конкретизируем задачу: во-первых, ограничение на стек (реальная вещь), во-вторых, кроме условий там были ещё и вложенные циклы…
Да и вообще, читайте статью Калинина Андрея «Религия и goto» (эту ссылку я приводил в начале обсуждения) — там всё расписано достаточно доходчиво, а насчёт состоятельности его как программиста — вот отзывы о нём как о преподавателе информатики МАИ…
Неактивен
VoLk88 написал:
Переходы всегда есть, а вот конекретно goto - нет!
Я про одно, а вы про другое, как малые дети всё равно что.
"Ничего не понимаю! Слова нет, а ЖОПА - есть!"(С) Вовочка...
Честно, говоря, тема очень веселит :-)
Неактивен
Gremour написал:
Пример из Кернигана и Ричи на языке C++ решается с помощью предназначенного для этого механизма исключений (exceptions). На худой конец, можно обойтись разбиением на функции, так, чтобы goto превратился в return.
Там голый С, без ++. Кстати, системные вещи на голом С пишутся. А вообще - согласен, можно всё сделать и через исключения на С++.
Да и вообще - на мой взгляд - к "гоуту" самое правильное отношение - это "нельзя, но если очень хочется (нужно), то - можно" :-)
Неактивен
Статья хорошая. Действительно, в зависимости от цели методы могут быть разными. Я привык рассматривать программирование с точки зрения
читабельности текста другим человеком. Как я уже говорил, работаем над общим проектом в коллективе. И экономия ресурсов сейчас редко себя оправдывает. Обычно оптимицация алгоритма начинается, когда результат работы программы не удовлетворяет потребностям.
uux написал:
А как реализовать поэлегантнее пример Олегуса со вложенными условиями без goto?
Допускаю, что это есть самое оптимальное с точки зрения производительности решение. Но переход внутри условий меня, честно говоря, коробит.
Отредактировано Gremour (27.08.2007 20:18)
Неактивен
Sfunx написал:
Там голый С, без ++. Кстати, системные вещи на голом С пишутся.
Критические места можно написать на ассемблере. А вообще, компиляторы языка C++ умные программы, и генерят отличный код, особенно с включенной оптимизацией. Глупо писать драйвер устройства на классах, где они вообще не нужны. Но использовать компилятор языка C++ (который включает в себя язык C) никто не мешает.
Неактивен
VoLk88 написал:
А ты, зеррр уважаемый, программист или писатель?
Не обижайся КМС, я сначала счел вопрос глупым. Начать с того, что "писатель" - это профессионал. Плохой он или хороший, это другой вопрос. Насколько я осведомлен, писателей здесь нет. Но потом я "проанализировал" вопрос и только теперь до меня дошла суть проблемы нашего сообщества. У нас кол-во Авторов превышает кол-во игроков во многие разы. И вопрос ты "программист или писатель" вполне естественен. В принципе, это можно понять. Очень много приходит людей понятие о IF имеющих весьма смутное, привлеченное лишь кажущейся простотой создания игры. Т.е. создать, то, что у нас называют "текстовый квест" действительно просто. А вот создание того, что достойно звания IF процесс куда более трудоемкий.
Но я несколько отвлекся, вот, собственно, ответ на твой вопрос:
Я ни то, и не другое. Я - игрок. Просто Игрок. Так, блин, бывает.
Неактивен
Так вот, Зерр, раз ты просто игрок, то, имхо, не должен делать такие выводы о "простоте программирования квестов", а тем более написать сам сюжет и придумать паззлы (даже тупые и простые) не так уж просто и ты это знаешь.
Я очень люблю твои обзоры и читаю их постоянно, но такие высказывания, как по поводу моей последней игры, имхо, не уместны от человека далёкого от программирования. Да, я знаю, что игра не сильная и ни на что не претендует, но не нужно этого. Я работал над парсером, сделал отличный движок, движок для лабиринта, написал три локации (очень объёмные, они разбиты на несколько локаций каждая) с альтернативными прохождениями (Хломид подбодрил и я начал работу), а вот после этой тёрки я бросил всю работу и желания возвращаться к ней нет никакого, хотя делал долго и получалось вроде неплохо. Кто-то будет тупо хаить, даже не зная как это делалось, чего стоило, а конструктивной критики почти не будет... А зачем мне это надо? Убивать своё время на ненужную работу? Удовольствия от работы над игрой в ближайшее время мне не удасться получить, а против себя я делать ничего не буду.
Простите, накипело.
Неактивен
VoLk88 написал:
Так вот, Зерр, раз ты просто игрок, то, имхо, не должен делать такие выводы о "простоте программирования квестов"
Сужу по РТАДС - я делал там набросок 6 локаций и пары-тройки пазлов : занял процесс около 2 дней, при том, что в программировании я абсолютный ноль и делал все исключительно на похожих примерах, которых в инете пруд-пруди. Были даже довольно сложные вещи, как смена названия и описания локаций в зависимости от состояния игрока - это мне ifn00b подсказывал. Это было конечно далеко от статуса готовой игры, но все-таки: два неполных дня (точнее два рабочих дня) и мини-игрулька готовая для альфа-теста испечена. Может твоя проблема в том, что ты делал свой движок, а не взял готовую систему?
VoLk88 написал:
Я очень люблю твои обзоры и читаю их постоянно, но такие высказывания, как по поводу моей последней игры, имхо, не уместны от человека далёкого от программирования.
Хмм, поправь меня если ошибаюсь, но о твоей игре я вообщем-то не отзывался. По той простой причине, что не играл в нее и даже не видел. CYOA вообще не мой жанр.
А про "рыло" - это меня, извини, заело твое небрежное высказывание о "технарях", ибо сам я из них.
Отредактировано zerrr (29.08.2007 17:51)
Неактивен
zerrr написал:
Сужу по РТАДС - я делал там набросок 6 локаций и пары-тройки пазлов : занял процесс около 2 дней, при том, что в программировании я абсолютный ноль
Кстати говоря, набросок -- это одно, а качественная игра (пусть даже маленькая) -- совсем другое. Не хочу никого испугать или обидеть, но стандартная библиотека RTADS не годится для быстрого и безболезненного создания качественной игры. Очень много непредусмотренных реакций на команды, которые может ввести игрок, от комичных до драматичных. Причём, когда начинаешь копать, пытаясь исправлять нелепые реакции, они начинаются плодиться и виснуть на тебе как бандерлоги на медведе Балу в мультфильме про Маугли. Например, область с управлением другими актёрами -- вообще девственный лес. В который лучше не ходить совсем.
(R)TADS мне очень нравится как система. Но. Библиотека нуждается в доработке (а точнее полной переработке). И, возможно, стоит взять одну из нестандартных библиотек. Иногда очень не хватает некоторых имплементаций, которые нужны практически в любой игре.
Но это уже совсем не про Гоуту. ![]()
Неактивен
zerrr написал:
Сужу по РТАДС - я делал там набросок 6 локаций и пары-тройки пазлов : занял процесс около 2 дней, при том, что в программировании я абсолютный ноль и делал все исключительно на похожих примерах, которых в инете пруд-пруди.
А нет желания повторить (и развить) опыт?![]()
Неактивен
VoLk88 написал:
Я работал над парсером, сделал отличный движок, движок для лабиринта, написал три локации (очень объёмные, они разбиты на несколько локаций каждая) с альтернативными прохождениями (Хломид подбодрил и я начал работу), а вот после этой тёрки я бросил всю работу и желания возвращаться к ней нет никакого, хотя делал долго и получалось вроде неплохо. Кто-то будет тупо хаить, даже не зная как это делалось, чего стоило, а конструктивной критики почти не будет...
Хм, на написание парсерного движка я тебя точно не подбадривал:). Потому как дело заведомо неблагодарное. А что касается терки, то никакого отношения к квестам она вообще не имела. Слава богу, сейчас все успокоились, но мне до сих пор кажется забавным, что такой безобидный вопрос вызвал куда более бурную реакцию, чем лучшие игры в русской ИЛ. Если просмотреть этот форум, то рассчитывать на столь эмоциональные оценки любой игры, в том числе и твоей, вряд ли приходится. Тупо хаять никто не будет - если только не пытаться запихнуть игру в глотку каждому игроку. С другой стороны, если хочешь оценки твоей работы и конструктивной критики, то разумное количество самопродвижения очень важно. Опыт подсказывает, что во избежание чрезмерного количества этой самой конструктивной критики не менее важно еще и найти бета-тестера
.
VoLk88 написал:
А зачем мне это надо? Убивать своё время на ненужную работу? Удовольствия от работы над игрой в ближайшее время мне не удасться получить, а против себя я делать ничего не буду.
Мне кажется, или это обиженный тон? Поверь мне как человеку беспристрастному: в этом топике нет абсолютно ничего, что давало бы тебе основание винить отписавшихся здесь в собственном бездействии. Пардон, если это прозвучало жестко. Зер абсолютно прав, говоря об избытке в коммьюнити авторов и недостатке игроков, но в этом некого обвинять. Тем более ни при чем здесь участники этой дискуссии. Удовольствие от работы над любым масштабным проектом, как правило, угасает по мере его создания. Ты уверен, что у тебя не этот случай? Если ничего не делать через себя, редкая игра вообще дописывалась бы. Собственно, так оно и происходит. Я сам когда-то давно пытался писать собственные движки (в т.ч. парсерные, ртадса тогда не было), оформлял их... и благополучно забивал на них, не дождавшись никакого стимула для продолжения работы. А ведь стимул в лучшем случае появится только когда работа будет закончена.
Подумай еще раз, не ищешь ли (даже подсознательно) повод, чтобы избавиться от поднадоевшей работы.
Отредактировано Xlomid[оманад] (29.08.2007 22:49)
Неактивен
uux написал:
А нет желания повторить (и развить) опыт?
Ну, видишь ли ... тогда комьюнити потеряет еще одного игрока
А если серьезно, то я слишком стар и ленив, чтобы учить программирование, а на одних "примерах" далеко не уедешь. К тому же, как заметил Xlomid : "Удовольствие от работы над любым масштабным проектом, как правило, угасает по мере его создания." Только в моем случае это еще более экстремально: я быстро загораюсь идеей, но остываю мгновенно.
И коли тема окончательно съехала в треп, то спрошу:
Насколько реально написать систему похожую на Inform 7, на великом-могучем? Ну, или перевести. Я слышал, что у 7-го Информа "детских болезней левизны" и прочих проблем, до черта, но все таки, если можно написать, что-то вроде Dead Cities, When in Rome и т.п. значит не все так плохо.
Неактивен
zerrr написал:
Насколько реально написать систему похожую на Inform 7, на великом-могучем? Ну, или перевести. Я слышал, что у 7-го Информа "детских болезней левизны" и прочих проблем, до черта, но все таки, если можно написать, что-то вроде Dead Cities, When in Rome и т.п. значит не все так плохо.
Ну, я сам об Inform 7 знаю только понаслышке, но, если вспомнить о том, что его перевели на испанский, то и на русский перевести, наверное, можно. Другой вопрос, что лично меня в обозримом будущем на это точно не хватит.
А, ну еще Adrift есть, где программирование в прямом смусле этого слова вообще не требуется...
Отредактировано uux (30.08.2007 06:47)
Неактивен
Подумай еще раз, не ищешь ли (даже подсознательно) повод, чтобы избавиться от поднадоевшей работы.
Я прекрасно знаю, что такое, когда работаешь только, чтобы закончить. Мне вообще теперь просто неинтересна тема ИЛ. Вряд ли вообще теперь буду работать в этом направлении. А про бездействие я вообще ничего не понял, суть в том, что мне просто теперь всё равно.
Неактивен
Все спорим господа. Так вот аргумент все тем, кому goto не нравится:
// Распознавание десятичного числа
private bool isNumber()
{
bool btochka = false, bdigit = false;
Set_StartPosLexem();
tochka://проверка на точку
if (this.symbol == '.')
{
//если первым символом попалась точка, то записываем истина
btochka = true;
//запись символа в значение лексемы
this.lexvalue.Append(this.symbol);
// чтение следующего символа
this.NetxtSymbol();
//после точки всегда должна идти цифра
if (this.isDigit(this.symbol))
{
//запись символа в значение лексемы
this.lexvalue.Append(this.symbol);
// чтение следующего символа
this.NetxtSymbol();
}
else //в случае не пренадлежности к классу чисел символа после, выдать ошибку
{
this.lx = lexType.lexError;
this.er = ErrorCode.lexNumber;
Set_StartPosLexem();
this.lexvalue.Length = 0;
return true;
}
//случае истинности первого условия, записывать каждый следующий символ в значение лексемы, если он принадлежит к классу чисел
while (isDigit(this.symbol))
{
this.lexvalue.Append(this.symbol);
this.NetxtSymbol();
}
}
porjadok://проверка на порядок
//после числа может стоять только порядок или ничего
if ((this.symbol == 'E' || this.symbol == 'Е' || this.symbol == 'e' || this.symbol == 'е') && (btochka || bdigit))
{
this.lexvalue.Append('E');
this.NetxtSymbol();
//Дальше должен стоять только + или минус
if (this.symbol == '+' || this.symbol == '-')
{
this.lexvalue.Append(this.symbol);
this.NetxtSymbol();
}
else//в противном случае ошибка
{
this.lx = lexType.lexError;
this.er = ErrorCode.lexNumber;
Set_StartPosLexem();
this.lexvalue.Length = 0;
return true;
}
//последним должна стоять цифра, обзначающая показатель степени
if (this.isDigit(this.symbol))
{
//запись символа в значение лексемы
this.lexvalue.Append(this.symbol);
// чтение следующего символа
this.NetxtSymbol();
}
else //в случае не пренадлежности к классу чисел символа после, выдать ошибку
{
this.lx = lexType.lexError;
this.er = ErrorCode.lexNumber;
Set_StartPosLexem();
this.lexvalue.Length = 0;
return true;
}
//случае истинности первого условия, записывать каждый следующий символ в значение лексемы, если он принадлежит к классу чисел
while (isDigit(this.symbol))
{
this.lexvalue.Append(this.symbol);
this.NetxtSymbol();
}
goto konec;
}
else//условие гарантирующие переход на konec, в случае определения точки или числа, после проверки порядка
if (btochka || bdigit) goto konec;
//----------------------------------------------------------------------------------
//если, условие оба условия выше не выполнены (смотри условие с точкой) и порядком, то проверяем на принадлежность к классу чисел
if (this.isDigit(this.symbol))
{
//если первым символом попалось число, то записываем истина
bdigit = true;
//запись символа в значение лексемы
this.lexvalue.Append(this.symbol);
// чтение следующего символа
this.NetxtSymbol();
} else //в случае не пренадлежности к десятичному числу отклонить истинность возвращаемого значения
return false;//здесь откат не нужен (всего один смивол, проверен)
//случае истинности первого условия, записывать каждый следующий символ в значение лексемы, если он принадлежит к классу чисел
while (isDigit(this.symbol))
{
this.lexvalue.Append(this.symbol);
this.NetxtSymbol();
}
//если первая строка закочилась, то определить три случая:
//1) символ является точкой, тогда переход на tochka
//2) символ является Е или е(русская или английская), тогда переход на porjadok
//3) если оба условия отвергнуты и там не стоит буква, тогда выдать тип лексемы, в противном случае ошибка
if (this.symbol == '.') goto tochka;
if (this.symbol == 'E' || this.symbol == 'Е' || this.symbol == 'e' || this.symbol == 'е') goto porjadok;
if (isLetter(this.symbol))
{//если следом после последней цифры в числе стоит буква значит ошибка
this.lx = lexType.lexError;
this.er = ErrorCode.lexNumber;
Set_StartPosLexem();
this.lexvalue.Length = 0;
return true;
}
konec:
//перед выдачей лексемы проерить, что за число (слитно с ним) не стоит буква или еще одна точка
//Проверка осущевствляется во всех 6 вариантах десятичного числа (три из них с показателем степени)
if (this.isLetter(this.symbol) || (btochka && this.symbol == '.'))
{
this.lx = lexType.lexError;
this.er = ErrorCode.lexNumber;
Set_StartPosLexem();
this.lexvalue.Length = 0;
return true;
}
this.Unset_Odin();
//определяем тип лексемы и возвращаем истиность о пренадлежности к десятичному числу.
this.lx = lexType.lexInt; return true;
}Если найдете способ написать весь этот алгоритм разбора числа формата целого и десятичного (пример 2 2.3 2.3e+3 и еще три, всего шесть вариантов), без goto так, чтобы не занимало циклов больше, чем данный алгоритм и было также логичным по ходу действия.
Написано на C#, алгоритм работает и взят из исходников моего проекта LASOFTGAME (рабочее название СТК). ЛУЧШЕГО АЛГОРИТМА НЕ НАШЕЛ!!!
И заметьте в C#, goto можно применить только в текущей функции, что и приводилось, как хорошее использование, а здесь уже стандарт. Так, что логичность здесь не порушишь, как в C++. Если не согласны, то приводите контраргументы, а раз нечего саказать, то и мусолить соленный огурец не хера, лучше от этого не станет! ![]()
Неактивен
Добавлю к своему последнему посту.
Задача решается не тривиальная, алгоритм сложный, поэтому упростить его без goto никак. А, если те кто высказывался о своих программерских талантах, скажет, что ему лень разбирать код или он его разобрать не может (кроме не знающи не то, что C++, даже C#). То какого фига, спрашивается вы называете себя программистами, если не можете разобрать чужой, да еще с комментариями. ![]()
Неактивен
В указанном случае можно подключить библиотеку регулярных выражений и упростить этот код до одной строки.
А вообще, современные компиляторы производят очень качественную оптимизацию, так что время исполнения что с "гоуту", что без, будет одинакова. Вопрос лишь в читабельности, и гоуту с ней плохо совместим.
Неактивен
Постоянно натыкаюсь на довод о читабельности, однако, народ, что вы в это вкладываете? Если взять не элегантные примеры на десяток-полтора строк, а многоэкранные листинги, то сказать, куда произойдёт переход, будет проще с goto (с его чётким указанием меток), чем если разбираться со вложенными if, for и т.п. Я уж не говорю, что придётся разгребать разного рода допонительные конструкции: флаги условия и прочее. Интересен вопрос в плане раскрытия смысла термина "читабельность"…
Неактивен
Вообще, в тему "goto": хотя я всегда придерживался идеи "если сильно хочется, то можно" и не имею ничего против "корректного" использования "goto", я уже лет 10 его не использую совсем. никогда. (если язык позволяет этого избежать, разумеется).
Eten написал:
Если найдете способ написать весь этот алгоритм разбора числа формата целого и десятичного (пример 2 2.3 2.3e+3 и еще три, всего шесть вариантов), без goto так, чтобы не занимало циклов больше, чем данный алгоритм и было также логичным по ходу действия.
Eten, реализация конечного автомата лексического анализатора занимает совсем немного) Без всяких goto. Если не забросишь - научишься всему)
GrAndrey написал:
В указанном случае можно подключить библиотеку регулярных выражений и упростить этот код до одной строки.
Вот уж где регэкспы ни к чему)) Поскольку "замедлят" скорость выполнения кода как минимум в десятки (наверняка, сотни) раз. С другой стороны, и приведённая Eten'ом реализация далеко не самая удачная.
Неактивен
Вот, что значит читабельность на мой взгляд. Читабельность - это, когда приведенный код отформатирован отступами, именам переменных и объектов даны осмысленные имена и при этом не очень длинные, а также есть сопровождающие комментарие в самом коде. Однако, если код основан на обширном применении ООП, то лучше, когда при обращении к сво-вам объекта, методу и прочии частей самого объекта, само обращение написано полностью, например объект.список.текст[4] = объект.текст;.
Во всем остальном читабельный код, даже без изучения флагов и т.д. можно без проблем понять коментариям, хотя бы в общих чертах.
Неактивен
Eten написал:
Читабельность - это, когда приведенный код отформатирован отступами, именам переменных и объектов даны осмысленные имена…
Не нужно путать результат и средства достижения результата, поскольку из-за такой подмены понятий народ и скатывается к бездумному следованию неким, зачастую идеализированным, стандартам.
Неактивен
HzD_Byte:
Eten, реализация конечного автомата лексического анализатора занимает совсем немного) Без всяких goto. Если не забросишь - научишься всему)...
....приведённая Eten'ом реализация далеко не самая удачная....
Возмоно не удачная, но это только возможная. Не согласен со мной, тогда приведи лучший пример и без goto, но чтоб 6-ю вариантами форматов чисел или сделай пометки, где и как в моем коде не то или слишком широко шагнул. А то, я тоже, могу сказать, также по отношению к qsp не приведя должного сравнения. А так проверял свой кусок кода, даже на самые пакостные ситуации, так и обычные, итог код работоспособен ошибок не возникает. Заключение, с применением goto мне удалось не только упростить код, но и сократить число шагов. Так, что, раз нет весомых аргументов, то и не надо говорить, как говорится считаешь, что сделаешь, лучше, то покажи, либо не говори вообще.
А также, сколько бы стаж у тебя не был 10, 20, да хоть за 30 - это еще не о чем не говорит, потому как встречал детей, которые еще будучи семиклассниками, один из которых умудрился написать простой драйвер для монитора (или видюхи уже не вспомнишь 2-4 года назад было) и выйграл на конкурсе со своим творением. То задается вопрос причем тут стаж, раз и млад и стар может этим заниматься, главное, чтобы голова хорошо варила.
В окнец сие поста. Лексический анализатор не прямой, проект LASOFTGAME еще не достиг, той ситауции, когда требуется сделать прямой анализатор, т.к. нет четкой уверенности в постоянстве конструкции (в смысле не потребуются новые), а заодно такой кусок легче редактировать.
С одним соглашусь, что могут быть некоторые моменты в коде, которые можно модифицировать и сделать лучше.
Неактивен
Olegus t.Gl., в чем-то ты прав, но тоже отчасти. Намного проще читать переменную, когда знаешь откуда она и для чего (а этому помогут коменты, нормальное имя). Отступы в тексте помагют, различить где че стоит, а то, как кто-то ручкой по бумажке на коленке написал и херь поймешь, где читабельность?!
.
Вот к примеру в моем приведенном коде, если уж не взде, то хотя бы в сложных и нужных местах, у меня написан комментарий действий и их последствий, обо всем остальном догадаться можно и за так. К тому же, приведи я свой весь исходник, то ты обязательно нашел бы по нужному названию файла, класса или перечисления (и т.д.) и по коментам нужную тебе инфу. Тем паче, что инфа вне методов у меня автодокументирована xml тэгами, что кстати говоря ничуть не мешает его прочесть, вот:
/// <summary>
/// Тип ошибки
/// </summary>
protected ErrorCode er;
/// <summary>
/// Текущий читаемый символ.
/// </summary>
protected char symbol;или вот:
/// <summary>
/// Типы данных в СТК.
/// </summary>
public enum TypeVariable : int
{
/// <summary>
/// Пустой, не заданный тип данных
/// </summary>
tvNone = 0,
/// <summary>
/// Строка
/// </summary>
tvString = 1,
/// <summary>
/// Число
/// </summary>
tvNumber = 2,
/// <summary>
/// Булев
/// </summary>
tvBoolean = 3,
/// <summary>
/// Массив
/// </summary>
tvArray = 4
}последний не флаг, а перечисление, ну и чего тут не понятного, а вот теперь в коде фнукции
/// <summary>
/// Считывает следующий символ во входном коде.
/// </summary>
protected void NetxtSymbol()
{
//проверка на конец входного кода
if (this.current_pos.Line >= this.ec.Length)
{
this.Eof = true;
this.symbol = ' ';
return;
}
// Считывает символ в указанной позиции
this.symbol = this.ec[this.current_pos.Line][++this.current_pos.Column];
//кол-во считанных столбцов
this.unset_pos.Column++;
//если позиция столбца достигла конца строки, то переходим на следующую строку
//и устанавливаем перо столбца на ноль
if (this.current_pos.Column >= this.ec[this.current_pos.Line].Length - 1)
{
this.current_pos.Line++;
this.unset_pos.Line++;
this.current_pos.Column = -1;
}
}Здесь чересчур будет, приводить на каждую строку кода комент и так хватает, но будь это очень нужно, я бы написал для каждой строки, так естественно проще. Был случай, когда приходилось читать код на совершенно не знакомом языке и с помощью комента, приведенного для каждой команды, разобрать его не составило особых проблем. Вот те и читабельность. А то, что я привел не только читабельность, а еще и программирование в хорошем тоне.
Неактивен
Так никто не спорит, что отступы и всё такое улучшают читабельность. Но тогда каким образом goto выпадает из этой схемы? Есть явное указание меток, поэтому пробегая глазами по коду можно точно сказать, откуда и куда осуществляется переход. Без комментариев с окончаниями циклов и условий («}», «end», «endfor», «endif») и то сложнее разобраться. Но разумеется, если использовать goto напропалую, то глаза начнут разбегаться и про какую-либо читабельность действительно можно будет забыть.
И вообще мне кажется, что «запрет» на использование goto несколько искусственен и продвигается только для того, чтобы научить людей думать перед тем как что-то делать: продумывать логическую схему алгоритма и все точки и возможности выхода-повторения. Оператор goto в алгоритме — что-то типа «Ой» от колючки на пути. Если таких вот колючек на пути дофига, значит, не той дорогой, видимо, пошли.
И странно, что никто не поднял тему досрочного выхода из процедуры/функции: return, в середине «тела» процедуры/функции. Разве это не из этой же серии?..
Неактивен
Olegus t.Gl. написал:
продвигается только для того, чтобы научить людей думать перед тем как что-то делать: продумывать логическую схему алгоритма и все точки и возможности выхода-повторения. Оператор goto в алгоритме — что-то типа «Ой» от колючки на пути. Если таких вот колючек на пути дофига, значит, не той дорогой, видимо, пошли.
Поддерживаю. Хорошо выразил мысль. Именно это и относится к читабельности. Продуманный заранее алгоритм, состоящий из упорядоченных блоков (без гоуту) воспринимается легче.
И странно, что никто не поднял тему досрочного выхода из процедуры/функции: return, в середине «тела» процедуры/функции. Разве это не из этой же серии?..
Не совсем. return выходит из функции, которая как правило является логически завершенной частью алгоритма. А через goto путь выполнения внутри одной функции может скакать туда и обратно, усложняя структуру алгоритма.
(Кстати, множественными return'ами я лично пользуюсь постоянно).
Неактивен
Eten: вот тебе функция (is_decimal) разбора десятичного числа на языке C (почти). Без goto. Решение в лоб. Иногда самое лучшее ![]()
//---------------------------------------------------------------------------
bool is_digit (char c) // Является ли символ цифрой?
{
return c >= '0' && c <= '9';
}
//---------------------------------------------------------------------------
bool is_exp (char c) // Является ли символ значком экспоненты?
{
return c == 'e' || c == 'E';
}
//---------------------------------------------------------------------------
double read_number (char **p) // Чтение целого числа из строки
{ // (переводит стоящие подряд цифры в число)
double res = 0;
while (is_digit (**p))
{
res = res * 10 + (double) (**p - '0');
(*p)++;
}
return res;
}
//---------------------------------------------------------------------------
double read_fraction (char **p) // То же, что и read_number, только
{ // результат = число после запятой
double res = 0;
double multiplier = 1;
while (is_digit (**p))
{
multiplier *= 0.1;
res = res + multiplier * (double) (**p - '0');
(*p)++;
}
return res;
}
//---------------------------------------------------------------------------
bool is_decimal (char *p) // Чтение десятичного числа из строки.
// Возвращает признак успешности перевода строки в число
{
double int_part = 0; // Если нужно -- можно вычислить само число
double frac_part = 0; // result = (int_part + frac_part) * 10 ^ exponent
double exponent = 0; //
double exp_sign = 1;
bool int_read = false;
if (is_digit (*p)) // Число может начинаться с цифры: 123
{
int_part = read_number (&p); // Тогда читаем целую часть
int_read = true;
if (!*p)
return true; // Конец строки -- разбор успешный
}
else
if (*p != '.') // Или с точки: .456
return false; // Иначе ошибка
// Целая часть ушла. Осталась либо точка, либо 'E'
if (*p == '.') // Если точка
{
p++; // Пропускаем точку
if (!*p)
return int_read; // Конец строки -- разбор успешный, если была целая часть
}
else
if (!is_exp (*p)) // Не 'E'?
return false; // Значит ошибка
if (is_digit (*p)) // Далее дробная часть: xxx.456
{
frac_part = read_fraction (&p); // Читаем дробную часть
if (!*p)
return true; // Конец строки -- разбор успешный
if (!is_exp (*p))
return false; // Может остаться только 'E'
}
p++; // Пропускаем 'E'
if (*p == '+' || *p == '-') // После 'E' может быть знак
{
exp_sign = (*p == '+'? 1 : -1);
p++; // Пропускаем знак
}
if (!is_digit (*p)) // Далее обязательно порядок (цифра)
return false;
exponent = read_number (&p) * exp_sign; // Читаем порядок
if (*p) // На этом строка должна закончиться
return false;
return true; // Перевод успешный
}
//---------------------------------------------------------------------------Если я не допустил ошибки, разбирает любую валидную вариацию десятичного числа.
А твоя программа, кстати, что говорит на число 1.e1?
Отредактировано Gremour (03.09.2007 17:57)
Неактивен
Olegus t.Gl. написал:
Постоянно натыкаюсь на довод о читабельности, однако, народ, что вы в это вкладываете? Если взять не элегантные примеры на десяток-полтора строк, а многоэкранные листинги, то сказать, куда произойдёт переход, будет проще с goto (с его чётким указанием меток), чем если разбираться со вложенными if, for и т.п. Я уж не говорю, что придётся разгребать разного рода допонительные конструкции: флаги условия и прочее. Интересен вопрос в плане раскрытия смысла термина "читабельность"…
Вообще я сам противник вложенностей 10-го колена. Разобраться без пол-литра в этом сложно. И текст уезжает за экран. %) Такие вещи лучше разбивать на функции. 2-3 вложенности максимум.
Неактивен
Gremour
Пример хорош, но он сделан для прямого анализатора и сразу вытаскивает значение числа, также есть ситуации, в которых могут возникнуть исключительные ситуации. Мой вариант, конечно не может разобрать число 1.e1, но только пока не может. ![]()
Через дня 2-4 выложу здесь другой вариант, твоей идеи, только алгоритм будет уже мой собственный.
Неактивен
Я решал поставленню задачу. Без вычисления самого числа программа будет еще проще (можно легко модифицировать), но я решил, что число всё же нужно. Если не учитывать все варианты написания числа (вроде 1.e1) опять же алгоритм будет короче. Но почему бы их не учесть? Это вроде бы как стандарт, любой компилятор C++ понимает разные валидные вариации сокращения формы десятичного числа (опустить ноль до или после точки, опустить знак экспоненты).
Неактивен
(опустить ноль до или после точки,
Поясни на примере, плохо как-то представить такое с экспонентой понятно, только не забудь представить число и в полной обычной форме письма, чтобы понять было удобно. ![]()
Неактивен
.12 читается как 0.12
34. читается как 34.0
1.e1, соответственно, равно десяти.
Хотя, если для системы нет разницы, целое число или нет, то можно на этом не заостряться. В C/C++ описание "34." даёт компилятору информацию о том, что указанная константа в дробном формате.
Если смотреть с общечеловеческой :) позиции, то алгоритм можно упростить, пропуская только формат с цифрами по обе стороны от точки (если точка есть).
Отредактировано Gremour (05.09.2007 18:32)
Неактивен
На одном форуме наткнулся на тему, посвящённую циклу «FOR», с очень чудными мыслями:
Break - нехорошо, так что, когда надо, я использую while или изменяю значение X (лучше while, конечно).
сам операторы break и continue вобще не использую - уж очень они мне goto напоминают
Мне не нравится идея использования break в циклах, это дурной тон. Так же как continue, exit/return и пр. Точка выхода из подпрограммы должна быть одна.
Я, например, тоже склоняюсь к мысли, что лучше бы, если точка выхода из процедуры/функции одна, хотя порой это всё же приводит к излишней запутанности, но вот операторы "continue" и "break" довольно близки идеологически к естественному языку, так что, на мой взгляд, смотрятся уместно.
Неактивен
Olegus t.Gl. написал:
Я, например, тоже склоняюсь к мысли, что лучше бы, если точка выхода из процедуры/функции одна, хотя порой это всё же приводит к излишней запутанности, но вот операторы "continue" и "break" довольно близки идеологически к естественному языку, так что, на мой взгляд, смотрятся уместно.
Да и вообще, излишний пуризьм до добра не доводит. Я вот вспоминаю книжку по Паскалю (не самую плохую, кстати), где автор в главе, посвященной ООП, утверждал, что в идеале все поля объекта должны быть скрыты от программиста, и последний должен взаимодействовать с ними исключительно через методы. Т. е. типа если у объекта есть поля x, y, то писАть вот так
with object do x:=1; y:=2; end with;
не круто. Обязательно надо внутри объекта определить некий метод:
procedure SetXY(FirstVar, SecondVar: integer); virtual; begin x:=FirstVar; y:=SecondVar; end;
и впоследствии для обращения к этим полям использовать исключительно вызов
SetXY(1, 2);
К чести автора, его запала хватило только на пример, иллюстрирующий данную главу; впоследствии он прекрасно обращался к полям объекта наиболее естественным образом.
Нет, я, конечно, и сам люблю стилистически безупречные вещи, но во всем должна быть мера...
Неактивен