Курс лекций - Микропроцессоры

         

Параметры подпрограмм


Список формальных параметров - это последовательность объявлений , разделенная запятыми. Формальные параметры - это переменные, используемые внутри тела функции и получающие значение при вызове функции путем копирования в них значений соответствующих.

Пример определения функции с одним параметром:

int rus (unsigned char r) //Заголовок функции {//---------------начало тела функции-------------- if (r>='А' && c<=' ') return 1; else return 0; }//---------------конец тела функции-----------------

В данном примере определена функция с именем rus, имеющая один параметр с именем r и типом unsigned char. Функция возвращает целое значение, равное 1, если параметр функции является буквой русского алфавита, или 0 в противном случае.

Если функция не использует параметров, то наличие круглых скобок обязательно, а вместо списка параметров рекомендуется указать слово void. Например:

void main(void) {P0=0; //Зажигание светодиода while(1); //Бесконечный цикл }

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

Для можно задавать класс памяти register, при этом для величин типа int спецификатор типа можно опустить. Однако все известные мне компиляторы языка программирования С-51 игнорируют этот спецификатор, так как расположение параметров в памяти микроконтроллера оптимизируется с точки зрения использования минимального количества необходимой внутренней памяти.

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


Номер аргумента char, однобайтовый указатель int, двухбайтовый указатель long,float Нетипизированные указатели
1 R7 R6,R7 R4 - R7 R1 - R3
2 R5 R4,R5 R4 - R7 R1 - R3
3 R3 R2,R3 R1 - R3
Поскольку при вызове функции значения фактических параметров копируются в локальные переменные, в теле функции нельзя изменить значения переменных в вызывающей функции. Например нужно поменять местами значения переменных x и y:
/* Неправильное использование параметров функции */ void change (int x, int y) {int k=x; x=y; y=k; } В данной функции значения локальных переменных x и y, являющихся формальными параметрами, меняются местами, но поскольку эти переменные существуют только внутри функции change, значения фактических параметров, используемых при вызове функции, останутся неизменными.
Однако, если в качестве параметра функции использовать указатель на переменную, то можно изменить значение переменной, адрес которой будет содержаться в указателе. Для того чтобы менялись местами значения фактических аргументов можно использовать функцию приведенную в следующем примере:
/* Правильное использование параметров функции */ void change (int *x, int *y) {int k=*x; *x=*y; *y=k; } При вызове такой функции в качестве фактических параметров должны быть использованы не значения переменных, а их адреса:
change (&a,&b);

Содержание раздела