Обсуждаем контроллеры компании 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;
Может кто подскажет ,как это записать лаконичнее?

Re: Как записать код лаконичнее

Пт окт 21, 2022 12:38:30

Должно быть, о циклах вы ещё не слышали?

Re: Как записать код лаконичнее

Пт окт 21, 2022 12:45:59

не помню (слишком уж частный случай...) если их сделать однотипными, то знаю что можно один в другой скопировать... а вот про сравнить... забыл...

Re: Как записать код лаконичнее

Пт окт 21, 2022 12:58:10

int memcmp(const void *buffer1, const void *buffer2, size_t count);


if(memcmp(r1,r2,40)==0) {}

Re: Как записать код лаконичнее

Пт окт 21, 2022 13:59:39

OKF
Вы ,полагаю слышали о циклах.Так давайте же и ваш вариант.

Re: Как записать код лаконичнее

Пт окт 21, 2022 14:02:35

Мой то зачем! У вас ведь проблема! Или нет?

Re: Как записать код лаконичнее

Пт окт 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) ...

Зачем нужно склеивать несколько вычислений внутри цикла - это для тех, кто понимает, что такое снижение потерь в программе. ))

Re: Как записать код лаконичнее

Пт окт 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 именно так и делает.

Re: Как записать код лаконичнее

Пт окт 21, 2022 15:02:52

Я видел лишь одно требование ТС - лаконичнее. Не оптимальнее, быстрее, компактнее... А лаконичнее!

Re: Как записать код лаконичнее

Пт окт 21, 2022 15:14:58

Ну, тогда, естественно, memcmp - вне конкуренции ☺

Re: Как записать код лаконичнее

Пт окт 21, 2022 16:25:22

Eddy_Em, "int", а не "int32_t".
По определению, это длина регистра процессора. Для Cortex 'int' будет 4 байта, для других аппаратных решений - это может быть другое кол-во байт.

Re: Как записать код лаконичнее

Пт окт 21, 2022 16:40:29

По определению, это длина регистра процессора.
Это вы какой стандарт какого языка имеете ввиду? Потому что в C/C++ гарантируется, что int, как минимум, 16-битный.

Re: Как записать код лаконичнее

Пт окт 21, 2022 16:47:50

И сама постановка вопроса непонятна - сравнить: только одинаковы ли оба массива или найти несовпадения или какой массив больше/меньше по первому встретившемуся несовпадающему значению.
Ну и мне как ретрограду видится решение на асме - как 2 байта переслать - компактно, лаконично, быстро. :o
Используемая среда, надеюсь, позволяет асмовские вставки?

Re: Как записать код лаконичнее

Пт окт 21, 2022 16:52:08

И сама постановка вопроса непонятна
Чего там может быть непонятного? Приведён же код. (r1[0]==r2[0])&&(r1[1]==r2[1])...(r1[39]==r2[39])

Re: Как записать код лаконичнее

Пт окт 21, 2022 17:17:14

Нужно сравнить два массива 40 байтных.
r1[40] и r2[40].
Если по простому ,на прямую, вопросов нет.

Ну, в АВ (Algorithm Builder) я бы показал как, а вот на Си не знаю… но словами расскажу… сравниваете попеременно каждый байт из обоих массивов и если сравниваемые байты равны, то увеличиваете рабочий регистр (или переменную) на единицу… и так сравниваете все 40 байт… после завершения сравнения проверяете счётный регистр (или переменную), если она имеет значение 40, то массивы равны, иначе не равны. :)

Re: Как записать код лаконичнее

Пт окт 21, 2022 17:52:47

Код:
… и так сравниваете все 40 байт …

Для скорости можно оставить сравнение при первом несоответствии, но это детали.
В качестве исключения: может потребоваться напр. количество и индекс различных данных массива.

Re: Как записать код лаконичнее

Пт окт 21, 2022 18:25:47

Ну, в АВ (Algorithm Builder) я бы показал как,

А как ?

Re: Как записать код лаконичнее

Пт окт 21, 2022 18:49:07

if((r1[0]==r2[0])&&(r1[1]==r2[1])----------&&(r1[39]==r2[39]))

Прикольно! Я тоже хачю так песать! :)))
Если не ошибаюсь, это называется "китайский код", хотя подойдет и определение "индусский код".

Re: Как записать код лаконичнее

Пт окт 21, 2022 18:58:13

нашел...
вот так работать будет?
Код:
typedef char ARR[40];
ARR A, B;
.........
if (A==B) x=24;
вот это я имел в виду... проверить не могу - на телефоне нет нужной программы

Re: Как записать код лаконичнее

Пт окт 21, 2022 19:13:09

Ivanoff-iv, сами догадаетесь почему нет?
Ответить