Именованные ссылки на переменные
Ссылки - особый тип данных, являющийся скрытой формой указателя, который при использовании автоматически разыменовывается. При объявлении ссылки перед ее именем ставится символ амперсанда &, сама же ссылка должна быть проинициализирована именем переменной, на которую она ссылается.
Синтаксис:
ПЕРЕМ& <имя ссылки> = <переменная>
Ключевое слово ПЕРЕМ с последующим символом & применяется в теле функции или метода для определения именованной ссылки на переменную. Тип данных, на который указывает ссылка, может быть любым, но должен совпадать с типом переменной , на который ссылается. Любое изменение значения содержащегося в ссылке повлечет изменение этого значения в переменной, на которую указывает ссылка.
Пример:
ВЫЧИСЛИТЬ ПЕРЕМ ЧИСЛО: х1 = 20 ПЕРЕМ& х2 = х1 СООБЩЕНИЕ(СТР(х1))//20 СООБЩЕНИЕ(СТР(х2))//20 х2 += 15 СООБЩЕНИЕ(СТР(х1))//35 СООБЩЕНИЕ(СТР(х2))//35 КОНЕЦ
Если связанное значение удаляется по ходу выполнения функции,то ссылка становится невалидной и обращение к ней генерирует ошибку времени выполнения.
Пример:
ВЫЧИСЛИТЬ ПЕРЕМ ЧИСЛО: м[] м[1] = 100 м[2] = 200 ПЕРЕМ& м1 = м[1] СБРОС(м) СООБЩЕНИЕ(СТР(м1)) //ошибка т.к. используется ссылка на несуществующую переменную КОНЕЦ
В языке И++ имеется возможность присваивать ссылке на переменную некоторое значение внутри цикла. При этом на каждой итерации цикла именованная ссылка может привязывается к новой переменной.
Пример:
ВЫЧИСЛИТЬ ПЕРЕМ ЧИСЛО: м[] м[1] = 100 м[2] = 200 ЦИКЛ ИНДЕКС (массив = м[номер]) ПЕРЕМ& элем = м[номер] ОТЛАДКА(элем) КОНЕЦ_ЦИКЛА КОНЕЦ
Так же одну именованную ссылку на переменную можно вручную привязывать к другой переменной многократно внутри одной функции. Синтаксис повторной привязки не отличается от синтаксиса первичного объявления именованной ссылки. Тип именованной ссылки определяется при первичном объявлении и в дальнейшем не может быть изменен. Для объектных типов и интерфейсов тип повторно привязываемой переменной может быть не точно равен первичному типу ссылки, а быть дочерним (т.е. для типа вторично привязываемой переменной должно выполняться отношение "является" по отношению к первичному типу ссылки). При работе с иерархией типов лучше первое определение ссылки делать для базового типа с использованием явного уточненения типа.
Пример:
ВЫЧИСЛИТЬ ПЕРЕМ СТРОКА: имя = "Василий" ПЕРЕМ СТРОКА: фамилия = "Пупкин" ПЕРЕМ ЦЕЛОЕ: номер = 42 ПЕРЕМ& стр = имя ОТЛАДКА(стр) // привязана к переменной "имя" ПЕРЕМ& стр = фамилия ОТЛАДКА(стр) // привязана теперь к переменной "фамилия" ПЕРЕМ& стр = номер // ошибка, несоответствие типа ОТЛАДКА(стр) ПЕРЕМ ФОРМА: форма ПЕРЕМ& ф = форма // первичный тип ссылки ФОРМА ПЕРЕМ ДИАЛОГ: диалог ПЕРЕМ& ф = диалог // ОК - тип переменной ДИАЛОГ (дочерний для ФОРМА) ПЕРЕМ КНОПКА: кнопка ПЕРЕМ РЕДАКТОР: редактор ПЕРЕМ& элем1 = кнопка // первичный тип ссылки КНОПКА ПЕРЕМ& элем1 = редактор // ошибка - РЕДАКТОР не дочерний тип КНОПКА ПЕРЕМ& элем2 = ЭЛЕМЕНТ(кнопка) // первичный тип ссылки ЭЛЕМЕНТ - явно уточняем ПЕРЕМ& элем2 = ЭЛЕМЕНТ(редактор) // ОК - РЕДАКТОР дочерний тип ЭЛЕМЕНТ - тут уже можно не уточнять ПЕРЕМ& элем2 = редактор // ОК - РЕДАКТОР дочерний тип ЭЛЕМЕНТ КОНЕЦ