2012-07-02 4 views
5

के & आर, अध्याय 8 में, इसमें Putc और getc फ़ंक्शंस का एक कस्टम कार्यान्वयन है। Getc की पहली परिभाषा में, यदि पैरामीटर stdin है, _iob की परिभाषा के अनुसार, फ़ंक्शन पता 0 में लिखने का प्रयास करेगा क्योंकि यह वह मान है जो _iob [0] .ptr और _iob [0] .बेस थे सौंपा। क्या यह कानूनी है?क्या के एंड आर अधिकार का getc और putc कार्यान्वयन है?

कोड: http://ideone.com/AIkCA

_iob की परिभाषा:

FILE _iob[20] = { 
{0, (char *) 0, (char *) 0, _READ, 0}, 
{0, (char *) 0, (char *) 0, _WRITE, 0}, 
{0, (char *) 0, (char *) 0, _WRITE, 0} 
}; 
+9

आप अपने कोड में कोड क्यों पोस्ट नहीं करते प्रश्न और हमें बताएं कि आप किस पुस्तक का उपयोग कर रहे हैं? मुझे लगता है कि यहां हर किसी के पास यह समझने के लिए आसान नहीं है कि आप किस बारे में बात कर रहे हैं। – hugomg

+2

इस प्रकार के किसी भी भविष्य के प्रश्नों के मामले में, एक इरेटा पेज है के & R2 के लिए - कम से कम, वहां था। ऐसा लगता है कि अभी नीचे है। Google कैश में हालांकि यह है। (* विशाल यूआरएल छोड़ा गया *) यदि आपको अभी तक कोई त्रुटि नहीं मिली है, तो सी प्रोग्रामिंग दुनिया चौंक जाएगी। इसे हमारी बाइबल कहलाती है। हमने इसका अध्ययन किया है * हार्ड * –

+1

cm.bell-labs.com साइट वापस है अभी तक और लिंक अभी भी काम नहीं करता है। यहां फिर से है: http://cm.bell-labs.com/cm/cs/cbook/2edi ffs.html –

उत्तर

1

मान लिया जाये कि हम दोनों हमारे सामने एक ही कोड है, जवाब नहीं है।

#define getc(p) (--(p)->cnt >= 0 \ 
    ? (unsigned char) *(p)->ptr++ : _fillbuf(p)) 

stdincnt==0 साथ आरंभ नहीं हो जाता है, तो getc की इस परिभाषा ((p)->ptr को देखे बिना) _fillbuf को शाखा जाएगा, और _fillbuffp->base == NULL मामले के लिए विशेष कोड है और दोनों base और आबंटित स्मृति को ptr सेट।

+0

का 'विपरीत' नहीं होना चाहिए धन्यवाद, मैंने भी अपने उत्तर में एक ही चीज़ समझाई। – Gtiou

0

मुझे पूछे जाने वाले प्रश्नों के बाद कठिन समय हो रहा है, लेकिन सवाल में "कस्टम" के उपयोग से, यह देखने के लिए एक कोण यह है कि मौजूदा सिस्टम पर इन परिभाषाओं के साथ getc और putc को बदलना है या नहीं , और जवाब नहीं है। के & आर में उदाहरण आपको स्टडीओ लाइब्रेरी लिखने के लिए एक तरीका दिखा रहा है, ऐसा कुछ नहीं जो स्टडीओ के मौजूदा (संभवतः बहुत अलग) कार्यान्वयन के साथ काम कर सकता है।

0

दरअसल, मैं गलत था।

getc (stdin) की पहली कॉल में, काउंटर 0 होगा - (पी) -> सीएनटी नहीं होगा> = 0 तो _fillbuf कहा जाएगा। फिर fillbuf बफर आवंटित करेगा और फिर इसे पढ़ने के आदेश के साथ stdin से पढ़ा जाएगा (fp-> cnt = read (fp-> fd, fp-> ptr, bufsize)।

संबंधित मुद्दे