Как записать код лаконичнее
Как записать код лаконичнее
Доброго дня.
Пишу программу для AVR ATMEGA8.
Нужно сравнить два массива 40 байтных.
r1[40] и r2[40].
Если по простому ,на прямую, вопросов нет.
if((r1[0]==r2[0])&&(r1[1]==r2[1])---------------&&(r1[39]==r2[39]))
x=24;
Может кто подскажет ,как это записать лаконичнее?
Пишу программу для AVR ATMEGA8.
Нужно сравнить два массива 40 байтных.
r1[40] и r2[40].
Если по простому ,на прямую, вопросов нет.
if((r1[0]==r2[0])&&(r1[1]==r2[1])---------------&&(r1[39]==r2[39]))
x=24;
Может кто подскажет ,как это записать лаконичнее?
- Реклама
Re: Как записать код лаконичнее
Должно быть, о циклах вы ещё не слышали?
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Как записать код лаконичнее
не помню (слишком уж частный случай...) если их сделать однотипными, то знаю что можно один в другой скопировать... а вот про сравнить... забыл...
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Как записать код лаконичнее
int memcmp(const void *buffer1, const void *buffer2, size_t count);
if(memcmp(r1,r2,40)==0) {}
if(memcmp(r1,r2,40)==0) {}
Re: Как записать код лаконичнее
OKF
Вы ,полагаю слышали о циклах.Так давайте же и ваш вариант.
Вы ,полагаю слышали о циклах.Так давайте же и ваш вариант.
- Реклама
Re: Как записать код лаконичнее
Мой то зачем! У вас ведь проблема! Или нет?
Re: Как записать код лаконичнее
Операция "сравнения" съедает очень много времени. Поэтому, проверку на "=" двух массивов стоит делать иначе - вначале вычислить не_совпадение и тольк один раз проверить его с 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) ...
Зачем нужно склеивать несколько вычислений внутри цикла - это для тех, кто понимает, что такое снижение потерь в программе. ))
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: Как записать код лаконичнее
u37, аврка же восьмибитная! Операции с uint32_t на ней выльются в излишнюю трату ресурсов. Нужно "в лоб" сравнивать. И проще всего - использовать memcpm, но надо смотреть, как она реализована конкретно под авр. Возможно, проще свой вариант memcpm написать, т.к. ТС не хочет знать, что больше/меньше, а просто хочет знать, что массивы различаются.
Типа
Вот на 32-битной архитектуре выгодней сравнивать кусками по 4 байта, приводя к uint32_t, а уж хвостик - побайтно. Возможно, memcmp именно так и делает.
Типа
Код: Выделить всё
int cmp(uint8_t *a, uint8_t *b, int l){
for(; l; --l) if(*a++ != *b++) return 0; // !=
return 1; // ==
}- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Как записать код лаконичнее
Я видел лишь одно требование ТС - лаконичнее. Не оптимальнее, быстрее, компактнее... А лаконичнее!
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: Как записать код лаконичнее
Ну, тогда, естественно, memcmp - вне конкуренции ☺
Re: Как записать код лаконичнее
Eddy_Em, "int", а не "int32_t".
По определению, это длина регистра процессора. Для Cortex 'int' будет 4 байта, для других аппаратных решений - это может быть другое кол-во байт.
По определению, это длина регистра процессора. Для Cortex 'int' будет 4 байта, для других аппаратных решений - это может быть другое кол-во байт.
Re: Как записать код лаконичнее
[uquote="u37",url="/forum/viewtopic.php?p=4307802#p4307802"]По определению, это длина регистра процессора.[/uquote] Это вы какой стандарт какого языка имеете ввиду? Потому что в C/C++ гарантируется, что int, как минимум, 16-битный.
Re: Как записать код лаконичнее
И сама постановка вопроса непонятна - сравнить: только одинаковы ли оба массива или найти несовпадения или какой массив больше/меньше по первому встретившемуся несовпадающему значению.
Ну и мне как ретрограду видится решение на асме - как 2 байта переслать - компактно, лаконично, быстро.
Используемая среда, надеюсь, позволяет асмовские вставки?
Ну и мне как ретрограду видится решение на асме - как 2 байта переслать - компактно, лаконично, быстро.
Используемая среда, надеюсь, позволяет асмовские вставки?
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Как записать код лаконичнее
[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: Как записать код лаконичнее
[uquote="ickatel",url="/forum/viewtopic.php?p=4307697#p4307697"]Нужно сравнить два массива 40 байтных.
r1[40] и r2[40].
Если по простому ,на прямую, вопросов нет.[/uquote]
Ну, в АВ (Algorithm Builder) я бы показал как, а вот на Си не знаю… но словами расскажу… сравниваете попеременно каждый байт из обоих массивов и если сравниваемые байты равны, то увеличиваете рабочий регистр (или переменную) на единицу… и так сравниваете все 40 байт… после завершения сравнения проверяете счётный регистр (или переменную), если она имеет значение 40, то массивы равны, иначе не равны.
r1[40] и r2[40].
Если по простому ,на прямую, вопросов нет.[/uquote]
Ну, в АВ (Algorithm Builder) я бы показал как, а вот на Си не знаю… но словами расскажу… сравниваете попеременно каждый байт из обоих массивов и если сравниваемые байты равны, то увеличиваете рабочий регистр (или переменную) на единицу… и так сравниваете все 40 байт… после завершения сравнения проверяете счётный регистр (или переменную), если она имеет значение 40, то массивы равны, иначе не равны.
-
veso74
- Поставщик валерьянки для Кота
- Сообщения: 1909
- Зарегистрирован: Сб май 05, 2012 20:24:52
- Откуда: KN34PC, Болгария
- Контактная информация:
Re: Как записать код лаконичнее
Код: Выделить всё
… и так сравниваете все 40 байт …В качестве исключения: может потребоваться напр. количество и индекс различных данных массива.
- главный колбасист
- Это не хвост, это антенна
- Сообщения: 1333
- Зарегистрирован: Чт авг 21, 2014 11:11:48
- Откуда: краснодарский край
- Контактная информация:
Re: Как записать код лаконичнее
А как ?Ну, в АВ (Algorithm Builder) я бы показал как,
Re: Как записать код лаконичнее
[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: Как записать код лаконичнее
нашел...
вот так работать будет?вот это я имел в виду... проверить не могу - на телефоне нет нужной программы
вот так работать будет?
Код: Выделить всё
typedef char ARR[40];
ARR A, B;
.........
if (A==B) x=24;Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Как записать код лаконичнее
Ivanoff-iv, сами догадаетесь почему нет?




