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

[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 4
  • 1
  • 2
  • 3
  • 4
  • »
Модератор форума: terrarus, ivan_fd  
Почему не выполняются операторы?
vladh Дата: Пн, 19.08.2019, 19:07  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Сегодня я уже писал, что в Протоне невозможно "организовать" ШИМ на частотах выше 32 кГц. Поэтому решил перевести код своей программы с Протона на Микробейсик. И вот в очередной раз столкнулся с проблемой. К теме прикладываю схему в Протеусе и файлы МВ. Код нормально компилируется, но при выводе на экран OLED дисплея оператор 170 строки кода и 175 строки не выполняются. Причем я пытался проделать разные перестановки но принципа так и не понял. Может кто сообразительнее меня и разберется в ситуации. Что интересно это наблюдается как с компьютерной моделью в Протеусе, так и с живой схемой на индикаторе WEH002004BLPP5N00000.
Прикрепления: Mikroel.rar (115.1 Kb)
ЯНДЕКС Дата: 19.08.2019
ivan_fd Дата: Вт, 20.08.2019, 09:39  |                                                                                                                Сообщение # 2
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 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
Репутация: 11   ±
Замечания:   ±
На сайте с 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
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

У меня изменило. Поставил тип STRING и все работает. Инициализация массивов идет не верно, кода вы присваиваете им строки, потому и не выводит.



У вас написано txt6 as char[4] - как сюда может поместится 9 байт???
Прикрепления: 4826260.png (20.3 Kb)
vladh Дата: Вт, 20.08.2019, 11:43  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 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
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

MB у меня 7.2.0.
Цитата vladh ()
Несмотря на то, что размер txt6 у меня стоит - 4, отображаются все 9 символов. Остается версия МВ?


Я вам говорю, что инициализация массивов не верная. Посмотрите в протеусе.
Поставьте верные размеры массивов!!!!


Прикрепляю то, что я скомпилировал.
Прикрепления: 3061974.png (44.6 Kb) · microel.zip (188.0 Kb)
ivan_fd Дата: Вт, 20.08.2019, 16:18  |                                                                                                                Сообщение # 7
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 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 нету окончания строки.
Прикрепления: 4414188.png (9.7 Kb)
vladh Дата: Ср, 21.08.2019, 03:40  |                                                                                                                Сообщение # 8
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 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
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Ладно, с типами разобрались. Хотя компилятор умничает и сам добавляет один байт для байта окончания строки.

Цитата vladh ()
Все происходит и так и не совсем так.


Все работает именно так, как вы напишите!!!
Чтобы все увидеть есть протеус, в самом микробейсике, есть статистика, где видно по каким адресам и какие размеры в той, или иной переменной.
Пишу еще раз, поставьте правильные размеры массивам и все будет хорошо. Может вы не понимаете как работают массивы и потому у вас такая путаница?
Объясняю - по простому, так сказать. Берем массив, например Txt6. Он у вас объявлен 
Код
txt6 as char[4]


то есть компилятор выделит для него 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
Репутация: 11   ±
Замечания:   ±
На сайте с 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
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Чесно говоря я еще не слышал, что бы был такой компилятор, который бы ограничивал длину текста в зависимости от размера массива. Ошибку может выдавать, тот же протон даст ошибку, что размер больше. А так, тут все ложится на руки программиста. Если вам это нужно, то пишите сами функцию которая будет это делать.
И если уж вы заговорили за файл помощи, то в нем четко написано:

Be careful when handling strings in this way, since overwriting the end of a string will cause an unpredictable behavior.
ЯНДЕКС Дата: 21.08.2019
vladh Дата: Чт, 22.08.2019, 05:17  |                                                                                                                Сообщение # 12
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 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
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Цитата vladh ()
А как это сделать в Микробейсик?


Он ругается, потому, что не знает о ней. Скорее всего она находится ниже той процедуры, которая ее вызывает. Посмотрите в помощи пункт Program Organization.
Все процедуры и функции идут сразу за объявлениями переменных.
Или я вас не понял. Тогда покажите ошибку.
vladh Дата: Чт, 22.08.2019, 08:36  |                                                                                                                Сообщение # 14
Группа: Проверенные
Ранг:  Помогаю всем
Сообщений: 258
Репутация: 11   ±
Замечания:   ±
На сайте с 15.10.2007

Статус: Offline

Да, Вы правильно поняли. Но я же и говорю, что если я объявлю одну процедуру раньше другой, то он будет ругаться на эту другую, а если объявлю другую первой, то ругаться будет на ту, что в предыдущем случае объявлял первой.
ivan_fd Дата: Чт, 22.08.2019, 09:52  |                                                                                                                Сообщение # 15
Группа: Модераторы
Ранг:  Специалист
Сообщений: 894
Репутация: 124   ±
Замечания:   ±
На сайте с 12.01.2009

Статус: Offline

Я в этом вообще проблем не вижу, разве, что неудобство. Просто нужно расставить функции так, чтобы были видны одна другой. Или попробовать вывести в отдельный модуль и в нем уже прописывать прототипы функций.
  • Страница 1 из 4
  • 1
  • 2
  • 3
  • 4
  • »
Поиск: