Содержание
- 2. Описание функции Описание типа (спецификации) функции: тип результата типы (и имена) аргументов – формальных параметров Именование
- 3. Процедуры и функции Синтаксис: описатель: функция:
- 4. Вызов функции Выражение, значением которого является вызываемая функция Фактические параметры - выражения, значения которых подставляются вместо
- 5. Вызов функции
- 6. Вызов функции – пример (C) ToPolar(x, y, &alpha, &ro) * (shift ? sin : cos) (n
- 7. Вызов функции – шаги исполнения Вычисляется вызываемая функция Вычисляются фактические параметры Создаются локальные объекты: формальные параметры,
- 8. Оператор return Синтаксис: Вычисление результата функции Завершение выполнения функции
- 9. Граф вызовов: Вершины - функции Дуги -вызовы Функции - пример float poly(float coef[], int n,float x)
- 10. power: Функции - пример float poly(float coef[], int n,float x) { float sum = 0f; for
- 11. Дерево вызовов – упорядоченное дерево: Вершины – вызовы, с указанием значений фактических параметров Дуги - вложенность
- 12. Рекурсия Статическая рекурсия - цикл в графе вызовов (разрешимое свойство) Динамическая рекурсия – при некотором исполнении
- 13. Рекурсия Вопрос: сколько раз вызывается power? «Статический» ответ: 2 power(i,x) power(n-1,x) «Динамический» ответ: 6 power(2,10) –
- 14. Рекурсия – эффективность? Вызов функции – дорогостоящая операция (отведение памяти, пересылка параметров, запоминание точки возврата и
- 15. Рекурсия - достоинствo Позволяет естественно реализовать по-существу рекурсивный алгоритм struct Person { struct Person * Parent;
- 16. Вложенные процедуры float poly(float coef[], int n,float x) { float sum = 0f; for (int i=0;
- 17. Вложенные процедуры – динамический контекст power: main: poly: power: float poly(float coef[], int n,float x) {
- 18. Вложенные процедуры Реализация существенно сложнее, поскольку требуется поддерживать динамическую цепочку контекстов Может существенно уменьшить количество передаваемых
- 19. Переменное число параметров - printf (C) #include extern void print_char(unsigned c); extern void print_int(int c); extern
- 20. Переменное число параметров - недостатки (C) my_printf(“%s + %s = ?”, UserName, 0.7L); Несоответствие типов параметров
- 21. Переменное число параметров (Visual Basic) Function Average(ParamArray A() As Single) _ As Single If UBound(A) =
- 22. Необязательные и именованные параметры void DrawBox( long Left, long Top, long Width, long Height, long OffsetX,
- 23. Необязательные и именованные параметры (Visual Basic) Sub DrawBox( _ Left As Long, _ Top As Long,
- 24. Подстановка параметров по ссылке int A, B; void swap(int x, int y) { x += y;
- 25. Подстановка параметров по ссылке void ToPolar( double x, double y, double * r, double * a)
- 26. Подстановка параметров по ссылке Проблема синонимов int A,B; void swap(int * x, int * y) {
- 27. Подстановка параметров по ссылке Проблема синонимов Затрудняет понимание программ Мешает оптимизации, поскольку приходится предполагать, что параметр
- 28. Подстановка параметров по значению-результату int A,B; void swap(int * x, int * y) { *x +=
- 29. Строгое vs нестрогое вычисление Строгое – фактические параметры полностью вычисляются до применения функции Нестрогое – не
- 30. Подстановка параметров по имени thunk – функция без параметров, вычисляющая значение фактического параметра Нестрогие параметры вычисляются
- 31. Подстановка параметров по имени Всегда выдаёт ответ, если он существует, так как не зацикливается, если зацикливается
- 32. Подстановка параметров по имени Всегда выдаёт ответ, если он существует, так как не зацикливается, если зацикливается
- 33. Подстановка параметров по необходимости То же, что и передача параметров по имени, но после первого вычисления
- 34. Функции обратного вызова (callback) Интеграл extern double sin(double x); extern double cos(double x); double Integral(double x1,
- 35. Функции обратного вызова (callback) Сортировка Упорядочить строки вещественной матрицы по значению скалярного произведения с вектором v;
- 36. План: Упрощение выражений Функции в процедуры Процедуры с одним параметром Стек, процедуры без параметров Переход по
- 37. 1. Упрощение выражений Цель: эксплицировать последовательность выполнения побочных эффектов в выражении Метод: разбить выражение на последовательность
- 38. Упрощение выражений
- 39. Результат float poly(float coef[], int n,float x) { float sum = 0f; float t1; int i;
- 40. 2. Функции в процедуры Любой вызов функции имеет вид float t = F(…); Метод: Добавление параметра,
- 41. Функции в процедуры
- 42. Функции в процедуры
- 43. Результат void poly(float coef[], int n,float x, float * res) { float sum = 0f; float
- 44. 3. Процедуры с одним параметром Метод: Все локальные данные процедуры собрать в структуру - фрейм Размещать
- 45. Процедуры с одним параметром (poly)
- 46. Процедуры с одним параметром (poly)
- 47. Процедуры с одним параметром (power)
- 48. Процедуры с одним параметром (power)
- 49. Процедуры с одним параметром (main)
- 50. Процедуры с одним параметром (poly)
- 51. Результат (1) void poly(struct polyFrame * f) { f->sum = 0f; for (f->i = 0; f->i
- 52. Результат (2) void main_helper( struct mainFrame * f) { struct polyFrame * a; new(a); a->coef =
- 53. 4. Стек, процедуры без параметров В каждой процедуре есть доступ только к одному фрейму Метод: в
- 54. Стек, процедуры без параметров struct polyFrame { float * coef; int n; float x; float *
- 55. Стек, процедуры без параметров (poly)
- 56. Результат (1) void poly() { f.poly->sum = 0f; for (f.poly->i = 0; f.poly->i n; f.poly->i++) {
- 57. Результат (2) void main_helper() { new(a.poly); a.poly->coef = f.main->binom; a.poly->n = 2; a.poly->x = 10.0; a.poly->res
- 58. 5. Без процедур От вызова процедуры остался только переход к выполнению телу Возврат зависит от того,
- 59. Без процедур struct polyFrame { float coef[]; int n; float x; float * res; float *
- 60. Без процедур
- 61. Результат (1) poly: f.poly->sum = 0f; for (f.poly->i = 0; f.poly->i n; f.poly->i++) { new(a.power); a.power->n
- 62. Результат (2) main_helper : new(a.poly); a.poly->coef = f.main->binom; a.poly->n = 2; a.poly->x = 10.0; a.poly->res =
- 63. Реализация вычисляемых меток (GCC) Расширение C: унарный оператор && - адрес метки; тип «метка»: void *
- 64. Реализация вычисляемых меток Для каждой процедуры известно множество меток возврата Метод: «Вычисляемая метка» имеет тип перечисления
- 65. Реализация вычисляемых меток struct polyFrame { float coef[]; int n; float x; float * res; float
- 66. Реализация вычисляемых меток
- 67. Реализация вычисляемых меток
- 68. Реализация вычисляемых меток
- 69. Перемещение кода void main() { float binom[] = {1,2,1}; new(a.main); a.main->binom = binom; a.main->parent = f;
- 70. 6. Реализация стека Более эффективный метод управления памятью, ориентированный на специфику времени жизни локальных объектов Все
- 71. Реализация стека
- 72. Выход из глубокой рекурсии procedure ReadEvalPrint; label ErrExit; function Eval(e : Expr) : integer; begin …
- 73. Выход из глубокой рекурсии (C) void ReadEvalPrint() { char s[256]; fputs(“Привет!”,stderr); for (;;) { fputc(‘>’,stderr); fgets(s,stderr);
- 74. Выход из глубокой рекурсии (C) void ReadEvalPrint() { char s[256]; int res; fputs(“Привет!”,stderr); for (;;) {
- 75. Код ошибки (1) #define EVAL_OK 0 #define EVAL_ERRDIV0 1 #define EVAL_ERROVERFLOW 2 int Eval(Expr e, long
- 76. Код ошибки (2) #define EVAL_OK 0 #define EVAL_ERRDIV0 1 #define EVAL_ERROVERFLOW 2 void ReadEvalPrint() { char
- 77. Нелокальные переходы #include int setjmp(jmp_buf env); запоминает обстановку вычислений и возвращает 0. void longjmp(jmp_buf env, int
- 78. Нелокальные переходы – пример (1) #include #define EVAL_OK 0 #define EVAL_ERRDIV0 1 #define EVAL_ERROVERFLOW 2 //данные
- 79. Нелокальные переходы – пример (2) #define EVAL_OK 0 #define EVAL_ERRDIV0 1 #define EVAL_ERROVERFLOW 2 //данные для
- 80. Нелокальные переходы Дают возможность обработки исключительных ситуаций setjmp, longjmp – не являются процедурами в обычном смысле
- 81. Классы памяти аuto - автоматическая память (умолчание, на практике не используется) static – глобальная по времени
- 82. Классы памяти (static) void PrintLine(char * s) { static int counter = 0; printf(“%d:\t%s\n”, counter ++,
- 83. Модули (static, extern) #define MAXDEPTH 128 static void * buffer[MAXDEPTH]; static int depth = 0; int
- 85. Скачать презентацию