This is topic Оператор if-then-else in forum Языки программирования в TRACE MODE 6 / Algorithm Programming Languages at Форум TRACE MODE: техническая поддержка.


To visit this topic, use this URL:
http://forum.adastra.ru/ultimatebb.php/ubb/get_topic/f/33/t/000100.html

Posted by Abram Shnider (Участник № / Member № 4534) on :
 
Уважаемая техническая поддержка!
У меня возникает следующая проблема: при использовании оператора if-then-else с несколькими условиями (типа IF ((N1 >= N2) && (N3 == 0))) по какой-то причине во время компиляции возникает ошибка ("Неверный аргумент операции"). Как выяснилось, компилятору не нравится числовое значение в условии (0). При замене нуля, например на локальную константу с начальным значением 0, программа компилируется без ошибок.
Собственно вопрос: как в Техно ST происходит работа с простыми числами (не объявленными) и является ли этот момент уникальным, а если нет, то где еще могут не работать такие приемы?
 
Posted by SATER (Участник № / Member № 1414) on :
 
у вас наверное N3 типа bool.
тогда правильно:
IF ( N1 >= N2 && !N3 )
 
Posted by Abram Shnider (Участник № / Member № 4534) on :
 
SATER,
Да, действительно, N3 типа bool. С вашей версией согласен.
Значит сравниваемые величины должны быть одинаковых типов данных? Или это справедливо только для типа bool?
 
Posted by SATER (Участник № / Member № 1414) on :
 
не знаю, не специалист..
наверно, только с bool нельзя сравнивать
 
Posted by Abram Shnider (Участник № / Member № 4534) on :
 
Это вопрос к технической поддержке...
В любом случае большое спасибо за консультацию!
 
Posted by Romсheg (Участник № / Member № 3792) on :
 
Тип bool - уже состояние результата сравнения, зачем его еще с чем-то сравнивать?
Результат выполнения операции сравнения в любом языке - есть результат в формате bool. Если у вас сама переменная этого типа - то сравнивать ее с чем-то смысла фактически нет, поэтому выражение вида:
bool b1;
if (b1==true)
в любом языке программирования будет некорректным. А корректным будет только такое выражение:
bool b1;
if (b1)
а для состояния false:
bool b1;
if (!b1)

но это как пример...
 
Posted by Abram Shnider (Участник № / Member № 4534) on :
 
Romсheg,
Вы правы. В данном конкретном случае N3 уже является результатом сравнения, однако в программе мне требуется признак результата этого сравнения, поэтому и предпринимается такая конструкция оператора.
Ваши замечания по поводу корректного способа получения требуемого мне результата вполне справедливы (назову их своим недосмотром). Предложенное Вами решение предложил также г-н SATER.
Мне интересно требуется ли при сравнении, чтобы типы данных величин были одинаковы или же TM сам преобразует остальные типы данных также как это декларируется в руководстве IDE?
 
Posted by Romсheg (Участник № / Member № 3792) on :
 
Преобразование типа должно учитываться, однако есть некоторые особенности, например при сравнении типа с константой - надо явно указать тип константы. Например: сравнивая переменную типа REAL с константой - желательно константу указать тоже в том же типе.
v1 : REAL;
if (v1==10) - я так понимаю не совсем корректная формулировка, правильнее будет вот так:
if (v1==10.0)

Когда сравнивается две переменные - то, вроде как ТМ6 преобразование типа выполняет сам. Но - особенно надо учитывать правила этих преобразований, а то при вычислениях может привести к потере точности. Например - умножение REAL и INT однозначно даст потерю точности, потому как результат будет целочисленным. Как-то уже сам на подобное натыкался. Но это оговорено в документации.
 
Posted by Abram Shnider (Участник № / Member № 4534) on :
 
Romсheg,
Спасибо за ответ!
То, что "целочисленность результата арифметических вычислений в программе имеет высший приоритет" действительно оговорено в документации.
Похоже на то, что по крайней мере желательно явно указывать тип данных для получения адекватных результатов, а также во избежании ошибок компилятора.
 


Новости АСУ ТП / News | SCADA / HMI | Обучение / Trainings | Свяжитесь с нами / Contact Us



Powered by Infopop Corporation
UBB.classic™ 6.7.2