Обсуждаем контроллеры компании Atmel.
Пт окт 21, 2022 12:34:38
Доброго дня.
Пишу программу для AVR ATMEGA8.
Нужно сравнить два массива 40 байтных.
r1[40] и r2[40].
Если по простому ,на прямую, вопросов нет.
if((r1[0]==r2[0])&&(r1[1]==r2[1])----------&&(r1[39]==r2[39]))
x=24;
Может кто подскажет ,как это записать лаконичнее?
Пт окт 21, 2022 12:38:30
Должно быть, о циклах вы ещё не слышали?
Пт окт 21, 2022 12:45:59
не помню (слишком уж частный случай...) если их сделать однотипными, то знаю что можно один в другой скопировать... а вот про сравнить... забыл...
Пт окт 21, 2022 12:58:10
int memcmp(const void *buffer1, const void *buffer2, size_t count);
if(memcmp(r1,r2,40)==0) {}
Пт окт 21, 2022 13:59:39
OKF
Вы ,полагаю слышали о циклах.Так давайте же и ваш вариант.
Пт окт 21, 2022 14:02:35
Мой то зачем! У вас ведь проблема! Или нет?
Пт окт 21, 2022 14:08:55
Операция "сравнения" съедает очень много времени. Поэтому, проверку на "=" двух массивов стоит делать иначе - вначале вычислить не_совпадение и тольк один раз проверить его с 0.
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) ...
Зачем нужно склеивать несколько вычислений внутри цикла - это для тех, кто понимает, что такое снижение потерь в программе. ))
Пт окт 21, 2022 14:21:21
u37, аврка же восьмибитная! Операции с uint32_t на ней выльются в излишнюю трату ресурсов. Нужно "в лоб" сравнивать. И проще всего - использовать memcpm, но надо смотреть, как она реализована конкретно под авр. Возможно, проще свой вариант memcpm написать, т.к. ТС не хочет знать, что больше/меньше, а просто хочет знать, что массивы различаются.
Типа
- Код:
int cmp(uint8_t *a, uint8_t *b, int l){
for(; l; --l) if(*a++ != *b++) return 0; // !=
return 1; // ==
}
Вот на 32-битной архитектуре выгодней сравнивать кусками по 4 байта, приводя к uint32_t, а уж хвостик - побайтно. Возможно, memcmp именно так и делает.
Пт окт 21, 2022 15:02:52
Я видел лишь одно требование ТС - лаконичнее. Не оптимальнее, быстрее, компактнее... А лаконичнее!
Пт окт 21, 2022 15:14:58
Ну, тогда, естественно, memcmp - вне конкуренции ☺
Пт окт 21, 2022 16:25:22
Eddy_Em, "int", а не "int32_t".
По определению, это длина регистра процессора. Для Cortex 'int' будет 4 байта, для других аппаратных решений - это может быть другое кол-во байт.
Пт окт 21, 2022 16:40:29
По определению, это длина регистра процессора.
Это вы какой стандарт какого языка имеете ввиду? Потому что в C/C++ гарантируется, что int, как минимум, 16-битный.
Пт окт 21, 2022 16:47:50
И сама постановка вопроса непонятна - сравнить: только одинаковы ли оба массива
или найти несовпадения
или какой массив больше/меньше по первому встретившемуся несовпадающему значению.
Ну и мне как ретрограду видится решение на асме -
как 2 байта переслать - компактно, лаконично, быстро.
Используемая среда, надеюсь, позволяет
асмовские вставки?
Пт окт 21, 2022 16:52:08
И сама постановка вопроса непонятна
Чего там может быть непонятного? Приведён же код. (r1[0]==r2[0])&&(r1[1]==r2[1])...(r1[39]==r2[39])
Пт окт 21, 2022 17:17:14
Нужно сравнить два массива 40 байтных.
r1[40] и r2[40].
Если по простому ,на прямую, вопросов нет.
Ну, в АВ (Algorithm Builder) я бы показал как, а вот на Си не знаю… но словами расскажу… сравниваете попеременно каждый байт из обоих массивов и если сравниваемые байты равны, то увеличиваете рабочий регистр (или переменную) на единицу… и так сравниваете все 40 байт… после завершения сравнения проверяете счётный регистр (или переменную), если она имеет значение 40, то массивы равны, иначе не равны.
Пт окт 21, 2022 17:52:47
- Код:
… и так сравниваете все 40 байт …
Для скорости можно оставить сравнение при первом несоответствии, но это детали.
В качестве исключения: может потребоваться напр. количество и индекс различных данных массива.
Пт окт 21, 2022 18:25:47
Ну, в АВ (Algorithm Builder) я бы показал как,
А как ?
Пт окт 21, 2022 18:49:07
if((r1[0]==r2[0])&&(r1[1]==r2[1])----------&&(r1[39]==r2[39]))
Прикольно! Я тоже хачю так песать!
Если не ошибаюсь, это называется "китайский код", хотя подойдет и определение "индусский код".
Пт окт 21, 2022 18:58:13
нашел...
вот так работать будет?
- Код:
typedef char ARR[40];
ARR A, B;
.........
if (A==B) x=24;
вот это я имел в виду... проверить не могу - на телефоне нет нужной программы
Пт окт 21, 2022 19:13:09
Ivanoff-iv, сами догадаетесь почему нет?
Powered by phpBB © phpBB Group.
phpBB Mobile / SEO by Artodia.