2016-11-30 18 views
0

私は同じ問題の以前の投稿から回答を見つけようとしていますが、うまくいきません。以下は、私がチェックしたリンクのほんの数です:Cプログラミング:パラメータに不完全な型のエラーがあります

"parameter has incomplete type" warning C typedef: parameter has incomplete type How to resolve "parameter has incomplete type" error?

コード:

#include "listADT.h" 
#include "client.h" 
#include <stdlib.h> 
#include <stdio.h> 


struct node { 
    ClientInfo *data; // added pointer here 
    struct node * next; 
}; 

struct list_type { 
    struct node * front; 
    int size; 
}; 

ListType create() { 

    ListType listptr = malloc(sizeof(struct list_type)); 

    if (listptr != NULL) { 
     listptr->front = NULL; 
     listptr->size = 0; 
    } 
    return listptr; 
} 



void push(ListType listptr, ClientInfo item) { <--- error here 

    struct node *temp = malloc(sizeof(struct node)); 

    if (temp != NULL) { 
     temp->data = item; 
     temp->next = listptr->front; 
     listptr->front = temp; 
     (listptr->size)++; 
    } 
} 

int is_empty(ListType l) { 
    return l->size == 0; 
} 

int size_is(ListType l) { 
    return l->size; 
} 

void make_empty(ListType listptr) { 

    struct node* current = listptr->front; 

    while (current->next != NULL) { 
     destroy(listptr); 
     current = current->next;   
    } 

    (listptr->size)--; 

} 

void destroy(ListType listptr) { 
    struct node *temp = malloc(sizeof(struct node)); 
    temp = listptr->front; 
    listptr->front = listptr->front->next; 

    free(temp); 
    (listptr->size)--; 
} 

void delete(ListType listptr, ClientInfo item) { <--- error here 
    struct node* current = listptr->front; 
    struct node *temp = malloc(sizeof(struct node)); 

    while (current-> data != item) { 
     temp = current; 
     current = current->next;   
    } 

    temp->next = current->next; 
    (listptr->size)--; 
} 

int is_full(ListType l) { 

} 

ここでは、構造体CLIENTINFOは別のCファイルに含まれているものです

typedef struct ClientInfo { 
    char id[5]; 
    char name[30]; 
    char email[30]; 
    char phoneNum[15]; 
} ClientInfo; 

ここではエラーが表示されます:

listADT.c:41:40: error: parameter 2 (‘item’) has incomplete type 
void push(ListType listptr, ClientInfo item) { 
            ^
listADT.c:83:42: error: parameter 2 (‘item’) has incomplete type 
void delete(ListType listptr, ClientInfo item) { 

私はそれを修正する方法についてこの時点で絶対に失われています。私が含める必要がある他の情報があれば教えてください。

EDIT PORTION |

listADT.h:ClientInfo *itemClientInfo itemを変更した後

#ifndef LISTADT_H 
#define LISTADT_H 

typedef struct list_type *ListType; 
typedef struct ClientInfo ClientInfo; 

ListType create(void); 
void destroy(ListType listP); 
void make_empty(ListType listP); 
int is_empty(ListType listP); 
int is_full(ListType listP); 
void push(ListType listP, ClientInfo item); 
void delete(ListType listP, ClientInfo item); 
void printl(ListType listP); 

#endif 

エラー:

listADT.h:12:6: note: expected ‘ClientInfo * {aka struct ClientInfo *}’ 
but argument is of type ‘ClientInfo {aka struct ClientInfo}’ 
void push(ListType listP, ClientInfo *item); 
+0

@kaylumは、投稿する前に数秒前に追加しました。 :) – Jasmine

+1

"別のcファイルにあります"。それはうまくいかないでしょう。それは、それが使用されるすべてのCファイルで定義される必要があります。直接またはインクルードされたヘッダーファイルのいずれかです。 – kaylum

+0

また、パラメータを 'ClientInfo * item'に変更することもできます。 –

答えて

2

typedefは構造体CLIENTINFO CLIENTINFO。

これは前方宣言です。これは、後でclient.cファイルで完了する不完全な型の宣言です。しかし、ヘッダーファイルで前方宣言を使用するこの設計は、構造体の内容を非公開にします。

あなたのプログラム内の他のファイルは、構造体に含まれるものを知ることも、メンバーにアクセスすることもできません。それらのために、構造体はまだ不完全なので、この構造体型の変数を宣言することはできません。ただし、構造体へのポインタを宣言できます。

これは実際にCでオブジェクトのプライベートカプセル化を行う方法です。この概念は「不透明型」と呼ばれ、オブジェクト指向設計の優れた実践方法と考えられています。

問題を解決するには、代わりにClientInfo*ポインタで動作するように、 "client.h"と "client.c"のすべての関数を変更することができます。その後、ClientInfoを使用するすべてのファイルは、ポインタを使用する必要があります。その型のオブジェクトは宣言できないので、コンストラクタ(およびデストラクタ)を用意する必要があります。例:

ClientInfo* client_create (void) 
{ 
    return malloc(sizeof(ClientInfo)); 
} 
関連する問題