Нескольно простых вопросов о программировании AVR на Си.

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение Ivanoff-iv »

да. эту цепочку тянуть надо от самого корня где объявлен массив, и тогда имени или вычисленной от него величине придётся проделать тот-же путь, что и адресу.
тут надо определить грань, когда размер станет проще хранить рядом с самим массивом (физически рядом - например в служебной 0й ячейке этого массива), а не таскать его за вызовами функций
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
KorbenDallas
Встал на лапы
Сообщения: 93
Зарегистрирован: Пн окт 31, 2016 06:23:19

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение KorbenDallas »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=4302462#p4302462"]тут надо определить грань, когда размер станет проще хранить рядом с самим массивом (физически рядом - например в служебной 0й ячейке этого массива), а не таскать его за вызовами функций[/uquote]

Никогда.

Любая функция, которая умеет работать с более-менее абстрактными массивами, принимая на вход указатель на начало массива и его размер, должна уметь и работать с "подмассивами" в рамках существующих массивов. То есть я всегда должен иметь возможность вызвать эту функцию с указателем куда-нибудь в середину существующего массива и/или с "укороченным" размером. Просто потому, что мне в данном месте кода так надо. Функцию не должно беспокоить то, передаю ли я в нее "полный" массив или лишь какой-то выбранный мною "огрызок" массива.

Попытки передавать размер через "служебную нулевую ячейку" приведут к уничтожению такой функциональности без каких-либо осмысленных обоснований такого уничтожения.

Не надо пугаться лишнего параметра функции. Попытки устранить его такими "пионэрскими" методами, как хранение размера массива в его нулевой ячейке принесет намного больше вреда, чем пользы.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение ARV »

вот уж хрень сказанули... если данные структурированы, то в соответствии с этой структурой их надо и хранить, и использовать: для работы с шрифтом в середину массива лезть не надо, надо знать лишь начало описания символа.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение Ivanoff-iv »

KorbenDallas, хорошая практика, но всё зависит от задачи... всегда лучше иметь инструмент и уметь им пользоваться, даже если он пока не нужен, чем не иметь его совсем.

Для меня хоть и не открытием, но хорошим напоминанием было указание на возможность хранения размера массива в его служебной ячейке - мне после ухода с ардуины не попадались разноширные шрифты, а в ардуине это всё скрыто... а других задач с массивами произвольных размеров в МК не так много...

Я до этого таскал размер и всегда применял обертку-дефайн (редко встречаются задачи, где нужен не весь массив), но при этом не терял возможности вызвать функцию и с явным указанием параметров...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
MLX90640
Опытный кот
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение MLX90640 »

[uquote="ARV",url="/forum/viewtopic.php?p=4307495#p4307495"]для работы с шрифтом в середину массива лезть не надо, надо знать лишь начало описания символа.[/uquote]
Совершенно верно! Удобно делать так:

Код: Выделить всё

PrintText(xs, ys, textline, &fontName, color);
где xs, ys - координаты начала текста на дисплее,
textline - массив символов выводимой строки,
&fontName - адрес структуры шрифта, вместе с его описанием и указателем на массив данных,
color - цвет символов (для монохрома - прямой или инвертированный)

Ну а структура шрифта содержит указатель на структуру описания шрифта (или напрямую структуру описания) и указатель на простой одномерный массив байтов символов. А смещение данных каждого символа находится в описании шрифта. Если все символы в шрифте - моноширные (одинаковой ширины), то смещение символа можно вычислять по размеру символа и его порядковому ANSI-номеру. Для пропорционального шрифта придется иметь размеры и смещение каждого символа, но что поделать, за визуальную красоту чем-то пожертвовать придется.
Аватара пользователя
KorbenDallas
Встал на лапы
Сообщения: 93
Зарегистрирован: Пн окт 31, 2016 06:23:19

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение KorbenDallas »

