Программирование в среде Турбо Паскаль (Поляков, Круглов) - страница 91

| END.

- 139 -

Результатом будет печать значения числа 32 в формате String. Подобные ошибки никак не диагностируются, и вся ответственность ложится на программиста. Хуже того, поле-селектор — не более чем указание, какое поле соответствует его значению. Можно, игнорируя поле-селектора, обращаться к любому из полей-вариантов. Но поскольку значение для всех вариантов одно, оно будет трактоваться по-разному согласно типу каждого поля.

Несмотря на подобные неприятности, использование записей с вариантами и полем-селектором иногда очень удобно (если, конечно, не ошибаться). Например, если есть набор изделий с параметрами в различных системах измерения, то его можно представить в программе как массив записей с типом, подобным VRecType. Корректно заполнив поле каждой записи в массиве, мы можем потом легко опрашивать их: сначала значение поля селектора, а затем в зависимости от его значения один из вариантов хранения длины или комментария, например для массива AVRec из 100 записей типа VRecType:

| for i:=1 to 100 do

| case AVRec[i].Measure of

| 'д','Д' :WriteLn('Длина в дюймах ', AVRec[i].inches);

| 'с','С' :WriteLn('Длина в см ', AVRec[i].cantimeters);

| '?' :WriteLn('Нет данных из-за', AVRec[i].Comment1);

| end; {case}

Если не нужен явный указатель на использование определенного варианта, можно обойтись без поля селектора, заменив его именем любого перечислимого типа. Нужно лишь, чтобы этот тип имел элементов не меньше, чем будет вариантов. Запись VRec может быть описана иным способом:

| TYPE

| VRecType = RECORD { тип записи с вариантами }

| Number : Byte; { номер измерения длины )

| case Byte of { признак единицы длины }

| 1 : (inches : Word); { длина в дюймах}

| 2 : (cantimeters : LongInt); { длина в см }

| 3 : (Comment1, Comment2 : String[16]) { тексты }

| END;

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

- 140 -

типа — чистая условность. Они могут быть любыми, но только не повторяющимися. Обычно для двух вариантов в CASE вписывают тип Boolean (значения True и False), для большего числа вариантов — любой целочисленный тип.

При отказе от поля-селектора теряется возможность определить во время работы программы, какой вариант должен быть принят в текущий момент.

Обычно записи с вариантами, но без поля-селектора используются для обеспечения разнотипного представления одних и тех же данных. Например;