Например TDA7294

Форум РадиоКот • Просмотр темы - Как записать код лаконичнее
Форум РадиоКот
Здесь можно немножко помяукать :)

Текущее время: Пн дек 15, 2025 08:01:03

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 71 ]  1, , ,  
Автор Сообщение
Не в сети
 Заголовок сообщения: Как записать код лаконичнее
СообщениеДобавлено: Пт окт 21, 2022 12:34:38 
Открыл глаза

Зарегистрирован: Вт июн 11, 2019 17:08:25
Сообщений: 43
Рейтинг сообщения: 0
Доброго дня.
Пишу программу для 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 
Это не хвост, это антенна

Карма: 12
Рейтинг сообщений: 136
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 1306
Рейтинг сообщения: 0
Должно быть, о циклах вы ещё не слышали?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Пт окт 21, 2022 12:45:59 
Друг Кота
Аватар пользователя

Карма: 52
Рейтинг сообщений: 2114
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 7057
Откуда: Сердце Пармы
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (2)
не помню (слишком уж частный случай...) если их сделать однотипными, то знаю что можно один в другой скопировать... а вот про сравнить... забыл...

_________________
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Пт окт 21, 2022 12:58:10 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2556
Рейтинг сообщения: 4
int memcmp(const void *buffer1, const void *buffer2, size_t count);


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


Вернуться наверх
 
Эиком - электронные компоненты и радиодетали
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Пт окт 21, 2022 13:59:39 
Открыл глаза

Зарегистрирован: Вт июн 11, 2019 17:08:25
Сообщений: 43
Рейтинг сообщения: 0
OKF
Вы ,полагаю слышали о циклах.Так давайте же и ваш вариант.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Пт окт 21, 2022 14:02:35 
Это не хвост, это антенна

Карма: 12
Рейтинг сообщений: 136
Зарегистрирован: Вт июн 07, 2011 08:03:18
Сообщений: 1306
Рейтинг сообщения: 0
Мой то зачем! У вас ведь проблема! Или нет?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Пт окт 21, 2022 14:08:55 
Электрический кот

Карма: 5
Рейтинг сообщений: 160
Зарегистрирован: Пн май 01, 2017 20:01:45
Сообщений: 1022
Рейтинг сообщения: 0
Операция "сравнения" съедает очень много времени. Поэтому, проверку на "=" двух массивов стоит делать иначе - вначале вычислить не_совпадение и тольк один раз проверить его с 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 
Собутыльник Кота
Аватар пользователя

Карма: -12
Рейтинг сообщений: -24
Зарегистрирован: Пт июл 12, 2019 22:52:01
Сообщений: 2516
Рейтинг сообщения: 0
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. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Пт окт 21, 2022 15:02:52 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2556
Рейтинг сообщения: 0
Я видел лишь одно требование ТС - лаконичнее. Не оптимальнее, быстрее, компактнее... А лаконичнее!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Пт окт 21, 2022 15:14:58 
Собутыльник Кота
Аватар пользователя

Карма: -12
Рейтинг сообщений: -24
Зарегистрирован: Пт июл 12, 2019 22:52:01
Сообщений: 2516
Рейтинг сообщения: 0
Ну, тогда, естественно, memcmp - вне конкуренции ☺

_________________
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Пт окт 21, 2022 16:25:22 
Электрический кот

Карма: 5
Рейтинг сообщений: 160
Зарегистрирован: Пн май 01, 2017 20:01:45
Сообщений: 1022
Рейтинг сообщения: 0
Eddy_Em, "int", а не "int32_t".
По определению, это длина регистра процессора. Для Cortex 'int' будет 4 байта, для других аппаратных решений - это может быть другое кол-во байт.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Пт окт 21, 2022 16:40:29 
Встал на лапы
Аватар пользователя

Зарегистрирован: Пн апр 02, 2012 15:56:23
Сообщений: 144
Рейтинг сообщения: 0
По определению, это длина регистра процессора.
Это вы какой стандарт какого языка имеете ввиду? Потому что в C/C++ гарантируется, что int, как минимум, 16-битный.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Пт окт 21, 2022 16:47:50 
Друг Кота
Аватар пользователя

Карма: 62
Рейтинг сообщений: 889
Зарегистрирован: Вт апр 24, 2007 07:45:40
Сообщений: 6194
Откуда: Minsk
Рейтинг сообщения: 0
И сама постановка вопроса непонятна - сравнить: только одинаковы ли оба массива или найти несовпадения или какой массив больше/меньше по первому встретившемуся несовпадающему значению.
Ну и мне как ретрограду видится решение на асме - как 2 байта переслать - компактно, лаконично, быстро. :o
Используемая среда, надеюсь, позволяет асмовские вставки?

_________________
Изображение


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Пт окт 21, 2022 16:52:08 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2556
Рейтинг сообщения: 0
И сама постановка вопроса непонятна
Чего там может быть непонятного? Приведён же код. (r1[0]==r2[0])&&(r1[1]==r2[1])...(r1[39]==r2[39])


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Пт окт 21, 2022 17:17:14 
Говорящий с текстолитом
Аватар пользователя

Карма: 18
Рейтинг сообщений: 236
Зарегистрирован: Пт дек 10, 2021 12:48:46
Сообщений: 1548
Откуда: Тюмень
Рейтинг сообщения: 0
Нужно сравнить два массива 40 байтных.
r1[40] и r2[40].
Если по простому ,на прямую, вопросов нет.

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Пт окт 21, 2022 17:52:47 
Мудрый кот

Карма: 25
Рейтинг сообщений: 487
Зарегистрирован: Сб май 05, 2012 20:24:52
Сообщений: 1793
Откуда: KN34PC, Болгария
Рейтинг сообщения: 0
Код:
… и так сравниваете все 40 байт …

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Пт окт 21, 2022 18:25:47 
Сверлит текстолит когтями
Аватар пользователя

Карма: 1
Рейтинг сообщений: 23
Зарегистрирован: Чт авг 21, 2014 11:11:48
Сообщений: 1264
Откуда: краснодарский край
Рейтинг сообщения: 0
Цитата:
Ну, в АВ (Algorithm Builder) я бы показал как,

А как ?


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Пт окт 21, 2022 18:49:07 
Опытный кот
Аватар пользователя

Карма: 2
Рейтинг сообщений: 164
Зарегистрирован: Ср авг 03, 2022 05:22:56
Сообщений: 848
Рейтинг сообщения: 0
if((r1[0]==r2[0])&&(r1[1]==r2[1])----------&&(r1[39]==r2[39]))

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Пт окт 21, 2022 18:58:13 
Друг Кота
Аватар пользователя

Карма: 52
Рейтинг сообщений: 2114
Зарегистрирован: Пт ноя 11, 2016 05:48:09
Сообщений: 7057
Откуда: Сердце Пармы
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (2)
нашел...
вот так работать будет?
Код:
typedef char ARR[40];
ARR A, B;
.........
if (A==B) x=24;
вот это я имел в виду... проверить не могу - на телефоне нет нужной программы

_________________
Для тех, кто не учил магию мир полон физики :)
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Как записать код лаконичнее
СообщениеДобавлено: Пт окт 21, 2022 19:13:09 
Собутыльник Кота
Аватар пользователя

Карма: 18
Рейтинг сообщений: 433
Зарегистрирован: Вт май 01, 2018 19:44:47
Сообщений: 2556
Рейтинг сообщения: 0
Ivanoff-iv, сами догадаетесь почему нет?
СпойлерИзображение
Вложение:
изображение_2022-10-21_191233544.png [41.07 KiB]
Скачиваний: 122


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 71 ]  1, , ,  

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y