Инкапсуляция. Векторы и массивы

Страницы работы

Содержание работы

246


Глава 6. Инкапсуляция



Проверка типов для структур данных — несколько более сложная процедура, так как приходится принимать во внимание операции выбора компонентов. Здесь возникают две основные проблемы.

1.Существование выбранного компонента. Может возникнуть такая ситуация, что все аргументы для операции выборки имеют правильный тип, но иско мый компонент попросту не существует в этой структуре данных. Напри мер, операция индексации, которая используется при выборе компонента массива, может получить значение индекса, выходящее за границы, допус тимые для этого массива (то есть будет получено неправильное /-значение для компонента массива). Это не создаст проблемы с проверкой типов при условии, что операция выбора при этом не выполняется, а просто появляет ся сообщение об ошибке и генерируется исключение (например, ошибка диапазона индексации). Однако если динамический контроль типов отклю чен в целях повышения эффективности и исключение не генерируется, то результат операции выбора почти всегда немедленно становится аргумен том какой-либо другой операции. Если при этом операция выбора выдала не верное /-значение, то результат равносилен ошибке определения типов. Опе рация, которая использует результат операции выбора, получает в качестве аргумента неверное /-значение (адрес блока памяти, в котором могут содер жаться данные другого типа, выполняемый код и т. д.). Операции выбора ком понентов, которые используют формулу доступа для вычисления смещения искомого компонента в непрерывной последовательности блоков памяти, осо бенно подвержены этой ошибке; в этом случае во время выполнения програм мы часто требуется проверка существования компонента до вычисления фор мулы доступа, используемой для определения его точного /-значения.

2.  Тип выбранного компонента. Последовательность выбора может определять сложный путь доступа через структуру данных к искомому компоненту. Например, в языке С оператор

A[2][3].link -» item

выбирает из записи содержимое компонента с именем Item с помощью указателя, хранящегося в компоненте 1 i nk другой записи, которая, в свою очередь, является элементом второй строки и третьего столбца массива А. Для выполнения статического контроля типов должна существовать возможность определения во время компиляции типа компонента, выбираемого любым допустимым селектором подобного составного типа. Как было отмечено ранее, вообще нельзя заведомо предполагать, что выбранный компонент будет существовать в нужный момент при выполнении программы. Статический контроль типов может гарантировать только то, что, если компонент существует, его тип — правильный.

6.1.5. Векторыимассивы

Векторы и массивы — это наиболее распространенные типы структур данных, имеющиеся в языках программирования. Вектор — это структура данных, состоящая из фиксированного количества компонентов одного типа, организованных в виде


6.1. Структурированные типы данных


247


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

Векторы

Атрибуты вектора таковы.

1.Количество компонентов обычно указывается неявным образом путем зада ния последовательности диапазонов изменения индексов, по одному диапа зону на каждую размерность.

2.  Тип данных для каждого компонента, который в данном случае одинаков для всех компонентов.

3.  Список значений индексов, используемых для выбора компонентов, обычно задается в виде набора целых чисел, первое из которых соответствует первому компоненту, второе — второму компоненту и т. д. Он может задаваться как диапазон значений, например -5. .5, или определяться только верхней гра ницей диапазона, а нижняя задается по умолчанию, например А(10).

Типичным примером объявления вектора является следующее объявление вектора в языке Pascal:

V: array [-5..5] of real;

определяющее вектор из одиннадцати компонентов, каждый из которых представлен вещественным числом, причем компоненты вектора выбираются с помощью индексов-5, -4, .... 5. В языке С объявление выглядит несколько проще:

float a[10];

Здесь объявляется массив из десяти компонентов с индексами от 0 до 9.

В тех языках, которые позволяют в объявлении массива указывать диапазон значений индексов, этот диапазон не обязательно начинается с 1, как показано в предыдущем примере для массива V из языка Pascal. Этот диапазон даже не обязательно должен быть подмножеством целых чисел; он может быть перечислением (или последовательностью перечислений), например:

type class = (Fresh,Soph.Junior.Senior): var ClassAverage: array [class] of real:

Операции над векторами. Операция выбора компонента вектора называется индексацией', обычно синтаксически она записывается как имя вектора, за которым следует значение индекса искомого компонента (например, V [ 2] или С1 a s sAve rage [Soph ]). Но, в принципе, значение индекса может быть и вычисляемым значением, что приводит к заданию выражения, которое вычисляет индекс компонента (например, V[I + 2]). Как уже говорилось, операция индексации возвращает /-значение искомого компонента, то есть его местоположение. Если на самом деле требуется

Информация о работе