2012-04-12 11 views
0

Ich habe eine Frage hier auf SO über die Verwendung von Funktionszeiger und jemand hat geantwortet, was das Beispiel der klassischen RechnerWie Funktion Zeiger hier funktioniert?

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; 

er sagt „hier Hier fragte dort ein, wenn oder ein Schalter/Fall sein sollte, dass wählt die richtige Operation "

Und habe oft gelesen Funktion Zeiger kann verwendet werden, um zu ersetzen, wenn oder switch/case-Anweisung, aber nicht in der Lage zu verstehen (auch in diesem Rechner Beispiel) wie Funktionszeiger ersetzen kann oder Schalter/Fall?

Kann mir jemand helfen, wie visualisiere ich Funktionszeiger ersetzen, wenn oder Schalter/Fall.

+0

Können Sie mit der anderen Frage verknüpfen? –

+0

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

+0

@CarlNorum können Sie mich wissen lassen, was diese Aussage float (* ptrFunc) (float, float) = Plus; hier machen? –

Antwort

5

Wenn Sie die Taschenrechnerfunktion mehr als einmal aufrufen müssen, müssen Sie nur entscheiden, welche Funktion Sie einmal anrufen und dann so oft wie Sie möchten.

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

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

Er will Sie nicht zu es ersetzen, er möchte, dass Sie schreiben den richtigen Betrieb wählen:

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

    . 
    . 
    . 
} 
+0

Dank @Carl Norum, die das Bild für mich klar machen. –

2

Betrachten wir etwas wie folgt aus:

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

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

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

Während Sie Ihre Eingabe lesen, finden Sie die ops[n].name, die dem Operator entspricht, den Sie von der Eingabe erhalten haben, und rufen Sie ops[n].implementation.

+0

Konnte noch einfacher mit einem Array von 'op' und designierten Initiatoren à la' ['+'] = Plus, 'gemacht werden. –