Механизм вызова функций для АСУб и ЭВМб. Тема 3-3

Содержание

Слайд 2

Темы лекции

Модульное программирование и функциональная декомпозиция
Использование функций в С++
Особенности передачи параметров
Сквозной пример

Темы лекции Модульное программирование и функциональная декомпозиция Использование функций в С++ Особенности
II

Слайд 3

Статическая память — это область памяти, выделяемая при запуске программы до вызова

Статическая память — это область памяти, выделяемая при запуске программы до вызова
главной функции (main) из свободной оперативной памяти для размещения глобальных и статических данных программы.
Автоматическая память — это область памяти, резервируемая при запуске программы до вызова главной функции (main) из свободной оперативной памяти и используемый в дальнейшем для размещения локальных данных.
Динамическая память — это совокупность блоков памяти, выделяемых из доступной свободной оперативной памяти непосредственно во время выполнения программы под размещение конкретных данных

Слайд 4

Автоматическая

Динамическая

Статическая
память

память

память

Направления роста памяти

Код программы около нуля

Автоматическая Динамическая Статическая память память память Направления роста памяти Код программы около нуля

Слайд 5

Стек

Автоматическая область памяти организована в форме стек
Стек поддерживается аппаратно центральным процессором
Слово “стек”

Стек Автоматическая область памяти организована в форме стек Стек поддерживается аппаратно центральным
(stack) можно перевести как “стопка”. Объекты добавляются на стек сверху и снимаются потом в обратном порядке.

Стек можно представить в виде трубки с подпружиненым дном, расположеной вертикально.
Верхний конец трубки открыт, в него можно добавлять, или, как говорят, заталкивать элементы

Слайд 6

Стек и функции

Одно из главных назначений стека — поддержка вызовов функций (подпрограмм).

Стек и функции Одно из главных назначений стека — поддержка вызовов функций

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

Слайд 7

Кадр стека

Кадр стека (stack frame) — часть стека, сформированный одним вызовом функции.
Кадр

Кадр стека Кадр стека (stack frame) — часть стека, сформированный одним вызовом
стека – механизм передачи аргументов и выделения временной памяти с использованием системного стека
Во время отладки отладчик позволяет “проходить” по кадрам стека вызовов, сформированных на данный момент. 
Кадр стека позволяет реализовать рекурсию

Слайд 9

Стек используется для:
Выделения и освобождения памяти под локальные переменные
Вызова функции call name
поместить

Стек используется для: Выделения и освобождения памяти под локальные переменные Вызова функции
в стек адрес команды, следующей за командой call
передать управление по адресу метки name
Возврата из функции
извлечь из стека адрес возврата address
передать управление на адрес address

Слайд 10

Стек используется для:

передачи параметров в функцию
соглашение о вызове:
расположение входных данных;
порядок передачи параметров;
какая

Стек используется для: передачи параметров в функцию соглашение о вызове: расположение входных
из сторон очищает стек;
etc
cdecl
аргументы передаются через стек, справа налево;
очистку стека производит вызывающая сторона;
результат функции возвращается через регистр EAX

Слайд 11

Организация автоматической памяти

