类型参数“->”无效(具有“ fd_set”)

时间:2019-01-19 09:45:32

标签: c struct

我知道这不是出现此错误的第一个线程,但是我真的无法理解是什么错误...我的代码在下面:

\v

我正在通过指针传递结构,因此我必须使用/* 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); } ,但是它因错误而崩溃:

->

我的代码有什么问题?

2 个答案:

答案 0 :(得分:3)

您缺少&,即您需要数据结构的地址,例如

#include <sys/select.h>

struct descs {
  fd_set a;
};

void func(struct descs *d) {
  FD_ZERO(&d->a);
}

答案 1 :(得分:2)

man select的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);

以此类推。