2017-09-07 6 views
0

を関数ポインタを使用して構造パラメータを適用:初期化し、次のコードでは構造部材として

#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; 
} 

関数ポインタのような2つの部材を有するSTR_X2構造を。

  • func1はパラメータabinit()とSES値として設定されています。 func1()動作しませんを使用してパラメータを初期化する意味

    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 
    

  • func2multiply()として設定し、コードを実行することによりab

を乗算され、私は次の結果を持っています。
誰でもこのコードの何が間違っているかを知る手助けをすることができますか?
ありがとう

+1

関数のパラメータとして 'STR_X2 *'を使用する必要があります。あるいは、このコードのどれもがほとんど意味を持ちません。 – Lundin

+0

あなたのコードはひどくOOPの最も基本的なルール、すなわちプライベートカプセル化に違反しています。 – Lundin

+0

'int(* func)()'を引数なしで使用すると、コードが安全になりません。私はまた、 "クラス初期化"関数(あなたの 'init'関数内で"インスタンス "を初期化することを検討しますが、多分異なる名前を付けました)。また、ファイルの外側からアクセスされないので、ネストされた関数を 'static'にすることもできます。割り当てられたオブジェクトを介してのみアクセスする必要があります。 – Myst

答えて

1

あなたはinitmultiplyに値でSTR_X2をとります。これによりコピーが作成されます。代わりにmainで宣言したstaticインスタンスを変更するには、ポインタを使用します。

関連する問題