| Форум РадиоКот https://radiokot.ru/forum/ |
|
| Как записать код лаконичнее https://radiokot.ru/forum/viewtopic.php?f=57&t=185086 |
Страница 1 из 4 |
| Автор: | ickatel [ Пт окт 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; Может кто подскажет ,как это записать лаконичнее? |
|
| Автор: | OKF [ Пт окт 21, 2022 12:38:30 ] |
| Заголовок сообщения: | Re: Как записать код лаконичнее |
Должно быть, о циклах вы ещё не слышали? |
|
| Автор: | Ivanoff-iv [ Пт окт 21, 2022 12:45:59 ] |
| Заголовок сообщения: | Re: Как записать код лаконичнее |
не помню (слишком уж частный случай...) если их сделать однотипными, то знаю что можно один в другой скопировать... а вот про сравнить... забыл... |
|
| Автор: | VladislavS [ Пт окт 21, 2022 12:58:10 ] |
| Заголовок сообщения: | Re: Как записать код лаконичнее |
int memcmp(const void *buffer1, const void *buffer2, size_t count); if(memcmp(r1,r2,40)==0) {} |
|
| Автор: | ickatel [ Пт окт 21, 2022 13:59:39 ] |
| Заголовок сообщения: | Re: Как записать код лаконичнее |
OKF Вы ,полагаю слышали о циклах.Так давайте же и ваш вариант. |
|
| Автор: | OKF [ Пт окт 21, 2022 14:02:35 ] |
| Заголовок сообщения: | Re: Как записать код лаконичнее |
Мой то зачем! У вас ведь проблема! Или нет? |
|
| Автор: | u37 [ Пт окт 21, 2022 14:08:55 ] |
| Заголовок сообщения: | Re: Как записать код лаконичнее |
Операция "сравнения" съедает очень много времени. Поэтому, проверку на "=" двух массивов стоит делать иначе - вначале вычислить не_совпадение и тольк один раз проверить его с 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) ... Зачем нужно склеивать несколько вычислений внутри цикла - это для тех, кто понимает, что такое снижение потерь в программе. )) |
|
| Автор: | Eddy_Em [ Пт окт 21, 2022 14:21:21 ] |
| Заголовок сообщения: | Re: Как записать код лаконичнее |
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 именно так и делает. |
|
| Автор: | VladislavS [ Пт окт 21, 2022 15:02:52 ] |
| Заголовок сообщения: | Re: Как записать код лаконичнее |
Я видел лишь одно требование ТС - лаконичнее. Не оптимальнее, быстрее, компактнее... А лаконичнее! |
|
| Автор: | Eddy_Em [ Пт окт 21, 2022 15:14:58 ] |
| Заголовок сообщения: | Re: Как записать код лаконичнее |
Ну, тогда, естественно, memcmp - вне конкуренции ☺ |
|
| Автор: | u37 [ Пт окт 21, 2022 16:25:22 ] |
| Заголовок сообщения: | Re: Как записать код лаконичнее |
Eddy_Em, "int", а не "int32_t". По определению, это длина регистра процессора. Для Cortex 'int' будет 4 байта, для других аппаратных решений - это может быть другое кол-во байт. |
|
| Автор: | azhel12 [ Пт окт 21, 2022 16:40:29 ] |
| Заголовок сообщения: | Re: Как записать код лаконичнее |
По определению, это длина регистра процессора. Это вы какой стандарт какого языка имеете ввиду? Потому что в C/C++ гарантируется, что int, как минимум, 16-битный.
|
|
| Автор: | Jack_A [ Пт окт 21, 2022 16:47:50 ] |
| Заголовок сообщения: | Re: Как записать код лаконичнее |
И сама постановка вопроса непонятна - сравнить: только одинаковы ли оба массива или найти несовпадения или какой массив больше/меньше по первому встретившемуся несовпадающему значению. Ну и мне как ретрограду видится решение на асме - как 2 байта переслать - компактно, лаконично, быстро. Используемая среда, надеюсь, позволяет асмовские вставки? |
|
| Автор: | VladislavS [ Пт окт 21, 2022 16:52:08 ] |
| Заголовок сообщения: | Re: Как записать код лаконичнее |
И сама постановка вопроса непонятна Чего там может быть непонятного? Приведён же код. (r1[0]==r2[0])&&(r1[1]==r2[1])...(r1[39]==r2[39])
|
|
| Автор: | VNS [ Пт окт 21, 2022 17:17:14 ] |
| Заголовок сообщения: | Re: Как записать код лаконичнее |
Нужно сравнить два массива 40 байтных. r1[40] и r2[40]. Если по простому ,на прямую, вопросов нет. Ну, в АВ (Algorithm Builder) я бы показал как, а вот на Си не знаю… но словами расскажу… сравниваете попеременно каждый байт из обоих массивов и если сравниваемые байты равны, то увеличиваете рабочий регистр (или переменную) на единицу… и так сравниваете все 40 байт… после завершения сравнения проверяете счётный регистр (или переменную), если она имеет значение 40, то массивы равны, иначе не равны. |
|
| Автор: | veso74 [ Пт окт 21, 2022 17:52:47 ] |
| Заголовок сообщения: | Re: Как записать код лаконичнее |
Код: … и так сравниваете все 40 байт … Для скорости можно оставить сравнение при первом несоответствии, но это детали. В качестве исключения: может потребоваться напр. количество и индекс различных данных массива. |
|
| Автор: | главный колбасист [ Пт окт 21, 2022 18:25:47 ] |
| Заголовок сообщения: | Re: Как записать код лаконичнее |
Цитата: Ну, в АВ (Algorithm Builder) я бы показал как, А как ? |
|
| Автор: | MLX90640 [ Пт окт 21, 2022 18:49:07 ] |
| Заголовок сообщения: | Re: Как записать код лаконичнее |
if((r1[0]==r2[0])&&(r1[1]==r2[1])----------&&(r1[39]==r2[39])) Прикольно! Я тоже хачю так песать! Если не ошибаюсь, это называется "китайский код", хотя подойдет и определение "индусский код". |
|
| Автор: | Ivanoff-iv [ Пт окт 21, 2022 18:58:13 ] |
| Заголовок сообщения: | Re: Как записать код лаконичнее |
нашел... вот так работать будет? Код: typedef char ARR[40]; вот это я имел в виду... проверить не могу - на телефоне нет нужной программы
ARR A, B; ......... if (A==B) x=24; |
|
| Автор: | VladislavS [ Пт окт 21, 2022 19:13:09 ] |
| Заголовок сообщения: | Re: Как записать код лаконичнее |
Ivanoff-iv, сами догадаетесь почему нет? |
|
| Страница 1 из 4 | Часовой пояс: UTC + 3 часа |
| Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |
|


