उदाहरणों के साथ C भाषा में त्रुटियां के प्रकार।9 min read

C में विभिन्न प्रकार की त्रुटियों का ज्ञान होना; कोड डिबग करने में मदद करेगा। त्रुटियां मानव निर्मित हैं। इस पूरी दुनिया में कोई भी त्रुटि को लाये बिना काम नहीं कर सकता।

यदि आपको कोड में त्रुटियां आ रही हैं, तो आप एक महान प्रोग्रामर बनने

एक त्रुटि का मतलब है समाधान होता है। हमेशा अपनी त्रुटियों को हल करें इसे कभी भी इस तरह न छोड़ दे। यदि आप त्रुटि को हल करने में असमर्थ हैं, तो अपने मुद्दे को हमारे फेसबुक समूह में पोस्ट करें।

क्या आप जानते हैं कि अधिकांश समय हमें कोड में त्रुटि का लाइन नंबर मिलता है. यह ट्यूटोरियल त्रुटियों को हल करने में मदद करेगा और उपयुक्त उदाहरणों के साथ विभिन्न C भाषा में त्रुटियां को समझेगे।

समस्याएं संकेतों का रोक नहीं हैं, वे दिशा निर्देश हैं। – रॉबर्ट शुलर

To read this tutorial in English. Click here!

C भाषा में त्रुटियां के प्रकार

मुख्य रूप से तीन प्रकार की त्रुटियां होती हैं।

  1. संकलन-समय त्रुटि। (Compile-time error.)
  2. तार्किक त्रुटि। (Logical error.)
  3. रनटाइम त्रुटि। (Run-time error.)

हम प्रत्येक त्रुटियों का विस्तार से अध्ययन करेंगे।

Different types of error in C in Hindi language.

संकलन-समय त्रुटि। (Compile-time error.)

त्रुटि पूर्वप्रक्रमक (preprocessor) या अनुवादक (Translator) या असेंबलर (Assembler) या लिंकर (Linker) चरण में होती है जिसे संकलन-समय त्रुटि (compile-time error) के रूप में जाना जाता है।

घोषणा की त्रुटियां अनुवादक की त्रुटि हैं। (declaration errors are translator error.)

संकलन-समय की त्रुटियों को आगे उप-वर्गीकृत (sub classified) किया गया है।

  1. वक्य रचना त्रुटि (Syntax error)
  2. शब्दार्थ त्रुटि (Semantic error)
  3. लिंकर त्रुटि (Linker error)

– वक्य रचना त्रुटि (Syntax error)

किसी भी भाषा में कुछ नियमों और विनियमों का पालन करना होता है, सामान्य तौर पर, जैसे हमारी मौखिक भाषा में व्याकरण, शब्द और कई अन्य चीजें होती हैं जिन्हें हमें ध्यान में रखने की आवश्यकता होती है जब हम इसका उपयोग कर रहे होते हैं।

उसी तरह, सी प्रोग्रामिंग भी कुछ नियम हैं। यदि हम C सिंटैक्स लिखने के नियमों का उल्लंघन करते हैं तो कंपाइलर एक त्रुटि फेंक देगा।

संकलक-त्रुटियां कुछ बिंदुओं को संदर्भित करती हैं जिन्हें हमें कोड संकलित करने से पहले हल करना होगा

इन सभी त्रुटियों को कंपाइलर द्वारा पता लगाया जाता है, इसलिए इसे कंपाइल-टाइम त्रुटियों के रूप में जाना जाता है।

सबसे अधिक लगातार हमें यह त्रुटियां आती है :

  • कोष्ठक ” } “ को भूल जाना।
  • ” ; “ के बजाय ” : “ इस्तमाल कर लेना।
  • वेरिएबल को घोषित किये बिना प्रिंटफ़ (printf) में प्रिंट करना।
  • वाक्य के अंत में ” ; ” भूल जाना।
  • प्रिंटफ़ के अंत में ” ; “ भूल जाना।

उदाहरण के लिए।

