Почему не выполняются операторы?
|
|
ivan_fd |
Дата: Чт, 22.08.2019, 10:01 | Сообщение # 16 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Цитата ivan_fd ( ) Просто нужно расставить функции так, чтобы были видны одна другой. Вот эту мысль раскройте поподробней пожалуйста. Как это можно сделать без использования модулей?Добавлено (22.08.2019, 10:08) --------------------------------------------- Хотя кажется понял. Если прежде использовать прототип процедуры, а уже потом её описывать.
|
|
|
|
ivan_fd |
Дата: Чт, 22.08.2019, 10:12 | Сообщение # 18 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Прототипы процедур применяются только в модулях. Без использования модулей нужно делать так, как я написал выше - Forward declaration. Хотя это тоже, что и прототипы.
|
|
|
|
vladh |
Дата: Чт, 22.08.2019, 10:43 | Сообщение # 19 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Цитата vladh ( ) Когда я осваивал российские CortexM3 и писал небольшие программки на СИ в Кейле, то там можно было без модулей, а только за счет использования прототипов объявлять функции до их описания в основном файле.
Да в C так и делается. Тут просто такой синтаксис и организация программы.
Цитата vladh ( ) Как и где мне правильно объявлять такие переменные? Если я объвляю её в одном из модулей или даже в основном файле, остальные её не видят. С
Все просто. Тут почти так же как и в C. Ставим переменной признак external. Например: в основной программе определена переменная
в модулях где к ней нужен доступ ставим
Код dim test_var as byte external
|
|
|
|
vladh |
Дата: Чт, 22.08.2019, 12:35 | Сообщение # 21 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Цитата ivan_fd ( ) в основной программе определена переменная Код dim test_var as byte в модулях где к ней нужен доступ ставим
Код dim test_var as byte external Странно. Почему её надо определять вновь. Она же считается глобальной?
Сообщение отредактировал
vladh - Чт, 22.08.2019, 12:36
|
|
|
|
ivan_fd |
Дата: Чт, 22.08.2019, 12:48 | Сообщение # 22 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Она глобальная только для данного файла!! Почитайте внимательно раздел помощи Scope and Visibility.
|
|
|
|
vladh |
Дата: Чт, 22.08.2019, 13:10 | Сообщение # 23 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Да, спасибо внимательнее прочел и понял. Но вот я сейчас что увидел. Если у меня одна и таже переменная используется в двух разных модулях и я объявляю их в своих модулях то все компилируется без проблем. Но если такая же переменная присутствует в основном файле, то тогда её объявлять в модулях надо, как вы писали со словом external.
Сообщение отредактировал
vladh - Чт, 22.08.2019, 13:15
|
|
|
|
ivan_fd |
Дата: Чт, 22.08.2019, 13:46 | Сообщение # 24 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Если вы объявите переменную, например, TEST в разных модулях и в основном файле. То компилятор создаст столько переменных, сколько вы создали. Для каждого файла свою и она будет видна только для него. Если вы хотите создать переменную TEST глобальную для всех файлов, то объявляете ее с признаком external. (external только в модулях, в основном без) В таком случаи будет создана только одна переменная TEST.
|
|
|
|
vladh |
Дата: Чт, 22.08.2019, 14:00 | Сообщение # 25 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 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
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Можете показать код, где есть эти сообщения?
|
|
|
|
vladh |
Дата: Пн, 26.08.2019, 11:06 | Сообщение # 27 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Да, пожалуйста.
|
|
|
|
ivan_fd |
Дата: Пн, 26.08.2019, 14:54 | Сообщение # 28 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Долбаный компилятор, даже нету описания ошибок.
Что значит ошибка я понимаю, но найти ее, пока, не могу. Их слишком много. Знать бы когда появилась первая ошибка и от того плясать. Тут где то идет рекурсивный вызов функций и может быть переполнение стека!!! У Вас в проекте вообще не используются функции Delay_1us(); Delay_5500us(); Скорее всего их использует какая то библиотека. Буду еще смотреть.
|
|
|
|
ivan_fd |
Дата: Пн, 26.08.2019, 17:13 | Сообщение # 29 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Нашел я причину такого поведения. Компилятор все правильно ругается. Смотрите, файл Menu, там функция Start(). Из нее мы вызываем функцию Nastr_2() и из функции Nastr_2 мы опять вызываем Start(). Вот и выходит переполнение стека, рекурсия.
|
|
|
|
vladh |
Дата: Пн, 26.08.2019, 18:11 | Сообщение # 30 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Цитата ivan_fd ( ) Долбаный компилятор, даже нету описания ошибок.
С удовольствием готов согласится. Цитата ivan_fd ( ) Компилятор все правильно ругается.
И что же правильно, если к задержкам нет вопросов? Может быть в этом (в рекурсии) и есть проблема. Хотя в обычном Бейсике это проходит. И еще. А в СИ и МВ нельзя находясь в функции вызывать другую функцию, не закончив первую? А если можно, то после перехода в другую функцию и её выполнения программа обязана вернуться в первую функцию, чтобы довести её до конца?
Сообщение отредактировал
vladh - Пн, 26.08.2019, 18:20
|
|
|
|