Как записать код лаконичнее
- Ivanoff-iv
- Друг Кота
- Сообщения: 7077
- Зарегистрирован: Пт ноя 11, 2016 05:48:09
- Откуда: Сердце Пармы
Re: Как записать код лаконичнее
Есть ещё вариант, если ответ нужно получить очень быстро... это хранить количество различающихся элементов в переменной...
пусть A и B изначально равные массивы;
чар D =0;
....
если нужно изменить элемент одного из массивов (или элементы с одинаковым номером сразу обоих массивов) то
if (А!=B) D--; //сравниваем их значение
A=x; // изменяем
if (А!=B) D++; //снова сравниваем их значение
так D будет всегда равна количеству различающихся ячеек и проверив D==0 находим равенство массивов...
метода специфичен... но тоже работоспособен.
пусть A и B изначально равные массивы;
чар D =0;
....
если нужно изменить элемент одного из массивов (или элементы с одинаковым номером сразу обоих массивов) то
if (А!=B) D--; //сравниваем их значение
A=x; // изменяем
if (А!=B) D++; //снова сравниваем их значение
так D будет всегда равна количеству различающихся ячеек и проверив D==0 находим равенство массивов...
метода специфичен... но тоже работоспособен.
Для тех, кто не учил магию мир полон физики 
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
- Реклама
Re: Как записать код лаконичнее
Вот до каких глубин умственной работы может довести а-ли-ментарнейший вопрос
А ТС уже давно ушёл за пиво'м.
Спойлер
"Мсье, вы не заметили - ваша дама уже ушла" © из старого анекдотаRe: Как записать код лаконичнее
всем спасибо
пока расписал в столбик , чтобы не ошибиться
if((r1[0]==r2[0])
&&(r1[1]==r2[1])
----
---
&&(r1[39]==r2[39]))
пока расписал в столбик , чтобы не ошибиться
if((r1[0]==r2[0])
&&(r1[1]==r2[1])
----
---
&&(r1[39]==r2[39]))
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: Как записать код лаконичнее
А ТС просто издевается, тролль недоделанный 
Re: Как записать код лаконичнее
Хахаха, круто! Прям плюсану даже за такой лаконичный и нестандартный подход! Ма-ла-дец афтар, уделал всех.
Жаль, что массив всего на 40, а не на 4000 элементов!
Жаль, что массив всего на 40, а не на 4000 элементов!
- Реклама
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: Как записать код лаконичнее
[uquote="MLX90640",url="/forum/viewtopic.php?p=4309650#p4309650"]Жаль, что массив всего на 40, а не на 4000 элементов![/uquote]
При помощи баша могу эту копипасту сгенерить и для массива в 4000 элементов
При помощи баша могу эту копипасту сгенерить и для массива в 4000 элементов
-
codenamehawk
- Вымогатель припоя
- Сообщения: 528
- Зарегистрирован: Вт фев 09, 2010 17:52:26
Re: Как записать код лаконичнее
Компилятор может не осилить.Eddy_Em писал(а):При помощи баша могу эту копипасту сгенерить и для массива в 4000 элементов
- Eddy_Em
- Собутыльник Кота
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
- Контактная информация:
Re: Как записать код лаконичнее
codenamehawk, не, только что проверил. gcc осиливает отлично.
- Вложения
-
- 1.c
- (148.14 КБ) 117 скачиваний
Re: Как записать код лаконичнее
Лаконизм записи у ТС достиг высот невиданных
Что до 4000 элементов, то осталось найти Мегу, в которую можно этот хекс впиндюрить. Мега8 точно не согласится.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Как записать код лаконичнее
[uquote="Dimon456",url="/forum/viewtopic.php?p=4308662#p4308662"]Хватить спорить[/uquote]Зная ваш "талант" тестировщика, решил перепроверить. Компилятор GCC 7.3.
Симуляция с тактовой 1 МГц. По листингу такты вроде сходятся.
Функция my_memcmp на разных оптимизациях

