Информатика 1курс
Лаб.работа C4
Цель занятия:
0. Текущая учебная информация.
1. Средства препроцессора Условная компиляция
2. Парметры функции main( )
3. Динамическая память
4. Функции с неопределённым количеством параметров
5. Указатель на функцию
6. Типы данных: структура, перечисление, объединение
7. Переименование типов
Скопируйте каталог X-files\Students\Tasks\Informatika\Lab_C4 в свой каталогInform.
Ваш рабочий каталог: Z:\Inform\Lab_C4
===============================================================
Обратите внимание на структурное оформление программ. Программы должны быть структурированы в стиле «MFC». Если у Вас возникают вопросы, посмотрите Лекции или обратитесь к преподавателю.
Не правильно структурированные программы будут отключены перед зачетом из сданных решений.
1) программа Dc_1.c
Директивы препроцессора начинаются на # и служат для предварительного преобразования исходного текста программы перед компиляцией. Производятся текстовые преобразования без анализа синтаксиса языка.
Строки вида (define англ. определить )
#define PART 1
-приведут к замене (макроподстановке) по всему тексту (кроме текстовых строк) имени PART на 1. Так вводятся в Си именованные константы
Си позволяет компилировать только разные части программы, взависимости от потребностей задачи. В примере это сделано с помощью анализа PART
#if PART==1 , то компилируется только первый блок программы.
Измените значение PART:
#define PART 2
Посмотрите, что произойдёт с компиляцией.
Значит эта часть программы до этого не компилировалась.
2) программа Dc_2.с
Пример работы с аргументами командной строки и параметрами функции main().
int main(int argc, char* argv[])
int argc, char* argv[]) - встроенные аргуметы функции main().
int argc – количество аргументов командной строки, включая имя запускаемой программы.
argc >= 1.
char* argv[] – массив строк, каждя из которых содержит один передаваемый параметр.
Для преобразования сроки в целое число используется функция atoi( строка ):
- atoi : из а (в фортране использовался как формат строк) to (преобразовать) i (int).
Чтобы посмотреть работу программы, запустите программу, задав параметры командной строки
в разделе - Выполнить - параметры : 2 3
Или Запустите программу на выполнение в командной строке Total Commandera c
параметрами: Dc_2.exe 2 3
Или Запустите программу на выполнение в командном окне c параметрами: Dc_2.exe 2 3
3) программа Dc_3.c
Пример работы с памятью.
Операции определения переменных
inta, *point1, *point2; // выделяют места в стеке для этих переменных
Функция malloc (С) позволяет выделить место в свободной области памяти . Эта область памяти называют HEAP – «куча» . Функции mallocнадо сообщить: сколько и как организованной памяти нам необходимо. Если функция mallocвыполнена успешно, то будет возвращён адрес выделенной области памяти. Этот адрес можно присвоить соответствующему указателю.
Так как место в памяти выделяется в процессе выполнения программы, то такую память называют ДИНАМИЧЕСКОЙ.
point2 = malloc(sizeof(int)); // выделение места в "куче" - HEAP (в свободной области памяти)
В памяти выделено ровно столько места, сколько занимает одно целое.
Адрес выделенного места памяти заносится в указатель point2.
Посмотрите на адреса памяти выделяемые функцией malloc. Сравните эти адреса с адресами памяти, выделяемые под обычные (auto) переменные в стеке.
С динамической памятью можно работать только через указатели, которые на неё показывают. Поэтому необходимо внимательно следить за указателями, работающими с динамической памятью, так как при их «потере» теряется доступ к выделенной памяти.
point1 = malloc(sizeof(int));
point2 = point1; //потеряли область стека, отведенную для " point2 = malloc(sizeof(int)) "
Функция free() освобождает выделенную динамическую память. Необходимо быть внимательным , чтобы у нас не получались указатели показывающие не известно куда.
free( point1); // указатель point2 "повис", так как было point2 = point1 , и point2 показывал на доступную для работы память. Но теперь эта область памяти возвращена операционной системе, и нам не доступна для работы, а на неё попрежнему показывает point2).
Для выделения динамической памяти для массивов можно использовать функцию calloc(). Её параметры – сколько ячеекк памяти выделить под массив и размер каждой ячейки в байтах.
int A[100];
int *par = calloc(100, sizeof(int));
Синтаксис освобождения динамической памяти для массива:
free(par); //"освобождение" массива –такой же, как для переменной
4) программа Dc_4.c
Программа иллюстрирующая функцию с неопределенным количеством аргументов.
Демонстрируется один из простейших вариантов построения пользователем такой функции.
Упрощение заключается в том, что:
Написание подобных функций возможно с помощью библиотеки - #include <stdarg.h>
Макаросы и макроопределения этой библиотеки с помощью ТЕКСТОВЫХ замен могут построить код программы для работы не только с целым типом данных, как в примере, но и с любым типом данных.
Упрошенно можно описать работу функции так.
Параметры функции – локальные переменные, размещенные в стеке последлвательно. Если узнать адрес первой переменной и знать сколько выделено памяти для последующих переменных, то можно их все прочитать.
Используем param_pt - указатель на начало памяти в стеке, в которой хранятся значения передаваемых переменных. Значение адреса получаем, используя имя первого параметра – number.
А затем number– раз извлечем значения типа int.
va_listparam_pt; - тип указателя должен быть универсальным, и задан в библиотеке - <stdarg.h>,
для пользователя это указатель на «список аргументов» - va_list
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.