Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 04.06.2009, 23:21   #1
prikolist
Форумчанин
 
Аватар для prikolist
 
Регистрация: 18.06.2008
Сообщений: 350
Плохо Указатели на функцию.

Здравствуйте! Дайте пож. пояснение по вот этой строке:
Код:
void integral(double (*f)(double));
Не могу понять,тоесть описан указатель f этим double (*f), а после него почему ещё стоит double, что на что идёт указание?

И ещё по вот этому.
double func1(double x);
double func2(double x);

integral(&func1);
integral(&func2);
функция integral получает адресс чего?

Зараннее благодарен за ответ.
prikolist вне форума Ответить с цитированием
Старый 04.06.2009, 23:45   #2
Somebody
Участник клуба
 
Регистрация: 08.10.2007
Сообщений: 1,185
По умолчанию

Цитата:
Сообщение от prikolist Посмотреть сообщение
Код:
void integral(double (*f)(double));
Не могу понять,тоесть описан указатель f этим double (*f), а после него почему ещё стоит double, что на что идёт указание?
Указатель на функцию, принимающую 1 параметр типа double. Типа как далее по тексту: double func1(double).
Цитата:
Сообщение от prikolist Посмотреть сообщение
И ещё по вот этому.
double func1(double x);
double func2(double x);

integral(&func1);
integral(&func2);
функция integral получает адресс чего?
Получает адрес функции. То есть integral считает (скорее всего) интеграл функции, на которую передаётся указатель.
Somebody вне форума Ответить с цитированием
Старый 04.06.2009, 23:48   #3
ACE Valery
Сама себе режиссер
Старожил
 
Аватар для ACE Valery
 
Регистрация: 27.04.2007
Сообщений: 3,365
По умолчанию

Ну, судя по всему, в вашу функцию integral передается указатель на функцию, которая принимает переменную типа double и возвращает переменную типа double.
То есть в функцию integral можно передать любую функцию такого вида:
Код:
double Имя_функции(double)
Функция integral получает адрес функции, которую вы и передаете в функцию integral, то есть если вы пишите:
Код:
integral(&func1);
то в функцию integral попадет адрес функции func1

P.S. Опоздала... ^__^
Если я вас напрягаю или раздражаю, вы всегда можете забиться в угол и поплакать
ACE Valery вне форума Ответить с цитированием
Старый 05.06.2009, 14:40   #4
prikolist
Форумчанин
 
Аватар для prikolist
 
Регистрация: 18.06.2008
Сообщений: 350
По умолчанию

Спасибо всем за ответы. Подскажите пожалуйста. Вот код, ниже, какую роль играет вот эта строка,так как там уже указатель не f, а fx:
Код:
void integral(double (*fx)(double))
Желательно пару предложений,буду очень благодарен.
Вот из этого кода:

Код:
#include <vcl>
#include <cmath>
#include <iostream>
using namespace std;

double func1(double x);
double func2(double x);
void integral(double (*f)(double));

int main()
{
cout << "         -------Metod levyx priamoygolnikov------" << endl << endl;

integral(&func1);
integral(&func2);

system("pause");
return 0;
}

double func1(double x)
{
return ( 1 / sqrt(0.5*pow(x,2) + 1.5) );
}

double func2(double x)
{
return (x+1)*cos(x*x);
}

void integral(double (*fx)(double))
{
double a, b, h, x, xb, s;
int i, n;

cout << "\t Vvedite nishiy predel integrirovania \n ->  ";
cin >> a;

cout << "\t Vvedite verxniy predel integrirovania \n ->  ";
cin >> b;

cout << "\t Vvedite kolichestvo otrezkov \n ->  ";
cin >> n;

h = (b-a)/n;
s = 0;
xb = a;

for(i = 0; i < n; i++)
{
x = xb+i*h;
s = s + fx(x)*h;
}

cout << "\n Integral = " << s << endl << endl;
}

Последний раз редактировалось prikolist; 05.06.2009 в 14:43.
prikolist вне форума Ответить с цитированием
Старый 05.06.2009, 14:51   #5
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Ну вот вызываете вы integral. Внутри него считается интеграл. Но результат зависит от еще одной функции - исходной (fx). И чтобы не делать несколько реализаций функции integral, мы просто передаем ему адрес нужной функции.

Цитата:
какую роль играет вот эта строка,так как там уже указатель не f, а fx:
В первом случае мы просто объявляем функцию
Код:
void integral(double (*f)(double));
чтобы программа знала, что она существует. Имена параметров не имеют значения. Важен их тип.
Во втором случае:
Код:
void integral(double (*fx)(double))
мы описываем саму функцию. И имя переменной, указанной в заголовке, уже и будет использоваться в теле функции.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 05.06.2009, 15:13   #6
prikolist
Форумчанин
 
Аватар для prikolist
 
Регистрация: 18.06.2008
Сообщений: 350
По умолчанию

Скажите, указатель f указывает на func1, а указатель fx на func2 ?

Последний раз редактировалось prikolist; 05.06.2009 в 15:16.
prikolist вне форума Ответить с цитированием
Старый 05.06.2009, 15:18   #7
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от prikolist
Скажите указатель f указывает на func1, а указатель fx на func2 ?
Нет. Указатель fx указывает либо на func1, либо на func2, в зависимости от того, адрес какой из них был послан в функцию.
А f - это просто имя аргумента, указанное в заголовке функции при объявлении.
Чтобы вас это не сбивало, лучше вообще измените объявление на вот такое:
Код:
double func1(double x);
double func2(double x);
void integral(double (*fx)(double));
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 05.06.2009, 15:30   #8
prikolist
Форумчанин
 
Аватар для prikolist
 
Регистрация: 18.06.2008
Сообщений: 350
По умолчанию

Попробывал изменить fx на x, и результат один и тот же. Получается,что
Код:
void integral(double (*f)(double));
- это прототип функции
а затем
Код:
void integral(double (*fx)(double));
- и далее,её тело, - это описание этой функции.

Последний раз редактировалось prikolist; 05.06.2009 в 15:33.
prikolist вне форума Ответить с цитированием
Старый 05.06.2009, 15:32   #9
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Цитата:
Сообщение от prikolist
Попробывал изменить fx на x, и результат один и тот же.
Да, он и должен быть одним и тем же.
Цитата:
- это прототип функции
- это описание этой функции.
Да, именно об этом я и говорю.
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 05.06.2009, 15:34   #10
prikolist
Форумчанин
 
Аватар для prikolist
 
Регистрация: 18.06.2008
Сообщений: 350
По умолчанию

Всем большое спасибо.
prikolist вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C] массивы, указатели, двойные указатели. Iggel Общие вопросы C/C++ 5 05.05.2009 12:39
указатели Armina Общие вопросы C/C++ 4 22.04.2009 20:05
Указатели spirit0k Общие вопросы C/C++ 2 26.03.2009 15:16
Указатели Mango Помощь студентам 2 09.12.2008 12:15
Указатели Принц Общие вопросы C/C++ 2 08.06.2008 16:15