web-dev-qa-db-ja.com

ポインタ値をQStringに変換する方法は?

デバッグの目的で、私はしばしばポインタ値(主にthis)をqDebugに出力します。

qDebug("pointer of current object = 0x%08x",this);、フォーマット文字列として「%08x」を使用し、パラメータとしてthisを渡すだけです。

ポインタ値をQStringに変換するにはどうすればよいですか?

これは私がこれまでに得たものです:

char p = (char)this;
return QString("0x%1").arg(p, 8, '0');

しかし、コンパイラはその値をどうするかを理解していないようです。この場合、charへのキャストは正しいですか?または、これを行うためのより安全な方法は何でしょうか?

Qt4.7.4でのVisualC++の使用。

[〜#〜]編集[〜#〜]

提案どおりにqulonglongを使用する

qulonglong p = (qulonglong)this;
return QString("0x%1").arg(p, 8, '0');

コンパイラエラーメッセージ (error C2666) を生成します。

15
Martin Hennings

QString :: arg() の使用:

_MyClass *ptr = new MyClass();
QString ptrStr = QString("0x%1").arg((quintptr)ptr, 
                    QT_POINTER_SIZE * 2, 16, QChar('0'));
_

ポインタ(quintptrおよび_QT_POINTER_SIZE_)に正しいタイプとサイズを使用し、常に_"0x"_のプレフィックスを付けます。

注:
値の前にゼロを付けるには、4番目のパラメーターをQChar('0')にする必要があります。
正しい桁数を出力するには、_QT_POINTER_SIZE_を2倍にする必要があります(各バイトには2桁の16進数が必要なため)。

17
Ignitor

単にQString & QString::sprintf ( const char * cformat, ... )を使用してみませんか

QString t;
// QString::sprintf adds 0x prefix
t.sprintf("%08p", ptr);
13
Kamil Klimek

QTextStream は、求めている機能を提供しているように見え、void*で動作します。

const void * address = static_cast<const void*>(ptr);
QString addressString;
QTextStream addressStream (&addressString);
addressStream << address;
qDebug() << addressString;

他のアプローチとは異なり、特定の番号「8」や「qlonglong」へのキャストなどの概念は参照されません。それほど気にならないと思われ、 std :: stringの規定のメソッド(ただし、std::string変換を含まない)

4
HostileFork

sprintfを使用して中間ステップを実行できます。

QString pointer_to_qstring(void *ptr)
{
    char temp[16];
    sprintf(temp, "0x%08p", ptr);
    return QString(static_cast<char *>(temp));
}

またはostringstreamを介して:

QString pointer_to_qstring(void *ptr)
{
    std::ostringstream oss;
    oss << std::setw(8) << std::setfill('0') << std::hex << ptr:
    return QString(oss.str().c_str());
}

私にとっては、ほとんどの場合、ポインターがnullptrであるかどうか、または他のポインターと同じ値であるかどうかを確認するだけで十分です。そのような場合は、ポインタを数値に変換してからQString::number()を使用するだけで十分です。

Cat * cat = new Cat();
qDebug()<<QString::number((std::uintptr_t)(cat));;
0
newandlost