Почему не выполняются операторы?
|
|
vladh |
Дата: Пн, 19.08.2019, 19:07 | Сообщение # 1 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Сегодня я уже писал, что в Протоне невозможно "организовать" ШИМ на частотах выше 32 кГц. Поэтому решил перевести код своей программы с Протона на Микробейсик. И вот в очередной раз столкнулся с проблемой. К теме прикладываю схему в Протеусе и файлы МВ. Код нормально компилируется, но при выводе на экран OLED дисплея оператор 170 строки кода и 175 строки не выполняются. Причем я пытался проделать разные перестановки но принципа так и не понял. Может кто сообразительнее меня и разберется в ситуации. Что интересно это наблюдается как с компьютерной моделью в Протеусе, так и с живой схемой на индикаторе WEH002004BLPP5N00000.
|
|
|
|
ivan_fd |
Дата: Вт, 20.08.2019, 09:39 | Сообщение # 2 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Потому, что для строк нужно использовать тип string. И размеры правильно указать. А то у вас txt6, размер 4 байта, а пишете туда 9.
Код dim txt1 as string[4] txt2 as string[4] txt3 as string[4] txt4 as string[4] txt5 as string[4] txt6 as string[9] res_txt as string[15]
|
|
|
|
vladh |
Дата: Вт, 20.08.2019, 09:49 | Сообщение # 3 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Тип char я взял из родных примеров МВ. txt6 реально состоит из 9 байт! И он выводится нормально. Замена типов на string ничего не изменило!
Добавлено (20.08.2019, 10:15) --------------------------------------------- Хочу заметить, что если я ставлю в 170 строке вместо txt2 - txt1 и в 175 строке также ставлю txt1, то все выводится как указано.
Сообщение отредактировал
vladh - Вт, 20.08.2019, 10:15
|
|
|
|
ivan_fd |
Дата: Вт, 20.08.2019, 11:03 | Сообщение # 4 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
У меня изменило. Поставил тип STRING и все работает. Инициализация массивов идет не верно, кода вы присваиваете им строки, потому и не выводит.
У вас написано txt6 as char[4] - как сюда может поместится 9 байт???
|
|
|
|
vladh |
Дата: Вт, 20.08.2019, 11:43 | Сообщение # 5 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
У меня не реагирует. Судя по всему у Вас стоит родной драйвер ЖКИ, не русифицированный. Это раз. И второе, у Вас какая версия МВ? У меня 7,2,0 Добавлено (20.08.2019, 12:47) --------------------------------------------- Попробовал поставить родной драйвер ЖКИ. Ничего не изменилось. Несмотря на то, что размер txt6 у меня стоит - 4, отображаются все 9 символов. Остается версия МВ? Добавлено (20.08.2019, 14:13) --------------------------------------------- Кстати Иван, перешлите мне то, что у вас получилось с кодом. Я его у себя попробую. Добавлено (20.08.2019, 14:30) --------------------------------------------- Сейчас поставил последнюю версию. БЕЗРЕЗУЛЬТАТНО!
|
|
|
|
ivan_fd |
Дата: Вт, 20.08.2019, 15:52 | Сообщение # 6 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
MB у меня 7.2.0.Цитата vladh ( ) Несмотря на то, что размер txt6 у меня стоит - 4, отображаются все 9 символов. Остается версия МВ?
Я вам говорю, что инициализация массивов не верная. Посмотрите в протеусе. Поставьте верные размеры массивов!!!!
Прикрепляю то, что я скомпилировал.
|
|
|
|
ivan_fd |
Дата: Вт, 20.08.2019, 16:18 | Сообщение # 7 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
А теперь я вам объясню попонятнее, почему не работает. Смотрим статистику вашего кода, вкладка Variables.
И видим что начальный адрес массива Txt5 0x0020(DEC 32 ), а массива Txt2 0x0024 (DEC 36). Размер массива Txt5 - три байта плюс один символ NULL. Вы в него пишите 4 символа, то есть 4 байта, плюс NULL. Вместе 5 байт. И потому символ NULL записывается в ячейку по адресу 0x0024. Потому не выводится ни Txt2, ни Txt5. Потому, что в Txt2 по первому адресу стоит NULL и нечего выводить, а в Txt5 нету окончания строки.
|
|
|
|
vladh |
Дата: Ср, 21.08.2019, 03:40 | Сообщение # 8 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Иван, спасибо большое за участие и помощь. Все происходит и так и не совсем так. Первое, в данном случае тип переменных роли не играет. Что char, что string, работают одинаково. А вот указание на количества байт массива не всегда работает однозначно. Так например, если я в строке txt6 as char [9] укажу на то, что он состоит не из 9 байтов, а из 4 (хотя сам этот элемент состоит из 9 байтов), то на экран будут выведены все байты этого элемента, но зато элемент txt5 вообще не будет выведен. Что и происходило у меня. Или я для элемента txt2 укажу не 4 байта, а только три, то на экран он будет выведен полностью, а вот элемент txt1 будет вообще не выведен!
Сообщение отредактировал
vladh - Ср, 21.08.2019, 09:00
|
|
|
|
ivan_fd |
Дата: Ср, 21.08.2019, 10:38 | Сообщение # 9 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Ладно, с типами разобрались. Хотя компилятор умничает и сам добавляет один байт для байта окончания строки.
Цитата vladh ( ) Все происходит и так и не совсем так.
Все работает именно так, как вы напишите!!! Чтобы все увидеть есть протеус, в самом микробейсике, есть статистика, где видно по каким адресам и какие размеры в той, или иной переменной. Пишу еще раз, поставьте правильные размеры массивам и все будет хорошо. Может вы не понимаете как работают массивы и потому у вас такая путаница? Объясняю - по простому, так сказать. Берем массив, например Txt6. Он у вас объявлен
то есть компилятор выделит для него 4+1=5 байт. Один байт для символа окончания строки (NULL) Смотрим в статистику программы и видим что он расположен по адресу 0x0017 (DEC 23). То есть мы без всяких страхов и последующих проблем можем записать в него 4-ре байта, символ окончания строки компилятор сам запишет в 5-ый байт. Получается что мы пишем 4-ре байта начиная с адреса 23. 23; 24; 25; 26 и в адрес 27 запишется символ NULL. Сколько мы отвели ему памяти, столько и задействовали, все нормально. А теперь как делаете вы, пишите в него 9 байт. Он пишет по адресах - 23,24,25,26,27,28,29,30,31 плюс NULL 32. А теперь смотрим, что у нас находится по адресу 32???? Правильно - начало массива Txt5. Вот компилятор символ NULL и запишет в первую ячейку массива Txt5. А поскольку процедура вывода на LCD выводит символы до тех пор, пока не встретит символ NULL, то она ничего не выведет с массива Txt5. Потому, что символ NULL там на первом месте. Так понятно?????
|
|
|
|
vladh |
Дата: Ср, 21.08.2019, 14:47 | Сообщение # 10 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Цитата ivan_fd ( ) Так понятно?????
Это один подход к задаче. Но можно подойти и по другому, так как я подхожу, т.е. не смотрю, что куда записывает программа компилирования. Я считаю так , что пользователь должен прочитать файл помощи и на его основании составлять код. Так вот на этом основании в разделе описания переменных мы указали тип и размер переменных. В данном случае это строковые массивы. Далее, после инициализации ЖКИ и выдачи некоторых команд мы сообщаем компилятору команду lcd_out(1,1,txt5). Это значит, что на экране ЖКИ с точки у которой координаты 1,1 должен разместится строковый массив с объемом указанным в разделе определений, причем игнорируя те элементы массива, которые могут быть указаны в описании лишними(более 4). Например: Dim txt5 as ctring [4] txt5 = "Переменная". Т.е. на экран должно вывести только Пере!
Сообщение отредактировал
vladh - Ср, 21.08.2019, 14:49
|
|
|
|
ivan_fd |
Дата: Ср, 21.08.2019, 15:55 | Сообщение # 11 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Чесно говоря я еще не слышал, что бы был такой компилятор, который бы ограничивал длину текста в зависимости от размера массива. Ошибку может выдавать, тот же протон даст ошибку, что размер больше. А так, тут все ложится на руки программиста. Если вам это нужно, то пишите сами функцию которая будет это делать. И если уж вы заговорили за файл помощи, то в нем четко написано:
Be careful when handling strings in this way, since overwriting the end of a string will cause an unpredictable behavior.
|
|
|
|
vladh |
Дата: Чт, 22.08.2019, 05:17 | Сообщение # 12 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Цитата ivan_fd ( ) Be careful when handling strings in this way, since overwriting the end of a string will cause an unpredictable behavior.
Поскольку я перевожу с помощью Яндекс-переводчика для меня перевод этой фразы многозначен. А это значит, что под этим можно подразумевать многое, даже противоположное...Цитата ivan_fd ( ) Чесно говоря я еще не слышал, что бы был такой компилятор, который бы ограничивал длину текста в зависимости от размера массива.
Для меня таким компилятором является Proton и Bascom. У меня никогда не было подобных проблем с этими компиляторами. Это уже идут у нас пространные разговоры, больше философствование чем по делу. Я еще раз хочу высказать Вам свое СПАСИБО за то, что помогли найти ошибку.
Добавлено (22.08.2019, 08:01) --------------------------------------------- У меня возник еще один вопрос. В Протоне можно в любом месте подпрограммы выскочить из неё по Gosub в другую подпрограмму, а потом вновь вернуться. А как это сделать в Микробейсик? Как выскочить из процедуры и вновь в неё вернуться? Т.е. если объявить вторую подпрограмму тоже процедурой, то компилятор ругается на то, что одна из задействованных процедур еще не объявлена.
Сообщение отредактировал
vladh - Чт, 22.08.2019, 08:05
|
|
|
|
ivan_fd |
Дата: Чт, 22.08.2019, 08:25 | Сообщение # 13 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Цитата vladh ( ) А как это сделать в Микробейсик?
Он ругается, потому, что не знает о ней. Скорее всего она находится ниже той процедуры, которая ее вызывает. Посмотрите в помощи пункт Program Organization. Все процедуры и функции идут сразу за объявлениями переменных. Или я вас не понял. Тогда покажите ошибку.
|
|
|
|
vladh |
Дата: Чт, 22.08.2019, 08:36 | Сообщение # 14 |
Группа:
Проверенные
Ранг:
Помогаю всем
Сообщений:
258
Замечания:
±
На сайте с 15.10.2007
Статус:
Offline
|
Да, Вы правильно поняли. Но я же и говорю, что если я объявлю одну процедуру раньше другой, то он будет ругаться на эту другую, а если объявлю другую первой, то ругаться будет на ту, что в предыдущем случае объявлял первой.
|
|
|
|
ivan_fd |
Дата: Чт, 22.08.2019, 09:52 | Сообщение # 15 |
Группа:
Модераторы
Ранг:
Специалист
Сообщений:
894
Замечания:
±
На сайте с 12.01.2009
Статус:
Offline
|
Я в этом вообще проблем не вижу, разве, что неудобство. Просто нужно расставить функции так, чтобы были видны одна другой. Или попробовать вывести в отдельный модуль и в нем уже прописывать прототипы функций.
|
|
|
|