Раздел: Документация
0 ... 79 80 81 82 83 84 85 ... 365 » exist bar ans - 2 Итак, функция max является встроенной, a bar — нет. Поэтому, если в текущем каталоге есть две функции max и bar, которые вызываются из командной строки или некоторой функции, то обращение будет происходить к встроенной функции max и пользовательской bar. Вложенные функции Другой разновидностью функций, доступных в одном М-файле, являются вложенные функции. Если подфункция является внешней по отношению к основной функции, то вложенная функция является внутренней. В силу этого обстоятельства переменные из рабочей среды основной функции доступны и во вложенной функции. Простейшая структура функции main, содержащей вложенную fnested, представлена в листинге 5.13. Листинг 5.13. Простейшая вложенная функция function main; alp = 5.3; bet = 9.1; fl = fnested(1.1, 2.1) function z = fnested(x, y) z = хл3 - 2*ул3 + 3*(хл2 + ул2) - х*у + 9 + alp*BET; end end Сравните эту функцию с функцией simplel из листинга 5.10, где функция f реализовалась как подфункция, и переменные alp и бет были неизвестны внутри подфункции. Теперь переменные alp и bet доступны в теле функции. При написании вложенных функций следует использовать оператор end для закрытия тела функции. Поэтому вложенная функция может размещаться в любом месте тела функции, ее содержащей. Основная функция также завершается оператором end. В одном М-файле допускается использование подфункций и вложенных функций одновременно, но тогда последним оператором подфункции должен быть end. Уровень вложенности функций не ограничен. Поэтому при многоуровневом вложении возникает вопрос, какие вызовы допустимы, а какие мет. Функция может обратиться к своей вложенной функции, но не может использовать вложенную функцию нижнего уровня. Вложенная функция может обратиться к функции того же уровня. Функция нижнего уровня может вызвать функцию верхнего уровня, в которую она вложена, и все функции, доступные из нее. На практике такой сложной структуры вложенности функций, как правило, не требу ется. Другая проблема многоуровневого вложения — это доступность переменных в среде вложенных и внешних функции. Переменные, определенные во внешней функции, доступны и во вложенной, и наоборот. Исключение составляет случай коллизии неременных для функций одного уровня. В этом случае во вложенных функциях это разные локальные переменные с одним именем. Естественно, что во внешней функции доступ к двум переменным с одним именем невозможен, поэтому ни одна из них недоступна. Вложенные функции могут быть доступны не голько в М-файле. если использовать указатель на вложенную функцию. В игстинге 5.14 приведен пример такого использования вложенной функции для создания двух однотипных функции с разными параметрами. Листинг 5.14. Указатель на вложенную функцию function pointer = f ixed parin(a. b, с) % а, о, с - параметры процесса. I Создание указателч на вложенную функцию pointer = @process; function у = process (t) у = asin(b.*t + с); end end Запишите функцию f ixedparm в текущий каталог и выполните команды: » f = fixed parm (1.5, 2, 0) ; >> g = £ixed parm(1, 10, 25); » fplot(f. [-2, 2]) >> hold on; » fplot{g, [-2, 2]) В результате будут построены графики двух разных функций. Таким образом, созданы две функции f и д, зависящие от одной переменной, для кото-; рых значения параметров зафиксированы на момент обращения к функции fixed parra. Приватные функции Простейший прием сделать некоторые функции видимыми или нет, состоит в размещении м-файлов в рабочих каталогах. Определенная структура каталога с пользовательскими файл-функциями позволяет задать некоторые вспомогательные функции, которые используются только файл-функциями, содержащимися в м-файлах данного каталога, а для файл-функций из других каталогов являются недоступными. Для этого следует создать подкаталог с именем private и разместить в нем вспомогательные файл-функции. Рисунок 5.8 поясняет доступ к приватным функциям. ~Гл1 work! private I— funl 1— fun2.m —calc.m —myplotm work2 private I— funl.m — fun2.m —test.m main.m Файл-функции test и main не имеют доступа к приватным функциям, размещенным в подкаталоге private другого каталога. Рис. 5.8. Схема доступа к приватным функциям Разбиение М-файла на ячейки Вернемся теперь к файл-программам и обсудим удобное средство выполнения отдельных их частей. Один из способов — выделение фрагмента кода и 0 ... 79 80 81 82 83 84 85 ... 365
|