Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Указатели на функцию, Кто может привести простой пример 
:(
    Опции темы
AlanG
Дата 16.5.2006, 14:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.5.2006
Где: РашЫн ФидирейшЫн

Репутация: нет
Всего: нет



Всем доброго времени суток.
Народ приведите кто нибуть простенький пример с узателями на функцию.
Читаю книгу, все вроде понятно, а  с примерами там ни чего нет. 
PM MAIL   Вверх
Fazil6
Дата 16.5.2006, 14:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Код

void sort();   // имя ф-и ("sort") по сути и есть указатель на нее


typedef void (*FuncPointer)(); // новый тип указателя на функцию без возврата и без аргументов

FuncPointer func; //  func - переменная этого типа

func = &sort;  
  

Это сообщение отредактировал(а) Fazil6 - 16.5.2006, 15:49
PM MAIL   Вверх
threef
Дата 16.5.2006, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



Код

typedef double // это тип результата 
            (*math )// это имя типа указателя на функцию
             ( double) // это список типов параметров

void tabulator( math f, double start, double finish, double step)
{
     while(start<finish)
     {
            cout<<start<<",\t"<<f(start)<<'\n';
            start+=step;
      }
            cout<<finish<<",\t"<<f(finish)<<'\n';      
}

double myf(double x)
{
     if(x!=0.)
      return sin(x)/x;
     else return 0;
}

main()
{
     tabulator(sin, 0.90*3.14/180,  5*3.14/180); //0-90 градусов через 5 градусов
     tabulator(cos, 0.90*3.14/180,  5*3.14/180); //0-90 градусов через 5 градусов
     tabulator(myf, 0.90*3.14/180,  5*3.14/180); //0-90 градусов через 5 градусов

}
 
PM MAIL   Вверх
AlanG
Дата 16.5.2006, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.5.2006
Где: РашЫн ФидирейшЫн

Репутация: нет
Всего: нет



Мда smile . Сложновато разобратся без объяснений. 
PM MAIL   Вверх
likehood
Дата 16.5.2006, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


666
**


Профиль
Группа: Участник
Сообщений: 536
Регистрация: 21.12.2005

Репутация: 8
Всего: 24



Код

int f1(int n) {
    return n*n;
}
int f2(int n) {
    return 2*n;
}

void main()
{
    int  (*pf)(int); // pf - указатель на ф-ю, принимающую один параметр int и возвращую int
    pf = &f1;
    cout << pf(3) << endl; // выведется 9
    pf = &f2;
    cout << pf(3) << endl; // выведется 6, т.е. один и тот же код дает разный результат,
    // смотря на какую ф-ю указывает pf
}
 
PM MAIL   Вверх
nikitao
Дата 16.5.2006, 15:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кот-программист
***


Профиль
Группа: Завсегдатай
Сообщений: 1206
Регистрация: 30.8.2005
Где: Спб

Репутация: 1
Всего: 26



AlanG, лучше обьясни ,что тебе не понятно изходя из преведенных примеров. 


--------------------
Жизнь - печальная штука.
PM MAIL ICQ Skype GTalk   Вверх
AlanG
Дата 16.5.2006, 18:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.5.2006
Где: РашЫн ФидирейшЫн

Репутация: нет
Всего: нет



Цитата

void main()
{
    int  (*pf)(int); // pf - указатель на ф-ю, принимающую один параметр int и возвращую int
    pf = &f1;
    cout << pf(3) << endl; // выведется 9
    pf = &f2;
    cout << pf(3) << endl; // выведется 6, т.е. один и тот же код дает разный результат,
    // смотря на какую ф-ю указывает pf
}


Цитата

pf = &f1;

Указателю передается значение функции f1, при этом функция еще не вызывается, значит передается не значение, а что?
и далее  используется указатель, и соответсятвенно вызов функции? Но конструкция пока для меня  непонятная
Цитата

cout << pf(3) << endl; // выведется 9


 
PM MAIL   Вверх
bsa
Дата 16.5.2006, 18:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



& - это получение адреса в C (раздел указатели перечитай)
cout <<  - это конструкция из c++ - вывод чего либо в стандартный вывод

Добавлено @ 18:14 
Соответственно cout << f(3) << endl - выводит результат выполнения функции f с параметром 3, а затем символ конца строки (endl = "\n"). 
PM   Вверх
threef
Дата 16.5.2006, 18:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 27.10.2005
Где: Запорожье

Репутация: 9
Всего: 10



имя функции является одновременно ее адресом. Присвоив имя функции указателю на функцию ты можешь использовать этот указатель для вызова функции

Код

...
double (*pointer)(double); // указатель на функцию
pointer = sqrt; // получаем адрес sqrt
cout<<pointer(9); // вычисляем sqrt(9)

pointer=sin;
cout<<pointer(3.14/2); // вычисляем sin(PI/2) 

 
PM MAIL   Вверх
UnrealMan
Дата 16.5.2006, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 722
Регистрация: 30.3.2006

Репутация: 27
Всего: 32



Цитата(threef @  16.5.2006,  18:25 Найти цитируемый пост)
имя функции является одновременно ее адресом

Вот только если функция перегруженная... :-) 
PM MAIL   Вверх
MAKCim
Дата 16.5.2006, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

Репутация: 52
Всего: 207



Цитата

Вот только если функция перегруженная... :-)  

компилятор добавляет обычно к имени ф-ии некоторые данные исходя из параметров, посему если перегрузка выполнена правильно, ф-ия будет иметь уникальное имя а значит и адрес 


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
AlanG
Дата 17.5.2006, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 71
Регистрация: 11.5.2006
Где: РашЫн ФидирейшЫн

Репутация: нет
Всего: нет



Все понятно, спасибо smile .
Я все-таки решил поменять книгу, надеюсь что больше глупыми вопросами надоедать не буду smile . 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0534 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.