Регистрация | Вход

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 3 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
Модератор форума: terrarus, ivan_fd  
Форум Picbasic.ru » Программирование МК » Mikrobasic » Почему не выполняются операторы?
Почему не выполняются операторы?
ivan_fd Дата: Пн, 26.08.2019, 18:43  |                                                                                                                Сообщение # 31
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 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

В результате переполнение стека. Попробуйте.
ЯНДЕКС Дата: 26.08.2019
vladh Дата: Пн, 26.08.2019, 20:39  |                                                                                                                Сообщение # 32
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Иван, скорее всего Вы правы насчет проблемы повторного входа в функцию. Буду с этим разбираться. А в Протоне этот код несколько отличается. Там у меня не всегда переход в другую подпрограмму по  Gosub. Там у меня есть выходы из функций по Goto. Может поэтому там все работает и при компиляции не дает ошибок. В общем огромное Вам спасибо. Наверное далее сам разберусь.
DAlexV Дата: Вт, 27.08.2019, 09:12  |                                                                                                                Сообщение # 33
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Добрый коллеги. vladh, Иван правильно говорит. Переполнение стека. 
Цитата vladh ()
Там у меня есть выходы из функций по Goto

Ни в коем случае нельзя выходить из gosub через goto !!!! Goto можно использовать только внутри процедуры, не не как не из выхода из нее. (Крайний и нежелательный случай: вышли из функции по Goto, сделали что надо, вернулись на метку стоящую сразу за goto обратно в данную функцию. Но данный способ нежелателен). При вызове оператора Gosub в стек автоматом заносится адрес оператора стоящего сразу за gosub. Это нужно для того чтобы по команде return программа знала куда ей вернуться. А здесь на лицо как сказал Иван примерно:
Цитата ivan_fd ()
КодFunc1:
    GoSub Func2

returnFunc2:

    GoSub Func1
return

Как совет. В микоБарсике есть возвращаемые функцией значения (результат функции). Его можно использовать для выбора дальнейших действий после выполнения функции.

Успехов  wink


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
vladh Дата: Вт, 27.08.2019, 10:31  |                                                                                                                Сообщение # 34
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

DAlexV, фраза: " Там у меня есть выходы из функций по Goto" касалась Протона. В Микробейсике я эти два перехода (Goto и Gosub) не использую,поскольку где то в хелпе прочел о крайне нежелательном их использовании. И в Протоне такой выход (переход) часто вполне себе работает.
Цитата DAlexV ()
В микоБарсике есть возвращаемые функцией значения (результат функции). Его можно использовать для выбора дальнейших действий после выполнения функции.

Но это не всегда бывает нужно. Иногда бывает так, что функция еще не закончилась, а у Вас есть необходимость уйти по одному из нескольких вариантов. Можно конечно вначале закончить функцию, а уже потом уйти по одному из вариантов, но мне предпочтительнее не тратить впустую время, а сразу переключиться на другую задачу. Вот в этих случаях я бы предпочел обговариваемые команды переходов. А вообще спасибо за участие.
kits Дата: Вт, 27.08.2019, 12:39  |                                                                                                                Сообщение # 35
Группа: Проверенные
Ранг:  Новенький
Сообщений: 18
Репутация: 4   ±
Замечания:   ±
На сайте с 13.04.2015

Статус: Offline

Цитата vladh ()
В Микробейсике я эти два перехода (Goto и Gosub) не использую,поскольку где то в хелпе прочел о крайне нежелательном их использовании.
Они нежелательны в любом языке если не понимаете что делаете. Протона это тоже касается. Используя Goto нужно четко понимать что переход не вызовет проблем, например переполнения стека. Иначе стабильной работы не будет.

Цитата vladh ()
Иногда бывает так, что функция еще не закончилась, а у Вас есть необходимость уйти по одному из нескольких вариантов.
Вызываете другую функцию с кодом который нужно выполнить, а после выходите из текущей функции.

Сообщение отредактировал kits - Вт, 27.08.2019, 12:47
vladh Дата: Вт, 27.08.2019, 13:32  |                                                                                                                Сообщение # 36
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата kits ()
Они нежелательны в любом языке если не понимаете что делаете. Протона это тоже касается.

