Средства препроцессора. Условная компиляция. Параметры функции main( ). Динамическая память. Функции с неопределённым количеством параметров. Типы данных: структура, перечисление, объединение

Страницы работы

7 страниц (Word-файл)

Содержание работы

Информатика   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

Программа иллюстрирующая функцию с неопределенным количеством аргументов.

Демонстрируется один из простейших вариантов построения пользователем такой функции.

Упрощение заключается в том, что:

  1. Пользователь указывает в функции – сколько параметров передается функции.
  2. В этом простейшем примере предполагается, что все передаваемый параметры – int целые. Сложность примера в том, что целых аргументов может быть МНОГО.

Написание подобных функций возможно с помощью библиотеки - #include <stdarg.h>

Макаросы и макроопределения этой библиотеки с помощью  ТЕКСТОВЫХ замен могут построить код программы для работы не только с целым типом данных, как в примере, но и с любым типом данных.

Упрошенно можно описать работу функции так.

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

Используем param_pt  - указатель на начало   памяти в стеке,  в которой хранятся значения передаваемых переменных. Значение адреса получаем, используя имя первого параметра – number.

А затем number– раз извлечем значения типа int.

va_listparam_pt; - тип указателя должен быть универсальным, и задан в библиотеке - <stdarg.h>,

для пользователя это указатель на  «список аргументов» - va_list

Похожие материалы

Информация о работе

Предмет:
Информатика
Тип:
Методические указания и пособия
Размер файла:
68 Kb
Скачали:
0