Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.79/14: Рейтинг темы: голосов - 14, средняя оценка - 4.79
avovana
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 88
1

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

14.10.2015, 14:45. Просмотров 2698. Ответов 10
Метки нет (Все метки)

Дорогие форумчане! Повторяю пример из книжки. До конца не понял его! Помогите разобраться!
Тема: односвязный линейный список. Плюс, использование рекурсий.

Дано:
1) Объявление структуры:

C++
1
2
3
4
5
struct Item
 {
 int info;
 Item* next;
 };
2) Функция обработки списка в прямом порядке:
C++
1
2
3
4
5
6
7
int visitor(link p, void f(link p))
{
 if (p == 0)
  return 0;
 f(p);
  visitor(p -> next, f);
}
Сказано, что сама функция f может быть обработчиком.
Вопрос - зачем ее передавать в качестве параметра???
Пробовал передать и так и эдак - компилятор ругается.

Этот нюанс не понял, функцию-обработчик f в качестве параметра не использовал и всё работает:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#include <iostream>
#include <conio.h>
 
using namespace std;
 
struct Item
 {
 int info;
 Item* next;
 };
 
typedef Item* link;       
 
void f(link p)           
{
cout << p -> info;        
}
 
int visitor(link p)
{
 if (p == 0)
  return 0;
 f(p);
  visitor(p -> next);
}
 
int main(void)
{
Item first;
Item second;
second.info = 2;
second.next = 0;
first.info = 1;
first.next = &second;
 
int k = visitor(&first);
 
getch();
return 0;
}
Выводит на экран 12
0
Лучшие ответы (1)
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.10.2015, 14:45
Ответы с готовыми решениями:

Передача функции в качестве параметра
#include &lt;iostream&gt; #include &lt;math.h&gt; using namespace std; double f(double x) { return...

Передача функции в качестве параметра
Как передать функцию с параметрами в transform? Т.е., например, мне надо из каждого числа вектора...

Передача CString в качестве параметра функции
Добрый всем вечер! Мучает один вопрос, на который не могу найти ответ. Как наилучшим образом...

Функции, передача массива в качестве параметра
Приветствую) Собственно, есть простенькое задание с двумерными массивами, оно выполнено: ...

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

10
nmcf
6535 / 5758 / 2622
Регистрация: 14.04.2014
Сообщений: 24,498
14.10.2015, 15:04 2
Что за книжка, какого года? Не времён Borland С++?
У тебя просто область видимости позволяет вызывать функцию напрямую, но вот 2 разные функции уже не вызовешь. А в примере подразумевается, что через visitor можно вызывать разные функции по содержанию, но с одинаковым прототипом.
0
avovana
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 88
14.10.2015, 15:15  [ТС] 3
nmcf
Лаптев " C++ (Экспресс курс)". Пишу в Borland'е, всё верно. Но он писал примеры для Borland'е 3.1.
У меня в Borland'е Builder 6.0 примеры работают.
Честно говоря пытаюсь вникну в Ваше объяснение, но пока никак...

Сейчас двоичное дерево пойдет и там опять такое определение...
0
nmcf
6535 / 5758 / 2622
Регистрация: 14.04.2014
Сообщений: 24,498
14.10.2015, 15:30 4
Лучший ответ Сообщение было отмечено avovana как решение

Решение

Вот так должно быть по-современному.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <functional>
 
int visitor(link p, function<void (link p)> ff)
{
 if (p == 0)
  return 0;
 ff(p);
  visitor(p -> next, ff);
}
 
void f(link p)           
{
cout << p -> info;        
}
C++
1
int k = visitor(&first, f);
Ну ты можешь несколько функций иметь: для вывода на экран, для изменения содержимого и т. п. И все они будут вызываться через единый visitor() - какую передашь в качестве параметра, та и будет использоваться.
1
14.10.2015, 15:30
avovana
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 88
14.10.2015, 15:42  [ТС] 5
nmcf
Спасибо! Понял, что можно выбирать функции. Понял суть.

Эта запись так и нее заработала (добавил #include <functional> вначале):
C++
1
function<void (link p)> ff
Зато я просто при вызове как у тебя написал:
C++
1
int k = visitor(&first, f);
И заработало!
До этого я при вызове по-разному пробовал - и функцию по адресу передать и параметр, всё вместе... Но написать просто "f" даже в голову не пришло!)
0
nmcf
6535 / 5758 / 2622
Регистрация: 14.04.2014
Сообщений: 24,498
14.10.2015, 15:43 6
2004 год? Возьми современную и выбрось древний Borland.

Точно заработало? Сделай ещё функцию с другим именем и попробуй её также использовать.
0
avovana
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 88
14.10.2015, 15:47  [ТС] 7
Здесь же, если можно, вопрос про стек при использование рекурсии.
Я, как понимаю, объекты структур не в стеке создал. И этот перебор - просто прыжки с адреса нынешнего объекта на другой. Где тут использование стека?

Добавлено через 29 секунд
nmcf, сейчас Qt начал изучать
0
nmcf
6535 / 5758 / 2622
Регистрация: 14.04.2014
Сообщений: 24,498
14.10.2015, 15:48 8
Ты просто передаёшь указатель на следующий объект списка и так до конца.
Ну сама рекурсия уже стек. Что тебя смущает?
0
avovana
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 88
14.10.2015, 15:52  [ТС] 9
Что я создал объект. Для него при компиляции выделилась память. Под каждое поле, по-моему, в т.ч. под указатель.

Я благодаря рекурсии просто прыгаю с объекта в объект, т.е. перебираю адреса в памяти, которые уже выделились. А стек же что-то динамическое
0
nmcf
6535 / 5758 / 2622
Регистрация: 14.04.2014
Сообщений: 24,498
14.10.2015, 15:58 10
У тебя всё в стеке, если внутри main() объявлено. А рекурсия просто просматривает объекты.
0
avovana
0 / 0 / 0
Регистрация: 08.09.2014
Сообщений: 88
14.10.2015, 16:02  [ТС] 11
Цитата Сообщение от nmcf Посмотреть сообщение
У тебя всё в стеке, если внутри main() объявлено. А рекурсия просто просматривает объекты.
Спасибо! Двигаюсь дальше)
0
14.10.2015, 16:02
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.10.2015, 16:02

Передача функции в качестве параметра в другую функцию
Задание стоит следующее: Написать программу, содержащую две функции. Первая функция, вычисляющая...

Передача функции с двумерным массивов в качестве параметра
Всем доброго времени суток. У меня проблема следующего плана. Есть некая функция void...

Передача двумерного массива указателей на char в качестве параметра функции
Есть массив char *result2; Нужно передать его в функцию void defDouble(???) в качестве одного из...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.