Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ПЯВУ - С-С++методичка и титул.doc
Скачиваний:
12
Добавлен:
08.11.2019
Размер:
789.5 Кб
Скачать

Внешние описания переменных

На самом внешнем уровне (вне функций программы) переменная может быть описана в любом месте программы, но до первого обращения к ней. Область её действия распространяется от места определения до конца программы (модуля). Если определение переменной располагается перед всеми функциями программы, то она становится глобальной (общедоступной), то есть может использоваться любой функцией. Переменная на внешнем уровне может быть инициирована константным выражением.

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

Пример 42.

Использование глобальных переменных.

Программа:

int i1, i2=5; // глобальные переменные

void fun( ) // функция, изменяющая

{ i1= i2 * i2; // глобальные переменные

i2 *= i1;

}

void main // главная функция

{ fun ( ); // вызов функции

printf (“ Значения: i1=%d, i2=%d”, i1, i2);

}

Результаты программы:

Значения: i1=25, i2=125

Многомодульные программы Проект программы

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

Создание многомодульной программы кроме разработки модулей требует еще создания специального текстового файла проект (project), из которого компилятор узнает, какие модули образуют проект программы, чтобы получить исполняемый файл (.exe). Порядок включения исходных файлов в проект не имеет значения. Файл проекта может иметь любое допустимое имя, в том числе совпадающее с именем главного файла (с функцией main), и имеет расширение “.prj”, например, myprog.prj.

Внешние ссылки

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

Функции по умолчанию глобально видимы, то есть, доступны в любых модулях. Однако, как и переменная, функция с предшествующим спецификатором static имеет областью действия только тот модуль, в котором определена.

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

Пример 43.

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

Файл TEST1.cpp:

#include<stdio.h>

int i=3; // описание глобальной переменной

static void next( ); // прототип статической функции

void main ( ) // главная функция

{ i++ ; // изменение глобальной переменной

printf (“B функции main i=%d\n”, i);

next ( ); // вызов “своей” функции

}

static next ( ) // функция данного модуля

{ i++ ; // изменение глобальной переменной

printf (“ B функции next i=%d\n”, i);

other ( ); // вызов функции другого модуля

}

Файл TEST2.cpp:

#include<stdio.h>

extern int i; // ссылка на внешнюю переменную

void other ( ) // функция глобально видима

{ i++ ; // изменение глобальной переменной

printf (“ B функции other i=%d\n”, i);

}

Файл текста программы TESTPROJ.prj:

TEST1.cpp

TEST2.cpp

Результаты программы:

B функции main i=4

B функции next i=5

B функции other i=6

Пример 44.

Для решения задачи, в которой осуществляется обмен данными между двумя переменными и определяется максимум из двух переменных, создать исходные текстовые файлы:

  1. функции обмена значениями двух переменных Obmen( ) и

функции нахождения максимума из двух чисел Max2( );

  1. главной функции, использующей предыдущие функции;

  2. проект программы.

Файл главной функции OBMEMAIN.cpp:

#include <conio.h>

void main() // главная функция

{ int a, b; // рабочие переменные

clrscr ( );

printf (“Работа программы: \n”);

printf (“Ввести 2 числа: ”);

scanf (“%d%d”, &a, &b); // ввод чисел

printf (“До обмена: a=%d b=%d\n”, a, b);

Obmen (&a, &b); // вызов функции из файла OBMENMAX.cpp

printf (“После обмена: a=%d b=%d\n”, a, b);

printf (“Максимум=%d\n”, Max2(a,b)); // вызов функции из файла

OBMENMAX.cpp

printf (“Нажмите любую клавишу…”);

getch ( ); // задержка экрана результатов

}

Файл функций OBMENMAX.сpp:

void Obmen (int*x, int*y) // функция обмена данными двух переменных

{ int r;

r = *x; *x = *y; *y = r; // обмен данными через указатели

}

int Max2 (int x, int y) // функция поиска максимума из двух чисел

{ if (x>y) return (x);

else return (y);

}

Файл проекта OBMEN.prj:

OBMEMAIN.сpp

OBMENMAX.cpp

Результаты программы:

Ввести 2 числа: 5 7

До обмена: а=5 b=7

После обмена: a=7 b=5

Максимум=7

Нажмите любую клавишу…