[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=4307657#p4307657"]KorbenDallas, хорошая практика, но всё зависит от задачи... всегда лучше иметь инструмент и уметь им пользоваться, даже если он пока не нужен, чем не иметь его совсем.

Для меня хоть и не открытием, но хорошим напоминанием было указание на возможность хранения размера массива в его служебной ячейке - мне после ухода с ардуины не попадались разноширные шрифты, а в ардуине это всё скрыто... а других задач с массивами произвольных размеров в МК не так много...[/uquote]

Шрифт - это уже не абстрактный массив, это уже конкретный объект с фиксированным представлением, специфическое применение массива. Для представления конкретного объекта, разумеется, можно делать что угодно, в том числе и хранить размер в служебном элементе. Для средств же работы с абстрактными массивами (или любыми другими последовательностями) - без вариантов, обязательна поддержка массивов (последовательностей), которые начинаются "в любом месте" и имеют "любую длину", т.е. требования хранения размера в служебном элементе является неприемлемым.

Стандартная библиотека языка С с начала времен катастрофически страдает от этой проблемы при работе, например, со строками, в которых размер неявно задается нулевым символом в конце строки. В результате чего функции работы со строками являются неприменимыми для работы с подстроками - одна из общеизвестных и наиболее назойливых ошибок в дизайне стандартной библиотеки. "Чайники" на первых порах борются с этой проблемой вставкой временного нуля в середину строки, а более-менее компетентные специалисты понимают, что это неприемлемо, и вынужденно пишут "на коленке" дополнительные версии стандартных функций с интерфейсом "диапазонов" ("указатель на начало, длина" или "указатель на начало, указатель на конец"). От тех же проблем страдает и изначальный дизайн `std::string` и других контейнеров в С++.

Последнее десятилетие отдельное направление в развитии языков были направлено на решение этой проблемы. В С++ тут же появились развитые средства решения: views и ranges. Интерфейсы работы с последовательностями должны реализовываться в терминах views и/или ranges, а не целых объектов, что естественным образом удовлетворяет требованию возможности работы с подпоследовательностями. А в С эти правила выливаются в то, что я уже сказал выше: все функции обработки абстрактных массивов с самого начала должны работать с подмассивами, то есть принимать на вход некое "view" - "указатель на начало, длина", "указатель на начало, указатель на конец" и т.п.
Аватара пользователя
MLX90640
Опытный кот
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение MLX90640 »

KorbenDallas, и с третьей стороны, это как раз и будет выглядеть как явное задание длины этого массива через число его элементов. Чудес не бывает, если разобраться в самой сути явления.
Аватара пользователя
KorbenDallas
Встал на лапы
Сообщения: 93
Зарегистрирован: Пн окт 31, 2016 06:23:19

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение KorbenDallas »

[uquote="MLX90640",url="/forum/viewtopic.php?p=4308071#p4308071"]KorbenDallas, и с третьей стороны, это как раз и будет выглядеть как явное задание длины этого массива через число его элементов. Чудес не бывает, если разобраться в самой сути явления.[/uquote]

Не понимаю, что вы хотите сказать. Здесь никто не выступает против "длины массива" как таковой.

Речь идет о том, что в интерфейсе для работы с абстрактными последовательностями задание рабочего диапазона (view, range и т.п.) не должно быть интрузивным по отношению к этим последовательностям. Мы должны иметь возможность задавать хоть 10, хоть 100 диапазонов на одной и той же последовательности одновременно и они не должны никак друг другу мешать.

А когда задание диапазона на последовательности требует ее модификации - это уже кривизна. А когда последовательность вообще не позволяет задавать на себе диапазоны вследствие навязанных требований на свое физическое представление - это уже дичайшая кривизна в квадрате, "пионэрство" чистой воды.

Требование того, чтобы входная строка оканчивалась нулевым символом - пример первого. Требование того, чтобы в интерфейсах, принимающих на вход массивы, размер массива хранился в них самих - это как раз пример последнего.
Аватара пользователя
MLX90640
Опытный кот
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение MLX90640 »

Чот вы понаписали очень заумных словов, а суть то осталась та же, что и со шрифтами и текстом - у текстовой строки признак окончания - '\0', у шрифта размер массива символа хранится в его описании. Описание может идти как в начале массива, так и вообще отдельно. Кагбе вот. Физически ничего другого не придумано.
То есть я всегда должен иметь возможность вызвать эту функцию с указателем куда-нибудь в середину существующего массива и/или с "укороченным" размером.
Ой-вэй, но зачем? Приведите пример, где это нужно ВСЕГДА?
Вот например в массиве шрифта нет смысла вызывать функцию отрисовки символа откуда-то от середины шрифта, потому как дальше функция будет неверно работать. Смысла в этом нет. Да, бывают примеры, когда какая-либо функция должна работать с произвольного места массива, например memset - универсальная ф-ция, работающая с любого места массива. Но есть и такие задачи, когда ф-ция должна работать только от начала массива, иначе она просто не имеет смысла.
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18544
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение ARV »

а вот в паскале проблема строк отсутствует, как класс: там размер строки всегда известен заранее, и именно благодаря тому, что "первый элемент" (или нулевой, не суть) всегда содержит размер строки.

но Си и С++ никогда не сделают так, будут жрать кактус...
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
veso74
Поставщик валерьянки для Кота
Сообщения: 1903
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение veso74 »

И в C/C++ и n = sizeof(array); размер всегда известен, даже если установили размер неявно с array[] = {a, b, c ...};
И в нулевом элементе массива не нужны предварительные подсчеты и данных для количество. Просто используйте инструменты/функции компилятора для выбранного языка. За столько лет во всех системах/языках они одинаковые/или почти одинаковые/.
Аватара пользователя
azhel12
Встал на лапы
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение azhel12 »

[uquote="ARV",url="/forum/viewtopic.php?p=4308233#p4308233"]но Си и С++ никогда не сделают так, будут жрать кактус...[/uquote]Просто в C/C++ иногда приходится обрабатывать строки длиной больше 255 символов...
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение VladislavS »

[uquote="ARV",url="/forum/viewtopic.php?p=4308233#p4308233"]но Си и С++ никогда не сделают так, будут жрать кактус...[/uquote]В С++ есть класс std::string. Можете поинтересоваться на досуге как он устроен, особенно в последних стандартах...
veso74
Поставщик валерьянки для Кота
Сообщения: 1903
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение veso74 »

[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 lazy
Аватара пользователя
azhel12
Встал на лапы
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение azhel12 »

[uquote="veso74",url="/forum/viewtopic.php?p=4308256#p4308256"]нет проблем, может быть, больше:[/uquote]Хм, видимо, я уже забыл паскаль, до сих пор считал, что длина записана в нулевом байте, то есть возможные значения 0..255. Если не сложно, просветите, пожалуйста, как и где она на самом деле?
veso74
Поставщик валерьянки для Кота
Сообщения: 1903
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение veso74 »

Не знаю на Паскаль, забыл его за 25-30 лет. Пример выше на C++ и печать в UART.
Аватара пользователя
azhel12
Встал на лапы
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение azhel12 »

[uquote="veso74",url="/forum/viewtopic.php?p=4308272#p4308272"]Не знаю на Паскаль, забыл его за 25-30 лет. Пример выше на C++ и печать в UART.[/uquote]Простите, а зачем тут этот пример?
veso74
Поставщик валерьянки для Кота
Сообщения: 1903
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение veso74 »

Чтобы опровергнуть Ваши слова:
[uquote="azhel12",url="/forum/viewtopic.php?p=4308252#p4308252"]Просто в C/C++ иногда приходится обрабатывать строки длиной больше 255 символов...[/uquote]
Аватара пользователя
azhel12
Встал на лапы
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение azhel12 »

[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]Также, чтоб два раза не вставать, это не совсем правда, все-таки программа, как правило, состоит из функций, и если функция принимает массив как параметр, то размер определить невозможно.
veso74
Поставщик валерьянки для Кота
Сообщения: 1903
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

Re: Нескольно простых вопросов о программировании AVR на Си.

Сообщение veso74 »

Напротив. Компилятор всегда знает количество числа в масиве. sizeof() позволяет получить количество для будущего использования.

Пример:

Код: Выделить всё

.. 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 }
Код для sizeof(a) нет. Взял 05 и готово. (Оптимизатор даже не обрабатывал другие элементы массива из-за того, что не использовались).
Последний раз редактировалось veso74 Сб окт 22, 2022 15:24:02, всего редактировалось 1 раз.
Ответить

Вернуться в «AVR»