EnglishУкраїнськаmRussian
Login/New
Topic with no new replies

Можно ли "Выполнить 1 раз"?


Author Message
Written on: 09. 09. 2013 [08:03]
dell
Путин Краб
Topic creator
registered since: 09.04.2013
Posts: 28
Часто бывает нужно выполнить действие, исходя из условий, 1 раз, например послать сообщение устройству, записать в архив сообщение. Но обычная конструкция "if..." выполняется каждый раз при прогоне цикла. Поэтому приходится ставить разные флаги-заглушки, которые потом надо сбрасывать и еще инициализировать в начале. Нет ли какой-нибудь проще конструкции/инструкции для выполнения действия 1 раз?
Written on: 09. 09. 2013 [09:25]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"dell" wrote:

Часто бывает нужно выполнить действие, исходя из условий, 1 раз, например послать сообщение устройству, записать в архив сообщение. Но обычная конструкция "if..." выполняется каждый раз при прогоне цикла. Поэтому приходится ставить разные флаги-заглушки, которые потом надо сбрасывать и еще инициализировать в начале. Нет ли какой-нибудь проще конструкции/инструкции для выполнения действия 1 раз?

Не вижу никаких проблем с флагами:
JAVASCRIPT
if(f_start) isCall = false;
if([[myCond]] && !isCall) { [[myMotion]]; isCall = true; }

Как Вы себе это вообще проще представляете не наворачивая дополнительных и сомнительных сущностей ещё и не понятно где?

Learn, learn and learn better than work, work and work.
Written on: 09. 09. 2013 [09:58]
dell
Путин Краб
Topic creator
registered since: 09.04.2013
Posts: 28
Как проще - не представляю, ну мало ли, может оператор какой-нибудь есть. Получается, что каждый флаг надо: инициализировать, изменить состояние, сбросить. И если программа большая, то возникают затруднения. И еще возникли проблемы с конструкцией f_start, не могли бы подсказать, почему так?

JAVASCRIPT
if (f_start) {
	tm = 5;
} 
Text1_text = tm;

При выполнении программы получаю следующее: сначала надпись 5, потом (после выполнения 1 цикла) значение "<EVAL>". Почему? tm должно быть равно 5, до тех пор, пока его не изменят. Как тогда присвоить начальное значение?
Written on: 09. 09. 2013 [10:34]
roman
Roman Savochenko
Moderator
Contributor
Developer
registered since: 12.12.2007
Posts: 3750
"dell" wrote:

Как проще - не представляю, ну мало ли, может оператор какой-нибудь есть.

Зато предлагаю.
Оператор, который по сути развернётся в тот-же флаг и который непонятно где хранить, а работа с ним будет ещё сложнее.

"dell" wrote:

Получается, что каждый флаг надо: инициализировать, изменить состояние, сбросить. И если программа большая, то возникают затруднения.

А для того чтобы поесть нужно встать с кровати и что-то приготовить. :)
Называйте, форматируйте логично и это решит Ваши проблемы.

"dell" wrote:

И еще возникли проблемы с конструкцией f_start, не могли бы подсказать, почему так?
JAVASCRIPT
if (f_start) {
	tm = 5;
} 
Text1_text = tm;

При выполнении программы получаю следующее: сначала надпись 5, потом (после выполнения 1 цикла) значение "<EVAL>". Почему? tm должно быть равно 5, до тех пор, пока его не изменят. Как тогда присвоить начальное значение?

Потому что "tm" это автоматическая переменная, контекст которой обычно и не сохраняется, для простых функций так точно. В рабочей версии контекст автоматических переменных сохраняется, точнее не разрушается, в прямых вычислителях: LogicLev, JavaLikeCalc, BlockCalc, ModBus, Siemens, VCAEngine, ... . За счёт чего и увеличена производительность вычислений, кроме всего прочего.

На LTS-версии я создавал атрибут объектного типа, где все флажки и контекст подобного рода хранил, с доступом примерно так:
JAVASCRIPT
if(f_start) opts = new Object(); //Для сброса всех флагов иначе они могут сохраниться в БД
if([[myCond]] && opts.isCall.isEVal()) { [[myMotion]]; opts.isCall = true; }


Learn, learn and learn better than work, work and work.



1981