Интересно, а как Вы сможете в Протоне перейти на нужную Вам в данный момент подпрограмму?
Цитата kits ()
Вызываете другую функцию с кодом который нужно выполнить, а после выходите из текущей функции.

Я так и делал, попадая при этом второй раз в туже функцию, которую еще не закончил.
DAlexV Дата: Вт, 27.08.2019, 16:24  |                                                                                                                Сообщение # 37
Группа: Проверенные
Ранг:  Разобрался
Сообщений: 657
Репутация: 27   ±
Замечания:   ±
На сайте с 13.05.2008

Статус: Offline

Цитата vladh ()
DAlexV, фраза: " Там у меня есть выходы из функций по Goto" касалась Протона

Сорри. Не правильно прочитал. Что касаемо ветвлений и условий.... Тут каждый решает по своему. Это и есть замечательная наука алгоритмирование. Лично я предпочитаю флаги и функции, кому то нравится переходы. Каждый сам наступает на свои грабли  smile 
Цитата kits ()
Вызываете другую функцию с кодом который нужно выполнить, а после выходите из текущей функции.

и такой вариант можно. Опять же: главное не закопаться до переполнения стека


Будьте оригинальны-не повторяйте чужих ошибок ! Рыба сдохла. Теперь STM32(TS)+C#(VS).Старею :)
vladh Дата: Вт, 27.08.2019, 20:05  |                                                                                                                Сообщение # 38
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата DAlexV ()
Это и есть замечательная наука алгоритмирование. Лично я предпочитаю флаги и функции, кому то нравится переходы.


Такой науки по моему нет. Можно говорить о технике алгоритмирования. А что такое флаги и функции в Протоне? И как ими пользоваться вместо меток и переходов по меткам?

Сообщение отредактировал vladh - Вт, 27.08.2019, 20:06
kits Дата: Вт, 27.08.2019, 20:14  |                                                                                                                Сообщение # 39
Группа: Проверенные
Ранг:  Новенький
Сообщений: 18
Репутация: 4   ±
Замечания:   ±
На сайте с 13.04.2015

Статус: Offline

https://ru.wikipedia.org/wiki/Структурное_программирование
vladh Дата: Ср, 28.08.2019, 06:09  |                                                                                                                Сообщение # 40
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

kits, ссылка безусловно интересная. Парадигма о запрещении использования Goto может быть в каких то тонкостях программ полезна. Но меня это не убеждает. Мне пока в моих работах он не мешал, а скорее помогал. А по поводу использования Gosub я вообще не вижу проблем. Я не вижу разницы перехода по этому оператору и перехода на функцию или процедуру.
kits Дата: Ср, 28.08.2019, 20:56  |                                                                                                                Сообщение # 41
Группа: Проверенные
Ранг:  Новенький
Сообщений: 18
Репутация: 4   ±
Замечания:   ±
На сайте с 13.04.2015

Статус: Offline

Цитата vladh ()
А по поводу использования Gosub я вообще не вижу проблем. Я не вижу разницы перехода по этому оператору и перехода на функцию или процедуру.
Если не брать в расчет аргументы, возвращаемое значение, локальные переменные, рекурсию, область видимости и многое другое, то да разницы нет.
Goto и Gosub это примитивные конструкции, которые несколько десятков лет не используются в большинстве языков, кроме ассемблера. То что в конкретном диалекте бейсика без них нельзя написать программу, говорит о примитивности его языковых конструкций.
ЯНДЕКС Дата: 28.08.2019
vladh Дата: Чт, 29.08.2019, 07:01  |                                                                                                                Сообщение # 42
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 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
Репутация: 4   ±
Замечания:   ±
На сайте с 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
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата
Цитата kits
Наши предки разжигали огонь трением палочек, жили в пещерах и вполне обходились без компов с микроконтроллерами. Последуем их примеру?


А это здесь причем? Или Вы уже на русском языке разговаривать не хотите, поскольку он довольно старый? Далеко не все новое лучше старого.
Цитата
Цитата kits
Есть. https://avrhelp.mcselec.com/local.htm


Спасибо за находку. Но когда я писал программы на этом языке, я этого не увидел.
Цитата
Цитата 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
Репутация: 4   ±
Замечания:   ±
На сайте с 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
Форум Picbasic.ru » Программирование МК » Mikrobasic » Почему не выполняются операторы?
  • Страница 3 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
Поиск: