Кстати, еще один способ - в цикле от 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МГц, такты сами посчитаете.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения