русс | укр

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

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Динамические переменные


Дата добавления: 2015-09-15; просмотров: 753; Нарушение авторских прав


Динамические переменные создаются в хипе (куче, динамической памяти) во время выполнения программы с помощью процедур new и getmem. Они не имеют собственных имен – обращаются к ним через указатели.

Динамические переменные – это переменные, созданием и уничтожением которых управляет программист. Работа с динамической областью памяти в TURBO PASCAL реализуется с помощью процедур и функций New, Dispose, GetMem, FreeMem, Mark, Release, MaxAvail, MemAvail, SizeOf.

· New(указатель);- процедура, благодаря которой в динамической памяти выделяется участок размера, достаточного для размещения переменной того типа, на который ссылается указатель, и адрес начала этого участка заносится в этот указатель.

· New(указатель); -функция, которая выделяет в динамической памяти участок размера, достаточного для размещения в ней переменной, и возвращает адрес начала этого участка.

Функция и процедура new применяются для типизированных указателей.

· Getmem(указатель, размер в байтах)-процедура, которая выделяет в динамической памяти участок указанного размера (не более 64 Кб) и присваивает адрес его начала указателю. Эту процедуру можно применять и для указателей типа pointer.

После выполнения процедур: new(P1); new(P2); new(P3); new(P4); new(PМ); в динамической памяти выделяются участки для размещения данных и ссылочным переменным P1, P2, P3, PM присваиваются указатели на эти участки памяти.

У динамических переменных имени (идентификатора) нет, поэтому прямое обращение к такой переменной просто невозможно. Единственный способ, это косвенное обращение путем разыменования ссылочной переменной, содержащий указатель на данную динамическую переменную, например: P1^:=15, P2^:=-150.

Для освобождения динамической памяти используются процедуры Dispose (если память выделялась с помощью new) и Freemem (если память выделялась с помощью getmem).



· Dispose(указатель) – процедура, которая освобождает участок памяти, выделенной для размещения динамической процедурой или функцией new, а значение указателя становится неопределенным.

· Freemem(указатель, размер) – процедура, освобождающая участок памяти указанного размера, начиная с адреса, находящегося в указателе. Значение указателя становится неопределенным.

Пример 1. Рассмотрим пример работы с динамическими переменными.

Program ykazateli;

Uses crt;

Type

rec=record

dit:integer;

str:string;

end;

Var

i,dl:integer;

p1,p2:^integer;

p3:^string;

p4:^rec;

Begin

clrscr;

i:=10;

new(p1); p1^:=1;

p2:=@i;

new(p3);

p3^:='abcdefg'; dl:=length(p3^);

new(p4);

p4^.dit:=20;

p4^.str:='qqq';

p4^.dit:=p1^+p2^+p4^.dit;

writeln(dl);

writeln(p1^,' ' ,p2^,' ',p3^,' ', p4^.dit, ' ', p4^.str);

readkey;

End.

Если динамическая переменная теряет свой указатель, то она становится «мусором».

Пример 2.

New(D); New(P); {выделено место в динамической памяти под две целые

переменные. Указатели получили соответствующие значения}

D^:=3; P^:=5; {динамическим переменным присвоены значения}

P:=D; {указатели P и D стали ссылаться на одну и ту же величину,

равную 3}

Writeln(P^, D^);{дважды напечатается число 3}

 

При работе с динамической памятью часто применяют следующие вспомогательные функции:

· Maxavail – возвращает длину в байтах самого длинного свободного участка динамической памяти.

· Memavail – возвращает в байтах полный объем свободной динамической памяти.

· Sizeof(x) – возвращает в байтах объем памяти, занимаемой x ( под x подразумевается переменная любого типа, либо имя типа).

Пример 3. Заполнить одномерный массив псевдослучайными числами и вывести их на экран.

В этом примере используется процедура getmem и функции, описанные выше.

Program memory;

Uses crt;

Type

mas_int=array[1..maxint] of integer; {maxint=32767}

Var

p:^mas_int; {указатель на одномерный массив}

i,n:integer;

Begin

clrscr;

writeln(sizeof(integer)); {определяем размер типа integer}

writeln(maxavail, ' ',memavail); {определяем значение этих функций}

writeln('Введите размер массива: ');

readln(n);

if maxavail<n*sizeof(integer) then

Begin

writeln('Недостаточно памяти');

halt;

end;

getmem(p,n*sizeof(integer));

for i:=1 to n do

Begin

p^[i]:=random(100);

write(p^[i]:3);

end;

readkey; end.

Пример 4. Создать вещественный массив из 10000 чисел, заполнить его псевдослучайными числами в диапазоне от 0 до 1. Вычислить среднее значение массива. Очистить динамическую память. Создать целый массив размером 10000, заполнить его псевдослучайными числами в диапазоне от -100 до 100. Вычислить среднее значение массива и очистить динамическую память.

Program Ykazatel;

Uses crt;

Type

masint=array[1..10000] of integer;

masreal=array[1..10000] of real ;

Var

PInt:^masint;

PReal:^masreal;

i:word;

sum,sred_real,sred_int:real;

Begin

randomize;

new(PReal); {выделение памяти под вещественный массив}

sum:=0;

for i:=1 to 10000 do

Begin

PReal^[i]:=random; {заполнение динамического массива}

sum:=sum+PReal^[i]; {суммирование элементов}

end;

sred_real:=sum/10000; {вычисление среднего значения}

dispose(PReal); {уничтожение вещественного массива из динам.памяти}

new(PInt); {выделение памяти под целый массив}

sum:=0;

for i:=1 to 10000 do

Begin

PInt^[i]:=random(200)-100;

sum:=sum+PInt^[i];

end;

sred_int:=sum/10000;

dispose(PInt); {уничтожение целого массива}

writeln('sred_real=',sred_real:10:6); {вывод средних значений}

writeln('sred_int=',sred_int:10:6);

readln;

End.



<== предыдущая лекция | следующая лекция ==>
Операции над указателями | Примечание.


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

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