Даешь атомарность в условных операциях

В данный форуме Вы можете создавать темы посвящённые расширению функционала программы или сайта. После рассмотрения Ваше предложение будет перенесено в соответствующее место
Ответить
SirYorik
Сержант
Сообщения: 124
Зарегистрирован: 04.10.2015{, 10:01}
Репутация: 0
Откуда: Томск

Даешь атомарность в условных операциях

#1

Сообщение SirYorik » 07.03.2016{, 14:57}

такая конструкция
1397247.jpg
приводит вот к такому коду


Код: Выделить всё

if ((_gtv2) == (777)) {
_gtv4 = 1;
}
if ((_gtv2) == (777)) {
_gtv5 = 3;
}
if ((_gtv2) == (777)) {
_gtv6 = 2;
}
а очень хотелось бы такой:



Код: Выделить всё

if ((_gtv2) == (777)) {
_gtv4 = 1;
_gtv5 = 3;
_gtv6 = 2;
}

Аватара пользователя
dekorator
Лейтенант
Сообщения: 427
Зарегистрирован: 06.09.2015{, 09:39}
Репутация: 7
Откуда: Баку

Даешь атомарность в условных операциях

#2

Сообщение dekorator » 08.03.2016{, 23:29}

В чем подвох? Компактность кода?

krom23
Лейтенант
Сообщения: 444
Зарегистрирован: 06.09.2015{, 15:18}
Репутация: 12
Откуда: Калуга
Имя: Андрей

Даешь атомарность в условных операциях

#3

Сообщение krom23 » 10.03.2016{, 00:08}

А не по балабэске как это будет выглядеть на С, главное чтоб контроллер делал то что от него хотим. Может я что-то недопонимаю, поясните?

Аватара пользователя
dekorator
Лейтенант
Сообщения: 427
Зарегистрирован: 06.09.2015{, 09:39}
Репутация: 7
Откуда: Баку

Даешь атомарность в условных операциях

#4

Сообщение dekorator » 10.03.2016{, 00:17}

Если от этого не страдает быстродействие и размер кода, то думаю без разницы. А если наоборот то надо исправлять.

krom23
Лейтенант
Сообщения: 444
Зарегистрирован: 06.09.2015{, 15:18}
Репутация: 12
Откуда: Калуга
Имя: Андрей

Даешь атомарность в условных операциях

#5

Сообщение krom23 » 10.03.2016{, 01:02}

dekorator писал(а):Если от этого не страдает быстродействие и размер кода, то думаю без разницы. А если наоборот то надо исправлять.
Я думаю что то, что мы видим в С проходя компилятор имеет совсем другой вид, главное что бы компилятор правильно интерпретировал эти бессмысленные закорючки, чёрточки и буковки Изображение .

Аватара пользователя
dekorator
Лейтенант
Сообщения: 427
Зарегистрирован: 06.09.2015{, 09:39}
Репутация: 7
Откуда: Баку

Даешь атомарность в условных операциях

#6

Сообщение dekorator » 10.03.2016{, 01:25}

krom23 писал(а):Я думаю что то, что мы видим в С проходя компилятор имеет совсем другой вид
Абсолютно с Вами согласен. Но этот как Вы выразились " другой вид " в итоге имеет конечный размер и занимает место которое не безгранично. Под выражением " правильно интерпретировал " Вы конечно имели виду искусственный интеллект встроенный в компилятор, который правит чёрточки и буковки и не обращает внимания на то как пишется код? Изображение
До чего дошел прогресс!!! Изображение

krom23
Лейтенант
Сообщения: 444
Зарегистрирован: 06.09.2015{, 15:18}
Репутация: 12
Откуда: Калуга
Имя: Андрей

Даешь атомарность в условных операциях

#7

Сообщение krom23 » 10.03.2016{, 01:44}

dekorator писал(а):Вы конечно имели виду искусственный интеллект встроенный в компилятор, который правит чёрточки и буковки и не обращает внимания на то как пишется код?
Ага Изображение !

Аватара пользователя
dekorator
Лейтенант
Сообщения: 427
Зарегистрирован: 06.09.2015{, 09:39}
Репутация: 7
Откуда: Баку

Даешь атомарность в условных операциях

#8

Сообщение dekorator » 10.03.2016{, 02:09}

Прошу, только не говорите никому. А то ведь как начнут писать.
Что будет..... Изображение

SirYorik
Сержант
Сообщения: 124
Зарегистрирован: 04.10.2015{, 10:01}
Репутация: 0
Откуда: Томск

Даешь атомарность в условных операциях

#9

Сообщение SirYorik » 10.03.2016{, 07:23}

krom23 писал(а):что мы видим в С проходя компилятор имеет совсем другой вид,
- а если будет не А Б и Ц а 8-10 изменяемых параметров ?
- а если хоть один из параметров фигурирует в "некое условие" с алгоритмом случится плохое
- само условие может быть очень длинным, на полкилометра за пределы экрана, и эта строка будет вычисляться каждый раз

