Переменные и константы

Правила именования

Имена переменных могут иметь любую длину. Первый символ имени должен быть представлен буквой или нижним подчеркиванием «_». Имена чувствительны к регистру.

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

ПРИМЕЧАНИЕ

Ключевое слово «uses» используется для подключения библиотек CTRL и не может использоваться в качестве имени переменной.

Значения переменных по умолчанию

Каждая переменная в языке Control имеет значение по умолчанию. Данное значение по умолчанию действует до момента инициализации переменной. Значением по умолчанию числовых переменных (int, float, double, …) является значение 0, а для символьных (char, string) — пустая строка («»).

Переменные с областью видимости в пределах менеджера

Переменные, созданные при помощи функции addGlobal(), видимы в пределах менеджера и доступны для всех сценариев данного менеджера. Инициализация переменных с областью видимости в пределах менеджера осуществляется непосредственно после запуска менеджера (объявление переменных осуществляется в библиотеке).  

Объявление переменной после выражения

Переменная может быть объявлена после выражения, например, после DebugN().

ПРИМЕР:

main()
{
exampl1();
}
void exampl1()
{
int i = 0;
DebugN(«i равно «,i);
int s; // Объявление новой переменной после функции DebugN()
s = i;
DebugN(«значение s устанавливается равным значению i», s);
}

Константы-символы и числовые константы

  • Константа-символ представляет собой единичный символ, указанный в одинарных кавычках, например, ‘x’.
  • Числовые константы состоят из цифр. Они относятся к типу int (в случае отсутствия десятичной точки) или float (при наличии десятичной точки) и, как правило, интерпретируются как десятичные числа.
  • В том случае, если число начинается с цифры 0 (ноль), то такая константа воспринимается как восьмеричное число, т.е. число в системе счисления с основанием 8. В восьмеричных числах используются только цифры от 0 до 7. Использование в восьмеричных числах цифр 8 и 9 приведёт к синтаксической ошибке.
  • В том случае, если число начинается с комбинации 0x или 0X (0 — цифра, ‘x’ — латинская буква), то такая константа воспринимается как шестнадцатеричное число, т.е. число в системе счисления с основанием 16. В данной системе счисления буквы от а (или А) до f (или F) являются шестнадцатеричными числами, которые соответствуют числам от 10 до 15 в десятичной системе счисления.

Числовые константы

Тип целочисленной константы, при отсутствии в конце значения константы символа l (от «long») или u (от «unsigned»), интерпретируется как тип Integer (целый). При выходе значения за диапазон (от -2147483648 до 2147483647) будет выведена синтаксическая ошибка.

В сценарииРезультат в средстве просмотра журналов
DebugN(4294967295)Синтаксическая ошибка (Syntax Error)
DebugN(4294967295u)[4294967295]

Выводы:

1. Синтаксическая ошибка может быть связана с числовой константой.

2. В случае выхода значения за числовой диапазон следует использовать беззнаковый суффикс «u».

Переменные для хранения информации об ошибках

В системе «КАСКАД Цифра» для хранения информации об ошибках (приоритет, тип или текст) может использоваться тип данных «errClass». Допустимы соответствующие типы с префиксом «dyn». Значение переменной для хранения ошибки может быть присвоено значению другой переменной для хранения ошибки или значению строковой переменной. Отдельные атрибуты могут быть прочитаны при помощи подходящих функций. Переменные типа «errClass» инициализируются по умолчанию приоритетом «INFO», типом «IMPL», кодом «NOERR» и текстом по умолчанию. Для доступа к возникшим ошибкам используется функция getLastError().

Необъявленные переменные

При попытке обращения во время выполнения программы к необъявленным переменным или функциям, соответствующий поток (thread) (ветвление программы, см. раздел «Потоки» и описания соответствующих функций) немедленно завершается с выдачей сообщения об ошибке.

Инициализация переменных

Значение переменной c областью видимости в пределах сценария может быть задано непосредственно в момент объявления.

ПРИМЕР:

int x = 3;
main()
{
//…
}

Для инициализации могут быть использованы константные выражения, например:

int x = 2 + 4;

При объявлении переменной ее значению также может быть присвоено значение функции (тип данных функции должен совпадать с типом данных переменной):

main()
{
int result = exampl_func(x,y); /* exampl_func — функция, возвращающая

                                  целое число */
DebugN(result);
}
int exampl_func(int x, int y) /* значение, возвращаемое функцией, имеет тот же тип, что и переменная, объявленная в функции main() */
{
x = 2;
y = 3;
int sum;
sum = x + y;
return sum;
}