#include<stdio.h>

int main(void)
{
     printf("Hello, Friends chai pilo \n") \\here we forgot to place semicolon
     
     return 0;
}
code with error to check compiler

यह हमारा सोर्स कोड है, हमने इसे संकलित (compiled) किया है।

this is how compiler is showing result on terminal about compiler error

कंपाइलर ने एक पंक्ति संख्या के साथ एक त्रुटि डाली है। “त्रुटि: अपेक्षित ‘?’ अभिव्यक्ति के बाद”।(“error: expected ‘ ; ‘ after expression”).

After solving compilation error code executed successfully

त्रुटि को हल करने के लिए प्रिंटफ स्टेटमेंट के अंत में ” ; “ लगाया । कोड को पुनः संकलित (recompiled) किया और वांछित आउटपुट मिला।

– शब्दार्थ त्रुटि (Semantic error)

शब्दार्थ त्रुटि तब होता है जब प्रोग्राम में लिखे गए स्टेटमेंट कंपाइलर के लिए सार्थक नहीं होते हैं।

उदाहरण के लिए।

#include <stdio.h>

int main(void)
{
     int a = 10, b = 20, c;
     a + b = c; //This is Semantic error
     return 0;
}
Code is having Semantic error

उपरोक्त कोड की 6 वीं पंक्ति में शब्दार्थ त्रुटि है। “a + b = c;”

in compilation of code Semantic error

ऊपर दिए गए कोड को संकलित करने के बाद, कंपाइलर ने 6 वीं पंक्ति में एक त्रुटि डाली “अभिव्यक्ति असाइन नहीं है”। (“expression is not assignable”.)

solved Semantic error in the code

त्रुटि को हल किया “a + b = c;” से “c = a + b;”

succesful compilation after solving Semantic error in code

त्रुटि को हल करने के बाद, कोड सफलतापूर्वक संकलित किया गया है।

– लिंकर त्रुटि (Linker error)

लिंकर चरण में त्रुटि बताती है कि आपका कोड ठीक संकलित करता है, लेकिन कुछ फ़ंक्शन या लाइब्रेरी फ़ाइलें नहीं मिली हैं

दूसरे शब्दों में, गलत फ़ंक्शन प्रोटोटाइप या गलत हेडर फ़ाइलों के कारण उत्पन्न त्रुटि उत्पन हुए है।

उदाहरण के लिए। यदि आपने printf() के बजाय print() टाइप किया है, तो वह संकलन करेगा लेकिन लिंकिंग स्टेज में, यह लिंकिंग एरर दिखाता है (प्रिंट फंक्शन नहीं मिला)

सबसे आम लिंकर त्रुटि में से एक main() के बजाय Main() लिख देना है।

उदाहरण के लिए।

Code is having linker error by mistake written prinf instead of printf

उपरोक्त कोड कोड में गलती से लाइन नंबर 5 में printf के बजाय prinf टाइप किया है। अब कंपाइल करें और देखें कि कंपाइलर कैसे प्रतिक्रिया करता है।

compiler thrown linker error along with one warning

बस चेतावनी को नजरअंदाज करें और त्रुटि पर ध्यान दें जैसा कि नीचे दिखाया गया है।

Undefined symbols for architecture x86_64:
  "_prinf", referenced from:
      _main in prog-0b9963.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

क्या आपने कुछ अलग देखा?

कोई त्रुटि पंक्ति संख्या नहीं है, इसका मतलब है कि लिंकर ने यह नहीं बताया कि त्रुटि कहां है।

क्या आप जानना चाहते हैं? यदि हाँ तो प्रतीक्षा करें। मैं अंत में समझाता हूँ।


तार्किक त्रुटि। (Logical error.)

एक कार्यक्रम के संकलन और निष्पादन पर, वांछित आउटपुट प्राप्त नहीं होता है, जब कुछ इनपुट दिए जाते हैं।

हमारा कोड त्रुटि मुक्त दिखाई देगा, लेकिन गलत आउटपुट को तार्किक त्रुटियां कहा जाता है।

