Лайфхаки (Маленькие хитрости) А так можно было?!

CTAPuK
Рядовой
Сообщения: 70
Зарегистрирован: 06 дек 2020, 20:41
Имя: Михаил
Благодарил (а): 1 раз

Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение CTAPuK »

Phazz писал(а): 05 фев 2023, 10:10 Это все прекрасно, пока одна такая функция. Или не добавят другой блок с таким же лайфаком)
Как раз на это я и нарвался, когда задавал вопрос: Новый редактор для создания пользовательских блоков.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2475
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 10 раз
Поблагодарили: 57 раз

Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение Dryundel »

CTAPuK писал(а): 05 фев 2023, 10:41 Как раз на это я и нарвался, когда задавал вопрос:
Посмотреть бы.
Примерчик в студию, будьте добры.
CTAPuK
Рядовой
Сообщения: 70
Зарегистрирован: 06 дек 2020, 20:41
Имя: Михаил
Благодарил (а): 1 раз

Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение CTAPuK »

Dryundel писал(а): 05 фев 2023, 11:30 Посмотреть бы.
Примерчик в студию, будьте добры.
К сожалению привести пример уже не могу, так как переписал свой ПБ с учётом этого лайфхака, а старые версии ПБ уже удалил за ненадобностью.
Но смысл донес [ref=#808080]Phazz[/ref], когда в предыдущую функцию без "}", залетает последующая функция без "}". Таким образом последующая функция встраивается в тело предыдущей. Соответственно loop последующую функцию не видит и компилятор обижается.

Если необходимо, могу быстренько на коленке накидать эти ПБ, но с Вашим опытом работы в FLProg наверно этого не требуется.

Отправлено спустя 34 минуты 50 секунд:
P.S. Два ПБ с функциями: Func1 () и Func2 ()
[spoiler]
void setup()
{
}
void loop()
{
//Плата:1
Func1 ();
Func2 ();
}
bool _isTimer(unsigned long startTime, unsigned long period)
{
unsigned long currentTime;
currentTime = millis();
if (currentTime>= startTime)
{
return (currentTime>=(startTime + period));
}
else
{
return (currentTime >=(4294967295-startTime+period));
}
}
void Func1 ()
{
// Func1 ()
void Func2 ()
{
// Func2 ()
}
}


Компилятор:
'Func2' was not declared in this scope

[/spoiler]
Аватара пользователя
Dryundel
Полковник
Сообщения: 2475
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 10 раз
Поблагодарили: 57 раз

Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение Dryundel »

CTAPuK писал(а): 05 фев 2023, 12:17 Если необходимо, могу быстренько на коленке накидать эти ПБ
А где блоки то?
И в чем идея? Что во что Вы пытались встраивать? Для чего? Какие задачи стоят?
На сколько я помню Вы и пытались функцию в функцию запихать. Я Вам сказал, что так нельзя, а можно лишь вызывать одну из другой.
CTAPuK
Рядовой
Сообщения: 70
Зарегистрирован: 06 дек 2020, 20:41
Имя: Михаил
Благодарил (а): 1 раз

Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение CTAPuK »

Dryundel писал(а): 05 фев 2023, 14:13 И в чем идея? Что во что Вы пытались встраивать? Для чего? Какие задачи стоят?
Вся эта масса частных вопросов не имеет никакого отношения к обсуждаемой теме.
[ref=#808080]Phazz[/ref], написал, что фокус с открытой фигурной скобкой в ПБ работает в том случае, если в скетче используется только один такой ПБ. Если их используется два и больше, то фокус не прокатывает, так как получается матрёшка: функция в функции, в функции, в функции... И я согласен с этим утверждением. Это не идея и не задача. Это уточнение для тех, кто захочет воспользоваться этим лайфхаком. В частности я воспользовался ПБ от [ref]artemka19[/ref], при этом у меня в скетче уже был свой ПБ с открытой скобкой. В результате поимел головняк, пока разбирался с кодом на 30-ти страницах, почему IDE не видит явно описанную функцию.

Но если у Вас есть иной опыт использования несколько разных "ПБ с открытой скобкой", с удовольствием у Вас поучусь.
Dryundel писал(а): 05 фев 2023, 14:13 На сколько я помню Вы и пытались функцию в функцию запихать. Я Вам сказал, что так нельзя, а можно лишь вызывать одну из другой.
Вы не совсем верно помните. "Запихать" функцию в функцию нет никаких проблем. Я спрашивал о том, был ли у кого опыт вставки кода из "функции каждого экземпляра" в "функцию общего блока". Но я эту проблему решил, правда накладными расходами в виде избыточного кода, так как "ПБ без скобки" в скетче уже был от другого разработчика.

Ниже прикреплён пример с тремя такими блоками. Пример дан в качестве иллюстрации для подтверждения моих слов.

Допускаю, что у меня слишком мало опыта в написании ПБ. Приведите свой рабочий пример, где используется два и больше "ПБ без } в функции".
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2475
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 10 раз
Поблагодарили: 57 раз

Re: Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение Dryundel »

.
Разгружаем процессор.

Очень часто, в борьбе за сокращение переменных в проекте, нагружается процессор.
Простой пример. (Логика здесь не особо важна)
Имеем какое то значение, масштабируем его и по результату сравнений подаём сигнал на один из выходов.
Вроде бы элементарно.
.
1.jpg
.
В результате перед каждой подачей или неподачей сигнала запускается тяжёлая функция. Итого дважды за цикл.
.
2.jpg
.
Если же не поскупиться и ввести дополнительную переменную...
.
3.jpg
.
То тяжелая функция будет обсчитывать данные всего один раз.
.
4.jpg
.
В примере приведен блок масштабирования из-за наглядности в коде. Но бывают и более тяжелые блоки.
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
motoandrey14
Рядовой
Сообщения: 22
Зарегистрирован: 22 июл 2021, 10:46
Откуда: Минск
Имя: Андрей
Благодарил (а): 3 раза
Поблагодарили: 2 раза

Re: Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение motoandrey14 »

Либо "клемма".
У вас нет необходимых прав для просмотра вложений в этом сообщении.
Аватара пользователя
Dryundel
Полковник
Сообщения: 2475
Зарегистрирован: 22 май 2017, 23:15
Откуда: Ярославль
Имя: Андрей
Благодарил (а): 10 раз
Поблагодарили: 57 раз

Re: Лайфхаки (Маленькие хитрости) А так можно было?!

Сообщение Dryundel »

motoandrey14 писал(а): 06 июл 2025, 19:18 Либо "клемма".
На первый взгляд может показаться что Вы правы. Но это только пока не знаешь все тонкости работы клеммы.

1. Клемма хороша в одном, И ТОЛЬКО В ОДНОМ случае. Тогда когда надо подключить связь из ОДНОЙ точки в исходной плате к ОДНОЙ точке целевой платы. В этом случае она не создаёт лишнюю переменную. Стоит только использовать хотя бы две целевые точки, то магия исчезает и декларируется "лишняя" переменная. Смысл в клемме теряется. (Посмотрите в секцию декларирования)

2. Мало того, если у Вас с десяток конечных точек, а Вы решили удалить саму клемму то - БАЦ! И все конечные связи тоже удалились. Ищи потом куда было подключено. С переменной таких казусов не случается.

3. У клеммы есть ограничения. Её нельзя подключить в одной и той же плате в отличии от старой доброй переменной.

4. И наконец, даже если Вы вместо клемы создадите лишнюю переменную для подключения к одной целевой точке, то компилятор на 100% порежет эту переменную и оптимизирует код уже без неё. Это проверено.

Вывод - смысла в клеммах нет абсолютно. Можно забыть про них и спать спокойно. :)

PS. Про клеммы и переменные я писал ранее здесь же viewtopic.php?p=116972#p116972
Ответить

Вернуться в «Обучающие примеры работы в FLProg»

Кто сейчас на конференции

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