goto и switch
Вижу, что многие не понимают сути "народного" подхода, поступают вопросы, на которые следует ответить. Цитата:
Сообщение от voral
Более того применение флагов не имеет отношение к выбору с GOTO или без оного. Это вещи разного порядка. (Мне все больше кажется, что вы не совсем верно толкуете "структурное" программирование). Флаги это не состояние программы в целом, или на какой то момент времени... Это лишь характеристика конкретной сущности. Которая может меняться, а может не меняться.
В моём случае я действую по старинке, не пряча оператор goto. Мой код может обработать любой компилятор, даже самый "тупой". Цитата:
Сообщение от voral
Сути не меняет, я тоже именно про условную конструкцию, она всегда имеет, по сути одну точку выхода, эта точка следует срезу после конструкции... "Внутри" возможны лишь искусственные выходы, а это уже дело рук программиста. И вот тут и проявляется правильность подхода. В общем случае программ не должна улетать куда либо (как раз в вашем случае она делает это всегда). И лишь четко в обоснованных случаях это обоснованно
Во-вторых, моя программа никуда "не улетает". Она просто делает то, что предписано алгоритмом решения задачи. Если алгоритм предписывает куда-то перейти, например в начало, то код обеспечивает эту возможность. Вы же видите, даже такой простой код, уже настолько умён, что позволяет прерывать программу на любом шаге, входить в режим помощи на любом шаге и рестартовать программу. Даже если мы находимся на полпути расстановки кораблей на поле, можно сразу всё начать заново, сбросив все настройки. Из режима помощи можно вернутся в туже точку расстановки кораблей и продолжить с того же самого места. Напишите это в традиционном стиле. |
Всего комментариев 46
Комментарии
-
locm, это потому, что ваша функция ничего не возвращает. Допустим в си, если функция возвращает что-то, допустим int, всё в порядке:
Если же функция возвращает void, то придётся ставить завершающий оператор:C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#include <stdio.h> int func(void) { int a=0; while(a<=3) { if(a==2) goto END; ++a; } END: return 0; } int main(void) { return func(); }
Ваш pure basic тоже на сях написан, поэтому ошибка всеобщая, но не критичная.C 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
#include <stdio.h> void func(void) { int a=0; while(a<=3) { if(a==2) goto END; ++a; } END:; } int main(void) { func(); }
Запись от CoderHuligan размещена 25.06.2019 в 12:39 -
Не все так однозначно. тест получился не очень показателен. Т.к. показывает всегда разные результаты. Причем кардинально. В т.ч. и когда мой код быстрее вашего.. И уж точно у меня не был он ни разу на 30% медленнее. К тому же надо еще разобраться как это все в реальности происходит, потому что в цикле производится одно и то же действие. Такая ситуация в реальных проектах ОЧЕНЬ маловероятна.
Но, одна очень важная деталь, о которой не однократно здесь замечали. Код гораздо сложнее в поддержке. Он может быть сколь угодно удобен кому то конкретно (да и то на маленьких проектах), но большинство говорит "Нет, это не удобно". Я бы еще понял, если бы речь шла о каком либо новом подходе. А это нет... программирование эволюционирует, и как раз где то там в истории и было это goto программирование.. .К чему бы это?
В больших сложных проектах фактор понятности кода имеет очень большое значение. И с этой точки зрения я профита пока не вижу совсем. (Хотя были времена и GOTO было много в моем коде - т.е. сам по себе подход для меня совсем не новость).
Ну а с быстродейстивем все это фигня. Современные компляторы с оптимизацией все сделают отлично, а доля проектов там где "нехватает" там вообще подход к другой, который тащить в большую часть проектов совсем не рациональноЗапись от voral размещена 25.06.2019 в 12:45 -
Сорри. Смотрел первую версию теста. Вторая уже стабильнее работает. Профит скорости c GOTO 1.5 - 4.1%
gcc (Debian 6.3.0-18+deb9u1) 6.3.0 20170516
Запускал: gcc -Wall -o compare compare.c && ./compare
Т.е. не существенно... (Опять же с учетом того, что этот тест мало показателен с точки реального большого проекта и, особенно, когда проект ведет всю жизнь не один программист сам с собой изо дня в день.Запись от voral размещена 25.06.2019 в 12:58
Обновил(-а) voral 25.06.2019 в 13:00 -
а седня для вас у меня хорошие новости:
https://yadi.sk/i/DTp8c-Wtmi86Iw
как видите GCC8.2 рулит!
собсно, рулит на ура его оптимизатор.
Для меня, как оказалось, это был не только развлекательный, но и полезный тест.
Тот же тест + поддержка VS C++
CoderHuligan, GCC 8.2 просто создан для вас! Под виндоз тож есть версия. Берите и пользуйте.
хех, это больше касается вас с вашими перекрестными переходами меж блоками,
ах, да, блоки в игноре.
Да! на идею алгоритма я потратил минуту, согласитесь что это идея просто лежит
на поверхности и сама кричит во весь рот.
тут был еще какой то тест, на который все время ссылается Хулиган?
Но я его не нашел.
ну, что вы, это не так!
там в цикле то буквы идут, то небуквы ползут.
и для каждого символа нужно понять буква это или небуква и уже решать,
что с этим делать.
это можно не обсуждать: Хулиган дойдет до этого сам, когда завалит сибатл.
Или кучу сибатлов.
это очевидные вещи, если про них сказать, то никто не обратит внимание.Запись от XLAT размещена 25.06.2019 в 17:18
Обновил(-а) XLAT 25.06.2019 в 17:27 -
По вашему это приводит к тому что из стека не убирается лишний элемент? Не важно возвращает что-то функция или нет (для этого используется не стек, а регистр EAX), ошибка из-за некорректных данных в стеке и возникает из-за Goto. Из-за него не выполняется одна из POP инструкций.
Цитата:
Ошибка критичная и винда завершит приложение, ведь происходит возврат из функции (инструкция RET) на адрес 0, а не по адресу вызова.
Еще раз повторю, ошибка не при компиляции, а при выполнении программы.Запись от locm размещена 25.06.2019 в 22:41 -
Цитата:
Выкиньте свой pure basic в топку и проверьте в работе free basic.Запись от CoderHuligan размещена 26.06.2019 в 12:00 -
Цитата:а седня для вас у меня хорошие новости:
https://yadi.sk/i/DTp8c-Wtmi86Iw
как видите GCC8.2 рулит!
собсно, рулит на ура его оптимизатор.
Цитата:
Цитата:
Потому что если потребуется прыгнуть прямо в структурный блок выглядеть это будет не ком-иль-фо. Даже если делаем выход из вложенных циклов по goto, то уже не красиво. А если всё на goto построено, то всё выглядит как надо.
В современных структурных языка наблюдается семантическое расхождение с настоящим комьютерным языком - ассемблером. Поэтому когда программист вынужден программировать в силу разных причин на ассемблере, то просто не может реализовать даже простейший алгоритм. В моём варианте семантического расхождения не наблюдается.
Ещё надо помнить про "бритву Оккама" - "Не следует привлекать новые сущности без крайней на то необходимости". Если хватает существующих.
Цитата:Да! на идею алгоритма я потратил минуту, согласитесь что это идея просто лежит
на поверхности и сама кричит во весь рот.Запись от CoderHuligan размещена 26.06.2019 в 14:18
Обновил(-а) CoderHuligan 26.06.2019 в 14:23 -
Цитата:Сообщение от CoderHuliganПоэтому когда программист вынужден программировать в силу разных причин на ассемблере, то просто не может реализовать даже простейший алгоритм
Что за примитивизм? Зачем сводить кодирование на ЯВУ к Ассемблеру? Что за бред Вы вообще несете?
Наверное, глупые люди придумали язык Си, да и С++, со всеми ихними конструкциями. Не знали, что придет CoderHuligan и скажет, как надо правильно программировать...
Это мне напомнило то, как Вы с пеной у рта рассказывали нам, как надо делить на ноль, и что абсолютно все вычисления нужно вести исключительно целочисленные...
Просто откровение сошедшего до нас гуру...Запись от liv размещена 26.06.2019 в 16:06
Обновил(-а) liv 26.06.2019 в 16:12 -
Цитата:
Не глупые, прямо скажем, а люди введённые в заблуждение. Про язык си и другие структурные языки, я расскажу более подробно. Что там не так, и как надо..Запись от CoderHuligan размещена 26.06.2019 в 18:33 -
Запись от liv размещена 26.06.2019 в 18:41 -
Цитата:
Это будет нечто среднее между компилируемым и интерпретируемым языком. Создаём некую базовую сущность, существо-программу очень малого размера, которая может быть установлена на любом компьютере. Эта программа как некий вирус(но вирусом не являясь - там всё законно) может порождать другие программы компилируя-интерпретируя программный код, который ей предоставляет программист. Это не компилятор, а модуль для любой программы. На пример текстовый редактор главным модулем будет иметь именно вот эту программу. То есть эта программа есть некий эмбрион, который может расти, умнеть, короче - развиваться. Развивать её можно на особом языке. Преимущество в том, что каждая программа будет легко расширяема самими пользователями оной. Как сказал один из основателей корпорации Autodesk Джон Уолкер - "каждая программа должна быть программируемой". Он кстати самостоятельно реализовал нечто подобное: программу Atlast. На гитхабе можно познакомится. Я примерно хочу сделать нечто подобное, только применительно к своему языку.Запись от CoderHuligan размещена 26.06.2019 в 19:09 -
Запись от Usaga размещена 26.06.2019 в 19:23 -
Запись от CoderHuligan размещена 26.06.2019 в 19:53 -
А Вы книги Шалыто-то читали?
У него, например, также рассматривается ООП подход к построению автоматов.
Причем можно даже без контекста некоторые фразы дернуть:
Цитата:В то же время, за использование автоматов при разработке некритичного ПО приходится платить слишком высокую цену.Цитата:объектно-ориентированный подход наиболее эффективен для реализации событийных систем
P.S. И да, ужас, у Шалыто используются if-else, классы, циклы и т.д., а не Ваш Доширак.Запись от Croessmah размещена 28.06.2019 в 18:01
Обновил(-а) Croessmah 28.06.2019 в 18:03 -
Запись от liv размещена 28.06.2019 в 20:04 -
Запись от Croessmah размещена 28.06.2019 в 21:30 -
Запись от Avazart размещена 28.06.2019 в 22:31 -
Вообще, оператор GOTO несколько уникален в плане ветвления - программу можно вернуть через ретёрн, а можно и не возвращать, вот в чём фокус. Только конечно это уже не ООП, но ближе к нейросетям, точнее - к эвристике, но только частично. То-есть, если через массив процедур или меток функций можно продвигать какую-то самомодификацию, то подгонять результаты вычислений под значения - не совсем и не всегда удобно, а вот GOTO и его два сразу варианта в коде (с ретёрном и без) - это особый тип ветвления и самомодификации по результату вычислений.
Хотя...ретёрн и бреак через проверку условия - то же самое, но не совсем - GOTO не локализует участки кода - они для него глобальны все. Доступность кода - точка входа в инкапсуляции. Вроде так. Когда нечто вызывает само себя не с головы, а с той точки какая указана. С точки зрения топологии, это как возможность вывернуть код... В механике такое можно делать с механизмами и это может давать свои плюсы. Например можно вывернуть двигатель Стирлинга почти на изнанку - и это имеет свои плюсы и минусы (с обычным движком в него "фарша" не напихать столько), вопрос лишь в том - что нам надо.Запись от Hretgir размещена 29.06.2019 в 01:02
Обновил(-а) Hretgir 29.06.2019 в 01:25 -
Прочёл книгу "автоматное программирование". Также читал его статьи. Смотрел лекцию на ю-тьюб.
Цитата:
Цитата:
Просто я иду ещё дальше него, к упрощению его подхода.Запись от CoderHuligan размещена 29.06.2019 в 11:36
Обновил(-а) CoderHuligan 29.06.2019 в 11:38 -
Цитата:Сообщение от CoderHuliganПросто я иду ещё дальше него, к упрощению его подхода.
И ни слова там о способах реализациях. К Вашему сведению, любую здравую идею можно довести до абсурда, что Вы с успехом и делаете...
Так понял, до Вас даже не дошла идея автоматного программирования. Подошли к этому поверхностно... Лектор говорит совершенно о другом...
Отсюда и Ваши "упрощения", которые на деле являются усложнениями, т.к. ведут к запутыванию кода.Запись от liv размещена 29.06.2019 в 14:01