2012-10-17 3 views
0

Cela semble être un problème facile à résoudre, mais je fais quelque chose de mal. J'ai été à travers tous les threads similaires et n'a pas trouvé quelque chose qui a résolu mon problème, donc toute aide serait appréciée!Tableau de structures - Le tableau a un type d'élément incomplet (en C)

Fondamentalement: C programme, et j'essaye de créer un tableau de bufferevents.

#include <event2/listener.h> 
#include <event2/bufferevent.h> 
#include <event2/buffer.h> 

extern struct bufferevent bev[8]; 

//Then, my accept functions -- well, one of them... 
static void accept1(struct evconnlistener *listener, 
    evutil_socket_t fd, struct sockaddr *address, int socklen, 
    void *ctx) { 
    /* A new connection was received on this port */ 
    struct event_base *base = evconnlistener_get_base(listener); 
    bev[0] = bufferevent_socket_new(base, fd, BEV_OPT_CLOSE_ON_FREE); 

    /* Callback for when (*bufevent, data READ, data WRITTEN, event OCCURRED, *void) */ 
    bufferevent_setcb(bev[0], read1, NULL, echo_event_cb, NULL); 
} 

Lorsque je tente de compiler (AVEC -levent, je pourrais ajouter) je reçois cette erreur:

src/mix/mix1.c:57:34: error: array type has incomplete element type

Toutes les idées? :(

Note:. Je suis la définition des BufferEvents en dehors des principaux pour les rendre accessibles partout dans mon code sans les passer, j'ai d'autres #define est dans la région, donc je suis sûr que c'est quelque chose à voir avec la façon dont je « m de les construire ??

+0

Quelle ligne provoque l'erreur? – ouah

+0

Que dit la ligne 57 dans mix1.c? – harald

+0

Je peux voir que bev [0] est de type 'struct bufferevent' tandis que' bufferevent_socket_new' renvoie un pointeur sur 'struct bufferevent', et' bufferevent_setcb' prend aussi un pointeur comme paramètre. – SirDarius

Répondre

3

struct bufferevent est seulement déclarée comme un type incomplet dans les entêtes publics de Libevent, son contenu est caché aux utilisateurs de l'API publique Toutes les fonctions de Libevent qui fonctionnent sur BufferEvents prennent un pointeur à un bufferevent. , donc ce que vous voulez ici est

struct bufferevent *bev[8]; 

Notez en outre que vous ne voulez pas mettre extern sur cette déclaration ou vous obtiendrez une erreur de symbole indéfinie au moment de la liaison. Si ce n'est que dans que le fichier est mentionné, vous devez utiliser static à la place. Sinon, il devrait y avoir une déclaration avec extern dans l'une des en-tête de votre application fichiers en plus de la déclaration extern -less dans le fichier que vous avez montré.

+0

Ahhh, je vois! Ça a du sens. Cela a effectivement réglé mon problème. Je vous remercie!! (Aussi, j'étais confus au sujet de la signification de 'extern', alors merci de clarifier ... je suis retourné et relu à propos de ce modificateur.) –

Questions connexes