Question

À des fins de débogage, j'ai souvent des valeurs de pointeur (principalement this) à qdebug:

qDebug("pointer of current object = 0x%08x",this);, en utilisant "% 08x" comme chaîne de format et en passant simplement this comme paramètre.

Comment puis-je convertir la valeur du pointeur en un QString?

C'est ce que j'ai obtenu jusqu'à présent:

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

Mais le compilateur ne semble pas comprendre quoi faire de cette valeur. Est à la recherche de char Correct dans ce cas? Ou quelle serait une façon plus sûre de faire cela?

Utilisation de Visual C ++ avec QT 4.7.4.

ÉDITER

Utilisant qulonglong Comme suggéré

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

donne un message d'erreur du compilateur (Erreur C2666).

Était-ce utile?

La solution

Utilisant Qstring :: arg ():

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

Il utilisera le type et la taille corrects pour les pointeurs (quintptr et QT_POINTER_SIZE) et préfixera toujours "0x".

Remarques:
Pour préfixer la valeur avec Zeros, le quatrième paramètre doit être QChar('0').
Pour produire le nombre correct de chiffres, QT_POINTER_SIZE doit être doublé (car chaque octet a besoin de 2 chiffres hexadécimaux).

Autres conseils

Pourquoi ne pas simplement utiliser QString & QString::sprintf ( const char * cformat, ... )

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

QTextStream semble offrir les fonctionnalités que vous recherchez et fonctionne simplement sur un void*.

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

Contrairement aux autres approches, il ne fait pas référence à des notions comme le nombre particulier "8" ou à la mise à "qlonglong". Semble moins inquiétant et ressemble beaucoup Méthode prescrite pour std :: chaîne (Mais sans obtenir std::string Conversions impliquées)

Vous pourriez faire une étape intermédiaire avec sprintf:

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

Ou à travers 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());
}

Pour moi, il suffit surtout de voir si le pointeur est le nullptrou s'il a la même valeur qu'un autre pointeur. Pour ces cas, il suffit de convertir le pointeur en un nombre, puis d'utiliser QString::number()

Cat * cat = new Cat();
qDebug()<<QString::number((std::uintptr_t)(cat));;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top