Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Бестиповые указатели




Совместимость и преобразование ссылочных типов.

Установка размеров динамической памяти.

По умолчанию для кучи отводится объем оперативной памяти в 655360 байт. Однако в ряде случаев такой объем избыточен или даже не допустим. Например, Pascal-программа, занимающая оперативную память, не в состоянии осуществить вызов какой-либо другой программы, размещенной в отдельном EXE-файле.

Для управления размерами динамической памяти в языке Turbo Pascal служит директива компилятора $M. Эта директива должна располагаться в начале текста программы и иметь три целочисленных параметра, которые разделяются запятыми:

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

{ $M 10000, 0, 200000 }

Задание минимального размера носит ограничительный характер и устанавливает тот объем требуемой памяти, при отсутствии которого программа вообще не может выполняться. Если параметр 0, то программа запускается в любом случае.

Третий параметр задает максимальный размер требуемой динамической памяти и носит рекомендательный характер. Размер динамической памяти определяется перед началом работы программы исходя из реального наличия свободной оперативной памяти.

Если при запуске программы в оперативной памяти находятся какие-либо программы (например, резидентная часть NC или запуск производится из интегрированной среды ТР), то реальный объем динамической памяти может быть меньше заказанного.

По умолчанию определяется директива {$M 16384, 0, 655360}

Кроме директивы $M в тексте программы можно установить обсуждаемые размеры посредством альтернативы Options/Compiler/Memory Sizes в интегрированной среде.

 

Все ссылочные типы считаются различными

Type

Tip1 = ^integer;

Tip2 = ^real;

Физическая природа ссылочных типов во всех случаях подразумевает адреса в оперативной памяти, но различные типы определяют несовпадающие множества значений.

Например: переменные

Var

P1: Tip1;

P2: Tip2;

не могут передавать друг другу значения. Для ссылочных переменных одного типа это допустимо.

Var

P1, P2: Tip1;

Begin

P1:= P2;

End.

 

Тurbo Рascal содержит стандартный ссылочный тип, который позволяет не конкретизировать свой базовый тип, т.е. тип указываемых значений. Этот тип обозначается pointer и совместим со всеми ссылочными типами.

Например:

Var

P1: ^integer;

P2: ^real;

P3: pointer;

допускается присваивание вида:

P3:= P1; P3:= P2; (P1:= P2 нельзя)

Значения типа pointer называются нетипизированным указателями. Реальная работа с такими указателями подразумевает их преобразование в типизированные указатели.

Тurbo Рascal содержит две процедуры распределения памяти, которые выделяют и освобождают области динамической памяти без учета типа тех значений, которые будут в них размещаться. Эти процедуры вызываются с двумя параметрами: указатель типа pointer и размер выделяемой или освобождаемой памяти в байтах.

Например, обращение GetMem(P,20) приведет к выделению области динамической памяти из 20-ти байтов. Максимальный размер, выделяемый GetMem 65521 байт.

Вызов процедуры FreeMem(P,20)освободит занятую область.

В Тurbo Рascal имеются стандартные функции, ориентированные на работу с нетипизированными указателями.

Функции Seg(x): word и Ofs(x): word позволяют определить компоненты адреса любого значения. Эти функции имеют один параметр любого типа и возвращают соответствующие значения сегмента и смещения для переменной, переданной в параметре.

Функция Ptr(Seg,Ofs: word): pointer осуществляет обратное действие, позволяя сконструировать указатель на произвольное место в памяти.

Решение экономного использования памяти состоит в том, чтобы отказаться от структуры ряда записей. Лучше, предварительно определив тип записи, создавать новый экземпляр записи тогда, когда возникает потребность.

Например, необходимо создать список записей, содержащие сведения о сотрудниках учреждения.

Type

Workerrec = record

Name: string [20];

Number: integer;

Salary: real;

end;

Workerptr = ^Workerrec;

Var

Worker: array[1..100] of Workerptr;

Всякий раз, когда требуется принять на работу очередного сотрудника достаточно обратиться к процедуре New с соответствующим указателем. Например:

New(worker[51]);

Запись 51-го служащего создана, теперь можно ссылаться на любое поле.

Например:

Worker [51]^. name;

 




Поделиться с друзьями:


Дата добавления: 2014-01-11; Просмотров: 680; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.