С++ Работа с указателями на функции, разными типами данных

241
03 марта 2018, 20:41

Здравствуйте. Согласно заданию, я создаю указатели на функции следующего вида:

int (*func1)(int *);
int (*func2)(int *, float *);
int (*func3)(void *);
float (*func4[N])(double, double, double);

Их нужно использовать для вызова функций, которые вычисляют значения выражений. Для последнего массива указателей на четвертую функцию нужно использовать switch(). Во время компиляции (в CodeBlocks) ошибок нет. А вот во время выполнения (после ввода индекса указателя в массиве указателей) программа выдаёт ошибку. Также непонятно, почему переменная с приобретает значение 0. Код:

#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstdlib>
using namespace std;
int func_a(int*);
int func_b(int*, float*);
int func_c(void*);
float func_H(double a, double b, double c)
{
    return 2 * a + 3 * b + 4 * c;
}
int main()
{
    const int N = 10;
    int (*func1)(int*);
    int (*func2)(int*, float*);
    int (*func3)(void*);
    float (*func4[N])(double, double, double);
    func1 = func_a;
    func2 = func_b;
    func3 = func_c;
    for (int i = 0; i < N; i++)
        func4[0] = func_H;
    double a, b, c, H;
    int x, x1;
    float x2, x3;
    int* px, *px1;
    float* px2;
    void* px3;
    px = &x;
    px1 = &x1;
    px2 = &x2;
    px3 = &x3;
    cout << "Введите значение x (int): ";
    cin >> x;
    cout << "Введите значение x1 (int): ";
    cin >> x1;
    cout << "Введите значение x2 (float): ";
    cin >> x2;
    cout << "Введите значение x3 (float): ";
    cin >> x3;
    a = (double)(*func1)(px);
    cout << "\nЗначение переменной a: " << a << endl;
    b = (double)(*func2)(px1, px2);
    cout << "\nЗначение переменной b: " << b << endl;
    c = (double)(*func3)(px3);
    cout << "\nЗначение переменной c: " << c << endl;
    int index = 0;
    cout << "\nВведите индекс указателя на функцию в массиве:";
    cin >> index;
    switch (index)
    {
        case 0:
            H = (*func4[0])(a, b, c);
            break;
        case 1:
            H = (*func4[1])(a, b, c);
            break;
        case 2:
            H = (*func4[2])(a, b, c);
            break;
        case 3:
            H = (*func4[3])(a, b, c);
            break;
        case 4:
            H = (*func4[4])(a, b, c);
            break;
        case 5:
            H = (*func4[5])(a, b, c);
            break;
        case 6:
            H = (*func4[6])(a, b, c);
            break;
        case 7:
            H = (*func4[7])(a, b, c);
            break;
        case 8:
            H = (*func4[8])(a, b, c);
            break;
        case 9:
            H = (*func4[9])(a, b, c);
            break;
        default:
            cout << "Значение индекса должно находится в интервале [0; 9]";
            break;
    }
    cout << "\nЗначение функции H: " << H << endl;
    system("pause");
    return 0;
}
int func_a(int* px)
{
    return (int) pow(*px, 2) + pow(*px, 3);
}
int func_b(int* px1, float* px2)
{
    return (int) log(abs(*px1)) - pow(*px2, 4);
}
int func_c(void* px3)
{
    int* Px3 = static_cast<int*>(px3);
    return (int) pow(cos(*Px3 - 4.0), 2);
}

Буду очень рада скорому фидбеку. (:

Answer 1

Может, не

for (int i=0; i<N; i++)
    func4[0]=func_H;

а

for (int i=0; i<N; i++)
    func4[i]=func_H;

?

READ ALSO
Как считать связный список из файла?

Как считать связный список из файла?

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

320
Настройка библиотек для CMake (Windows)

Настройка библиотек для CMake (Windows)

У меня такая проблема, что я не могу настроить cmake для данного проектаЯ так понимаю по сообщению:

297
Naming conventions в c++

Naming conventions в c++

Так как в c++ нет устоявшегося соглашения по поводу именования различных сущностей, то каждый выбирает свой способОднако всегда следует использовать...

244
QT QUdpSocket прием дейтаграммы broadcast

QT QUdpSocket прием дейтаграммы broadcast

В своей программе отправляю на устройство последовательность байт(68, 1, 0)Устройство отвечает последовательностью байт(68, 1, 0)

304