Языки программирования - концепции и принципы

Разнородные структуры данных, такие как


• Разнородные структуры данных, такие как дерево, которое может содер­жать узлы разных типов.

     Чтобы решать проблемы такого рода, языки программирования представ­ляют новый класс типов, называемый вариантными записями, которые имеют альтернативные списки полей. Такая переменная может первоначально со­держать значение одного варианта, а позже ей может быть присвоено значе­ние другого варианта с совершенно другим набором полей. Помимо альтерна­тивных могут присутствовать поля, которые являются общими для всех запи­сей этого типа; такие поля обычно содержат код, с помощью которого программа определяет, какой вариант используется на самом деле. Предполо­жим, что мы хотим создать вариантную запись, поля которой могут быть или массивом, или записью:

typedef int Arr[10];

C

typedef struct {

      float       f1;

      int i1;

}Rec;



Давайте сначала определим тип, который кодирует вариант:

C

typedef enum {Record_Code, Array_Code} Codes; 23

Теперь с помощью типа union (объединение) в С можно создать вариантную запись, которая сама может быть вложена в структуру, включающую общее поле тега, характеризующего вариант:

C

typedef struct {

Codes code;                                    /* Общее поле тега */

union {                                           /* Объединение с альтернативными полями */

       Агг а;                                     /* Вариант массива */

       Rес г;                                    /* Вариант записи */

      } data;

} S_Type;

S_Type s;

С точки зрения синтаксиса это всего лишь обычная вложенность записей и массивов внутри других записей. Различие состоит в реализации: полю data выделяется объем памяти, достаточный для самого большого поля массива а или поля записи r (см. рис. 10.1). Поскольку выделяемая память рассчитана на самое большое возможное поле, вариантные записи могут быть чрезвычайно




Содержание раздела