सी
पत्र "x" एक फ़ाइल में खो गया था। इसे खोजने के लिए एक कार्यक्रम लिखा गया था:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
FILE* fp = fopen("desert_file", "r");
char letter;
char missing_letter = argv[1][0];
int found = 0;
printf("Searching file for missing letter %c...\n", missing_letter);
while( (letter = fgetc(fp)) != EOF ) {
if (letter == missing_letter) found = 1;
}
printf("Whole file searched.\n");
fclose(fp);
if (found) {
printf("Hurray, letter lost in the file is finally found!\n");
} else {
printf("Haven't found missing letter...\n");
}
}
इसे संकलित किया गया और इसे चलाया गया और अंत में यह चिल्लाया:
Hurray, letter lost in the file is finally found!
कई सालों तक पत्रों को इस तरह से बचाया गया जब तक कि नया लड़का नहीं आया और कोड को अनुकूलित नहीं किया गया। वह डेटाटिप्स से परिचित था और जानता था कि गैर-नकारात्मक मूल्यों के लिए हस्ताक्षरित की तुलना में बिना उपयोग किए जाने के लिए बेहतर है क्योंकि इसकी व्यापक रेंज है और ओवरफ्लो के खिलाफ कुछ सुरक्षा प्रदान करता है। इसलिए उसने इंट को अहस्ताक्षरित इंट में बदल दिया । उन्होंने यह भी जान लिया कि वे हमेशा गैर-नकारात्मक मूल्य रखते हैं। इसलिए उन्होंने चार को अहस्ताक्षरित चार में बदल दिया । उसने कोड संकलित किया और अपने द्वारा की गई अच्छी नौकरी पर गर्व किया। कार्यक्रम इस तरह देखा:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[]) {
FILE* fp = fopen("desert_file", "r");
unsigned char letter;
unsigned char missing_letter = argv[1][0];
unsigned int found = 0;
printf("Searching file for missing letter %c...\n", missing_letter);
while( (letter = fgetc(fp)) != EOF ) {
if (letter == missing_letter) found = 1;
}
printf("Whole file searched.\n");
fclose(fp);
if (found) {
printf("Hurray, letter lost in the file is finally found!\n");
} else {
printf("Haven't found missing letter...\n");
}
}
वह अगले दिन कहर ढाने आया था। पत्र "ए" गायब था और भले ही यह "एबीसी" युक्त "डेजर्ट_फाइल" में होना चाहिए था, लेकिन कार्यक्रम इसे हमेशा के लिए प्रिंट करने के लिए खोज रहा था:
Searching file for missing letter a...
उन्होंने उस लड़के को बर्खास्त कर दिया और पिछले संस्करण में याद करते हुए कहा कि काम करने वाले कोड में कभी भी डेटाटाइप्स का अनुकूलन नहीं करना चाहिए।
लेकिन क्या सबक है जो उन्हें यहां सीखना चाहिए था?
सबसे पहले, यदि आप एससीआई तालिका पर एक नज़र डालते हैं, तो आप देखेंगे कि कोई ईओएफ नहीं है। ऐसा इसलिए है क्योंकि EOF एक चरित्र नहीं है, लेकिन fgetc () से लौटाया गया एक विशेष मान है, जो या तो फ़ाइल के अंत या -1 को दर्शाते हुए वर्ण को वापस लौटा सकता है।
जब तक हम हस्ताक्षरित चार का उपयोग कर रहे हैं तब तक सब कुछ अच्छी तरह से काम करता है - 50 के बराबर चार्ट fgetc () के साथ-साथ 50 के बराबर इंट में बढ़ाया जाता है। फिर हम इसे चार में बदल देते हैं और अभी भी 50 हैं। वही -1 या किसी अन्य आउटपुट के लिए होता है जो fgetc () से आता है।
लेकिन देखो, जब हम अहस्ताक्षरित चार का उपयोग करते हैं तो क्या होता है। हम fgetc () में एक चार से शुरू करते हैं और इसे int तक बढ़ाते हैं और फिर एक अहस्ताक्षरित char चाहते हैं। एकमात्र समस्या यह है कि हम अहस्ताक्षरित चार में -1 को संरक्षित नहीं कर सकते हैं। कार्यक्रम इसे 255 के रूप में संग्रहीत कर रहा है जो अब ईओएफ के बराबर नहीं है।
चेतावनी
यदि आप ANSI C दस्तावेज़ीकरण की धारा 3.1.2.5 प्रकारों पर एक नज़र डालते हैं, तो आपको पता चलेगा कि क्या चार पर हस्ताक्षर किए गए हैं या नहीं यह पूरी तरह से कार्यान्वयन पर निर्भर करता है। तो आदमी को शायद बर्खास्त नहीं किया जाना चाहिए क्योंकि उसे कोड में बहुत मुश्किल बग लपका। यह संकलक को बदलने या विभिन्न वास्तुकला में जाने पर बाहर आ सकता है। मुझे आश्चर्य है कि अगर इस तरह के मामले में बग सामने आया तो किसे निकाल दिया जाएगा;)
पुनश्च। कार्यक्रम पॉल ए कार्टर द्वारा पीसी असेंबली लैंग्वेज में उल्लिखित बग के आसपास बनाया गया था