Почему не выполняются операторы?
|
|
ivan_fd |
Дата: Пн, 26.08.2019, 18:43 | Сообщение # 31 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Задержки тут не при чем. Оно забивает стек и в какой то момент уже не может пользовать функции, так же и Delay_...
Цитата vladh ( ) И еще. А в СИ и МВ нельзя находясь в функции вызывать другую функцию, не закончив первую? А если можно, то после перехода в другую функцию и её выполнения программа обязана вернуться в первую функцию, чтобы довести её до конца?
Конечно можно. В PIC18 стек имеет, если не ошибаюсь, 31 уровень. То есть мы можем вызвать из одной функции вторую, из второй третью и так до 31 раза. И при выходе из функции мы возвращаемся в место вызова функции +1. Тут проблем нету. И в обычном бейсике проходит точно так же как и тут. Я ж написал, что вы вызываете из функции 1, функцию 2. А из 2-й опять 1-ю. Куда она должна возвращатся, если постоянно идут вызовы одна одной???? (Перекрестный вызов or cross-calling) Типа такого:
Код Func1: GoSub Func2 return
Func2: GoSub Func1 return
В результате переполнение стека. Попробуйте.
|
|
|
|
vladh |
Дата: Пн, 26.08.2019, 20:39 | Сообщение # 32 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Иван, скорее всего Вы правы насчет проблемы повторного входа в функцию. Буду с этим разбираться. А в Протоне этот код несколько отличается. Там у меня не всегда переход в другую подпрограмму по Gosub. Там у меня есть выходы из функций по Goto. Может поэтому там все работает и при компиляции не дает ошибок. В общем огромное Вам спасибо. Наверное далее сам разберусь.
|
|
|
|
DAlexV |
Дата: Вт, 27.08.2019, 09:12 | Сообщение # 33 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Добрый коллеги. vladh, Иван правильно говорит. Переполнение стека. Цитата vladh ( ) Там у меня есть выходы из функций по Goto Ни в коем случае нельзя выходить из gosub через goto !!!! Goto можно использовать только внутри процедуры, не не как не из выхода из нее. (Крайний и нежелательный случай: вышли из функции по Goto, сделали что надо, вернулись на метку стоящую сразу за goto обратно в данную функцию. Но данный способ нежелателен). При вызове оператора Gosub в стек автоматом заносится адрес оператора стоящего сразу за gosub. Это нужно для того чтобы по команде return программа знала куда ей вернуться. А здесь на лицо как сказал Иван примерно:Цитата ivan_fd ( ) КодFunc1: GoSub Func2
returnFunc2:
GoSub Func1 return Как совет. В микоБарсике есть возвращаемые функцией значения (результат функции). Его можно использовать для выбора дальнейших действий после выполнения функции.
Успехов
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
vladh |
Дата: Вт, 27.08.2019, 10:31 | Сообщение # 34 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
DAlexV, фраза: " Там у меня есть выходы из функций по Goto" касалась Протона. В Микробейсике я эти два перехода (Goto и Gosub) не использую,поскольку где то в хелпе прочел о крайне нежелательном их использовании. И в Протоне такой выход (переход) часто вполне себе работает.Цитата DAlexV ( ) В микоБарсике есть возвращаемые функцией значения (результат функции). Его можно использовать для выбора дальнейших действий после выполнения функции. Но это не всегда бывает нужно. Иногда бывает так, что функция еще не закончилась, а у Вас есть необходимость уйти по одному из нескольких вариантов. Можно конечно вначале закончить функцию, а уже потом уйти по одному из вариантов, но мне предпочтительнее не тратить впустую время, а сразу переключиться на другую задачу. Вот в этих случаях я бы предпочел обговариваемые команды переходов. А вообще спасибо за участие.
|
|
|
|
kits |
Дата: Вт, 27.08.2019, 12:39 | Сообщение # 35 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
18
Замечания:
±
На сайте с 13.04.2015
Статус:
Offline
|
Цитата vladh ( ) В Микробейсике я эти два перехода (Goto и Gosub) не использую,поскольку где то в хелпе прочел о крайне нежелательном их использовании. Они нежелательны в любом языке если не понимаете что делаете. Протона это тоже касается. Используя Goto нужно четко понимать что переход не вызовет проблем, например переполнения стека. Иначе стабильной работы не будет.
Цитата vladh ( ) Иногда бывает так, что функция еще не закончилась, а у Вас есть необходимость уйти по одному из нескольких вариантов. Вызываете другую функцию с кодом который нужно выполнить, а после выходите из текущей функции.
Сообщение отредактировал
kits - Вт, 27.08.2019, 12:47
|
|
|
|
vladh |
Дата: Вт, 27.08.2019, 13:32 | Сообщение # 36 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Цитата kits ( ) Они нежелательны в любом языке если не понимаете что делаете. Протона это тоже касается. Интересно, а как Вы сможете в Протоне перейти на нужную Вам в данный момент подпрограмму?
Цитата kits ( ) Вызываете другую функцию с кодом который нужно выполнить, а после выходите из текущей функции. Я так и делал, попадая при этом второй раз в туже функцию, которую еще не закончил.
|
|
|
|
DAlexV |
Дата: Вт, 27.08.2019, 16:24 | Сообщение # 37 |
Группа:
Проверенные
Ранг:
Разобрался
Сообщений:
657
Замечания:
±
На сайте с 13.05.2008
Статус:
Offline
|
Цитата vladh ( ) DAlexV, фраза: " Там у меня есть выходы из функций по Goto" касалась Протона Сорри. Не правильно прочитал. Что касаемо ветвлений и условий.... Тут каждый решает по своему. Это и есть замечательная наука алгоритмирование. Лично я предпочитаю флаги и функции, кому то нравится переходы. Каждый сам наступает на свои грабли
Цитата kits ( ) Вызываете другую функцию с кодом который нужно выполнить, а после выходите из текущей функции. и такой вариант можно. Опять же: главное не закопаться до переполнения стека
Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
|
|
|
|
vladh |
Дата: Вт, 27.08.2019, 20:05 | Сообщение # 38 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Цитата DAlexV ( ) Это и есть замечательная наука алгоритмирование. Лично я предпочитаю флаги и функции, кому то нравится переходы.
Такой науки по моему нет. Можно говорить о технике алгоритмирования. А что такое флаги и функции в Протоне? И как ими пользоваться вместо меток и переходов по меткам?
Сообщение отредактировал
vladh - Вт, 27.08.2019, 20:06
|
|
|
|
kits |
Дата: Вт, 27.08.2019, 20:14 | Сообщение # 39 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
18
Замечания:
±
На сайте с 13.04.2015
Статус:
Offline
|
https://ru.wikipedia.org/wiki/Структурное_программирование
|
|
|
|
vladh |
Дата: Ср, 28.08.2019, 06:09 | Сообщение # 40 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
kits, ссылка безусловно интересная. Парадигма о запрещении использования Goto может быть в каких то тонкостях программ полезна. Но меня это не убеждает. Мне пока в моих работах он не мешал, а скорее помогал. А по поводу использования Gosub я вообще не вижу проблем. Я не вижу разницы перехода по этому оператору и перехода на функцию или процедуру.
|
|
|
|
kits |
Дата: Ср, 28.08.2019, 20:56 | Сообщение # 41 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
18
Замечания:
±
На сайте с 13.04.2015
Статус:
Offline
|
Цитата vladh ( ) А по поводу использования Gosub я вообще не вижу проблем. Я не вижу разницы перехода по этому оператору и перехода на функцию или процедуру. Если не брать в расчет аргументы, возвращаемое значение, локальные переменные, рекурсию, область видимости и многое другое, то да разницы нет. Goto и Gosub это примитивные конструкции, которые несколько десятков лет не используются в большинстве языков, кроме ассемблера. То что в конкретном диалекте бейсика без них нельзя написать программу, говорит о примитивности его языковых конструкций.
|
|
|
|
vladh |
Дата: Чт, 29.08.2019, 07:01 | Сообщение # 42 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Цитата kits ( ) Если не брать в расчет аргументы, возвращаемое значение, локальные переменные, рекурсию, область видимости и многое другое, то да разницы нет.
Да, в классических Бейсиках таких понятий нет. Эти языки вполне себе обходятся без них. Ну, например, локальные переменные. В PicBasic, Proton, BascomAVR, Bascom_8051 их нет. Там все переменные глобальные. И что? Скомпилированный код почти всегда меньше чем в изуродованном Бейсике - Mikrobasic. Рекурсия в приведенных Бейсиках решается гораздо проще и надежней чем в МВ. И остальное о чем Вы говорите как о плюсах мне таковым не кажется. Для меня, например, создавая области видимости чаще всего может приводить к путанице.
Цитата kits ( ) Goto и Gosub это примитивные конструкции, которые несколько десятков лет не используются в большинстве языков, кроме ассемблера. То что в конкретном диалекте бейсика без них нельзя написать программу, говорит о примитивности его языковых конструкций
Оператор Gosub не используется там где есть понятие функции/процедуры. Хотя в МВ он есть, но смысла в нем я здесь действительно не вижу. А вот оператор Goto есть почти во всех языках. Другое дело, что часто им не рекомендуют пользоваться. И я не говорил, что без него нельзя написать программу, можно, но на мой взгляд это будет более длинно - неудобно. И это не примитивность языка, а его простота. Программы не Бейсике, читаются более понятно чем, например, на СИ.
Сообщение отредактировал
vladh - Чт, 29.08.2019, 07:04
|
|
|
|
kits |
Дата: Чт, 29.08.2019, 12:48 | Сообщение # 43 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
18
Замечания:
±
На сайте с 13.04.2015
Статус:
Offline
|
Цитата vladh ( ) Да, в классических Бейсиках таких понятий нет. Эти языки вполне себе обходятся без них. Наши предки разжигали огонь трением палочек, жили в пещерах и вполне обходились без компов с микроконтроллерами. Последуем их примеру?
Цитата vladh ( ) BascomAVR, Bascom_8051 их нет. Есть. https://avrhelp.mcselec.com/local.htm
Цитата vladh ( ) Рекурсия в приведенных Бейсиках решается гораздо проще и надежней чем в МВ. Рекурсия с глобальными переменными? Для правильного ее выполнения у переменных функции должны быть свои копии локальных переменных, иначе от рекурсии мало толка.
Цитата vladh ( ) Для меня, например, создавая области видимости чаще всего может приводить к путанице. Видимо вы неправильно поняли о чем я писал. Что вы понимаете под областью видимости?
Цитата vladh ( ) И это не примитивность языка, а его простота. Наоборот, если часто приходится пользоваться Goto для упрощения кода это говорит о примитивности языка. В современных ЯП существует много разнообразных конструкций позволяющих не использовать Goto и при этом сохранить простоту и читаемость кода.
Цитата vladh ( ) Программы не Бейсике, читаются более понятно чем, например, на СИ. Смотря как написать на Си. На нем можно писать просто и понятно, а можно так что будешь долго думать что же делает код. То есть многое зависит от стиля написания.
На бейсике иногда попадаются программы с множеством Goto, в которых довольно сложно разобраться.
|
|
|
|
vladh |
Дата: Пт, 30.08.2019, 10:46 | Сообщение # 44 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Цитата Цитата kits Наши предки разжигали огонь трением палочек, жили в пещерах и вполне обходились без компов с микроконтроллерами. Последуем их примеру?
А это здесь причем? Или Вы уже на русском языке разговаривать не хотите, поскольку он довольно старый? Далеко не все новое лучше старого.
Спасибо за находку. Но когда я писал программы на этом языке, я этого не увидел.
Цитата Цитата kitsЧто вы понимаете под областью видимости? Именно это: https://u.to/d_AzFg
Цитата Цитата kits Наоборот, если часто приходится пользоваться Goto для упрощения кода это говорит о примитивности языка. В современных ЯП существует много разнообразных конструкций позволяющих не использовать Goto и при этом сохранить простоту и читаемость кода. Это вопрос риторический. Приведите мне пример конструкции в любом ЯП где можно быстро (желательно одномоментно) совершить переход в некоторую другую область программы не заботясь о последствиях. Проблему последствий должен решать сам компилятор, а не программист. Вот тогда это действительно мощный язык. Как я думаю.
Цитата Цитата kits Смотря как написать на Си. На нем можно писать просто и понятно, а можно так что будешь долго думать что же делает код. То есть многое зависит от стиля написания. На бейсике иногда попадаются программы с множеством Goto, в которых довольно сложно разобраться. Напишите мне две программы, одну на СИ, а другую на Бейсик и мы отдадим их для прочтения человеку умеющему читать по английски. И спросим его что он понял из двух текстов.
Сообщение отредактировал
vladh - Пт, 30.08.2019, 10:52
|
|
|
|
kits |
Дата: Пт, 30.08.2019, 21:24 | Сообщение # 45 |
Группа:
Проверенные
Ранг:
Новенький
Сообщений:
18
Замечания:
±
На сайте с 13.04.2015
Статус:
Offline
|
Цитата vladh ( ) А это здесь причем? Или Вы уже на русском языке разговаривать не хотите, поскольку он довольно старый? Далеко не все новое лучше старого.
Я где-то написал что язык старый? Более того я писал о диалектах бейсика, а не о языке в целом.
Цитата vladh ( ) Приведите мне пример конструкции в любом ЯП где можно быстро (желательно одномоментно) совершить переход в некоторую другую область программы не заботясь о последствиях.
Предположим что программа состоит из тысяч или десятков тысяч строк и в ней будет несколько сотен переходов в произвольную область. Насколько просто такую программу поддерживать и дорабатывать?
Я прекрасно понимаю о чем вы. Много лет назад когда в устройствах применял PIC16F84A и подобные, писал в стиле о котором вы говорите. Но это было давно. Сейчас недорого (около 200 рублей) можно купить микроконтроллер с 1 МБ флеша и почти 200 КБ ОЗУ. Размер прошивки не ограничивается парой КБ как в 16 серии ПИКов. В некоторых моих проектах число строк кода превышает 10 тысяч и еще много свободного флеша для усовершенствования программы. Ваш подход неприменим в этом случае. Нужно думать простоте кода о повторном его использовании. То есть код который может понадобится в других устройствах следует размещать в отдельных файлах, оформляя его в виде функций и документируя их. Это экономит время. А если будут переходы в произвольные части программы, это усложнит использование кода в дальнейшем. В больших проектах также не малую роль играет область видимости, позволяющая изолировать части кода и предотвращающая конфликты имен. Если когда-нибудь придется разрабатывать программу состоящую из десятков тысяч строк, возможно поймете о чем я.
Цитата vladh ( ) Напишите мне две программы, одну на СИ, а другую на Бейсик и мы отдадим их для прочтения человеку умеющему читать по английски. В Си не так много операторов чтобы было сложно запомнить. https://u.to/jdI0Fg Кроме того как я уже писал, есть много различных диалектов бейсика и в некоторых из них операторы подобные тем что в Си, но язык от этого не перестает быть бейсиком. http://www.picbasic.ru/forum/17-1885-18096-16-1563704872
Сообщение отредактировал
kits - Пт, 30.08.2019, 21:32
|
|
|
|