2
typedef struct node{
        int term;
        struct node *next;
}node;
typedef void(*PTR )(void *);
typedef void(*PTR1)(void *,int,int);
typedef int(*PTR2)(void *,int);
typedef void(*PTR3)(void *,int);
typedef void(*PTR4)(void *,void *,void *);

typedef struct list{
      node *front,*rear;
      PTR3 INSERT;
      PTR *MANY;
      PTR DISPLAY,SORT,READ;
      PTR4 MERGE;
}list;

void constructor(list **S)
{
    (*S)=calloc(1,sizeof(list));
    (*S)->front=(*S)->rear=NULL;
    (*S)->INSERT=push_with_value;
    (*S)->READ=read;
    (*S)->SORT=sort;
    (*S)->DISPLAY=display;    
    (*S)->MERGE=merger;    

    (*S)->MANY=calloc(2,sizeof(PTR));
    (*S)->MANY[1]=read; 


}
int main() 
{
    list *S1,*S2,*S3;
    constructor(&S1);
    constructor(&S2);
    constructor(&S3);

    S1->MANY[1](S1);
    S1->SORT(S1);
    S1->DISPLAY(S1);
    return 0;
}

そのvoid *ようなすべての関数のパラメーターは、関数内に型キャストさlist *れます。のような別の名前にS1->READIT;変更して呼び出す方法はありますか?MANY[1]READ_IT;

すべてのプログラムで使用できるように、共通のヘッダー ファイルを作成するつもりです。必要な関数ポインターの数がわからないので、各関数ポインター型の動的配列を作成するつもりです。

4

2 に答える 2

1
typedef struct list{
  node *front,*rear;
  PTR3 INSERT;
  PTR READIT;
  PTR DISPLAY,SORT,READ;
  PTR4 MERGE;
}list;

...

(*S)->READIT = read;

...

S1->READIT(S1);
于 2013-03-24T19:02:56.217 に答える
0

ここで定義されている(および以下の/参照されているファイル)、(二重にリンクされた) リストの Linux カーネル実装を見てください。それらはいたるところで使用されています。操作のほとんどはマクロで行われ、たとえば、リストのすべてのノードで操作を実行します。

定義しようとしているものが複雑になりすぎている場合は、一歩下がって、より単純な代替案を探してください。事前に一般化しないでください。一般化が使用されない場合、それは無駄です。後で何か (わずかに) 異なるものが必要になった場合、回避策や再実装が必要になるのは不十分な一致です。

C++ STL listによって公開されているインターフェイスを見てみましょう。これらの人々は、この問題について長い間真剣に考えてきました (ただし、設定は異なります)。

または、本格的な OOP が必要な場合は、弾丸をかじって C++ を使用してください。

于 2013-03-24T19:57:56.507 に答える