ГОСТ Р И С 0 10303-11 — 2009
знамениеданного выражения является неопределенным (?), то числоэлементов вэкземпляре набора это
го типа данных не ограничено сверху.
c) Если элемент bound_spec опущен, то границы набора определяются как [0:?].
d) Каждый элемент в экземпляре типа данных SET должен отличаться (то есть не являться эквива
лентным экземпляром) от любого другого элемента того же экземпляра набора.
Пример — В данном примере атрибут a_set_of_points определен как набор объектов point
(объекты point относятся к именованному типу данных, который объявлен в другом месте).
a_set_of_points : SET OF point:
Атрибут a_set_of_points может содержать ни одного или несколько объектов point. Каждый
экземпляр объекта point (в экземпляре набора) должен отличаться от любого другого объекта
point в наборе.
Если требуется, чтобы набор содержал не более 15 объектов point, то в спецификации верхняя
граница должна быть определена следующим образом:
a_set_of_points: SET [0:15] OF point;
Теперь экземпляр атрибута a_set_of_points может содержать не более 15 точек.
8.2.5 Уникальность значений в агрегированных структурах
Уникальность среди элементов агрегированных структур основана на сравнении экземпляров (см.
12.2.2). К агрегированным структурам может быть предъявлено требование уникальности значений ихэле
ментов посредством использования функции VALUEJJNIQUE (см. 15.29).
Пример— Определение набора с уникальными значениями:
TYPE value_unique_set = SET OF a;
WHERE
wrt:value_unique(SELF);
ENDTYPE;
П р и м е ч а н и е — Определяемая разработчиком уникальность значений может быть задана
посредством двух функций с именами, например. my_equal и my_unique. как показано в следующем
псевдокоде:
FUNCTION my_equal (v1.v2: GENERIC: gen): LOGICAL;
(’Функция my_equal возвращает значение TRUE, если vl «равно» v2 ’)
END_FUNCTION;
FUNCTION my_unique (c: AGGREGATE OF GENERIC): LOGICAL:
(’Функция my_unique возвращает значение FALSE, если два элемента из с имеют одинаковое «значение»,
или возвращает значение UNKNOWN, если любой из сравниваемых элементов имеет значение
UNKNOWN, в противном случае возвращает значение TRUE *)
LOCAL
result : LOGICAL:
unknownp : BOOLEAN := FALSE;
END_LOCAL;
IF (SIZEOF(c) = 0) THEN
RETURN(TRUE): ENDJF;
REPEAT i := LOINDEX(c) TO (HIINDEX(c)-1):
REPEATj :=(i+1)TO HIINDEX(c);
result := my_equal(c[i], c[j]);
IF (result = TRUE) THEN
RETURN(FALSE); ENDJF;
IF (result = UNKNOWN) THEN
unknownp := TRUE: END IF;
END REPEAT:
END_REPEAT;
IF unknownp THEN
RETURN(UNKNOWN);
ELSE
RETURN(TRUE);
ENDJF;
ENDJUNCTION;
Функция my_equal должна иметь следующие свойства, позволяющие формировать классы эквивален
тности. Ниже через S обозначен рассматриваемый набор объектов, a my_equal(i, j). где i и j принадлежат S.
возвращает одно из значений [FALSE, UNKNOWN. TRUE]:
20