Frage

Zu Debugzwecken gebe ich oft Zeigerwerte aus (meistens this) zu qDebug:

qDebug("pointer of current object = 0x%08x",this);, indem Sie „%08x“ als Formatzeichenfolge verwenden und einfach übergeben this als Parameter.

Wie kann ich den Zeigerwert in einen QString konvertieren?

Das habe ich bisher bekommen:

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

Aber der Compiler scheint nicht herauszufinden, was er mit diesem Wert anfangen soll.Wirft nach char in diesem Fall richtig?Oder was wäre ein sichererer Weg, dies zu tun?

Verwendung von Visual C++ mit Qt 4.7.4.

BEARBEITEN

Benutzen qulonglong wie vorgeschlagen

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

führt zu einer Compiler-Fehlermeldung (Fehler C2666).

War es hilfreich?

Lösung

Verwenden von QString :: arg () :

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

Es wird der richtige Typ und die richtige Größe für Zeiger (quintptr und QT_POINTER_SIZE) verwendet und immer "0x" vorangestellt.

Hinweise:
Um dem Wert Nullen voranzustellen, muss der vierte Parameter QChar('0') sein.
Um die richtige Anzahl von Ziffern auszugeben, muss der QT_POINTER_SIZE verdoppelt werden (da jedes Byte 2 hexadezimale Ziffern benötigt).

Andere Tipps

Warum nicht einfach QString & QString::sprintf ( const char * cformat, ... ) verwenden?

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

QTextStream scheint die von Ihnen gesuchte Funktionalität zu bieten und funktionierteinfach auf einem void*.

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

Im Gegensatz zu den anderen Ansätzen bezieht es sich nicht auf Begriffe wie die bestimmte Zahl "8" oder das Casting auf "qlonglong".Scheint weniger besorgniserregend und ähnelt der vorgeschriebenen Methode für std :: string (allerdings ohne std::string-Konvertierungen)

Mit sprintf können Sie einen Zwischenschritt ausführen:

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

Oder über 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());
}

Für mich reicht es meistens aus zu sehen, ob der Zeiger der nullptror ist, wenn er den gleichen Wert wie ein anderer Zeiger hat.In diesen Fällen reicht es aus, den Zeiger in eine Zahl umzuwandeln und dann den QString::number() zu verwenden

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top