Страница 15 из 17

Новый редактор для создания пользовательских блоков.

Добавлено: 14.02.2023{, 07:35}
ecoins
aidar_i писал(а):
14.02.2023{, 06:54}
Сообщение aidar_i » 35 минут назад
Если в loop код выполняется только один раз, это равносильно setup. Для этого применяется переменная bool, так называемый "флаг".
Небольшая ремарка. Лучше использовать переменную byte вместо bool.
Памяти занимает столько же. И для большинства контроллеров проверка условия по байту работает побыстрее.

Новый редактор для создания пользовательских блоков.

Добавлено: 14.02.2023{, 09:06}
Dryundel
ecoins писал(а):
14.02.2023{, 07:35}
Лучше использовать переменную byte вместо bool.
Памяти занимает столько же.
Не факт. В одном байте можно хранить 8 флагов.
ecoins писал(а):
14.02.2023{, 07:35}
для большинства контроллеров проверка условия по байту работает побыстрее.
Спорить не буду. Не проверял. Но очень сомнительное заключение.

JonyBest, а что, функция device.setName("Name") принимает только constchar? Или ей аросто (String("Вход")) не нравиться?
Можно попробовать задекларировать переменную прямо в Setup. Потом присвоить ей значение со входа, а потом вставить эту переменную в функцию.
Ну как вариант.

Новый редактор для создания пользовательских блоков.

Добавлено: 14.02.2023{, 09:35}
JonyBest
Dryundel писал(а):
14.02.2023{, 09:06}
а что, функция device.setName("Name") принимает только constchar? Или ей аросто (String("Вход")) не нравиться?
Можно попробовать задекларировать темпаральную переменную прямо в Setup. Потом присвоить ей значение со входа, а потом вставить эту переменную в функцию.
Ну как вариант.
Параметр voidsetName(constchar*name)
Пробовал темпаральную переменную по вышеозвученной схеме. Компилируется без ошибок, но в итоге значение получается пустое...

Новый редактор для создания пользовательских блоков.

Добавлено: 14.02.2023{, 09:40}
Dryundel
ecoins писал(а):
14.02.2023{, 05:50}
Действительно, блоки FLProg в режиме setup() не принимают входных данных.
Это обсуждалось как-то с разработчиком.
Интересная информация. Не задумывался над этим. Надо проверить.

JonyBest, тогда идём по пути указанному aidar_i.

Отправлено спустя 3 минуты 57 секунд:
JonyBest писал(а):
14.02.2023{, 09:35}
Параметр voidsetName(constchar*name)
Пробовал темпаральную переменную по вышеозвученной схеме. Компилируется без ошибок, но в итоге значение получается пустое...
Интересная задачка. Надо потестить. Доберусь до компа....

Новый редактор для создания пользовательских блоков.

Добавлено: 14.02.2023{, 09:47}
Phazz
Можно создать функцию и вызвать ее из сетап.

Новый редактор для создания пользовательских блоков.

Добавлено: 14.02.2023{, 10:42}
aidar_i
ecoins писал(а):
14.02.2023{, 07:35}
Небольшая ремарка. Лучше использовать переменную byte вместо bool.
Памяти занимает столько же. И для большинства контроллеров проверка условия по байту работает побыстрее.
Может быть, тоже не проверял и не попадалась такая информация, в нашем случае быстрота не имеет значения, т.к. код выполняется в начале и один раз.:)

Новый редактор для создания пользовательских блоков.

Добавлено: 14.02.2023{, 14:03}
Dryundel
ecoins писал(а):
14.02.2023{, 05:50}
Действительно, блоки FLProg в режиме setup() не принимают входных данных.
Это как бы оказалось, мягко говоря, неправдой. :)
Может речь шла о секции Declare? Тогда еще поверю.
JonyBest писал(а):
13.02.2023{, 22:59}
Беда в том, что нужно значение типа constchar. А str.c_str() работает только в Loop.
Вот так все работает хоть в Setup, хоть в Loop !Показать

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

String tempString = <IN>;
const char *charString = tempString.c_str();
setName(charString);
Никогда не верь наслово. Всегда проверяй. :)
Тест_ВходString_ConvertConstChar_Setup.flp
(166.9 КБ) 30 скачиваний
Отправлено спустя 3 минуты 18 секунд:
aidar_i писал(а):
14.02.2023{, 10:42}
Может быть, тоже не проверял и не попадалась такая информация.
Как то маловероятным мне это кажется. При таких утверждениях, не плохо бы результаты тестов выкладывать или ссылку на первоисточник давать.

