неверный аргумент типа type -> ’(есть« fd_set ») - PullRequest
0 голосов
/ 19 января 2019

Я знаю, что это не первый поток с этой ошибкой, но я действительно не могу понять, что не так ... Мой код ниже:

/* File descriptor sets */
struct descs {
    fd_set read;
    fd_set write;
    fd_set except;
};

typedef struct descs descs_t;

/* Server representation */
struct server {
    int                 sock;                   /* Server sock descriptor */
    struct sockaddr_in  addr;                   /* Server address */
    socklen_t           addrlen;                /* Server address size */
    char                buffer[BUFFER_SIZE];    /* Message buffer */
    int                 len;                    /* Message buffer length */
};

typedef struct server server_t;

void build_fds(struct server *srv, struct descs *fd) {
    FD_ZERO(fd->read);
    FD_SET(STDIN_FILENO, fd->read);
    FD_SET(srv->sock, fd->read);

    FD_ZERO(fd->write);
    // there is smth to send, set up write_fd for server socket
    if (srv->len > 0) {
        FD_SET(srv->sock, fd->write);
    }

    FD_ZERO(fd->except);
    FD_SET(STDIN_FILENO, fd->except);
    FD_SET(srv->sock, fd->except);
}

Я передаю свою структуру через указатель, поэтому я должен использовать-> но вылетает с ошибками:

chatcl.c: In function ‘build_fds’:
chatcl.c:37: error: invalid type argument of ‘->’ (have ‘fd_set’)
chatcl.c:38: error: invalid type argument of ‘->’ (have ‘fd_set’)
chatcl.c:39: error: invalid type argument of ‘->’ (have ‘fd_set’)
chatcl.c:41: error: invalid type argument of ‘->’ (have ‘fd_set’)
chatcl.c:44: error: invalid type argument of ‘->’ (have ‘fd_set’)
chatcl.c:47: error: invalid type argument of ‘->’ (have ‘fd_set’)
chatcl.c:48: error: invalid type argument of ‘->’ (have ‘fd_set’)
chatcl.c:49: error: invalid type argument of ‘->’ (have ‘fd_set’)
make: *** [chatcl] Error 1

Что не так в моем коде?

Ответы [ 2 ]

0 голосов
/ 19 января 2019

Вам не хватает &, т. Е. Вам нужен адрес структуры данных, например,

#include <sys/select.h>

struct descs {
  fd_set a;
};

void func(struct descs *d) {
  FD_ZERO(&d->a);
}
0 голосов
/ 19 января 2019

Из человек выбирает макросы FD_ *, на которые они указывают на fd_set:

   void FD_CLR(int fd, fd_set *set);
   int  FD_ISSET(int fd, fd_set *set);
   void FD_SET(int fd, fd_set *set);
   void FD_ZERO(fd_set *set);

Вы должны передавать указатели на функции (макросы), а не значения. Вы можете использовать оператор address-of :

FD_ZERO(&fd->read);
FD_SET(STDIN_FILENO, &fd->read);
FD_SET(srv->sock, &fd->read);

и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...