void f_1(int a)
{
char b;
// ...
}
void f_2(double c)
{
int

Организация автоматической памяти void f_1(int a) { char b; // ... }
d = 1;
f_1(d);
// ...
}
int main(void)
{
double e = 1.0;
f_2(e);
// ...
}

Вызов main
Создание e
Вызов f_2
Создание c
Создание d
Вызов f_1
Создание a
Создание b
Завершение f_1
Разрушение b
Разрушение a
Завершение f_2
Разрушение d
Разрушение c
Завершение main
Разрушение e

Слайд 12

Передача параметров по значению

Вычисляются значения выражений, стоящие на месте фактических параметров
В стеке

Передача параметров по значению Вычисляются значения выражений, стоящие на месте фактических параметров
выделяется память под формальные параметры функции;
Каждому формальному параметру присваивается значение фактического параметра, при этом проверяются соответствия типов и при необходимости выполняются их преобразования.
В стек заносятся копии значений аргументов, и операторы функции работают с этими копиями. Доступа к исходным значениям параметров у функции нет, а, следовательно, нет и возможности их изменить.

Слайд 13

void swap (int a, int b) //передача параметра по значению
{
int r=a;
a=b;
b=r;
}
//вызов функции
int

void swap (int a, int b) //передача параметра по значению { int
x=1,y=5;
swap(x,y);
cout << "x = " << x << " y = " << y;

1

5

а

b

r

1

5

x

y

Слайд 14

Передача параметров по адресу

В стек заносятся копии адресов параметров, следовательно, у функции

Передача параметров по адресу В стек заносятся копии адресов параметров, следовательно, у
появляется доступ к ячейке памяти, в которой находится фактический параметр и она может его изменить.

Слайд 15

void swap (int* a, int* b) //передача по адресу (с помощью указателей)
{
int

void swap (int* a, int* b) //передача по адресу (с помощью указателей)
r=*a;
*a=*b;
*b=r;
}
//вызов функции
int x=1,y=5;
swap(&x,&y);
cout << "x = " << x << " y = " << y;;

&x

&y

а

b

r

1

5

x

y

Слайд 16

void swap (int& a, int& b) //передача по адресу (с помощью ссылки)
{
int r=a;
a=b;
b=r;
}
//вызов

void swap (int& a, int& b) //передача по адресу (с помощью ссылки)
функции
int x=1,y=5;
swap(x,y);
cout << "x = " << x << " y = " << y;;

&x

&y

а

b

r

1

5

x

y

Слайд 17

Передача массивов в функции

Когда массив используется в качестве аргумента функции, передается только

Передача массивов в функции Когда массив используется в качестве аргумента функции, передается
адрес массива, а не копия всего массива.
При вызове функции с именем массива в функцию передается указатель на первый элемент массива. Надо помнить, что в С++ имена массивов без индекса - это указатели на первый элемент массива.
Параметр должен иметь тип, совместимый с указателем. Имеется три способа объявления параметра, предназначенного для получения указателя на массив. Но все три метода объявления параметра приводят к одинаковому результату - указателю.

Слайд 18

Передача массивов в функции. Первый способ

Передача массивов в функции. Первый способ

Слайд 19

Передача массивов в функции. Первый способ

Формальный параметр может быть объявлен как массив.

Передача массивов в функции. Первый способ Формальный параметр может быть объявлен как

Хотя параметр num объявляется как целочисленный массив из десяти элементов, С++ автоматически преобразует его к целочисленному указателю, поскольку не существует параметра, который мог бы на самом деле принять весь массив.
Передается только указатель на массив, поэтому должен быть параметр, способный принять его.

Слайд 20

Передача массивов в функции. Второй способ

Следующий способ состоит в объявлении параметра для

Передача массивов в функции. Второй способ Следующий способ состоит в объявлении параметра
указания на безразмерный массив, как показано ниже:
void display(int num[])
{
int i;
for (i=0; i<10; i++) printf("%d ", num[i]);
}
где num объявлен как целочисленный массив неизвестного размера. Поскольку С++ не предоставляет проверку границ массива, настоящий размер массива не имеет никакого отношения к параметру (но, естественно, не к программе). Данный метод объявления также определяет num как целочисленный указатель.

Слайд 21

При передаче массивов более высоких измерений только первое измерение может быть открыто,

При передаче массивов более высоких измерений только первое измерение может быть открыто,
в то время как другие должны быть известны во время компиляции.
const unsigned int DIM1 = 3;
const unsigned int DIM2 = 5;
void func(int ary[DIM1][DIM2]) { ... } // (1)
void func(int ary[][DIM2]) { ... } // (2)

Передача многомерного массива в функцию

Слайд 22

Передача массивов в функции. Третий способ

Через указатель
void display(int *num)
{
int i;
for (i=0;

Передача массивов в функции. Третий способ Через указатель void display(int *num) {
i<10; i++) printf ("%d ", num[i]);
}
Он допустим, поскольку любой указатель может быть индексирован с использованием [ ], если он является массивом.

Слайд 23

#include
using namespace std;
long InputMatrix(int *matrix ,int Height ,int Weight);
void main(){
const

#include using namespace std; long InputMatrix(int *matrix ,int Height ,int Weight); void
int sHeight = 6;
const int sWeight = 6;
int mat[sHeight][sWeight] = {};
//Вызов функции
InputMatrix(&mat[0][0],sHeight,sWeight);}

Передача многомерного массива в функцию

Имя файла: Механизм-вызова-функций-для-АСУб-и-ЭВМб.-Тема-3-3.pptx
Количество просмотров: 50
Количество скачиваний: 0