2012-01-16 13 views
10

डिबग प्रयोजनों के लिए मैं अक्सर उत्पादन सूचक मान (ज्यादातर this) qDebug रहे हैं:पॉइंटर मान को क्यूस्ट्रिंग में कैसे परिवर्तित करें?

qDebug("pointer of current object = 0x%08x",this);, प्रारूप स्ट्रिंग के रूप में "% 08x" का उपयोग और केवल एक पैरामीटर के रूप this गुजर।

मैं पॉइंटर मान को क्यूस्ट्रिंग में कैसे परिवर्तित कर सकता हूं?

यह मैं अब तक क्या मिला है:

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

लेकिन संकलक क्या है कि मूल्य के साथ क्या करना यह पता लगाने की प्रतीत नहीं होता। इस मामले में char कास्टिंग कर रहा है? या ऐसा करने का एक सुरक्षित तरीका क्या होगा?

क्यूटी 4.7.4 के साथ विजुअल सी ++ का उपयोग करना।

संपादित

एक संकलक त्रुटि संदेश (error C2666) में सुझाव दिया

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

पैदावार के रूप में qulonglong का उपयोग करना।

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()); 
} 
+0

का प्रयोग कर एक चार सूचक परिवर्तित गलत परिणाम का उत्पादन करेगा, के रूप में पात्रों केवल आठ बिट कर रहे हैं पर्याप्त है। इसके बजाय 'qulonglong' (या 'qulong' अगर आप 32-बिट सिस्टम पर हैं) आज़माएं। –

+0

आपको लगता है कि 'qDebug' क्या कर रहा है जब आप उस शाब्दिक स्ट्रिंग में प्रारूप विनिर्देशक के साथ पैरामीटर के रूप में' यह 'पास करते हैं? – AJG85

+0

ईमानदारी से: मेरे पास कोई सुराग नहीं है। मुझे पता है कि "% 08x" 8-बिट हेक्साडेसिमल मान का प्रतिनिधित्व करता है। –

उत्तर

10

एक अन्य समाधान (std::string रूपांतरण शामिल हो रही बिना हालांकि):

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

यह सही आकार और संकेत (quintptr और QT_POINTER_SIZE) के लिए प्रकार का उपयोग करेगा और हमेशा उपसर्ग जाएगा "0x"

संपादित करें:

शून्य के साथ मान को पूर्ववत करने के लिए, चौथे पैरामीटर को 'क्यूचर (' 0 ')' होना चाहिए। अंकों की सही संख्या को आउटपुट करने के लिए, QT_POINTER_SIZE को दोगुना करने की आवश्यकता है (क्योंकि प्रत्येक बाइट को 2 हेक्स अंकों की आवश्यकता होती है)।

+2

इसके बजाय quintptr का उपयोग करें? –

+0

@ पीटर टेंग हाँ, अच्छा सुझाव। मैंने जवाब संपादित किया। – Ignitor

+0

यह एक अच्छा Qt-ish तरीका है। मैंने उदाहरण को सही किया। –

2

आप sprintf साथ एक मध्यवर्ती कदम कर सकता है तलाशें, और सरल संचालित करें y void* पर।

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

अन्य तरीकों के विपरीत, यह विशेष संख्या "8" या कास्टिंग के लिए "qlonglong" की तरह विचार को संदर्भित नहीं करती। कम चिंताजनक लगता है, और भी बहुत prescribed method for std::stringकी तरह है

+0

आपको 'static_cast' या' c_str() 'की आवश्यकता नहीं है, मुझे विश्वास नहीं है। – AJG85

12

क्यों नहीं बस का उपयोग QString & QString::sprintf (const char * cformat, ...)

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

असल में, 'क्यूस्ट्रिंग()। स्पिंटफ ("% 08 पी", पीआरटी)' सबसे आसान तरीका प्रतीत होता है। प्रारूप 'पी' स्वयं '0x' बनाता है। –

+0

भूल गए कि क्यूटी सही तरीके से करता है;) सुनिश्चित नहीं है लेकिन वीसी प्रिंटफ कार्यान्वयन में 0x उपसर्ग –

+0

क्यूटी 5 अनुशंसा करता है [नए Qt में 'QString :: sprintf() 'और' QString :: asprintf() 'का उपयोग न करने की सिफारिश करता है कोड] (http://doc.qt.io/qt-5/qstring.html#asprintf)। – Ignitor

4

QTextStream कार्यक्षमता आप की पेशकश करने के लिए प्रकट होता है:

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

या ostringstream के माध्यम से:

0

मेरे लिए ज्यादातर यह देखने के लिए पर्याप्त है कि सूचक nullptr है या यदि यह अन्य सूचक के समान मूल्य है।उन मामलों के लिए यह एक नंबर करने के सूचक कन्वर्ट करने के लिए और फिर QString::number()

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

आपके उत्तर का आउटपुट हेक्साडेसिमल नहीं है ('Qxring :: संख्या()' में तर्क 16 का उपयोग करें, '0x' से शुरू नहीं है और शून्य-पैड नहीं है (' QString ("0x% 1") का उपयोग करें। तर्क (सूचक, लंबाई, 16, क्यूचर ('0')) ', जैसा कि @ इग्निटर के उत्तर में है)। –

+0

(मैं मानता हूं कि पैड किए गए हेक्साडेसिमल आउटपुट का उपयोग सूचक मानों की तुलना करने के लिए आवश्यक नहीं है। लेकिन हेक्स तुलना में स्ट्रिंग कम है क्योंकि स्ट्रिंग कम है। और मेरा डीबगर (वीएस2012) हमेशा हेक्स में पते प्रदर्शित करता है।) –

+0

यही वह है जो मैं कह रहा हूं। मेरे लिए हेक्स प्रारूप में जाना महत्वपूर्ण नहीं है और मुझे आश्चर्य है कि जिसने उन प्रश्नों को पूछा है, वह हेक्स प्रारूप की आवश्यकता है। – newandlost

संबंधित मुद्दे