Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
187
Добавлен:
16.04.2015
Размер:
365.57 Кб
Скачать

6.15.7 Области действия переменных и подпрограмм.

Любой объект, который объявляется в программе, написанной на языке программирования C-51, имеет область действия. В языке программирования С область действия объекта распространяется на всю программу, то есть любой объект является глобальным.

К объектам запрещено обращение до того, как они будут объявлены, поэтому при обращении к объекту, объявленному в другом программном модуле этот объект должен быть объявлен в данном программном модуле как external. Например:

extern char code ERROR []; /*Строка сообщения об ошибке */

extern struct mrec current; /* Текущее измерение */

extern struct interval setinterval; /* Значения установленных интервалов */

extern struct interval counter ; /* Счетчик интервалов */

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

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

Локальные переменные существуют только в пределах структурного оператора. Если внутри структурного оператора были присвоены локальным переменным какие-то значения, то не следует ожидать, что вернувшись снова в этот оператор, переменные сохранят присвоенные ранее или вычисленные значения.

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

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

static void tmp(void)

{i=5;

}

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

6.16. Многомодульные программы.

Язык программирования C-51 позволяет писать многомодульные программы.

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

Раздельная трансляция программы возможна при использовании двух программ: транслятора исходного текста программы c-51 и редактора связей bl-51.

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

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

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

Пример объявления внешних подпрограмм на языке С-51:

char TestOZU(void);

char Rd558(char AdrRAM,char NachAdr,char Nbyte);

char Wr558(char AdrRAM,char NachAdr,char Nbyte);

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

Программа bl-51 объединяет несколько объектных файлов (модулей) в один. Для объединения нескольких модулей в исполняемую программу имена всех модулей передаются в редактор связей в качестве параметров при запуске этой программы. Пример вызова редактора связей из командной строки DOS для объединения трёх модулей:

bl51.exe progr.obj, modul1.obj, modul2.obj

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

Необходимость предварительного объявления внешних переменных и подпрограмм приводит к тому, что исходный текст программы загромождается этими объявлениями и найти собственно программу становится сложно. Кроме того при таких объявлениях возможно возникновение ошибок. Поэтому лучше вынести объявления подпрограмм и переменных в отдельные файлы, которые затем могут быть подключены в исходный текст программы директивой #include.