यह प्रोग्रामिंग के शुरुआती लोगों द्वारा की गई सबसे आम त्रुटियां हैं।

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


रनटाइम त्रुटि। (Run-time error.)

निष्पादन योग्य फ़ाइल को चलाने के दौरान होने वाली त्रुटियां सफल संकलन के बाद रन-टाइम त्रुटि के रूप में जानी जाती हैं।

इसे कोड में बग (bug) भी कहा जाता है।

सबसे आम रन टाइम एरर में से एक शून्य द्वारा विभाजन है। इसे “डिवीजन एरर” के रूप में भी जाना जाता है।

इस प्रकार की त्रुटि को ढूंढना बहुत मुश्किल है क्योंकि कंपाइलर किसी भी लाइन की ओर इशारा नहीं करता है जिस पर त्रुटि होती है।

उदाहरण के लिए।

this code is containing runtime error

पंक्ति संख्या 7 में एक विभाजन त्रुटि है।

while compiling because of smart compiler it shown a warning

संकलन में, संकलक ने एक चेतावनी दी। यदि आपका कंपाइलर पर्याप्त स्मार्ट है तो यह चेतावनी को देगा।

when executed runtime error code it thrown an error

एक रनटाइम में, कोड ने “फ़्लोटिंग पॉइंट अपवाद ./a.out” नामक एक त्रुटि दी (“floating point exception ./a.out”)


महत्वपूर्ण सवाल

Q) लिंकर लाइन नंबर क्यों नहीं देता?

उत्तर: जैसा कि हमने पिछले लेख में विस्तार से संकलन चरणों का अध्ययन किया है। असेम्बलर का आउटपुट एक ऑब्जेक्ट फाइल है जिसे हम लिंकर को इनपुट के रूप में दे रहे हैं।

वह ऑब्जेक्ट फाइल एक बाइनरी फाइल के अलावा और कुछ नहीं है। एक बाइनरी फ़ाइल में कोई लाइन नंबर नहीं होता, इसलिए लिंकर, त्रुटि में लाइन नंबर देने में असमर्थ है।


सारांश

जितना अधिक आप त्रुटि हल करते हैं, उतना ही अधिक ज्ञान आप प्राप्त करेंगे।

यदि आपको कोई त्रुटि नहीं मिल रही है, तो आप सीखने के गलत रास्ते चल रहे हैं। इसका मतलब है कि आप कोड को केवल कॉपी-पेस्ट कर रहे हैं इसीलिए आपको कोई त्रुटि नहीं आ रही।

जब आपसे कोई त्रुटि आए तो यह प्रश्न पूछें।

  • क्या कंपाइलर ने कोई लाइन नंबर फेंका है? यदि हाँ, तो कथन को बहुत ध्यान से पढ़ें। यदि नहीं तब लिंकर द्वारा त्रुटि उत्पन्न की जानी चाहिए, तो जांच लें कि सभी फ़ंक्शन नाम सही हैं, वांछित लाइब्रेरी फाइलें संलग्न हैं या नहीं।
  • पूछो कयो (why)? यह हुआ है।
  • अब मुझे क्या करना चाहिए? मुझे क्या बदलना चाहिए?
  • जब तक आप वांछित परिणाम प्राप्त नहीं करते तब तक प्रयास करें। एक बार जब आप इसे छोड़ देंगे तो यह आपकी आदत बन जाएगी।

एक समस्या आपके लिए अपने को सर्वश्रेष्ठ करने का मौका है। – ड्यूक एलिंगटन


इसके अलावा, पढ़ें

कम्पाइलर की मूल बातें और फ़ंक्शन क्या है?

संकलन चरण बहुत गहराई से और gcc कमांड उपयोगिता।

यदि आप अभ्यास करना चाहते हैं और C प्रोग्रामिंग वातावरण सेटअप नहीं किया है तो आप ऑनलाइन GDB का उपयोग कर सकते हैं

Leave a Comment