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

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 2 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
Модератор форума: terrarus, ivan_fd  
Форум Picbasic.ru » Программирование МК » Mikrobasic » Почему не выполняются операторы?
Почему не выполняются операторы?
ivan_fd Дата: Чт, 22.08.2019, 10:01  |                                                                                                                Сообщение # 16
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Или использовать Forward declaration

Например: sub function TEST(dim a as word, dim b as word) as word forward
vladh Дата: Чт, 22.08.2019, 10:02  |                                                                                                                Сообщение # 17
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата ivan_fd ()
Просто нужно расставить функции так, чтобы были видны одна другой.

Вот эту мысль раскройте поподробней пожалуйста. Как это можно сделать без использования модулей?

Добавлено (22.08.2019, 10:08)
---------------------------------------------
Хотя кажется понял. Если прежде использовать прототип процедуры, а уже потом её описывать.

ivan_fd Дата: Чт, 22.08.2019, 10:12  |                                                                                                                Сообщение # 18
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Прототипы процедур применяются только в модулях.
Без использования модулей нужно делать так, как я написал выше -
Forward declaration. Хотя это тоже, что и прототипы.
vladh Дата: Чт, 22.08.2019, 10:43  |                                                                                                                Сообщение # 19
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Когда я осваивал российские CortexM3 и писал небольшие программки на СИ в Кейле, то там можно было  без модулей, а только за счет использования прототипов объявлять функции до их описания в основном файле.

Добавлено (22.08.2019, 11:35)
---------------------------------------------
А вот такой ещё вопрос. Я разбил свою программу на кучу модулей. В результате одна и таже переменная оказывается в нескольких модулях. Как и где мне правильно объявлять такие переменные? Если я объвляю её в одном из модулей или даже в основном файле, остальные её не видят.

Сообщение отредактировал vladh - Чт, 22.08.2019, 11:37
ivan_fd Дата: Чт, 22.08.2019, 12:16  |                                                                                                                Сообщение # 20
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

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


Да в C так и делается. Тут просто такой синтаксис и организация программы.

Цитата vladh ()
Как и где мне правильно объявлять такие переменные? Если я объвляю её в одном из модулей или даже в основном файле, остальные её не видят. С


Все просто. Тут почти так же как и в C. Ставим переменной признак external.
Например:
 в основной программе определена переменная
Код
dim test_var as byte

 в модулях где к ней нужен доступ ставим 

Код
dim test_var as byte external
vladh Дата: Чт, 22.08.2019, 12:35  |                                                                                                                Сообщение # 21
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата ivan_fd ()
в основной программе определена переменная
Код
dim test_var as byte
в модулях где к ней нужен доступ ставим

Код
dim test_var as byte external
Странно. Почему её надо определять вновь. Она же считается глобальной?

Сообщение отредактировал vladh - Чт, 22.08.2019, 12:36
ЯНДЕКС Дата: 22.08.2019
ivan_fd Дата: Чт, 22.08.2019, 12:48  |                                                                                                                Сообщение # 22
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Она глобальная только для данного файла!!
Почитайте внимательно раздел помощи Scope and Visibility.
vladh Дата: Чт, 22.08.2019, 13:10  |                                                                                                                Сообщение # 23
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Да, спасибо внимательнее прочел и понял.
Но вот я сейчас что увидел. Если у меня одна и таже переменная используется в двух разных модулях и я объявляю их в своих модулях то все компилируется без проблем. Но если такая же переменная присутствует в основном файле, то тогда её объявлять в модулях надо, как вы писали со словом external.

Сообщение отредактировал vladh - Чт, 22.08.2019, 13:15
ivan_fd Дата: Чт, 22.08.2019, 13:46  |                                                                                                                Сообщение # 24
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Если вы объявите переменную, например, TEST в разных модулях и в основном файле. То компилятор создаст столько переменных, сколько вы создали. Для каждого файла свою и она будет видна только для него.
Если вы хотите создать переменную TEST глобальную для всех файлов, то объявляете ее с признаком external. (external только в модулях, в основном без) В таком случаи будет создана только одна переменная TEST.
vladh Дата: Чт, 22.08.2019, 14:00  |                                                                                                                Сообщение # 25
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Да, согласен. Логически это верно и понятно. Спасибо

Добавлено (26.08.2019, 06:35)
---------------------------------------------
Иван, добрый день. Наверное мне лучше опять к Вам обратится для разъяснения, поскольку Вы первым и со знанием вопроса отвечаете на мои вопросы. Продолжая перетаскивать в Микробейсик свою программу сделанную в Протоне столкнулся с сообщениями компилятора, которые никак не могу истолковать. А именно компилятор пишет:
"29 364 Recursion or cross-calling of 'Delay_1us' __Lib_Delays.mbas
53 364 Recursion or cross-calling of 'Delay_5500us' __Lib_Delays.mbas
41 364 Recursion or cross-calling of 'Delay_50us' __Lib_Delays.mbas

При этом он ссылается на библиотечный файл своей библиотеки __Lib_Delays.mbas. Что это может значить?

ivan_fd Дата: Пн, 26.08.2019, 10:56  |                                                                                                                Сообщение # 26
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Можете показать код, где есть эти сообщения?
vladh Дата: Пн, 26.08.2019, 11:06  |                                                                                                                Сообщение # 27
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Да, пожалуйста.
Прикрепления: 7560350.rar (157.1 Kb)
ivan_fd Дата: Пн, 26.08.2019, 14:54  |                                                                                                                Сообщение # 28
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Долбаный компилятор, даже нету описания ошибок.

Что значит ошибка я понимаю, но найти ее, пока, не могу. Их слишком много. Знать бы когда появилась первая ошибка и от того плясать. Тут где то идет рекурсивный вызов функций и может быть переполнение стека!!! У Вас в проекте вообще не используются функции Delay_1us(); Delay_5500us(); Скорее всего их использует какая то библиотека.
Буду еще смотреть.
ivan_fd Дата: Пн, 26.08.2019, 17:13  |                                                                                                                Сообщение # 29
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Нашел я причину такого поведения. Компилятор все правильно ругается.
Смотрите, файл Menu, там функция Start(). Из нее мы вызываем функцию Nastr_2() и из функции Nastr_2 мы опять вызываем Start(). Вот и выходит переполнение стека, рекурсия.
vladh Дата: Пн, 26.08.2019, 18:11  |                                                                                                                Сообщение # 30
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Цитата ivan_fd ()
Долбаный компилятор, даже нету описания ошибок.


С удовольствием готов согласится.  
Цитата ivan_fd ()
Компилятор все правильно ругается.


И что же правильно, если к задержкам нет вопросов? Может быть в этом (в рекурсии) и есть проблема. Хотя в обычном Бейсике это проходит.
И еще. А в СИ и МВ нельзя находясь в функции вызывать другую функцию, не закончив первую? А если можно, то после перехода в другую функцию и её выполнения программа обязана вернуться в первую функцию, чтобы довести её до конца?

Сообщение отредактировал vladh - Пн, 26.08.2019, 18:20
Форум Picbasic.ru » Программирование МК » Mikrobasic » Почему не выполняются операторы?
  • Страница 2 из 4
  • «
  • 1
  • 2
  • 3
  • 4
  • »
Поиск: