【问题标题】:Error "Conversion to non-scalar type requested"错误“请求转换为非标量类型”
【发布时间】:2019-01-22 02:49:57
【问题描述】:

我正在尝试使用线程池并使用 select 来实现多线程服务器,因此我在全局范围内声明了 fd_set set,并将其传递给线程池运行的函数。我收到此错误

在函数“threadF”中请求转换为非标量类型 fd_set set1=(fd_set) s;

代码是这样的

pool *createPool(int size){
    /*...*/
    if((err=pthread_create(&id,NULL,&threadF,(void *)&set))!=0){
        fprintf(stderr,"thread\n");
        exit(errno);
    }
    /*...*/
}

void *threadF(void* s){
    fd_set set1=(fd_set) s;
    /*...*/
}

也许我忘记了什么?

【问题讨论】:

  • @Lundin 通常是一个结构体。
  • 这是选择 man7.org/linux/man-pages/man2/select.2.html 我没有声明任何 fd_set 结构但使用了已经预定义的结构
  • 你必须在某处声明set。无论如何,我很确定原因如发布的答案中所述。
  • 显示类型声明。
  • 简单地将fd_set set, rdset;声明为全局变量

标签: c multithreading select server threadpool


【解决方案1】:

标量类型 是算术类型(正则变量)和指针的正式名称。与之相反的是聚合类型,即数组和结构。编译器认为您正在从标量 s 转换为其他值。简而言之:不要从指针转换为结构实例。

标量s 是一个指针,但您将它转换为一个结构类型,而不是一个指向结构的指针(这是您传递给pthread_create 的)。试试:

fd_set* set1 = (fd_set*)s;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-12-01
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多