1
]
МИКРОКОНТРОЛЛЕРЫ
ц
скажем, что инициализация переменных (или массивов)
- необязательное действие: нужно ее делать, или нет -
определяет программист, пишущий программу, язык же
только предоставляет для этого соответствующие конст-
рукции (в данном случае автор программы посчитал ини-
циализацию уместной). Про два других способа образо-
вания данных - структуры и указатели - мы поговорим
позже, когда доберемся до них в нашей программе.
Покончив до поры с пассивной частью программы,
приступим к ее активной части -
ф ункциям .
Из школьно-
го курса все мы, конечно же, помним пару-тройку функ-
ций, самой страшной из которых, несомненно, является
функция вычисления синуса © Записывается она, напри-
мер, как sin(90°), при этом число 90° в скобках называет-
ся параметром функции, а значение, вычисленное функ-
цией (например, по нажатию кнопки sin на калькуляторе)
- ее результатом. Аналогичная терминология принята и
в языках программирования - при описании функции в
I
скобках описываются ее
парамет ры,
а перед функцией -
тип
возвращаемого ею
результата.
В нашем примере под
|
номером <3> функция называется STOP_TIMER (функ-
ция синуса, например, называется sin), имеет один пара-
!
метр типа unsigned char, который мы назвали buttonNo, и
возвращает результат типа void. Столь подробное описа-
I
ние функции нужно компилятору для того, чтобы он смог
правильно построить программу работы с этой функци-
|
ей. Тип данных
void,
с которым мы пока не встречались-
очень интересный тип. Фактически это указание компи-
лятору, что результат работы функции нам не нужен. Вот
|
те на - скажет читатель, - а для чего она нам тогда вооб-
ще нужна? Объяснение тут простое: вычисление какого-
|
то результата - не единственное, что может делать фун-
кция. Она может, к примеру, при работе изменить значе-
ния каких-либо переменных, вывести информацию в порт
или сделать какие-то иные изменения во внешней среде.
Такие изменения во внешней среде в программистской
литературе называются
поб о чн ы м и эф ф ект ами,
и часто
бывают намного важнее какого-либо вычисленного ре-
зультата, так что никакого отрицательной эмоциональ-
ной нагрузки этот термин в программировании не несет
- скорее даже наоборот © Вот и в нашем примере функ-
ция полезна нам именно таким побочным эффектом -
она обнуляет один из элементов массива VirtualTimer.
Действие по обнулению элемента массива записано меж-
ду открывающейся и закрывающейся фигурными скоб-
j
ками, и называется
телом
функции (body), а описание
функции, за которым следует тело функции в фигурных
скобках, называется
определением
функции (definition).
Эту терминологию желательно запомнить - она нам при-
годится в дальнейшем.
Итак, в теле функции, как уже было сказано, выпол-
няется обнуление элемента массива. Делается зто с по-
мощью
операт ора-вы ражения.
Хочется обратить на это
внимание читателей: оператор-выражение-терминоло-
гия стандарта языка С, оператора “присваивания”, как
это, к сожалению, можно запросто вычитать в литера-
туре, в языке С нет! Оператор-выражение языка С от-
личается от операторов “присваивания” в других языках
з в ----------------------------------------------------------------------------------
программирования одним весьма принципиальным мо-
ментом - он сам по себе имеет
результат,
т.е. ничем не
отличается в этом смысле от оператора + (сложение), -
(вычитание) и т.д. Это, в свою очередь означает, что опе-
ратор-выражение можно использовать как элемент в дру-
гих операциях, как, например, используется результат
сложения или вычитания. Например, в языке Pascal, где
есть оператор присваивания, можно написать вот такую
конструкцию:
X := 0; Y := 0;
В языке С эту конструкцию можно записать двумя
способами (обе дадут один и тот же результат):
-
X = 0; Y = 0;
-
X = Y = 0;
Второй способ записи, немыслимый для оператора
присваивания, обозначает то, что мы “занесли” в пере-
менную Y значение 0 (говоря языком ассемблера, запи-
сали в ячейку Y число 0). Результатом этой операции “при-
сваивания” является число! В данном случае это число
равно нулю! И это число мы “заносим” теперь в перемен-
ную X! Оператор же присваивания
результата
в этом
смысле не имеет, это
действие,
а не значение! Повторим
еще раз - в языке С оператора присваивания нет, там
есть только оператор-выражение. Именно поэтому в язы-
ке С сплошь и рядом можно встретить конструкции по-
добной вот такой:
у = (х = 2*5) + 1
Результат вычисления этой конструкции - число 10 в
переменной X и число 11 в переменной у (подумайте, по-
чему). Операция “=” - единственная операция в языке С,
которая выполняется “справа налево” (сначала вычисля-
ется формула справа от знака “=”, а затем полученное
значение заносится в переменную слева от знака “=”), все
остальные операции выполняются так, как зто принято в
-математике - слева направо.
Итак, с оператором-выражением в целом мы разоб-
рались. Осталось разобраться с его левой частью в фун-
кции STOP_TIMER. В левой части оператора-выражения
записана конструкция VirtualTimer[buttonNo]. Это - дей-
ствие,
обратное
образованию нового типа, а именно -
доступ
к элементу массива. Теперь понятно, как это сде-
лать - для доступа к элементу .массива необходимо пос-
ле имени массива указать в квадратных скобках поряд-
ковый номер этого элемента (в данном случае номер нуж-
ного нам элемента мы получим в параметре buttonNo).
Формула в квадратных скобках (обычно вместо термина
“формула” в языках программирования употребляется
термин “выражение”) является индексом элемента мас-
сива - фактически его порядковым номером. Чрезвычай-
но важное замечание - порядковые номера элементов
массива в языке С начинаются
н е с е д и н и ц ы ,
как мы
привыкли, а
с н у л я .
Элемент VirtuaiTimer[0] - это
самый
первый
элемент массива, a VirtualTimer[7] -
самый пос-
ледний
(см. описание массива VirtualTimer)! И теперь
становится понятным назначение всей функции
STOP_TIMER целиком - записать число 0 в тот элемент
массива VirtualTimer, номер которого будет задан в каче-
стве параметра при вызове функции.
ЦРадиолюбитель - 12/2008
предыдущая страница 38 Радиолюбитель 2008-12 читать онлайн следующая страница 40 Радиолюбитель 2008-12 читать онлайн Домой Выключить/включить текст