Статическое и динамическое распределение памяти 


Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Статическое и динамическое распределение памяти



Различают 2 механизма распределения памяти.

Статический: объекты программы получают постоянный адрес в памяти. Занимаемое ими пространство освобождается только после окончания программы.

Динамический: память под объекты выделяется и освобождается во время выполнения программы.

Блоки

Конструкция присутствует только в языке C.

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

Формат:

{ <описания и определения> <выполняемые инструкции>}

Пример.

{ int i, j; //Определения локальных данных

for (i=0; i<l; i++){

s[ i ]=0;

for (j=0; j<k; j++){

s[ i ] += p[ i ][ j ]*q[ j ];

}

}

}

Как видно из синтаксиса и примера, блок – это составная инструкция, дополненная описаниями и определениями объектов программы.

Блок – это минимальная структурная единица программы на языке C.

Процедуры

Процедура – это часть программы, которая не выполняется в естественном порядке, а вызывается специальным способом.

В различных языках программирования допускаются внешние и внутренние процедуры. Внешняя процедура не содержится внутри любой другой процедуры, может вызываться из произвольных мест программы и транслироваться отдельно, независимо от других фрагментов программы. Это дает возможность разбить решаемую задачу на логические, по возможности, слабо связанные между собой части и вести их разработку независимо разными людьми. Передача информации между процедурами осуществляется путем передачи аргументов из вызывающей процедуры в вызываемую. В вызываемой процедуре каждому аргументу в порядке их передачи соответствует параметр, тип и организация которого должны совпадать с типом и организацией аргумента. После передачи аргументов в теле процедуры выполняются задуманные действия и результат этих действий может быть передан обратно в место вызова с помощью того же механизма. Этот результат включается в список параметров вызываемой процедуры (следовательно и в список аргументов вызывающей). Иногда для описания этого механизма употребляют термины фактический параметр (вызывающая процедура) и формальный параметр (вызываемая). Внутренняя процедура содержится внутри некоторой другой процедуры и на ее употребление накладываются существенные ограничения. В языках C и Basic допустимы только внешние процедуры.

По своей организации процедуры принято разделять на подпрограммы и функции.

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

C

Формально в языке нет понятия подпрограмма, опредено лишь понятие функция. Однако последняя легко преобразуется в подпрограмму и для ее вызова применяется инструкция вида:

<имя_процедуры>([список_аргументов]);

Пример. Подпрограмма умножения матриц.

MultMatrix(a, b, c, m, l, n);

Здесь:

a – левая матрица,

b – правая матрица,

c – матрица-результат,

m – число строк левой матрицы и результата,

i – число столбцов левой=числу строк правой,

n – число столбцов правой и результата.

Basic

Имеется 2 инструкции вызова:

call <имя_подпрограммы>([список_аргументов]) или

<имя_подпрограммы> [список_аргументов]

Пример. Подпрограмма умножения матриц.

call MultMatrix(a, b, c, m, l, n) или MultMatrix a, b, c, m,l, n

Функция – это процедура, в которой выделяется один из возвращаемых объектов (основной результат выполнения). Он не включается в список параметров процедуры. Его значение присваивается имени функции. Таким образом, вызов функции может включаться в произвольное выражение и не требует специальной инструкции. Примером могут служить большинство встроенных функций языка.

Пример вызова.

Basic: y=sqr(x*x+z*z)+abs(x-z)

C: y=sqrt(x*x+z*z)+fabs(x-z);

В принципе любая функция может быть вызвана как подпрограмма, если в этом есть какой-либо смысл. Возвращаемое значение при этом не используется.

Пример. Функция printf (<управляющая_строка>[, <список_аргументов>);

<управляющая строка> является первым обязательным параметром.

Определения процедур

C

Формат функции:

[<тип>] <имя>([<описания_параметров>])<блок>

В блоке обязательно присутствие инструкции вида return <выражение>, значение которого возвращается в точку вызова. Его обычно называют возвращаемым значением функции. <тип> в заголовке функции указывает тип возвращаемого значения.Если тип значения в инструкции return не совпадает с типом в заголовке, то производится автоматическое преобразование его к типу заголовка. Если <тип> отсутствует, то транслятор подставляет int.

Примеры.

float MinFun( floa t x[ ], in t n){

int i, j;

float MinValue;

................

return 2*MinValue+5;

}


Определение функции: Вызов:

double Max(double a, double b){ y=Max(cos(x), sin(x));

double y;

if (a>b){

y=a;

} else {

y=b;

}

return y;

}

Basic

Формат функции:

function <имя_функции>([<описания_параметров>]) as <тип>

инструкции

<имя_функции>=<выражение>

End function

Возвращаемое значение непосредственно присваивается имени функции.

Примеры.

function Minfun(x() as single, n as integer) as single

dim i as integer, j as integer, MinValue as single, y as single

................................................................................

MinValue=2*y+5

End function

Определение функции Вызов

function Max(a as double, b as double) as double y=Max(cos(x), sin(x));

dim y as double;

if a>b then

y=a

Else

y=b

End if

Max=y

End function

C

По понятиям языка C подпрограмма – это функция, не возвращающая значения. Для указания типа возвращаемого значения в этом случае используется ключевое слово void (пустой, не возвращающий значение).

Пример.

void fun(void){

………….

[ return;]

........……

}

Для возвращения в точку вызова используется инструкция return; Если возвратпроизводится непосредственно перед замыкающей фигурной скобкой тела процедуры, то употребление инструкции return необязательно.


Пример(подпрограмма). Вызов:

/* Умножение матрицы на вектор */ Matrix(a, b, c, m, n);

void Matrix(double p[10][10], /* Исходная матрица */

double q[10], /* Исходный вектор */

double s[10], /* Вектор-результат */

int l, /* Число строк */

int k){ /* Число столбцов */

int i, j;

for (i=0; i<l; i++){

for (s[ i ]=j=0; j<k; j++){

s[ i ]+=p[ i ][ j ]*q[ j ];

}

}

} /* End Matrix */

В каждой программе должна быть процедура, которой передает управление операционная система и которая остается активной в течение всей работы программы. Эта процедура называется главной и имеет заголовок вида:

void main([<параметры>])

<блок>

Параметры используются редко, поэтому обычно имеем:

void main( void ){

............

}

Basic

Формат подпрограммы:

sub <имя_подпрограммы>([<описания_параметров>])

..................................

Exit sub

..................................

End sub

Для возвращения в точку вызова используется инструкция exit sub. Если возвратпроизводится в конце процедуры, то употребление инструкции exit sub не нужно.

Пример (подпрограмма). Вызов:

' Умножение матрицы на вектор call Matrix(a, b, c, m, n);

sub Matrix(p(9,9) as double, _

q(9) as double, _

s(9) as double, _

l as integer, _

k as integer)

dim i as integer, j as integer

for i=0 to l-1

s(i)=0

for j=0 to k-1

s(i)=s(i)+p(i)(j)*q(j)

next j

next i

End sub

В языке Basic операционная система передает управление либо объекту программы, называемому формой, либо главной процедуре Sub Main.



Поделиться:


Последнее изменение этой страницы: 2017-02-08; просмотров: 728; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.145.186.6 (0.022 с.)