Новые книги

Креативный маркетинг — это хорошо. Гениальный маркетинг — это отлично.

Но мало.

Чтобы маркетинг приносил ощутимые результаты — то есть увеличивал прибыль, — он должен быть системным.

Система «90 дней» — это способ организации работы маркетинга в компании, позволяющий получить максимальную системность, концентрацию и результативность.

Проверено — работает!
Книга посвящена внутреннему устройству и алгоритмам работы основных компонентов операционной системы Microsoft Windows — Windows Server 2003, Windows XP и Windows 2000 — и файловой системы NTFS. Детально рассмотрены системные механизмы: диспетчеризация ловушек и прерываний, DPC, APC, LPC, RPC, синхронизация, системные рабочие потоки, глобальные флаги и др. Также описываются все этапы загрузки операционной системы и завершения ее работы. B четвертом издании книги больше внимания уделяется глубокому анализу и устранению проблем, из-за которых происходит крах операционной системы или из-за которых ее не удается загрузить. Кроме того, рассматриваются детали реализации поддержки аппаратных платформ AMD x64 и Intel IA64. Книга состоит из 14 глав, словаря терминов и предметного указателя. Книга предназначена системным администраторам, разработчикам серьезных приложений и всем, кто хочет понять, как устроена операционная система Windows.

Названия всех команд, диалоговых окон и других интерфейсных элементов операционной системы приведены как на английском языке, так и на русском.

Версия Fb2 редакции —

. Об ошибках просьба сообщать по адресу — general2008@ukr.net.

1.5

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

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

   Статической переменной (статически размещенной) называется описан-

ная явным образом в программе переменная, обращение к ней осуществля-

ется по имени.  Место в памяти для размещения статических  переменных

определяется при компиляции программы.

   В отличие от таких статических переменных в программах, написанных

на языке ПАСКАЛЬ,  могут быть созданы динамические переменные. Основ-

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

даются и   память  для  них выделяется во время выполнения программы.

Размещаются динамические переменные  в  динамической  области  памяти

(heap - области).

   Динамическая переменная не указывается явно в описаниях переменных

и к   ней нельзя обратиться по имени.  Доступ к таким переменным осу-

ществляется с помощью указателей и ссылок.

   Работа с динамической областью памяти в TURBO PASCAL реализуется с

помощью процедур и функций New,  Dispose,  GetMem,   FreeMem,   Mark,

Release, MaxAvail, MemAvail, SizeOf.

   Процедура New( var p:  Pointer ) выделяет место в динамической об-

ласти памяти   для  размещения  динамической переменной p^ и ее адрес

присваивает указателю p.

   Процедура Dispose(  var p:  Pointer )  освобождает участок памяти,

выделенный для размещения динамической переменной процедурой  New,  и

значение указателя p становится неопределенным.

   Проуедура GetMem( var p:  Pointer; size:  Word )  выделяет участок

памяти в   heap - области,  присваивает адрес его начала указателю p,

размер участка в байтах задается параметром size.

   Процедура FreeMem( var p:  Pointer; size: Word ) освобождает учас-

ток памяти,  адрес начала которого определен указателем p, а размер -

параметром size. Значение указателя p становится неопределенным.

   Процедура Mark( var p:  Pointer )  записывает в указатель p  адрес

начала участка свободной динамической памяти на момент ее вызова.

   Процедура Release( var p: Pointer ) освобождает участок динамичес-

кой памяти,   начиная с адреса,  записанного в указатель p процедурой

Mark,  то-есть,  очищает ту динамическую память,  которая была занята

после вызова процедуры Mark.

   Функция MaxAvail: Longint возвращает длину в байтах самого длинно-

го свободного участка динамической памяти.

   Функция MemAvail:  Longint полный объем свободной динамической па-

мяти в байтах.

   Вспомогательная функция SizeOf( X ):  Word возвращает объем в бай-

тах, занимаемый  X, причем X может быть либо именем переменной любого

типа, либо именем типа.

   Рассмотрим некоторые примеры работы с указателями.

   

    var

     p1, p2: ^Integer;

  

   Здесь p1 и p2 - указатели или пременные ссылочного типа.

   

    p1:=NIL;  p2:=NIL;

 

   После выполнения этих операторов присваивания указатели p1 и p2 не

будут ссылаться ни на какой конкретный объект.

   

    New(p1);  New(p2);

 

   Процедура New(p1) выполняет следующие действия:

   -в памяти ЭВМ выделяется участок для  размещения  величины  целого

типа;

   -адрес этого участка присваивается переменной p1:

 

                ЙННННН»          ЙННННН»

                є  *ДДєДДДДДДДДД>є     є

                ИНННННј          ИНННННј

                  p1               p1^

 

   Аналогично, процедура New(p2)  обеспечит выделение участка памяти,

адрес которого будет записан в p2:

  

                ЙННННН»          ЙННННН»

                є  *ДДєДДДДДДДДД>є     є

                ИНННННј          ИНННННј

                  p2               p2^

 

   После выполнения операторов присваивания

   

        p1^:=2;   p2^:=4;

   

в выделенные  участки  памяти  будут записаны значения 2 и 4 соответ-

ственно:

   

                ЙННННН»          ЙННННН»

                є  *ДДєДДДДДДДДД>є  2  є

                ИНННННј          ИНННННј

                  p1               p1^

 

                ЙННННН»          ЙННННН»

                є  *ДДєДДДДДДДДД>є  4  є

                ИНННННј          ИНННННј

                  p2               p2^

   

   В результате выполнения оператора присваивания

   

       p1^:=p2^;

 

в  участок памяти,  на который ссылается указатель p1, будет записано

значение 4:

   

   

                ЙННННН»          ЙННННН»

                є  *ДДєДДДДДДДДД>є  4  є

                ИНННННј          ИНННННј

                  p1               p1^

 

                ЙННННН»          ЙННННН»

                є  *ДДєДДДДДДДДД>є  4  є

                ИНННННј          ИНННННј

                  p2               p2^

 

   После выполнения оператора присваивания

   

      p2:=p1;

 

оба указателя будут содержать адрес первого участка памяти:

   

                ЙННННН»          ЙННННН»

                є  *ДДєДДДДДДДДД>є  4  є

                ИНННННј      ЪДД>ИНННННј

                  p1         і   p1^ p2^

                             і

                ЙННННН»      і

                є  *ДДєДДДДДДЩ

                ИНННННј

                  p2

                                                                   

   

   Переменные p1^, p2^ являются динамическими, так как память для них

выделяется в процессе выполнения программы с помощью процедуры New.

   Динамические переменные  могут входить в состав выражений,  напри-

мер:

   

      p1^:=p1^+8;    Write('p1^=',p1^:3);

   

   

    Пример. В результате выполнения программы:

   

 Program DemoPointer;

  var p1,p2,p3:^Integer;

  begin

   p1:=NIL;  p2:=NIL;  p3:=NIL;

   New(p1);  New(p2);  New(p3);

   p1^:=2;  p2^:=4;

   p3^:=p1^+Sqr(p2^);

   writeln('p1^=',p1^:3,'  p2^=',p2^:3,'  p3^=',p3^:3);

   p1:=p2;

   writeln('p1^=',p1^:3,'  p2^=',p2^:3)

  end.

   

на экран дисплея будут выведены результаты:

   

p1^=  2  p2^=  4  p3^= 18

p1^=  4  p2^=  4