次の関数は、更新されたポインターをinsertSNode
挿入item
してs します。return
関数内ではinsertSnode
、異なるデータからの各データstruct
が適宜逆参照されます。
問題: (LINE 1)、(LINE 2)、(LINE 3)、(LINE 4)で コンパイラ エラーが発生し、次のエラー メッセージが表示されます。
「メンバー参照ベース タイプ 'void' は構造体または共用体ではありません。」
質問:
コンパイラ エラーを取り除くにはどうすればよいですか? 私ができない場合、代わりに、この状況と同じくらい関数を書くことで、より良い解決策がありますか? 型が多すぎるとしましょうstruct
(つまり、Type_A、Type_B など)。異なる型宣言で異なる関数を作成するのは非常に非効率的です。
*pListTypeA = (Type_A *) insertSnode(*pListTypeA, pPreTypeA, pTypeAItem, TYPEA);
*pListTypeB = (Type_B *) insertSnode(*pListTypeB, pPreTypeB, pTypeBItem, TYPEB);
*pListTypeC = (Type_C *) insertSnode(*pListTypeC, pPreTypeC, pTypeCItem, TYPEC);
// more assignments
insertSnode
意味:
void* insertSnode(void* pList, void* pPre, char* item, const int type) {
void *pNew;
if (TYPEA == type) {
pList = (Type_A*) pList;
pPre = (Type_A*) pPre;
pNew = (Type_A*) pNew;
} else if (TYPEB == type) {
pList = (Type_B*) pList;
pPre = (Type_B*) pPre;
pNew = (Type_B*) pNew;
} else (TYPEC == type) {
pList = (Type_C*) pList;
pPre = (Type_C*) pPre;
pNew = (Type_C*) pNew;
}
if (!(pNew = malloc(sizeof(*pList)))) {
printf(ERR_NOT_ENOUGH_MEMORY);
exit(EXIT_NOT_ENOUGH_MEMORY);
}
pNew->name = item; // compiler error: (LINE 1)
if (pPre == NULL) {
pNew->link = pList; // compiler error: (LINE 2)
pList = pNew;
} else {
pNew->link = pPre->link; // compiler error: (LINE 3)
pPre->link = pNew; // compiler error: (LINE 4)
}
return pList;
}
ノート:
参考までに: このコードは、型宣言に if ステートメントを使用せず、1 つの型 (Type_A など) だけで実行できました。したがって、型宣言以外に外部の問題がないことは誰もが知っています。