10.2. ПОДСЧЕТ ДЛИН СЛОВ
575
влением.
Более технологичный вариант предыдущей программы можно постро-
ить, если каждый фрагмент программного кода, который отвечает за реализа-
цию действий, относящихся к разным состояниям, (разделы таблицы, поме-
ченные метками состояний), оформить в виде процедуры. Но чтобы не прий-
ти к варианту 1, необходимо помнить, что вызов такой процедуры не должен
приводить к выделению для нее собственной (локальной) области памяти —
конечный автомат работает с общей памятью!
При использовании многих языков (и систем программирования) выпол-
нения этого условия нельзя добиться, и остается только примиряться с тем,
что вызовы процедуры приводят к заниманию новой памяти.В качестве сред-
ства, пригодного для решения проблемы, обычно предлагается использовать
макрогенерацию (пример — препроцессор
С
). Для макрогенератора проце-
дуры, им обрабатываемые, становятся макросредствами:
— описание процедуры — определение макроса, или, что то же, тело ма-
кроса, а
— вызов процедуры — макровызов, или, что то же, использование макро-
са.
Обработка определения макроса — это создание из тела макроса текстовой
заготовки для последующего встраивания ее вместо макровызова (параме-
тризация макросредств, хотя и приводит к затруднениям для препроцессора,
также возможна).
Однако внешний для языка препроцессор приводит к большой проблеме,
связанной с идентификацией возможных ошибок в теле макросов, поскольку
препроцессор не в состоянии различать контексты вызова и описания проце-
дур. По этой причине в развитых языках предлагаются иные средства, пред-
ставляющие собой гибрид между процедурным механизмом и макрогенера-
цией. В
С++/C#
это встраиваемые (
inline
) функции. И именно они наиболее
точно применимы для решаемой задачи. Описывать что-либо внутри встра-
иваемых процедур можно, понимая, что при этом образуется лишь собствен-
ная область видимости имен, а не область памяти.
Есть еще один вопрос, который требуется решить при таком подходе, —
выбор типа результата функций-состояний и способа возвращения результа-
та. Естественный результат такой функции — это новое состояние, в которое
попадает автомат при переходе. Он может быть представлен, например, гло-
бальной переменной (такой как
State
в программе 10.2.2, которой присваива-