Новые книги

Сегодня мобильный маркетинг – один из наиболее эффективных инструментов повышения продаж. Большинство руководителей бизнеса и маркетологов «теоретически» это понимают, но не знают, как использовать этот новый инструмент на практике. Автор, эксперт в области мобильных технологий, директор и владелец цифрового рекламного агентства, развернуто и на множестве практических примеров показывает, как применить каждый конкретный инструмент мобильного маркетинга в разных сферах бизнеса. С их помощью компании могут повысить узнаваемость бренда и лояльность потребителей, вовлечь клиентов в коммуникацию с брендом, добиться максимально точного таргетинга и многократно усилить эффективность традиционных маркетинговых каналов. Книга предназначена для владельцев и руководителей бизнеса, сотрудников рекламных агентств и менеджеров по маркетингу.
«…Я не ставил перед собой задачу научить своих читателей продвигать сайты самостоятельно. Для этого цели вы можете взять с полки книжного магазина другую книгу. Основная задача этой – помочь вам разобраться с тем, что же такое SEO, по каким факторам поисковая система оценивает сайт и определяет его место в иерархии выдачи, что именно должен делать SEO оптимизатор, дабы вывести ваш ресурс в ТОП и так далее…»

Книга предназначается, в первую очередь, бизнесменам и предпринимателям, маркетологам и руководителям IT-компаний, а также всем, кто интересуется SEO-рекламой и продвижением сайтов.

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