Нескольно простых вопросов о программировании AVR на Си.
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Нескольно простых вопросов о программировании AVR на Си.
да. эту цепочку тянуть надо от самого корня где объявлен массив, и тогда имени или вычисленной от него величине придётся проделать тот-же путь, что и адресу.
тут надо определить грань, когда размер станет проще хранить рядом с самим массивом (физически рядом - например в служебной 0й ячейке этого массива), а не таскать его за вызовами функций
тут надо определить грань, когда размер станет проще хранить рядом с самим массивом (физически рядом - например в служебной 0й ячейке этого массива), а не таскать его за вызовами функций
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- KorbenDallas
- Встал на лапы
- Сообщения: 93
- Зарегистрирован: Пн окт 31, 2016 06:23:19
Re: Нескольно простых вопросов о программировании AVR на Си.
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=4302462#p4302462"]тут надо определить грань, когда размер станет проще хранить рядом с самим массивом (физически рядом - например в служебной 0й ячейке этого массива), а не таскать его за вызовами функций[/uquote]
Никогда.
Любая функция, которая умеет работать с более-менее абстрактными массивами, принимая на вход указатель на начало массива и его размер, должна уметь и работать с "подмассивами" в рамках существующих массивов. То есть я всегда должен иметь возможность вызвать эту функцию с указателем куда-нибудь в середину существующего массива и/или с "укороченным" размером. Просто потому, что мне в данном месте кода так надо. Функцию не должно беспокоить то, передаю ли я в нее "полный" массив или лишь какой-то выбранный мною "огрызок" массива.
Попытки передавать размер через "служебную нулевую ячейку" приведут к уничтожению такой функциональности без каких-либо осмысленных обоснований такого уничтожения.
Не надо пугаться лишнего параметра функции. Попытки устранить его такими "пионэрскими" методами, как хранение размера массива в его нулевой ячейке принесет намного больше вреда, чем пользы.
Никогда.
Любая функция, которая умеет работать с более-менее абстрактными массивами, принимая на вход указатель на начало массива и его размер, должна уметь и работать с "подмассивами" в рамках существующих массивов. То есть я всегда должен иметь возможность вызвать эту функцию с указателем куда-нибудь в середину существующего массива и/или с "укороченным" размером. Просто потому, что мне в данном месте кода так надо. Функцию не должно беспокоить то, передаю ли я в нее "полный" массив или лишь какой-то выбранный мною "огрызок" массива.
Попытки передавать размер через "служебную нулевую ячейку" приведут к уничтожению такой функциональности без каких-либо осмысленных обоснований такого уничтожения.
Не надо пугаться лишнего параметра функции. Попытки устранить его такими "пионэрскими" методами, как хранение размера массива в его нулевой ячейке принесет намного больше вреда, чем пользы.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
вот уж хрень сказанули... если данные структурированы, то в соответствии с этой структурой их надо и хранить, и использовать: для работы с шрифтом в середину массива лезть не надо, надо знать лишь начало описания символа.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Нескольно простых вопросов о программировании AVR на Си.
KorbenDallas, хорошая практика, но всё зависит от задачи... всегда лучше иметь инструмент и уметь им пользоваться, даже если он пока не нужен, чем не иметь его совсем.
Для меня хоть и не открытием, но хорошим напоминанием было указание на возможность хранения размера массива в его служебной ячейке - мне после ухода с ардуины не попадались разноширные шрифты, а в ардуине это всё скрыто... а других задач с массивами произвольных размеров в МК не так много...
Я до этого таскал размер и всегда применял обертку-дефайн (редко встречаются задачи, где нужен не весь массив), но при этом не терял возможности вызвать функцию и с явным указанием параметров...
Для меня хоть и не открытием, но хорошим напоминанием было указание на возможность хранения размера массива в его служебной ячейке - мне после ухода с ардуины не попадались разноширные шрифты, а в ардуине это всё скрыто... а других задач с массивами произвольных размеров в МК не так много...
Я до этого таскал размер и всегда применял обертку-дефайн (редко встречаются задачи, где нужен не весь массив), но при этом не терял возможности вызвать функцию и с явным указанием параметров...
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Re: Нескольно простых вопросов о программировании AVR на Си.
[uquote="ARV",url="/forum/viewtopic.php?p=4307495#p4307495"]для работы с шрифтом в середину массива лезть не надо, надо знать лишь начало описания символа.[/uquote]
Совершенно верно! Удобно делать так:
где xs, ys - координаты начала текста на дисплее,
textline - массив символов выводимой строки,
&fontName - адрес структуры шрифта, вместе с его описанием и указателем на массив данных,
color - цвет символов (для монохрома - прямой или инвертированный)
Ну а структура шрифта содержит указатель на структуру описания шрифта (или напрямую структуру описания) и указатель на простой одномерный массив байтов символов. А смещение данных каждого символа находится в описании шрифта. Если все символы в шрифте - моноширные (одинаковой ширины), то смещение символа можно вычислять по размеру символа и его порядковому ANSI-номеру. Для пропорционального шрифта придется иметь размеры и смещение каждого символа, но что поделать, за визуальную красоту чем-то пожертвовать придется.
Совершенно верно! Удобно делать так:
Код: Выделить всё
PrintText(xs, ys, textline, &fontName, color);textline - массив символов выводимой строки,
&fontName - адрес структуры шрифта, вместе с его описанием и указателем на массив данных,
color - цвет символов (для монохрома - прямой или инвертированный)
Ну а структура шрифта содержит указатель на структуру описания шрифта (или напрямую структуру описания) и указатель на простой одномерный массив байтов символов. А смещение данных каждого символа находится в описании шрифта. Если все символы в шрифте - моноширные (одинаковой ширины), то смещение символа можно вычислять по размеру символа и его порядковому ANSI-номеру. Для пропорционального шрифта придется иметь размеры и смещение каждого символа, но что поделать, за визуальную красоту чем-то пожертвовать придется.
- KorbenDallas
- Встал на лапы
- Сообщения: 93
- Зарегистрирован: Пн окт 31, 2016 06:23:19
Re: Нескольно простых вопросов о программировании AVR на Си.
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=4307657#p4307657"]KorbenDallas, хорошая практика, но всё зависит от задачи... всегда лучше иметь инструмент и уметь им пользоваться, даже если он пока не нужен, чем не иметь его совсем.
Для меня хоть и не открытием, но хорошим напоминанием было указание на возможность хранения размера массива в его служебной ячейке - мне после ухода с ардуины не попадались разноширные шрифты, а в ардуине это всё скрыто... а других задач с массивами произвольных размеров в МК не так много...[/uquote]
Шрифт - это уже не абстрактный массив, это уже конкретный объект с фиксированным представлением, специфическое применение массива. Для представления конкретного объекта, разумеется, можно делать что угодно, в том числе и хранить размер в служебном элементе. Для средств же работы с абстрактными массивами (или любыми другими последовательностями) - без вариантов, обязательна поддержка массивов (последовательностей), которые начинаются "в любом месте" и имеют "любую длину", т.е. требования хранения размера в служебном элементе является неприемлемым.
Стандартная библиотека языка С с начала времен катастрофически страдает от этой проблемы при работе, например, со строками, в которых размер неявно задается нулевым символом в конце строки. В результате чего функции работы со строками являются неприменимыми для работы с подстроками - одна из общеизвестных и наиболее назойливых ошибок в дизайне стандартной библиотеки. "Чайники" на первых порах борются с этой проблемой вставкой временного нуля в середину строки, а более-менее компетентные специалисты понимают, что это неприемлемо, и вынужденно пишут "на коленке" дополнительные версии стандартных функций с интерфейсом "диапазонов" ("указатель на начало, длина" или "указатель на начало, указатель на конец"). От тех же проблем страдает и изначальный дизайн `std::string` и других контейнеров в С++.
Последнее десятилетие отдельное направление в развитии языков были направлено на решение этой проблемы. В С++ тут же появились развитые средства решения: views и ranges. Интерфейсы работы с последовательностями должны реализовываться в терминах views и/или ranges, а не целых объектов, что естественным образом удовлетворяет требованию возможности работы с подпоследовательностями. А в С эти правила выливаются в то, что я уже сказал выше: все функции обработки абстрактных массивов с самого начала должны работать с подмассивами, то есть принимать на вход некое "view" - "указатель на начало, длина", "указатель на начало, указатель на конец" и т.п.
Для меня хоть и не открытием, но хорошим напоминанием было указание на возможность хранения размера массива в его служебной ячейке - мне после ухода с ардуины не попадались разноширные шрифты, а в ардуине это всё скрыто... а других задач с массивами произвольных размеров в МК не так много...[/uquote]
Шрифт - это уже не абстрактный массив, это уже конкретный объект с фиксированным представлением, специфическое применение массива. Для представления конкретного объекта, разумеется, можно делать что угодно, в том числе и хранить размер в служебном элементе. Для средств же работы с абстрактными массивами (или любыми другими последовательностями) - без вариантов, обязательна поддержка массивов (последовательностей), которые начинаются "в любом месте" и имеют "любую длину", т.е. требования хранения размера в служебном элементе является неприемлемым.
Стандартная библиотека языка С с начала времен катастрофически страдает от этой проблемы при работе, например, со строками, в которых размер неявно задается нулевым символом в конце строки. В результате чего функции работы со строками являются неприменимыми для работы с подстроками - одна из общеизвестных и наиболее назойливых ошибок в дизайне стандартной библиотеки. "Чайники" на первых порах борются с этой проблемой вставкой временного нуля в середину строки, а более-менее компетентные специалисты понимают, что это неприемлемо, и вынужденно пишут "на коленке" дополнительные версии стандартных функций с интерфейсом "диапазонов" ("указатель на начало, длина" или "указатель на начало, указатель на конец"). От тех же проблем страдает и изначальный дизайн `std::string` и других контейнеров в С++.
Последнее десятилетие отдельное направление в развитии языков были направлено на решение этой проблемы. В С++ тут же появились развитые средства решения: views и ranges. Интерфейсы работы с последовательностями должны реализовываться в терминах views и/или ranges, а не целых объектов, что естественным образом удовлетворяет требованию возможности работы с подпоследовательностями. А в С эти правила выливаются в то, что я уже сказал выше: все функции обработки абстрактных массивов с самого начала должны работать с подмассивами, то есть принимать на вход некое "view" - "указатель на начало, длина", "указатель на начало, указатель на конец" и т.п.
Re: Нескольно простых вопросов о программировании AVR на Си.
KorbenDallas, и с третьей стороны, это как раз и будет выглядеть как явное задание длины этого массива через число его элементов. Чудес не бывает, если разобраться в самой сути явления.
- KorbenDallas
- Встал на лапы
- Сообщения: 93
- Зарегистрирован: Пн окт 31, 2016 06:23:19
Re: Нескольно простых вопросов о программировании AVR на Си.
[uquote="MLX90640",url="/forum/viewtopic.php?p=4308071#p4308071"]KorbenDallas, и с третьей стороны, это как раз и будет выглядеть как явное задание длины этого массива через число его элементов. Чудес не бывает, если разобраться в самой сути явления.[/uquote]
Не понимаю, что вы хотите сказать. Здесь никто не выступает против "длины массива" как таковой.
Речь идет о том, что в интерфейсе для работы с абстрактными последовательностями задание рабочего диапазона (view, range и т.п.) не должно быть интрузивным по отношению к этим последовательностям. Мы должны иметь возможность задавать хоть 10, хоть 100 диапазонов на одной и той же последовательности одновременно и они не должны никак друг другу мешать.
А когда задание диапазона на последовательности требует ее модификации - это уже кривизна. А когда последовательность вообще не позволяет задавать на себе диапазоны вследствие навязанных требований на свое физическое представление - это уже дичайшая кривизна в квадрате, "пионэрство" чистой воды.
Требование того, чтобы входная строка оканчивалась нулевым символом - пример первого. Требование того, чтобы в интерфейсах, принимающих на вход массивы, размер массива хранился в них самих - это как раз пример последнего.
Не понимаю, что вы хотите сказать. Здесь никто не выступает против "длины массива" как таковой.
Речь идет о том, что в интерфейсе для работы с абстрактными последовательностями задание рабочего диапазона (view, range и т.п.) не должно быть интрузивным по отношению к этим последовательностям. Мы должны иметь возможность задавать хоть 10, хоть 100 диапазонов на одной и той же последовательности одновременно и они не должны никак друг другу мешать.
А когда задание диапазона на последовательности требует ее модификации - это уже кривизна. А когда последовательность вообще не позволяет задавать на себе диапазоны вследствие навязанных требований на свое физическое представление - это уже дичайшая кривизна в квадрате, "пионэрство" чистой воды.
Требование того, чтобы входная строка оканчивалась нулевым символом - пример первого. Требование того, чтобы в интерфейсах, принимающих на вход массивы, размер массива хранился в них самих - это как раз пример последнего.
Re: Нескольно простых вопросов о программировании AVR на Си.
Чот вы понаписали очень заумных словов, а суть то осталась та же, что и со шрифтами и текстом - у текстовой строки признак окончания - '\0', у шрифта размер массива символа хранится в его описании. Описание может идти как в начале массива, так и вообще отдельно. Кагбе вот. Физически ничего другого не придумано.
Вот например в массиве шрифта нет смысла вызывать функцию отрисовки символа откуда-то от середины шрифта, потому как дальше функция будет неверно работать. Смысла в этом нет. Да, бывают примеры, когда какая-либо функция должна работать с произвольного места массива, например memset - универсальная ф-ция, работающая с любого места массива. Но есть и такие задачи, когда ф-ция должна работать только от начала массива, иначе она просто не имеет смысла.
Ой-вэй, но зачем? Приведите пример, где это нужно ВСЕГДА?То есть я всегда должен иметь возможность вызвать эту функцию с указателем куда-нибудь в середину существующего массива и/или с "укороченным" размером.
Вот например в массиве шрифта нет смысла вызывать функцию отрисовки символа откуда-то от середины шрифта, потому как дальше функция будет неверно работать. Смысла в этом нет. Да, бывают примеры, когда какая-либо функция должна работать с произвольного места массива, например memset - универсальная ф-ция, работающая с любого места массива. Но есть и такие задачи, когда ф-ция должна работать только от начала массива, иначе она просто не имеет смысла.
- ARV
- Ум, честь и совесть. И скромность.
- Сообщения: 18544
- Зарегистрирован: Чт дек 28, 2006 08:19:56
- Откуда: Новочеркасск
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
а вот в паскале проблема строк отсутствует, как класс: там размер строки всегда известен заранее, и именно благодаря тому, что "первый элемент" (или нулевой, не суть) всегда содержит размер строки.
но Си и С++ никогда не сделают так, будут жрать кактус...
но Си и С++ никогда не сделают так, будут жрать кактус...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
-
veso74
- Поставщик валерьянки для Кота
- Сообщения: 1903
- Зарегистрирован: Сб май 05, 2012 20:24:52
- Откуда: KN34PC, Болгария
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
И в C/C++ и n = sizeof(array); размер всегда известен, даже если установили размер неявно с array[] = {a, b, c ...};
И в нулевом элементе массива не нужны предварительные подсчеты и данных для количество. Просто используйте инструменты/функции компилятора для выбранного языка. За столько лет во всех системах/языках они одинаковые/или почти одинаковые/.
И в нулевом элементе массива не нужны предварительные подсчеты и данных для количество. Просто используйте инструменты/функции компилятора для выбранного языка. За столько лет во всех системах/языках они одинаковые/или почти одинаковые/.
Re: Нескольно простых вопросов о программировании AVR на Си.
[uquote="ARV",url="/forum/viewtopic.php?p=4308233#p4308233"]но Си и С++ никогда не сделают так, будут жрать кактус...[/uquote]Просто в C/C++ иногда приходится обрабатывать строки длиной больше 255 символов...
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Нескольно простых вопросов о программировании AVR на Си.
[uquote="ARV",url="/forum/viewtopic.php?p=4308233#p4308233"]но Си и С++ никогда не сделают так, будут жрать кактус...[/uquote]В С++ есть класс std::string. Можете поинтересоваться на досуге как он устроен, особенно в последних стандартах...
-
veso74
- Поставщик валерьянки для Кота
- Сообщения: 1903
- Зарегистрирован: Сб май 05, 2012 20:24:52
- Откуда: KN34PC, Болгария
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
[uquote="azhel12",url="/forum/viewtopic.php?p=4308252#p4308252"]Просто в C/C++ иногда приходится обрабатывать строки длиной больше 255 символов...[/uquote]
---
нет проблем, может быть, больше:
---
Код: Выделить всё
String s = "1 - brown fox jumps over the lazy dog, 2 - brown fox jumps over the lazy dog, 3 - brown fox jumps over the lazy dog, 4 - brown fox jumps over the lazy dog, 5 - brown fox jumps over the lazy dog, 6 - brown fox jumps over the lazy dog, brown fox jumps over the lazy dog, 7 - brown fox jumps over the lazy";Код: Выделить всё
print:
1 - brown fox jumps over the lazy dog, 2 - brown fox jumps over the lazy dog, 3 - brown fox jumps over the lazy dog, 4 - brown fox jumps over the lazy dog, 5 - brown fox jumps over the lazy dog, 6 - brown fox jumps over the lazy dog, brown fox jumps over the lazy dog, 7 - brown fox jumps over the lazyRe: Нескольно простых вопросов о программировании AVR на Си.
[uquote="veso74",url="/forum/viewtopic.php?p=4308256#p4308256"]нет проблем, может быть, больше:[/uquote]Хм, видимо, я уже забыл паскаль, до сих пор считал, что длина записана в нулевом байте, то есть возможные значения 0..255. Если не сложно, просветите, пожалуйста, как и где она на самом деле?
-
veso74
- Поставщик валерьянки для Кота
- Сообщения: 1903
- Зарегистрирован: Сб май 05, 2012 20:24:52
- Откуда: KN34PC, Болгария
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
Не знаю на Паскаль, забыл его за 25-30 лет. Пример выше на C++ и печать в UART.
Re: Нескольно простых вопросов о программировании AVR на Си.
[uquote="veso74",url="/forum/viewtopic.php?p=4308272#p4308272"]Не знаю на Паскаль, забыл его за 25-30 лет. Пример выше на C++ и печать в UART.[/uquote]Простите, а зачем тут этот пример?
-
veso74
- Поставщик валерьянки для Кота
- Сообщения: 1903
- Зарегистрирован: Сб май 05, 2012 20:24:52
- Откуда: KN34PC, Болгария
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
Чтобы опровергнуть Ваши слова:
[uquote="azhel12",url="/forum/viewtopic.php?p=4308252#p4308252"]Просто в C/C++ иногда приходится обрабатывать строки длиной больше 255 символов...[/uquote]
[uquote="azhel12",url="/forum/viewtopic.php?p=4308252#p4308252"]Просто в C/C++ иногда приходится обрабатывать строки длиной больше 255 символов...[/uquote]
Re: Нескольно простых вопросов о программировании AVR на Си.
[uquote="veso74",url="/forum/viewtopic.php?p=4308282#p4308282"]Чтобы опровергнуть Ваши слова:[/uquote]Понял
Ну вообще я имел ввиду, что способ хранения строк в паскале не подходит, так как накладывает ограничения на длину.
[uquote="veso74",url="/forum/viewtopic.php?p=4308250#p4308250"]И в C/C++ и n = sizeof(array); размер всегда известен[/uquote]Также, чтоб два раза не вставать, это не совсем правда, все-таки программа, как правило, состоит из функций, и если функция принимает массив как параметр, то размер определить невозможно.
[uquote="veso74",url="/forum/viewtopic.php?p=4308250#p4308250"]И в C/C++ и n = sizeof(array); размер всегда известен[/uquote]Также, чтоб два раза не вставать, это не совсем правда, все-таки программа, как правило, состоит из функций, и если функция принимает массив как параметр, то размер определить невозможно.
-
veso74
- Поставщик валерьянки для Кота
- Сообщения: 1903
- Зарегистрирован: Сб май 05, 2012 20:24:52
- Откуда: KN34PC, Болгария
- Контактная информация:
Re: Нескольно простых вопросов о программировании AVR на Си.
Напротив. Компилятор всегда знает количество числа в масиве. sizeof() позволяет получить количество для будущего использования.
Пример:
Код для sizeof(a) нет. Взял 05 и готово. (Оптимизатор даже не обрабатывал другие элементы массива из-за того, что не использовались).
Пример:
Код: Выделить всё
.. const int8 a[] = {11, 22, 33, 44, 55};
.. void main()
0004: MOVF 03,W
0005: ANDLW 1F
0006: MOVWF 03
0007: MOVLW 07
0008: MOVWF 1F
0009: BCF 03.7
.. {
.. while(TRUE)
.. {
.. int n = sizeof(a);
000A: MOVLW 05
000B: MOVWF 21
.. n++;
000C: INCF 21,F
000D: GOTO 00A
000E: SLEEP }
Последний раз редактировалось veso74 Сб окт 22, 2022 15:24:02, всего редактировалось 1 раз.