Новый редактор для создания пользовательских блоков.

Добавлено: 14.02.2023{, 14:20}
aidar_i
Dryundel писал(а):
14.02.2023{, 14:07}
Как то маловероятным мне это кажется. При таких утверждениях, не плохо бы результаты тестов выкладывать или ссылку на первоисточник давать.
От Setup никто же не требует скорости и никто не измеряет там.

Новый редактор для создания пользовательских блоков.

Добавлено: 14.02.2023{, 14:33}
Dryundel
aidar_i писал(а):
14.02.2023{, 14:20}
Тебе лишь бы поспорить :)
Я сказал какую то ерунду? Что пошло не так?
Если человек что то утверждает, то пусть это делает не голословно. А то это уже становится системой и нормой. Разве так правильно?
И ладно бы если он признавал свои ошибки. Так ведь нет, это выше его достоинства. А вот обиженным прикинуться, это можно.

Новый редактор для создания пользовательских блоков.

Добавлено: 14.02.2023{, 16:19}
ecoins
Дополнительная ремарка по использованию флагов bool:
1.Как-то в процессе оптимизации кода одной из достаточно большой библиотек заменили все флаги и короткие переменные в отдельные биты и поля переменной. Это нужно было прежде всего для контроллера Nano,у которого обычно доступно не более 1.5к оперативной памяти. Некоторого сокращения использованния оперативной памяти удалось достичь, но неожиданно ощутимо возрос загружаемый код программы и снизилось быстродействие. Источник этого явления - конечный код для каждого использования набора битовых значений, в зависимости от типа контроллера и компилятора код может быть побольше или поменьше. Но всегда больше, чем проверка по условию байтовой переменной. Тем кто сталкивался с машинными кодами и программированию на ассемблере написанное должно быть знакомо. Получше вроде должно быть в контроллере STM32 где работа с битами вроде реализовано аппаратно. Но все равно и это буде зависеть от версиии и возможностей компилятора. Компилятор C++ конечно мощный инструмент, но для программирования микроконтроллеров полезно знать и учитывать особенности его работы, влияющих на конечный код программы.
2.Исследования по быстродействию проводились с использованием логического анализатора.
3.ecoins в своих библиотеках там где флаги используются гарантированно чаще (например при каждом входе) использует только флаги типа uint8-t - это один из источников быстродействия быстродействия наших библиотек.
4.По использованию условий вызова плат в FLProg. Переменную в тэгах создавать все равно надо - bool и uint8_t будут занимать одно и тоже место. Непосредственное побитовое значение переменных в условиях вызова задач(плат) не предусмотренно.
———
Спасибо.

Новый редактор для создания пользовательских блоков.

Добавлено: 14.02.2023{, 18:01}
artemka19
Dryundel писал(а):
14.02.2023{, 14:07}
Это как бы оказалось, мягко говоря, неправдой
теперь попробуйте получить значение со входа в ОБЩЕМ КОДЕ)

*значения со входов можно получить только для секции КОД КАЖДОГО ЭКЗЕМПЛЯРА

Новый редактор для создания пользовательских блоков.

Добавлено: 14.02.2023{, 18:21}
Dryundel
artemka19 писал(а):
14.02.2023{, 18:01}
теперь попробуй получить значение со входа в ОБЩЕМ КОДЕ)
Это что? На слабо что ли? :smile171:
artemka19, а вот если подумать, Вы в проекте что используете? Не экземпляр ли блока?
У каждого экземпляра свой вход. И входное значение разное на них подается.
Именно поэтому парамерт может распространяться на все экземпляры, а входы только на конкретный.
Ну вот как менять общий параметр со входа каждого экземпляра? На всех экземплярах писать одно и то же значение?
К чему была эта ваша реплика? :)

Новый редактор для создания пользовательских блоков.

Добавлено: 14.02.2023{, 21:24}
JonyBest
Dryundel писал(а):
14.02.2023{, 17:48}
у Вас получилось сделать задуманное?
Стесняюсь влезать в Ваши разборки, зашибете и не заметите...
По существу. Не получается. Уже всё за день перепробовал что знал или подсмотрел на форумах.
Уже без входов, в IDE
так работет:

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

