联合分配的不兼容类型错误

Posted

技术标签:

【中文标题】联合分配的不兼容类型错误【英文标题】:Incompatible types error for union assignment 【发布时间】:2018-04-21 22:38:25 【问题描述】:

一旦 XDR 联合由 svc_getargs() RPC 调用填充,我正在尝试将 XDR 联合分配给结构联合。但是,我在执行此操作时收到“类型不兼容”错误。我也试过 memcpy() 但也有同样的问题。下面是我的代码。感谢您的帮助。

struct data_str 
    struct svc_req *rqstp;
    SVCXPRT *transp;
    bool_t retval;
    xdrproc_t _xdr_result;
    //outputImage get_minified_image_1_res;
    //inputImage get_minified_image_1_arg;
    union 
        inputImage get_minified_image_1_arg;
     argument;
    bool_t (*local)(char *, void *, struct svc_req *);
;

static void
minify_image_program_1(struct svc_req *rqstp, register SVCXPRT *transp) 

    struct data_str *req_holder;
    union 
        inputImage get_minified_image_1_arg;
     argument;
    union 
        outputImage get_minified_image_1_res;
     result;
    xdrproc_t _xdr_argument, _xdr_result;
    bool_t (*local)(char *, void *, struct svc_req *);

    req_holder = malloc(sizeof(*req_holder));
    req_holder->rqstp = rqstp;
    req_holder->transp = transp;

    memset((char *) &argument, 0, sizeof(argument));
    if (!svc_getargs (transp, (xdrproc_t) _xdr_argument, (caddr_t) &argument)) 
        svcerr_decode(transp);
        return;
    
    req_holder->_xdr_result = _xdr_result;
    req_holder->argument = argument; // THIS IS WHERE I GET THE ERROR
    req_holder->local = local;
    return;

编辑: 更多的上下文。这适用于一个围绕远程过程调用 (RPC) 有两个部分的项目 - 第一个是单线程服务器,第二个是多线程服务器。上面的代码是第二部分,我试图修改 RPC 的自动生成的“svc”,使其具有老板-工人模式的多线程 (MT)。自动生成的文件非常适合单线程部分。但是对于 MT 部分,我需要从 Boss 线程中获取“argument”变量并将其提供给工作线程;然后工作线程从服务器获取所需的数据(缩小的图像)并返回给客户端。

【问题讨论】:

为什么工会只有一个成员? 你的工会未命名。 那个联合是由 rpcgen 生成的。我无法控制它。 发布的代码无法编译,原因包括缺少stdlib.hstring.h 头文件。联合缺少“标签”名称,没有原型:svc_getargs()svcerr_decode() @user3629249:那些 cmets 不是很有帮助。我们已经知道问题是什么,我们不需要 MVCE 来诊断或讨论它。这些 cmets 指出的东西并不是完整代码中的实际问题,因为它无疑定义了各种项目并包含必要的标题。 【参考方案1】:

两个没有标签的联合(或结构)被认为是不同的类型,即使它们有相同的声明。不同的联合(或结构)不兼容(在翻译单元内)。

要在多个地方使用同一个联合,先用标签声明它:

union MyTag  contents of union… ;

然后使用它的标签名称引用它,如union MyTag argument;

【讨论】:

以上是关于联合分配的不兼容类型错误的主要内容,如果未能解决你的问题,请参考以下文章

从“NSEntityDescription *”分配给“NSManagedObject Subclass*”的不兼容指针类型

指向分配给“NSInteger”(又名“int”)的整数转换的不兼容指针

从'NSInteger'(又名'int')分配给'NSString *'的不兼容整数到指针转换;

Athena - 具有不兼容数据类型的联合表

Mypy 错误 - 分配中的类型不兼容

使用 UItableViewCell 类型的表达式初始化“CustomCellView *”的不兼容指针类型