ПрагмаСофтСтудия 2.1
На данной странице описывается 'голая' теория о том, каким должен быть текст формул. Примеры формул и их подробное описание смотрите в статье Примеры формул. Представленный материал разбит на несколько разделов. Используйте ссылки размещённые ниже для быстрого доступа к ним.
Формулы в программе имеют тот же смысл, что и в математике. Это способ описания влияния переменных, указанных в тексте формулы, на результирующее значение. Это значение может быть использовано далее в другой формуле или будет непосредственно определять свойство какого-либо элемента в проекте или тестовых сценариях.
В целом формулы могут содержать:
10 + 0xF5 * 0.45
"строка"
true, false, PI
var1[ 1 + var2 ] - var3[10]
2 * 3 && (0xA7C5 << 6)
(int)"12"
sin( ln(10) )
3.56 + FuncCalc(true,5)
FuncCalc(true,5)(res)
Node("one",FuncCalc())(res1,res2[1])
// comment
/* comment */
Как вы видите, разные составляющие формул имеют разную цветовую подсветку. Раскраска, которую использовали мы, соответствует той, что действует в программе по умолчанию. Цветовая подсветка формульных выражений применяется практически во всех местах их отображения. Как обычно, вы можете изменить её по своему усмотрению в настройках программы.
Все целые десятичные числа по умолчанию знаковые и имеют тип int. О типах будет рассказано чуть ниже. Для задания целого значения без знака, т.е. типа uint, необходимо применять запись в виде шестнадцатеричного числа, регистр букв a,b,c,d,e,f при этом не учитывается.
0x0, 0x5fA7
Значения с плавающей точкой float задаются с помощью символа ‘.’ (точка), при этом 0 (ноль) в начале числа разрешается не указывать.
.5, 50.1, 512.347
Значение 3.1415926535 можно заменять константой PI.
Константы true и false - это два возможных значения типа bool, и при приведении (конвертации) их к целому типу преобразуются в 0 и 1, соответственно.
Строки в формулах заключаются в двойные кавычки. При этом для записи символа двойной кавычки в строке используется сочетание \”, а для получения одиночного левого слеша необходима запись \\. В результате выражение " \\ \" " даст нам в итоге строку " \ " ".
Имена переменных, функций и вычислительных узлов не должны начинаться с цифры и могут содержать только знаки подчёркивания, цифры и символы латинского алфавита.
_0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
Каждая переменная представляет собой массив значений. Под массивом подразумевается некоторое количество последовательно расположенных в памяти значений определённого типа. Для доступа к какому-либо элементу массива после имени переменной указывается индекс в квадратных скобках. Индекс отсчитывается от 0 и задаётся значением с типом int.
v[4] =
v[4] в данном случае - это обозначение переменной v с размерностью 4, т.е. состоящей из четырёх ячеек памяти. Для получения или записи значения первой ячейки используется выражение v[0], второй - v[1] и т.д..
В случае, если массив переменной задан только одним значением, имеет размерность 1, то указание индекса [0] для доступа к элементу массива не обязательно.
v[1] =
Формулы могут состоять из любого количества строк. Также возможно использование комментариев, они полностью игнорируются вычислителем и делятся на два вида. Первый вид комментариев задаётся между парами символов /* и */. Такие пары могут находиться на разных строках и определять этим многострочные комментарии. Второй вид задаётся сочетанием //, при этом всё, что указано после него и до конца строки, считается комментарием.
"CAD " /*left*/ +
format("%c",0x2d) + // middle
/*right*/" Calculator"
/*
result: "CAD - Calculator"
*/
Давайте взглянем укрупнёно на приведённый выше список того, что может содержать формула, и выделим основное - это операнды и операции. Операнды поставляют значения в формулу, и эти значения должны иметь некоторый тип. Возможные типы операндов приведены в следующей таблице.
Имя типа | Возможные значения типа | Описание |
bool | false, true | логическое значение |
int | -2147483648 … 2147483647 | целое значение со знаком, 32 бита |
uint | 0 … 4294967295
0x0 … 0xffffffff |
целое значение без знака, 32 бита |
float |
зависит от реализации, например: -3.402823466e+38 … 3.402823466e+38 |
вещественное значение, 32 бита |
string |
“”, “текст” |
строка - последовательность строчных символов |
При написании формул зачастую требуется производить согласование типов значений между теми, что имеются в наличии, и теми, которые необходимы в том месте, где значение должно быть использовано. Делается это с помощью операций приведения типа. Приведение имеющегося типа операнда к требуемому выполняется с помощью записи имени необходимого конечного типа перед операндом.
bool "Текст"
Строка "Текст" - это операнд, имеющий тип string. Тип bool, указанный перед строкой, преобразует тип операнда. В результате выходным типом всего выражения будет bool, а значение - true. Не пустая строка, содержащая хоть один символ, всегда преобразуется в значение true.
float(1)
В выражении выше значение 1 с типом int конвертируется в значение 1.0 с типом float.
Число последовательных операций приведения типа не ограничено. Заключены типы в скобки или нет, также не имеет значения.
(float)(int)0x5f
float int 0x5f
В обоих примерах расположенных выше число 0x5f имеет тип uint. Оно преобразуется сначала в int и становится разным 95. А затем приводится к типу float и получает значение 95.0 .
Приведение типа float к int или uint происходит отбрасыванием дробной части. При приведении string к int, uint или float выполняется попытка посимвольной интерпретации строки в виде значения типа int, uint или float, соответственно.
Все возможные виды приведения одного типа в другой описаны в следующей таблице.
Тип источника | Тип результата | Способ приведения |
bool → |
int |
true → 1, false → 0 |
uint |
true → (uint)1, false → (uint)0 |
|
float |
true → 1.0, false → 0.0 |
|
string |
true → “true”, false → “false” |
|
int → |
bool |
≠0 → true, =0 → false |
uint |
(uint)int |
|
float |
(float)int |
|
string |
format(“%d”, int) |
|
uint → |
bool |
≠0 → true, =0 → false |
int |
(int)uint |
|
float |
(float)uint |
|
string |
format(“%u”, uint) |
|
float → |
bool |
≠0.0 → true, =0.0 → false |
int |
(int)float |
|
uint |
(uint)(int)float |
|
string |
format(“%f”, float) |
|
string → |
bool |
“…” → true, “” → false, где “” – строка, не содержащая символов |
int |
(int)string |
|
uint |
(uint)(int)string |
|
float |
(float)string |
Запись format(“...”, ...) в таблице означает, что для получения выходного значения с типом string будет происходить форматирование исходного значения в строку, и выполняться это будет таким же образом, как делает это встроенная функция format.
Операции - это то, что связывает операнды между собой, образуя конечное выражение. В одной формуле может быть много операций, и нужно знать в какой последовательности их выполнять. Для этого каждой операции был присвоен некоторый приоритет. Чем он выше, тем раньше данная операция выполняется. Наивысший приоритет имеют () и [] с уменьшением к операции ||. Список всех операций сгруппированных и расставленных по их приоритетам находится в следующей таблице.
n | Операция | Вид операции | Порядок вычисления | Описание |
1 |
() [] |
унарная |
слева направо |
() – вычисление выражения в скобках [] – обращение к значению переменной (элементу массива) по указанному в скобках индексу |
2 |
bool int uint float string + - ! ~ |
унарная |
справа налево |
bool, int, uint, float, string - приведение типа ! – логическое отрицание (инверсия логического значения операнда) ~ - поразрядное НЕ (инверсия всех битов в операнде целого типа) |
3 |
* / % |
бинарная |
слева направо |
% - остаток от целочисленного деления |
4 |
+ - |
бинарная |
слева направо |
сложение, вычитание |
5 |
<< >> |
бинарная |
слева направо |
<< - линейный битовый арифметический сдвиг влево >> - линейный битовый арифметический сдвиг вправо |
6 |
< <= > >= |
бинарная |
слева направо |
<= - сравнение на меньше или равно >= - сравнение на больше или равно |
7 |
== != |
бинарная |
слева направо |
== - сравнение на равенство != - сравнение на неравенство |
8 |
& |
бинарная |
слева направо |
поразрядное И (побитовая операция И над операндами целого типа) |
9 |
^ |
бинарная |
слева направо |
поразрядное исключающее ИЛИ (побитовая операция исключающего ИЛИ над операндами целого типа) |
10 |
| |
бинарная |
слева направо |
поразрядное ИЛИ (побитовая операция ИЛИ над операндами целого типа) |
11 |
&& |
бинарная |
слева направо |
логическое И |
12 |
|| |
бинарная |
слева направо |
логическое ИЛИ |
Более подробно о том, как выполняются некоторые логические, побитовые и другие операции смотрите в следующей статье.
Каждая операция может быть использована только с некоторыми типами операндов. Остальные типы во время вычисления будут автоматически приведены к одному из требуемых операцией типов или же они являются недопустимыми, и их использование приведёт к ошибке. Описание типов, требуемых для совершения операций, а также правил приведения остальных допустимых типов смотрите в таблице расположенной ниже.
Операции и требуемые для них типы | Правила приведения по умолчанию остальных допустимых типов операндов | |||
[ int ] |
bool/uint/float → int |
|||
|
bool → int |
|||
|
bool/uint → int |
|||
|
int/uint/float → bool |
|||
|
bool/float → int |
|||
|
bool/int/uint→float * float = float float * bool/int/uint→float = float bool/uint→int * bool→int = int bool→int * bool/uint→int = int uint * uint = uint |
|||
|
string + string = string |
|||
|
bool/uint/float→int % bool/float→int = int bool/float→int % bool/uint/float→int = int uint % uint = uint |
|||
|
bool/int/uint→float < float = bool float < bool/int/uint→float = bool bool/uint→int < bool→int = bool bool→int < bool/uint→int = bool uint < uint = bool |
|||
|
int/uint/float→bool && int/uint/float→bool = bool |
Для типа string разрешена только бинарная операция сложения, при этом оба операнда должны иметь или быть явно приведены к типу string. Для применения типа string в других операциях необходимо его явное приведение к требуемому типу.
Существует ряд встроенных, предопределённых функций. Их можно использовать в любой формуле проекта и тестовых сценариев. В случае проекта, если это необходимо, некоторые из встроенных функций могут быть запрещены для использования в профиле проекта.
Аналогично операциям, при вычислении функций, при необходимости происходит автоматическое приведение типов операндов к тем, которые требуются функцией.
Имя встроенной функции | Правила приведения типов операндов по умолчанию | Описание |
float sin (float) |
bool/int/uint → float |
синус на основе градусов |
float sinr (float) |
синус на основе радиан |
|
float sinh (float) |
синус гиперболический на основе градусов |
|
float sinhr (float) |
синус гиперболический на основе радиан |
|
float cos (float) |
косинус на основе градусов |
|
float cosr (float) |
косинус на основе радиан |
|
float cosh (float) |
косинус гиперболический на основе градусов |
|
float coshr (float) |
косинус гиперболический на основе радиан |
|
float tg (float) |
тангенс на основе градусов |
|
float tgr (float) |
тангенс на основе радиан |
|
float tgh (float) |
тангенс гиперболический на основе градусов |
|
float tghr (float) |
тангенс гиперболический на основе радиан |
|
float arcsin (float) |
арксинус, результат в градусах |
|
float arccos (float) |
арккосинус, результат в градусах |
|
float arctg (float) |
арктангенс, результат в градусах |
|
float arcsinr (float) |
арксинус, результат в радианах |
|
float arccosr (float) |
арккосинус, результат в радианах |
|
float arctgr (float) |
арктангенс, результат в радианах |
|
float ln (float) |
натуральный логарифм |
|
float lb (float) |
логарифм по основанию 2 |
|
float lg (float) |
логарифм по основанию 10 |
|
float sqrt (float) |
квадратный корень |
|
float cbrt (float) |
кубический корень |
|
float exp (float) |
экспонента |
|
float ceil (float) |
округление вверх; функция возвращает наименьшее целое (представленное как float), которое больше либо равно, чем значение переданное в функцию |
|
float floor (float) |
округление вниз; функция возвращает наибольшее целое (представленное как float), которое меньше либо равно, чем значение переданное в функцию |
|
float fround (float) |
округление до ближайшего целого, представленного (возвращённого) как float значение |
|
int round (float) |
округление до ближайшего целого |
|
float fabs (float) |
абсолютное значение |
|
float trunc (float) |
отбрасывание дробной части |
|
float pow (float A, float B) |
возведение A в степень B |
|
float copysign (float A, float B) |
возвращает величину, абсолютное значение которой равно A, но знак соответствует знаку B |
|
int abs (int) |
bool/uint/float → int |
абсолютное значение |
int rand () |
|
не принимает параметров и возвращает псевдослучайное значение от 0 до 32767 включительно |
int min (int,int) uint min (uint,uint) float min (float,float) |
(bool/int/uint→float , float) = float (float , bool/int/uint→float) = float (bool/uint→int , bool→int) = int (bool→int , bool/uint→int) = int (uint , uint) = uint |
функция возвращает значение наименьшего из двух операндов |
int max (int,int) uint max (uint,uint) float max (float,float) |
функция возвращает значение наибольшего из двух операндов |
|
bool if (bool COND, bool A, bool B) int if (bool COND, int A, int B) uint if (bool COND, uint A, uint B) float if (bool COND, float A, float B) |
COND: int/uint/float → bool -------------- (COND , bool/int/uint→float , float) = float (COND , float , bool/int/uint→float) = float (COND , bool/uint→int , int) = int (COND , int , bool/uint→int) = int (COND , bool→int , uint→int) = int (COND , uint→int , bool→int) = int (COND , bool , bool) = bool (COND , uint , uint) = uint |
функция возвращает значение операнда A, если COND=true, иначе - значение операнда B |
string if (bool COND, string A, string B) |
COND: int/uint/float → bool -------------- (COND , string , string) = string |
|
bool range (bool/int/uint/float VAL, bool/int/uint/float A, bool/int/uint/float B) |
(bool , int/uint/float→bool , int/uint/float→bool) = bool (int , bool/uint/float→int , bool/uint/float→int) = bool (uint , bool/int/float→uint , bool/int/float→uint) = bool (float , bool/int/uint→float , bool/int/uint→float) = bool |
проверка попадания в диапазон; функция возвращает true, если значение VAL находится внутри диапазона A-B или на его границе, и false, если значение VAL выходит за диапазон |
bool rangev (A) |
A: переменная типа bool/int/uint/float |
проверка попадания в диапазон; функция возвращает true, если значение переменной A находится между минимальным и максимальным значениями, заданными для переменной, или им равно, и false, если значение A выходит за диапазон |
тип VAL limrange (bool/int/uint/float VAL, bool/int/uint/float A, bool/int/uint/float B) |
(bool , int/uint/float→bool , int/uint/float→bool) = bool (int , bool/uint/float→int , bool/uint/float→int) = int (uint , bool/int/float→uint , bool/int/float→uint) = uint (float , bool/int/uint→float , bool/int/uint→float) = float |
обрезка по диапазону; функция возвращает значение VAL, если VAL находится внутри диапазона A-B и значение ближайшей границы диапазона, если VAL выходит за него |
тип A limrangev (A) |
A: переменная типа bool/int/uint/float |
обрезка по диапазону; функция возвращает значение переменной A, если оно находится между минимальным и максимальным значениями, заданными для переменной, или им равно и значение ближайшей границы диапазона, если A выходит за него |
string format (string A, B1[,B2,…]) |
A: только тип string, приведение по умолчанию не производится B1[,B2,…] – список параметров любого типа |
форматирование новой строки |
string strext (string A, int IND) |
A, B: только тип string, приведение по умолчанию не производится IND: bool/uint/float → int NUM: bool/uint/float → int |
извлечение части строки A, начиная с символа с индексом IND, и до конца строки |
string strextn (string A, int IND, int NUM) |
извлечение из строки A символов в количестве NUM, начиная с символа с индексом IND |
|
string strins (string A, string B, int IND) |
вставка строки A в строку B, начиная с символа с индексом IND |
|
string strdel (string A, int IND) |
удаление части строки A, начиная с символа с индексом IND, и до конца строки |
|
string strdeln (string A, int IND, int NUM) |
удаление из строки A символов в количестве NUM, начиная с символа с индексом IND |
|
int strlen (string) |
только тип string, приведение по умолчанию не производится |
получение числа символов в строке |
string strlwr (string) |
преобразование символов строки в символы нижнего регистра |
|
string strupr (string) |
преобразование символов строки в символы верхнего регистра |
|
int strcmp (string A, string B) |
A, B: только тип string, приведение по умолчанию не производится |
лексикографическое сравнение строк; функция возвращает 0, если строки совпадают, значение >0, если строка A больше строки B, и значение <0 в обратном случае |
int strfnd (string A, string B) |
поиск строки B в строке A от её начала; функция возвращает индекс первого элемента найденной строки B или -1, если строка не была найдена |
|
int strspn (string A, string B) |
функция возвращает индекс первого символа в строке A, который не совпадает ни с одним из символов в строке B или -1, если таковой не найден |
|
int strcspn (string A, string B) |
функция возвращает индекс первого символа в строке A, который совпадает с каким-либо символом в строке B или -1, если таковой не найден |
Слева от имени функции в таблице указан тип возвращаемого функцией значения. Справа от имени функции в круглых скобках обозначен тип операнда. Это именно тот тип, который требуется функции, и к которому будет происходить приведение типа переданного операнда в случае, если их типы не совпадают. Если функция принимает больше одного операнда, то типы в таблице разделяются запятой. Также в некоторых случаях после типа указано условное имя операнда. Это позволяет сослаться на него в графе Описание.
Кроме вызова встроенных функций формульное выражение также может содержать вызовы существующих в проекте функций вычисления и вычислительных узлов. В обоих случаях синтаксис вызова одинаков и аналогичен вызову встроенных функций.
name([in1[,...]])
Параметр name - это имя вызываемой функции или узла. in1 - значение передаваемое в функцию или узел.
В качестве входных значений может использоваться любое формульное выражение равно, как и число, строка, константа, имя входной, выходной или локальной переменной с указанием индекса или без. В квадратных скобках указаны необязательные параметры. Это означает, что круглые скобки могут быть пусты или наоборот через запятую вы можете указать одно, два и более значения. Всё зависит от того, в каком виде создана функция вычисления или вычислительный узел.
Чтобы узнать количество и какие входные значения принимает функция вычисления перейдите в окно Функции. Выделите интересующую вас функцию вычисления. В окне Свойства выделите поле Входные значения и нажмите кнопку , расположенную в его правой части. Откроется окно.
В таблице будут приведены все входные значения, которые принимает функция. Если таблица пуста, это означает, что функция не принимает параметров, и вы можете указывать в формуле имя функции с идущими за ним пустыми круглыми скобками.
При написании формулы вам может понадобится информация о типе значения, которое возвращает функция. Для этого ещё раз взгляните на окно Свойства. Поле Тип группы Выходное значение даст вам эту информацию.
Для получения информации о входных значениях вычислительного узла перейдите в окно Вычислительные узлы. Найдите и раскройте нужный вам узел. Первая же группа Входные значения содержит элементы определяющие, что можно в него передавать.
Порядок расположения элементов (сверху вниз) соответствует последовательности указания параметров в формуле. Самый верхний элемент определяет первый параметр, элемент под ним - второй и т.д.. Уже по элементам в дереве можно определить тип и размерность входных значений узла. Но вы также можете получить эту информацию, выделяя нужный элемент и просматривая окно Свойства.
Если группа Входные значения пуста, то узел не принимает параметры, и круглые скобки за его именем в формуле можно оставить пустыми.
|
Из формульного выражения можно сделать вызов вычислительного узла только в том случае, если узел возвращает только одно значение, и это значение не является массивом, т.е. имеет размерность 1. |
Следующая группа в дереве называется Выходные значения. Её единственный элемент определяет тип значения, которое возвратится в формулу после отработки вычислительного узла.