Как callFunctionCall будет работать с использованием структуры FunctionCall - PullRequest
0 голосов
/ 10 мая 2019
#include <stdio.h>
#include "C:/MediaFiles/File/STUDY/P1/Structure Function Pointer/Manager.h"

void callFunctionCall_addFun(int a,int b);

void callFunctionCall_subsFun(int a,int b);

void callFunctionCall_divideFun(int a,int b);

void callFunctionCall_modeFun(int a,int b);

FunctionCall* FunctionCall_GetInterface(void);

FunctionCall callFunctionCall = 
{
    callFunctionCall_addFun,
    callFunctionCall_subsFun,
    callFunctionCall_divideFun,
    callFunctionCall_modeFun
};


FunctionCall* FunctionCall_GetInterface(void)
{
    printf("FunctionCall_GetInterface --> Called\n");
    return &callFunctionCall;
}

void callFunctionCall_addFun(int a,int b)
{
    printf("callFunctionCall_addFun --> Called\n");
    printf("Add of %d and %d is: %d\n",a,b,(a+b));
}

void callFunctionCall_subsFun(int a,int b)
{
    printf("callFunctionCall_subsFun --> Called\n");
    printf("Subtract of %d and %d is: %d\n",a,b,(a-b));
}

void callFunctionCall_divideFun(int a,int b)
{
    printf("callFunctionCall_divideFun --> Called\n");
    printf("Divide of %d and %d is: %d\n",a,b,(a/b));
}

void callFunctionCall_modeFun(int a,int b)
{
    printf("callFunctionCall_modeFun --> Called\n");
    printf("Mode of %d and %d is: %d\n",a,b,(a%b));
}

int main(void)
{
    FunctionCall *mainCall= FunctionCall_GetInterface();
    printf("%x\n",*mainCall);
    return 0;
}

и Manager.h

#include <stdint.h>

typedef struct FunctionCall{
    void (*addFun)(int a,int b);
    void (*subsFun)(int a,int b);
    void (*divideFun)(int a,int b);
    void (*modeFun)(int a,int b);
} FunctionCall;

1 Ответ

0 голосов
/ 10 мая 2019

struct FunctionCall может быть инициализирован четырьмя подходящими указателями на функции, как ваш код делает в глобальной переменной:

FunctionCall callFunctionCall = 
{
    callFunctionCall_addFun,
    callFunctionCall_subsFun,
    callFunctionCall_divideFun,
    callFunctionCall_modeFun
};

Вооружившись вашими функциями в main, вы можете вызвать любую из них:

mainCall->divideFun(10, 1);

1009 * дает *

Divide of 10 and 1 is: 10

Это позволит вам поменять местами то, что происходит для каждого из четырех указателей функций в структуре.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...