Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 1
Регистрация: 01.02.2014
Сообщений: 46

Указатель на функцию, С++

09.11.2014, 23:13. Показов 782. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите.
Не могу корректно передать указатель на функцию.
Возникает ошибка при вызове функции F.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
void main ()   {
    int a = 1, b = 8;
    double precision[] = { 0.01, 0.001, 0.0001 };
 
    void F(int, int, double *, double(*)(int, int, int));
    double F1(int, int, int);
    double F2(int, int, int);
    
    F(a, b, precision, F1);
}
void F(int a, int b, double* precision, double(*f)(int, int, int)) { ... }
double F1(int a, int b, int m) { ...  }
double F2(int a, int b, int m) { ...  }
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
09.11.2014, 23:13
Ответы с готовыми решениями:

Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив)
Изучаю c++ по одной книжке.Она говорить не умеет.. Так вот понадобилось написать функцию,которая как параметр получает указатель на...

В функцию-метод передать указатель на другую функцию-метод и вызвать через переданный указатель
Друзья! Всем привет. Вот код: class otets { public: void f (void (otets::*p)()); private: void echo_f (){}; ...

Функция, получающая указатель на обычную функцию, получает указатель на метод класса
Здравтсвуйте. Имеется вопрос по указателям на методы класса. Допустим, есть функция( f ), которая принимает указатель на функцию и...

14
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,531
Записей в блоге: 1
09.11.2014, 23:16
ни одного указателя на функцию не вижу.
0
1 / 1 / 0
Регистрация: 14.10.2014
Сообщений: 25
09.11.2014, 23:17
Прототип, куда собираетесь передавать:
C++
1
int func(int (*func_ptr)());
Вызов
C++
1
func(other_func);
Где other_func - имя функции, которую вы хотите передать.
Пример:
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
41
42
43
44
45
46
47
48
49
#include <iostream>
 
// Прототипы функций
void main_func(void (*)());
// Главное, чтобы функции, которые будут передаваться по указателю,
// имели общий вид прототипа (тип возвращаемого значения и тип принимаемых
// параметров)
void f1();
void f2();
void f3();
 
int main()
{
    const int N = 3;
 
    // Массив указателей на функции с общим прототипом
    // Сразу инициализируется соответствующими функциями
    void (*func_arr[N])() = {f1, f2, f3};
 
    // В цикле передаём основной функции элементы нашего массива
    for (int i = 0; i < N; ++i)
        main_func(func_arr[i]);
 
    return 0;
}
 
// Основная функция просто вызывает переданную
void main_func(void (*f)())
{
    // Есть два способа вызова. Традиционный и с явным указанием того,
    // что вызывается функция, переданная по указателю.
    // (*f)();
    f();
}
 
void f1()
{
    std::cout << "Call f1..." <<std::endl;
}
 
void f2()
{
    std::cout << "Call f2..." <<std::endl;
}
 
void f3()
{
    std::cout << "Call f3..." <<std::endl;
}
так понятнее, только сам сделай, на основе моей программы
1
0 / 0 / 1
Регистрация: 01.02.2014
Сообщений: 46
09.11.2014, 23:24  [ТС]
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
ни одного указателя на функцию не вижу.
Можно так записать.
Но ошибка все равно возникает.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
#include <conio.h>
#include <math.h>
 
void main ()   {
    int a = 1, b = 8;
    double precision[] = { 0.01, 0.001, 0.0001 };
 
    double(*f)(int, int, int);
 
    void F(int, int, double *, double(*)(int, int, int));
    double F1(int, int, int);
    double F2(int, int, int);
    
    f = F1;
    F(a, b, precision, f);
}
void F(int a, int b, double* precision, double(*f)(int, int, int)) { ... }
double F1(int a, int b, int m) { ...  }
double F2(int a, int b, int m) { ...  }
Добавлено через 2 минуты
Цитата Сообщение от DocTorGold Посмотреть сообщение
так понятнее, только сам сделай, на основе моей программы
Я находил тему с твоим сообщением прежде чем написать, но что то не получилось
0
1 / 1 / 0
Регистрация: 14.10.2014
Сообщений: 25
09.11.2014, 23:26
Цитата Сообщение от Анжей Посмотреть сообщение
Я находил тему с твоим сообщением прежде чем написать, но что то не получилось
не понимаю тогда, в чем проблема может быть.......
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12925 / 6793 / 1819
Регистрация: 18.10.2014
Сообщений: 17,190
09.11.2014, 23:35
Цитата Сообщение от Анжей Посмотреть сообщение
Возникает ошибка при вызове функции F.
Никаких ошибок в приведенном вами коде нет, за исключением пресловутого 'void main' и странной манеры включать какой-то <conio.h>.

Поэтому показывайте реальный код, а не этот кривой эскиз, написанный на коленке. И давайте более осмысленное описание ошибки.
1
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
09.11.2014, 23:39
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Никаких ошибок в приведенном вами коде нет,
а это?
Цитата Сообщение от Анжей Посмотреть сообщение
C++
1
2
3
void F(int, int, double *, double(*)(int, int, int));
    double F1(int, int, int);
    double F2(int, int, int);
описание функций внутри main
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12925 / 6793 / 1819
Регистрация: 18.10.2014
Сообщений: 17,190
09.11.2014, 23:56
Цитата Сообщение от ValeryS Посмотреть сообщение
описание функций внутри main
Это никогда не было ошибкой. Объявление функции является обыкновенным объявлением, ничем не отличающимся от объявления переменной. Его можно писать везде, где разрешены объявления, в том числе и внутри других функций.

Определения функций нельзя вкладывать, а неопределяющие объявления - пожалуйста. Никакой ошибки в этом нет.

C++
1
2
3
4
5
6
7
int main()
{
  int i = 3, foo(int), a[5] = {};
  a[2] = foo(i);
}
 
int foo(int i) { return i; }
0
0 / 0 / 1
Регистрация: 01.02.2014
Сообщений: 46
10.11.2014, 00:04  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Никаких ошибок в приведенном вами коде нет, за исключением пресловутого 'void main' и странной манеры включать какой-то <conio.h>.
Поэтому показывайте реальный код, а не этот кривой эскиз, написанный на коленке. И давайте более осмысленное описание ошибки.
Блин, или я глючу или Visual Studia.
Почистил код, передача функции корректно работает, но уже precision в функцию не передается.
Так что скорее всего я

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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <stdio.h>
#include <conio.h>
#include <math.h>
#include <locale.h>
 
void main ()   {
    setlocale(LC_CTYPE, "Russian");
 
    int a = 1, b = 8;
    double precision[] = { 0.01, 0.001, 0.0001 };
 
    void Integral(int, int, double *, double(*)(int, int, int));
    double MethodOfRectangles(int, int, int);
    double MethodOfTrapezoids(int, int, int);
        
    printf("\n 1. Расчет по формуле прямоугольников\n");
    Integral(a, b, precision, MethodOfRectangles);
 
    printf("\n\n 2. Расчет по формуле трапеций\n");
    Integral(a, b, precision, MethodOfTrapezoids);
 
    _getch();
}
double Fun(double x){
    return  log(x) - 5.*cos(x);
}
double MethodOfRectangles(int a, int b, int m){
    double result = 0;
    double  h = (double)(b - a) / m;
    
    for (int i = 1; i <= m; i++)
        result += Fun(a + h * i - h / 2); 
 
    return result *= h;
}
double MethodOfTrapezoids(int a, int b, int m){
    double result = 0;
    double  h = (double)(b - a) / m;
 
    for (int i = 0; i < m; i++)
        result += Fun(a + h * i) + Fun(a + h * (i + 1));
 
    return result *= h/2;
}
void Integral(int a, int b, double* precision, double(*f)(int, int, int)){
    for (int i = 0; i < (sizeof(precision) / sizeof(precision[0])); i++){
        int m = 2;
        while (fabs(f(a, b, m - 1) - f(a, b, m))>precision[i])
        {
            m++;
        }
        printf("\n Значение интеграла = %f, с точностью %g получено за %i проходов", f(a, b, m), precision[i], m);
    }
}
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12925 / 6793 / 1819
Регистрация: 18.10.2014
Сообщений: 17,190
10.11.2014, 00:06
Цитата Сообщение от Анжей Посмотреть сообщение
sizeof(precision) / sizeof(precision[0])
Ну здрасьте!

Такой метод определения размера массива применим только к массивам, т.е. к объектам типа 'T[N]'. А у вас внутри 'Integral' параметр 'precision' - это указатель. С указателем такой номер не пройдет.

Это внутри 'main' вы можете сделать 'sizeof(precision) / sizeof(precision[0])' и получить размер массива, ибо внутри 'main' 'precision' еще является массивом. А внутри 'Integral' это уже делать поздно.

Если вы хотите, чтобы ваша функция 'Integral' могла принимать массивы 'precision' разного размера, то размер массива придется передавать снаружи

C++
1
2
3
void Integral(int a, int b, double* precision, int np, double(*f)(int, int, int)){
    for (int i = 0; i < np; i++){
...
а в 'main' уж можете делать

C++
1
Integral(a, b, precision, sizeof precision / sizeof *precision, MethodOfRectangles);
1
0 / 0 / 1
Регистрация: 01.02.2014
Сообщений: 46
10.11.2014, 00:09  [ТС]
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Такой метод определения размера массива применим только к массивам, т.е. к объектам типа 'T [N]'. А у вас 'precision' - это указатель. С указателем такой номер не пройдет.
Это внутри 'main' вы можете сделать 'sizeof(precision) / sizeof(precision[0])' и получить размер массива, ибо внутри 'main' 'precision' еще является массивом.
Блин, точно. Я на передаче функции зациклился, а это просто из main скопировал.

Спасибо.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
10.11.2014, 21:41
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
Это никогда не было ошибкой. Объявление функции является обыкновенным объявлением, ничем не отличающимся от объявления переменной.
действительно
сейчас проверил на двух компиляторах это не ошибка
Но я же помню мне говорил компилятор, и не один "объявление не возможно"
может быть я писал так
C++
1
 fnc(void);
в смысле вызывал
но я не понимаю, а в чем сакраментальный смысл описывания функции внутри функции???
пускай формально это не является ошибкой
Но Зачем???
0
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12925 / 6793 / 1819
Регистрация: 18.10.2014
Сообщений: 17,190
10.11.2014, 21:58
Цитата Сообщение от ValeryS Посмотреть сообщение
Но Зачем???
Тут нет никакого "сакраментального смысла". В языках С и С++ существуют общие правила объявления имен, которые [почти] одинаковы для всех типов имен: переменных, массивов, функций, типов и т.д. Поэтому функции, как и переменные, можно объявлять везде.

Поэтому вопроса "зачем функции" тут нет. Никто для них индивидуально такую возможность не вводил. Оно просто так само собой получилось. Функции просто идут вместе со всеми по общим правилам.

Поэтому спросить тут можно не "зачем ввели такую возможность", а скорее "почему не запретили такую возможность". И естественный ответ: а зачем? Зачем запрещать такую возможность, если она, образно выражаясь, каши не просит, компиляторов не усложняет и никому не мешает? Если она вам не нужна или не нравится - просто не пользуйтесь ею.
0
Модератор
Эксперт по электронике
8978 / 6744 / 921
Регистрация: 14.02.2011
Сообщений: 23,854
10.11.2014, 22:21
TheCalligrapher,
знаешь как говорил Попандопала" А что я в тебя такой влюбленный?"
Это маленькое признание в любви, но в языке ты петришь больше чем я
Я прикладник
Но
Цитата Сообщение от TheCalligrapher Посмотреть сообщение
образно выражаясь, каши не просит, компиляторов не усложняет
лично мне это бросилось в глаза
и мне показалось это ошибкой, хотя признаюсь был не прав
По образованию я электронщик, а там такого нет "что не запрещено, то разрешено"
посему и спрашиваю
Цитата Сообщение от ValeryS Посмотреть сообщение
а в чем сакраментальный смысл описывания функции внутри функции???
понимаю что ТС это не интересно, посему предлагаю переместится в личку, и вообще"дружить домами"
0
Почетный модератор
Эксперт С++
 Аватар для SatanaXIII
5851 / 2862 / 392
Регистрация: 01.11.2011
Сообщений: 6,906
11.11.2014, 08:27
Цитата Сообщение от ValeryS Посмотреть сообщение
предлагаю переместится в личку, и вообще"дружить домами"
Я вам перемещусь. Всем интересно.

Только лямбды не вспоминайте.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.11.2014, 08:27
Помогаю со студенческими работами здесь

Указатель на функцию, которая принимает в качестве параметра указатель на массив
я не понимаю. вроде делаю правильно, но выходит ошибка. есть функция. int foo(int *mas){}; cоздаю на нее указатель. int...

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

Передача умного указателя в функцию принимающую указатель на указатель
Итак имеется функция со следующим параметром: HRESULT __stdcall Function(SomeClass **param); В случае, когда создаём обычный...

Передать в неуправляемую функцию указатель на указатель
Неуправляемая функция типа FUNC(int ** r); Делаю так fixed (int* ptr = arr) { FUNC((int **)ptr); ...

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


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка. Рецензия / Мнение Это мой обзор планшета X220 с точки зрения школьника. Недавно я решила попытаться уменьшить свой. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru