Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Genn55
372 / 219 / 41
Регистрация: 26.12.2012
Сообщений: 718
#1

Указатели на функции - C++

02.11.2013, 23:49. Просмотров 372. Ответов 6
Метки нет (Все метки)

Доброго всем времени суток.Помогите разобраться с указателями на функции.Вот мой код
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
55
56
57
#include <iostream>
#include <stdlib.h>
#include <Windows.h>
 
using namespace std;
//Прототипы функций
bool Funk_1 (int);//Функции сравнения
bool Funk_2 (int);//Функции сравнения
void Funk_1_1 ();//Подсказки
void Funk_2_2 ();//Подсказки
//Функция принимает указатели на функции
int oshibka (int,bool (*com_1)(int),void(*otv_1)(),bool (*com_2)(int)= false,void(*otv_2)()=false);
 
int main()
{
    system("chcp 1251 > nul");
int n,m;
    cout << "Введите число "<< "\n";
    cin >> n;
    n = oshibka (n,Funk_1,Funk_1_1,Funk_2);
    cout << "Введите число "<< "\n";
    cin >> m;
    m = oshibka (m,Funk_1,Funk_1_1);//Повторный вызов выдает ошибку
    cout << "     "<<n<<"   "<<m<<"\n";
return 0;
}
//Описания функций
int oshibka (int a,bool (*com_1)(int a),void(*otv_1)(),bool (*com_2)(int a),void(*otv_2)())
{
    while  (((*com_1)(a))||((*com_2)(a)))
     {
       cout  <<"    ОШИБКА!!!!           ОШИБКА!!!! "<< "\n";
       cout <<"        ПОВТОРИТЕ ВВОД!             "<< "\n";
    if ((*com_1)(a))
       (*otv_1)();
    else
       (*otv_2)();
       cin >> a;
     }
    return  a;
}
void Funk_1_1 ()
{
    cout <<  "Число не может быть меньше 1      "<<"\n";
}
void Funk_2_2 ()
{
    cout << "Число  не может быть больше 6           " <<"\n";
}
bool Funk_1 (int a)
{
    return a <= 0 ;
}
bool Funk_2 (int a)
{
    return a > 6 ;
}
Пока указатели не инициализировал код работал правильно.Нужно чтобы функция oshibka работала с различным числом принимаемых аргументов.Без указателей у меня все получается,а с указателями нет.Пожалуйста подскажите что я делаю не так.До меня не доходит как инициализировать указатели.Спасибо.

Добавлено через 1 минуту
Кампилятор ошибок не выдает,а программа завершается аварийно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.11.2013, 23:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Указатели на функции (C++):

Указатели на массивы. Указатели и функции - C++
Вот задача: Даны два массива : А и B. Необходимо создать третий массив, в котором нужно собрать: -Элементы обоих массивов; -Общие...

Указатели и массивы. Указатели и функции - C++
Никак не разберусь с указателями на функцию. Пишу в Visual Studio. Надо написать функцию Compress() с использованием указателей, которая...

Распечатать таблицы значений функций cox (x) и на отрезке [a; b] с шагом h, развив функции в ряд Тейлора и используя указатели на функции - C++
Распечатать таблицы значений функций cox (x) и на отрезке с шагом h, развив функции в ряд Тейлора и используя указатели на функции.

Указатели и указатели на указатели, а также типы данных - C++
Недавно начал изучать Си, перешел с Delphi. Много непонятного и пока процесс идет медленно. Накачал литературы, буду изучать) Щас...

Шаблонные функции и указатели на функции - C++
Помогите доделать и исправить... Задание: 1. Создать структуру Прямоугольник, с полями Высота и Ширина. Создать массив объектов типа...

Указатели и функции... - C++
Ребят.. у меня такой вопрос.. мне нужно сделать простенький массивчик ( одномерный) из n вещественных чисел. ввод n и элементов массива...

6
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,669
Записей в блоге: 5
03.11.2013, 00:17 #2
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
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <iostream>
#include <stdlib.h>
#include <Windows.h>
 
