Основы программирования. Указатели. Динамические структуры данных. Абстрактные типы данных. Классы - 12 стр.

UptoLike

Составители: 

14
tReal: writeln(A[i].r);
tStr: writeln(A[i].s);
end;
Такое решение имеет важный недостаток: каждый элемент массива имеет размер,
определяемый самым большим типом shortstring, что расточительно.
Решение 2. В вариантной части записи Variant будем хранить не значения
соответствующих типов, а указатели на них:
type
TVar=(tInt,tReal,tStr);
pinteger=^integer;
preal=^integer;
pshortstring=^shortstring;
Variant = record
t: TVar;
case t: TVar of
tInt: (pi: pinteger);
tReal: (pr: preal);
tStr: (ps: pshortstring);
end;
Будем добавлять в такой
массив указатели на переменные разных типов:
var A: array [1..10] of Variant;
begin
A[1].t:=tInt; New(A[1].pi); A[1].pi^:=5;
A[2].t:=tReal; New(A[2].pr); A[2].pr^:=3.14;
A[3].t:=tStr; New(A[3].ps); A[3].ps^:='Delphi';
Для вывода содержимого такого массива воспользуемся следующим циклом:
for i:=1 to 3 do
case A[i].t of
tInt: writeln(pinteger(A[i].p)^);
tReal: writeln(preal(A[i].p)^);
tStr: writeln(pstring(A[i].p)^);
end;
В данном решении суммарный объем данных определяется не размером макси-
мального типа данных, а реальным содержимым в момент выполнения програм-
мы. По окончании работы
с массивом A динамическую память, занимаемую его
элементами, следует освободить. Поскольку параметр процедуры Delete имеет
тип pointer, то для освобождения занимаемой памяти можно передать любое из
полей-указателей, например, pi:
for i:=1 to 3 do
Delete(A[i].pi);