[Bermain muzik] [VIDEO MAIN SEMULA] -Dia Berbohong. -Tentang apa? -Saya tidak tahu. -Jadi Apa yang kita tahu? -Itu Pada 09:15, Ray Santoya berada di ATM. -Yeah. Jadi persoalannya ialah, apa yang yang dia buat di 9:16? -Shooting Milimeter 9 sesuatu. Mungkin dia melihat sniper. -atau Telah bekerjasama dengan beliau. -Wait. Kembali satu. -Apa yang awak nampak? -Bring Mukanya skrin penuh. Cermin mata -His. -Ada Pantulan. -Ia Pasukan besbol Nuevitas. Itulah logo mereka. -dan Dia bercakap dengan sesiapa yang memakai jaket itu. [AKHIR MAIN SEMULA] DAVID MALAN: Baiklah. Ini adalah CS50 dan ini adalah sedikit lebih [didengar] yang anda berada berkecimpung dengan masalah set empat. Hari ini kita mula kelihatan sedikit lebih mendalam perkara-perkara ini dipanggil petunjuk, yang walaupun ia topik yang agak sukar difahami, ternyata bahawa ia akan sebagai cara dengan mana kita boleh mula membina dan memasang program-program yang lebih canggih. Tetapi kita lakukan pada Rabu lalu melalui beberapa claymation pertama. Jadi ini, ingat, adalah Binky dan kami selalu dia untuk mengambil lihat pada program yang tidak benar-benar melakukan apa-apa yang menarik, tetapi ia tidak mendedahkan beberapa masalah. Jadi bermula hari ini, mengapa tidak kita berjalan cepat melalui beberapa langkah-langkah ini, cuba untuk menyuling ke dalam istilah manusia apa yang berlaku di sini dan mengapa ini tidak baik, dan kemudian beralih dan benar-benar mula membina sesuatu dengan teknik ini? Jadi ini adalah yang pertama dua baris dalam program ini dan dari segi orang biasa itu, apa sedang kedua-dua baris buat? Seseorang yang munasabah yang selesa dengan apa yang diisytiharkan pada skrin? Apakah kedua-dua baris buat? Ia bukan semua yang berbeza dari minggu satu, tetapi terdapat beberapa simbol khas. Ya? Kembali ke sana. PENONTON: Mengisytiharkan petunjuk? DAVID MALAN: Katakanlah lagi? PENONTON: Mengisytiharkan petunjuk? DAVID MALAN: Mengisytiharkan petunjuk dan mari kita menghalusi lebih sedikit. PENONTON: [didengar] alamat x dan kemudian y. DAVID MALAN: Dan kemudian alamat. Jadi secara khusus apa yang kami lakukan adalah kita mengisytiharkan dua pembolehubah. Pembolehubah ini, walaupun, akan sebagai jenis int bintang, yang lebih khusus bermakna mereka akan menyimpan alamat int, masing-masing, x dan y. Maka adakah nilai? Adakah terdapat mana-mana alamat sebenar dalam ini dua pembolehubah pada masa ini? No. Ia hanya apa yang dipanggil nilai sampah. Jika anda tidak benar-benar menetapkan berubah-ubah, apa sahaja yang di dalam RAM sebelum ini akan isi dengan sifar dan orang yang kedua-dua mereka pembolehubah. Tetapi kita masih belum tahu apa yang mereka dan itulah akan menjadi kunci mengapa Binky kehilangan kepalanya pada minggu lalu. Jadi ini adalah claymation yang penjelmaan ini di mana anda mempunyai hanya dua pembolehubah, keping bulat sedikit tanah liat, yang boleh menyimpan pembolehubah, tetapi sebagai anak panah berselimut mencadangkan, mereka tidak sebenarnya menunjuk ke mana-mana dikenali semata-mata. Sebab itu kita mempunyai garis ini, dan ini adalah baru minggu lepas, malloc untuk ingatan peruntukan, yang hanya cara yang mewah memberitahu sistem operasi, Linux atau Mac OS atau Windows, hey, memberi aku ingatan, dan semua yang anda perlu memberitahu sistem operasi adalah apa apabila meminta ia untuk ingatan. Ia tidak akan peduli apa anda akan lakukan dengan ia, tetapi anda perlu memberitahu operasi sistem apa dengan cara malloc. Ya? PENONTON: Berapa banyak? DAVID MALAN: Berapa banyak? Berapa banyak dalam bait, dan sebagainya, ini, sekali lagi, contoh yang dibuat-buat, hanya mengatakan, memberi saya saiz int. Sekarang, saiz int adalah empat bait atau 32 bit. Jadi ini adalah hanya satu cara untuk berkata, hey, sistem operasi, memberi saya empat bait memori yang boleh saya gunakan ada pada saya, dan khususnya, apa yang tidak pulangan malloc berkenaan itu sebahagian daripada empat bait? PENONTON: Alamat? DAVID MALAN: Alamat. Alamat bahawa sebahagian daripada empat bait. Tepat sekali. Dan supaya apa yang disimpan akhirnya dalam x dan sebab itu kita tidak benar-benar peduli apa jumlah yang alamat, sama ada ia OX1 atau OX2 atau beberapa alamat perenambelasan samar. Kami hanya mengambil berat bergambar yang bahawa pemboleh ubah x kini menunjuk kepada yang sebahagian memori. Jadi anak panah mewakili penunjuk, atau lebih khusus, alamat ingatan. Tetapi sekali lagi, kita tidak biasanya mengambil berat apa yang orang-orang alamat sebenar adalah. Sekarang, talian ini mengatakan apa dari segi orang biasa itu? Bintang x mendapat 42 koma bertitik. Apakah ini bermakna? Anda mahu pergi? Jangan menggaru leher anda. PENONTON: Alamat x adalah pada 42. DAVID MALAN: Alamat x adalah pada 42. Tidak cukup. Begitu dekat, tetapi tidak cukup, kerana ada bintang yang yang x awalan ini. Oleh itu, kita perlu tweak sedikit. Ya? PENONTON: Nilai bahawa penunjuk x menunjuk ke 42. DAVID MALAN: OK. Nilai yang penunjuk x ialah menunjuk ke, katakan, hendaklah menjadi 42, atau meletakkan cara lain, bintang x kata, pergi kepada apa sahaja alamat adalah dalam x, sama ada 1 Oxford Jalan atau 33 Oxford Street atau OX1 atau ox33, apa sahaja bahawa alamat angka adalah, bintang x adalah penyahrujukan x. Jadi pergi ke alamat itu dan kemudian meletakkan nombor 42 di sana. Supaya akan menjadi cara sama dengan mengatakan bahawa. Jadi itu sahaja halus dan kemudian kita akan mewakili gambar seperti berikut di mana kami telah menambah 42 itu sebahagian daripada empat bait di sebelah kanan, tetapi garis ini adalah di mana perkara yang pergi jauh menyimpang dan kepala Binky ini muncul off pada ketika ini, kerana perkara-perkara buruk berlaku apabila anda dereference nilai sampah atau anda dereference tidak sah petunjuk, dan aku berkata tidak sah kerana pada ketika ini dalam cerita, maksud yang terkandung dalam y? Apakah nilai y berdasarkan mengenai langkah-langkah kebelakangan ini? Ya? Apa itu? PENONTON: Satu alamat. DAVID MALAN: Satu alamat. Ia harus menjadi satu alamat tetapi saya dimulakan ia? Jadi saya tidak perlu lagi. Jadi apa yang dikenali sebagai di sana? Ia hanya beberapa nilai sampah. Ia boleh menjadi mana-mana alamat dari sifar hingga 2000000000 jika anda mempunyai dua gig RAM, atau sifar ke 4000000000 jika anda telah mendapat empat gigabait RAM. Ia adalah beberapa nilai sampah, tetapi masalahnya ialah bahawa sistem operasi, jika ia tidak memberikan anda yang sebahagian memori khusus yang anda cuba untuk pergi ke, ia biasanya akan menyebabkan apa kami telah dilihat sebagai satu kesalahan segmentasi. Jadi sebenarnya, mana-mana orang yang mempunyai bergelut pada masalah pada waktu pejabat atau dalam masalah yang lebih secara amnya dengan cuba untuk memikirkan kesalahan segmentasi, yang biasanya bermakna anda menyentuh segmen memori yang anda tidak perlu. Anda menyentuh memori yang sistem operasi tidak mempunyai membolehkan anda untuk menyentuh, sama ada dengan pergi terlalu jauh dalam pelbagai anda atau memulakan sekarang, sama ada ia adalah kerana anda menyentuh memori yang hanya beberapa nilai sampah. Berbuat demikian bintang x di sini jenis tingkah laku ditentukan. Anda tidak boleh melakukannya kerana kemungkinan sedang, program ini hanya akan kemalangan, kerana anda katakan, pergi ke alamat ini dan anda tidak tahu di mana alamat yang sebenarnya. Jadi sistem operasi itu mungkin akan crash program anda akibat dan sesungguhnya, itulah apa yang berlaku di sana untuk Binky. Jadi akhirnya, Binky tetap masalah ini dengan ini. Jadi program itu sendiri adalah cacat. Tetapi jika anda jenis mara ke hadapan dan melaksanakan garis ini sebaliknya, y sama x hanya bermakna apa sahaja alamat adalah x, juga memasukkannya ke dalam y. Dan sebagainya bergambar, kami telah diwakili ini dengan dua anak panah dari x dan dari y menunjuk ke tempat yang sama. Jadi semantik, x sama kepada y kerana kedua-dua mereka menimbun yang sama alamat, ergo menunjuk pada 42, dan kini, dengan berkata bintang y, pergi ke alamat dalam y, ini mempunyai kesan sampingan yang menarik. Jadi alamat dalam y adalah Perkara yang sama seperti alamat yang dalam x. Jadi, jika anda mengatakan pergi ke alamat dalam y dan menukar nilai kepada 13, siapa lagi ia berlaku? X, titik D, boleh dikatakan, harus terjejas juga. Dan sesungguhnya, bagaimana Nick menarik gambar ini dalam claymation betul-betul itu. Walaupun kita mengikuti penunjuk y, kita berakhir di tempat yang sama, dan sebagainya jika kita mencetak keluar x atau pointee y, maka kita akan melihat nilai 13. Sekarang, saya katakan pointee menjadi konsisten dengan video. Pengaturcara, untuk saya pengetahuan, tidak pernah benar-benar mengatakan pointee perkataan, apa yang ada tajam di, tetapi untuk konsisten dengan video, menyedari itu sahaja yang telah bermakna dalam keadaan itu. Jadi apa-apa soalan mengenai claymation atau petunjuk atau malloc sahaja lagi? Tidak? Baiklah. Jadi tanpa lanjut ado, mari kita lihat di mana ini sebenarnya mempunyai telah digunakan untuk beberapa ketika. Oleh itu, kita mempunyai perpustakaan CS50 ini yang mempunyai semua fungsi-fungsi ini. Kami telah menggunakan GetInt banyak, GetString, mungkin GetLongLong awal dalam Serangga saya satu atau lebih, tetapi apa yang sebenarnya telah berlaku? Nah, mari kita melihat cepat di bawah hood di program yang memberi inspirasi mengapa kami memberi anda CS50 perpustakaan, dan sesungguhnya pada minggu lepas, kita mula mengambil orang-orang roda latihan di luar. Jadi ini kini disusun daripada bedah siasat apa telah berlaku dalam perpustakaan CS50, walaupun kita kini akan mula bergerak jauh dari itu bagi kebanyakan program. Jadi ini adalah satu program yang dipanggil scanf 0. Ia sangat pendek. Ia hanya mempunyai ayat-ayat ini, tetapi ia memperkenalkan scanf fungsi dipanggil bahawa kita sebenarnya akan melihat dalam seketika di dalam perpustakaan CS50, walaupun dalam bentuk yang sedikit berbeza. Jadi program ini di talian 16 yang mengisytiharkan x berubah-ubah. Maka berikanlah kepadaku empat bait untuk int. Ia telah memberitahu pengguna, nombor kehendaki, dan kemudian ini adalah barisan yang menarik yang sebenarnya mengikat bersama-sama pada minggu lepas dan ini. Scanf, dan kemudian melihat ia mengambil rentetan format, seperti printf, % i bermakna int, dan kemudian ia mengambil Hujah kedua yang kelihatan sedikit funky. Ia Ampersand x, dan untuk menarik balik, kita hanya lihat minggu sekali terakhir ini. Apakah Ampersand x mewakili? Apakah Ampersand dilakukan di C? Ya? PENONTON: Alamat. DAVID MALAN: Alamat. Jadi ia adalah sebaliknya pengendali bintang, manakala pengendali bintang itu berkata, pergi ke alamat ini, pengendali Ampersand berkata, memikirkan alamat pembolehubah ini, dan sebagainya ini adalah kunci, kerana tujuan scanf dalam kehidupan adalah untuk mengimbas pengguna ini input daripada papan kekunci, bergantung kepada apa sahaja yang dia jenis, dan kemudian membaca input pengguna tersebut ke dalam pembolehubah, tetapi kita lihat dalam dua minggu yang lalu bahawa fungsi swap yang kita cuba dengan mudah untuk melaksanakan hanya patah. Ingat bahawa dengan fungsi swap, jika kita hanya mengisytiharkan A dan B seperti ints, kami tidak berjaya menukar dua pemboleh ubah di dalam pertukaran hanya suka dengan susu dan OJ, tetapi sebaik sahaja pertukaran kembali, apakah keputusan berkenaan dengan x dan y, nilai asal? Apa-apa. Yeah. Tiada apa yang berlaku waktu itu, sebab swap berubah hanya salinan tempatan, yang mengatakan, semua kali ini, setiap kali kita ada telah lulus dalam hujah-hujah dengan fungsi, kami hanya lulus salinan mereka hujah. Anda boleh lakukan dengan yang apa sahaja yang anda mahu dengan mereka, tetapi mereka akan tidak mempunyai kesan ke atas nilai asal. Jadi ini adalah bermasalah jika anda mahu mempunyai fungsi seperti scanf dalam kehidupan, yang tujuan adalah untuk mengimbas input pengguna dari keyboard dan kemudian isikan tempat kosong, jadi untuk berkata-kata, iaitu, memberi pembolehubah seperti x nilai, kerana jika saya untuk melepaskan sahaja x untuk scanf, jika anda mengambil kira logik lalu minggu, scanf boleh melakukan apa sahaja yang ia mahu dengan salinan x, tetapi ia tidak boleh secara kekal menukar x melainkan kita memberi scanf peta harta, boleh dikatakan, mana x menandakan tempat, di mana kita lulus dalam alamat x supaya scanf boleh pergi ke sana dan sebenarnya perubahan nilai x. Dan sebagainya memang, semua bahawa program ini tidak jika saya membuat scanf 0, dalam sumber saya Direktori 5m, membuat scanf 0, dot mengurangkan scanf, nombor sila 50, terima kasih untuk 50. Jadi ia tidak semua yang menarik, tetapi apa yang sebenarnya berlaku adalah bahawa sebaik sahaja saya memanggil scanf sini, nilai x sedang selama-lamanya berubah. Sekarang, ini seolah-olah baik dan baik, dan sebenarnya, ia seolah-olah seperti kita tidak benar-benar memerlukan perpustakaan CS50 sama sekali lagi. Sebagai contoh, mari kita berjalan ini sekali lagi di sini. Biar saya membukanya semula untuk kali kedua. Mari kita cuba sebilangan sila dan daripada berkata 50 seperti sebelum ini, mari kita hanya mengatakan tidak. OK, itu sedikit pelik. OKAY. Dan hanya beberapa karut di sini. Oleh itu, ia seolah-olah tidak menangani situasi yang salah. Oleh itu, kita perlu secara minimum permulaan menambah beberapa ralat semakan memastikan bahawa pengguna mempunyai ditaip dalam jumlah yang sebenar seperti 50, kerana nampaknya menaip perkataan tidak dikesan sebagai bermasalah, tetapi ia mungkin boleh. Mari kita lihat versi ini kini itulah percubaan saya untuk mengimplemen semula GetString. Jika scanf mempunyai semua ini fungsi terbina dalam, mengapa kita telah berkecimpung dengan ini roda latihan seperti GetString? Nah, di sini mungkin saya sendiri Versi mudah GetString mana seminggu yang lalu, saya mungkin berkata, memberi saya rentetan dan memanggilnya penampan. Hari ini, saya akan mula hanya berkata bintang char, yang, ingat, ia hanya sinonim. Ia kelihatan menakutkan tetapi ia perkara sama. Itu, kurniakanlah daku penampan pembolehubah dipanggil yang akan menyimpan rentetan, memberitahu rentetan pengguna sila, dan kemudian, sama seperti sebelum ini, mari kita cuba untuk meminjam pelajaran ini scanf % s masa ini dan kemudian lulus dalam buffer. Kini, cek kewarasan cepat. Kenapa saya tidak mengatakan Ampersand penampan kali ini? Membuat kesimpulan daripada contoh sebelumnya. PENONTON: Char bintang ini penunjuk. DAVID MALAN: Tepat sekali, kerana kali ini, char bintang sudah menjadi penunjuk, alamat, dengan takrif bahawa bintang berada di sana. Dan jika scanf menjangka alamat, ia mencukupi hanya untuk lulus dalam penampan. Saya tidak perlu berkata penampan Ampersand. Bagi yang ingin tahu, anda boleh melakukan sesuatu seperti ini. Ia akan mempunyai maksud yang berbeza. Ini akan memberikan anda penunjuk kepada penunjuk, yang sebenarnya satu perkara yang sah di C, tetapi untuk sekarang, mari kita memastikan ia mudah dan cerita yang konsisten. Saya hanya akan lulus dalam penampan dan itu betul. Masalahnya walaupun adalah ini. Biar saya pergi ke hadapan dan menjalankan ini program selepas menyusun ia. Membuat scanf 1. Sialan, pengkompil saya menangkap kesilapan saya. Berikan saya satu saat. Dilafaz. Katakan scanf-1.c. OKAY. Di sana kami pergi. Saya perlukannya. ID CS50 mempunyai pelbagai tetapan tatarajah yang melindungi anda terhadap diri anda. Saya perlu untuk melumpuhkan mereka dengan berjalan dilafaz secara manual masa ini. Jadi rentetan sila. Saya akan pergi ke hadapan dan taip di dunia hello kegemaran saya. OK, null. Itu bukan apa yang saya taip. Jadi ia menunjukkan sesuatu yang salah. Biar saya pergi ke hadapan dan taip dalam rentetan benar-benar panjang. Terima kasih kerana batal dan saya tidak tahu jika saya akan dapat kemalangan itu. Mari kita cuba satu salinan kecil paste dan lihat jika ini dapat membantu. Hanya tampal banyak ini. Ia pasti yang lebih besar rentetan daripada biasa. Mari kita benar-benar menulisnya. No. Tak guna. Perintahkanlah tidak dijumpai. Jadi, itu tidak berkaitan. Ini kerana saya ditampal beberapa watak yang tidak baik, tetapi ini ternyata tidak akan berfungsi. Mari kita cuba ini sekali lagi, kerana ia lebih menyeronokkan jika kita benar-benar kemalangan itu. Mari kita menaip ini dan sekarang, saya akan menyalin rentetan benar-benar panjang dan sekarang mari kita lihat jika kita boleh kemalangan perkara ini. Notis saya ditinggalkan ruang dan barisan baru dan koma bertitik dan semua watak funky. Enter. Dan kini rangkaian cuma lambat. Saya ditekan Command-V terlalu lama, dengan jelas. Tak guna! Perintahkanlah tidak dijumpai. OKAY. Nah, persoalannya adalah namun berikut. Jadi apa yang sebenarnya akan pada dengan pengakuan ini penimbal bintang char pada baris 16? Jadi apa yang saya mendapat apabila saya mengisytiharkan penunjuk? Semua Saya mendapat adalah nilai empat bait dipanggil penampan, tetapi apa yang di dalamnya pada masa ini? Ia hanya beberapa nilai sampah. Kerana bila-bila masa anda mengisytiharkan pembolehubah dalam C, ia hanya beberapa nilai sampah, dan kami mula perjalanan lebih realiti ini. Sekarang, apabila saya memberitahu scanf, pergi ke alamat ini dan meletakkan apa sahaja jenis pengguna dalam. Jika jenis pengguna dalam hello dunia, baik, di mana saya meletakkan ia? Buffer adalah nilai sampah. Jadi itulah jenis seperti anak panah yang menunjuk siapa tahu di mana. Mungkin ia menunjuk di sini di ingatan saya. Dan supaya apabila pengguna jenis di dunia hello, program ini cuba untuk meletakkan rentetan hello dunia backslash 0 kerana sebahagian memori. Tetapi dengan kebarangkalian yang tinggi, tetapi jelas tidak 100% kebarangkalian, komputer akan kemudian berlanggar program ini kerana ini bukan ingatan saya harus dibenarkan untuk menyentuh. Jadi ringkasnya, program ini adalah boleh dipercayai sama sekali untuk betul-betul sebab itu. Saya pada dasarnya tidak melakukan apa? Apakah langkah-langkah yang telah saya ditinggalkan, seperti kita ditinggalkan dengan contoh pertama Binky ini? Ya? PENONTON: Peruntukan memori? DAVID MALAN: peruntukan Memori. Saya tidak benar-benar diperuntukkan apa-apa memori untuk tali itu. Oleh itu, kita boleh menetapkan ini dalam beberapa cara. Satu, kita boleh memastikan ia mudah dan sebenarnya, kini anda akan mula melihat kabur yang garis antara apa array, apa tali adalah, apa yang char bintang ini, apa yang pelbagai aksara adalah. Berikut adalah contoh yang kedua yang melibatkan tali dan notis semua yang saya lakukan di talian 16 adalah, daripada berkata penampan yang akan menjadi char bintang, penunjuk kepada sebahagian memori, Saya akan memberikan yang proaktif diri saya penampan bagi 16 aksara, dan sebenarnya, jika anda sudah biasa dengan buffering istilah, mungkin dari dunia video, mana video adalah buffering, buffering, buffering. Nah, apa yang berkaitan di sini? Nah, Di dalam YouTube dan di dalam pemain video secara amnya adalah array yang lebih besar daripada 16. Ia mungkin pelbagai saiz satu megabait, mungkin 10 megabait, dan ke dalam pelbagai yang tidak penyemak imbas anda turun sejumlah bait, sejumlah besar megabait video, dan pemain video, YouTube atau sesiapa yang, bermula membaca bait dari pelbagai itu, dan bila-bila masa anda melihat perkataan buffering, buffering, ini bermakna pemain mempunyai mendapat ke akhir array itu. Rangkaian ini sangat pelan dan ia tidak mempunyai diisi semula array dengan lebih bytes dan supaya anda berada di luar bit untuk dipaparkan kepada pengguna. Jadi penampan adalah istilah apt di sini kerana ia hanya pelbagai, sebahagian memori. Dan ini akan memperbaikinya kerana ia ternyata bahawa anda boleh merawat tatasusunan seolah-olah mereka alamat, walaupun penampan hanya simbol, ia adalah satu jujukan aksara, penampan, yang berguna untuk saya, pengaturcara, anda boleh lulus namanya sekitar seolah-olah ia adalah suatu penunjuk, seolah-olah ia adalah alamat sebahagian yang memori untuk 16 aksara. Jadi, itu untuk mengatakan, saya boleh lulus scanf betul-betul perkataan yang dan demikian sekarang, jika saya membuat program ini, membuat scanf 2, dot slash scanf 2, dan taip hello dunia, Enter, time-- yang Hmm, apa yang berlaku? String sila. Apa yang saya buat salah? Hello dunia, penampan. Hai dunia. Ah, saya tahu apa yang ia lakukan. OKAY. Jadi ia membaca sehingga sehingga ruang yang pertama. Jadi mari kita menipu untuk hanya seketika dan mengatakan saya hanya mahu menaip sesuatu benar-benar panjang seperti ini adalah ayat yang panjang itulah salah satu, dua, tiga, empat, lima, enam, tujuh, lapan, sembilan, 10, 11, 12, 13, 14, 15, 16. OKAY. Sesungguhnya ia adalah hukuman yang panjang. Jadi ayat ini adalah lebih lama daripada 16 aksara Dan setelah saya tekan Enter, apa yang akan berlaku? Nah, dalam kes ini daripada penampan cerita, saya telah mengisytiharkan untuk benar-benar menjadi array dengan 16 aksara bersedia untuk pergi. Jadi, satu, dua, tiga, empat, lima, enam, tujuh, lapan, sembilan, 10, 11, 12, 13, 14, 15, 16. Jadi 16 aksara, dan kini, apabila saya membaca dalam sesuatu seperti ini adalah yang panjang ayat, apa yang akan berlaku adalah bahawa saya akan membaca yang demikian mengandungi satu lama S-E-N-T-E-N-C-E, hukuman. Jadi ini adalah sengaja perkara yang tidak baik yang saya terus menulis di luar sempadan pelbagai saya, luar sempadan penampan saya. Saya boleh mendapatkan bertuah dan program akan terus berjalan dan tidak peduli, tetapi secara umumnya bercakap, ini sesungguhnya akan kemalangan program saya, dan ia adalah pepijat dalam saya kod masa ini saya melangkah di luar sempadan array itu, kerana saya tidak tahu jika ia semestinya akan crash atau jika saya hanya akan mendapat bertuah. Jadi ini adalah bermasalah kerana dalam kes ini, ia seolah-olah untuk bekerja dan mari kita menggoda nasib di sini, walaupun IDE seolah-olah bertolak ansur dengan agak sedikit daripada- Di sana kami pergi. Akhirnya. Jadi saya satu-satunya yang boleh melihat ini. Jadi saya hanya mempunyai banyak menaip menyeronokkan daripada frasa yang sebenar benar-benar panjang bahawa ia pasti melebihi 16 bait, kerana saya ditaip dalam berbilang talian ini lama gila frasa, dan kemudian melihat apa yang berlaku. Program ini cuba mencetaknya dan ketika ia kesalahan segmentasi dan kesalahan segmentasi adalah apabila sesuatu seperti ini berlaku dan sistem operasi itu berkata tidak, tidak boleh menyentuh memori itu. Kita akan membunuh program ini sama sekali. Jadi ini kelihatan bermasalah. Saya telah menyempurnakan program di mana sekurang-kurangnya mempunyai beberapa memori, tetapi ini akan kelihatan untuk menghadkan fungsi GetString untuk mendapat tali panjang lebar terhingga 16. Jadi, jika anda mahu menyokong lagi ayat daripada 16 aksara, apa yang awak buat? Dengan baik, anda boleh meningkatkan saiz penimbal ini kepada 32 atau bahawa seolah-olah jenis pendek. Apa kata kita hanya membuat ia 1000 tetapi menolak kembali. Apakah sambutan yang intuitif daripada hanya mengelakkan masalah ini dengan membuat penampan saya lebih besar, seperti 1000 aksara? Dengan melaksanakan GetString cara ini. Apa yang baik atau buruk di sini? Ya? PENONTON: Jika anda mengikat banyak ruang dan anda tidak menggunakannya, maka anda tidak boleh mengagihkan semula ruang itu. DAVID MALAN: Sudah tentu. Ia membazir setakat yang jika tidak benar-benar memerlukan 900 orang bytes tetapi anda meminta 1000 dalam jumlah anyway, anda hanya memakan lebih banyak memori pada komputer pengguna daripada apa yang anda perlu, dan selepas semua, sebahagian daripada anda telah dihadapi dalam kehidupan apabila anda berada menjalankan banyak program dan mereka makan sehingga banyak memori, ini sebenarnya boleh memberi kesan kepada prestasi dan pengalaman pengguna pada komputer. Jadi itulah jenis penyelesaian malas, yang pasti, dan sebaliknya, ia bukan sahaja membazir, apa masalah masih kekal, walaupun saya membuat penampan saya 1000? Ya? PENONTON: Rentetan adalah panjang 1,001. DAVID MALAN: Tepat sekali. Jika tali anda adalah panjang 1001, anda mempunyai masalah yang sama, dan dengan hujah saya, saya akan hanya kemudian menjadikan tahun 2000, tetapi anda tidak tahu dalam memajukan berapa besar yang sepatutnya, dan lagi, saya perlu menyusun program saya sebelum membiarkan orang menggunakan dan memuat turun ia. Jadi ini adalah betul-betul jenis barangan bahawa CS50 perpustakaan try untuk membantu kami dengan dan kami akan hanya pandang di beberapa pelaksanaan asas di sini, tetapi ini adalah CS50 dot C. Ini adalah fail yang sudah di CS50 IDE semua minggu ini yang anda telah gunakan. Ia pra-disusun dan anda telah telah menggunakan ia secara automatik dengan sifat yang mempunyai melontarkan L CS50 bendera dengan dilafaz, tetapi jika saya tatal ke bawah melalui semua fungsi-fungsi ini, di sini adalah GetString, dan hanya untuk memberikan anda satu rasa apa yang berlaku, mari kita lihat cepat pada kerumitan relatif. Ia bukan yang lama hilang fungsi, tetapi kita tidak perlu berfikir keras tentang semua bagaimana untuk pergi tentang mendapatkan tali. Jadi di sini adalah penampan saya dan saya nampaknya memulakan ia ke nol. Ini, sudah tentu, adalah perkara yang sama seperti char bintang, tetapi saya mengambil keputusan dalam melaksanakan perpustakaan CS50 bahawa jika kita akan benar-benar dinamik, Saya tidak tahu terlebih dahulu berapa besar daripada pengguna rentetan akan mahu untuk mendapatkan. Jadi, saya akan memulakan dengan hanya rentetan kosong dan saya akan membina sebanyak memori yang saya perlukan untuk muat rentetan pengguna dan jika saya tidak mempunyai cukup, saya akan bertanya sistem operasi untuk lebih banyak memori. Saya akan bergerak rentetan mereka menjadi sebahagian yang lebih besar memori dan saya akan melepaskan atau membebaskan sebahagian tidak cukup memori yang besar dan kami hanya akan untuk melakukan ini secara berulang. Jadi pandangan yang cepat, di sini hanya pembolehubah yang aku nak untuk mengesan kapasiti penimbal saya. Berapa banyak bait yang boleh saya patut? Berikut adalah n ubah dengan yang saya akan menjaga mengesan berapa banyak bait sebenarnya dalam penampan atau pengguna itu telah ditaip. Jika anda tidak melihat ini sebelum ini, anda boleh menentukan bahawa pembolehubah seperti int adalah tidak ditandatangani, yang seperti namanya, bermakna ia bukan negatif, dan mengapa akan Yang pernah saya mahu mengganggu dengan menjelaskan jika yang int bukan sahaja int, tetapi ia int tidak ditandatangani? Ia adalah satu int bukan negatif. Apakah yang dikatakan [didengar] bermakna? PENONTON: Ia menggambarkan jumlah yang memori yang boleh [didengar]. DAVID MALAN: Ya. Jadi, jika saya mengatakan tidak ditandatangani, ini sebenarnya memberikan anda satu bit memori tambahan dan ia seolah-olah jenis bodoh, tetapi jika anda mempunyai satu sedikit memori tambahan, yang bermakna anda mempunyai dua kali ganda nilai yang anda boleh mewakili, kerana ia boleh menjadi 0 atau 1. Jadi secara lalai, int boleh kira-kira negatif 2000000000 sepanjang jalan sehingga positif 2 bilion. Mereka adalah julat yang besar, tetapi ia masih sejenis membazir jika anda hanya mengambil berat tentang saiz, yang hanya mengikut gerak hati harus bukan negatif atau positif atau 0, dan kemudian, mengapa engkau membuang 2000000000 nilai yang mungkin bagi nombor negatif jika anda tidak akan menggunakannya? Jadi dengan mengatakan tidak ditandatangani, kini saya boleh int antara 0 dan kira-kira 4 bilion. Jadi di sini adalah hanya int C atas sebab-sebab kami tidak akan masuk ke dalam tadi sebagai mengapa ia adalah satu int sebaliknya char, tetapi di sini adalah intipati apa yang berlaku pada, dan sebahagian dari kamu mungkin menggunakan, sebagai contoh, fungsi fgetc walaupun dalam pset empat atau selepas itu, kita akan melihat ia lagi dalam masalah menetapkan lima, fgetc adalah baik kerana sebagai nama jenis, jenis arcanely mencadangkan, ia adalah fungsi yang mendapat watak dan sebagainya, apa yang pada asasnya berbeza tentang apa yang kita lakukan dalam GetString adalah kita tidak menggunakan scanf dengan cara yang sama. Kami hanya menjalar di sepanjang langkah demi langkah atas apa sahaja yang pengguna itu telah ditaip dalam, kerana kita sentiasa boleh memperuntukkan satu char, dan dengan itu kita boleh sentiasa selamat melihat satu char pada satu masa, dan sihir mula berlaku di sini. Saya akan tatal ke bawah ke pertengahan fungsi ini hanya untuk memperkenalkan secara ringkas fungsi ini. Sama seperti ada Fungsi malloc, ada fungsi realloc mana realloc membolehkan anda mengagihkan semula sebahagian memori dan menjadikannya lebih besar atau lebih kecil. Cerita jadi pendek dan panjang dengan menggerakkan tangan saya untuk hari ini, tahu bahawa apa yang GetString yang dilakukannya adalah ia semacam daripada ajaib tumbuh atau mengecut penampan sebagai pengguna jenis yang masing-masing tali. Jadi, jika jenis pengguna yang tali pendek, kod ini hanya memperuntukkan cukup memori untuk muat tali. Jika pengguna terus menaip seperti yang saya lakukan lagi dan lagi dan sekali lagi, baik, jika ini penampan mulanya ini besar dan program menyedari, untuk tunggu sebentar, saya keluar dari ruang, ia akan menggandakan saiz penimbal dan kemudian dua kali ganda saiz penimbal dan kod yang melakukan dua kali ganda itu, jika kita lihat di sini, ia hanya ini pandai satu liner. Anda tidak mungkin telah melihat sintaks ini sebelum ini, tetapi jika anda mengatakan bintang sama, ini adalah perkara yang sama seperti berkata kali kapasiti 2. Oleh itu, ia hanya menyimpan dua kali ganda kapasiti penimbal dan kemudian memberitahu realloc untuk memberi sendiri bahawa memori banyak lagi. Sekarang, sebagai diketepikan, terdapat adalah fungsi lain di sini bahawa kita tidak akan melihat ke dalam apa-apa butiran selain daripada untuk menunjukkan dalam GetInt, kita menggunakan GetString dalam GetInt. Kami pastikan bahawa ia tidak batal, yang, ingat, adalah nilai yang khas yang bermaksud sesuatu yang tidak kena. Kami keluar dari ingatan. Lebih baik periksa untuk itu. Dan kita mengembalikan nilai sentinel. Tetapi saya akan menangguhkan kepada komen-komen untuk mengapa dan maka kita menggunakan sepupu ini scanf dipanggil sscanf dan ternyata yang scanf sscanf, atau tali, membolehkan anda mengambil lihat pada baris yang pengguna itu telah ditaip dan membiarkan anda menganalisis ia pada dasarnya dan apa yang saya lakukan di sini saya memberitahu sscanf, menganalisis apa sahaja pengguna mempunyai ditaip dan memastikan% i, terdapat integer di dalamnya, dan kita tidak akan masuk ke dalam hari ini dengan tepat mengapa ada juga c% di sini, tetapi itu secara ringkas membolehkan kami mengesan jika pengguna telah ditaip dalam sesuatu yang palsu selepas nombor. Jadi sebab yang GetInt dan GetString memberitahu anda untuk mencuba semula, cuba semula, cuba semula adalah kerana semua bahawa kod kami telah menulis, ia adalah jenis melihat input pengguna dalam memastikan ia sepenuhnya angka atau ia adalah satu terapung sebenar nilai mata atau sebagainya, bergantung kepada apa nilai berfungsi yang anda gunakan. Huh. OKAY. Mereka itu adalah satu hal yg tetapi penting di sini adalah bahawa sebab kami terpaksa mereka roda latihan adalah kerana pada tahap yang paling rendah, terdapat hanya begitu banyak perkara yang boleh salah yang kita mahu untuk preemptively mengendalikan perkara-perkara yang pasti di minggu terawal kelas, tetapi kini dengan Serangga empat dan lima dan Serangga di luar anda akan melihat bahawa ia lebih kepada anda tetapi juga anda akan lebih mampu menyelesaikan orang-orang jenis masalah diri sendiri. Sebarang pertanyaan mengenai GetString atau GetInt? Ya? PENONTON: Bagaimana kamu akan menggandakan kapasiti penimbal bukan hanya meningkatkan oleh jumlah sebenar? DAVID MALAN: Soalan yang baik. Mengapa kita akan menggandakan kapasiti penimbal yang bertentangan hanya meningkatkannya oleh beberapa nilai malar? Ia merupakan satu keputusan reka bentuk. Kami hanya membuat keputusan itu kerana ia cenderung untuk menjadi sedikit mahal masa-bijak untuk bertanya sistem operasi untuk ingatan, kita tidak mahu berakhir masuk ke kerja kerana tali besar bahawa kita telah meminta OS lagi dan lagi dan sekali lagi dan sekali lagi pada masa yang singkat untuk ingatan. Oleh itu, kita hanya membuat keputusan, agak sewenang-wenangnya tetapi kami berharap munasabah, itu, anda tahu apa, mari kita cuba untuk mendapatkan lebih awal daripada diri kita sendiri dan hanya menyimpan dua kali ganda ia supaya kita mengurangkan jumlah kali kita perlu memanggil malloc atau realloc, tetapi jumlah penghakiman panggilan jika tiada mengetahui apa yang pengguna mungkin mahu menaip. Kedua-dua cara boleh dipertikaikan. Boleh dikatakan baik. Oleh itu, mari kita lihat pada pasangan kesan sampingan lain ingatan, perkara-perkara yang boleh pergi salah dan alat-alat yang anda boleh gunakan untuk menangkap jenis-jenis kesilapan. Ia ternyata anda semua, walaupun check50 tidak memberitahu anda sebanyak, telah menulis kereta Kod sejak minggu satu, walaupun semua ujian check50 adalah berlalu, dan walaupun anda dan TF anda super yakin kod anda berfungsi seperti yang sepatutnya. Kod anda telah kereta atau boleh dipercayai sama sekali kerana anda semua, dalam menggunakan perpustakaan CS50, telah bocor ingatan. Anda telah meminta sistem operasi untuk ingatan dalam kebanyakan program anda tulis, tetapi anda telah sebenarnya tidak pernah diberikan kembali. Anda dipanggil GetString dan GetInt dan GetFloat, tetapi dengan GetString, anda telah pernah dipanggil unGetString atau Berikan String Belakang atau sebagainya, tetapi kami telah lihat yang GetString tidak memperuntukkan memori dengan cara malloc atau ini fungsi realloc, yang hanya hampir sama di hadapan Allah, dan lagi, kita telah meminta sistem operasi untuk memori dan memori lagi dan lagi tetapi tidak pernah memberikan kembali. Sekarang, sebagai diketepikan, ternyata bahawa apabila suatu program berhenti, kesemua memori yang secara automatik dibebaskan. Jadi ia tidak perjanjian yang besar. Ia tidak akan memecahkan IDE atau benda perlahan ke bawah, tetapi apabila program melakukan umumnya kebocoran memori dan mereka berjalan untuk masa yang lama. Jika anda pernah melihat sedikit bodoh bola pantai dalam Mac OS atau hourglass pada Windows di mana ia adalah jenis memperlahankan atau berfikir atau pemikiran atau hanya benar-benar mula perlahan merangkak, sangat mungkin boleh menjadi hasil daripada kebocoran memori. Pengaturcara yang menulis perisian yang anda gunakan meminta sistem operasi untuk ingatan setiap beberapa minit, setiap jam. Tetapi jika anda menjalankan perisian, walaupun ia dikurangkan dalam komputer anda berjam-jam atau hari pada akhir, anda mungkin akan meminta lebih dan lebih memori dan tidak pernah benar-benar menggunakannya dan sebagainya kod anda mungkin, atau program mungkin bocor memori, dan jika anda mula bocor memori, ada ingatan kurang untuk program lain, dan kesan ini adalah untuk memperlahankan semua turun. Sekarang, ini adalah setakat ini salah satu program yang paling kejam anda akan mempunyai peluang berjalan di CS50 setakat sebagai output adalah lebih esoterik daripada yang dilafaz atau membuat atau mana-mana arahan program talian kami telah berjalan sebelum ini tetapi bersyukur, tertanam dalam output adalah beberapa tips yang berguna yang super akan berguna sama ada untuk pset empat atau pasti Serangga lima. Jadi valgrind adalah alat yang yang boleh digunakan untuk melihat kebocoran memori dalam program anda. Ia agak mudah untuk menjalankan. Anda menjalankan valgrind dan kemudian, walaupun walaupun ia adalah satu lantung sedikit, dash dash kebocoran daftar sama penuh, dan kemudian dot mengurangkan dan nama program anda. Jadi valgrind akan menjalankan program anda dan bagi mereka yang terkemudian program anda berjalan sebelum ia berhenti dan memberikan anda satu lagi segera, ia akan menganalisis anda program semasa ia telah berjalan dan memberitahu anda adakah anda bocor apa-apa memori dan lebih baik lagi, adakah anda menyentuh memori yang bukan milik anda? Ia tidak boleh menangkap segala-galanya, tetapi ia cukup baik menangkap perkara yang paling. Jadi di sini adalah satu contoh yang mempunyai jangka saya program ini, mempunyai jangka valgrind, pada program yang dikenali sebagai ingatan, dan saya akan untuk menyerlahkan garisan yang akhirnya menarik kepada kami. Jadi ada lebih gangguan bahawa saya telah dipadamkan dari slaid. Tetapi mari kita lihat apa ini program mampu memberitahu kita. Ia mampu memberitahu kita perkara-perkara seperti menulis tidak sah saiz 4. Dalam erti kata lain, jika anda menyentuh memori, khusus 4 bait memori bahawa anda tidak perlu mempunyai, valgrind boleh memberitahu anda bahawa. Menulis tak sah saiz 4. Anda menyentuh empat bait bahawa anda tidak perlu mempunyai. Dari mana kamu berbuat demikian? Ini adalah keindahan. Memori dot c line 21 adalah di mana anda kacau dan itulah mengapa ia membantu. Sama seperti GDB, ia boleh membantu menunjukkan anda di ralat sebenar. Sekarang, yang satu ini adalah lebih sedikit banyak cakap, jika tidak mengelirukan. 40 bait dalam 1 blok pasti hilang dalam kehilangan rekod 1 daripada 1. Apa maksudnya? Nah, itu hanya bermakna anda meminta 40 bait dan pernah bapa memberikan kembali. Anda dipanggil malloc atau anda dipanggil GetString dan sistem operasi memberikan anda 40 bait, tetapi anda tidak pernah dibebaskan atau dilepaskan memori, dan untuk berlaku adil, kita tidak pernah menunjukkan anda bagaimana untuk mengembalikan ingatan. Rupa-rupanya ada yang super fungsi mudah dipanggil percuma. Mengambil satu hujah, perkara yang anda mahu untuk membebaskan atau memberikan kembali, tetapi 40 bait, nampaknya, dalam program ini telah hilang di garisan 20 memori dot c. Jadi mari kita lihat program ini. Ia sangat berguna. Ia hanya menunjukkan ini ralat tertentu. Jadi mari kita lihat. Berikut adalah utama dan utama, notis, panggilan fungsi yang dipanggil f dan kemudian pulangan. Jadi tidak semua yang menarik. Apakah f lakukan? Notis saya tidak mengganggu dengan prototaip. Saya mahu menyimpan kod di seperti yang minimum yang mungkin. Jadi saya meletakkan f di atas utama dan itu baik, sudah tentu, bagi program-program pendek seperti ini. Jadi f tidak kembali apa-apa dan tidak tidak mengambil apa-apa, tetapi ia melakukan ini. Ia menyatakan, sama seperti dalam contoh Binky ini, penunjuk dipanggil x yang akan untuk menyimpan alamat int. Jadi itulah yang sebelah kiri. Dalam bahasa Inggeris, apakah sebelah kanan buat? Sesiapa sahaja? Apakah ini lakukan untuk kita? Ya? PENONTON: [didengar] kali saiz int iaitu 10 kali ganda [didengar] DAVID MALAN: Baik dan biarlah saya ringkaskan. Jadi memperuntukkan ruang yang mencukupi untuk 10 integer atau 10, apa yang saiz int, ia empat bait, jadi 10 kali 4 adalah 40, supaya sebelah kanan bahawa saya telah diserlahkan adalah memberi saya 40 bait dan menyimpan alamat bait pertama ke x. Dan kini akhir sekali, dan di sini di mana program ini adalah kereta, apa yang salah dengan line 21 berdasarkan logik itu? Apa salahnya dengan line 21? Ya? PENONTON: Anda tidak boleh indeks ke x [didengar]. DAVID MALAN: Ya. Saya tidak perlu indeks ke x seperti itu. Jadi sintaksis, itu OK. Apa yang baik adalah, sama seperti anda boleh merawat nama array seolah-olah ia adalah penunjuk, begitu juga anda boleh merawat penunjuk seolah-olah ia pelbagai, dan saya boleh sintaksis kata x kurungan sesuatu, x kurungan i, tetapi 10 adalah bermasalah. Mengapa? PENONTON: Kerana ia bukan di dalam. DAVID MALAN: Ia bukan dalam bahawa sebahagian memori. Apakah nilai terbesar yang perlu saya dapat meletakkan dalam orang-orang kurungan persegi? 9, 0 hingga 9. Kerana pengindeksan sifar. Jadi 0 hingga 9 akan menjadi baik. Kurungan 10 tidak baik dan tetapi, ingat walaupun, setiap kali Saya seolah-olah cuba untuk membuat CS50 IDE kemalangan dengan menaip dalam nilai-nilai palsu, ia tidak sentiasa bekerjasama, dan sesungguhnya, anda sering mendapatkan bertuah hanya kerana sistem operasi tidak melihat bahawa anda pernah jadi sedikit lulus beberapa sebahagian memori, kerana anda menginap di dalam teknikal segmen anda, tetapi lebih kepada yang dalam kelas sistem operasi, dan sebagainya seperti ini dengan mudah dapat tanpa dikesan. Program anda tidak pernah akan kemalangan konsisten tetapi mungkin sekali dalam seketika. Dan jadi mari kita cuba valgrind mengenai perkara ini, dan di sini di mana kita akan mendapat terharu oleh output seketika. Oleh itu, ingatan valgrind kebocoran daftar sama dengan penuh memori dot mengurangkan. Dan di sini sebabnya saya berjanji ini akan meliputi. Berikut adalah apa yang valgrind, inilah yang seorang programmer, beberapa tahun ago- memutuskan ia akan menjadi satu idea yang baik untuk output kelihatan seperti. Jadi mari kita memahami ini. Jadi semua cara di tangan meninggalkan sampingan tanpa sebab yang baik adalah ID proses program kita hanya berjalan, pengecam unik untuk program ini kita hanya berlari. Kami dipadam bahawa dari slaid, tetapi ada adalah beberapa maklumat yang berguna di sini. Mari kita tatal ke atas ke bahagian paling atas. Berikut adalah di mana kita bermula. Jadi bukan semua output yang banyak. Berikut adalah yang menulis tidak sah saiz 4 di talian 21. Nah, apa yang line 21? Line 21 adalah betul-betul ini dan ia masuk akal bahawa saya dalam sah menulis 4 bait kerana saya cuba untuk meletakkan integer ini, yang boleh menjadi apa-apa, ia hanya berlaku untuk menjadi sifar, tetapi saya cuba untuk meletakkan ia di lokasi yang yang bukan milik kepada saya. Selain itu, turun di sini, 40 bait dalam salah satu blok pasti hilang dalam rekod 1. Ini kerana apabila saya memanggil malloc di sini, saya sebenarnya tidak pernah membebaskan memori. Jadi bagaimana kita boleh menetapkan ini? Biar saya pergi ke hadapan dan menjadi sedikit lebih selamat dan tidak terdapat 9 dan biarlah saya di sini percuma x. Ini adalah fungsi baru untuk hari ini. Jika saya kini memutarkan membuat memori dot slash, mari kita berjalan valgrind atas sekali lagi, memaksimumkan tingkap saya dan tekan Enter. Sekarang, ia adalah baik. Mereka mengebumikan berita baik dalam semua output ini. Semua blok timbunan bebas. Kita akan kembali kepada apa timbunan itu , tetapi tiada kebocoran yang mungkin. Jadi ini adalah hanya satu lagi alat untuk kit alat anda yang anda boleh mula mencari sekarang kesilapan seperti itu. Tetapi mari kita lihat apa banyak lagi yang boleh berlaku di sini. Mari kita peralihan sekarang untuk sebenarnya menyelesaikan masalah. Sebagai mengetepikan, jika ini akan melegakan sedikit sedikit kekeliruan atau ketegangan, ini kini lucu. Yeah. Yang cukup baik. Kerana petunjuk adalah alamat dan alamat secara umumnya oleh konvensyen ditulis dengan perenambelasan. Ha, ha, ini adalah lucu sekarang. Walau bagaimanapun, jadi mari kita kini sebenarnya menyelesaikan masalah. Ini telah menjadi super, super tahap rendah setakat ini, dan kita sebenarnya boleh lakukan berguna perkara dengan butir-butir peringkat rendah. Oleh itu, kita memperkenalkan beberapa minggu lalu tanggapan array. Pelbagai Bagus kerana ia sukar untuk membersihkan kod kami kerana jika kita mahu menulis program dengan pelbagai pelajar atau pelbagai nama-nama dan rumah-rumah dan asrama dan kolej dan semua itu, kita boleh menyimpan segala-galanya lebih bersih di dalam array. Tetapi mencadangkan satu halangan array setakat ini. Walaupun anda tidak mengalami sendiri dalam program, hanya naluri, apa yang perkara yang tidak baik tentang pelbagai, mungkin? Saya mendengar beberapa murmurs. PENONTON: Sukar untuk menukar saiz. DAVID MALAN: Sukar untuk menukar saiz. Anda tidak boleh mengubah saiz array, sebenarnya, per se dalam C. Anda boleh memperuntukkan pelbagai lain, bergerak segala-galanya daripada yang lama ke dalam baru, dan kini mempunyai sedikit ruang tambahan, tetapi ia tidak seperti yang bahasa seperti Java atau Python atau mana-mana nombor lain bahasa dengan yang ada di antara kamu mungkin biasa di mana anda hanya boleh menyimpan menambah perkara-perkara sampai membosankan ke akhir array. Apabila anda mempunyai pelbagai saiz 6, iaitu saiz, dan begitu banyak seperti idea yang lebih awal mempunyai penampan saiz yang tertentu, anda perlu meneka keluar dari pintu apa saiz yang anda mahu ia menjadi? Jika anda rasa terlalu besar, anda membuang ruang. Jika anda rasa terlalu kecil, anda tidak boleh menyimpan data itu, sekurang-kurangnya tanpa banyak kerja lagi. Jadi hari ini, terima kasih kepada petunjuk, kita boleh mula menjahit bersama-sama adat kita sendiri struktur data, dan dalam Malah, di sini adalah sesuatu yang yang kelihatan lebih sedikit samar pada pandangan pertama, tetapi ini adalah apa yang kita akan memanggil dikaitkan senarai, dan jenis namanya daripada meringkaskan ia. Ia adalah satu senarai nombor, atau dalam kes ini, senarai nombor, tetapi ia boleh menjadi satu senarai apa-apa, tetapi ia dikaitkan bersama-sama dengan cara anak panah, dan hanya mengambil tekaan dengan apa teknik kita akan dapat untuk menjahit bersama-sama, jenis seperti popcorn dengan benang, berpaut senarai segi empat tepat di sini? Jumlahnya? Apakah ciri-ciri bahasa yang mendasari? PENONTON: penunjuk A. DAVID MALAN: penunjuk A. Jadi setiap anak panah ini di sini mewakili penunjuk atau hanya alamat. Jadi dalam erti kata lain, jika saya mahu untuk menyimpan senarai nombor, Saya tidak boleh hanya menyimpannya jika saya mahu keupayaan untuk berkembang dan mengecut struktur data saya dalam array. Jadi saya perlu mempunyai sedikit kecanggihan lanjut, tetapi notis bahawa ini gambar jenis mencadangkan bahawa jika anda baru sahaja mendapat benang kecil menghubungkan semua bersama-sama, mungkin tidak begitu sukar untuk membuat ruang di antara dua daripada segi empat tepat atau dua daripada nod, seperti yang kita akan mula memanggil mereka, dimasukkan ke dalam nod baru, dan kemudian dengan beberapa thread baru, hanya parit tiga nod bersama-sama, yang pertama, yang terakhir, dan yang bahawa anda hanya dimasukkan ke dalam tengah-tengah. Dan sesungguhnya senarai berkaitan, tidak seperti pelbagai, adalah dinamik. Ia boleh membesar dan ia boleh mengecut dan anda tidak perlu tahu atau mengambil berat terlebih dahulu bagaimana data banyak yang anda akan dapat menyimpan, tetapi ternyata kita perlu menjadi sedikit berhati-hati tentang bagaimana untuk melaksanakan ini. Jadi pertama mari kita fikirkan bagaimana kita melaksanakan salah satu segi empat tepat sedikit. Ia mudah untuk melaksanakan int. Anda hanya berkata int n dan kemudian anda mendapat 4 bait untuk int, tetapi bagaimana saya boleh mendapatkan int, memanggilnya n, dan kemudian penunjuk, mari kita memanggilnya datang. Kita boleh memanggil ini apa-apa perkara yang kita mahu tetapi saya memerlukan struktur data adat. Ya? PENONTON: Ampersand [didengar]. DAVID MALAN: Jadi Ampersand kita akan gunakan untuk mendapatkan alamat nod yang berpotensi. Tetapi kita perlu satu lagi ciri C untuk untuk memberikan saya keupayaan untuk mewujudkan ini rectangle adat, adat ini berubah-ubah jika anda akan, dalam ingatan. PENONTON: struct A. DAVID MALAN: struct A. Ingat dari minggu lepas, kami telah memperkenalkan struct, kata kunci ini agak mudah yang membolehkan kita membuat perkara seperti ini. C tidak datang dengan data yang struktur yang dikenali sebagai pelajar. Ia datang dengan int dan terapung dan char dan itu, tetapi ia tidak datang dengan pelajar, tetapi kita boleh mewujudkan satu jenis data pelajar, struktur pelajar, dengan sintaks ini di sini. Dan anda akan melihat ini lagi dan lagi. Jadi jangan bimbang tentang menghafal kata kunci, tetapi kata kunci yang penting adalah hanya hakikat bahawa kita berkata struct dan kemudian kita memanggilnya pelajar dan di dalam pelajar adalah nama dan rumah atau asrama atau sebagainya. Dan sehingga kini hari ini, mari kita mencadangkan ini. Saya telah menambah beberapa perkataan, tetapi jika saya mahu untuk melaksanakan ini segi empat tepat itu mendapat kedua-dua int dan penunjuk, anda tahu apa, saya akan mengisytiharkan struct yang dikenali sebagai nod. Saya juga, di dalam itu, akan berkata bahawa nod, segi empat tepat ini, mempunyai int dan kami akan memanggilnya n dan ia mempunyai penunjuk yang akan datang. Dan ini adalah sedikit berjela-jela, tetapi jika anda berfikir tentang hal itu, anak panah yang ada di gambar sebentar tadi adalah daripada jenis data? Di mana setiap orang-orang anak panah menunjuk jenis struktur data apa? Ia tidak menunjuk hanya untuk int per se. Ia menunjuk kepada Perkara yang segi empat tepat keseluruhan dan bahawa benda segi empat tepat, kita kata, dipanggil nod. Dan supaya kita jenis perlu rekursif mentakrifkan ini seperti bahawa nod, kita akan berkata, akan mengandungi int dipanggil n dan penunjuk yang dipanggil depan dan jenis struktur data kepada yang titik penunjuk nampaknya akan menjadi struct nod. Jadi ini adalah annoyingly lantung dan hanya untuk bengah, sebab mengapa kita tidak boleh hanya mengatakan ini, yang terus-terang kelihatan banyak yang lebih mudah dibaca, kerana ingat bahawa C membaca perkara yang atas ke bawah, kiri ke kanan. Ia bukan sehingga kita sampai koma bertitik nod kata kunci benar-benar wujud. Jadi, jika kita ingin mempunyai seperti ini rujukan kitaran dalam data struktur, yang perlu kita lakukan ini, di mana kita katakan struct nod di bahagian atas, yang memberikan kita cara yang lebih lama untuk menggambarkan ini perkara, maka di dalam kita katakan struct nod, dan kemudian pada garis yang terakhir kita katakan, semua hak, C, dengan cara itu, hanya memanggil sialan ini keseluruhan Perkara nod dan berhenti menggunakan kata kunci struct sama sekali. Jadi ini adalah hanya jenis yang sintaktik silap mata yang akhirnya membolehkan kami mereka sesuatu yang kelihatan betul-betul seperti ini. Jadi, jika kita menganggap sekarang kita boleh melaksanakan perkara ini dalam C, bagaimana kita benar-benar mula menyeberangi ini? Well, sebenarnya, apa yang harus kita lakukan adalah melelar dari kiri ke kanan dan hanya sejenis memasukkan nod atau memadam nod atau mencari untuk perkara-perkara di mana sahaja yang kita mahu, tetapi untuk melakukan ini, mari kita pergi ke depan dan membuat perkara yang sedikit lebih nyata kerana ini telah sangat rendah peringkat setakat ini. Adakah sesiapa yang benar-benar suka untuk menjadi yang pertama? OKAY. Naiklah. Siapa nama anda? DAVID: David. DAVID MALAN: Daud. Gembira Mengenali Anda. Saya juga. Baiklah. Dan kita perlu beberapa 9. Tidak sebaik pertama, mungkin. OK, nombor 9. Sebilangan 17, sila. Biar saya pergi ke belakang sedikit lebih jauh. Number 22, sila, dan bagaimana pula lebih jauh ke belakang jika saya boleh melihat apa-apa tangan dengan semua cahaya atau tidak. Seseorang yang sedang menawarkan diri di sana. Adakah anda ingin datang? Lengan anda secara paksa naik. OK, 17. 22. 26 akan datang ke bawah. Adakah orang lain suka forcefully-- Naiklah. Seorang sukarelawan yang sebenar. Jadi dengan cepat, jika anda semua boleh menguruskan kamu hanya suka nod pada skrin. Terima kasih. Dan anda akan menjadi 26. Semua pengenalan tepat dan cepat. Jadi saya Daud dan anda juga? DAVID: David. DAVID MALAN: Dan anda? JAKE: Jake. SUE: Sue. ALEX: Alex. RAPHAEL: Raphael. TAYLOR: Taylor. DAVID MALAN: Taylor. Sangat baik. Jadi ini adalah sukarelawan kami untuk hari ini dan pergi ke depan dan beralih cara yang sedikit, dan hanya pergi ke depan dan memegang nombor anda kerana anda atau anda Tanda pertama dan menggunakan tangan kiri anda, pergi ke depan dan hanya melaksanakan anak panah ini, hanya supaya tangan kiri anda adalah benar-benar menunjuk pada apa sahaja yang anda perlu menunjukkan di, dan memberi diri anda sedikit ruang supaya kita visual boleh melihat senjata anda sebenarnya menunjuk, dan anda hanya boleh menunjukkan semacam di tanah adalah baik. Jadi di sini kita mempunyai senarai yang dikaitkan satu, dua, tiga, empat, lima nod pada mulanya, dan perhatikan kita mempunyai khas penunjuk pada awal siapa yang utama kerana kita perlu menjejaki senarai panjang keseluruhan entah bagaimana. Lelaki-lelaki ini, walaupun mereka ditinggalkan ke kanan, kembali ke belakang dalam ingatan, mereka sebenarnya boleh berada di mana sahaja dalam ingatan komputer. Jadi lelaki ini boleh menjadi berdiri di mana-mana peringkat dan itulah denda, selagi mereka sebenarnya menghala ke arah satu sama lain, tetapi untuk menjaga perkara-perkara bersih dan mudah, kita akan hanya menarik mereka kiri ke kanan seperti ini, tetapi mungkin ada jurang besar-besaran di antara mereka nod. Sekarang, jika saya mahu sebenarnya memasukkan beberapa nilai baru, mari kita pergi ke depan dan melakukan ini. Ada kesempatan bagi kita sekarang untuk memilih nod yang lain. Katakanlah mari kita mulakan dengan mallocing 55. Adakah seseorang keberatan malloc? OK, datang ke atas. Siapa nama anda? RAINBOW: Rainbow. DAVID MALAN: Rainbow? Baiklah. Malloc Rainbow. Naiklah. Jadi sekarang kita perlu bertanya kepada diri kita sendiri algorithmically mana kita boleh meletakkan 55. Jadi kita semua tahu, jelas, di mana dia mungkin tergolong jika kita cuba untuk menjaga ini disusun dan jika anda semua boleh mengambil satu langkah ke belakang supaya kita tidak jatuh peringkat, yang akan menjadi besar. Jadi sebenarnya, Rainbow, mula di sini dengan saya, kerana kita sebagai komputer kini boleh hanya melihat satu pembolehubah pada satu masa. Jadi, jika ini adalah nod pertama. Perhatikan dia tidak nod, dia hanya penunjuk, dan sebab itu dia tertarik untuk menjadi hanya saiz penunjuk, tidak salah satu segi empat tepat sepenuhnya. Jadi, kita akan untuk memeriksa pada setiap lelaran adalah 55 kurang daripada 9? No. 55 kurang daripada 17? No. Kurang daripada 22? Kurang daripada 26? Kurang daripada 34? Dan sehingga kini, jelas Rainbow tergolong pada akhir. Jadi untuk menjadi jelas, dan apa yang adalah nama, Taylor? TAYLOR: Taylor. DAVID MALAN: Jadi antara Taylor tangan kiri dan tangan Rainbow di sini, tangan yang perlu tunjuk pada apa yang dalam memerintahkan untuk memasukkan 55 ke dalam senarai ini? Apa yang perlu kita lakukan? Ya? PENONTON: tangan Taylor perlu menunjukkan kiri. DAVID MALAN: Tepat sekali. Jadi memasukkan nod ke akhir senarai ini agak mudah kerana Taylor hanya mempunyai ke titik, bukan di tanah atau kita akan memanggilnya null, null adalah jenis ketiadaan daripada penunjuk atau khas penunjuk sifar, anda berada akan menunjukkan dengan kiri anda tangan di Rainbow dan kemudian Rainbow, di mana sepatutnya kiri anda tangan mungkin menunjukkan? Down. Ia tidak baik jika tangannya adalah jenis menunjuk off sini atau jenis apa-apa yang cara. Yang akan dianggap nilai sampah, tetapi jika dia menunjuk ke beberapa nilai yang diketahui, kita akan memanggilnya sifar atau batal, itu OK kerana kita mempunyai istilah dalam ini dan kita tahu senarai sekarang selesai. Jadi apa lagi kes yang agak mudah? Bolehkah kita malloc 5? Naiklah. Siapa nama anda? TIFFANY: Tiffany. DAVID MALAN: Saya minta maaf? TIFFANY: Tiffany. DAVID MALAN: Tiffany. Baiklah. Tiffany telah malloced dengan nilai 5. Naiklah. Yang ini agak mudah juga, tetapi mari kita mempertimbangkan perintah operasi sekarang. Ia agak mudah dengan Taylor pada akhir. Nombor 5 adalah kursus kurang daripada 9, dan dengan itu kita mempunyai David, kami mempunyai Tiffany, dan apa yang Engkau? JAKE: Jake. DAVID MALAN: Jake. Tiffany, Jake, dan Daud. Yang tangan perlu dikemaskini pertama? Apa yang anda mahu lakukan di sini? Ada beberapa kemungkinan cara, tetapi ada juga satu atau cara yang lebih salah. PENONTON: Mulakan dengan paling kiri. DAVID MALAN: Mulakan dengan paling kiri itu. Siapa paling kiri di sini ketika itu? PENONTON: Pertama. DAVID MALAN: OK. Jadi bermula dengan pertama dan di manakah anda mahu untuk mengemaskini tangan Daud untuk menjadi? PENONTON: Menjelang 5. DAVID MALAN: OK. Maka Daud dan titik pada lima atau Tiffany di sini, dan sekarang? PENONTON: Tiffany mata kepada 9? DAVID MALAN: Perfect, kecuali yang Binky kepala hanya jenis jatuh, bukan? Oleh kerana apa yang salah dengan gambar ini betul-betul? PENONTON: Tiada apa-apa menunjuk. DAVID MALAN: Tidak ada yang menunjuk kepada Jake sekarang. Kami benar-benar yatim 9 dan 17, dan kami telah benar-benar bocor kesemua memori ini, kerana dengan mengemaskini tangan Daud pertama, itu denda sejauh mana ia betul menghala ke arah Tiffany sekarang, tetapi jika tiada siapa yang mempunyai pandangan jauh untuk menunjukkan pada Jake, maka kita telah kehilangan keseluruhan daripada senarai itu. Jadi mari kita batal. Jadi itu adalah satu perkara yang baik untuk tersandung tetapi mari kita betulkan sekarang. Apa yang patut kita lakukan dahulu bukan? Ya? PENONTON: Tiffany perlu menunjukkan di 9? DAVID MALAN: saya tidak boleh mendapatkan yang rapat dengan anda. Siapa yang patut tunjuk pada 9? PENONTON: Tiffany. DAVID MALAN: Baiklah. Jadi Tiffany sepatutnya mata pertama pada 9. Jadi Tiffany perlu mengambil pada nilai yang sama kepada Daud, yang seolah-olah berlebihan untuk seketika, tetapi itulah denda kerana sekarang, kedua langkah, kita boleh mengemas kini tangan Daud untuk menunjukkan pada Tiffany, dan kemudian jika kita hanya jenis perkara sehingga bersih seolah-olah ini adalah jenis seperti musim bunga, kini itulah sisipan yang betul. Jadi sangat baik. Jadi sekarang kita sudah hampir. Mari kita memasukkan satu akhir nilai seperti nilai 20. Jika kita boleh malloc satu sukarelawan akhir? Naiklah. Jadi yang satu ini sedikit lebih rumit. Tetapi benar-benar, kod kami menulis, walaupun secara lisan, hanya seperti mempunyai sekumpulan daripada jika keadaan sekarang, bukan? Kami mempunyai keadaan memeriksa jika ia tergolong pada akhirnya, mungkin permulaan. Kita perlu beberapa jenis gelung untuk mencari tempat di bahagian tengah. Jadi mari kita buat itu dengan apa nama anda? ERIC: Eric. DAVID MALAN: Eric? Eric. Gembira Mengenali Anda. Oleh itu, kita mempunyai 20. Kurang daripada lima? No. Kurang daripada sembilan? No. Kurang daripada 17? No. OKAY. Dia tergolong di sini dan nama anda lagi berada? SUE: Sue. DAVID MALAN: Sue. ALEX: Alex. DAVID MALAN: Sue, Alex, dan? ERIC: Eric. DAVID MALAN: Eric. Yang tangan perlu mendapatkan dikemaskini pertama? PENONTON: Eric. OKAY. Jadi Eric perlu menunjukkan di mana? Pada 22. Yang baik. Dan sekarang apa yang akan datang? Sue kemudiannya boleh tunjuk pada Eric dan kini, jika anda semua hanya membuat beberapa bilik, yang adalah baik visual, sekarang kita telah melakukan pemasukan. Jadi mari kita kini mempertimbangkan soalan tetapi terima kasih banyak untuk sukarelawan kami. Sangat baik dilakukan. Anda boleh menyimpan mereka, jika anda suka. Dan kita mempunyai hadiah perpisahan indah jika anda akan setiap ingin mengambil bola tekanan. Biar saya lulus ini ke bawah. Jadi apakah Fleet ini? Ini seolah-olah yang menakjubkan setakat yang kita ada sekarang diperkenalkan alternatif kepada array yang tidak terhad jadi kepada pelbagai beberapa saiz tetap. Mereka boleh berkembang secara dinamik. Tetapi banyak seperti yang kita lihat dalam beberapa minggu masa lalu, kita tidak mendapat apa-apa secara percuma, seperti pasti ada-off perdagangan di sini. Jadi dengan peningkatan sebanyak berpaut senarai, adalah dinamik ini? Keupayaan ini berkembang dan terus-terang, yang kita boleh lakukan padam dan kita boleh mengecut seperti yang diperlukan. Apa harga kita membayar? Dua kali ganda ruang yang banyak, pertama sekali. Jika anda melihat gambar, tidak lagi aku menyimpan senarai integer. Saya menyimpan senarai integer serta petunjuk. Jadi, saya dua kali ganda jumlah ruang. Sekarang, mungkin itu bukan seperti masalah besar 4 bait, 8 bait, tetapi ia sudah tentu boleh menambah untuk set data yang besar. Apakah keburukan yang lain? Ya? PENONTON: Kita perlu merentasi mereka satu demi satu. DAVID MALAN: Ya. Kami perlu merentasi mereka satu demi satu. Anda tahu apa, kita berputus asa super ini ciri mudah untuk kurungan persegi notasi, lebih tepat dikenali sebagai capaian rawak, di mana kita hanya boleh melompat kepada elemen individu tetapi kini jika saya masih mempunyai sukarelawan saya di sini, jika saya mahu mencari nombor 22, saya tidak boleh hanya melompat ke kurungan sesuatu sesuatu. Saya perlu melihat ke atas senarai, banyak seperti contoh pencarian kami linear, untuk mencari bilangan 22. Oleh itu, kita seolah-olah telah membayar harga yang di sana. Tetapi kita boleh tetap menyelesaikan masalah-masalah lain. Malah, izinkan saya memperkenalkan hanya beberapa visual. Jadi, jika anda telah turun ke Dewan Makan Mather baru-baru ini, anda akan ingat bahawa mereka susunan dulang seperti ini, kita meminjam ini dari Annenberg sebelum kelas. Jadi timbunan ini dulang, walaupun, adalah wakil sebenarnya struktur data sains komputer. Terdapat struktur data dalam bidang sains komputer dikenali sebagai timbunan yang sangat baik ruang untuk betul-betul ini dengar. Jadi, jika setiap dulang ini bukan dulang tetapi seperti nombor dan saya mahu untuk menyimpan nombor, saya boleh meletakkan satu turun di sini, dan saya boleh meletakkan satu lagi turun di sini, dan terus menyusun nombor di atas satu sama lain, dan apa yang berpotensi berguna mengenai ini adalah bahawa apa yang implikasi struktur data ini? Yang nombor boleh saya tarik keluar pertama yang paling mudah? Yang paling baru-baru ini meletakkan di sana. Jadi ini adalah apa yang kita akan memanggil komputer sains struktur data LIFO. Bertahan dalam, dahulu. Dan kita akan melihat tidak lama mengapa yang mungkin berguna tetapi untuk sekarang, hanya menganggap tetamu. Dan ia jenis bodoh jika anda berfikir tentang bagaimana dewan makan melakukannya. Setiap kali mereka dulang bersih dan meletakkan orang-orang yang paling segar di atas, anda boleh mempunyai yang dahulu bersih tetapi akhirnya sangat kotor dan berdebu dulang di bahagian paling bawah jika anda tidak pernah benar-benar sampai ke bahagian bawah itu timbunan, kerana anda hanya terus meletakkan yang baru dan orang-orang yang bersih di atasnya. Perkara yang sama mungkin berlaku di pasar raya juga. Jika anda mempunyai kes paparan susu dan setiap kali CVS atau sesiapa yang mendapat lebih banyak susu, anda hanya mendorong yang susu anda sudah mempunyai ke belakang dan anda meletakkan yang baru di depan, anda akan mempunyai beberapa cukup jahat susu pada akhir struktur data, kerana ia sentiasa di bahagian bawah atau setara ia sentiasa di belakang. Tetapi ada cara lain untuk berfikir tentang beratur data dan sebagai contoh, ini. Jika anda salah seorang dari orang-orang yang suka untuk beratur di luar kedai Apple apabila produk baru datang keluar, anda mungkin tidak menggunakan data timbunan struktur kerana anda akan merenggangkan orang lain yang beratur untuk membeli beberapa mainan baru. Sebaliknya, anda mungkin menggunakan apa jenis struktur data atau apa jenis sistem dalam dunia sebenar? Mudah-mudahan ia garis, atau lebih betul atau lebih British-suka, barisan. Dan ternyata barisan juga struktur data dalam bidang sains komputer, tetapi barisan yang mempunyai sangat harta yang berlainan. Ia bukan LIFO. Bertahan dalam, dahulu. Tuhan melarang. Ia bukannya FIFO. Masuk dahulu, keluar dahulu. Dan itu adalah satu perkara yang baik demi keadilan ' pasti apabila anda beratur sehingga hilang pada awal pagi. Jika anda sampai ke sana pertama, anda mahu keluar pertama juga. Dan supaya semua data ini struktur, barisan dan susunan dan tandan orang lain, ternyata anda boleh berfikir ini hanya sebagai array. Ini adalah pelbagai, mungkin saiz yang menetapkan 4, tetapi ia akan menjadi jenis baik jika kita hanya boleh terkumpul dulang hampir tak terhingga tinggi jika kita mempunyai bahawa dulang nombor atau banyak. Jadi mungkin kita mahu menggunakan senarai dikaitkan di sini, tetapi keseimbangan akan menjadi berpotensi bahawa kita perlu lebih banyak memori, mengambil masa yang lebih sedikit, tetapi kita tidak mengehadkan ketinggian timbunan, sama seperti paparan kes Mather mungkin membataskan saiz timbunan, dan sebagainya ini adalah keputusan reka bentuk atau pilihan ada pada kita akhirnya. Jadi dengan data ini struktur, kami telah mula melihat batas atas baru berpotensi kepada apa yang sebelum ini adalah super cepat dan di mana kita akan meninggalkan off hari ini dan di mana kami akan berharap untuk sampai ke adalah pada hari Rabu, kami akan mula melihat data yang struktur yang membolehkan kita mencari melalui data dalam masa akhir log lagi. Dan kita melihat bahawa, masih ingat, pada minggu sifar dan satu dengan carian binari atau membahagi dan menakluk. Ia datang kembali dan lebih baik lagi, kaedah berpotensi suci untuk Rabu ini adalah untuk datang dengan struktur data yang berjalan benar-benar atau secara teori dalam masa yang berterusan, di mana ia tidak kira berapa banyak berjuta-juta atau berbilion-bilion perkara kita ada dalam struktur data, ia akan membawa kita masa yang berterusan, mungkin satu langkah atau dua langkah atau 10 langkah, tetapi nombor yang berterusan daripada langkah-langkah untuk mencari melalui struktur data. Yang demikian itu ialah kaedah berpotensi suci tetapi lebih kepada yang pada hari Rabu. Lihat ya itu. [Bermain muzik]