[Powered by Google Translate] [5 सप्ताह] [डेविड जे Malan, हार्वर्ड विश्वविद्यालय] [यह CS50 है.] [CS50.TV] [महिला] वह झूठ बोल रहा है, के बारे में क्या है, मैं नहीं जानता कि. [आदमी] तो हम क्या जानते हो? [महिला] कि 9:15 पर, रे Santoya एटीएम पर था. [मैन] तो सवाल है, वह क्या था 9:16 पर कर रहे हैं? [महिला] कुछ में 9 मिमी शूटिंग. शायद वह निशानची देखा. [आदमी] या वह उसके साथ काम कर रहा था. [महिला] रुको. एक वापस जाओ. [आदमी] आप क्या देखते हैं? [♫ suspenseful संगीत ♫] [महिला] उसके चेहरे लाओ. पूर्ण स्क्रीन. [आदमी] उनकी चश्मा. >> एक प्रतिबिंब है. [♫ suspenseful संगीत ♫] मैन] यह है Nuevita बेसबॉल टीम है. वह अपने लोगो है. [महिला] और वह करने के लिए बात कर रहा है कि जो कोई भी जैकेट पहने हुए है. [दाऊद Malan] तो, इस CS50 5 सप्ताह है, और आज हम आप के लिए टीवी और फिल्म के एक बिट बर्बाद. तो जब भी आप यह यहाँ एक तरह एक शो देख रहे हैं, और पुलिस का कहना है कि "आपको लगता है कि साफ कर सकते हैं?" या "को बढ़ावा देने के" वहाँ कोई वास्तविक दुनिया में वृद्धि है. वास्तव में, क्या तुम सच में इस तरह एक छोटे से कुछ है. मैं एक पृष्ठ से कर्मचारियों तस्वीरें खींच लिया है. यह एक Photoshop नामक कार्यक्रम है. यह 1 2 Bowdens की है, 1 3 वास्तव Bowdens, आज, क्योंकि हम श्रीमती Bowden यहाँ के रूप में अच्छी तरह से रोब और पॉल के साथ है. लेकिन यहाँ स्क्रीन पर रोब है, और अगर हम उस चमक पर ज़ूम वह हमेशा अपनी आंखों में था, क्या आप वास्तव में यह है कि क्या तुमने देखा है कि तुम क्या हो. यह है "बढ़ाया," तो "सीएसआई" यह एक बिट गलत है. वहाँ एक अन्य क्लिप है, अगर हम अब सिर्फ एक छोटा सा "सीएसआई" पर ले सकते हैं. आगे से बोलना अगर तुम चाहते हो के लिए यह एक अच्छा मुहावरा है अपने दोस्तों के साथ तकनीकी ध्वनि जब, वास्तव में, तुम बिल्कुल कुछ भी नहीं कह रहे हैं. [आदमी] सप्ताह के लिए मैं कोचवान खूनी हत्याओं के जांच की गई है एक निश्चित स्र्ग्ण आकर्षण के साथ. [महिला # 1] यह वास्तविक समय में है. [महिला # 2] मैं एक जीयूआई Visual Basic का उपयोग इंटरफ़ेस बनाने के लिए, अगर मैं एक आईपी पते को ट्रैक कर सकते हैं. [Malan] तो अलग सिंक के ऑडियो, एक जीयूआई Visual Basic का उपयोग इंटरफ़ेस बनाने एक आईपी पते को ट्रैक करने के लिए पूरी तरह बकवास है. इन दिनों आप Visual Basic का उपयोग नहीं होता, वहाँ एक जीयूआई के लिए कोई ज़रूरत नहीं है, और आईपी पते में एक तकनीकी तौर पर सही शब्द था. तो एक नज़र रखना इन के लिए, और एक मेरे पसंदीदा में से एक: यह एक एक छोटे से अधिक रहस्यमय है, क्योंकि आप एक अलग भाषा जानने की जरूरत है. एक उद्देश्य सी बुलाया भाषा है, जो सी के एक superset है जो यह सी प्लस कुछ अतिरिक्त सुविधाओं उन्हें वस्तु उन्मुख प्रोग्रामिंग में, इसका मतलब है. और इस भाषा है कि एप्पल iOS प्रोग्रामिंग के लिए लोकप्रिय है. और इसलिए यहाँ एक अलग शो पूरी तरह से एक क्लिप है, से "नंबर" कि अगर आप वास्तव में सही समय पर अपने TiVo और ठहराव पर बारीकी से देखो, आप देखेंगे कि वे देख रहे हैं क्या काफी नहीं है क्या वर्णित किया जा रहा है है. और मुझे एक अलग ऑडियो संबंधक यहाँ कोशिश करो और देखो अगर हम नहीं कर सकते सिंक में ऑडियो रखने के लिए इस समय. मैं तुम्हें "नंबर दे." [मैन # 1] यह एक 32-bit IPv4 पता है. [आदमी 2], आईपी है कि इंटरनेट का है. >> निजी नेटवर्क. यह अनीता निजी नेटवर्क है. [Malan] ठीक है. यह उद्देश्य सी है, और यह कुछ बच्चे रंग कार्यक्रम के लिए है, के रूप में आप शायद वहाँ चर के नाम से अनुमान लगा सकते हैं. ताकि, तो था, "नंबर." और आज तो इस हफ्ते हम परिचय फोरेंसिक और इसलिए समस्याओं के संदर्भ में की दुनिया का एक छोटा सा. आज एक संक्षिप्त व्याख्यान हो सकता है क्योंकि यहाँ एक विशेष घटना है बाद, तो हम एक तिरछी नज़र रखना, करेंगे और दोनों छात्रों और एक जैसे माता पिता आज तंग चीजें हैं कि क्षितिज पर हैं में से कुछ के साथ. उनमें से, सोमवार के रूप में, आप कुछ और सहपाठियों होगा. EDX, हार्वर्ड, और MITS नया ऑनलाइन मुक्त पाठ्य सामग्री के लिए पहल और अधिक, हार्वर्ड परिसर पर सोमवार को शुरू होता है. पिछली गणना के रूप में, जो आने सोमवार मतलब है कि आप होगा 86,000 अतिरिक्त सहपाठियों CS50 व्याख्यान के साथ साथ पालन किया जाएगा और वर्गों और walkthroughs और समस्या सेट. और इस के भाग के रूप में, आप के उद्घाटन वर्ग के सदस्य बन जाएगा CS50 और अब CS50x. इस के भाग के रूप में, अब एहसास है कि वहाँ कुछ upsides के रूप में अच्छी तरह से हो जाएगा. छात्रों की भारी संख्या के लिए इस बात के लिए तैयार हो, इतना ही कहना है कि भले ही हम 108 TFS और सीए, नहीं काफी बेहतरीन छात्र / शिक्षक अनुपात एक बार हम 80,000 अन्य छात्रों को मारा. तो हम इतने सारे समस्या ग्रेडिंग नहीं जा रहे हैं मैन्युअल सेट. तो समस्या सेट में इस सप्ताह शुरू CS50 जांच हो जाएगा, जो करने के लिए एक कमांड लाइन उपयोगिता उपकरण के भीतर जा रहा है है कि आप एक बार आप इसे बाद में इस सप्ताह के अंत में अद्यतन करने के लिए मिल जाएगा, और आप के लिए एक कमांड को चलाने के लिए सक्षम हो जाएगा, 50 की जांच, , अपने खुद के pset पर और आप के रूप में है कि क्या अपने कार्यक्रम कुछ प्रतिक्रिया मिल जाएगा प्रदान की है कि हम विभिन्न डिजाइन विनिर्देशों के अनुसार सही है या गलत. तो उस पर अधिक से समस्या और सेट विनिर्देश CS50x सहपाठियों के रूप में अच्छी तरह से उपयोग किया जाएगा. तो समस्या 4 सेट फोरेंसिक सब के बारे में है. और इस टुकड़े के कुछ सामान वास्तविक जीवन से प्रेरित था, जिससे जब मैं स्कूल में था स्नातक, मैं के साथ थोड़ी देर के लिए interned मिडिलसेक्स काउंटी जिला अटार्नी कार्यालय फोरेंसिक काम कर रही उनके नेतृत्व फोरेंसिक अन्वेषक के साथ, और यह क्या की राशि है, मुझे लगता है कि मैं कुछ सप्ताह के अतीत का उल्लेख किया, मास राज्य पुलिस या दूसरों में आ जाएगा, वे बंद हार्ड ड्राइव और सीडी और फ्लॉपी डिस्क की तरह बातें छोड़ जाएगा और इस तरह, और तो फोरेंसिक कार्यालय के लक्ष्य पता लगाने के लिए किया गया था कि क्या वहां गया था या किसी तरह के सबूत नहीं था. यह विशेष अन्वेषण यूनिट था, तो यह सफेद कॉलर अपराध था, यह अपराधों के अधिक परेशान प्रकार था, डिजिटल मीडिया के किसी तरह का कुछ भी शामिल है, पता चला है कि नहीं है कि कई लोग एक कह ईमेल लिखने "मैंने ऐसा किया था." इसलिए अक्सर इन फोरेंसिक खोजों कि सभी ज्यादा फल बारी नहीं किया था, लेकिन कभी कभी लोगों को ऐसी ईमेल लिखना होगा. तो कभी कभी प्रयासों को पुरस्कृत किया गया. लेकिन इस फोरेंसिक pset तक का नेतृत्व करने के लिए, हम 4 ग्राफिक्स के एक बिट pset में शुरू हो जाएगा. तो आप शायद दी, JPEGs GIFs, और इन दिनों की तरह के लिए इन बातों को ले, लेकिन अगर तुम सच में लगता है कि इसके बारे में, एक छवि, ज्यादा रोब चेहरे की तरह, डॉट्स की एक अनुक्रम, या पिक्सल के रूप में modeled किया जा सकता है. अब, रोब चेहरे के मामले में, वहाँ रंग के सभी प्रकार है, और हम व्यक्तिगत डॉट्स, otherwide पिक्सेल के रूप में जाना जाता है देखने के लिए शुरू कर दिया है, एक बार हम ज़ूम इन करने के लिए शुरू कर दिया लेकिन अगर हम दुनिया के एक बिट सरल, और बस कहना है कि यहाँ इस रोब काले और सफेद, अच्छी तरह से, का प्रतिनिधित्व करने के काले और सफेद में हम सिर्फ द्विआधारी का उपयोग कर सकते हैं. और अगर हम द्विआधारी का उपयोग करने के लिए जा रहे हैं, 1 या 0, हम इस एक ही छवि को व्यक्त कर सकते हैं रोब बिट्स की इस पद्धति के साथ मुस्कुराते चेहरे के: 11000011 का प्रतिनिधित्व करता है सफेद, सफेद, काले, काले, काले, काले, सफेद सफेद. और इसलिए यह एक बड़ी छलांग है, तो नहीं है, रंगीन फोटो के बारे में बात शुरू की. चीज़ें है कि आप फेसबुक पर देख सकते हैं या एक डिजिटल कैमरा के साथ ले जाएगा, लेकिन, निश्चित रूप से, जब रंगों की बात आती है, तो आप अधिक बिट्स की जरूरत है. और तस्वीरों की दुनिया में काफी आम 1-बिट रंग का उपयोग नहीं है, के रूप में यह पता चलता है, लेकिन 24 बिट रंग, जहाँ आप वास्तव में रंगों के लाखों मिलता है. इसलिए मामले में के रूप में जब हम पर रोब आंख में तेजी से बढ़ी है, कि अलग रंगीन संभावनाओं के लाखों के किसी भी नंबर था. तो हम समस्या 4 सेट के रूप में के रूप में अच्छी तरह से walkthrough में इस परिचय देंगे, जो आज सामान्य 2:30 के बजाय 3:30 पर शुक्रवार को यहाँ व्याख्यान की वजह से होगा. लेकिन वीडियो ऑनलाइन हो हमेशा की तरह, कल. हम भी आप अन्य फ़ाइल स्वरूप मिलवा देंगे. तो यह जानबूझकर पहले डराना देखने का मतलब है, लेकिन यह सिर्फ एक सी struct के लिए कुछ दस्तावेज है. यह पता चला है कि माइक्रोसॉफ्ट, साल पहले, इस प्रारूप को लोकप्रिय बनाने में मदद की है, बिटमैप फ़ाइल स्वरूप, बीएमपी, और यह एक सुपर आसान था, कहा जाता है, रंगीन ग्राफिकल फ़ाइल स्वरूप है कि कुछ समय के लिए इस्तेमाल किया गया था और कभी कभी भी डेस्कटॉप पर वॉलपेपर के लिए. यदि आप Windows XP और रोलिंग पहाड़ियों और नीले आकाश के लिए वापस लगता है, कि आम तौर पर एक बीएमपी, या बिटमैप छवि, और बिटमैप्स हमारे लिए मजाक कर रहे हैं क्योंकि वे थोड़ा और अधिक जटिलता है. यह काफी के रूप में 0 और 1 के इस ग्रिड के रूप में सरल नहीं है; इसके बजाय, आप एक फ़ाइल के शुरू में एक शीर्षक की तरह बातें है. तो दूसरे शब्दों में, एक bmp फ़ाइल के अंदर 0 और 1 की एक पूरी गुच्छा है, लेकिन वहाँ कुछ अतिरिक्त 0 और 1 वहाँ में है. और यह पता चला है कि हम क्या शायद के लिए साल के लिए दी ले लिया है, डॉक्टर या. xls या एमपी 3 या mp4 तरह फ़ाइल स्वरूपों, फ़ाइल स्वरूपों जो कुछ भी है कि आप से परिचित हो. खैर, यह भी एक फ़ाइल स्वरूप क्या मतलब है? क्योंकि दिन के अंत में, इन फ़ाइलों के सभी का उपयोग हम बस 0 और 1 और शायद उन 0 और 1 क, ख, ग, ASCII या तरह के माध्यम से प्रतिनिधित्व करते हैं, लेकिन दिन के अंत के माध्यम से, यह सिर्फ 0 और 1. तो मनुष्य के बस कभी - कभी एक नया फ़ाइल स्वरूप का आविष्कार करने का फैसला जहां वे प्रमाण के अनुसार करना बिट्स के पैटर्न वास्तव में क्या मतलब होगा. और इस मामले में, लोग जो बिटमैप फ़ाइल प्रारूप तैयार ने कहा कि एक बिटमैप फ़ाइल में बहुत पहली बाइट के रूप में 0 ऑफसेट द्वारा चिह्नित, वहाँ, वहाँ कुछ cryptically नाम चर बुलाया bfType होने जा रहा है, जो सिर्फ बिटमैप फ़ाइल प्रकार के लिए खड़ा है, इस बिटमैप फ़ाइल के प्रकार क्या है. आप अनुमान शायद दूसरी पंक्ति है कि 2 ऑफसेट, बाइट संख्या 2 से कर सकते हैं, 0 और 1 है कि क्या प्रतिनिधित्व करता है की एक पैटर्न है? कुछ के आकार, और यह वहाँ से चला जाता है. तो समस्या 4 सेट में, आप इन बातों में से कुछ के माध्यम से चला गया हो जाएगा. हम उन सभी के बारे में देखभाल, लेकिन नोटिस जाएगा यह दिलचस्प प्राप्त करने के लिए शुरू होता है लाइन या 54 बाइट, rgbtBlue, हरे और लाल के आसपास. यदि आप कभी भी परिचित करा आरजीबी, लाल, हरे नीले सुना है, यह है कि करने के लिए एक संदर्भ है. क्योंकि यह पता चला है आप इंद्रधनुष के सभी रंगों पेंट कर सकते हैं लाल और नीले और हरे रंग के कुछ संयोजन के साथ. और, वास्तव में, कमरे में माता - पिता जल्द से जल्द प्रोजेक्टर के कुछ याद हो सकता है. इन दिनों, तुम सिर्फ 1 उज्ज्वल प्रकाश एक लेंस के बाहर आने को देखने. लेकिन वापस दिन में, आप लाल लेंस, नीले लेंस, और हरे रंग लेंस था और साथ में वे स्क्रीन के उद्देश्य से और एक रंगीन चित्र का गठन किया है. और अक्सर मध्य विद्यालयों और उच्च विद्यालयों के उन लेंस तिरछेपन से कभी तो थोड़ा, तो आप डबल या ट्रिपल छवियों को देखने की तरह थे, लेकिन यह है कि विचार था. आप लाल और हरे और नीले प्रकाश एक चित्र चित्र था. और कि एक ही सिद्धांत कंप्यूटर में प्रयोग किया जाता है. चुनौतियों के बीच है, तो, आप के लिए तो समस्या में 4 सेट कुछ चीजें होने जा रहा है, एक के लिए वास्तव में एक छवि का आकार बदलने के लिए है. 0 और 1 के एक पैटर्न में ले, पता लगाने की जो 0 और 1 हिस्सा इस तरह एक संरचना में क्या प्रतिनिधित्व करते हैं, और फिर बाहर आंकड़ा कैसे पिक्सल को दोहराने के लिए: लाल, नीले, हरे इतना है कि अंदर जब एक तस्वीर इस तरह शुरू में लग रहा है, कि इस तरह के बाद बजाय लग सकता है. अन्य चुनौतियों के बीच भी है, हो सकता है कि आप हाथ हो जाएगा जा रहा है एक डिजिटल कैमरे से एक वास्तविक फ़ाइल की फोरेंसिक छवि और उस कैमरे पर, एक बार एक समय पर, तस्वीरों की एक पूरी गुच्छा थे. समस्या है, हम गलती से मिट गया था या छवि किसी तरह भ्रष्ट. बुरी बातें डिजिटल कैमरों के साथ होता है, और इसलिए हम जल्दी से 0 और 1 के सभी नकल आप के लिए है कि कार्ड के, 1 बड़ा फ़ाइल में उन सब को बचाया, और फिर हम उन्हें आप के लिए हाथ होगा समस्या में 4 इतना तय है कि तुम सी में एक कार्यक्रम के साथ ठीक करने के लिए लिख सकते हैं उन JPEGs, आदर्श. और यह पता चला कि JPEGs, भले ही वे एक जटिल फ़ाइल स्वरूप के कुछ कर रहे हैं, वे इस मुस्कुरा यहाँ चेहरे से कहीं अधिक जटिल हो. यह पता चला है कि हर JPEG 0 और 1 के एक ही पैटर्न के साथ शुरू होता है. तो एक समय या पाश या इसी तरह के लिए एक पाश का उपयोग करते हुए, आप सभी 0 और इस फोरेंसिक छवि में 1 से अधिक पुनरावृति कर सकते हैं और हर बार जब आप विशेष पैटर्न है कि समस्या सेट विनिर्देश में परिभाषित है, तुम्हें पता है, 'ओह, यहाँ है, बहुत अधिक संभावना के साथ मान सकते हैं, एक JPEG की शुरुआत, 'जैसे ही आप पाते हैं एक ही पैटर्न बाइट्स या किलोबाइट्स या मेगाबाइट्स की कुछ बाद में यह संख्या, आप मान ऊह, 'कर सकते हैं! यहाँ एक दूसरे JPEG, फोटो मैं पहले एक के बाद लिया है. मुझे कि पहली फ़ाइल पढ़ना बंद करो, यह एक नया लेखन शुरू करते हैं. ' और pset 4 के लिए अपने कार्यक्रम के उत्पादन के रूप में कई के रूप में 50 JPEGs होने जा रहा है. और अगर यह 50 JPEGs नहीं है, आप एक पाश के एक सा है. यदि आप JPEGs की एक अनंत संख्या है, तो आप एक अनंत लूप है. तो वह भी एक बहुत आम मामला होगा. यही कारण है कि क्या क्षितिज पर है. 0 हमारे पीछे कीजिए. अपने ईमेल के अनुसार, एहसास, कि सदा ही वहाँ लोगों की दोनों तटस्थ के खुश तरह है,, और 0 समय प्रश्नोत्तरी चारों ओर दुख की बात है, जो कर रहे हैं. और कृपया मुझे बाहर तक पहुँचने के लिए, सिर TFS, Zamyla, अपने खुद के TF या सीए के एक है कि आप जानते हैं कि अगर आप चर्चा करना चाहते हैं कैसे चीजें गया. तो माता पिता को प्रभावित करने के लिए कमरे में CS50 पुस्तकालय क्या है? अच्छा काम किया. CS50 पुस्तकालय क्या है? हाँ? [छात्र जवाब, unintelligible] >> ठीक है, अच्छा है. तो यह कोड का एक prewritten सेट है कि हम, स्टाफ, लिखा है, हम आप के लिए प्रदान करने के लिए कुछ सामान्य functionalities प्रदान. सामग्री मुझे एक स्ट्रिंग प्राप्त करना, मुझे एक int, सभी कार्य करता है कि यहाँ सूचीबद्ध हैं. अब शुरू, हम वास्तव में इन प्रशिक्षण के पहियों से दूर ले शुरू करते हैं. तो हम करने के लिए आप से दूर एक "स्ट्रिंग" लेने के लिए शुरू करने के लिए जा रहे हैं, जो, याद है, क्या वास्तविक डेटा प्रकार के लिए सिर्फ एक पर्याय था? चार *. तो माता पिता के लिए, कि शायद था - यह अच्छी बात है, तो चार * हम देखना शुरू करेंगे स्क्रीन पर सभी अधिक के रूप में हम हमारे शब्दावली से "स्ट्रिंग" को हटाने, कम से कम जब यह वास्तव में कोड लिखने के लिए आता है. इसी तरह, हम जितना इन कार्यों में से कुछ का उपयोग बंद कर देंगे, क्योंकि हमारे कार्यक्रमों को और अधिक परिष्कृत पाने के लिए जा रहे हैं के बजाय सिर्फ प्रोग्राम लिखने कि शीघ्र पलक के साथ वहाँ बैठो, उपयोगकर्ता के लिए प्रतीक्षा करने के लिए अंदर कुछ लिखें आप कहीं और से अपनी जानकारी मिल जाएगा. उदाहरण के लिए, आप उन्हें स्थानीय हार्ड ड्राइव पर बिट्स की एक श्रृंखला से मिल जाएगा. आप के बजाय उन्हें भविष्य में मिलेगा एक नेटवर्क कनेक्शन से, कुछ वेबसाइट कहीं. तो वापस पहली बार के लिए इस परत छील चलो, और CS50 उपकरण खींच और इस CS50.h नामक फाइल है, जो तुम हफ्तों के लिए सहित तेज किया गया है. लेकिन वास्तव में देखने के लिए क्या इस के अंदर है. तो नीले रंग में फाइल के ऊपर टिप्पणी की एक पूरी गुच्छा है, वारंटी जानकारी और लाइसेंस. यह एक आम प्रतिमान की तरह है सॉफ्टवेयर में है, क्योंकि सॉफ्टवेयर का एक बहुत इन दिनों है, "क्या कहा जाता है" खुला स्रोत जिसका अर्थ है कि कोई कोड लिखा है और यह आज़ादी से उपलब्ध कराया, नहीं बस चलाने के लिए उपयोग करने के लिए, लेकिन वास्तव में पढ़ सकते हैं और बदल और अपने खुद के काम में एकीकृत. तो है कि क्या आप का उपयोग किया गया है, ओपन सोर्स सॉफ्टवेयर, यद्यपि एक बहुत छोटे रूप में. अगर मैं टिप्पणी पिछले नीचे स्क्रॉल, हालांकि, हम कुछ अधिक परिचित बातें देखना शुरू करेंगे. तो यहाँ शीर्ष पर नोटिस, कि CS50.h फ़ाइल हेडर फाइल की एक पूरी गुच्छा भी शामिल है. अब, इनमें से अधिकांश हम पहले नहीं देखा है, लेकिन एक है परिचित, इनमें से जो हम संक्षेप में यद्यपि देखा है, इस प्रकार अब तक? हाँ, मानक पुस्तकालयों. Stdlib.h malloc है, तो एक बार हम गतिशील स्मृति आवंटन के बारे में बात करना शुरू कर दिया, जो हम वापस करने के लिए अगले सप्ताह के रूप में अच्छी तरह से आ जाएगा, हम उस फ़ाइल सहित शुरू कर दिया. यह पता चला है कि bool और सच्चे और झूठे सी में वास्तव में नहीं मौजूद नहीं है, से प्रति, जब तक आप इस फाइल को यहाँ शामिल हैं. तो हम सप्ताह के लिए किया है, मानक bool.h सहित इतना है कि आप एक bool, सही है या गलत. की धारणा का उपयोग कर सकते हैं इस के बिना, आप यह नकली की तरह है और एक int का उपयोग करना चाहते हैं और बस मनमाने ढंग से लगता है कि 0 झूठी है और 1 सच है. अब, अगर हम आगे नीचे स्क्रॉल, यहाँ एक स्ट्रिंग की हमारी परिभाषा है. यह पता चला है, जैसा कि हम पहले कहा है, कि जहां यह * वास्तव में कोई फर्क नहीं पड़ता. तुम भी अंतरिक्ष के आसपास हो सकता है. हम, इस सेमेस्टर, इस के रूप में किया गया है इसे बढ़ावा देने के लिए स्पष्ट कर दूं कि * प्रकार के साथ क्या करना है. लेकिन एहसास है, बस के रूप में आम है, अगर छोटे से अधिक एक आम नहीं है, यह वहाँ रखा है लेकिन कार्यात्मक यह एक ही बात है. लेकिन अब, अगर हम नीचे आगे पढ़ने के लिए, चलो कहते हैं, पर एक नज़र GetInt ले, क्योंकि हम उस का उपयोग किया है, शायद कुछ और इस सेमेस्टर से पहले. और यहाँ GetInt है. यह क्या है? इस प्रोटोटाइप है. तो अक्सर, हम हमारे में से सबसे ऊपर है पर प्रोटोटाइप डाल दिया है ग फ़ाइलों. लेकिन आप भी हेडर फाइलें, ज. फ़ाइलों में प्रोटोटाइप डाल सकते हैं, यह यहाँ एक तरह, ताकि जब आप कुछ कार्यों को लिखने कि आप अन्य लोगों के लिए उपयोग करने में सक्षम होने के लिए करना चाहते हैं, जो वास्तव में CS50 पुस्तकालय के साथ मामला है, तुम नहीं केवल CS50.c की तरह कुछ में अपने कार्यों को लागू करने के लिए, आप भी उस फ़ाइल के शीर्ष पर नहीं प्रोटोटाइप डाल दिया, लेकिन एक हैडर फ़ाइल के शीर्ष पर, तो उस हैडर फ़ाइल मित्रों और सहकर्मियों क्या शामिल है, तेज के साथ अपने खुद के कोड में शामिल हैं. यह सब समय तो आप इन प्रोटोटाइप के सभी सहित किया गया है प्रभावी ढंग से अपनी फ़ाइल के शीर्ष पर है, लेकिन इस तेज के रास्ते से तंत्र में शामिल हैं कि अनिवार्य रूप से प्रतियां और चिपकाता अपने ही में इस फ़ाइल. अब, यहाँ कुछ काफी विस्तृत दस्तावेज है. हम बहुत ज्यादा के लिए दी गई है कि GetInt एक int हो जाता है ले लिया है, लेकिन यह वहाँ बाहर कुछ कोने मामलों बदल जाता है, है ना? क्या एक संख्या है कि जिस तरह से बहुत बड़ा है में उपयोगकर्ता प्रकार अगर? Quintillion एक, कि सिर्फ एक int के अंदर फिट नहीं कर सकते? अपेक्षित व्यवहार क्या है? खैर, आदर्श, यह उम्मीद के मुताबिक है. तो इस मामले में, यदि आप वास्तव में ठीक प्रिंट पढ़ा, आपको लगता है कि अगर लाइन को पढ़ा नहीं जा सकता है, यह रिटर्न INT_MAX देखेंगे. हम इस बारे में कभी बात नहीं की है, लेकिन अपने पूंजीकरण के आधार पर, यह क्या है, शायद? यह एक निरंतर है, तो यह कुछ विशेष निरंतर है कि शायद घोषित उन हेडर फाइल है कि फ़ाइल में उच्च ऊपर में, और INT_MAX शायद मोटे तौर पर, 2 अरब की तरह कुछ है. जा रहा है कि क्योंकि हम किसी भी तरह कि कुछ दर्शाता है की जरूरत विचार गलत हो गया था, हम, हाँ, हमारे निपटान पर चार अरब संख्या है, अप करने के लिए 2 अरब पर नकारात्मक 2 अरब, दे या ले. खैर, क्या प्रोग्रामिंग में आम है तुम सिर्फ एक उन लोगों की संख्या की चोरी. 0 हो सकता है, शायद 2 अरब, शायद नकारात्मक दो अरब. तो तुम एक अपने संभव मूल्यों के खर्च इतनी है कि आप दुनिया के लिए प्रतिबद्ध कर सकते हैं कि अगर कुछ गलत हो जाता है, तो मैं इस सुपर बड़ा मूल्य वापस आ जाएगी. लेकिन आप की तरह गुप्त उपयोगकर्ता कुछ टाइप नहीं करना चाहता "2, 3, 4 ... है" वास्तव में बड़ी संख्या है, जहां आप एक निरंतर बजाय सामान्य. तो सच में, अगर आप गुदा जा रहे थे पिछले कुछ हफ्तों, कभी भी आप GetInt फोन है, तो आप एक हालत अगर के साथ किया गया है की जाँच करना चाहिए. INT_MAX में उपयोगकर्ता प्रकार किया था, या अधिक विशेष, GetInt वापसी INT_MAX किया? क्योंकि अगर ऐसा किया था, इसका मतलब है कि वास्तव में वे यह नहीं लिख था, इस मामले में कुछ गलत हो गया था. तो यह है कि क्या आम तौर पर एक "प्रहरी" मूल्य है, जो सिर्फ विशेष मतलब के रूप में जाना जाता है. ठीक है, चलो अब ग फ़ाइलों में बारी. सी फ़ाइल उपकरण में कुछ समय के लिए ही अस्तित्व में है, और, वास्तव में, यह उपकरण आप के लिए precompiled उस बात में हम "ऑब्जेक्ट कोड," कहा जाता है लेकिन यह सिर्फ आप को कोई फर्क नहीं पड़ता, जहां यह है क्योंकि इस प्रणाली जानता है, इस मामले में, जहां यह है, उपकरण. लेकिन अब नीचे स्क्रॉल लिए GetInt, और देखने के लिए कैसे GetInt यह सब समय काम कर रहा है. यहाँ तो हम पहले से इसी तरह की टिप्पणी है. मुझे सिर्फ कोड हिस्से पर में ज़ूम, और हम GetInt के लिए है जो निम्नलिखित है. यह कोई इनपुट लेता है और यह एक int देता है, जबकि () सच है, तो हम एक जानबूझकर अनंत लूप लेकिन, शायद, हम इस से बाहर किसी भी तरह तोड़ने, या इस के भीतर से लौटने. तो चलो यह कैसे काम करता है देखने के लिए. खैर, हम GetString उपयोग लग रहे हो पाश, 166 के अंदर इस पहली पंक्ति में. यह अब अच्छा अभ्यास है क्योंकि किस परिस्थिति में GetString इस विशेष कीवर्ड रिक्त, वापस आ सकता है? अगर कुछ गलत हो जाता है. क्या गलत जब आप GetString की तरह कुछ कह सकते हैं? हाँ? [छात्र जवाब, unintelligible] >> हाँ. तो शायद malloc विफल रहता है. हुड GetString नीचे कहीं malloc बुला रहा है, जो स्मृति आबंटित करता है, जो कंप्यूटर की दुकान की मदद से अक्षरों के सभी कि कुंजीपटल में उपयोगकर्ता प्रकार. लगता है और उपयोगकर्ता खाली समय का एक पूरी बहुत कुछ था और अधिक दो अरब वर्ण से, उदाहरण के लिए, टाइप. कंप्यूटर से अधिक वर्ण भी रैम है. खैर, GetString कि आप को दर्शाता करने में सक्षम हो गया है, यहां तक ​​कि अगर यह एक सुपर, सुपर असामान्य कोने मामले है. यह किसी भी तरह से इस संभाल करने में सक्षम हो गया है, और इतना GetString अगर हम वापस जाओ और अपनी दस्तावेज़ीकरण पढ़ें, वास्तव में करता है, नल लौटने के लिए. अब अगर GetString रिक्त लौटने से विफल रहता है, GetInt असफल हो रहा है INT_MAX एक प्रहरी के रूप में लौटने से. ये सिर्फ मानव सम्मेलनों हैं. केवल जिस तरह से आप यह पता होगा मामला है प्रलेखन पढ़ने के द्वारा होता है. तो चलो जहां int वास्तव में है GotInt के लिए नीचे स्क्रॉल. तो अगर मैं नीचे स्क्रॉल थोड़ा आगे, 170 लाइन में हम इन लाइनों के ऊपर एक टिप्पणी है. तो हम 172 में घोषणा, एक int n और एक चार ग, और फिर इस नए समारोह जो आप में से कुछ पहले भर में ठोकर खाई है, लेकिन sscanf. यह स्ट्रिंग स्कैन च के लिए खड़ा है. दूसरे शब्दों में, मुझे एक स्ट्रिंग दे और मैं यह ब्याज की जानकारी के टुकड़े के लिए स्कैन करेगा. तो इसका क्या मतलब है? खैर, मान लीजिए कि मैं कीबोर्ड पर में, सचमुच, 1 2 3 टाइप, और तब दर्ज करें मारा. 2 1 3 के डेटा प्रकार जब GetString द्वारा लौटाए गए क्या है? यह स्पष्ट रूप से एक स्ट्रिंग, है ना? मैं एक स्ट्रिंग है, तो 2 1 3 सच है "1 2 3" यह अंत में \ 0 के साथ. यह एक int नहीं है. यह एक संख्या नहीं है. यह एक नंबर की तरह दिखता है, लेकिन यह वास्तव में नहीं है. तो क्या GetInt करने के लिए क्या करना है? यह है कि सही करने के लिए छोड़ दिया स्ट्रिंग स्कैन है, 1 2 3 0 \, और किसी तरह यह एक वास्तविक पूर्णांक कनवर्टर के लिए इस्तेमाल किया जा सकता है. अब, आप बाहर आंकड़ा कैसे यह करने के लिए कर सकते हैं. यदि तुम pset 2 वापस लगता है, तो आप शायद एक छोटे से आराम से मिला ताकि आप सीज़र या vigenere के साथ एक स्ट्रिंग पुनरावृति कर सकते हैं, आप घर का काम लेने के साथ ints को बदल सकते हैं. यह काम की एक पूरी बहुत कुछ है. फोन क्यों नहीं sscanf तरह एक समारोह है कि आप के लिए है कि नहीं करता? तो sscanf इस लाइन कहा जाता है के मामले में, जो एक स्ट्रिंग में एक तर्क है, उम्मीद है. फिर आप उद्धरण में निर्दिष्ट, बहुत printf के लिए इसी तरह की है, क्या आप इस स्ट्रिंग में देखने की उम्मीद करते हैं? मैं यहाँ क्या कह रहा है, मैं एक दशमलव संख्या और शायद एक चरित्र को देखने की उम्मीद है. और हम क्यों यह बस एक पल में मामले देखेंगे. यह पता चला है कि इस अंकन अब सामान की याद ताजा करती है हम सिर्फ एक हफ्ते पहले से अधिक के बारे में बात कर शुरू कर दिया. क्या है और n और ग हमारे लिए यहाँ क्या कर रही है? [छात्र जवाब, unintelligible] >> हाँ. यह मुझे n और ग के पते का पता दे रही है. अब, कि क्यों महत्वपूर्ण है? खैर, तुम्हें पता है कि सी में कार्यों के साथ तुम हमेशा एक या सभी में कोई मूल्य नहीं मान सकते हैं. आप एक int एक स्ट्रिंग, एक नाव, एक चार, जो कुछ भी लौट सकते हैं. या आप शून्य लौटने के लिए, कर सकते हैं, लेकिन आप केवल 1 बात ज़्यादा से ज़्यादा लौट सकते हैं. लेकिन यहाँ हम sscanf मुझे वापस जाने के लिए हो सकता है एक int, एक दशमलव संख्या चाहते हैं, और यह भी एक चार है, और इसलिए मैं एक क्षण में चार समझाता हूँ. तो आप को प्रभावी ढंग से च 2 बातें वापस करने के लिए करना चाहते हैं, कि बस सी. में संभव नहीं तो आप 2 पतों में से गुजर रहा है कि चारों ओर काम कर सकते हैं, क्योंकि जैसे ही आप एक समारोह 2 पते हाथ, उस समारोह उनके साथ क्या कर सकते हैं? यह उन पतों के लिए लिख सकते हैं. * आप कार्रवाई का उपयोग कर सकते हैं और उन पतों में से प्रत्येक के लिए "वहाँ जाओ" कर सकते हैं. यह यह पिछले दरवाजे तंत्र की तरह है, लेकिन चर के मूल्यों को बदलने के लिए बहुत आम है इस मामले में 2 1 जगह है, अधिक से अधिक समय में. अब, मैं to1 == के लिए जाँच कर रहा हूँ, तो और n लौटने कि अगर वास्तव में करता है, सच करने के लिए मूल्यांकन नोटिस. तो क्या चल रहा है? वैसे, तकनीकी, हम वास्तव में GetInt में ऐसा करना चाहते है. हम पार्स करने के लिए है, तो बात करने के लिए करना चाहते हैं, हम स्ट्रिंग पढ़ने के लिए चाहते हैं "1 2 3" और अगर ऐसा लगता है जैसे वहाँ एक संख्या है, क्या हम sscanf के लिए कह रहे हैं कि मेरे लिए इस चर n में संख्या 2, 3, 1, डाल दिया है. क्यों, तो, मैं इस के रूप में अच्छी तरह से किया है? भी कह रही है, sscanf, आप भी एक चरित्र यहाँ मिल सकता है की भूमिका क्या है. [छात्र बोल, unintelligible] >> नहीं - एक दशमलव बिंदु काम कर सकता है. चलो पकड़ है कि एक पल के लिए सोचा. और क्या? [छात्र, unintelligible] तो >>, अच्छा लगा, यह नल चरित्र हो सकता है. यह वास्तव में इस मामले में नहीं है. हाँ? [छात्र, unintelligible] >> ASCII. या चलो, मुझे भी आगे सामान्यीकरण. % वहाँ ग त्रुटि जाँच के लिए ही है. हम वहाँ नहीं चाहते कि संख्या के बाद चरित्र हो सकता है, लेकिन क्या यह मुझे करने के लिए अनुमति देता है निम्नलिखित है: यह पता चला है कि sscanf, n और ग में मूल्यों को यहाँ इस उदाहरण में, भंडारण के अलावा, यह भी क्या करता है यह चर की संख्या देता है यह अंदर मूल्यों डाल तो अगर आप केवल 2 1 3 में लिखते हैं, तो केवल% d मैच करने के लिए जा रहा है और केवल n 2 1 3 की तरह एक मूल्य के साथ जमा हो जाता है और कुछ भी नहीं ग में डाल दिया जाता है; ग एक कचरा मान रहता है, तो बात करने के लिए. कचरा क्योंकि यह कुछ मूल्य के रूप में कभी नहीं प्रारंभ किया गया है. तो उस मामले में, sscanf 1 देता है, क्योंकि मैं उन संकेत की एक आबादी, जो मामले में, महान. मैं एक int है, तो मैं लाइन मुक्त करने के लिए स्मृति मुक्त GetString है कि वास्तव में आवंटित की है, और तो मैं n लौटने के. वरना, अगर आपने कभी सोचा है जहाँ कि लिए पुनःप्रयास करें बयान से आता है, यहीं से आता है. अगर, इसके विपरीत, मैं 1 2 3 foo में लिखते हैं, सिर्फ पाठ के कुछ यादृच्छिक अनुक्रम, sscanf को देखने के लिए जा रहा है, उह, संख्या, उह, संख्या, उह, संख्या, उह - च. और यह 1 2 3 n में डाल दिया जा रहा है. यह ग में च डाल दिया, और फिर 2 लौटने के लिए जा रहा है. तो हम है, बस scanf व्यवहार के मूल परिभाषा का उपयोग कर, एक बहुत ही सरल तरीके - ठीक है, पहली नज़र में जटिल है, लेकिन दिन के अंत में, कह के काफी सरल तंत्र, एक int है, और यदि ऐसा है, कि केवल एक चीज है कि मैंने पाया है? और सफेद अंतरिक्ष यहाँ विचार है. यदि आप sscanf के लिए प्रलेखन पढ़ा, यह आपको बताता है कि अगर आप शुरुआत या अंत में सफेद स्थान का एक टुकड़ा शामिल है, sscanf भी उपयोगकर्ता की अनुमति है, जो भी कारण के लिए, 1 2 3 spacebar मारा, और है कि वैध होगा. यह उपयोगकर्ता पर चिल्लाना नहीं सिर्फ इसलिए कि वे शुरुआत या अंत में spacebar मारा जाएगा, जो सिर्फ एक छोटे से अधिक उपयोगकर्ता के अनुकूल है. किसी भी सवाल है, तो, GetInts पर? हाँ? [छात्र सवाल है, unintelligible] >> अच्छा सवाल है. क्या होगा अगर तुम सिर्फ एक चार में टाइप, च, और हिट की तरह प्रवेश कभी 2 1 3 टाइपिंग के बिना, आप क्या सोचते हैं कोड की इस पंक्ति का व्यवहार तो होगा? तो sscanf कि भी कवर कर सकते हैं, क्योंकि उस मामले में, यह n या ग को भरने के लिए नहीं जा रहा है, यह करने के बजाय 0 वापसी करने के लिए जा रहा है. जो मामले में, मैं यह भी है कि परिदृश्य पकड़ रहा हूँ, क्योंकि मैं चाहता हूँ उम्मीद मूल्य 1 है. मैं केवल 1 चाहते हैं, और केवल 1 बात भरा होना. अच्छा सवाल है. दूसरों? ठीक है, तो यहाँ के कार्यों के सभी के माध्यम से जाना नहीं है, लेकिन एक है कि हो सकता है, शायद शेष ब्याज की, लगता है है GetString क्योंकि यह पता चला है कि GetFloat, GetInt, , सब बाज़ी GetDouble उनके GetString करने के लिए कार्यक्षमता की एक बहुत GetLongLong. तो चलो वह यहाँ कैसे कार्यान्वित किया जाता है पर एक नज़र रखना. यह एक थोड़ा जटिल दिखता है, लेकिन यह एक ही बुनियादी बातों का उपयोग करता है कि हम पिछले हफ्ते के बारे में बात कर शुरू कर दिया. तो GetString में, जो शून्य प्रति कोई तर्क के रूप में लेता है, और यह एक स्ट्रिंग देता है, तो मैं एक स्ट्रिंग बफर बुलाया की घोषणा कर रहा हूँ. मैं वास्तव में नहीं है कि क्या अभी तक के लिए इस्तेमाल किया जा रहा है पता नहीं है, लेकिन हम देखेंगे. क्षमता की तरह दिखता है डिफ़ॉल्ट, 0 से है, काफी यकीन है कि जहां यह जा रहा है नहीं. यकीन है कि क्या पता करने के लिए अभी तक के लिए इस्तेमाल किया जा रहा है. लेकिन अब यह एक छोटे से अधिक दिलचस्प हो रही है तो 243 लाइन में, हम एक int ग, इस एक बेवकूफ विस्तार की तरह है की घोषणा. एक चार 8 बिट है, और 8 बिट कितने विभिन्न मूल्यों स्टोर कर सकते हैं? 256. समस्या है, अगर आप 256 अलग ASCII वर्ण चाहते हैं, जो वहाँ हैं, अगर तुम वापस लगता है, और यह याद करने के लिए कुछ नहीं है. लेकिन अगर आप कि बड़ा ASCII चार्ट वापस लगता है कि हम सप्ताह पहले किया था, उस मामले में, 128 या 256 ASCII वर्ण में थे. हम 0 के पैटर्न और 1 निर्भर है. यह एक समस्या है अगर आप एक त्रुटि का पता लगाने में सक्षम होना चाहता हूँ. क्योंकि अगर आप पहले से ही अपने पात्रों के लिए 256 मूल्यों का उपयोग कर रहे हैं, आप वास्तव में आगे नहीं की योजना थी, क्योंकि अब आप कह रही का कोई रास्ता नहीं है, "यह एक कानूनी चरित्र नहीं है, यह कुछ गलत संदेश है." तो दुनिया क्या करता है, वे अगले सबसे बड़ा मूल्य का उपयोग करें, एक int की तरह कुछ इतनी है कि आप बिट्स के एक पागल संख्या है, 4 अरब संभव मूल्यों के लिए 32, इतना है कि आप बस ऊपर अंत का उपयोग कर सकते हैं, मूलतः, उनमें से 257, जिनमें से 1 एक त्रुटि के रूप में कुछ विशेष अर्थ नहीं है. तो चलो यह कैसे काम करता है देखने के लिए. 246 लाइन में, मैं इस बड़े जबकि पाश कि fgetc बुला रहा है, च अर्थ फ़ाइल, जीइ टीसी, और फिर stdin. पता चला है यह सिर्फ कह के और अधिक सटीक तरीका है "कीबोर्ड से इनपुट पढ़ें." मानक इनपुट का मतलब कुछ कीबोर्ड, मानक आउटपुट स्क्रीन का मतलब है, और मानक त्रुटि, जो हम 4 pset में देखेंगे, स्क्रीन का मतलब है, लेकिन स्क्रीन के एक विशेष भाग इतना है कि यह नहीं conflated वास्तविक उत्पादन के साथ कि आप मुद्रित करना है, लेकिन भविष्य में उस पर और अधिक. तो fgetc सिर्फ कुंजीपटल से एक चरित्र का मतलब पढ़ा है, और यह जहा? यह ग में स्टोर, और फिर जांच, तो मैं बस कुछ बूलियन संयोजक यहाँ का उपयोग कर रहा हूँ, जाँच करें कि यह \ n बराबर, तो उपयोगकर्ता में प्रवेश करने के लिए मारा गया है नहीं है. हम उस बिंदु, लूप के अंत में बंद करना चाहते हैं, और हम भी जाँच करना चाहते हैं के लिए विशेष निरंतर, EOF, जो अगर आप जानते हैं या लगता है कि यह क्या के लिए खड़े करता है? फ़ाइल का अंत. तो यह बेतुका की तरह है, क्योंकि अगर मैं कीबोर्ड पर टाइप कर रहा हूँ, वहाँ वास्तव में कोई फ़ाइल इस में शामिल है, लेकिन यह सिर्फ सामान्य मतलब प्रयोग किया जाता शब्द की तरह है कि और कुछ नहीं मानव उंगलियों से आ रहा है. EOF. फ़ाइल का अंत. एक अलग रूप में, अगर तुम कभी अपने कुंजीपटल पर नियंत्रण घ मारा, कि तुम अभी तक नहीं करना होगा, आप नियंत्रण ग मारा है. लेकिन नियंत्रण घ इस विशेष लगातार बुलाया EOF भेजता है. तो अब हम सिर्फ कुछ गतिशील स्मृति आवंटन है. तो अगर n + 1> क्षमता, अब मैं n समझाता हूँ. n कितने बाइट्स बफर में वर्तमान में कर रहे हैं, स्ट्रिंग है कि आप वर्तमान में उपयोगकर्ता से निर्माण कर रहे हैं. यदि आप अपने बफर में अधिक वर्ण से आप बफर में क्षमता है, intuitively, हम क्या करने की जरूरत है तो अधिक क्षमता आवंटित है. मैं गणित के कुछ यहाँ किसी पदार्थ का उत्तम तत्त्व ले लेना करने के लिए जा रहा हूँ और इस समारोह पर ही ध्यान केंद्रित. तुम्हें पता है क्या malloc है, या कम से कम आम तौर पर परिचित. एक अनुमान realloc क्या करता है ले लो. [छात्र जवाब, unintelligible] >> हाँ. और यह काफी स्मृति नहीं जोड़ने से है, यह इस प्रकार के रूप में स्मृति reallocates: अगर वहाँ अभी भी स्ट्रिंग के अंत में कमरे में आप है कि स्मृति की अधिक दे की तुलना में यह मूल रूप से आप देता है, तो आपको लगता है कि अतिरिक्त स्मृति मिल जाएगा. तो तुम सिर्फ तार वर्ण वापस डाल से वापस वापस करने के लिए वापस करने के लिए कर सकते हैं. लेकिन अगर यह मामला नहीं है, क्योंकि आप भी लंबे समय से इंतजार कर रहे थे और बिना सोचे समझे कुछ स्मृति में वहाँ plopped, लेकिन वहाँ अतिरिक्त है यहाँ नीचे स्मृति, वह ठीक है. Realloc आप सभी के लिए भारी उठाने करने के लिए जा रहा है, आप स्ट्रिंग में पढ़ा है और इस तरह यहाँ से दूर ले जाने के लिए, इसे नीचे रख, और फिर आप उस बिंदु पर कुछ और रनवे दे. तो हाथ की एक लहर के साथ, मुझे कहना है कि क्या GetString कर रही है यह एक छोटे से बफर, शायद 1 एकल चरित्र के साथ शुरू हो रहा है, और 2 अक्षरों में उपयोगकर्ता प्रकार अगर, GetString समाप्त होता है realloc बुला रही है और कहता है, 'ओह, 1 चरित्र के लिए पर्याप्त नहीं था. मुझे 2 अक्षर दे. ' तो अगर आप पाश के तर्क के माध्यम से पढ़ा, यह कहना है, 'ओह, 3 अक्षरों में टाइप उपयोगकर्ता जा रहा है. मुझे दो. अब नहीं 2, लेकिन 4 वर्ण, तो मुझे 8 देते हैं, तो मुझे 16 और 32 दे. ' तथ्य यह है कि मैं क्षमता हर बार दोगुना कर रहा हूँ मतलब यह है कि बफर करने के लिए धीरे धीरे बढ़ने नहीं जा रहा है. यह सुपर फास्ट बढ़ती जा रही है, और क्या उस का लाभ हो सकता है? मैं क्यों बफर के आकार के दोहरीकरण रहा हूँ, भले ही उपयोगकर्ता सिर्फ 1 कीबोर्ड से अतिरिक्त चरित्र की आवश्यकता हो सकती है? [छात्र जवाब, unintelligible]. >> क्या है? बिल्कुल सही. आप इसे अक्सर के रूप में विकसित करने के लिए नहीं है. और यह एक बस की तरह है - तुम यहाँ अपने दांव हेजिंग. विचार किया जा रहा है कि आप एक बहुत realloc कॉल नहीं चाहते हैं, क्योंकि यह धीमी गति से हो जाता है. किसी भी समय आप पूछना स्मृति के लिए ऑपरेटिंग सिस्टम के रूप में आप जल्द ही देखेंगे एक भविष्य समस्या सेट में, यह कुछ समय लेने के लिए जाता है. समय की है कि कम से कम राशि है, भले ही आप कुछ अंतरिक्ष बर्बाद कर रहे हैं तो एक अच्छी बात हो जाता है. लेकिन अगर हम यहाँ GetString के अंतिम भाग के माध्यम से पढ़ा, और फिर, हर एक लाइन यहाँ समझ आज इतनी महत्वपूर्ण नहीं है. नोटिस लेकिन है कि यह अंततः malloc फिर से कहता है, और यह का आवंटन बिल्कुल के रूप में कई बाइट्स के रूप में यह स्ट्रिंग के लिए की जरूरत है और फिर फ्री फोन करके दूर फेंकता है, जरूरत से ज्यादा बड़े बफर, अगर यह वास्तव में भी कई बार दोगुनी हो गया. संक्षेप में, है कि कैसे GetString यह सब समय काम कर रहा है. यह सब होता है एक समय में एक चरित्र फिर से पढ़ा जाता है और फिर और हर बार यह कुछ अतिरिक्त स्मृति की आवश्यकता है, यह realloc फोन करके इसके लिए ऑपरेटिंग सिस्टम पूछता है. कोई सवाल? सही सभी. एक हमले. अब है कि हम संकेत को समझते हैं, या कम से कम संकेत के साथ तेजी से परिचित हैं, चलो विचार कैसे पूरी दुनिया के पतन शुरू होता है अगर आप काफी adversarial उपयोगकर्ताओं के खिलाफ नहीं की रक्षा करते हैं, लोग हैं, जो आपके सिस्टम में हैक करने की कोशिश कर रहे हैं. जो लोग कुछ पंजीकरण कोड circumventing द्वारा अपने सॉफ्टवेयर चोरी करने की कोशिश कर रहे हैं कि वे अन्यथा प्रकार अंदर हो सकता है इस उदाहरण पर एक नज़र यहाँ ले लो, जो सिर्फ सी कोड है कि नीचे एक मुख्य कार्य है, कि एक समारोह foo कहता है, और क्या यह foo गुजर रहा है? एक एकल तर्क [छात्र]. >> एकल तर्क. तो argv [1], जो पहला शब्द उपयोगकर्ता टाइप का मतलब a.out या जो भी बाद कमांड लाइन कार्यक्रम कहा जाता है. Foo तो, शीर्ष पर, एक चार * में लेता है, लेकिन चार * बस क्या है? स्ट्रिंग. कोई नई बात नहीं है, और है कि मनमाने ढंग से स्ट्रिंग बार बुलाया जा रहा है. यहाँ इस लाइन में, चार ग [12], अर्द्ध तकनीकी अंग्रेजी की तरह, इस लाइन क्या कर रही है? सरणी? वर्ण. मुझे 12 वर्णों की एक सरणी दे. तो हम एक बफर कॉल कर सकते हैं. यह तकनीकी ग कहा जाता है, लेकिन प्रोग्रामिंग में एक बफर सिर्फ अंतरिक्ष की एक गुच्छा का मतलब है कि आप कुछ सामान अंदर रख सकते हैं फिर अंत में, memcpy, हम पहले नहीं का उपयोग किया है. लेकिन आप शायद लगता है कि यह क्या करता है सकते हैं. यह स्मृति प्रतियां. यह क्या करता है? खैर, यह स्पष्ट तौर पर बार प्रतियां, अपने इनपुट ग में, लेकिन केवल पट्टी की लंबाई. लेकिन यहाँ एक बग है. ठीक है, तो तकनीकी रूप से हम वास्तव में strlen (पट्टी) x sizeof (चार), यह सही है. लेकिन सबसे खराब मामले में, कि that's मान - हां, तो ठीक है. तो वहाँ 2 कीड़े है. Sizeof (चार), सब ठीक है, तो यह एक छोटे से व्यापक बनाने. तो अब वहाँ अभी भी एक बग है, जो क्या है? [छात्र जवाब, unintelligible] के लिए क्या >> जांच? ठीक है, तो हम जाँच की जानी चाहिए नल के लिए, क्योंकि बुरी बातें होती हैं जब अपने सूचक रिक्त है, क्योंकि तुम वहाँ जा रहा है, हो सकता है और आप कभी नहीं होने के लिए जा रहा नल चाहिए * ऑपरेटर के साथ अपसंदर्भन द्वारा. तो यह है कि अच्छा है, और हम और क्या कर रहे हैं? तार्किक रूप से वहाँ एक दोष यहाँ भी है. [छात्र जवाब, unintelligible] >> तो अगर argc ≥ 2 की जांच? ठीक है, तो इस कार्यक्रम में 3 कीड़े यहाँ है. हम अगर उपयोगकर्ता वास्तव में टाइप [1] argv में अच्छा है, कुछ भी नहीं की जाँच कर रहे हैं. तो 3 बग क्या है? हाँ? [छात्र जवाब, unintelligible] अच्छा. >> तो हम एक परिदृश्य की जाँच की. हम उलझाव से जाँच के और अधिक स्मृति की नकल नहीं है पट्टी की लंबाई से अधिक हो जाती है. तो अगर स्ट्रिंग में टाइप उपयोगकर्ता 10 वर्ण लंबा है, यह कह रही है, केवल 10 अक्षर की प्रतिलिपि बनाते हैं. ' और कहा कि ठीक है, लेकिन क्या अगर शीघ्र एक शब्द में टाइप उपयोगकर्ता एक 20 चरित्र शब्द की तरह है, यह है, क्या में पट्टी से प्रतिलिपि 20 अक्षर कह? ग, अन्यथा हमारे बफर के रूप में जाना जाता है, जिसका मतलब है कि आप सिर्फ डेटा लिखा 8 बाइट स्थानों है कि आप खुद का नहीं है, और आप उन्हें भावना है कि आप उन्हें कभी नहीं आवंटित में ही नहीं है. तो यह है कि क्या आम तौर पर बफर अतिप्रवाह हमले के रूप में जाना जाता है, या बफर सीमा से अधिक का दौरा, और इस अर्थ में यह हमले की है कि यदि उपयोगकर्ता या प्रोग्राम है कि अपने कार्य बुला रहा है इस दुर्भावनापूर्ण रूप से कर रही है, क्या वास्तव में अगले काफी बुरा हो सकता है होता है. इस चित्र पर एक नज़र यहाँ ले. यह तस्वीर स्मृति के ढेर का प्रतिनिधित्व करता है. याद करते हैं और है कि हर बार जब आप एक समारोह फोन, आप ढेर पर इस छोटे फ्रेम पाने के लिए और फिर एक और फिर एक और और फिर एक और. और इस प्रकार अब तक हम बस की तरह है इन आयतों के रूप में दूर abstracted या तो बोर्ड पर या स्क्रीन पर यहाँ. लेकिन अगर हम उन आयतों पर ज़ूम जब आप एक समारोह foo कहते हैं, यह पता चला है कि वहाँ ढेर पर अधिक है कि फ्रेम और है कि आयत के अंदर की तुलना में सिर्फ एक्स और y और एक और ख, जैसे हम स्वैप के बारे में बात कर किया. यह पता चला है कि वहाँ कुछ निचले स्तर के विवरण हैं, उन के बीच में पता वापस. तो यह पता चला जब मुख्य foo कॉल, मुख्य foo सूचित मुख्य पते क्या कंप्यूटर की स्मृति में है. क्योंकि अन्यथा, के रूप में foo के रूप में जल्द ही इस मामले में यहाँ के रूप में क्रियान्वित किया जाता है, एक बार आप foo के अंत में यह करीब घुंघराले ब्रेस तक पहुँचने के लिए, कैसे बिल्ली foo जहां कार्यक्रम के नियंत्रण के लिए जाना माना जाता है पता नहीं है? यह पता चला है कि उस सवाल का जवाब है कि लाल आयत में है. यह एक सूचक का प्रतिनिधित्व करता है, और यह कंप्यूटर को स्टोर करने के लिए अस्थायी रूप से, ढेर तथाकथित मुख्य ताकि के रूप में foo के रूप में जल्द ही पते क्रियान्वित किया जाता है, कंप्यूटर जहां मुख्य लाइन और वापस जाने के लिए क्या जानता है. सहेजे गए फ्रेम सूचक यह करने के लिए इसी तरह से संबंधित है. चार * यहाँ बार क्या प्रतिनिधित्व करता है? खैर, अब इस नीले खंड यहाँ foo फ्रेम है, बार क्या है? ठीक है, तो बार बस foo समारोह के लिए तर्क है. तो अब हम परिचित तस्वीर को वापस कर रहे हैं. अधिक और स्क्रीन पर सामान अधिक distractions लेकिन इस हल्के नीले रंग खंड है कि हम क्या स्वैप की तरह कुछ के लिए किया गया है चॉकबोर्ड पर ड्राइंग. Foo के लिए और फ्रेम में ही बात यह अब ठीक है बार है, जो इस पैरामीटर है. लेकिन और क्या ढेर में यहाँ इस कोड के अनुसार होना चाहिए? चार ग. [12] इसलिए हम भी स्मृति के 12 वर्ग देखना चाहिए, ग चर बुलाया आवंटित. और वास्तव में हम स्क्रीन पर कि है. बहुत ऊपर है ग [0], और फिर इस चित्र के लेखक परेशान किया था लेकिन नहीं सभी वर्गों के ड्राइंग वहाँ वास्तव में कर रहे हैं 12 वहाँ क्योंकि अगर आप नीचे सही पर देखो, ग [11], यदि आप 0 से गिनती, 12 बाइट्स है. लेकिन यहाँ समस्या है: ग किस दिशा में बढ़ रहा है? नीचे ऊपर की तरह है, है ना? यदि यह शीर्ष पर शुरू होता है और नीचे करने के लिए बढ़ता है, देखने के लिए नहीं करता है जैसे हम खुद को बहुत रनवे छोड़ दिया सब यहाँ पर. हम तरह के एक कोने में खुद को चित्रित किया है, और कि ग [11] बार, जो स्टैक फ्रेम सूचक के खिलाफ सही है के खिलाफ सही है, जो वापसी पते के खिलाफ सही है, वहाँ कोई और अधिक कमरा है. तो क्या निहितार्थ है, तो, अगर तुम पेंच, और आप एक 12 - बाइट बफर में 20 बाइट्स पढ़ने की कोशिश की? उन 8 अतिरिक्त बाइट्स कहाँ जा रहे हैं? बाकी सब कुछ अंदर, जिनमें से कुछ महत्वपूर्ण सुपर है. और सबसे महत्वपूर्ण बात, संभावित, लाल बॉक्स है, वापसी पते. क्योंकि लगता है कि आप या तो गलती से या adversarially उन 4 बाइट्स, कि सूचक पते लिखना चाहते हैं, कचरे के साथ, लेकिन एक नंबर है कि स्मृति में एक वास्तविक पते का प्रतिनिधित्व होता है के साथ नहीं है? Implicaiton क्या है तार्किक,? [छात्र जवाब, unintelligible] वास्तव में. >> जब foo रिटर्न हिट और धनु धनुकोष्ठक कि कार्यक्रम के मुख्य करने के लिए वापस नहीं करने के लिए आगे बढ़ना जा रहा है, यह पता कि लाल बॉक्स में जो कुछ भी है लौटने जा रहा है. अब, circumventing सॉफ्टवेयर पंजीकरण के मामले में, क्या पता है कि करने के लिए किया जा रहा वापस आ रहा है एक समारोह है है कि आम तौर पर बुलाया जाता है के बाद आप सॉफ्टवेयर के लिए भुगतान किया है और अपने पंजीकरण कोड inputted? आप कंप्यूटर चाल के यहाँ नहीं जा रहा में छांटने सकता है, लेकिन इसके बजाय, यहाँ पर जा रहा है. या, यदि आप वास्तव में कर रहे हैं चालाक, एक विरोधी वास्तव में कुंजीपटल में टाइप कर सकते हैं, उदाहरण के लिए, नहीं एक वास्तविक, शब्द नहीं 20 अक्षर है, लेकिन लगता है वह या वह कुछ वर्ण है कि कोड का प्रतिनिधित्व में प्रकार? और यह सी कोड होने नहीं जा रहा है, यह करने के लिए वर्ण होने जा रहा है कि बाइनरी मशीन कोड, 0 और 1 का प्रतिनिधित्व करते हैं. लेकिन लगता है कि वे काफी चालाक है कि, किसी भी तरह GetString शीघ्र में चस्पा करने के लिए कर रहे हैं कुछ है कि अनिवार्य रूप से कोड को संकलित किया गया है, और पिछले 4 बाइट्स कि वापसी पता लिखना चाहते हैं, और क्या पता है कि इनपुट क्या करता है? यह इस लाल आयत बफर की पहली बाइट के पते में भंडार है. तो तुम बहुत चालाक है, और यह परीक्षण और त्रुटि के एक बहुत कुछ है बुरे लोग वहाँ से बाहर है, लेकिन, अगर आप समझ कितना बड़ा इस बफर के लिए कि इस तरह के निवेश में पिछले कुछ बाइट्स है कि आप इस कार्यक्रम को उपलब्ध कराने के अपने बफर की शुरुआत का पता करने के लिए बराबर होना होगा, आप यह कर सकते हैं. यदि हम कहते हैं, आम तौर पर, हैलो, और \ 0, कि क्या बफर में समाप्त होता है. लेकिन अगर हम और अधिक चतुर हो, और हम हम क्या generically का दौरा पड़ने कोड के साथ फोन करता हूँ कि बफर को भरने, ए, ए, ए, एक: हमला, हमले, हमले, हमले, जहां यह सिर्फ कुछ है कि कुछ बुरा करता है. ठीक है, क्या होता है अगर तुम सच में चालाक, आप यह कर सकते हैं: 80, सीओ, 35, 08: लाल बॉक्स में संख्या का एक दृश्य है. सूचना है कि वह संख्या है कि यहाँ है मैच. यह रिवर्स क्रम में है, लेकिन यह है कि कुछ अन्य समय पर अधिक है. सूचना है कि इस वापसी पता जानबूझकर बदल दिया गया है पते बराबर यहाँ, मुख्य पता नहीं. तो अगर बुरा आदमी सुपर स्मार्ट है, वह या वह है कि हमले के कोड में शामिल करने के लिए जा रहा है कुछ पसंद है, 'उपयोगकर्ता फ़ाइलों के सभी हटाएँ.' या 'पासवर्ड की प्रतिलिपि बनाएँ,' या 'एक उपयोगकर्ता खाते है कि मैं में लॉग इन कर सकते हैं बनाएँ.' सभी में कुछ भी, और यह दोनों खतरे और सी. शक्ति है क्योंकि आप संकेत के माध्यम से याद करने के लिए उपयोग किया है और इसलिए तुम कुछ भी आप एक कंप्यूटर की स्मृति में चाहते लिख सकते हैं. आप कर सकते हैं एक कंप्यूटर कुछ भी आप बस चाहते यह अपने स्वयं के स्मृति अंतरिक्ष के भीतर चारों ओर छलांग. और हां, तो ऐसा है, तो इस दिन के लिए कई कार्यक्रमों और इतने सारे वेबसाइटों है कि समझौता कर रहे हैं लोगों को इस का लाभ लेने के लिए नीचे फोड़ा. और यह एक सुपर परिष्कृत हमले की तरह लग सकता है, लेकिन यह हमेशा कि तरह शुरू नहीं करता है. वास्तविकता यह है कि बुरे लोगों को आम तौर पर क्या करना होगा है, क्या यह एक कमांड लाइन पर एक कार्यक्रम या एक GUI प्रोग्राम या एक वेबसाइट है, तुम सिर्फ बकवास प्रदान करने शुरू. आप खोज क्षेत्र और हिट दर्ज करें में एक बहुत बड़ा शब्द में टाइप करें, और आप को देखने अगर वेबसाइट क्रैश इंतजार. या फिर आप को देखने के लिए अगर कार्यक्रम कुछ त्रुटि संदेश प्रकट होता है रुको. अगर तुम भाग्यशाली हो, क्योंकि बुरा आदमी, और आप कुछ पागल इनपुट है कि कार्यक्रम दुर्घटनाओं प्रदान करते हैं, इसका मतलब है कि प्रोग्रामर अपने बुरे व्यवहार सोचा भी नहीं था जो आप शायद पर्याप्त प्रयास के साथ कर सकते हैं, इसका मतलब है, पर्याप्त परीक्षण और त्रुटि, बाहर आंकड़ा कैसे एक और अधिक सटीक हमले मजदूरी. इतना के रूप में सुरक्षा का एक हिस्सा इन हमलों से परहेज नहीं है कुल मिलाकर, लेकिन उन्हें पता लगाने और वास्तव में लॉग देख और देख पागल आदानों क्या लोगों को अपनी वेबसाइट में लिखा गया है. क्या खोज शब्दों कुछ बफर बह निकला की उम्मीद में लोगों को अपनी वेबसाइट में लिखा है? और यह क्या एक सरणी के सरल मूल बातें करने के लिए सभी नीचे फोड़े, और क्या यह आवंटन और स्मृति का उपयोग करने के लिए क्या मतलब है? और उस से संबंधित है, भी, यह है. तो चलो सिर्फ एक हार्ड ड्राइव के अंदर एक बार फिर नज़र. तो आपको याद है कि एक या दो सप्ताह पहले से जब आप फ़ाइलों को खींच अपने रीसायकल बिन या कचरा कर सकते हैं, क्या होता है? [छात्र] कुछ भी नहीं है. >> हाँ, बिल्कुल कुछ भी नहीं. अंत में अगर आप दौड़ते डिस्क स्थान पर, विंडोज या मैक ओएस आप के लिए फ़ाइलों को हटाने शुरू कर देंगे. लेकिन अगर तुम वहाँ में कुछ खींचें, तो यह सभी सुरक्षित नहीं है. अपने रूममेट दोस्त या परिवार के सदस्य के लिए क्या करना है सभी डबल क्लिक करें और voila. सभी ढांचे के रूप में फ़ाइलों है कि आप को नष्ट करने की कोशिश की है. हम में से ज्यादातर के तो कम से कम पता है कि आप सही क्लिक करें या क्लिक करें नियंत्रण और खाली कचरा, या ऐसा कुछ. लेकिन फिर भी, कि काफी चाल नहीं क्या करता है. क्योंकि क्या होता है जब आप अपनी हार्ड ड्राइव पर एक फ़ाइल है कि कुछ शब्द दस्तावेज़ या कुछ JPEG का प्रतिनिधित्व करता है? और यह अपनी हार्ड ड्राइव का प्रतिनिधित्व करता है, और हम कहते हैं कि यहाँ इस ज़ुल्फ़ कि फ़ाइल का प्रतिनिधित्व करता है, और यह 0 और 1 की एक पूरी गुच्छा से बना है. क्या होता है जब आप trashcan या रीसायकल बिन कि फ़ाइल ही नहीं खींचें, लेकिन यह भी इसे खाली? कुछ भी नहीं की तरह. अब यह बिल्कुल कुछ भी नहीं है. अब यह सिर्फ कुछ भी नहीं है, क्योंकि एक छोटे से कुछ इस तालिका के रूप में होता है. तो वहाँ एक कंप्यूटर की स्मृति के अंदर डेटाबेस या तालिका के किसी तरह का है है कि अनिवार्य रूप से फ़ाइलों के नामों के लिए एक स्तंभ है, और फ़ाइल का स्थान है, जहां इस स्थान 123, सिर्फ एक यादृच्छिक संख्या हो सकता है के लिए 1 स्तंभ. तो हम x.jpg की तरह कुछ है, और 123 स्थान हो सकता है. और फिर क्या होता है, जब आप अपने कचरा खाली? यह दूर हो जाता है. लेकिन क्या दूर जाना नहीं है 0 और 1. तो क्या हुआ, है तो, कनेक्शन के लिए 4 pset? ठीक है,, 4 pset के साथ, सिर्फ इसलिए कि हम गलती से मिट गया है कॉम्पैक्ट फ़्लैश कार्ड है कि इन तस्वीरों के सभी था, या सिर्फ इसलिए कि यह बुरी किस्मत से भ्रष्ट बन गया है, इसका मतलब यह नहीं है कि 0 और 1 अभी भी वहाँ नहीं कर रहे हैं. हो सकता है कि उनमें से कुछ खो रहे हैं क्योंकि कुछ भ्रष्ट है समझ में आता है कि कुछ 0 1 और 1 बन गया में 0 बन गया. बुरी बातें छोटी गाड़ी सॉफ्टवेयर या दोषपूर्ण हार्डवेयर की वजह से हो सकता है. लेकिन उन बिट्स के कई, शायद उनमें से भी 100% अभी भी वहाँ हैं, यह सिर्फ है कि कंप्यूटर या कैमरे जहां JPEG 1 शुरू नहीं करता है और जहां JPEG 2 शुरू कर दिया है, लेकिन अगर तुम, प्रोग्रामर, प्रेमी की एक सा है, जहां उन JPEGs कर रहे हैं या वे कैसा दिखेगा के साथ पता है, आप 0 और 1 का विश्लेषण कर सकते हैं और कहते हैं, 'ओह. जेपीईजी. ओह, जेपीईजी. आप के लिए अनिवार्य रूप से एक बस के साथ एक कार्यक्रम में लिख सकते हैं या जबकि पाश कि उन फ़ाइलों में से हर एक के ठीक. तो सबक तो, शुरू करने के लिए "सुरक्षित" आपकी फ़ाइलों को मिटा अगर आप इस पूरी तरह से बचने के लिए करना चाहते हैं. हाँ? [छात्र सवाल है, unintelligible] >> और अधिक स्मृति की तुलना में आप पहले किया है - ओह! अच्छा सवाल है. क्यों तो, फिर, रद्दी खाली करने के बाद, आपके कंप्यूटर तुम बताओ कि तुम और अधिक मुक्त स्थान की तुलना में आप पहले किया था? संक्षेप में, क्योंकि यह झूठ बोल रहा है. तकनीकी तौर पर, आप और अधिक स्थान है. क्योंकि अब आप ने कहा है, तो आप अन्य सामान डाल कर सकते हैं, जहां कि फ़ाइल एक बार गया था, लेकिन इसका मतलब यह नहीं बिट्स चले जा रहे हैं, और इसका मतलब यह नहीं बिट सभी 0 जा रहा बदल रहे हैं, उदाहरण के लिए अपनी सुरक्षा के लिए,. इसके विपरीत, यदि आप "सुरक्षित" मिटा फाइलें, या शारीरिक रूप डिवाइस को नष्ट करने के लिए, कि वास्तव में एक ही रास्ता है, कभी कभी कि चारों ओर. तो हम क्यों कि अर्द्ध डरावना नोट पर नहीं छोड़ करते हैं, और हम आप सोमवार को देखेंगे. CS50.TV