0

我有两个通过 D-Bus 进行通信的程序。在其中一个函数中,有一个接受两个参数的函数,const char* dataint size另一个函数中,我有一个返回 type 值的函数unsigned char。我在这样的第一个程序中放置了一个函数调用,function((char*)program2->function().value(), 1)但是我得到了从不同大小的整数 [-Wint-to-pointer-cast] 转换为指针的警告。我应该如何解决这个警告?我也在使用 Qt 库。

编辑:

实际上在接受 的函数中const char*int我将数据附加到QByteArray接受const char*的 a 和 Qt 提供的构造函数中的类型大小,int另一个程序应该返回 0-255 范围内的数字,因此unsinged char. 如果我所做的是错误的,那么获得预期结果的最佳方法是什么?

还调用 program2->function 调用以下内容:

inline QDBusPendingReply<uchar> type()
    {
        QList<QVariant> argumentList;
        return asyncCallWithArgumentList(QLatin1String("type"), argumentList);
    }

这个类有一个名为 value() 的函数,它调用:

inline typename Select<0>::Type value() const
    {
        return argumentAt<0>();
    }

注意:我这个问题的主要目的是找到一种方法来创建对调用代理类中定义的函数的返回结果的引用,而不是如何将其转换为可以接受的东西以创建 aQByteArray所以请停止添加不相关的标签,例如QByteArrayQtCore等等。

4

3 回答 3

3

你需要的是数据的地址......看起来像

function2(& program2->function().value(), 1);

并且将是完全安全的,因为临时变量的生命周期是直到完整表达式的结尾,这足够长1可以function2使用它。

不幸的是,您不能&在右值上使用地址运算符。但是有一个解决方法,因为您可以将左值引用绑定到右值,并且无论如何const您都想要一个指向数据的指针:const

template<T>
const T* get_addr(const T& v) { return &v; }

function2( get_addr(program2->function().value()), 1 );

如果您得到有符号与无符号的不匹配,请尝试

function2( get_addr<char>(program2->function().value()), 1 );

当然,这是为了避免给变量命名,就像Captain Obvlious 所做的那样,需要做很多工作。


1除非function2保存该指针以供以后使用,但如果保存了,那么您也不应该使用局部变量来保存该值,而是要非常注意对象的生命周期。

于 2014-05-01T23:05:14.397 回答
1

我不认为你在做什么是安全的,因此你的代码可能根本不起作用。如果你的 function() 返回一个“unsigned char”,它会复制它并返回它。同时,您的其他函数()正在使用“const char *”。我建议修改您的 program2->function() 以返回“char *”。

于 2014-05-01T22:57:44.273 回答
0

将整数转换为指针并不是一个好主意,特别是如果您不知道为什么需要进行转换以及它究竟做了什么。看起来甚至不需要转换,您确实需要一个解决方案来正确调用该函数,而不是修复强制转换警告。从您提供的代码和描述看来,您希望将调用返回的单个字节发送到program2->function(). 由于此函数返回的值是一个右值,因此您不能直接获取它的地址。相反,您可以将其存储在变量中,然后将指针传递给该变量。像下面的代码这样的东西应该可以让你做你想做的事。

char value = program2->function();
function(&value, 1);
于 2014-05-01T23:04:36.733 回答