Параметры

$-параметры

В связи с использованием в системах однотипных элементов (двигателей, задвижек, насосов и т.п.) возникает необходимость использования в экранных формах процессов однотипных графических объектов. Во избежание трудозатратного создания для каждого из однотипных графических объектов отдельных панелей, используются панели-ссылки. Передача в панели-ссылки значений переменных осуществляется при помощи $-параметров (см. раздел «Свойства панелей-ссылок и переопределение»). Панель-источник, включая декларированные в ней $-параметры, должна быть создана только один раз. Впоследствии на данную панель-источник может ссылаться неограниченное количество панелей-ссылок, в каждой из которых будут использоваться собственные значения $-параметров.

Рассмотрим в качестве примера систему с тремя однотипными двигателями. Данный тип двигателя и связанные с ним параметры, такие как требуемая частота вращения, фактическая частота вращения, номинальная мощность и т.д., описывается при помощи одной панели-источника «motor» и типа точек данных «motorType» и добавляется в разрабатываемую панель требуемое число раз в качестве панелей-ссылок на панель-источник. Отдельным экземплярам двигателей на разрабатываемой панели соответствуют отдельные точки данных вышеуказанного типа «motorType». Для получения в сценарии доступа к конкретной точке данных, при запуске сценария в него должны быть переданы конкретные значения $-параметров, например, имя точки данных, соответствующей конкретному двигателю. Значения $-параметров могут быть заданы в диалоговом окне GEDI.

Синтаксис

Первым символом обязательно должен являться символ $, за ним может следовать любое количество цифр от 0 до 9 или символьная строка. Данная строка должна начинаться либо со строчной буквы a…z, либо с прописной буквы A…Z, либо с символа подчеркивания «_». Примеры допустимых имен: $hugo, $_HUGO, $Frank_01, $Frank_01Hugo. Использование специальных символов не допускается. Имя может иметь неограниченную длину.

Во время выполнения программы $-параметр преобразовывается в строковую константу:

ПРИМЕР:

string x;
x = $hugo + «123» (в качестве значения $hugo передаётся «abc»)

преобразуется в

x = «abc» + «123»

Т.е. с $-параметрами могут выполняться те же действия, что и со строковыми константами.

ЗначокПРИМЕР:
 

dpSet($Motor+».Reqdvalue:_original.._value», MOTOR_REQD);

Необязательные аргументы

При определении функции некоторые параметры могут быть объявлены необязательными, т.е. при вызове функции они могут быть опущены.

ПРИМЕР:
 

myFunc(int a, bool b = TRUE)
{
 //….
}

Объявлена функция с двумя аргументами. При этом второй аргумент (и только он!) может быть опущен при вызове функции. В качестве значения опущенного аргумента будет использовано значение по умолчанию «TRUE». В представленном примере необязательным аргументом является «bool b = TRUE», поскольку для него уже задано значение по умолчанию.

ВНИМАНИЕ

После необязательного параметра могут быть объявлены другие необязательные параметры. Однако объявление обязательного параметра после необязательного параметра не допускается!

Два варианта вызова функции:

myFunc(3, FALSE); // используются оба аргумента
myFunc(3); //задаётся только первый аргумент, для второго аргумента используется значение по умолчанию «TRUE»

ВНИМАНИЕ

Необязательными параметрами могут являться только константы, но НЕ результаты выражения! См. пример ниже:

myFunc(int a, string b = (string)TEST)

{

 DebugN(«b=»+b);

}

main()

{

  myFunc(1, «Hello»);   //работает

  myFunc(1);            //работает

}

—————————————

myFunc(int a, string b = «Test»)

{

   DebugN(«b=»+b);

}

main()
{

myFunc(1, «Hello»);   //работает

myFunc(1);           // работает
}

ПРИМЕЧАНИЕ

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

ПРИМЕЧАНИЕ

Необязательные параметры типа langString не допускаются, поскольку значение по умолчанию для опущенного аргумента данного типа в функцию не передаётся!

Параметры, передаваемые по ссылке

При вызове функции test(&a, &b, c), в качестве аргументов используются адреса переменных «a» и «b» и значение переменной «c». При передаче по ссылке, в функцию передаётся не само значение аргумента, а адрес области памяти, где находится данное значение. Таким образом, при изменении значения аргумента внутри вызываемой функции, оно изменится и в вызывающей («родительской») функции. В качестве параметров, передаваемых по ссылке, могут передаваться только переменные, которым могут присваиваться значения. Такими переменными могут являться либо простые переменные, либо указатели на элементы массивов. При этом поддерживается неявное приведение.

ЗначокНИЖЕ ПРЕДСТАВЛЕН ПРИМЕР С ИСПОЛЬЗОВАНИЕМ ПАРАМЕТРОВ, ПЕРЕДАВАЕМЫХ ПО ССЫЛКЕ:

  1. main()
    {
    int a = 3;
    f(a);
    DebugN(a); // в журнал будет выведено 4
    }
    //…
    f (int &x)
    {
    x = 4;
    }

ЗначокНИЖЕ ПРЕДСТАВЛЕН ПРИМЕР БЕЗ ИСПОЛЬЗОВАНИЯ ПАРАМЕТРОВ, ПЕРЕДАВАЕМЫХ ПО ССЫЛКЕ:

main()
{
int a = 3;
f(a);
DebugN(a); // в журнал будет выведено 3
//…
}
f(int x)
{
x = 4;
}

ЗначокФУНКЦИИ С ПРОИЗВОЛЬНЫМ ЧИСЛОМ ПАРАМЕТРОВ

В функциях CTRL допускается использование произвольного числа параметров. Данная возможность реализуется при помощи типа данных va_list. Функция va_start обеспечивает сохранение в переменную типа va_list аргументов, переданных в функцию при вызове. va_arg позволяет считать следующее значение, сохранённое в переменной с типом va_list. va_end прекращает работу с переменной типа va_list.

При объявлении переменной типа va_list не требуется указание типа и количества параметров, так как эта информация сообщается системе при вызове функции. Соответственно не требуется и указание типов параметров при объявлении функции. Также не требуется информация о месторасположении параметров в va_list, поскольку эта информация также известна.

Приведённый ниже пример демонстрирует способ передачи в функцию произвольного количества аргументов при ее вызове и получения доступа к ним при помощи va_start, va_arg и va_end.

main()
{
subfunc(«Example1», 5, ‘A’); // Передача аргументов
subfunc(«Example2», ‘B’, «Characters»);  
}
void subfunc(string prefix, …) /* При объявлении функции не требуется указывать типы опциональных параметров (кроме первого обязательного параметра. В данном примере подобным параметром является строковая переменная prefix)*/
{
int i, len;
va_list parameters;

// va_arg используется для считывания следующего значения, сохранённого в переменной типа va_list
DebugN(«Iterate:»);
len = va_start(parameters);  // Возвращает количество значений

for (i = 1; i <= len; i++)
DebugN(prefix, va_arg(parameters)); //Вывод значений аргументов в журнал
va_end(parameters); // va_end прекращает действия с переменной типа va_list

//Другой способ доступа к значениям
DebugN(«Альтернативный способ доступа»);
len = va_start(parameters);  // Возвращает количество значений

for (i = 1; i <= len; i++)
DebugN(prefix, parameters[i]); // Вывод значений аргументов в журнал
va_end(parameters); // va_end прекращает действия с переменной типа va_list
}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *