c errors undefined reference
पीसी के लिए खाली समय घड़ी अनुप्रयोग
यह ट्यूटोरियल उन गंभीर त्रुटियों का विवरण देता है जो प्रोग्रामर अक्सर C ++ में एनफाइन्ड संदर्भ, एक सेगमेंटेशन फॉल्ट (कोर डंप किए गए) और अनारक्षित बाहरी प्रतीक जैसे एनकाउंटर करते हैं:
हम सबसे महत्वपूर्ण त्रुटियों पर चर्चा करेंगे जो हम अक्सर C ++ में मुठभेड़ करते हैं जो वास्तव में समान रूप से महत्वपूर्ण हैं। सिस्टम और सिमेंटिक त्रुटियों और अपवादों के अलावा, जो समय-समय पर होते हैं, हमें अन्य महत्वपूर्ण त्रुटियां भी मिलती हैं जो कार्यक्रमों के चलने को प्रभावित करती हैं।
ये त्रुटियां ज्यादातर रनटाइम के दौरान कार्यक्रम के अंत में होती हैं। कभी-कभी प्रोग्राम उचित आउटपुट देता है और फिर त्रुटि उत्पन्न होती है।
=> स्क्रैच से C ++ जानने के लिए यहाँ जाएँ।
आप क्या सीखेंगे:
महत्वपूर्ण C ++ त्रुटियां
इस ट्यूटोरियल में, हम तीन प्रकार की त्रुटियों पर चर्चा करेंगे जो किसी भी C ++ प्रोग्रामर के दृष्टिकोण से महत्वपूर्ण हैं।
- अपरिभाषित संदर्भ
- विभाजन दोष (कोर नहीं चला)
- ना सुलझाया हुआ बाहरी चिन्ह
हम इन त्रुटियों में से प्रत्येक के संभावित कारणों के साथ-साथ उन सावधानियों के बारे में चर्चा करेंगे जो हम इन त्रुटियों को रोकने के लिए एक प्रोग्रामर के रूप में ले सकते हैं।
चलो शुरू करते हैं!!
अपरिभाषित संदर्भ
जब हमारे प्रोग्राम में ऑब्जेक्ट नाम (क्लास, फंक्शन, वेरिएबल इत्यादि) का संदर्भ होता है, तो 'अनडिफाइंड रेफरेंस' एरर तब होता है, जब यह लिंक की गई सभी ऑब्जेक्ट फाइल्स और लाइब्रेरीज़ में सर्च करने की कोशिश करने पर लिंकर को इसकी परिभाषा नहीं मिलती ।
इस प्रकार जब लिंकर एक लिंक की गई वस्तु की परिभाषा नहीं पा सकता है, तो यह 'अपरिभाषित संदर्भ' त्रुटि जारी करता है। परिभाषा से स्पष्ट है, यह त्रुटि लिंकिंग प्रक्रिया के बाद के चरणों में होती है। विभिन्न कारण हैं जो 'अपरिभाषित संदर्भ' त्रुटि का कारण बनते हैं।
हम नीचे इन कारणों में से कुछ पर चर्चा करते हैं:
(१) वस्तु के लिए कोई परिभाषा नहीं
यह 'अपरिभाषित संदर्भ' त्रुटि पैदा करने का सबसे सरल कारण है। प्रोग्रामर केवल ऑब्जेक्ट को परिभाषित करना भूल गया है।
निम्नलिखित C ++ प्रोग्राम पर विचार करें। यहां हमने केवल फ़ंक्शन के प्रोटोटाइप को निर्दिष्ट किया है और फिर इसे मुख्य फ़ंक्शन में उपयोग किया है।
#include int func1(); int main() { func1(); }
आउटपुट:
इसलिए जब हम इस कार्यक्रम को संकलित करते हैं, तो लिंक करने वाला त्रुटि जो कहता है कि 'de func1 () 'के लिए अपरिभाषित संदर्भ जारी किया गया है।
इस त्रुटि से छुटकारा पाने के लिए, हम फ़ंक्शन func1 की परिभाषा प्रदान करके कार्यक्रम को इस प्रकार सही करते हैं। अब कार्यक्रम उचित आउटपुट देता है।
#include using namespace std; int func1(); int main() { func1(); } int func1(){ cout<<'hello, world!!'; }
आउटपुट:
नमस्ते दुनिया!!
# 2) प्रयुक्त वस्तुओं की गलत परिभाषा (हस्ताक्षर मेल नहीं खाते)
'अनिर्धारित संदर्भ' त्रुटि के लिए एक और कारण यह है कि जब हम गलत परिभाषा निर्दिष्ट करते हैं। हम अपने कार्यक्रम में किसी भी वस्तु का उपयोग करते हैं और इसकी परिभाषा कुछ अलग है।
निम्नलिखित C ++ प्रोग्राम पर विचार करें। यहाँ हमने func1 () के लिए एक कॉल किया है। इसका प्रोटोटाइप int func1 () है। लेकिन इसकी परिभाषा इसके प्रोटोटाइप से मेल नहीं खाती है। जैसा कि हम देखते हैं, फ़ंक्शन की परिभाषा में फ़ंक्शन का एक पैरामीटर होता है।
इस प्रकार जब कार्यक्रम संकलित किया जाता है, तो प्रोटोटाइप और फ़ंक्शन कॉल मैच के कारण संकलन सफल होता है। लेकिन जब लिंकर फंक्शन कॉल को अपनी परिभाषा से जोड़ने की कोशिश कर रहा होता है, तो यह समस्या का पता लगाता है और त्रुटि को 'अपरिभाषित संदर्भ' के रूप में जारी करता है।
#include using namespace std; int func1(); int main() { func1(); } int func1(int n){ cout<<'hello, world!!'; }
आउटपुट:
इस प्रकार इस तरह की त्रुटियों को रोकने के लिए, हम बस क्रॉस-चेक करते हैं कि क्या सभी वस्तुओं की परिभाषा और उपयोग हमारे कार्यक्रम में मेल खा रहे हैं।
# 3) ऑब्जेक्ट फाइल्स को सही तरीके से लिंक नहीं किया गया
यह समस्या 'अपरिभाषित संदर्भ' त्रुटि को भी जन्म दे सकती है। यहां, हमारे पास एक से अधिक स्रोत फ़ाइलें हो सकती हैं और हम उन्हें स्वतंत्र रूप से संकलित कर सकते हैं। जब ऐसा किया जाता है, तो ऑब्जेक्ट ठीक से लिंक नहीं होते हैं और इसके परिणामस्वरूप 'अपरिभाषित संदर्भ' होता है।
निम्नलिखित दो सी + + कार्यक्रमों पर विचार करें। पहली फ़ाइल में, हम 'प्रिंट ()' फ़ंक्शन का उपयोग करते हैं जिसे दूसरी फ़ाइल में परिभाषित किया गया है। जब हम इन फ़ाइलों को अलग से संकलित करते हैं, तो पहली फ़ाइल प्रिंट फ़ंक्शन के लिए 'अपरिभाषित संदर्भ' देती है, जबकि दूसरी फ़ाइल मुख्य फ़ंक्शन के लिए 'अपरिभाषित संदर्भ' देती है।
int print(); int main() { print(); }
आउटपुट:
int print() { return 42; }
आउटपुट:
इस त्रुटि को हल करने का तरीका दोनों फाइलों को एक साथ संकलित करना है ( उदाहरण के लिए, g ++ का उपयोग करके)।
पहले से ही चर्चा किए गए कारणों के अलावा, 'अपरिभाषित संदर्भ' निम्न कारणों से भी हो सकता है।
# 4) गलत प्रोजेक्ट प्रकार
जब हम दृश्य स्टूडियो की तरह C ++ IDE में गलत प्रोजेक्ट प्रकार निर्दिष्ट करते हैं और उन चीजों को करने की कोशिश करते हैं जो प्रोजेक्ट को उम्मीद नहीं है, तो, हमें 'अपरिभाषित संदर्भ' मिलता है।
# 5) कोई लाइब्रेरी नहीं
यदि किसी प्रोग्रामर ने लाइब्रेरी पथ को ठीक से निर्दिष्ट नहीं किया है या इसे निर्दिष्ट करने के लिए पूरी तरह से भूल गया है, तो हमें लाइब्रेरी से प्रोग्राम के सभी संदर्भों के लिए 'अपरिभाषित संदर्भ' मिलता है।
# 6) निर्भर फाइलें संकलित नहीं हैं
एक प्रोग्रामर को यह सुनिश्चित करना होता है कि हम परियोजना की सभी निर्भरताओं को पहले से ही संकलित कर लें ताकि जब हम परियोजना को संकलित करें, तो कंपाइलर सभी निर्भरताओं का पता लगा ले और सफलतापूर्वक संकलन कर ले। यदि कोई निर्भरता गायब है, तो संकलक 'अपरिभाषित संदर्भ' देता है।
उपरोक्त कारणों के अलावा, 'अपरिभाषित संदर्भ' त्रुटि कई अन्य स्थितियों में हो सकती है। लेकिन लब्बोलुआब यह है कि प्रोग्रामर ने चीजों को गलत कर दिया है और इस त्रुटि को रोकने के लिए उन्हें सही किया जाना चाहिए।
सी ++ में विरासत के प्रकार
विभाजन दोष (कोर नहीं चला)
त्रुटि 'विभाजन दोष (कोर डंप)' एक त्रुटि है जो स्मृति भ्रष्टाचार को इंगित करता है। यह आमतौर पर तब होता है जब हम एक स्मृति तक पहुंचने की कोशिश करते हैं जो कि कार्यक्रम में विचार नहीं करता है।
यहाँ कुछ कारण दिए गए हैं, जो सेगमेंटेशन गलती का कारण बनते हैं।
# 1) लगातार स्ट्रिंग को संशोधित करना
निम्नलिखित कार्यक्रम पर विचार करें जिसमें हमने एक निरंतर स्ट्रिंग घोषित किया है। फिर हम इस निरंतर स्ट्रिंग को संशोधित करने का प्रयास करते हैं। जब प्रोग्राम निष्पादित किया जाता है, तो हमें आउटपुट में दिखाया गया त्रुटि मिलती है।
#include int main() { char *str; //constant string str = 'STH'; //modifying constant string *(str+1) = 'c'; return 0; }
आउटपुट:
# 2) डेरेफ्रेंसिंग पॉइंटर
एक पॉइंटर को वैध मेमोरी स्थान पर इंगित करना चाहिए, इससे पहले कि हम इसे डीरफर करें। नीचे दिए गए कार्यक्रम में, हम देखते हैं कि सूचक NULL की ओर इशारा कर रहा है, जिसका अर्थ है कि वह जिस स्थान को इंगित कर रहा है, वह 0 है यानी अमान्य है।
इसलिए जब हम इसे अगली पंक्ति में शामिल करते हैं, तो हम वास्तव में इसके अज्ञात स्मृति स्थान तक पहुंचने का प्रयास कर रहे हैं। यह वास्तव में एक विभाजन दोष के परिणामस्वरूप होता है।
#include using namespace std; int main() { int* ptr = NULL; //here we are accessing unknown memory location *ptr = 1; cout << *ptr; return 0; }
आउटपुट:
विखंडन दोष
अगला कार्यक्रम एक समान मामला दिखाता है। इस कार्यक्रम में भी, सूचक वैध डेटा की ओर इशारा नहीं कर रहा है। एक असिंचित पॉइंटर NULL जितना ही अच्छा है और इसलिए यह अज्ञात मेमोरी लोकेशन की ओर भी इशारा करता है। इस प्रकार जब हम इसे रोकने की कोशिश करते हैं, तो इसका परिणाम एक विभाजन दोष होता है।
#include using namespace std; int main() { int *p; cout<<*p; return 0; }
आउटपुट:
विखंडन दोष
इस तरह की त्रुटियों को रोकने के लिए, हमें यह सुनिश्चित करना होगा कि प्रोग्राम में हमारे पॉइंटर वैरिएबल हमेशा वैध मेमोरी लोकेशन की ओर इशारा करते हैं।
# 3) ढेर अतिप्रवाह
जब हमारे कार्यक्रम में पुनरावर्ती कॉल होते हैं, तो वे स्टैक में सभी मेमोरी को खाते हैं और स्टैक को अतिप्रवाह का कारण बनाते हैं। ऐसे मामलों में, हमें विभाजन दोष मिलता है क्योंकि स्टैक मेमोरी से बाहर निकलना भी एक प्रकार का मेमोरी भ्रष्टाचार है।
नीचे दिए गए कार्यक्रम पर विचार करें जहां हम पुनरावर्ती रूप से किसी संख्या के भाज्य की गणना करते हैं। ध्यान दें कि हमारी आधार स्थिति परीक्षण यदि संख्या 0 है और फिर वापस आती है। 1. यह कार्यक्रम सकारात्मक संख्याओं के लिए पूरी तरह से काम करता है।
लेकिन क्या होता है जब हम वास्तव में एक फैक्टरियल फ़ंक्शन के लिए एक नकारात्मक संख्या पास करते हैं? खैर, जैसा कि आधार संख्या नकारात्मक संख्याओं के लिए नहीं दी गई है, फ़ंक्शन को नहीं पता है कि कहां रुकना है और इस प्रकार एक स्टैक ओवरफ्लो होता है।
यह नीचे दिए गए आउटपुट में दिखाया गया है जो विभाजन दोष देता है।
बाइनरी फ़ाइल कैसे खोलें
#include using namespace std; int factorial(int n) { if(n == 0) { return 1; } return factorial(n-1) * n; } int main() { cout< आउटपुट:
विभाजन दोष (कोर नहीं चला)
अब इस त्रुटि को ठीक करने के लिए, हम आधार स्थिति को थोड़ा बदल देते हैं और नीचे दिखाए गए अनुसार नकारात्मक संख्याओं के लिए भी मामला निर्दिष्ट करते हैं।
#include using namespace std; int factorial(int n) { // What about n <0? if(n <= 0) { return 1; } return factorial(n-1) * n; } int main() { cout<<'Factorial output:'< आउटपुट:
फैक्टरियल आउटपुट: 1
अब हम देखते हैं कि विभाजन की गलती का ध्यान रखा जाता है और कार्यक्रम ठीक काम करता है।
ना सुलझाया हुआ बाहरी चिन्ह
अनसुलझे बाहरी प्रतीक एक लिंकर त्रुटि है जो इंगित करता है कि यह लिंकिंग प्रक्रिया के दौरान प्रतीक या इसके संदर्भ को नहीं ढूंढ सकता है। त्रुटि 'अपरिभाषित संदर्भ' के समान है और इसे परस्पर रूप से जारी किया जाता है।
हमने नीचे दो उदाहरण दिए हैं जहां यह त्रुटि हो सकती है।
# 1) जब हम प्रोग्राम में एक स्ट्रक्चर वेरिएबल का उल्लेख करते हैं जिसमें एक स्टैटिक मेंबर होता है।
#include struct C { static int s; }; // int C::s; // Uncomment the following line to fix the error. int main() { C c; C::s = 1; }
आउटपुट:

उपरोक्त कार्यक्रम में, संरचना सी में एक स्थिर सदस्य है जो बाहरी कार्यक्रमों के लिए सुलभ नहीं है। इसलिए जब हम इसे मुख्य फ़ंक्शन में मान देने की कोशिश करते हैं, तो लिंकर को प्रतीक नहीं मिलता है और इसका परिणाम 'अनसुलझे बाहरी प्रतीक' या 'अपरिभाषित संदर्भ' हो सकता है।
इस त्रुटि को ठीक करने का तरीका स्पष्ट रूप से उपयोग करने से पहले मुख्य के बाहर outside :: 'का उपयोग करते हुए चर को स्पष्ट रूप से स्कोप करना है।
# 2) जब हमारे पास स्रोत फ़ाइल में संदर्भित बाहरी चर होते हैं, और हमने उन फ़ाइलों को लिंक नहीं किया है जो इन बाहरी चर को परिभाषित करते हैं।
इस मामले को नीचे दिखाया गया है:
#include #include using namespace std; extern int i; extern void g(); void f() { i++; g(); } int main() {}
आउटपुट:

सामान्य तौर पर, 'अनसुलझे बाहरी प्रतीक' के मामले में, फ़ंक्शन जैसी किसी भी वस्तु के लिए संकलित कोड एक प्रतीक को खोजने में विफल रहता है, जिसके लिए वह एक संदर्भ बनाता है, हो सकता है कि वह प्रतीक ऑब्जेक्ट फ़ाइलों या पुस्तकालयों में से किसी में परिभाषित नहीं है लिंकर के लिए निर्दिष्ट।
निष्कर्ष
इस ट्यूटोरियल में, हमने C ++ में कुछ प्रमुख त्रुटियों पर चर्चा की, जो महत्वपूर्ण हैं और प्रोग्राम के प्रवाह को प्रभावित कर सकती हैं और यहां तक कि एप्लिकेशन क्रैश भी हो सकती है। हमने सेगमेंटेशन फॉल्ट, अनारक्षित बाहरी सिंबल और अनफाइंड रेफरेंस के बारे में विस्तार से बताया।
यद्यपि ये त्रुटियां कभी भी हो सकती हैं, जिन कारणों से हमने चर्चा की थी, हम जानते हैं कि हम अपने कार्यक्रम को सावधानीपूर्वक विकसित करके उन्हें आसानी से रोक सकते हैं।
=> आसान सी ++ प्रशिक्षण श्रृंखला के माध्यम से पढ़ें।
अनुशंसित पाठ