Повідомлення створено: 09. 09. 2013 [08:03]
|
dell
Путин Краб
Автор теми
Зареєстрован(а) с: 09.04.2013
Повідомлення: 28
|
Часто бывает нужно выполнить действие, исходя из условий, 1 раз, например послать сообщение устройству, записать в архив сообщение. Но обычная конструкция "if..." выполняется каждый раз при прогоне цикла. Поэтому приходится ставить разные флаги-заглушки, которые потом надо сбрасывать и еще инициализировать в начале. Нет ли какой-нибудь проще конструкции/инструкции для выполнения действия 1 раз?
|
Повідомлення створено: 09. 09. 2013 [09:25]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
|
"dell" wrote:
Часто бывает нужно выполнить действие, исходя из условий, 1 раз, например послать сообщение устройству, записать в архив сообщение. Но обычная конструкция "if..." выполняется каждый раз при прогоне цикла. Поэтому приходится ставить разные флаги-заглушки, которые потом надо сбрасывать и еще инициализировать в начале. Нет ли какой-нибудь проще конструкции/инструкции для выполнения действия 1 раз?
Не вижу никаких проблем с флагами:
if(f_start) isCall = false;
if([[myCond]] && !isCall) { [[myMotion]]; isCall = true; }
Как Вы себе это вообще проще представляете не наворачивая дополнительных и сомнительных сущностей ещё и не понятно где?
Learn, learn and learn better than work, work and work.
|
Повідомлення створено: 09. 09. 2013 [09:58]
|
dell
Путин Краб
Автор теми
Зареєстрован(а) с: 09.04.2013
Повідомлення: 28
|
Как проще - не представляю, ну мало ли, может оператор какой-нибудь есть. Получается, что каждый флаг надо: инициализировать, изменить состояние, сбросить. И если программа большая, то возникают затруднения. И еще возникли проблемы с конструкцией f_start, не могли бы подсказать, почему так?
if (f_start) {
tm = 5;
}
Text1_text = tm;
При выполнении программы получаю следующее: сначала надпись 5, потом (после выполнения 1 цикла) значение "<EVAL>". Почему? tm должно быть равно 5, до тех пор, пока его не изменят. Как тогда присвоить начальное значение?
|
Повідомлення створено: 09. 09. 2013 [10:34]
|
roman
Roman Savochenko
Moderator Contributor Developer
Зареєстрован(а) с: 12.12.2007
Повідомлення: 3750
|
"dell" wrote:
Как проще - не представляю, ну мало ли, может оператор какой-нибудь есть.
Зато предлагаю.
Оператор, который по сути развернётся в тот-же флаг и который непонятно где хранить, а работа с ним будет ещё сложнее.
"dell" wrote:
Получается, что каждый флаг надо: инициализировать, изменить состояние, сбросить. И если программа большая, то возникают затруднения.
А для того чтобы поесть нужно встать с кровати и что-то приготовить. :)
Называйте, форматируйте логично и это решит Ваши проблемы.
"dell" wrote:
И еще возникли проблемы с конструкцией f_start, не могли бы подсказать, почему так?
if (f_start) {
tm = 5;
}
Text1_text = tm;
При выполнении программы получаю следующее: сначала надпись 5, потом (после выполнения 1 цикла) значение "<EVAL>". Почему? tm должно быть равно 5, до тех пор, пока его не изменят. Как тогда присвоить начальное значение?
Потому что "tm" это автоматическая переменная, контекст которой обычно и не сохраняется, для простых функций так точно. В рабочей версии контекст автоматических переменных сохраняется, точнее не разрушается, в прямых вычислителях: LogicLev, JavaLikeCalc, BlockCalc, ModBus, Siemens, VCAEngine, ... . За счёт чего и увеличена производительность вычислений, кроме всего прочего.
На LTS-версии я создавал атрибут объектного типа, где все флажки и контекст подобного рода хранил, с доступом примерно так:
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.
|