[Powered by Google Translate] [CS50 لائبریری] [نیٹ Hardison] [ہارورڈ یونیورسٹی] یہ [CS50 ہے. CS50.TV] CS50 لائبریری میں ایک مفید آلہ ہے کہ ہم آلے پر نصب کیا ہے آسان آپ کے لئے پروگرام لکھنے بنانے کے لئے ہے کہ ان پٹ کے لئے فوری طور پر صارفین. اس ویڈیو میں، ہم واپس پردے ھیںچو اور CS50 کی لائبریری میں بالکل وہی جو ہے دیکھو گے. C لائبریریوں پر ویڈیو میں، ہم کس طرح آپ نے # ہیڈر فائلوں میں شامل ہیں کے بارے میں بات آپ کے منبع کوڈ میں لائبریری کا اور پھر آپ کو لائبریری ایک بائنری فائل کے ساتھ منسلک مرحلے کے دوران لنک تالیف کے عمل کی. ہیڈر فائلوں کو لائبریری کے انٹرفیس کی وضاحت کریں. یہی وجہ ہے کہ، وہ کہ وسائل کی لائبریری میں دستیاب ہے، آپ کے لئے استعمال کرنے کے لئے تفصیل، تقریب کے ڈیکلیریشنز، constants، اور ڈیٹا کی اقسام کی طرح. بائنری لائبریری فائل لائبریری کے نفاذ پر مشتمل ہے، جو لائبریری کے ہیڈر فائلوں اور لائبریری C منبع کوڈ فائلوں سے مرتب کیا جاتا ہے. بائنری لائبریری فائل میں کیونکہ یہ بائنری میں، نظر میں بہت دلچسپ نہیں ہے. تو، لائبریری کے لئے ہیڈر بجائے فائلوں پر ایک نظر لے. اس صورت میں، صرف ایک ہیڈر کہا جاتا cs50.h. فائل ہے ہم صارف اسے نصب ہے ڈائریکٹری میں شامل ہیں ساتھ دوسرے نظام لائبریریوں کے ہیڈر کے فائلوں کے ساتھ. پہلی چیزیں ہیں جو آپ کو محسوس کریں گے میں سے ایک یہ ہے کہ cs50.h # دوسرے لائبریریوں سے ہیڈر فائلوں پر مشتمل ہے - فلوٹ، حدود، معیاری bool، اور معیاری lib. ایک بار پھر، نہیں وہیل reinventing کے اصول کے بعد ہم CS0 اوزار کہ دوسرے ہمارے لئے فراہم کی کا استعمال کرتے ہوئے لائبریری کی تعمیر ہے. اگلی چیز ہے جو آپ کو لائبریری میں دیکھ لیں گے یہ ہے کہ ہم نامی ایک نئی قسم کی وضاحت "STRING." یہ لائن واقعی صرف چار * کی قسم کے لیے ایک عرف تخلیق کرتا ہے، لہذا یہ صفات کے ساتھ نئی سٹرنگ قسم جادوئی نہیں کرتا imbue عام طور پر دیگر زبانوں میں سٹرنگ اشیاء کے ساتھ منسلک، اس طرح کی حد کے طور پر. وجہ سے ہم نے یہ کیا ہے رکتمی تفصیلات سے نئے پروگرامرز ڈھال ہے اشارہ یہاں تک کہ وہ تیار ہیں. ہیڈر فائل کے اگلے حصہ کے افعال میں سے اعلان ہے کہ CS50 لائبریری دستاویزات کے ساتھ فراہم کرتا ہے. یہاں تبصرے میں تفصیل کی سطح نوٹس. یہ انتہائی اہم ہے تاکہ لوگوں کو پتہ ہے کہ کس طرح یہ کام کرتا ہے استعمال کرنے کے لئے. ہم اس کے نتیجے میں اعلان، صارف اور واپسی کے حروف، ڈبلز، floats، ints فوری طور پر کام کرتا ہے، طویل چاہتا ہے، اور ڈور، ہمارے اپنے سٹرنگ قسم کا استعمال کرتے ہوئے. معلومات چھپا کے اصول کے بعد، ہم نے ایک الگ سی عمل درآمد فائل میں ہماری تعریف ڈال دیا ہے - cs50.c - صارف کا ذریعہ ڈائریکٹری میں واقع ہے. ہم نے وہ فائل فراہم کی تاکہ تم اس پر ایک نظر لے جا سکتے ہیں ہے، اس سے سیکھ سکتے ہیں اور مختلف مشینوں پر اگر تم چاہو تو recompile اگرچہ ہم لگتا ہے کہ یہ بہتر ہے اس کلاس کے لئے آلات پر کام کرنے کے. بہر حال، اس پر ایک نظر اب لے. افعال GetChar، GetDouble، GetFloat، GetInt، اور GetLongLong سب GetString تقریب کے سب سے اوپر پر تعمیر کیا ہے. یہ پتہ چلا ہے کہ وہ سب کے سب بنیادی طور پر اسی طرز پر عمل کریں. وہ تھوڑی دیر کے لوپ استعمال کرتے ہیں ان پٹ کی ایک لائن کے لئے صارف کو فوری طور پر. یہ صارف ایک خالی لائن آدانوں اگر ایک خاص قیمت واپس. انہوں نے مناسب قسم کے طور پر صارف کی ان پٹ کا تجزیہ کرنے کی کوشش، اسے چار، ایک ڈبل، فلوٹ، وغیرہ اور پھر وہ یا تو نتیجہ واپس اگر ان پٹ کامیابی کے ساتھ تصریف ہوئی یا وہ صارف reprompt. ایک اعلی سطح پر، وہاں واقعی مشکل یہاں کچھ نہیں ہے. تم اسی طرح تشکیل کوڈ لکھا ہو سکتا ہے ماضی میں یہ خود ہیں. شاید سب سے زیادہ خفیہ نظر حصہ sscanf کال ہے جو صارف کی ان پٹ parses ہے. Sscanf ان پٹ فارمیٹ تبادلوں کے خاندان کا حصہ ہے. یہ معیار io.h میں رہتا ہے، اور اس کا کام C سٹرنگ کا تجزیہ کرنے کے لئے ہے، ایک خاص شکل کے مطابق، متغیر میں تصریف کے نتائج کو ذخیرہ کرنے فون کرنے والے کی طرف سے فراہم کی ہے. چونکہ ان پٹ فارمیٹ کے تبادلوں کے افعال بہت مفید ہے، وسیع پیمانے پر استعمال کیا جاتا افعال ہیں جو سپر بدیہی نہیں ہیں، پہلے ہم کس طرح sscanf کام کریں گے. پہلے sscanf دلیل چار * ہے - ایک کردار پر ایک پوائنٹر. کے لیے تقریب مناسب طریقے سے کام کرنے کہ کردار C سٹرنگ کے پہلے کردار ہونا چاہئے، شہوت انگیز null \ 0 کردار کے ساتھ ختم. یہ تجزیہ سٹرنگ ہے دوسری sscanf دلیل ایک شکل سٹرنگ ہے، عام طور پر ایک تار مسلسل کے طور پر میں منظور، اور آپ جب printf استعمال کرنے سے پہلے اس طرح ایک تار دیکھا کر سکتے ہیں. کی شکل سٹرنگ میں فیصد تبادلوں کے specifier یہ اشارہ کرتا ہے کہ. کردار کو فوری طور پر ایک فیصد علامت کے بعد، سی قسم ہے کہ ہم چاہتے ہیں تبدیل کرنے sscanf کی طرف اشارہ کرتا ہے. GetInt میں تم نے دیکھا، کہ وہاں٪ ڈی اور فیصد کی سی ہے. اس کا مطلب یہ ہے کہ sscanf دشملو int کی کوشش کریں گے -٪ D - اور ایک چار -٪ C. کی شکل سٹرنگ میں ہر تبادلے specifier کے لئے، sscanf اس کی دلیل کی فہرست میں بعد میں اسی دلیل کی توقع رکھتا ہے. یہ دلیل ایک مناسب طریقے سے ٹائپ شدہ مقام پر کی طرف اشارہ کرنا ضروری ہے کے تبادلوں کا نتیجہ ہے جس میں محفوظ ہے. ایسا کرنے کی مخصوص طریقہ sscanf کال سے پہلے اسٹیک پر ایک متغیر کی تخلیق ہے ہر آئٹم ہے کہ آپ کو سٹرنگ سے تجزیہ کرنا چاہتے ہیں کے لئے ایمپرسینڈ - - اشارہ کو منتقل کرنے کی اور پھر ایڈریس آپریٹر کا استعمال sscanf کال ان متغیرات. تم نے دیکھا ہے کہ ہم GetInt میں بالکل ایسا کر سکتے ہیں. sscanf کال سے پہلے، ہم نے ایک کہا جاتا ن int اور اسٹیک پر ایک چار کال سی کا اعلان کرتے ہیں، اور ہم sscanf کال میں ان سے اشارہ گزر. اسٹیک پر ان متغیرات میں ڈال مختص خلا کا استعمال کرتے ہوئے میں ترجیح دی جاتی ہے ، malloc کے ساتھ ڈھیر، کیونکہ آپ malloc کال کی ہیڈ سے بچنے اور آپ کو میموری حمل کا پانی جاری کرنے کے بارے میں فکر کرنے کی ضرورت نہیں ہے. prefixed فیصد کی علامت کی طرف سے نہیں کردار سے تبادلوں کی فوری طور پر نہیں ہے. بلکہ وہ صرف شکل تفصیلات شامل کریں. مثال کے طور پر، اگر GetInt میں فارمیٹ سٹرنگ٪ D بجائے تھے sscanf خط ایک کے بعد ایک int کے لئے نظر آئے گا، جبکہ int تبدیل کرنے کی کوشش کریں گے، اس کے ساتھ کچھ اور نہیں کریں گے. صرف اس رعایت وائٹ ہے. وائٹ فارمیٹ سٹرنگ میں جگہ حروف وائٹ کے کسی بھی رقم سے ملتے ہیں - بالکل بھی نہیں ہے. تو، یہی وجہ ہے کہ تبصرہ کی قیادت اور / یا وائٹ پیچھے کے ساتھ ممکنہ طور پر ذکر ہے. لہذا، اس نقطہ یہ ہماری sscanf کال کی طرح لگ رہا ہے میں صارف کی ان پٹ سٹرنگ کا تجزیہ کرنے کی کوشش کریں گے ممکن معروف وائٹ کے لئے کی جانچ پڑتال کی طرف سے، int جو int متغیر (ن) میں تبدیل ذخیرہ کے بعد بعد وائٹ میں سے کچھ رقم کی طرف سے ہے، اور ایک کردار کے بعد چار متغیر سی میں محفوظ ہے. واپسی قیمت کے بارے میں کیا خیال ہے؟ Sscanf سے شروع ان پٹ لائن کی تشریح کرنے سے ختم ہو جائے گا، جب اس کے آخر تک پہنچ روکنے یا جب ان پٹ میں ایک کردار ایک شکل کردار سے مماثل نہیں یا جب وہ ایک تبادلہ نہیں کر سکتے ہیں. یہ واپسی قیمت جب وہ روک دیا اکیلا کے لئے استعمال کیا جاتا ہے. اگر یہ بند کر دیا، کیونکہ یہ ان پٹ سٹرنگ کے آخر تک پہنچ گئی کسی تبادلوں کو کرنے سے پہلے اور فارمیٹ سٹرنگ کا حصہ سے ملنے میں ناکامی کی صورت میں پیدا ہونے والی سے پہلے، پھر خصوصی مسلسل مسل اختتام کو اس لئے واپس بھیج چکے ہیں. دوسری صورت میں، یہ کامیاب تبادلوں کی تعداد واپس، جو 0، 1، یا 2 ہو سکتا ہے، کیونکہ ہم نے دو تبادلوں کے لئے کہا ہے. ہمارے معاملے میں، ہمیں اس بات کا یقین کر لیں کہ ہے کہ صارف کسی int اور صرف ایک int میں ٹائپ کرنے کے لئے کرنا چاہتے ہیں. لہذا، ہم sscanf 1 واپس کرنا چاہتے ہیں. دیکھو کیوں؟ اگر sscanf 0 واپس آئے، تو کوئی تبادلوں کی گئی، تو صارف ان پٹ کے آغاز میں ایک int سے کچھ ٹائپ. اگر sscanf 2 واپس، تو صارف کو مناسب طریقے سے ان پٹ کے آغاز میں میں نے ٹائپ کریں، لیکن وہ تو کچھ کردار غیر وائٹ بعد ٹائپ ٪ کے بعد سی تبادلوں کامیاب ہو گئے. واہ، یہ بہت ایک تقریب کے فون کا ایک طویل وضاحت ہے. ویسے بھی، اگر آپ sscanf اور اس کے بہن بھائیوں کے بارے میں مزید معلومات چاہتے ہیں، آدمی کے صفحات، گوگل، یا دونوں کو چیک کرنے کے لیے. کی شکل سٹرنگ کے اختیارات میں سے بہت سے ہیں، اور یہ آپ کو دستی محن کی بہت محفوظ جب سی میں تاروں کا تجزیہ کرنے کی کوشش کر سکتے ہیں لائبریری میں حتمی تقریب میں نظر GetString ہے. یہ پتہ چلا ہے کہ GetString ٹھیک سے لکھنے کے لئے ایک مشکل کام ہے، اگرچہ یہ اس طرح ایک آسان، عام کام کی طرح لگتا ہے. یہی وجہ ہے کہ مقدمہ؟ چلو، کہ ہم کس طرح لائن ذخیرہ کرنے جا رہے ہیں کے بارے میں سوچنا ہے کہ اندر صارف اقسام چونکہ ایک تار حروف کی ایک ہی تسلسل ہے، ہم اسٹیک پر ایک صف میں محفوظ کرنا چاہتے ہیں کر سکتے ہیں، لیکن ہم جانتے ہیں کہ کب تک صف ہونے جا رہا ہے جب ہم اس کا اعلان کرنے کی ضرورت گا. اسی طرح، اگر ہم اسے ڈھیر پر ڈال کرنا چاہتے ہیں، ہم malloc بائٹس کی تعداد ہے ہم ریزرو کرنا چاہتے ہیں کو منتقل کرنے کی ضرورت ہے، لیکن یہ ناممکن ہے. ہم نے کوئی اندازہ نہیں ہے کتنے حروف صارف میں ٹائپ گا سے پہلے صارف اصل میں ان کو ٹائپ کرتا ہے. ایک بولی اس مسئلہ کا حل صرف علاقے کا ایک بڑا حصہ محفوظ رکھتے ہیں، کا کہنا ہے کہ، ہے صارف کی ان پٹ کے لئے 1000 حروف کا ایک بلاک، یہ سوچتے ہیں کہ صارف کو ایک تار میں ٹائپ کبھی نہیں جب تک کہ گے. یہ دو وجوہات کی بنا پر ایک برا خیال ہے. پہلے سنبھالنے کے، کہ ڈور میں صارفین عام طور پر نہیں ٹائپ جب تک کہ، آپ کو میموری کا ایک بہت برباد کر سکتے ہیں. جدید مشینوں پر، یہ ایک مسئلہ نہیں اگر آپ ایسا کر سکتے ہیں ایک یا ایک سے دو الگ تھلگ کی مثالوں میں، لیکن اگر تم ایک لوپ میں صارف کی ان پٹ لے جا رہے ہیں اور بعد میں استعمال کرنے کے لئے ذخیرہ کرنے آپ کو فوری طور پر میموری کا ایک ٹن دودھ کر سکتے ہیں. کے علاوہ، اگر پروگرام آپ لکھ رہے ہیں کہ ایک چھوٹے کمپیوٹر کے لئے ہے - محدود میموری کے ساتھ ایک smartphone یا کچھ اور کی طرح ایک آلہ - اس حل مسائل تیزی سے ایک بہت کا سبب بن جائے گا. دوسرے، زیادہ سنگین نہیں کرنا وجہ یہ ہے کہ یہ آپ کا پروگرام چھوڑ دیتا ہے کمزور کیا ایک بفر اتپرواہ حملے کہا جاتا ہے. پروگرامنگ میں ایک بفر عارضی طور پر ان پٹ یا پیداوار کے اعداد و شمار جمع تھے میموری ہے، جو اس معاملے میں ہماری بلاک 1000 حروف ہے. ایک بفر اتپرواہ اس وقت ہوتی ہے جب ڈیٹا بلاک کے آخر ماضی کے وزٹرز کا ریکارڈ رکھا جائے گا. مثال کے طور پر، اگر کسی صارف کو اصل میں 1000 سے زیادہ حروف ٹائپ کرتا ہے. آپ کو یہ اتفاقی طور پر تجربہ ہو سکتا ہے جب arrays کے ساتھ پروگرامنگ. اگر آپ 10 ints کی ایک صف ہے، کچھ بھی نہیں آپ کو پڑھنے یا لکھنے کے لئے کی کوشش کر رہے سے روکتا ہے 15th int. کوئی سنکلک انتباہ یا غلطیاں ہیں. پروگرام صرف براہ راست غلطیوں اور میموری تک رسائی حاصل جہاں یہ سوچتا ہے کہ 15th int ہے، اور یہ اپنے دوسرے متغیر ادلیکھت کر سکتے ہیں کریں گے. بدترین صورت میں، آپ کو آپ کے پروگرام کے اندرونی کچھ ادلیکھت کر سکتے ہیں کنٹرول کے نظام، آپ کے پروگرام کی وجہ سے اصل میں مختلف ہدایات پر عمل کرنے تم سے چاہتا تھا. اب، یہ اتفاقی طور پر کرنا عام نہیں ہے، لیکن یہ ایک منصفانہ عام ٹیکنالوجی کا ہے کہ برے لوگوں کے پروگراموں کو توڑنے کے لئے استعمال کرتے ہیں اور دوسرے لوگوں کے کمپیوٹر پر درنساوناپورن کوڈ ڈال دیا ہے. لہذا، ہم صرف ہماری بولی حل نہیں استعمال کر سکتے ہیں. ہم نے ایک کمزور ہونے سے ہمارے پروگرام کو روکنے کا طریقہ کی ضرورت ہے بفر اتپرواہ کے حملے. ایسا کرنے کے لئے، ہم اس بات کا یقین کر لیں کہ ہمارے بفر بڑھ جیسا کہ ہم پڑھ سکتے ہیں بنانے کے لئے کی ضرورت ہے صارف سے زیادہ ان پٹ. حل کیا ہے؟ ہم ایک ڈھیر مختص بفر کا استعمال کرتے ہیں. ہم چونکہ سائز تبدیل کر سکتے ہیں بازسائز realloc تقریب کا استعمال کرتے ہوئے، اور ہم دونوں کی تعداد کے ٹریک رکھنے کے لئے - بفر میں اگلی خالی عہدے کے سوچکانک اور کی حد یا بفر کی صلاحیت ہے. ایک صارف سے حروف میں ہم fgetc تقریب کا استعمال کرتے ہوئے وقت پڑھا. دلیل fgetc تقریب لیتا ہے - stdin - معیاری ان پٹ سٹرنگ پر ایک حوالہ ہے، جس میں ایک preconnected ان پٹ چینل ہے کہ صارف کی ان پٹ کو منتقل کرنے کا استعمال کیا جاتا ہے ہے ٹرمینل سے پروگرام. جب بھی ایک نئے کردار میں صارف اقسام، ہم دیکھ کر چیک کریں اگر انڈیکس اگلے مفت سلاٹ کے علاوہ 1 بفر کی صلاحیت سے زیادہ ہے. +1 کیونکہ اگر اگلے مفت انڈیکس 5 میں آتا ہے، تو ہمارے بفر کی لمبائی 6 شکریہ: 0 تخکرمن ہونا ضروری ہے. اگر ہم خلا سے باہر بفر میں چلتی ہے، تو ہم اس کا سائز تبدیل کرنے کی کوشش ہے، اس کو دگنا کرنے تاکہ ہم بار کی تعداد کم کر کے ہم اس کا سائز تبدیل اگر صارف ایک بہت طویل سٹرنگ میں ٹائپ کر رہا ہے. اگر سٹرنگ بھی طویل ہو گیا ہے یا اگر ہم ڈھیر میموری سے باہر چلانے کے، ہم اپنے بفر اور واپسی شہوت انگیز null مفت. آخر میں، ہم بفر پر حروف شامل ہیں. ایک بار صارف ہٹ یا واپس درج کریں، ایک نئی سطر کا اشارہ یا خصوصی حروف - کنٹرول D - جو ان پٹ کے ختم ہونے کا اشارہ ہے، ہم اگر صارف اصل میں کسی بھی چیز میں ٹائپ بالکل دیکھنے کے لئے چیک کرتا ہوں. اگر نہیں، تو ہم شہوت انگیز null واپس. دوسری صورت میں، کیونکہ ہمارا بفر شاید بڑے سے ہمیں ضرورت ہے، بدترین صورت میں یہ تقریبا دو گنا بڑی ہے جیسا کہ ہمیں ضرورت ہے کیونکہ ہم ہر بار جب ہم کا سائز تبدیل، ڈبل ہم نے خلا کی رقم ہے جو ہمیں درکار کا استعمال کرتے ہوئے سٹرنگ کے ایک نئی کاپی بناتے ہیں. ہم malloc کال کرنے کے لئے ایک اضافی 1 شامل \ 0 - تاکہ خصوصی شہوت انگیز null مختتم کردار کے لئے جگہ ہے جو ہم سٹرنگ پر شامل ہے ایک بار ہم حروف کے باقی حصوں میں کاپی کرنے کے، بجائے strcpy strncpy کا استعمال کرتے ہوئے تو ہم اس کی وضاحت ہم بالکل کتنے حروف کاپی کرنا چاہتا ہوں کر سکتے ہیں. Strcpy نقل کرتا ہے جب تک یہ ایک \ 0 مار دیتی ہے. اس وقت ہم اپنے کی بفر آزاد اور فون کرنے والے سے نقل واپس. کون جانتا تھا کہ اس طرح کی ایک تقریب سادہ دیکھنے رکھا جائے پیچیدہ کیا جا سکتا ہے؟ اب تمہیں معلوم ہے کہ CS50 لائبریری میں چلا جاتا ہے. میرا نام نیٹ Hardison ہے، اور اس CS50 ہے. [CS50.TV]