void setup() {
    const char *charString =  "Test1";
    device.setName(charString);
и так
void setup() {
    device.setName( "Test1");
    
Так нет

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

void setup() {
String tempString = "Test1";
    const char *charString = tempString.c_str();
    device.setName(charString);
    
И через функции и в лоопе. Результат один. Компилируется без ошибок, но функция device.setName() значение не видит.

Новый редактор для создания пользовательских блоков.

Добавлено: 14.02.2023{, 21:42}
Dryundel
JonyBest, почему стринговой переменной присваиваешь const char?
В примере смотрел? Там разве так?
Там привязка ко входу, как ты и просил.

А если из параметра, то не надо никакой конвертации. Напрямую в функцию вставляешь.

И что за функция? Что она делает?
Выкладывай проект, посмотрим.

Отправлено спустя 26 минут 19 секунд:
Так для входа

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

void setup() {
    String tempString = <Вход>;
    const char *charString = tempString.c_str();
    device.setName(charString);
   } 
}
Или так для параметра

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

void setup() {
    device.setName(<Параметр> );
   } 

Новый редактор для создания пользовательских блоков.

Добавлено: 14.02.2023{, 22:15}
JonyBest
Dryundel писал(а):
14.02.2023{, 21:42}
Выкладывай проект, посмотрим.
Старый проект блоков для НА чуть доработал и решил добавить входы для удобства.
esp32_test34.rar
(1.72 МБ) 38 скачиваний
Вот описание функций. Вроде все просто, а не получается...
Dryundel писал(а):
14.02.2023{, 21:42}
очему стринговой переменной присваиваешь const char
Поправил, не правильно вставил на форум.

Новый редактор для создания пользовательских блоков.

Добавлено: 14.02.2023{, 22:26}
Dryundel
Завтра гляну.

Новый редактор для создания пользовательских блоков.

Добавлено: 14.02.2023{, 23:28}
kilemch5
artemka19 писал(а):
14.02.2023{, 18:01}
получить значение со входа в ОБЩЕМ КОДЕ
подтверждаю - в проф редакторе это невозможно

Новый редактор для создания пользовательских блоков.

Добавлено: 14.02.2023{, 23:30}
ivansidor012
Dryundel писал(а):
14.02.2023{, 14:33}
Если человек что то утверждает, то пусть это делает не голословно.
вы же сказали что можно получать значения со входа

и это голословно получается

Отправлено спустя 4 минуты 40 секунд:
aidar_i писал(а):
14.02.2023{, 06:54}
Я тоже в loop запускаю со входом.
Если в loop код выполняется только один раз, это равносильно setup. Для этого применяется переменная bool, так называемый "флаг".
Например:
В DeclareSection
bool flag = 1;
В LoopSection
if(flag) { flag = 0;
Код
}

Код будет выполняться при запуске программы один раз, и входы будут работать.
вот тут тоже сообщили об этой проблеме и предложили даже вариант решения

Отправлено спустя 1 минуту 4 секунды:
Dryundel писал(а):
14.02.2023{, 14:07}
Это как бы оказалось, мягко говоря, неправдой
но ведь это тоже спорное утверждение

Новый редактор для создания пользовательских блоков.

Добавлено: 14.02.2023{, 23:38}
kilemch5
Dryundel писал(а):
14.02.2023{, 14:07}
Может речь шла о секции Declare? Тогда еще поверю.
в этой секции также как и артемка сказал - из входа можно получить только если код не в общем

п.с. - это вы еще даже не проверили а уже утверждаете?

Новый редактор для создания пользовательских блоков.

Добавлено: 14.02.2023{, 23:39}
Dryundel
anton2 писал(а):
14.02.2023{, 23:25}
подтверждаю - в проф редакторе это невозможно
Читаем внимательно пост
viewtopic.php?p=121206#p121186
Там все описано почему.
Ещё раз
В проекте может быть несколько экземпляров одного блока.
Каким образом этот общий параметр можно ввести со входа, если у каждого экземпляра будет свой вход для этого?
На какой конкретно экземпляр ориентироваться программе для определения общего параметра для всех экземпляров?
Именно поэтому в общий код невозможно вообще вставить тег входа. Любого входа. Не только для параметра.