以下は、あなたが話しているものに最も近いものです。私はいくつかの変更を行いました(bool
の代わりにint
を使用しました)、NetworkDriver
構造体にもう1つの関数ポインタを追加し、関数にパラメータを追加しました。
しかし、NetworkDriver
の各インスタンスには独自のinitialize
機能が必要です。しかし、私がしたことは、initialize
関数を一度定義し、NetworkDriver
の各インスタンスにそれへのポインタがあることです。あなたが言っているものとまったく同じではありませんが、これは私が考えることができるものです。
dxibが答えたところでは、関数を明示的に呼び出す必要があります。私はC++
のコンストラクタのようなものではありません。また、呼び出す前に、構造内のこれらの関数ポインタに関数のアドレスを明示的に割り当てる必要があります。
#include<stdio.h>
#include<stdlib.h>
#define TRUE 1
#define FALSE 0
#define NO_ERR 10
#define NAME_ERR 11
#define INITIALIZED_ERR 12
typedef struct
{
char *name;
int initialized;
int32_t status;
int (*initialize)(void *, char *);
void (*disp_info)(void *); /* Note: one more func pointer */
}NetworkDriver;
/* Function prototype declarations */
int nd_init(void *ndr, char *name);
void nd_disp_info(void *ndr);
/* main: test NetworkDriver and nd_init */
int main(void)
{
NetworkDriver nd;
nd.initialized = FALSE;
nd.initialize = nd_init;
nd.disp_info = nd_disp_info;
if (nd.initialize(&nd, "foo")) { /* Initialize driver */
printf("Error: Initialization error\n");
exit(1);
}
nd.disp_info(&nd); /* display nd's info */
/* nd_init: initialize a NetworkDriver */
int nd_init(void *ndr, char *name)
{
NetworkDriver *nd;
nd = (NetworkDriver *) ndr;
if (!(nd->name = name)) {
nd->status = NAME_ERR;
return 1;
}
if (nd->initialized != TRUE) {
if (!(nd->initialized = TRUE)) {
nd->status = INITIALIZED_ERR;
return 1;
}
}
/* Successfully initialized */
nd->status = NO_ERR;
return 0;
}
/* nd_disp_info: display NetworkDriver info */
void nd_disp_info(void *ndr)
{
NetworkDriver *nd;
nd = (NetworkDriver *) ndr;
/* If this driver was not initialized without err */
if (nd->status != NO_ERR) {
printf("NetworkDriver was not initialized correctly\n");
return;
}
/* Print info */
printf("=== NetworkDriver info ===\n");
printf("Name: %s\n", nd->name);
printf("Initialized ? %s\n", nd->initialized == TRUE ? "TRUE" :
"FALSE");
printf("Status: %d\n", (int) nd->status);
}
出典
2016-07-01 02:13:38
sps
あなたはそれを呼び出すときに何をしなければならないのですか?それはどのような 'NetworkDriver 'のインスタンスを使用しているかをどのように知るでしょうか? – paddy
@paddy initalizeは、0または1のいずれかの整数を返します。0は、正常に初期化されていることを意味し、1は、それを意味しません。もし私がブールを初期化していないのであれば、ブールを正直にして、そうでなければ真実にしてください...そして、エラーがあればなぜ初期化しなかったのかというように、初期化のステータス番号を保存してください。 – amanuel2
"構造体で初期化された " - それは意味をなさないと思われる。構造体で初期化された 'name'をどのように定義しますか? – immibis