Доброго дня. Пишу программу для AVR ATMEGA8. Нужно сравнить два массива 40 байтных. r1[40] и r2[40]. Если по простому ,на прямую, вопросов нет. if((r1[0]==r2[0])&&(r1[1]==r2[1])----------&&(r1[39]==r2[39])) x=24; Может кто подскажет ,как это записать лаконичнее?
не помню (слишком уж частный случай...) если их сделать однотипными, то знаю что можно один в другой скопировать... а вот про сравнить... забыл...
_________________ Для тех, кто не учил магию мир полон физики Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Операция "сравнения" съедает очень много времени. Поэтому, проверку на "=" двух массивов стоит делать иначе - вначале вычислить не_совпадение и тольк один раз проверить его с 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) ...
Зачем нужно склеивать несколько вычислений внутри цикла - это для тех, кто понимает, что такое снижение потерь в программе. ))
u37, аврка же восьмибитная! Операции с uint32_t на ней выльются в излишнюю трату ресурсов. Нужно "в лоб" сравнивать. И проще всего - использовать memcpm, но надо смотреть, как она реализована конкретно под авр. Возможно, проще свой вариант memcpm написать, т.к. ТС не хочет знать, что больше/меньше, а просто хочет знать, что массивы различаются. Типа
Вот на 32-битной архитектуре выгодней сравнивать кусками по 4 байта, приводя к uint32_t, а уж хвостик - побайтно. Возможно, memcmp именно так и делает.
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Ну, тогда, естественно, memcmp - вне конкуренции ☺
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Eddy_Em, "int", а не "int32_t". По определению, это длина регистра процессора. Для Cortex 'int' будет 4 байта, для других аппаратных решений - это может быть другое кол-во байт.
И сама постановка вопроса непонятна - сравнить: только одинаковы ли оба массива или найти несовпадения или какой массив больше/меньше по первому встретившемуся несовпадающему значению. Ну и мне как ретрограду видится решение на асме - как 2 байта переслать - компактно, лаконично, быстро. Используемая среда, надеюсь, позволяет асмовские вставки?
Нужно сравнить два массива 40 байтных. r1[40] и r2[40]. Если по простому ,на прямую, вопросов нет.
Ну, в АВ (Algorithm Builder) я бы показал как, а вот на Си не знаю… но словами расскажу… сравниваете попеременно каждый байт из обоих массивов и если сравниваемые байты равны, то увеличиваете рабочий регистр (или переменную) на единицу… и так сравниваете все 40 байт… после завершения сравнения проверяете счётный регистр (или переменную), если она имеет значение 40, то массивы равны, иначе не равны.
Для скорости можно оставить сравнение при первом несоответствии, но это детали. В качестве исключения: может потребоваться напр. количество и индекс различных данных массива.
typedef char ARR[40]; ARR A, B; ......... if (A==B) x=24;
вот это я имел в виду... проверить не могу - на телефоне нет нужной программы
_________________ Для тех, кто не учил магию мир полон физики Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения