Как выполнять арифметические операции с указателями функций?

Итак.. Я понимаю, что если я возьму (*ptr) как некоторую функцию f, то

res = (*ptr)(a,b) is the same as res = f(a,b). 

Итак, теперь моя проблема в том, что мне нужно читать 3 целых числа. Первые 2 - операнды, третий - оператор, например. 1 = add, 2 = subtract, 3 = multiply, 4 = divide. Как мне это сделать без операторов if или switch.

Я думал о двух возможных решениях

  1. создать 4 указателя и уважать каждый указатель на арифметическую операцию, но с этим мне все еще нужно выполнить какую-то проверку ввода, которая потребует операторов if или switch

  2. На самом деле это не решение, но основная идея, вероятно, понравится. если c = оператор, то я могу как-то сделать что-то вроде res = (*ptrc)(a,b), но я не думаю, что для C есть такой синтаксис

Пример ввода

1 2 1

1 2 2

1 2 3

1 2 4

Пример вывода

 3

-1

 2

 0 

Мой код:

#include <stdio.h>

//Datatype Declarations
typedef int (*arithFuncPtr)(int, int);


//Function Prototypes
int add(int x, int y);


int main()
{
    int a, b, optype, res;

    arithFuncPtr ptr;

    //ptr points to the function add
    ptr = add;

    scanf("%i %i", &a, &b);

    res = (*ptr)(a, b);

    printf("%i\n", res);

    return 0;
}

int add(int x, int y)
{
    return x+y;
}

person CHEWWWWWWWWWW    schedule 04.09.2015    source источник
comment
чтобы проверить это, мне придется использовать оператор if. я пытаюсь найти способ проверить, какой это оператор без оператора if.   -  person CHEWWWWWWWWWW    schedule 04.09.2015
comment
Как насчет того, чтобы создать массив указателей на функции и вызвать соответствующую индексированную функцию с небольшим творческим подходом в зависимости от выполняемой вами операции? (op-1, где op — нужная вам операция, а массив указателей функций включает сложение, вычитание, умножение и деление адресов функций соответственно.)   -  person WhozCraig    schedule 04.09.2015


Ответы (1)


Вы можете поместить указатели функций в массив.

#include <stdio.h>

//Datatype Declarations
typedef int (*arithFuncPtr)(int, int);


//Function Prototypes
int add(int x, int y);
int sub(int x, int y);
int mul(int x, int y);
int div(int x, int y);

int main()
{
    int a, b, optype, res;

    arithFuncPtr ptr[4];

    //ptr points to the function
    ptr[0] = add;
    ptr[1] = sub;
    ptr[2] = mul;
    ptr[3] = div;

    scanf("%i %i %i", &a, &b, &optype);

    res = (ptr[optype - 1])(a, b);

    printf("%i\n", res);

    return 0;
}

int add(int x, int y)
{
    return x+y;
}  

int sub(int x, int y)
{
    return x-y;
}  

int mul(int x, int y)
{
    return x*y;
}  

int div(int x, int y)
{
    return x/y;
}  
person Joël Hecht    schedule 04.09.2015
comment
тогда могу я спросить, в чем смысл определения типа int(*arithFuncPtr)(int, int); линия? очевидно, это домашнее задание: P спасибо за помощь :) - person CHEWWWWWWWWWW; 04.09.2015
comment
хорошо, неважно, я видел его использование в коде. огромное спасибо! На самом деле я уже написал этот код без arithFuncPtr ptr[4]. должно быть перепутали с typedef. не так ясно об этом. - person CHEWWWWWWWWWW; 04.09.2015
comment
Круто, я то же самое написал. Чтобы предотвратить выход за пределы и без ifs, вы можете использовать операцию по модулю. Вот моя версия, не стоит делать для нее еще один ответ. - person Can; 04.09.2015