Стандартная функция memcmp на разных оптимизациях

У кого есть сомнения в результате - можете считать такты по листингу
Код: Выделить всё
#include <avr/io.h>
uint8_t arr1[8] = { 1,2,3,4,5,6,7,8 };
uint8_t arr2[8] = { 1,2,3,4,5,6,7,9 };
uint8_t my_memcmp(uint8_t* buf1, uint8_t* buf2, uint8_t count)
{
while (count--) if (*buf1++ != *buf2++) return 1;
return 0;
}
int main()
{
DDRD = (1 << PD0);
PORTD |= 1 << PD0;
if (my_memcmp(arr1, arr2, 8)) PORTD &= ~(1<< PD0);
for (;;);
}Функция my_memcmp на разных оптимизациях
Спойлер
Спойлер
Re: Как записать код лаконичнее
VladislavS, а с чем сравнить-то? Где сравнение с ассемблерной вставкой? У вас одна версия компилятора, у меня другая.
Опустились до 7.3, давайте еще ниже, может там еще быстрее будет.VladislavS писал(а):Компилятор GCC 7.3.
конечно, по считаем такты, AVR GCC 12.2.0.VladislavS писал(а):можете считать такты по листингу
Мне, там, самому поставить 7.3 или как?VladislavS писал(а):Компилятор GCC 7.3.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Как записать код лаконичнее
[uquote="Dimon456",url="/forum/viewtopic.php?p=4311904#p4311904"]Опустились до 7.3[/uquote]Что значит опустился? Я AVR вообще не занимаюсь. Не поднимался, знаете ли.
[uquote="Dimon456",url="/forum/viewtopic.php?p=4311904#p4311904"]давайте еще ниже, может там еще быстрее будет.[/uquote]Какой был компилятор под рукой, тем и собрал.
[uquote="Dimon456",url="/forum/viewtopic.php?p=4311904#p4311904"]Мне, там, самому поставить 7.3 или как?[/uquote]Нет, я за вас буду выбирать компилятор и ключи оптимизации. Мышка отвалится самому ткнуть?
[uquote="Dimon456",url="/forum/viewtopic.php?p=4311904#p4311904"]давайте еще ниже, может там еще быстрее будет.[/uquote]Какой был компилятор под рукой, тем и собрал.
[uquote="Dimon456",url="/forum/viewtopic.php?p=4311904#p4311904"]Мне, там, самому поставить 7.3 или как?[/uquote]Нет, я за вас буду выбирать компилятор и ключи оптимизации. Мышка отвалится самому ткнуть?
Re: Как записать код лаконичнее
Кажется в теме stm этот вопрос уже разбирали.VladislavS писал(а):Я AVR вообще не занимаюсь. Не поднимался, знаете ли.
Пока у вас не будет сравнение с ассемблерной вставкой, оставим этот бесполезный спор.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Как записать код лаконичнее
[uquote="Dimon456",url="/forum/viewtopic.php?p=4311904#p4311904"]VladislavS, а с чем сравнить-то? Где сравнение с ассемблерной вставкой? У вас одна версия компилятора, у меня другая.[/uquote]Вы версию компилятора и ключи оптимизации вообще не соизволили указать.
[uquote="Dimon456",url="/forum/viewtopic.php?p=4311904#p4311904"]Пока у вас не будет сравнение с ассемблерной вставкой, оставим этот бесполезный спор.[/uquote]
Ассемблерная вставка от компилятора зависит? Вы же её протестировали. Не доверяете своим тестам?
[uquote="Dimon456",url="/forum/viewtopic.php?p=4311904#p4311904"]Пока у вас не будет сравнение с ассемблерной вставкой, оставим этот бесполезный спор.[/uquote]
Ассемблерная вставка от компилятора зависит? Вы же её протестировали. Не доверяете своим тестам?
Re: Как записать код лаконичнее
Ладно, ваша взяла, версия 9.2.0
ассемблер 77мкс
ваша функция на -Os 141мкс, на -O3 51мкс, размер тестового кода на -Os 142 байта, на -O3 226 байт.
ассемблер 77мкс
ваша функция на -Os 141мкс, на -O3 51мкс, размер тестового кода на -Os 142 байта, на -O3 226 байт.
- VladislavS
- Собутыльник Кота
- Сообщения: 2562
- Зарегистрирован: Вт май 01, 2018 19:44:47
Re: Как записать код лаконичнее
[uquote="Dimon456",url="/forum/viewtopic.php?p=4311956#p4311956"]версия 9.2.0[/uquote]Из какого софта или самосборный?
Re: Как записать код лаконичнее
С их сайта скаченый, файл avr-gcc.exe датируется от 07.09.2019Сейчас-то уже новее есть.
Спойлер
Код: Выделить всё
C:\WinAVR\bin>avr-gcc -v
Using built-in specs.
Reading specs from c:/winavr/bin/../lib/gcc/avr/9.2.0/device-specs/spec
s-avr2
COLLECT_GCC=avr-gcc
COLLECT_LTO_WRAPPER=c:/winavr/bin/../libexec/gcc/avr/9.2.0/lto-wrapper.
exe
Target: avr
Configured with: ../configure --prefix=/omgwtfbbq/win64 --target=avr --enable-la
nguages=c,c++ --disable-nls --disable-libssp --disable-libada --with-dwarf2 --di
sable-shared --enable-static --enable-mingw-wildcard --host=x86_64-w64-mingw32 -
-build=x86_64-pc-linux-gnu
Thread model: single
gcc version 9.2.0 (GCC)
Re: Как записать код лаконичнее
[uquote="ickatel",url="/forum/viewtopic.php?p=4309558#p4309558"]всем спасибо
пока расписал в столбик , чтобы не ошибиться
if((r1[0]==r2[0])
&&(r1[1]==r2[1])
----
---
&&(r1[39]==r2[39]))[/uquote]
Ужос! Вам уже Eddy_Em всё написал в самом начале. Если вы боитесь memcmp.
пока расписал в столбик , чтобы не ошибиться
if((r1[0]==r2[0])
&&(r1[1]==r2[1])
----
---
&&(r1[39]==r2[39]))[/uquote]
Ужос! Вам уже Eddy_Em всё написал в самом начале. Если вы боитесь memcmp.
Re: Как записать код лаконичнее
[uquote="Dimon456",url="/forum/viewtopic.php?p=4311956#p4311956"]ассемблер 77мкс
ваша функция на -Os 141мкс, на -O3 51мкс[/uquote]
Вот это странно! Или действительно компилятор знает какие-то супербыстрые недокументированные команды (но мне VladislavS объяснил, что это не так)
, или же асмовская вставка сделана коряво. Применение асма не гарантирует оптимальность кода без включения бо'шки.
VladislavS
ваша функция на -Os 141мкс, на -O3 51мкс[/uquote]
Вот это странно! Или действительно компилятор знает какие-то супербыстрые недокументированные команды (но мне VladislavS объяснил, что это не так)
VladislavS
Я не понимаю, как ещё по разному применять команды, кроме как собрать из них фрагмент программы - или оптимальный (как, видимо, делает умный компилятор), или через ~опу (если не шибко думать).Команды то те же, а вот применять их можно по разному.
Re: Как записать код лаконичнее
Да нет, просто использует более выгодный по скорости порядок и состав инструкций. Никаких недокументированных возможностей конечно же не использует. Компилятор то, он же работает по заложенным в него шаблонам тех или иных действий.
Ну а топикстартер конечно же всех просто уделал, применив свой, наиболее "лаконичный" способ
Вот, "учитесь"!
Ну а топикстартер конечно же всех просто уделал, применив свой, наиболее "лаконичный" способ



