Кстати, еще один способ - в цикле от 0 до n проводить накопление абсолютной (без учета знака) разности элементов массивов: x += abs(A[n] - B[n]). В конце цикла проверить значение x. Если оно отличается от 0, значит массивы разные по значениям.
Если собираемся применять математику, существует столько методов, сколько хотим. Напр. CRC даже в датчики вложены. Но вычислительная мощность крошечных mcu идет на "безжалостное" использование. С любовью напр. возвращаюсь к использованию, напр. к люб. ATtiny13 - сколько функций и математики можно собрать, а объем памяти все равно не достигнет .
Самое убогое, что я видел - инициализация абдуринщиками ЖК-экранчика. Когда нужно толпу команд инициализации переслать, периодически небольшие паузы делать. И китаезы, как обычно, ничего, лучше тупого копипаста на несколько страниц текста, не придумали. Хотя достаточно завести структуру, инициализировать во флеше, а потом в цикле все это УГ пересылать, делая при необходимости нужные паузы…
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Кстати, еще один способ - в цикле от 0 до n проводить накопление абсолютной (без учета знака) разности элементов массивов: x += abs(A[n] - B[n]). В конце цикла проверить значение x. Если оно отличается от 0, значит массивы разные по значениям.
Во-первых, функция "abs" не бесплатная и имеет схожие затраты, как и у "if". Что, вообще, лишает смысла. Во-вторых, на двух абсолютно разных массивах вы можете получить "0". Ошибку сами найдете?
Во-вторых, на двух абсолютно разных массивах вы можете получить "0". Ошибку сами найдете?
Во-вторых, яж написал - разность по модулю, без учета знака то есть. Накопление этой разности. Если хотябы один элемент отличается в массивах, то разность уже не будет нулевой. а если второй элемент отличается в другую сторону, то разность по модулю не будет отрицательной и накопление разности не обнулится.
Последний раз редактировалось MLX90640 Сб окт 22, 2022 07:57:59, всего редактировалось 1 раз.
u37, Я там пояснил для вас, даже как для школьника, суть модуля разности - это просто расстояние между двумя точками без учета направления. Эта разность всегда положительна. Так что ищите ошибки в своей математике за 5 класс Вот что за манера на этом форуме - чуть чо, не разобравшись в вопросе, сразу обвинять в ошибках и упорно не желать разобраться в сути. Недавно этот, как его там, Demiurg, с пеной у рта доказывал, как надо функции писать, и тоже ссылался на возраст. А теперь вот и u37 доказывает свои незнания школьной математики за 5 класс
Ну и по аналогии с Demiurg-ом, давайте разберем, что вы, u37 тут понаписали:
Цитата:
Код:
int cmp=0; for (.... +4) { cmp |=(r1[i] ^ r2[i]) | (r1[i+1] ^ r2[i+1]) | (r1[i+2] ^ r2[i+2]) | (r1[i+3] ^ r2[i+3]); } if (cmp == 0) ...
Вас ист дас, что есть это? Поясните ход ваших мыслей. Зачем +4, почему i+3, что такое | и для чего оное? И зачем делите элементы массива по 4 штуки? А если массивы не кратные числу 4? А может сразу в одну линейку 40 штук записать? Или все-таки по одному? Если делаете логическим сравнением по xor, то незачем делить массив на группы по 4 штуки. Сей глубокий смысел излишен. Сделайте просто xor по одному элементу из каждого массива и не мудрите.
MLX90640 Вам бы "семикласснику", манерам общения стоило бы поучиться… или Вы с пелёнок кипятком писаете? Свои ранее плюсы убрал, так как видимо не на пользу пошли… бревна в своём глазу не замечаете? Вопрос риторический, если что… базар разводить не буду...
расстояние между двумя точками без учета направления. Эта разность всегда положительна.
Чисто математически - да. Но при реализации на МК... Досчитали до 256 - и плучили 0. Для разности мало одного байта? Берём минимум 2 ? Тогда: расширение первого байта-операнда до целого слова, потом второго, потом разность. Это отнюдь не 1 машинная команда в цикле. В общем, пока конкурента моей реализации не вижу. И чего это многие как чёрт ладана боятся асма, хотя бы на уровне вставки? "У меня памяти достаточно, на френ мне ваш асм. Но вот почему оно так медленно работает?!"
_________________
Последний раз редактировалось Jack_A Сб окт 22, 2022 18:07:40, всего редактировалось 1 раз.
Дык у меня оно - на уровне идеи (пост от 21.10) А так приблизительно выглядело бы:
Код:
LDI ZL,low(Array1) LDI ZH,highArray1) LDI YL,low(Array2) LDI YH,high(Array2) lab: ld R16,z+ ld R1,y+ sub R16.R1 brne out_cycle cpi ZH,high(Array1+40) brlo lab cpi ZL,low(Array1+40) brlo lab out_cycle: tst R16 ; вот сюда мы придём с 0 в R16 , если массивы совпали :))
Если бы массивы были в одном 256-байтовом сегменте, было бы ещё проще - не проверяли бы ZH, но компилевич нам это не гарантирует. Полностью согласен - асм пихать куда ни попадя - плохая идея, при этом - не моя Но если надо, то... И непонятна хотелка ТС насчёт "лаконичности" - в МК не лезет? быстродействия не хватает? или места на диске компа в директории MY_PROJECTS ? ---------- ПыСы Давно не писал на асме, там, кажется в LDI на 2 умножать надо
Ну, давайте посмотрим. Достаточно несложно ищется код memcmp из Microsoft CRT, который слегка избыточен под задачу ТС. Или напишем прямо в лоб сами. Ничем не хуже и гарантировано работает, да ещё на любом компиляторе и процессоре. А если оптимизацию -O3 поставить, то ещё и быстрее вашего варианта. Так что, победу вы себе рановато приписали.
Интересно бы посмотреть сгенерированный код с ентой самой оптимизацию -O3. Я не представляю, как можно короче - у меня ни одной лишней операции. Как я уже выразился, быстрее можно только если оба массива находятся в одной "странице" памяти (можно - каждый в своей), тогда не нужно проверять ZH на конец цикла. Я для МК на Си не писа'л никогда, поэтому не знаю - можно ли заставить компайлер размещать массив на границе блока. Или, может быть, Си - язык настолько высокого уровня, что генерирует секретные супербыстрые команды, недоступные ассемблеру ? А то получается - мой рекорд пытаются опорочить бездоказательным "может быть..." ---------- Насчёт ссылок. Первая - какое отношение имеет Мелкософт к Атмел и почему в нём должны быть коды AVR? Может, где-то в нём что-то и глубоко упрятано по этой теме, но ввиду позднего в ремени и оно_мне_надо? искать не стал. По второй ссылке. На мой взгляд, код достаточно мутный, использует туеву хучу регистров, объём больше моего и сомневаюсь насчёт быстроты. Можно бы протестировать - но а на фига? И вообще - нужно ли искать источники, в которых решают задачу уровня 2*2=4, если это не просто, а очень просто?
Насчёт ссылок. Первая - какое отношение имеет Мелкософт к Атмел и почему в нём должны быть коды AVR?
Дело в том, что код memcmp в стандартных библиотеках достаточно навороченный для оптимизации на разных процессорах. Он учитывает разрядность, выравнивание данных и "тип индейцев". Код от мелкомягких, как мне кажется, неплохо для восьмибиток подходит и в стандартной библиотеке avr gcc он не должен быть хуже.
По второй ссылке. На мой взгляд, код достаточно мутный, использует туеву хучу регистров, объём больше моего и сомневаюсь насчёт быстроты.
Во-первых, не путаем размер и скорость. Во-вторых, регистры на то и есть, чтобы их использовать. В-третьих, сравнивать стоит не фрагмент кода, а законченное решение. В-четвёртых, поставьте -O3, если нужна скорость.
Хватить споритьСпойлер Не знаю, правильно asm-вставку сделал, не правильно, не важно. Регистры r10 r11 надо как-то на выбор компилятора предоставить. А так 141мкс против 77мкс на тактовой частоте МК 1МГц, такты сами посчитаете.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения