Source: cmarathi.blogspot.in
See on Scoop.it – C Programming Language
Innovative e-learning project to learn C programming language in most simplest way ever. All concepts have been explained using extensive animation and real …
Source: www.youtube.com
Introductory Video of e-learning of C Programming language
See on Scoop.it – C Programming Language
Macros in C या पोस्ट मध्ये मी “__LINE__, __FILE__, __DATE__, __TIME__ हे काही predefined macros आहेत व या मॅक्रो विषयी मी एक संपुर्ण वेगळी पोस्ट लिहीते नंतर कधीतरी…” असे लिहीले होते. आठवत असेल कदाचित तुम्हाला. या पोस्ट मध्ये अशा प्रकारच्या काही मॅक्रो विषयी लिहीणार आहे. Academic level ला C चे programs लिहीतांना हे मॅक्रोज वापरले जात नसल्यामुळे अनेक वेळा शिकायचे राहून जातात. याचे कारण म्हणजे सॉफ्टवेअर डेव्हलप करतांना एकाच प्रोजेक्ट वर अनेक प्रोग्रॅमर अनेक फाइल्सवर काम करत असतात. आणी शेवटी सर्व प्रोजेक्ट कंपाइल करतांना व debug करतांना Warnings, Errors नेमक्या कोणत्या फाइल मध्ये आहेत कोणत्या लाइन नंबर ला आहेत कोणत्या वेळी कोणत्या दिवशी प्रोग्रॅम कंपाइल केला आहे याची माहीती हवी असते. या साठी हे मॅक्रो उपयोगी येतात.
तुम्हाला हे लगेच लक्षात येइल कि हे सर्व मॅक्रोजची नावे double underscore ने सुरू होतात व संपतात.
__LINE__ हा मॅक्रो ज्यावेळी preprocessor कडून expand होतो त्यावेळी current input line number हा integer constant च्या स्वरूपात प्रिंट करतो.
समजा एक साधा प्रोग्रॅम लिहून त्या मध्ये printf(“%d\n”,__LINE__) असे स्टेटमेंट लिहीले.
या ठिकाणी तुम्हाला आउटपुट खालील प्रमाणे दिसेल.
तुम्हाला 12 हे जे output दिसते ते __LINE__ macro expand झाल्यामुळे दिसते. व हा मॅक्रो line number return करतो म्हणून %d format specifier वापरून प्रिंट केला आहे. गंम्मत म्हणजे ज्या line ला हा मॅक्रो लिहाल त्या प्रमाणे हा expand होतो. तुम्ही हवं तर हा प्रोग्रॅम लिहुन __LINE__ असलेले प्रिंट एफ स्टेटमेंट वेगवेगळ्या line ला लिहून पहा. इतकेच नाही तर तुम्ही line number तुम्हाला हवा तो सेट सुद्धा करू शकता. त्यासाठी #line हा preprocessor directive वापरता येतो. म्हणजेच समजा मी वरील प्रोग्रॅम मध्ये #line directive वापरला व 100 ला सेट केला. जसे की…
तर तुम्हाला __LINE__ असलेल्या प्रिंट-एफ स्टेटमेंट मुळे मिळालेले output 110 असे असेल….!
__FILE__ हा predefined macro सुद्धा __LINE__ प्रमाणेच वापरला जातो फरक इतकाच की हा मॅक्रो expand झाल्यानंतर string return करतो. हा macro इतका intelligent आहे कि ज्या c च्या program मध्ये हा लिहीला जातो त्या फाइल चा current path return करतो. For example समजा एक छोटा प्रोग्रॅम असा लिहीला
तर तुम्हाला output अशा प्रकारचे मिळेल ज्या मध्ये file चा पुर्ण path प्रिंट होइल.
एक छान प्रोग्रॅम आपण या ठिकाणी पाहू. प्रोग्रॅम असा लिहायचा आहे कि त्या प्रोग्रॅम चे output तोच सर्व प्रोग्रॅम म्हणजे अर्थातच सोर्स कोड प्रिंट झाला पाहीजे. वरकरणी हा प्रोग्रॅम खुप कठीण वाटत असला तरी File handling व आत्ताच पाहीलेल्या मॅक्रोचा उपयोग करून हा प्रोग्रॅम लिहीता येतो. बघा खाली कसा लिहीलाय तो…
हा प्रोग्रॅम तुम्ही लिहून कंपाइल व रन करून पाहीला तर तुम्हाला output असे मिळेल…!
Isn’t it real power of C language…?
या पोस्टच्या सुरवातीला सांगीतल्या प्रमाणे अनेक फाइल मध्ये divide झालेला प्रोग्रॅम असेल आणी तुम्हाला अनेक ठिकाणी pair मध्ये वापरले जातात जेणे करून कोणत्या फाइल मध्ये कोणत्या line number ला bugs असण्याची अथवा शोधण्याची गरज भासेल…
याच series मध्ये __TIME__ आणी __DATE__ हे दोन predefined macros आहेत.
__DATE__ macro ज्यावेळी expand होतो त्यावेळी preprocessor ज्या दिवशी रन होतो ती date तुम्हाला string च्या स्वरूपात देतो. तर __TIME__ ज्या वेळी प्रोग्रॅम preprocessor run होतो ती वेळ तुम्हाला string च्या स्वरूपात देतो. म्हणजे जर तुम्ही असा प्रोग्रॅम लिहीला…
तर त्याचे output असे मिळेल…!
या पुढील पोस्ट मध्ये मी तुम्हाला इतर काही preprocessor directives मधील गमती-जमती सांगेन…
Till then Best Wishes and Happy Life…
See on Scoop.it – C Programming Language
Must Read…
See on cmarathi.blogspot.in
सर्वसामान्यपणे %d, %f, %c, %u, %s हे फॉर्मॅट स्पेसीफायर्स विद्यार्थ्यांना माहीत असतात. परंतू %n या फॉरॅट स्पेसीफायरचा उल्लेख कमी प्रमाणात आढळतो. हा फॉर्मॅट स्पेसीफायर तुलनेने गमतीशीर आहे कारण त्याचा वापर वेगळ्या पद्धतीने करावा लागतो. हा फॉर्मॅट स्क्रीन वर कीती कॅरेक्टर्स प्रिंट केली आहेत त्याची माहीती देतो. परंतू त्यासाठी printf function मध्ये जे argument लिहावे लागते ते pointer to unsigned integer या प्रकारचे गरजेचे असते. हे कळण्यासाठी मी एक छोटा प्रोग्रॅम खाली लिहीत आहे.
हा प्रोग्रॅम तुम्ही कंपाइल व रन केला तर तुम्हाला किती characters प्रिंट झाली त्याचा नंबर दिसतो.
अर्थात सर्व कंपायलरला अशी सुविधा असेल याचा भरोसा नाही हे सुद्धा लक्षात ठेवले पाहीजे. या ठिकाणी प्रिंट-एफ फंक्शनला num चा address पाठवला आहे.
See on Scoop.it – C Programming Language
नवीन वर्षाच्या हार्दीक शुभेच्छा. ऐका गोष्ट आणी करा शेअर तुम्हाला आवडली तर…! वर्गात प्रोग्रॅमिंग शिकायचे म्हणजे अनेक विद्यार्थ्यांना कंटाळवाणे होते. पहा या व्हिडीओ मध्ये फक्त झलक… आम्ही कसे सोप्…
See on www.cmarathionline.com
मागील दोन पोस्ट मध्ये मी Bitwise AND आणी Bitwise OR operator बद्दल लिहीले होते. मी या पोस्टमध्ये Bitwise NOT operator बद्द्ल सांगते. या विषयी मी Negative Number Storing मध्ये लिहीले आहे पण त्यावेळी focus वेगळा होता. या ठिकाणी फक्त Bitwise NOT operator बद्द्ल मी लिहीत आहे.
Bitwise NOT (~) चा मात्र Negation किंवा Logical NOT (!) operator चा काही संबंध नाही. ते फक्त unary operators आहेत इतकेच. एखादा ऑपरांड असेल समजा उदा. 35 तर या नंबरचा bit wise one’s complement घ्यायचा असेल तर ~35 असे लिहावे लागेल. अर्थात हा bit wise operator असल्यामुळे तो 35 च्या प्रत्येक बीट वर काम करतो. म्हणजेच 35 चा 00100011 हा जो Binary pattern आहे त्याचे प्रत्येक bit flip करतो व resultant pattern 11011100 असा होतो. याची Decimal value 220 आहे.
परंतू तुम्ही program लिहून ~35 चे output पाहील तर मात्र ते 220 न येता -36 असे मिळेल…!
थोडक्यात म्हणजे कोणत्याही integer (n) चा complement -(n+1) असतो. अर्थात हे सर्व कळण्यासाठी तुम्ही मी या पुर्वी लिहीलेला One’s आणी Two’s complement वर लिहीलेला post refer करा. तरच तुम्हाला हा सर्व गोलमाल कळेल.
File encryption साठी याचा अनेक वेळा उपयोग केला जातो हे वरील output वरून तुम्हाला कळाले असेलच…!
C programming language मध्ये File access करायची असेल तर file open करायला लागते हे आपण पाहीलेच आहे. fopen हे फंक्शन कॉल करतांना या फंक्शन मध्ये दुसरे argument हे, कोणत्या मोड मध्ये file open करायची आहे हे सांगण्यासाठी असते.
File फक्त read mode मध्ये open करायची असल्यास तुम्हाला r हा option उपलब्ध करून देण्यात आला आहे. अर्थात हे single character असले तरी fopen चे दुसरे argument string असल्यामुळे तुम्हाला दुसरे argument “r” असेच लिहायला लागते. ASCII text file असेल तर “rt” असे लिहावे असे C language सांगते पण ASCII text file हा default parameter असल्यामुळे “rt” च्या ऐवजी “r” असे लिहीले तरी चालते. किंबहूना अशीच प्रथा पडली आहे. file वर कोणतीही operations करायची असल्यास fopen function कॉल करून त्या नंतरच आपल्याला read, write, modify, append इत्यादी operations करता येतात. त्या मुळे समजा आपल्याला C drive वरील myprog या sub directory मधील mydata या sub directory मधील biodata.txt हि file read करायची असेल तर…
fp = fopen(“C:\\myprog\\mydata\\biodata.txt”, “r”);
असे statement लिहून function call करावे लागेल. \n, \b, \a व तत्सम escape sequences मुळे operating system ला string interpret करतांना अडचण येउ नये म्हणून \\ हा special escape sequence जाणीवपुर्वक वापरला आहे. दुसरा parameter हा read mode मध्ये file open करण्याची विनंती करत आहे, हि खरं तर compiler मार्फत operating system च्या API ला विनंती असते. Opening mode “r” असतांना
Read mode “r” चा उपयोग file फक्त read करायची असेल तरच केला जातो. अनेक वेळा आपल्याला hard disk वर एखादी file exist आहे की नाही या साठी सुद्धा Read mode चा वापर केला जातो.
याच Read mode “r” च्या ऐवजी “r+” असा जर file opening mode दिला तर
अनेक वेळा विद्यार्थी “r+” चा व “w” चा गोंधळ करून घेतात. पण “r+” ने existing contents read करता येतात व शिवाय modify सुद्धा करता येतात व या मोड मध्ये read आणी write दोनही operations existing contents वर करता येतात.
अर्थात text mode मधील file आपण open करत असल्यामुळे file accessing हे sequential असते हे लक्षात घेण्याची जरूरी आहे.
C language मध्ये file handling करतांना file pointer declare करण्याची गरज असते असे मी मागील पोस्ट मध्ये सांगीतले होते. हा file pointer तयार करण्यासाठी C च्या library मध्ये FILE structure available आहे. त्याची general definition सर्वसाधारणपणे अशी आहे.
typedef struct { int level; /* fill/empty level of buffer */ unsigned flags; /* File status flags */ char fd; /* File descriptor */ unsigned char hold; /* Ungetc char if no buffer */ int bsize; /* Buffer size */ unsigned char *buffer; /* Data transfer buffer */ unsigned char *curp; /* Current active pointer */ unsigned istemp; /* Temporary file indicator */ short token; /* Used for validity checking */ } FILE; /* This is the FILE object */
वरील Definition मध्ये फार काही समजावून घेण्याचा आटापिटा केला नाही तरी आपण जी file access करणार आहोत त्याची सर्व basic information स्टोअर करून ठेवण्याची व access करण्याची basic arrangement करून ठेवली आहे इतक तरी structure members कडे पाहील्या नंतर कळतं…!
Heap वरील मेमरी ज्या प्रमाणे unnamed असते व ती मेमरी access करण्यासाठी pointer लागतो त्याच प्रमाणे हार्ड डिस्क वरील file access करण्यासाठी pointer लागतो व तो FILE structure चा करतात. हे स्ट्रक्चर typedef केले असल्यामुळे FILE असेच लिहावे लागते. file किंवा File असे लिहीले तर compile time errors मिळतील.
आता या structure चे members कसे काम करतात, file pointer आत काय काय करतो, fopen function काय काय उद्योग करते असे प्रश्न अनेक विद्यार्थी विचारतात. अशा प्रकारची curiosity चांगली असली तरी programming शिकायला सुरवात केल्या केल्या २-४ वर्षात सुद्धा या प्रश्नांची उकल होणार नाही कारण अशा प्रकारची फंक्शन्स आपण ज्यावेळी कॉल करतो त्यांना Computer Programming World मध्ये API म्हणजेच Application Programming Interface म्हणतात. Programmer चे काम इतकेच कि FILE चा pointer तयार करणे, fopen function call करणे व system कडुन आलेला pointer collect करणे. त्या पेक्षा आत जाण्याची सोय सुरक्षेच्या कारणास्तव करूनच ठेवलेली नाही….!
तर मग fopen या फंक्शनचा prototype काय आहे…?
FILE *_Cdecl fopen(const char *__path, const char *__mode);
या prototype मध्ये
r, w, a, r+, w+, a+, rb, wb, ab, rb+, wb+, ab+ असे अनेक file opening modes आहेत ज्याचा समाचार मी पुढील काही पोस्ट मध्ये घेते….!
तो पर्यंत…Happy Coding…!