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またはスイッチ/ケースが必要です」と言っています

そして、関数ポインタを使用して if または switch/case ステートメントを置き換えることができることを何度も読んできましたが、関数ポインタが if または switch/case をどのように置き換えることができるか (この電卓の例でも) を理解できませんか?

if または switch/case を置き換える関数ポインタを視覚化する方法を教えてください。

4

3 に答える 3

5

電卓関数を複数回呼び出す必要がある場合は、どの関数を 1 回呼び出すかを決定し、必要な回数だけ呼び出す必要があります。

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

c = ptrFunc(a, b);
z = ptrFunc(x, y);
于 2012-04-12T19:05:31.300 に答える
4

彼はあなたにそれを置き換えてほしくない. 彼はあなたに正しい操作を選択するように書いてほしい.

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

     .
     .
     .
}
于 2012-04-12T19:05:57.980 に答える
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

于 2012-04-12T19:07:56.543 に答える