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

Обсуждаем контроллеры компании Atmel.
ickatel
Открыл глаза
Сообщения: 43
Зарегистрирован: Вт июн 11, 2019 17:08:25

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

Сообщение ickatel »

Доброго дня.
Пишу программу для AVR ATMEGA8.
Нужно сравнить два массива 40 байтных.
r1[40] и r2[40].
Если по простому ,на прямую, вопросов нет.
if((r1[0]==r2[0])&&(r1[1]==r2[1])---------------&&(r1[39]==r2[39]))
x=24;
Может кто подскажет ,как это записать лаконичнее?
Реклама
OKF
Это не хвост, это антенна
Сообщения: 1393
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

Должно быть, о циклах вы ещё не слышали?
Реклама
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

Сообщение Ivanoff-iv »

не помню (слишком уж частный случай...) если их сделать однотипными, то знаю что можно один в другой скопировать... а вот про сравнить... забыл...
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

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


if(memcmp(r1,r2,40)==0) {}
Реклама
Эиком - электронные компоненты и радиодетали
ickatel
Открыл глаза
Сообщения: 43
Зарегистрирован: Вт июн 11, 2019 17:08:25

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

Сообщение ickatel »

OKF
Вы ,полагаю слышали о циклах.Так давайте же и ваш вариант.
Реклама
OKF
Это не хвост, это антенна
Сообщения: 1393
Зарегистрирован: Вт июн 07, 2011 08:03:18

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

Сообщение OKF »

Мой то зачем! У вас ведь проблема! Или нет?
Реклама
u37
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Пн май 01, 2017 20:01:45

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

Сообщение u37 »

Операция "сравнения" съедает очень много времени. Поэтому, проверку на "=" двух массивов стоит делать иначе - вначале вычислить не_совпадение и тольк один раз проверить его с 0.
int cmp=0;
for (.... +4)
{ cmp |=(r1 ^ r2) | (r1[i+1] ^ r2[i+1]) | (r1[i+2] ^ r2[i+2]) | (r1[i+3] ^ r2[i+3]); }
if (cmp == 0) ...

Зачем нужно склеивать несколько вычислений внутри цикла - это для тех, кто понимает, что такое снижение потерь в программе. ))
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

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 именно так и делает.
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Я видел лишь одно требование ТС - лаконичнее. Не оптимальнее, быстрее, компактнее... А лаконичнее!
Аватара пользователя
Eddy_Em
Собутыльник Кота
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01
Контактная информация:

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

Сообщение Eddy_Em »

Ну, тогда, естественно, memcmp - вне конкуренции ☺
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
u37
Сверлит текстолит когтями
Сообщения: 1231
Зарегистрирован: Пн май 01, 2017 20:01:45

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

Сообщение u37 »

Eddy_Em, "int", а не "int32_t".
По определению, это длина регистра процессора. Для Cortex 'int' будет 4 байта, для других аппаратных решений - это может быть другое кол-во байт.
Аватара пользователя
azhel12
Встал на лапы
Сообщения: 145
Зарегистрирован: Пн апр 02, 2012 15:56:23

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

Сообщение azhel12 »

[uquote="u37",url="/forum/viewtopic.php?p=4307802#p4307802"]По определению, это длина регистра процессора.[/uquote] Это вы какой стандарт какого языка имеете ввиду? Потому что в C/C++ гарантируется, что int, как минимум, 16-битный.
Аватара пользователя
Jack_A
Друг Кота
Сообщения: 6312
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

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

Сообщение Jack_A »

И сама постановка вопроса непонятна - сравнить: только одинаковы ли оба массива или найти несовпадения или какой массив больше/меньше по первому встретившемуся несовпадающему значению.
Ну и мне как ретрограду видится решение на асме - как 2 байта переслать - компактно, лаконично, быстро. :o
Используемая среда, надеюсь, позволяет асмовские вставки?
Изображение
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

[uquote="Jack_A",url="/forum/viewtopic.php?p=4307819#p4307819"]И сама постановка вопроса непонятна[/uquote]Чего там может быть непонятного? Приведён же код. (r1[0]==r2[0])&&(r1[1]==r2[1])...(r1[39]==r2[39])
Аватара пользователя
VNS
Говорящий с текстолитом
Сообщения: 1627
Зарегистрирован: Пт дек 10, 2021 12:48:46
Откуда: Тюмень

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

Сообщение VNS »

[uquote="ickatel",url="/forum/viewtopic.php?p=4307697#p4307697"]Нужно сравнить два массива 40 байтных.
r1[40] и r2[40].
Если по простому ,на прямую, вопросов нет.[/uquote]
Ну, в АВ (Algorithm Builder) я бы показал как, а вот на Си не знаю… но словами расскажу… сравниваете попеременно каждый байт из обоих массивов и если сравниваемые байты равны, то увеличиваете рабочий регистр (или переменную) на единицу… и так сравниваете все 40 байт… после завершения сравнения проверяете счётный регистр (или переменную), если она имеет значение 40, то массивы равны, иначе не равны. :)
veso74
Поставщик валерьянки для Кота
Сообщения: 1909
Зарегистрирован: Сб май 05, 2012 20:24:52
Откуда: KN34PC, Болгария
Контактная информация:

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

Сообщение veso74 »

Код: Выделить всё

… и так сравниваете все 40 байт …
Для скорости можно оставить сравнение при первом несоответствии, но это детали.
В качестве исключения: может потребоваться напр. количество и индекс различных данных массива.
Аватара пользователя
главный колбасист
Это не хвост, это антенна
Сообщения: 1333
Зарегистрирован: Чт авг 21, 2014 11:11:48
Откуда: краснодарский край
Контактная информация:

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

Сообщение главный колбасист »

Ну, в АВ (Algorithm Builder) я бы показал как,
А как ?
Аватара пользователя
MLX90640
Опытный кот
Сообщения: 848
Зарегистрирован: Ср авг 03, 2022 05:22:56

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

Сообщение MLX90640 »

[uquote="ickatel",url="/forum/viewtopic.php?p=4307697#p4307697"]if((r1[0]==r2[0])&&(r1[1]==r2[1])----------&&(r1[39]==r2[39]))[/uquote]
Прикольно! Я тоже хачю так песать! :)))
Если не ошибаюсь, это называется "китайский код", хотя подойдет и определение "индусский код".
Аватара пользователя
Ivanoff-iv
Друг Кота
Сообщения: 7077
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Откуда: Сердце Пармы

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

Сообщение Ivanoff-iv »

нашел...
вот так работать будет?

Код: Выделить всё

typedef char ARR[40];
ARR A, B;
.........
if (A==B) x=24;
вот это я имел в виду... проверить не могу - на телефоне нет нужной программы
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Аватара пользователя
VladislavS
Собутыльник Кота
Сообщения: 2562
Зарегистрирован: Вт май 01, 2018 19:44:47

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

Сообщение VladislavS »

Ivanoff-iv, сами догадаетесь почему нет?
СпойлерИзображение
изображение_2022-10-21_191233544.png
(41.07 КБ) 134 скачивания
Ответить

Вернуться в «AVR»