using namespace std;
//Прототипы функций
bool Funk_1 (int);//Функции сравнения
bool Funk_2 (int);//Функции сравнения
void Funk_1_1 ();//Подсказки
void Funk_2_2 ();//Подсказки
//Функция принимает указатели на функции
//значения указателя не стоит указывать как false, лучше 0 или nullptr (если поддерживается))
//но в коде нужно организовать проверки, я наскоро кривовато сделал и не вглядывался 
int oshibka (int,bool (*f1)(int),void(*otv_1)(),bool (*f2)(int)= 0,void(*otv_2)()=0);
//вообще лучше две перегруженные версии написать - ровнее будет выглядеть (имхо)
int main()
{
    system("chcp 1251 > nul");
int n,m;
    cout << "Введите число "<< "\n";
    cin >> n;
    n = oshibka (n,Funk_1,Funk_1_1,Funk_2);
    cout << "Введите число "<< "\n";
    cin >> m;
    m = oshibka (m,Funk_1,Funk_1_1);//Повторный вызов выдает ошибку
    cout << "     "<<n<<"   "<<m<<"\n";
system("pause");
return 0;
}
//Описания функций
int oshibka (int a,bool (*f1)(int a),void(*otv_1)(),bool (*f2)(int a),void(*otv_2)())
{
bool f2_val=false;
if(f2) f2_val =f2(a);
bool otv2_val=false;
 
    while  (f1(a)||f2_val)
     {
       cout  <<"    ОШИБКА!!!!           ОШИБКА!!!! "<< "\n";
       cout <<"        ПОВТОРИТЕ ВВОД!             "<< "\n";
    if (f1(a))
       otv_1();
    else
if(otv_2)otv_2();
else
       false;//тут просто повторил вашу логику но вызов void ничего не присваивает и 
    //по умолчанию false не задаёт никаких действий))
       cin >> a;
     }
    return  a;
}
void Funk_1_1 ()
{
    cout <<  "Число не может быть меньше 1      "<<"\n";
}
void Funk_2_2 ()
{
    cout << "Число  не может быть больше 6           " <<"\n";
}
bool Funk_1 (int a)
{
    return a <= 0 ;
}
bool Funk_2 (int a)
{
    return a > 6 ;
}
что делает не вгляделся, но уже не вылетает.
0
Genn55
372 / 219 / 41
Регистрация: 26.12.2012
Сообщений: 718
03.11.2013, 01:19  [ТС] #3
Да она не вылетает,но и не работает.Вот мой первоначальный вариант упрощенный.Все работает правильно.Это упрощенный код,а в самом коде много проверок и противоречивых с указателями работает,но при попытке собрать все проверки в одну функцию не получается.Как только инициализирую указатели программа вылетает.Если это не возможно тогда буду пробовать перегружать,но код получится гораздо больше.
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
#include <iostream>
#include <stdlib.h>
#include <Windows.h>
 
using namespace std;
 
bool Funk_1 (int);
void Funk_1_1 ();
bool Funk_2 (int);
void Funk_2_2 ();
int oshibka (int,bool (*com_1)(int),void(*otv_1)(),bool (*com_2)(int),void(*otv_2)()=0);
 
int main()
{
    system("chcp 1251 > nul");
    int n;
cout << "Введите число "<< "\n";
cin >> n;
 n = oshibka (n,Funk_1,Funk_1_1,Funk_2,Funk_2_2);
cout << "     "<<n<<"   "<<"\n";
return 0;
}
bool Funk_1 (int a)
{
    return a <= 0 ;
}
 
bool Funk_2 (int a)
{
    return a > 6 ;
}
int oshibka (int a,bool (*com_1)(int a),void(*otv_1)(),bool (*com_2)(int a),void(*otv_2)())
{
    while  (((*com_1)(a))||((*com_2)(a)))
{
    cout  <<"    ОШИБКА!!!!           ОШИБКА!!!! "<< "\n";
    cout <<"        ПОВТОРИТЕ ВВОД!             "<< "\n";
    if ((*com_1)(a))
    (*otv_1)();
    else
    (*otv_2)();
    cin >> a;
}
    return  a;
}
void Funk_1_1 ()
{
        cout <<  " Число не может быть меньше 1      "<<"\n";
}
void Funk_2_2 ()
{
        cout << "Число не может быть больше 6" <<"\n";
}
Мне не понятна эта конструкция

C++
1
2
3
4
5
[CPP]bool f2_val=false;
if(f2) f2_val =f2(a);
bool otv2_val=false;
 
    while  (f1(a)||f2_val)
[/CPP]
как будет проводится проверка на
C++
1
2
3
4
bool Funk_2 (int a)
{
    return a > 6 ;
}
это условие никогда не выполнится.И не могу сообразить как инициализировать
C++
1
void(*otv_2)()
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,669
Записей в блоге: 5
03.11.2013, 01:33 #4
Genn55, извините но просто не успеваю просмотреть логику. Налету увидел, что передаёте указатели, а значения по умолчанию - логические. Более того в месте вызова функций через указатели пытаетесь использовать сами указатели... Уверенно полагая что параметр в объявлении (в формальном параметре) передастся в точке вызова. А ведь Вы его передаете в первой переменной int a. Вот и вызывайте через объявленное в объявлениии указателя имя, но с фактическим параметром. Посмотрите что я написал.
А лучше либо typedef'ом эти имена упакуйте или просто напишите две версии функции используя перегрузку (с 3-мя и 5-ю) параметрами. Легче будет выглядеть.
зы а уж почему работает не так, то это не к вопросу о указателях на функции, а о логике самой программы. Посмотрите, что не не так или объясните, что хотите сделать.
1
Genn55
372 / 219 / 41
Регистрация: 26.12.2012
Сообщений: 718
03.11.2013, 02:03  [ТС] #5
IGPIGP я же только начинающий!С 3 или 5 я уже писал -получается,а вот с указателями буксую.А нужно ввести число с клавиатуры больше 0,но меньше 6.Если оно в этом интервале вывести на экран,если нет выдать сообщение об ошибке и подсказку и предложить повторить ввод.Если можно простенький примерчик с объяснением.Истина где то рядом не хватает самой малости.Спасибо.
0
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6503 / 3142 / 307
Регистрация: 04.12.2011
Сообщений: 8,669
Записей в блоге: 5
03.11.2013, 02:40 #6
Цитата Сообщение от Genn55 Посмотреть сообщение
IGPIGP я же только начинающий!С 3 или 5 я уже писал -получается,а вот с указателями буксую.
Начните с указателей на int. Указатели на функции это ещё рановато, с параметрами по умолчанию. Новичок такое придумать может, конечно, но.. Поступайте как знаете.
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <iostream>
#include <stdlib.h>
#include <Windows.h>
 
using namespace std;
//Прототипы функций
const int min_val = 0;
const int max_val = 6;
typedef bool (*Overfl)(int);
typedef void(*Overfl_mess)();
 
bool negativ_err (int);//Функции сравнения
bool maх_overfl(int);//Функции сравнения
void negativ_mess ();//Подсказки
void maх_overfl_mess ();//Подсказки
//Функция принимает указатели на функции
//значения указателя не стоит указывать как false, лучше 0 или nullptr (если поддерживается))
//но в коде нужно организовать проверки, я наскоро кривовато сделал и не вглядывался 
 
void oshibka (int& a, bool (*negativ_err)(int),void(*negativ_mess)(),Overfl maх_overfl= 0, Overfl_mess maх_overfl_mess =0);
//вообще лучше две перегруженные версии написать - ровнее будет выглядеть (имхо)
int main()
{
    system("chcp 1251 > nul");
int n,m;
    cout << "Введите число "<< "\n";
    cin >> n;
     oshibka (n,negativ_err,negativ_mess,maх_overfl,maх_overfl_mess);
    cout << "Введите число "<< "\n";
    cin >> m;
    oshibka (m,negativ_err,negativ_mess);//Повторный вызов выдает ошибку
    cout << "     "<<n<<"   "<<m<<"\n";
system("pause");
return 0;
}
//Описания функций
void oshibka(int& a, bool (*negativ_err)(int),void(*negativ_mess)(),Overfl maх_overfl, Overfl_mess maх_overfl_mess)
{
bool bad_input=false;
if(negativ_err(a)){
    negativ_mess ();
    bad_input=true;
}
if(maх_overfl && maх_overfl(a)){
maх_overfl_mess ();
bad_input=true;
}
if(bad_input ){
    if(maх_overfl){
cin>>a; 
oshibka(a, negativ_err, negativ_mess, maх_overfl, maх_overfl_mess);
    }else{
cin>>a; 
oshibka(a, negativ_err, negativ_mess);
    }
 
}
}
 
void negativ_mess ()
{
    cout <<  "Число не может быть меньше " << min_val << endl;
}
void maх_overfl_mess ()
{
    cout << "Число  не может быть больше " << max_val <<endl;
}
bool negativ_err (int a)
{
    return a <= 0 ;
}
bool maх_overfl (int a)
{
    return a > 6 ;
}
0
Genn55
372 / 219 / 41
Регистрация: 26.12.2012
Сообщений: 718
03.11.2013, 03:08  [ТС] #7
МММ-да.
1\main.cpp|13|error: stray '\365' in program|
1\main.cpp|15|error: stray '\365' in program|
1\main.cpp|20|error: stray '\365' in program|
1\main.cpp|20|error: stray '\365' in program|
1\main.cpp|28|error: stray '\365' in program|
1\main.cpp|28|error: stray '\365' in program|
1\main.cpp|37|error: stray '\365' in program|
1\main.cpp|37|error: stray '\365' in program|
1\main.cpp|44|error: stray '\365' in program|
1\main.cpp|44|error: stray '\365' in program|
1\main.cpp|45|error: stray '\365' in program|
1\main.cpp|49|error: stray '\365' in program|
1\main.cpp|51|error: stray '\365' in program|
1\main.cpp|51|error: stray '\365' in program|
1\main.cpp|68|error: stray '\365' in program|
1\main.cpp|76|error: stray '\365' in program|
1\main.cpp|13|error: expected initializer before '_overfl'|
1\main.cpp|15|error: expected initializer before '_overfl_mess'|
1\main.cpp|20|error: expected ',' or '...' before '_overfl'|
1\main.cpp||In function 'int main()':|
1\main.cpp|28|error: 'ma' was not declared in this scope|
1\main.cpp|28|error: expected ')' before '_overfl_mess'|
1\main.cpp|20|error: too few arguments to function 'void oshibka(int&, bool (*)(int), void (*)(), bool (*)(int))'|
1\main.cpp|31|error: at this point in file|
1\main.cpp|37|error: expected ',' or '...' before '_overfl'|
1\main.cpp||In function 'void oshibka(int&, bool (*)(int), void (*)(), bool (*)(int))':|
1\main.cpp|44|error: expected ')' before '_overfl'|
1\main.cpp|45|error: expected ';' before '_overfl_mess'|
1\main.cpp|45|warning: statement has no effect|
1\main.cpp|49|error: expected ')' before '_overfl'|
1\main.cpp|51|error: expected ')' before '_overfl'|
1\main.cpp|51|error: expected ')' before '_overfl_mess'|
1\main.cpp|37|error: too many arguments to function 'void oshibka(int&, bool (*)(int), void (*)(), bool (*)(int))'|
1\main.cpp|51|error: at this point in file|
1\main.cpp|68|error: expected initializer before '_overfl_mess'|
1\main.cpp|76|error: expected initializer before '_overfl'|
||=== Build finished: 33 errors, 1 warnings ===|
Вот это выдал.Попытаюсь разобраться.
0
03.11.2013, 03:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.11.2013, 03:08
Привет! Вот еще темы с ответами:

Указатели на функции - C++
Помогите,пожалуйста) Нужно продемонстрировать использование указателей на функции на ниже приведенном примере на всех имеющихся в ней...

Указатели на функции - C++
Разработать функцию fold, которая позволяет найти минимальный символ в массиве символов с использованием функции min. Функция fold получает...

указатели на функции - C++
люди прошу помогите разобраться с задачами ....1. Створити динамічний масив вказівників для збереження двовимірного масиву А у динамічній...

Функции указатели с++ - C++
Написать и протестировать функцию, возвращающую номер самого последнего элемента из массива, который совпадает с заданным с клавиатуры...


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

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

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