Объявление переменной в утверждении (в statement)

Переменные также могут быть объявлены в утверждениях (в statement), как показано в примере ниже (объявление переменной в утверждении «for»):

main()
{
int i;
int result = exampl_func(i);
DebugN(«возвращаемое значение:»,result);
}
int exampl_func(int i)
{
int a = 2;
int b = 1;
int multip;
i = 4;
for (int j = 0; j < i; j++) //переменная j объявлена в цикле for
DebugN(j);                  //j существует только внутри цикла for
multip = a * b;
return multip;
//DebugN(j) здесь вызвал бы ошибку, поскольку переменная j более не существует
}

Повторное объявление переменной

Переменная в утверждении (statement) может быть названа точно так же, как и другая переменная в коде (переменная, объявляемая в утверждении, действительна только в его пределах). В примере ниже представлены две переменные i. Эти переменные не зависят друг от друга, хотя и имеют одинаковые имена.

main()
{
int i = 4;
for (int i = 0; i < 7; i++) //другая переменная i
DebugN(i);  

DebugN(i); /* будет выведено 4 (значение переменной i, объявленной в начале функции. В цикле for используется другая переменная с тем же именем )*/      
}  

Ключевое слово «const»

Ключевое слово «const» позволяет обеспечить неизменность значения переменной. Пример одной из возможных конструкций объявления именованных констант: const int MAX = 23. После данного объявления значение константы MAX всегда останется равным 23. Таким же способом неизменяемыми могут быть объявлены параметры функции, при этом их значения не смогут быть изменены в самой функции.

ПРИМЕР:

myFunc(const dyn_string &ds)
{
ds[2] = «xxx»;  // ==> ОШИБКА
}

Переменные с областью видимости в пределах библиотеки / ключевое слово «global»

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

Инициализация глобальных переменных и переменных с областью видимости в пределах библиотеки

Глобальные переменные инициализируются в сценарии-заглушке после того, как загрузится библиотека. Для инициализации могут использоваться любые выражения или функции, которые стали известны к данному момент времени (то есть все те, которые были объявлены с помощью #uses Libs и CtrlDLL).

ВНИМАНИЕ

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

Переменные c областью видимости в пределах сценария могут также объявляться в пределах библиотек CTRL. При этом возможны следующие варианты:

int a = 3;
const int b = 4;
global int c = 5;

  • В первом варианте отдельная новая переменная «a» создается при КАЖДОМ запуске сценария CTRL менеджером.

ПРИМЕР:

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

  • Во втором варианте переменная «b» будет объявляться (также в каждом сценарии) как константа с областью видимости в пределах менеджера.
  • В третьем варианте переменная «с» объявляется как переменная c областью видимости в пределах менеджера. Функция «addGlobal()» выполняет те же функции, но при объявлении с использованием ключевого слова область видимости «активируется» в момент объявления. Использование третьего варианта гарантирует создание и инициализацию переменных при запуске менеджера во время загрузки библиотек CTRL.

ВНИМАНИЕ

«global» является зарезервированным ключевым словом, которое не должно использоваться в качестве имен переменных. Использование данного ключевого слова в качестве имен переменных в сценариях/библиотеках (например, после миграции проектов, созданных в предыдущих версиях системы) будет приводить к синтаксическим ошибкам.

Переменные ScopeLib инициализируются во время регистрации библиотеки. Контекстом является ScopeLib. Область видимости сценариев: Гарантируется только, что переменные, объявленные ранее в той же библиотеке CTRL, известны также на момент инициализации и уже инициализированы. По такому же принципу инициализируются константы. При этом при инициализации констант могут использоваться только значения (целые числа, строки, функции, возвращающие не зависящие от времени выполнения результаты), но не ссылки на другие константы.

Например, результатом функции «makeDynInt (1, 2, 3)») является значение, не зависящее от момента времени выполнения функции. Подобные функции могут использоваться при инициализации глобальных констант.

Переменные «private global» («индивидуальные глобальные»)

Индивидуальные глобальные переменные могут использоваться как глобальные, однако их области видимости ограничены библиотеками, в которых были объявлены данные переменные!

Ключевые слова «public», «private» и «protected»

Функции и переменные могут быть объявлены как «public» («общедоступные», по умолчанию) или «private» («индивидуальные»). Ключевое слово «protected» («защищенный») также может быть использовано, но никаких функций оно не выполняет.

  • private
    Методы, отмеченные ключевым словом «private» (индивидуальные), могут вызываться только функциями той же библиотеки. Индивидуальные (private) переменные доступны только функциям библиотеки, в которой они были объявлены.
  • protected
    Зарезервированное ключевое слово (без функциональности). Защищенные функции или переменные пока не используются. При использовании ключевого слова «protected» поведение переменной соответствует общедоступной (public) переменной.
  • public
    Методы, отмеченные ключевым словом «public» (общедоступные), могут быть вызваны из любой функции любой библиотеки. Общедоступные переменные также доступны для любой функции сценария/библиотеки. Любая переменная по умолчанию считается общедоступной.

Функция «sizeof»

Возвращает длины переменных типа «string», «dyn» или «mapping» (ассоциативный массив).

ПРИМЕЧАНИЕ

dyn_int intVal;

intVal=makeDynInt(120,1,2,3,4,5,6);

string strVal= «TEST»;

mapping mapVal;

mapVal[«один»]=1;

mapVal[«два»]=2;

DebugN(sizeof(intVal));

DebugN(sizeof(strVal));

DebugN(sizeof(mapVal));

ВНИМАНИЕ

«foreach» представляет собой зарезервированное ключевое слово без функциональности. Данное слово не может использоваться в качестве имени переменной.

Ключевое слово «synchronized»

Ключевое слово «synchronized» (синхронизированные) означает, что два потока не могут одновременно обрабатывать отмеченные данным ключевым словом методы, переменные и т.д. одного и того же объекта.

synchronized foo()

{

 // …

}

//Только один поток может получить доступ к функции. Заменяет i = foo();

uint bar;

foo()

{

   //  …

    synchronized (bar)

    {

       //…

    }

 // …

}

foo2()

{

    //…

    synchronized (bar)

     {

       //…

     }

  //…

}

Оба блока, а также последующие блоки, синхронизируются с помощью переменной «bar». Только один поток может получить доступ к одному из блоков. Таким образом, например, могут синхронизироваться изменения в списках: «foo», например, используется для добавления, а «foo2» — для удаления. Переменная «bar» может иметь любой тип и по своей сути является мьютексом (mutex, двоичный семафор).

uint bar;

foo() synchronized (bar)

{

  //…

}

представляет собой сокращённую форму для:

foo()

{

  synchronized (bar)

  {

  }

}

Таким образом вся функция синхронизируется при помощи переменной «bar».

Зарезервированные ключевые слова

«КАСКАД Цифра» резервирует некоторые ключевые слова для будущего использования. В версии «КАСКАД Цифра» 3.15 зарезервированы и не могут использоваться в качестве имён переменных следующие ключевые слова:

  • dyn_function_ptr
  • shared_ptr
  • new
  • delete
  • nullptr

ПРИМЕЧАНИЕ

При обновлении проекта синтаксическая проверка на предмет использования недопустимых имен переменных может быть проведена путем запуска менеджера WCCOAui с параметром «-syntax all».

Переменные и функции с областью видимости в пределах панели

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

ПРИМЕР:

В сценарии для события панели «ScopeLib» (см. раздел «Свойства и события панели«) определена следующая функция:

DebugCode(string info)
{
Debug(info);
}

Для событий «Clicked» кнопок на панели могут быть созданы сценарии, обеспечивающие вывод информации в средстве просмотра журналов посредством вызова функции «DebugCode()»:

main()
{
DebugCode(«2-я кнопка»);
}

ПРИМЕЧАНИЕ

Не рекомендуется использование переменных c областью видимости в пределах панели в сценариях событий «Initialize» графических объектов!

Вызов ожидающей функции из другой функции

Ожидающие [ответ] функции, такие как dpGet() (см. раздел «Ожидающие функции«) могут вызываться из других функций.

main() 
{
    int i;    int result = example(i); 
   DebugN(«Возвращаемое значение:»,result); 
}
 int example(int i) 
{   
 int answ; 
   string dp1 = «ExampleDP_Arg1»; 
   float val;  
  answ= dpGet(dp1,val); /* Вызов функции dpGet */    
DebugN(«Точка данных:»,dp1,» «,»Значение:», val);    return answ;
 }

Приведение типа (Casting)

Операция приведения типа позволяет преобразовывать один данный тип данных в другой.

(float)3 // преобразование числа 3 типа int в тип float

(float)»1.23″ // преобразование строки «1.23» типа string в тип float

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

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