سؤال

لأغراض تصحيح الأخطاء، غالبًا ما أقوم بإخراج قيم المؤشر (في الغالب 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 الصحيح في هذه الحالة؟أو ما هي الطريقة الأكثر أمانًا للقيام بذلك؟

استخدام Visual C++ مع Qt 4.7.4.

يحرر

استخدام qulonglong كما هو مقترح

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

ينتج في رسالة خطأ مترجم (خطأ C2666).

هل كانت مفيدة؟

المحلول

استخدام 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".

ملحوظات:
لبادئة القيمة بالأصفار، يجب أن تكون المعلمة الرابعة QChar('0').
لإخراج العدد الصحيح من الأرقام، QT_POINTER_SIZE يحتاج إلى المضاعفة (لأن كل بايت يحتاج إلى رقمين سداسي عشري).

نصائح أخرى

لماذا لا تستخدم ببساطة QString & QString::sprintf ( const char * cformat, ... )

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

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 التحويلات المعنية)

يمكنك القيام بخطوة وسيطة مع 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));;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top