Смекни!
smekni.com

Модульное программирование (стр. 1 из 3)

Кафедра: Автоматика и Вычислительная Техника

Модульное программирование

Содержание

1. Классы памяти идентификатора

1.1 Область действия

1.2 Область видимости

1.3 Продолжительность жизни

2. Модели памяти ОЗУ

2.1 Виды моделей памяти

2.2 Размещение исполняемого файла в ОЗУ в модели large

3. Передача данных в функцию

3.1 Передача параметров по значению

3.2 Передача параметров по адресу

3.3 Передача одномерных массивов

3.4 Передача двумерных массивов

4. Тестирование функций

5. Практические задания

5.1 Указать классы памяти переменной

5.2 Работаем с адресами

5.3 Прототипы функций

5.3.1 Свопинг

5.3.2 Индексы максимальных элементов одномерного массива

5.3.3 Индексы максимальных элементов двумерного массива

5.3.4 Угол между двумя векторами

5.3.5 Определитель матрицы

5.4 Выделение фрагмента программы в отдельную функцию

5.5 Тестирование функции

5.5.1 Сортировка массива

5.5.2 МиниМакс

6. Лабораторные задания

6.1 Линейное уравнение

6.2 Четные элементы массива

6.3 Нахождение простых чисел

6.4 Количество вхождений подстроки в строку

6.5 Произведение матриц

7. Дополнительные задания

Библиографический список

1. Классы памяти идентификатора

С каждым объектом памяти переменной связаны следующие понятия: область действия, область видимости и продолжительность жизни. Эти три понятия объединяются в понятие класс памяти переменной. Класс памяти устанавливается синтаксисом и местом размещения определения этой переменной.

Спецификатор класса памяти в объявлении переменной может быть auto, register, static или extern. Если класс памяти не указан, то он определяется по умолчанию из контекста объявления.

Объекты классов auto и register имеют локальное время жизни. Спецификаторы static и extern определяют объекты с глобальным временем жизни.

При объявлении переменной на внутреннем уровне может быть использован любой из четырех спецификаторов класса памяти, а если он не указан, то подразумевается класс памяти auto.

Переменная с классом памяти auto имеет локальное время жизни и видна только в блоке, в котором объявлена. Память для такой переменной выделяется при входе в блок и освобождается при выходе из блока. При повторном входе в блок этой переменной может быть выделен другой участок памяти.

Переменная с классом памяти auto автоматически не инициализируется. Она должна быть проинициализирована явно при объявлении путем присвоения ей начального значения. Значение неинициализированной переменной с классом памяти auto считается неопределенным.

Спецификатор класса памяти register предписывает компилятору распределить память для переменной в регистре, если это представляется возможным. Использование регистровой памяти обычно приводит к сокращению времени доступа к переменной. Переменная, объявленная с классом памяти register, имеет ту же область видимости, что и переменная auto. Число регистров, которые можно использовать для значений переменных, ограничено возможностями компьютера, и в том случае, если компилятор не имеет в распоряжении свободных регистров, то переменной выделяется память как для класса auto. Класс памяти register может быть указан только для переменных с типом int или указателей с размером, равным размеру int.

Переменные, объявленные на внутреннем уровне со спецификатором класса памяти static, обеспечиваю возможность сохранить значение переменной при выходе из блока и использовать его при повторном входе в блок. Такая переменная имеет глобальное время жизни и область видимости внутри блока, в котором она объявлена. В отличие от переменных с классом auto, память для которых выделяется в стеке, для переменных с классом static память выделяется в сегменте данных, и поэтому их значение сохраняется при выходе из блока.

Пример:

/* объявления переменной i на внутреннем уровне с классом памяти static. */

/* исходный файл file1. c */

main ()

{...

}

fun1 ()

{ staticinti=0;...

}

/* исходный файл file2. c*/

fun2 ()

{ static int i=0;...

}

fun3 ()

{ staticinti=0;...

}

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

Переменные класса памяти static могут быть инициализированы константным выражением. Если явной инициализации нет, то такой переменной присваивается нулевое значение. При инициализации константным адресным выражением можно использовать адреса любых внешних объектов, кроме адресов объектов с классом памяти auto, так как адрес последних не является константой и изменяется при каждом входе в блок. Инициализация выполняется один раз при первом входе в блок.

Переменная, объявленная локально с классом памяти extern, является ссылкой на переменную с тем же самым именем, определенную глобально в одном из исходных файлов программы. Цель такого объявления состоит в том, чтобы сделать определение переменной глобального уровня видимым внутри блока.

Пример:

/* объявления переменной i, являющейся именем внешнего массива длинных целых чисел, на локальном уровне*/

/* исходный файл file1. c */

main ()

{...

}

fun1 ()

{ extern long i [] ;...

}

/* исходный файл file2. c */

long i [MAX] ={0};

fun2 ()

{...

}

fun3 ()

{...

}

Объявление переменной i [] как extern в приведенном примере делает ее видимой внутри функции fun1. Определение этой переменной находится в файле file2. c на глобальном уровне и должно быть только одно, в то время как объявлений с классом памяти extern может быть несколько.

Объявление с классом памяти extern требуется при необходимости использовать переменную, описанную в текущем исходном файле, но ниже по тексту программы, т.е. до выполнения ее глобального определения. Следующий пример иллюстрирует такое использование переменной с именем st.

Пример:

main ()

{ extern int st [] ;...

}

static int st [MAX] ={0};

fun1 ()

{...

}

Объявление переменной со спецификатором extern информирует компилятор о том, что память для переменной выделять не требуется, так как это выполнено где-то в другом месте программы.

При объявлении переменных на глобальном уровне может быть использован спецификатор класса памяти static или extern, а так же можно объявлять переменные без указания класса памяти. Классы памяти auto и register для глобального объявления недопустимы.

Объявление переменных на глобальном уровне - это или определение переменных, или ссылки на определения, сделанные в другом месте программы. Объявление глобальной переменной, которое инициализирует эту переменную (явно или неявно), является определением переменной. Определение на глобальном уровне может задаваться в следующих формах:

1. Переменная объявлена с классом памяти static. Такая переменная может быть инициализирована явно константным выражением, или по умолчанию нулевым значением. То есть обьявления static int i=0 и static int i эквивалентны, и в обоих случаях переменной i будет присвоено значение 0.

2. Переменная объявлена без указания класса памяти, но с явной инициализацией. Такой переменной по умолчанию присваивается класс памяти static. То есть объявления int i=1 и static int i=1 будут эквивалентны.

Переменная объявленная глобально видима в пределах остатка исходного файла, в котором она определена. Выше своего описания и в других исходных файлах эта переменная невидима (если только она не объявлена с классом extern).

Глобальная переменная может быть определена только один раз в пределах своей области видимости. В другом исходном файле может быть объявлена другая глобальная переменная с таким же именем и с классом памяти static, конфликта при этом не возникает, так как каждая из этих переменных будет видимой только в своем исходном файле.

Спецификатор класса памяти extern для глобальных переменных используется, как и для локального объявления, в качестве ссылки на переменную, объявленную в другом месте программы, т.е. для расширения области видимости переменной. При таком объявлении область видимости переменной расширяется до конца исходного файла, в котором сделано объявление.

В объявлениях с классом памяти extern не допускается инициализация, так как эти объявления ссылаются на уже существующие и определенные ранее переменные.

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

1.1 Область действия

Область действия переменной - это часть программы или исходного модуля, в которой определен объект соответствующий этой переменной. Перечислим виды областей действия.

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

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

Файл. Распространятся от точки определения переменной до конца файла. Переменные с такой областью действия называются глобальными и должны определяться вне всякой функции. Если глобальная переменная определена в конце файла, то ее область действия фактически пустая и вверх на весь файл не распространяется. Прототип. Такой областью действия обладают переменные из списка формальных параметров прототипа функции.

1.2 Область видимости

Видимость переменных и функций в программе определяется следующими правилами.

1. Переменная, объявленная или определенная глобально, видима от точки объявления или определения до конца исходного файла. Можно сделать переменную видимой и в других исходных файлах, для чего в этих файлах следует ее объявить с классом памяти extern.