2012-04-12 2 views
0

Я задал вопрос здесь, на SO об использовании указателя функции и кто-то ответил давая пример классического калькулятораКак работает указатель функции?

float Plus (float a, float b) { return a+b; } 
float Minus (float a, float b) { return a-b; } 
float Multiply(float a, float b) { return a*b; } 
float Divide (float a, float b) { return a/b; } 

in some way you select your operation 

/* Here there should be an if or a switch/case that selects the right operation */ 
float (*ptrFunc)(float, float) = Plus; 

Теперь здесь он говорит, что «здесь должен быть, если или переключатель/случай, выбирает правильную операцию «

И прочитал много раз указатель функции может использоваться для замены if или switch/case, но неспособный понять (даже в этом примере калькулятора), как может быть указатель функции, если или переключатель/регистр?

Может ли кто-нибудь мне помочь, как визуализировать замену указателя на функцию if или switch/case.

+0

Можете ли вы ссылаться на другой вопрос? –

+0

http://stackoverflow.com/questions/7281820/where-can-we-use-function-pointers-in-c-what-uses-for-function-pointers –

+0

@CarlNorum вы можете сообщить мне, что это заявление float (* ptrFunc) (float, float) = Плюс; делаешь здесь? –

ответ

5

Если вам нужно вызвать функцию калькулятора более одного раза, вам нужно только решить, какую функцию вызывать один раз, а затем называть ее столько раз, сколько вам нужно.

if (something) { 
    ptrFunc = Plus; 
} else { 
    ptrFunc = Minus; 
} 

c = ptrFunc(a, b); 
z = ptrFunc(x, y); 
4

Он не хочет вас заменить, он хочет, чтобы вы, чтобы написать одну, чтобы выбрать правильную операцию:

float (*ptrFunc)(float, float); 
switch (something) 
{ 
    case 1: 
    ptrFunc = Plus; 
    break; 

    . 
    . 
    . 
} 
+0

Спасибо @Carl Norum, которые делают снимок для меня понятным. –

2

Рассмотрим что-то вроде этого:

typedef float (*op)(float a, float b); 

typedef struct { 
    char name; 
    op implementation; 
} operation; 

operation ops[] = { 
    { '+', Plus}, 
    { '-', Minus}, 
    { '*', Multiply}, 
    { '/', Divide} 
}; 

Когда вы прочтете свой ввод, вы найдете ops[n].name, который соответствует оператору, который вы получили от входа, и позвоните по телефону ops[n].implementation.

+0

Может быть сделано еще проще с массивом 'op' и назначенными инициализаторами à la' ['+'] = Plus, '. –

Смежные вопросы