простенький пример


СпойлерПоказать

Код: Выделить всё

if(( ((_gtv10) < (7)) && (( ((_gtv3) == (2)) || ((_gtv3) == (1)) )) && (_gtv18) && ((_gtv5) > (_gtv38)) && (((_gtv4)/(21)) == (0)) )) {_tim3O = 1; _tim3I = 1;} else { if(_tim3I) {_tim3I = 0; _tim3P = millis();} else { if (_tim3O) {if ( _isTimer(_tim3P, 10000)) _tim3O = 0;}}}
if (( ((_gtv10) < (7)) && (( ((_gtv3) == (2)) || ((_gtv3) == (1)) )) && (_gtv18) && ((_gtv5) > (_gtv38)) && (((_gtv4)/(21)) == (0)) )) {
_gtv3 = 0;
}
if (( ((_gtv10) < (7)) && (( ((_gtv3) == (2)) || ((_gtv3) == (1)) )) && (_gtv18) && ((_gtv5) > (_gtv38)) && (((_gtv4)/(21)) == (0)) )) {
_gtv19 = 0;
}
if (( ((_gtv10) < (7)) && (( ((_gtv3) == (2)) || ((_gtv3) == (1)) )) && (_gtv18) && ((_gtv5) > (_gtv38)) && (((_gtv4)/(21)) == (0)) )) {
_gtv7 = 0;
}
if (( ((_gtv10) < (7)) && (( ((_gtv3) == (2)) || ((_gtv3) == (1)) )) && (_gtv18) && ((_gtv5) > (_gtv38)) && (((_gtv4)/(21)) == (0)) )) {
_gtv8 = 0;
}
if (( ((_gtv10) < (7)) && (( ((_gtv3) == (2)) || ((_gtv3) == (1)) )) && (_gtv18) && ((_gtv5) > (_gtv38)) && (((_gtv4)/(21)) == (0)) )) {
_gtv4 = 0;
}
if (( ((_gtv10) < (7)) && (( ((_gtv3) == (2)) || ((_gtv3) == (1)) )) && (_gtv18) && ((_gtv5) > (_gtv38)) && (((_gtv4)/(21)) == (0)) )) {
_gtv24 = 1;
}
if (( ((_gtv10) < (7)) && (( ((_gtv3) == (2)) || ((_gtv3) == (1)) )) && (_gtv18) && ((_gtv5) > (_gtv38)) && (((_gtv4)/(21)) == (0)) )) {
_gtv18 = 0;
}
_gtv32 = _tim3O;
Последний раз редактировалось SirYorik 10.03.2016{, 08:37}, всего редактировалось 1 раз.

krom23
Лейтенант
Сообщения: 444
Зарегистрирован: 06.09.2015{, 15:18}
Репутация: 12
Откуда: Калуга
Имя: Андрей

Даешь атомарность в условных операциях

#10

Сообщение krom23 » 10.03.2016{, 22:15}

SirYorik писал(а):простенький пример
Вы раскрыли мне глаза! Поддерживаю предложение.

Аватара пользователя
dekorator
Лейтенант
Сообщения: 427
Зарегистрирован: 06.09.2015{, 09:39}
Репутация: 7
Откуда: Баку

Даешь атомарность в условных операциях

#11

Сообщение dekorator » 10.03.2016{, 23:45}

Урааа. Уверен, теперь всё будет хорошо!!

Аватара пользователя
support
Супермодератор
Сообщения: 1900
Зарегистрирован: 03.01.2018{, 11:45}
Репутация: 790
Откуда: Астрахань
Имя: Сергей
Контактная информация:

Даешь атомарность в условных операциях

#12

Сообщение support » 11.03.2016{, 00:43}

Вы хотите аттомарности, так сделайте её.
Возмём Ваш первый пример:
Изображение
смотрим код

Код: Выделить всё

if ((_gtv1) == (777)) {
_gtv2 = 1;
}
if ((_gtv1) == (777)) {
_gtv3 = 2;
}
if ((_gtv1) == (777)) {
_gtv4 = 3;
}
Немного модернизируем.
Изображение
Смотрим код.

Код: Выделить всё

_gtv5 = (_gtv1) == (777);
if (_gtv5) {
_gtv2 = 1;
}
if (_gtv5) {
_gtv3 = 2;
}
if (_gtv5) {
_gtv4 = 3;
}
 Вроде то что Вы хотели.
Для того что бы это реализовать автоматически, мне придётся создавать переменные для всех логических элементов и, блоков сравнения и математики. Мне кажется это не очень хорошо. Зачем тратить лишнюю память. Просто когда Вы делаете какие - то сложные расчеты, или много логики и потом используете их в нескольких местах - применяйте промежуточные переменные при завершении расчётов. А уже  потом используйте эти переменные  в нескольких местах. Мне кажется такой вариант экономичнее
Автор программы FLProg.

