This is topic Оператор if-then-else in forum Языки программирования в TRACE MODE 6 / Algorithm Programming Languages at Форум TRACE MODE: техническая поддержка.
Уважаемая техническая поддержка! У меня возникает следующая проблема: при использовании оператора 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, Спасибо за ответ! То, что "целочисленность результата арифметических вычислений в программе имеет высший приоритет" действительно оговорено в документации. Похоже на то, что по крайней мере желательно явно указывать тип данных для получения адекватных результатов, а также во избежании ошибок компилятора.