Например TDA7294

Форум РадиоКот :: Просмотр темы - Как записать код лаконичнее
Форум РадиоКот
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 байта переслать - компактно, лаконично, быстро. :o
Используемая среда, надеюсь, позволяет асмовские вставки?

Автор:  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, сами догадаетесь почему нет?
СпойлерИзображение
Вложение:
изображение_2022-10-21_191233544.png [41.07 KiB]
Скачиваний: 123

Страница 1 из 4 Часовой пояс: UTC + 3 часа
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
http://www.phpbb.com/