Аватара пользователя
dekorator
Лейтенант
Сообщения: 427
Зарегистрирован: 06.09.2015{, 09:39}
Репутация: 7
Откуда: Баку

Даешь атомарность в условных операциях

#13

Сообщение dekorator » 11.03.2016{, 01:11}

В итоге два лишних оператора - if . Почти получилось.

Аватара пользователя
support
Супермодератор
Сообщения: 1900
Зарегистрирован: 03.01.2018{, 11:45}
Репутация: 790
Откуда: Астрахань
Имя: Сергей
Контактная информация:

Даешь атомарность в условных операциях

#14

Сообщение support » 11.03.2016{, 01:13}

Идеала в реальной жизни не бывает Изображение
Автор программы FLProg.

Аватара пользователя
dekorator
Лейтенант
Сообщения: 427
Зарегистрирован: 06.09.2015{, 09:39}
Репутация: 7
Откуда: Баку

Даешь атомарность в условных операциях

#15

Сообщение dekorator » 11.03.2016{, 01:19}

Согласен на все 100!
Думаю лучше не трогать то что уже работает.

Naladchik
Капитан
Сообщения: 823
Зарегистрирован: 04.10.2015{, 19:10}
Репутация: 153
Откуда: Новосибирск
Имя: Павел

Даешь атомарность в условных операциях

#16

Сообщение Naladchik » 11.03.2016{, 09:32}

dekorator, лучшее - враг хорошего.
Если гнаться за оптимизацией на таком уровне, то лучше сразу на СИ уходить.
Последний раз редактировалось Naladchik 11.03.2016{, 09:33}, всего редактировалось 1 раз.
Win10-64. FLProg Portable.
Изображение

Аватара пользователя
dekorator
Лейтенант
Сообщения: 427
Зарегистрирован: 06.09.2015{, 09:39}
Репутация: 7
Откуда: Баку

Даешь атомарность в условных операциях

#17

Сообщение dekorator » 11.03.2016{, 11:26}

"Кац предлагает сдаться" :)

- Плох тот солдат, который не мечтает стать генералом!
Последний раз редактировалось dekorator 11.03.2016{, 11:36}, всего редактировалось 1 раз.

Naladchik
Капитан
Сообщения: 823
Зарегистрирован: 04.10.2015{, 19:10}
Репутация: 153
Откуда: Новосибирск
Имя: Павел

Даешь атомарность в условных операциях

#18

Сообщение Naladchik » 11.03.2016{, 19:53}

dekorator писал(а):"Кац предлагает сдаться" :)
"Не надо ремонтировать работающий механизм" - прапорщик автобата.
Последний раз редактировалось Naladchik 11.03.2016{, 19:53}, всего редактировалось 1 раз.
Win10-64. FLProg Portable.
Изображение

SirYorik
Сержант
Сообщения: 124
Зарегистрирован: 04.10.2015{, 10:01}
Репутация: 0
Откуда: Томск

Даешь атомарность в условных операциях

#19

Сообщение SirYorik » 13.03.2016{, 12:28}

>то что уже работает.
скорее НЕ работает. теперешний подход постоянный источник багов. это факт.

>Вы хотите аттомарности, так сделайте её. ......  применяйте промежуточные переменные
этот workaround мне известен.
но это костыль.
усложняющий схему.
и багоисточник.
и как раз он расходует память.
и строго говоря атомарностью не считается.(потому что контроль за уникальностью переменной Запись отдан на откуп программисту.(лично я могу представить фантастический пример модификации переменной выходом блока работающего на внешних прерываниях))
тут можеть всплыть надежда на оптимизирующий компилятор Си, зря, имхо.


>много логики и потом используете их в нескольких местах - применяйте промежуточные переменные
в Этом случае безусловно да.
но мой пример НЕ ЭТОТ случай.
заостряю здесь внимание.
постоянно используются локальные разовые сравнения влияющие более чем на 2 объекта.
это важно особенно в философии FLprog: в условиях наличия абстракции
"плата", loop(), отсутствии независимых от программиста
семафоров-мутексов, отсутствии ожидающих и итерирующих инструментов,
сейчас ключевой подход применяемый всеми - использование самодельных
флагов, машины состояний, режимов, и т.д. и т.п. синонимов.  в больших
программах количество этого "флагового" стаффа уже не удерживается
вниманием, значит надо закрывать этот вопрос на уровне компилятора.


>Для того что бы это реализовать автоматически, мне придётся
сильно переделать компилятор в Си.
не спорю. но дело того стоит. реально.
на фоне неясной мотивации сложно за это браться.

главная метафора: логический провод(булеан)  соединяющий один выход и много
входов нужно отображать в Си не переменной а блоком {}.

Добавлено (13.03.2016, 12:28)
---------------------------------------------
вот кстати, программа будет расти, и некоторые вещи, типа внешнего вида Сишного кода, стоит выпрямить на ранних этапах.
Последний раз редактировалось SirYorik 13.03.2016{, 12:22}, всего редактировалось 1 раз.

Ответить

Вернуться в «Новые»