मैं ओपनसीवी ट्यूटोरियल का अध्ययन कर रहा हूं और पूरे assert
समारोह में आया हूं; यह क्या करता है?
मैं ओपनसीवी ट्यूटोरियल का अध्ययन कर रहा हूं और पूरे assert
समारोह में आया हूं; यह क्या करता है?
जवाबों:
assert
कार्यक्रम को समाप्त कर देगा (आमतौर पर एक संदेश के साथ मुखर कथन का हवाला देते हुए) यदि इसका तर्क गलत है। यह आमतौर पर डिबगिंग के दौरान उपयोग किया जाता है ताकि अप्रत्याशित स्थिति उत्पन्न होने पर कार्यक्रम को अधिक स्पष्ट रूप से विफल किया जा सके।
उदाहरण के लिए:
assert(length >= 0); // die if length is negative.
यदि आप ऐसा करते हैं तो आप एक अधिक सूचनात्मक संदेश भी प्रदर्शित कर सकते हैं:
assert(length >= 0 && "Whoops, length can't possibly be negative! (didn't we just check 10 lines ago?) Tell jsmith");
वरना इस तरह:
assert(("Length can't possibly be negative! Tell jsmith", length >= 0));
जब आप एक रिलीज़ (गैर-डिबग) बिल्ड कर रहे होते हैं, तो आप मैक्रो assert
को परिभाषित करके NDEBUG
, आमतौर पर एक कंपाइलर स्विच के साथ बयानों के मूल्यांकन के ओवरहेड को भी हटा सकते हैं । इस बात की पुष्टि यह है कि आपके प्रोग्राम को कभी भी स्थूल मैक्रो के चलने पर भरोसा नहीं करना चाहिए ।
// BAD
assert(x++);
// GOOD
assert(x);
x++;
// Watch out! Depends on the function:
assert(foo());
// Here's a safer way:
int ret = foo();
assert(ret);
प्रोग्राम के संयोजन से कॉलिंग एबॉर्ट () और कुछ भी करने की गारंटी नहीं दी जा रही है, एसेर्ट्स का उपयोग केवल उन चीजों का परीक्षण करने के लिए किया जाना चाहिए जो डेवलपर ने मान लिया है, उदाहरण के लिए, उपयोगकर्ता एक पत्र के बजाय एक संख्या दर्ज कर रहा है (जो होना चाहिए अन्य साधनों द्वारा संभाला)।
assert
आमतौर पर एक अपवाद उठाता है" - सी ++ में यह "अपवाद" नहीं उठता है इसे गर्भपात कहते हैं ... यह थोड़ा अलग है।
#
चरित्र एक टिप्पणी पेश नहीं करता है।
assert("error message", expression)
ज़ोर कंप्यूटर कथन के अनुरूप है सुनिश्चित करें कि अंग्रेजी में।
पर एक नज़र डालें
Assert () C ++ में उदाहरण कार्यक्रम
कई संकलक एक मुखर () मैक्रो प्रदान करते हैं। मुखर () मैक्रो TRUE लौटाता है यदि इसका पैरामीटर TRUE का मूल्यांकन करता है और यदि FALSE का मूल्यांकन करता है तो यह किसी प्रकार की कार्रवाई करता है। कई कंपाइलर प्रोग्राम को एक एस्टर () पर निरस्त कर देंगे जो विफल हो जाता है; दूसरों को एक अपवाद फेंक देंगे
मुखर () मैक्रो की एक शक्तिशाली विशेषता यह है कि प्रीप्रोसेसर इसे किसी भी कोड में ध्वस्त कर देता है यदि DEBUG परिभाषित नहीं है। यह विकास के दौरान एक बड़ी मदद है, और जब अंतिम उत्पाद जहाजों में कोई प्रदर्शन जुर्माना नहीं होता है और न ही कार्यक्रम के निष्पादन योग्य संस्करण के आकार में वृद्धि होती है।
उदाहरण के लिए
#include <stdio.h>
#include <assert.h>
void analyze (char *, int);
int main(void)
{
char *string = "ABC";
int length = 3;
analyze(string, length);
printf("The string %s is not null or empty, "
"and has length %d \n", string, length);
}
void analyze(char *string, int length)
{
assert(string != NULL); /* cannot be NULL */
assert(*string != '\0'); /* cannot be empty */
assert(length > 0); /* must be positive */
}
/**************** Output should be similar to ******************
The string ABC is not null or empty, and has length 3
मुखर () फ़ंक्शन प्रोग्राम बग का निदान कर सकता है। C में, इसे में परिभाषित किया गया है <assert.h>
, और C ++ में इसे परिभाषित किया गया है <cassert>
। इसका प्रोटोटाइप है
void assert(int expression);
तर्क अभिव्यक्ति कुछ भी हो सकता है जिसे आप परीक्षण करना चाहते हैं - एक चर या कोई सी अभिव्यक्ति। यदि अभिव्यक्ति TRUE का मूल्यांकन करती है, तो मुखर () कुछ नहीं करता है। यदि अभिव्यक्ति FALSE का मूल्यांकन करती है, तो एस्टर () stderr पर त्रुटि संदेश प्रदर्शित करता है और प्रोग्राम निष्पादन को रोक देता है।
आप मुखर () का उपयोग कैसे करते हैं? यह अक्सर प्रोग्राम बग्स को ट्रैक करने के लिए उपयोग किया जाता है (जो संकलन त्रुटियों से अलग हैं)। बग किसी प्रोग्राम को संकलित करने से नहीं रोकता है, लेकिन यह गलत परिणाम देने या अनुचित तरीके से (उदाहरण के लिए, लॉकिंग) को चलाने का कारण बनता है। उदाहरण के लिए, आपके द्वारा लिखा गया एक वित्तीय-विश्लेषण कार्यक्रम कभी-कभी गलत उत्तर दे सकता है। आपको संदेह है कि समस्या एक नकारात्मक मूल्य पर परिवर्तनीय ब्याज_रेट के कारण होती है, जो कभी नहीं होनी चाहिए। इसे जांचने के लिए, कथन को रखें
मुखर (interest_rate> = 0); कार्यक्रम में उन स्थानों पर जहां interest_rate का उपयोग किया जाता है। यदि चर कभी नकारात्मक हो जाता है, तो मुखर () मैक्रो आपको सचेत करता है। आप समस्या के कारण का पता लगाने के लिए संबंधित कोड की जांच कर सकते हैं।
यह देखने के लिए कि मुखर कैसे काम करता है, नीचे नमूना कार्यक्रम चलाएं । यदि आप एक गैर-अक्षीय मान दर्ज करते हैं, तो प्रोग्राम मूल्य प्रदर्शित करता है और सामान्य रूप से समाप्त हो जाता है। यदि आप शून्य में प्रवेश करते हैं, तो मुखर () मैक्रो बलों को असामान्य कार्यक्रम समाप्ति देता है। आपके द्वारा देखा गया सटीक त्रुटि संदेश आपके कंपाइलर पर निर्भर करेगा, लेकिन यहां एक विशिष्ट उदाहरण है:
अभिकथन विफल: x, फ़ाइल सूची 19_3.c, पंक्ति 13 नोट करें कि, मुखर () काम करने के लिए, आपके प्रोग्राम को डिबग मोड में संकलित किया जाना चाहिए। डिबग मोड सक्षम करने के बारे में जानकारी के लिए अपने संकलक प्रलेखन का संदर्भ लें (जैसा कि एक क्षण में समझाया गया है)। जब आप बाद में रिलीज़ मोड में अंतिम संस्करण संकलित करते हैं, तो एस्टर () मैक्रो अक्षम हो जाते हैं।
int x;
printf("\nEnter an integer value: ");
scanf("%d", &x);
assert(x >= 0);
printf("You entered %d.\n", x);
return(0);
पूर्णांक मान दर्ज करें: 10
आपने १० में प्रवेश किया।
पूर्णांक मान दर्ज करें: -1
त्रुटि संदेश: असामान्य प्रोग्राम समाप्ति
आपका त्रुटि संदेश आपके सिस्टम और संकलक के आधार पर भिन्न हो सकता है, लेकिन सामान्य विचार समान है।
अपवादों को उठाता है ’और might हाल्ट का निष्पादन’ जैसी सामग्री अधिकांश संकलकों के लिए सही हो सकती है, लेकिन सभी के लिए नहीं। (BTW, वहाँ मुखर बयान है कि वास्तव में अपवाद फेंक रहे हैं?)
यहाँ c6x और अन्य TI संकलक द्वारा उपयोग किए जाने वाले मुखर का एक अलग, थोड़ा अलग अर्थ है: कुछ मुखर कथनों को देखने के बाद, ये संकलनक कुछ अनुकूलन करने के लिए उस कथन में जानकारी का उपयोग करते हैं। दुष्ट।
C में उदाहरण:
int dot_product(short *x, short *y, short z)
{
int sum = 0
int i;
assert( ( (int)(x) & 0x3 ) == 0 );
assert( ( (int)(y) & 0x3 ) == 0 );
for( i = 0 ; i < z ; ++i )
sum += x[ i ] * y[ i ];
return sum;
}
यह बताता है कि डी-कंपाइलर 32-बिट सीमाओं पर संरेखित हैं, इसलिए कंपाइलर उस तरह के संरेखण के लिए विशिष्ट निर्देश उत्पन्न कर सकता है।
C ++ 11 N3337 मानक ड्राफ्ट
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2012/n3337.pdf
19.3 जोर
1 शीर्ष लेख <कैसेट>, (तालिका 42) में वर्णित है, C ++ प्रोग्राम के अभिकथन के लिए एक मैक्रो प्रदान करता है और दावे की जांच को अक्षम करने के लिए एक तंत्र प्रदान करता है।
2 सामग्री मानक C लाइब्रेरी हेडर <assert.h> के समान है।
C99 N1256 मानक ड्राफ्ट
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
7.2 डायग्नोस्टिक्स <assert.h>
1 शीर्षलेख
<assert.h>
मुखर मैक्रो को परिभाषित करता है और एक अन्य मैक्रो को संदर्भित करता है,NDEBUG
जो कि परिभाषित नहीं है<assert.h>
। यदिNDEBUG
स्रोत फ़ाइल में उस बिंदु पर एक स्थूल नाम के रूप में परिभाषित किया गया है जहां <assert.h> शामिल है, तो अभिकारक मैक्रो को बस के रूप में परिभाषित किया गया है#define assert(ignore) ((void)0)
प्रत्येक बार
<assert.h>
शामिल किए जाने वाले NDEBUG की वर्तमान स्थिति के अनुसार एस्टर मैक्रो को फिर से परिभाषित किया जाता है।2. मुखर मैक्रो को मैक्रो के रूप में लागू किया जाएगा, वास्तविक कार्य के रूप में नहीं। यदि वास्तविक फ़ंक्शन तक पहुंचने के लिए मैक्रो परिभाषा को दबा दिया जाता है, तो व्यवहार अपरिभाषित होता है।
7.2.1 कार्यक्रम निदान
7.2.1.1 मुखर मैक्रो
सार
1।
#include <assert.h> void assert(scalar expression);
विवरण
2 मुखर मैक्रो कार्यक्रमों में नैदानिक परीक्षण करता है; यह एक शून्य अभिव्यक्ति के लिए फैलता है। जब इसे निष्पादित किया जाता है, अगर अभिव्यक्ति (जिसमें एक स्केलर प्रकार होगा) गलत है (जो कि 0 के बराबर है), मुखर मैक्रो उस विशेष कॉल के बारे में जानकारी लिखता है जो विफल रही (तर्क के पाठ सहित, नाम स्रोत फ़ाइल, स्रोत लाइन संख्या, और एन्क्लोज़िंग फ़ंक्शन का नाम - बाद वाले कार्यान्वयन-परिभाषित प्रारूप में मानक त्रुटि स्ट्रीम पर क्रमशः प्रीप्रोसेसिंग मैक्रोज़
__FILE__
और (__LINE__
पहचानकर्ता के मान__func__
) हैं। 165) यह तो गर्भपात कार्य कहता है।रिटर्न
3 मुखर मैक्रो कोई मूल्य नहीं देता है।
सामान्य से अधिक एसेर () फ़ंक्शन का उपयोग करने के तीन मुख्य कारण हैं अगर और प्रिंटफ
मुखर () फ़ंक्शन का उपयोग मुख्य रूप से डिबगिंग चरण में किया जाता है, यह लिखने के लिए थकाऊ है कि क्या एक प्रिंटफ स्टेटमेंट के साथ हर बार आप एक ऐसी स्थिति का परीक्षण करना चाहते हैं जो अंतिम कोड में भी अपना रास्ता नहीं बना सकती है।
बड़े सॉफ्टवेयर परिनियोजन में, एस्टर बहुत काम आता है जहां आप कंपाइलर को () फंक्शन के लिए हेडर फाइल को लिंक करने से पहले परिभाषित NDEBUG मैक्रो का उपयोग करके एसेटर स्टेटमेंट को अनदेखा कर सकते हैं।
जब आप कोई फ़ंक्शन या कुछ कोड डिज़ाइन कर रहे हों, तो assert () काम आता है और यह विचार करना चाहता है कि कोड क्या करेगा और काम नहीं करेगा और अंत में मूल रूप से मान्यताओं के साथ खेलने के लिए मूल्यांकन करने के लिए एक और शामिल करें।
यह एक फ़ंक्शन है जो प्रोग्राम निष्पादन को रोक देगा यदि मूल्य ने मूल्यांकन किया है तो वह गलत है। आमतौर पर इसे एक मैक्रो द्वारा घेर लिया जाता है ताकि इसे रिलीजिंग सेटिंग्स के साथ संकलित होने पर परिणामी बाइनरी में संकलित न किया जाए।
इसे आपके द्वारा की गई मान्यताओं के परीक्षण के लिए उपयोग करने के लिए डिज़ाइन किया गया है। उदाहरण के लिए:
void strcpy(char* dest, char* src){
//pointers shouldn't be null
assert(dest!=null);
assert(src!=null);
//copy string
while(*dest++ = *src++);
}
आप जो आदर्श चाहते हैं, वह यह है कि आप अपने प्रोग्राम में कोई त्रुटि कर सकते हैं, जैसे कि किसी फ़ंक्शन को अमान्य तर्कों के साथ कॉल करना, और आप इससे पहले कि यह सेगफ़ॉल्ट (या अपेक्षा के अनुसार काम करने में विफल रहता है) पर जोर मारता है
इसके अलावा, आप यह जांचने के लिए उपयोग कर सकते हैं कि क्या गतिशील आवंटन सफल था।
कोड उदाहरण:
int ** p;
p = new int * [5]; // Dynamic array (size 5) of pointers to int
for (int i = 0; i < 5; ++i) {
p[i] = new int[3]; // Each i(ptr) is now pointing to a dynamic
// array (size 3) of actual int values
}
assert (p); // Check the dynamic allocation.
के समान:
if (p == NULL) {
cout << "dynamic allocation failed" << endl;
exit(1);
}
new
आवंटन विफलता जब तक आपके द्वारा निर्दिष्ट पर एक अपवाद फेंकता है nothrow
(जो आप यहाँ नहीं किया)। इसके अलावा, आपका स्वरूपण अजीब है और exit
बुराई है।
assert()
केवल डिबगिंग और उन चीज़ों पर मुहर लगाने के लिए है जो कभी भी, कभी भी, कभी भी नहीं होनी चाहिए - रिलीज बिल्ड बनने से बहुत पहले।