OpenCV की कक्षा cv::Mat में at नाम का एक टेम्प्लेट सदस्य फ़ंक्शन है:

//definition of at 
template<typename _Tp> inline const _Tp& Mat::at(int i0, int i1) const{
  // ...
}

//my codes
cv::Mat eyePts_left;
// ...
if(std::max(eyePts_left.at<float>(0,0),eyePts_left.at<float>(16,0)) > eyePts_left.at<float>(61,0)){ 
  //do something
}

मैं अभिव्यक्ति के मूल्य को मुद्रित करना चाहता हूं:

eyePts_left.at<float>(0,0)

एक एलएलडीबी डिबगिंग सत्र में, लेकिन यह शिकायत करता है:

(lldb) p eyePts_left.at<float>(0, 0)
error: warning: warning: got name from symbols: at
error: <user expression 21>:1:13: no member named 'at' in 'cv::Mat'
eyePts_left.at<float>(0, 0)
~~~~~~~~~~~ ^
error: <user expression 21>:1:21: expected '(' for function-style cast or type construction
eyePts_left.at<float>(0, 0)
               ~~~~~^

तो, इस टेम्पलेट-संबंधित अभिव्यक्ति के मूल्य की जांच करने का सही तरीका क्या है?

1
Finley 30 अक्टूबर 2020, 06:47

1 उत्तर

सबसे बढ़िया उत्तर

टेम्प्लेट फ़ंक्शंस और सामान्य रूप से टेम्प्लेटेड संस्थाओं के लिए वर्तमान डिबग जानकारी अजीब है क्योंकि यह केवल इंस्टेंटेशन का वर्णन करता है, न कि टेम्प्लेट को अमूर्त संस्थाओं के रूप में, इसलिए टेम्प्लेट किए गए फ़ंक्शन डीबग जानकारी में वैसे ही दिखाई देते हैं जैसे नामों में कहीं कोण कोष्ठक के साथ कार्य करते हैं। इससे डिबग जानकारी से एक कंपाइलर प्रतिनिधित्व तक जाना मुश्किल हो जाता है कि एलएलडीबी क्लैंग की अपनी प्रति में फ़ीड कर सकता है ताकि क्लैंग उन्हें अभिव्यक्तियों में सही ढंग से पार्स कर सके। जैसा कि आपने पाया है, यह वर्तमान में काम नहीं करता है।

यदि आपको वास्तव में ऐसा करने की आवश्यकता है, तो आप थोड़ी रचनात्मक कास्टिंग के साथ समस्या का समाधान कर सकते हैं, उदाहरण के लिए:

फ़ंक्शन का पता ढूंढें, उदा।

(lldb) image lookup -n Mat::at<float>
1 match found in /tmp/a.out:
        Address: a.out[0x0000000100003f30] (a.out.__TEXT.__text + 64)
        Summary: a.out`float const& Mat::at<float>(int, int) at template_fun.cpp:4

उस पते पर कॉल को हाथ से कास्ट करें:

(lldb) expr ((float &(*) (Mat *, int, int))0x0000000100003f30)(&my_mat, 10, 20)
Called with 10 20
(float) $0 = 30

यह आपका वास्तविक कार्य नहीं है, बस एक खिलौना मैंने बनाया है इसलिए वास्तविक परिणाम पर ध्यान न दें।

ध्यान दें, यदि आप इसे अक्सर करते हैं और सी फ़ंक्शन कास्टिंग सिंटैक्स को 100% पसंद नहीं करते हैं, तो आप इसके लिए एक टाइपिफ़ बना सकते हैं, या तो कोड में या एलएलडीबी में:

(lldb) expr typedef float &(*$Mat_at_type) (Mat *, int, int)

यह कॉल को सरल करता है:

(lldb) expr (($Mat_at_type)0x0000000100003f30)(&my_mat, 10, 20)
Called with 10 20
(float) $1 = 30

और फिर यदि आप इसे बहुत कुछ करते हैं, तो आप यह भी कर सकते हैं:

(lldb) command alias call_at expr -- (($Mat_at_type)0x0000000100003f30)
(lldb) call_at (&my_mat, 10, 20)
1
Jim Ingham 31 अक्टूबर 2020, 03:35