2017-09-07 5 views
0

In dem folgenden Code:initialisieren und Struktur-Parameter gelten Verwendung Funktionszeiger als Strukturelemente

#include <stdio.h> 
#include <stdlib.h> 

typedef struct{ 
    int a; 
    int b; 
    int (*func1)(); 
    int (*func2)(); 
}STR_X2; 
void init(STR_X2 self , int _a , int _b){ 
    self.a = _a; 
    self.b = _b; 
    printf("Init a:%d, b:%d \n",self.a,self.b); 
} 
int multiply(STR_X2 self){ 
    printf("Multiply a:%d, b:%d, res:%d\n",self.a,self.b,self.a*self.b); 
    return self.a*self.b; 
} 

int main(void) { 
    static STR_X2 val2; 
    val2.func1 = init; 
    val2.func2 = multiply; 

    printf("set values of a and b using init() function\n"); 
    val2.func1(val2,3,5); 
    printf("result:%d\n",val2.func2(val2)); 

    printf("\nset values of a and b directly\n"); 
    val2.a=3; 
    val2.b = 5; 
    printf("result:%d\n",val2.func2(val2)); 
    return EXIT_SUCCESS; 
} 

die Struktur STR_X2 zwei Mitglieder als Funktionszeiger hat.

  • func1 wird als init() und ses Werte des Parameters a und b.
  • func2 wird als multiply() und multipliziert das a und b

Durch den Code ausgeführt wird, ich habe folgendes Ergebnis:

set values of a and b using init() function 
Init a:3, b:5 
Multiply a:0, b:0, res:0 
result:0 

set values of a and b directly 
Multiply a:3, b:5, res:15 
result:15 

was bedeutet, die Parameter der Initialisierung mit func1() funktioniert nicht.
Kann mir jemand helfen, herauszufinden, was mit diesem Code nicht stimmt?
Danke

+1

Sie müssen 'STR_X2 *' als Funktionsparameter verwenden oder keiner dieser Code macht den geringsten Sinn. – Lundin

+0

Übrigens verstößt Ihr Code auf schreckliche Weise gegen die grundlegendste Regel von OOP, nämlich die private Kapselung. – Lundin

+0

Wenn Sie 'int (* func)()' ohne Argumente verwenden (d. H. 'Int (* multiply) (int, int)'), ist Ihr Code weniger sicher. Ich würde auch in Betracht ziehen, die "Instanz" innerhalb einer "Klasseninitialisierung" -Funktion zu initialisieren (Ihre "init" -Funktion, aber vielleicht anders benannt). Ich würde auch alle verschachtelten Funktionen 'static' machen, da auf sie nicht von außerhalb der Datei zugegriffen wird, sondern nur über das zugeordnete Objekt. – Myst

Antwort

1

Sie nehmen STR_X2 nach Wert in init und multiply - dies verursacht eine Kopie. Verwenden Sie stattdessen den Zeiger, um die static Instanz zu ändern, die Sie in main deklariert haben.