0

D-Bus を介して通信する 2 つのプログラムがあります。1 つには 2 つのパラメーター、つまりconst char* dataandを受け取る関数がint sizeあり、別のパラメーターには 型の値を返す関数がありますunsigned char。このように最初のプログラムに関数呼び出しを配置し​​ますが、サイズが異なる [-Wint-to-pointer-cast] の整数からポインターへのキャストへfunction((char*)program2->function().value(), 1)の警告が表示されます。この警告を解決するにはどうすればよいですか? また、Qt ライブラリを使用しています。

編集:

実際には を受け取る関数で、 Qt によって提供されるコンストラクターの型のサイズと型const char*を受け入れるintにデータを追加し、他のプログラムは 0 ~ 255 の範囲の数値を返すことになっているため、. 私がしていることが間違っている場合、望ましい結果を得るための最良の方法は何ですか?QByteArrayconst char*intunsinged 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>();
    }

注:この質問の主な目的は、プロキシクラス内で定義された関数を呼び出して返された結果への参照を作成する方法を見つけることであり、QByteArrayそれを作成に受け入れられるものに変換する方法ではないため、QByteArrayまたはQtCoreなど。

4

3 に答える 3

3

必要なのはデータのアドレスです...次のようになります

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

一時変数の有効期間は完全な式の終わりまでなので、完全に安全です。これは、それを使用するのに十分な長さですfunction2

&残念ながら、右辺値で address-of 演算子を使用することはできません。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 Obvlios が行ったように、変数に名前を付けるのを避けるだけでも大変な作業です。


1そのポインターを後で保存しない限りfunction2、保存する場合は、ローカル変数を使用して値を保持するべきではありませんが、オブジェクトの有効期間には細心の注意を払ってください。

于 2014-05-01T23:05:14.397 に答える
1

あなたがしていることは安全だとは思いません。そのため、コードがまったく機能しない可能性があります。function() が「unsigned char」を返す場合、そのコピーを作成して返します。同時に、他の function() は「const char*」を取得しています。「char *」を返すように program2->function() を変更することをお勧めします。

于 2014-05-01T22:57:44.273 に答える
0

整数をポインターに変換することは、特に変換が必要な理由と正確に何をするかわからない場合は、あまり良い考えではありません。変換は不要のようで、キャスト警告を修正する代わりに、関数を適切に呼び出すためのソリューションが本当に必要です。あなたが提供したコードと説明から、呼び出しによって返された 1 バイトを に送信したいようですprogram2->function()。この関数によって返される値は右辺値であるため、そのアドレスを直接取得することはできません。代わりに、変数に格納してから、代わりにポインターを渡すことができます。以下のコードのようなもので、やりたいことができるはずです。

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