Comment convertir une valeur de pointeur en qstring?
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).
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 nullptr
ou 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));;