2016-11-30 3 views
0

Ich habe versucht, Antworten von früheren Posts meiner gleichen Ausgabe zu finden, aber es funktioniert nicht. Im Folgenden finden Sie nur einige der Links, die ich überprüft habe:C Programmierung: Parameter hat unvollständigen Typ Fehler

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

Code:

#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) { 

} 

Hier ist, was die Struktur Clientinfo in einer anderen c-Datei enthält:

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

Und hier ist der Fehler, den ich bekomme:

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) { 

Ich bin an diesem Punkt absolut verloren, wie es zu beheben ist. Bitte lassen Sie mich wissen, ob es noch weitere Informationen geben muss.

PORTION BEARBEITEN |

listADT.h:

#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 

Fehler nach dem Wechsel zu ClientInfo itemClientInfo *item:

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 nur ein paar Sekunden, bevor Sie gepostet! :) – Jasmine

+1

"in einer anderen c-Datei". Das wird nicht funktionieren. Es muss in jeder C-Datei definiert werden, in der es verwendet wird. Entweder direkt oder in einer enthaltenen Header-Datei. – kaylum

+0

Oder der Parameter kann zu 'ClientInfo * item' geändert werden. –

Antwort

2

typedef struct Clientinfo Clientinfo;

Dies ist eine Forward-Deklaration - eine Deklaration eines unvollständigen Typs, die später in Ihrer client.c-Datei vervollständigt wird. Dieser Entwurf mit einer Vorwärtsdeklaration in einer Headerdatei macht den Inhalt der Struktur jedoch privat.

Keine andere Datei in Ihrem Programm wird wissen, was die Struktur enthält, und sie werden auch nicht auf Mitglieder zugreifen können. Für sie ist die Struktur noch unvollständig und daher können sie keine Variablen dieses Strukturtyps deklarieren. Sie können jedoch Zeiger auf die Struktur deklarieren.

Dies ist tatsächlich, wie Sie private Kapselung von Objekten in C machen. Das Konzept heißt "undurchsichtiger Typ" und gilt als gute OO-Design-Praxis.

Was Sie tun können, um die Probleme zu beheben, ist, alle Funktionen in "client.h" und "client.c" zu ändern, so dass sie stattdessen mit ClientInfo* Zeigern arbeiten. Dann muss jede andere Datei, die ClientInfo verwendet, Zeiger verwenden. Da sie kein Objekt dieses Typs deklarieren können, müssen Sie einen Konstruktor (und Destruktor) bereitstellen. Zum Beispiel:

ClientInfo* client_create (void) 
{ 
    return malloc(sizeof(ClientInfo)); 
} 
Verwandte Themen