1 00:00:00,000 --> 00:00:10,970 >> [Bermain muzik] 2 00:00:10,970 --> 00:00:12,536 >> DAVID J. MALAN: Baiklah. 3 00:00:12,536 --> 00:00:13,392 >> [Ketawa] 4 00:00:13,392 --> 00:00:14,240 >> Selamat kembali. 5 00:00:14,240 --> 00:00:14,990 Ini adalah CS50. 6 00:00:14,990 --> 00:00:16,890 Dan ini hujung minggu lima. 7 00:00:16,890 --> 00:00:20,020 Dan sehingga kini, kita telah cukup banyak telah mengambil untuk diberikan bahawa terdapat 8 00:00:20,020 --> 00:00:23,480 wujud pengkompil ini, dilafaz, bahawa anda telah telah memohon dengan cara ini 9 00:00:23,480 --> 00:00:27,100 alat lain yang dipanggil Buat yang entah bagaimana ajaib menukarkan kod sumber anda 10 00:00:27,100 --> 00:00:31,350 kepada kod objek, sifar dan orang-orang bahawa CPU komputer anda, pusat 11 00:00:31,350 --> 00:00:33,410 Unit pemprosesan, sebenarnya memahami. 12 00:00:33,410 --> 00:00:36,770 Tetapi ternyata ada satu nombor yang berlaku di bawah hood dalam 13 00:00:36,770 --> 00:00:38,690 antara input dan output. 14 00:00:38,690 --> 00:00:41,800 >> Dan saya ingin mencadangkan supaya kita daging yang keluar dalam terperinci sedikit lebih ke 15 00:00:41,800 --> 00:00:45,130 keempat-empat langkah, mempunyai sesuatu yang dinamakan pra-pemprosesan, sesuatu 16 00:00:45,130 --> 00:00:48,300 dipanggil penyusunan, yang telah kita lihat, sesuatu yang dinamakan memasang, dan 17 00:00:48,300 --> 00:00:49,420 sesuatu yang dinamakan menghubungkan. 18 00:00:49,420 --> 00:00:53,270 Jadi sehingga sekarang, di sesetengah program, kami telah tajam termasuk. 19 00:00:53,270 --> 00:00:56,650 Baru-baru ini kita telah mempunyai beberapa tajam mentakrifkan untuk pemalar. 20 00:00:56,650 --> 00:01:00,660 Jadi ia ternyata bahawa perkara-perkara yang dimulakan dengan awalan simbol hash atau 21 00:01:00,660 --> 00:01:04,150 simbol pound adalah pra-pemproses arahan. 22 00:01:04,150 --> 00:01:07,960 Itu hanya satu cara yang mewah untuk mengatakan ia baris kod yang sebenarnya 23 00:01:07,960 --> 00:01:12,280 ditukar menjadi sesuatu yang lain sebelum komputer walaupun cuba untuk menukar anda 24 00:01:12,280 --> 00:01:13,800 program ke sifar dan orang-orang. 25 00:01:13,800 --> 00:01:19,000 >> Sebagai contoh, tajam termasuk standard I / O. H, cukup banyak hanya bermakna pergi 26 00:01:19,000 --> 00:01:24,010 hadapan, merebut kandungan fail stdio.h dan tampal di sana. 27 00:01:24,010 --> 00:01:25,880 Jadi tidak sifar dan orang-orang pada ketika itu lagi. 28 00:01:25,880 --> 00:01:27,470 Ia benar-benar hanya penggantian a. 29 00:01:27,470 --> 00:01:30,790 Dan itu dilakukan semasa yang dipanggil peringkat pra-pemprosesan, apabila anda 30 00:01:30,790 --> 00:01:34,230 sebenarnya dikendalikan dilafaz atau khusus Buat dalam kebanyakan kes. 31 00:01:34,230 --> 00:01:36,950 Jadi semua ini telah berlaku pertama secara automatik setakat ini. 32 00:01:36,950 --> 00:01:38,800 >> Kemudian datang langkah penyusunan. 33 00:01:38,800 --> 00:01:40,920 Tetapi kita telah terlalu dipermudahkan kompilasi. 34 00:01:40,920 --> 00:01:45,060 Menyusun program yang benar-benar bermaksud untuk mengambil dari sesuatu seperti C, 35 00:01:45,060 --> 00:01:48,430 kod sumber kita telah menulis, turun untuk sesuatu yang dinamakan perhimpunan. 36 00:01:48,430 --> 00:01:52,900 Bahasa himpunan adalah tahap yang lebih rendah bahasa itu, bersyukur, kita tidak akan 37 00:01:52,900 --> 00:01:55,480 mempunyai banyak kesempatan untuk menulis semester ini. 38 00:01:55,480 --> 00:01:59,100 Tetapi ia adalah pada tahap yang paling rendah dalam akal bahawa anda benar-benar mula menulis 39 00:01:59,100 --> 00:02:04,270 menambah dan tolak dan membiak dan beban dari memori dan simpan ke ingatan, 40 00:02:04,270 --> 00:02:08,259 arahan asas yang komputer, di bawah hud, 41 00:02:08,259 --> 00:02:09,639 sebenarnya memahami. 42 00:02:09,639 --> 00:02:14,930 >> Akhir sekali, pemasangan mengambil bahasa yang kepada sifar dan orang-orang yang kita telah 43 00:02:14,930 --> 00:02:16,190 menerangkan setakat ini. 44 00:02:16,190 --> 00:02:19,270 Dan benar-benar akhir sekali, ada yang dipanggil menghubungkan fasa, yang kita akan 45 00:02:19,270 --> 00:02:22,360 lihat dalam hanya seketika, yang menggabungkan sifar dan orang-orang dengan sifar dan anda 46 00:02:22,360 --> 00:02:24,870 orang-orang yang orang lain sebelum anda buat. 47 00:02:24,870 --> 00:02:26,660 >> Jadi mempertimbangkan program ini mudah super. 48 00:02:26,660 --> 00:02:27,560 Ia adalah dari Minggu 1. 49 00:02:27,560 --> 00:02:29,610 Ia hanya berkata, Hello World, pada skrin. 50 00:02:29,610 --> 00:02:30,920 Kami berlari ini melalui dilafaz. 51 00:02:30,920 --> 00:02:33,200 Atau kita berlari melalui Buat yang berlari dilafaz. 52 00:02:33,200 --> 00:02:36,170 Dan outputted pada masa di mana beberapa sifar dan orang-orang. 53 00:02:36,170 --> 00:02:38,100 Tetapi ternyata ada satu langkah yang pertengahan. 54 00:02:38,100 --> 00:02:40,460 Jika saya pergi ke sini - oops, tidak mahu melihat dia lagi. 55 00:02:40,460 --> 00:02:44,800 Jika saya pergi ke sini untuk perkakas saya dan saya membuka hello.c, di sini 56 00:02:44,800 --> 00:02:46,160 adalah program yang sama. 57 00:02:46,160 --> 00:02:48,600 Dan apa yang saya akan lakukan dalam terminal saya tingkap di sini saya akan 58 00:02:48,600 --> 00:02:51,430 menjalankan dilafaz bukannya Buat, yang mengautomasikan kesemua empat 59 00:02:51,430 --> 00:02:52,870 langkah-langkah untuk kita. 60 00:02:52,870 --> 00:02:58,620 Dan saya akan lakukan dilafaz-S dan maka hello.c dan kemudian masukkan. 61 00:02:58,620 --> 00:03:00,590 >> Dan saya mendapat segera berkelip sekali lagi, yang baik. 62 00:03:00,590 --> 00:03:05,280 Dan kini di tingkap yang sedikit lebih besar, Saya akan membuka gedit di sini. 63 00:03:05,280 --> 00:03:09,610 Dan saya akan membuka fail itu, ternyata, dipanggil hello.s ini 64 00:03:09,610 --> 00:03:11,870 yang mengandungi bahasa himpunan Saya disebut lebih awal. 65 00:03:11,870 --> 00:03:15,060 Dan ini adalah apa yang dipanggil perhimpunan bahasa, tahap yang agak rendah 66 00:03:15,060 --> 00:03:18,470 arahan yang CPU Intel anda atau apa sahaja yang ada di dalam 67 00:03:18,470 --> 00:03:19,350 memahami. 68 00:03:19,350 --> 00:03:24,480 Dan mov adalah untuk bergerak. panggilan adalah untuk memanggil, fungsi tahap yang sangat rendah. 69 00:03:24,480 --> 00:03:26,380 sub adalah untuk tolak. 70 00:03:26,380 --> 00:03:30,370 >> Oleh itu, apabila anda mempunyai CPU tertentu di dalam komputer anda, apa yang menjadikan ia 71 00:03:30,370 --> 00:03:34,300 berbeza, berbanding lain CPU pada pasaran, yang mana arahan yang 72 00:03:34,300 --> 00:03:39,460 memahami dan sering bagaimana cekap ia , bagaimana pantas ia adalah pada melaksanakan beberapa 73 00:03:39,460 --> 00:03:40,380 mereka arahan. 74 00:03:40,380 --> 00:03:45,150 Sekarang untuk lebih lanjut tentang ini, anda boleh mengambil CS61 Kejatuhan depan di kolej. 75 00:03:45,150 --> 00:03:48,170 Tetapi di sini kita ada, misalnya, beberapa pengenalan yang mungkin kelihatan biasa. 76 00:03:48,170 --> 00:03:50,150 hello.c adalah nama program. 77 00:03:50,150 --> 00:03:51,070 >> . Teks - 78 00:03:51,070 --> 00:03:54,190 tidak banyak faedah yang terdapat tadi, ingat bahawa teks 79 00:03:54,190 --> 00:03:59,190 segmen, pada hari Isnin, di mana dalam memori program anda benar-benar berakhir. 80 00:03:59,190 --> 00:04:01,330 Supaya sekurang-kurangnya samar-samar biasa di sana. 81 00:04:01,330 --> 00:04:03,730 Di sini, sudah tentu, adalah menyebut fungsi utama kami. 82 00:04:03,730 --> 00:04:07,220 Menatal ke bawah, ini merujuk kepada perkara-perkara daftar dipanggil, ketulan kecil 83 00:04:07,220 --> 00:04:09,190 dalam ingatan CPU sebenar anda. 84 00:04:09,190 --> 00:04:12,930 Dan jika saya tatal ke bawah walaupun lagi, saya melihat beberapa jenis 85 00:04:12,930 --> 00:04:14,240 sebutan tidak langsung ASCII. 86 00:04:14,240 --> 00:04:17,120 Dan di sana, sesungguhnya, adalah rentetan itu, hello, koma, dunia. 87 00:04:17,120 --> 00:04:20,079 >> Jadi cerita panjang pendek, ini telah berlaku untuk anda, secara automatik, 88 00:04:20,079 --> 00:04:22,140 di bawah hood semua masa ini. 89 00:04:22,140 --> 00:04:26,450 Dan apa yang telah berlaku benar-benar sekali anda menjalankan dilafaz, atau dengan cara 90 00:04:26,450 --> 00:04:29,150 Buat, anda mendapat pertama, dari kod sumber itu, 91 00:04:29,150 --> 00:04:30,700 yang dipanggil bahasa himpunan. 92 00:04:30,700 --> 00:04:35,210 Kemudian dilafaz adalah menukar perhimpunan ini bahasa ke sifar dan orang-orang. 93 00:04:35,210 --> 00:04:38,340 Dan ini adalah slaid yang kami mula perbincangan kami dalam Minggu 0 on - 94 00:04:38,340 --> 00:04:39,840 dan kemudian pada Minggu 1. 95 00:04:39,840 --> 00:04:44,030 Dan akhirnya, orang-orang sifar dan orang-orang digabungkan dengan sifar dan orang-orang 96 00:04:44,030 --> 00:04:47,190 dari orang-orang perpustakaan kita telah mengambil untuk diberikan seperti Standard I / O atau 97 00:04:47,190 --> 00:04:50,010 Perpustakaan tali atau perpustakaan CS50. 98 00:04:50,010 --> 00:04:54,200 >> Jadi untuk gambaran yang lebih visual, kita mempunyai hello.c. 99 00:04:54,200 --> 00:04:57,220 Dan, sudah tentu, menggunakan printf berfungsi untuk mengatakan, hello dunia. 100 00:04:57,220 --> 00:05:01,810 Langkah penyusunan mengambil ia ke fail kita hanya melihat hello.s, walaupun 101 00:05:01,810 --> 00:05:04,290 walaupun itu biasanya dipadam automatik untuk anda. 102 00:05:04,290 --> 00:05:06,050 Tetapi itulah kod pemasangan dalam langkah pertengahan. 103 00:05:06,050 --> 00:05:09,750 Dan kemudian apabila kita memasang pemasangan bahasa, jadi untuk bercakap, itu apabila anda 104 00:05:09,750 --> 00:05:10,830 mendapatkan orang-orang sifar dan orang-orang. 105 00:05:10,830 --> 00:05:13,920 Jadi kita telah dizum dalam berkesan pada hari ini apa yang kita telah mengambil untuk diberikan, 106 00:05:13,920 --> 00:05:16,430 bermakna akan kod sumber untuk membantah kod. 107 00:05:16,430 --> 00:05:18,850 >> Tetapi akhirnya, sekarang gambar yang sama - mari kita mendorong ia ke 108 00:05:18,850 --> 00:05:20,020 sebelah kiri. 109 00:05:20,020 --> 00:05:22,880 Dan ambil perhatian bahawa di atas sana Saya nyatakan stdio.h. 110 00:05:22,880 --> 00:05:25,030 Itulah fail yang kita telah dimasukkan dalam hampir semua 111 00:05:25,030 --> 00:05:26,250 program-program yang kita tulis. 112 00:05:26,250 --> 00:05:28,830 Dan itulah fail yang kandungannya mendapatkan salinan ditampal, 113 00:05:28,830 --> 00:05:30,350 berkesan di atas kod anda. 114 00:05:30,350 --> 00:05:34,170 Tetapi ternyata bahawa, pada komputer sistem di tempat, ada yang mungkin 115 00:05:34,170 --> 00:05:39,150 file stdio.c bahawa seseorang menulis tahun lalu yang melaksanakan semua 116 00:05:39,150 --> 00:05:41,870 fungsi-fungsi yang telah diisytiharkan dalam stdio.h. 117 00:05:41,870 --> 00:05:45,465 >> Sekarang dalam realiti, ia mungkin tidak pada Mac atau PC anda atau di 118 00:05:45,465 --> 00:05:47,660 CS50 perkakas adalah kod C mentah. 119 00:05:47,660 --> 00:05:52,710 Seseorang yang telah disusun dan dimasukkan . O fail kod objek atau a. 120 00:05:52,710 --> 00:05:56,020 fail, yang merujuk kepada perpustakaan yang dikongsi yang telah pra-dipasang dan 121 00:05:56,020 --> 00:05:57,240 pra-disusun untuk anda. 122 00:05:57,240 --> 00:06:01,950 Tetapi menganggap bahawa memang wujud pada stdio.c komputer kita selari 123 00:06:01,950 --> 00:06:02,650 dengan dilafaz. 124 00:06:02,650 --> 00:06:04,960 Kod anda yang sedang disusun dan dipasang. 125 00:06:04,960 --> 00:06:09,200 kod stdio.c 's sedang disusun dan dipasang, supaya ini yang terakhir 126 00:06:09,200 --> 00:06:13,730 langkah, turun di sini, kita perlu entah bagaimana link, jadi untuk bercakap, sifar dan orang 127 00:06:13,730 --> 00:06:18,430 dengan beliau sifar dan orang-orang ke dalam satu program mudah yang akhirnya adalah 128 00:06:18,430 --> 00:06:20,540 dipanggil hanya Hello. 129 00:06:20,540 --> 00:06:23,340 >> Jadi, itu semua sihir itu telah berlaku setakat ini. 130 00:06:23,340 --> 00:06:26,430 Dan akan terus mengambil langkah- proses untuk diberikan, tetapi menyedari 131 00:06:26,430 --> 00:06:28,750 terdapat banyak butir-butir berair berlaku di bawah sana. 132 00:06:28,750 --> 00:06:31,920 Dan ini adalah apa yang membuat anda komputer dengan Intel dalam 133 00:06:31,920 --> 00:06:33,940 terutamanya yang berbeza. 134 00:06:33,940 --> 00:06:37,020 >> Maka pada perhatian bahawa, jika anda ingin menyertai kami untuk makan tengah hari Jumaat ini, jangan pergi 135 00:06:37,020 --> 00:06:41,570 ke tempat cs50.net/rsvp biasa, 13:15 Jumaat ini. 136 00:06:41,570 --> 00:06:43,400 Dan kini pengumuman ini. 137 00:06:43,400 --> 00:06:44,670 Oleh itu, kita mempunyai beberapa berita baik. 138 00:06:44,670 --> 00:06:45,970 Dan kita mempunyai beberapa berita buruk. 139 00:06:45,970 --> 00:06:47,260 Mula dengan beberapa berita baik di sini. 140 00:06:47,260 --> 00:06:52,038 141 00:06:52,038 --> 00:06:54,510 >> [Rintihan] 142 00:06:54,510 --> 00:06:54,710 >> Baiklah. 143 00:06:54,710 --> 00:06:56,670 Nah, itu teknikal bercuti, jadi ia tidak begitu banyak hadiah daripada kami. 144 00:06:56,670 --> 00:06:58,030 Tetapi berita buruk sudah tentu. 145 00:06:58,030 --> 00:07:00,550 146 00:07:00,550 --> 00:07:01,880 >> [Rintihan] 147 00:07:01,880 --> 00:07:03,530 >> Saya menghabiskan banyak masa mengenai animasi. 148 00:07:03,530 --> 00:07:04,690 >> [Ketawa] 149 00:07:04,690 --> 00:07:07,000 >> Akan ada sesi kajian akan datang hari ini. 150 00:07:07,000 --> 00:07:08,340 Ia akan menjadi pada 5:30 PM. 151 00:07:08,340 --> 00:07:11,210 Kami akan mengingatkan anda semua perincian ini melalui e-mel pada kursus ini 152 00:07:11,210 --> 00:07:13,470 laman web dalam hanya beberapa hari lagi. 153 00:07:13,470 --> 00:07:16,610 Ia akan difilemkan dan disediakan sejurus selepas itu. 154 00:07:16,610 --> 00:07:19,200 Jadi, jika anda tidak boleh membuat bahawa Isnin slot malam, jangan bimbang. 155 00:07:19,200 --> 00:07:22,270 Seksyen minggu ini yang akan datang juga akan memberi tumpuan kepada ulasan kuiz. 156 00:07:22,270 --> 00:07:25,670 Jika bahagian anda adalah pada hari Isnin, yang merupakan sesungguhnya universiti bercuti, kita akan 157 00:07:25,670 --> 00:07:26,920 masih bertemu di bahagian. 158 00:07:26,920 --> 00:07:28,890 Jika anda tidak boleh membuat seksyen kerana anda akan 159 00:07:28,890 --> 00:07:29,860 jauh, itulah denda. 160 00:07:29,860 --> 00:07:33,710 Menghadiri hari Ahad atau Selasa atau seksyen lagu dalam seksyen Jason, yang merupakan 161 00:07:33,710 --> 00:07:35,110 didapati dalam talian. 162 00:07:35,110 --> 00:07:37,490 >> Jadi, lebih banyak berita buruk. 163 00:07:37,490 --> 00:07:41,960 Jadi, mengikut sukatan pelajaran, kita mempunyai kuliah Jumaat depan. 164 00:07:41,960 --> 00:07:43,690 Tetapi berita baik - 165 00:07:43,690 --> 00:07:44,860 jelas, saya menghabiskan masa yang terlalu banyak mengenai perkara ini. 166 00:07:44,860 --> 00:07:45,280 >> [Ketawa] 167 00:07:45,280 --> 00:07:47,140 >> Kami akan membatalkan seterusnya kuliah Jumaat. 168 00:07:47,140 --> 00:07:50,590 Jadi yang akan menjadi hadiah untuk kita, jadi anda benar-benar boleh mempunyai tempoh baik di 169 00:07:50,590 --> 00:07:52,990 antara minggu ini dan dua minggu itu. 170 00:07:52,990 --> 00:07:57,460 Jadi tidak ada kuliah minggu depan, hanya kecil kuiz sedikit, yang mana anda perlu 171 00:07:57,460 --> 00:07:59,030 mendapat semakin teruja. 172 00:07:59,030 --> 00:08:03,870 >> Jadi mari kita beralih pula perhatian kita kepada sesuatu yang memang lebih visual 173 00:08:03,870 --> 00:08:06,990 dan lebih menarik dan untuk menetapkan peringkat untuk apa yang akan menjadi di kaki langit 174 00:08:06,990 --> 00:08:08,420 dalam hanya beberapa minggu. 175 00:08:08,420 --> 00:08:12,160 Selepas kuiz yang pertama, kami akan menjadikan tumpuan set masalah kita yang lain 176 00:08:12,160 --> 00:08:16,710 masalah khusus domain, iaitu forensik atau keselamatan amnya. 177 00:08:16,710 --> 00:08:19,550 >> Malah, tradisi dengan masalah ini yang ditetapkan adalah bagi saya salah satu daripada 178 00:08:19,550 --> 00:08:24,850 rakan-rakan atau CA mengajar untuk berjalan di kampus mengambil gambar-gambar 179 00:08:24,850 --> 00:08:29,450 pasti tetapi bukan orang yang jelas, tempat, atau benda, maka setiap tahun saya 180 00:08:29,450 --> 00:08:34,520 entah bagaimana menguruskan untuk sengaja memadam atau merosakkan kad media digital 181 00:08:34,520 --> 00:08:35,720 yang ada di dalam kamera kami. 182 00:08:35,720 --> 00:08:36,860 Tetapi tidak ada masalah besar. 183 00:08:36,860 --> 00:08:39,200 Saya boleh pergi ke hadapan dan palam itu ke dalam komputer saya. 184 00:08:39,200 --> 00:08:43,010 Saya boleh membuat imej forensik, jadi untuk bercakap, dengan meniru sifar dan 185 00:08:43,010 --> 00:08:46,830 orang-orang yang kira bahawa kad memori, sama ada kad SD atau kad kilat padat atau 186 00:08:46,830 --> 00:08:48,100 apa sahaja yang anda sudah biasa dengan. 187 00:08:48,100 --> 00:08:49,300 Dan kemudian kita boleh tangan yang keluar. 188 00:08:49,300 --> 00:08:53,190 >> Dan sebagainya cabaran akan datang, antara lain perkara-perkara untuk anda, adalah untuk menulis 189 00:08:53,190 --> 00:08:58,630 Kod C yang pulih sejumlah besar JPEG untuk saya dan mendedahkan akan 190 00:08:58,630 --> 00:09:00,190 orang-orang, tempat, atau benda itu. 191 00:09:00,190 --> 00:09:03,340 Dan kita juga akan bercakap, dalam masalah ini ditetapkan dan pada hari-hari akan datang, kira-kira 192 00:09:03,340 --> 00:09:04,440 grafik amnya. 193 00:09:04,440 --> 00:09:06,140 Kami telah menggunakan mereka, kursus, untuk keluar. 194 00:09:06,140 --> 00:09:09,080 Tetapi anda jenis diambil untuk diberikan wujud ini tanggapan yang tinggi 195 00:09:09,080 --> 00:09:10,680 dari segi empat tepat dan bujur. 196 00:09:10,680 --> 00:09:12,450 Tetapi di bawah hood terdapat piksel. 197 00:09:12,450 --> 00:09:14,370 Dan anda terpaksa memulakan memikirkan tentang mereka. 198 00:09:14,370 --> 00:09:18,800 Atau anda akan untuk p-set 4 perlu berfikir kira-kira jurang antara bata anda, bagaimana 199 00:09:18,800 --> 00:09:21,990 cepat anda bola bergerak di seluruh skrin untuk keluar. 200 00:09:21,990 --> 00:09:24,830 Jadi ada idea ini daripada titik pada skrin anda itu 201 00:09:24,830 --> 00:09:26,290 mula bermain sudah. 202 00:09:26,290 --> 00:09:29,430 >> Sekarang apa yang anda lihat, walaupun, adalah apa yang anda pada skrin komputer. 203 00:09:29,430 --> 00:09:33,680 Jika anda pernah melihat beberapa baik atau TV buruk, kemungkinan mereka cukup banyak 204 00:09:33,680 --> 00:09:36,280 merawat penonton seperti technophobes yang tidak benar-benar 205 00:09:36,280 --> 00:09:37,630 tahu banyak tentang komputer. 206 00:09:37,630 --> 00:09:40,840 Dan supaya ia sangat mudah bagi polis detektif untuk mengatakan, anda juga boleh 207 00:09:40,840 --> 00:09:41,710 membersihkan bahawa untuk saya? 208 00:09:41,710 --> 00:09:42,710 Atau meningkatkan, bukan? 209 00:09:42,710 --> 00:09:45,550 Meningkatkan adalah seperti perkataan buzz dalam yang paling mana-mana rancangan yang berkaitan jenayah. 210 00:09:45,550 --> 00:09:49,240 Dan realitinya adalah jika anda mengambil yang sangat gambar kabur daripada suspek melakukan 211 00:09:49,240 --> 00:09:51,620 sesuatu yang buruk, anda tidak boleh hanya meningkatkan ia. 212 00:09:51,620 --> 00:09:53,080 Anda tidak boleh mengezum masuk terhingga. 213 00:09:53,080 --> 00:09:56,350 Anda tidak boleh melihat di bersinar daripada seseorang mata yang melakukan 214 00:09:56,350 --> 00:09:59,860 jenayah tertentu, walaupun kelaziman ini di TV. 215 00:09:59,860 --> 00:10:04,110 >> Dan supaya dengan itu mari kita motivasi yang masalah yang akan datang ditetapkan dengan melihat pada 216 00:10:04,110 --> 00:10:05,765 beberapa rancangan yang anda mungkin biasa. 217 00:10:05,765 --> 00:10:06,500 >> [MAIN SEMULA VIDEO] 218 00:10:06,500 --> 00:10:07,835 >> -OK. 219 00:10:07,835 --> 00:10:09,956 Sekarang, mari kita lihat baik pada anda. 220 00:10:09,956 --> 00:10:17,060 221 00:10:17,060 --> 00:10:17,766 >> -Pegang. 222 00:10:17,766 --> 00:10:18,658 Main balik. 223 00:10:18,658 --> 00:10:19,550 >> -Tunggu satu minit. 224 00:10:19,550 --> 00:10:21,580 Pergi ke kanan. 225 00:10:21,580 --> 00:10:21,800 >> -Terdapat. 226 00:10:21,800 --> 00:10:22,690 Pembekuan itu. 227 00:10:22,690 --> 00:10:23,692 >> Skrin penuh. 228 00:10:23,692 --> 00:10:23,846 >> -OK. 229 00:10:23,846 --> 00:10:24,154 Pembekuan itu. 230 00:10:24,154 --> 00:10:25,140 >> Ketatkan-up pada itu, akan ya? 231 00:10:25,140 --> 00:10:27,090 >> -Baling di atas lelaki itu oleh roda belakang. 232 00:10:27,090 --> 00:10:29,730 >> -Zoom di sini di tempat ini. 233 00:10:29,730 --> 00:10:33,700 >> -Dengan peralatan yang betul, imaged boleh membesar dan tajam. 234 00:10:33,700 --> 00:10:34,490 >> -Apa itu? 235 00:10:34,490 --> 00:10:35,870 >> -Ia merupakan satu program peningkatan. 236 00:10:35,870 --> 00:10:36,793 >> -Bolehkah anda jelas bahawa mana-mana? 237 00:10:36,793 --> 00:10:38,560 >> -Saya tidak tahu. 238 00:10:38,560 --> 00:10:39,090 Mari kita meningkatkan ia. 239 00:10:39,090 --> 00:10:41,690 >> -Meningkatkan seksyen A-6. 240 00:10:41,690 --> 00:10:43,510 >> -I dipertingkatkan terperinci dan - 241 00:10:43,510 --> 00:10:44,456 >> -Saya fikir ada cukup untuk meningkatkan. 242 00:10:44,456 --> 00:10:45,402 Melepaskannya ke skrin saya. 243 00:10:45,402 --> 00:10:47,300 >> -Meningkatkan pantulan di mata beliau. 244 00:10:47,300 --> 00:10:49,330 >> -Mari kita berjalan ini melalui peningkatan video. 245 00:10:49,330 --> 00:10:50,340 >> -Edgar, anda boleh meningkatkan ini? 246 00:10:50,340 --> 00:10:52,320 >> -Hang pada. 247 00:10:52,320 --> 00:10:54,290 >> -Aku telah bekerja pada refleksi ini. 248 00:10:54,290 --> 00:10:55,560 >> -Seseorang mencerminkan itu. 249 00:10:55,560 --> 00:10:56,440 >> -Reflection. 250 00:10:56,440 --> 00:10:57,940 >> -Ada pantulan muka manusia. 251 00:10:57,940 --> 00:10:58,860 >> Para renungan. 252 00:10:58,860 --> 00:10:59,710 >> -Ada satu pantulan. 253 00:10:59,710 --> 00:11:00,900 >> -Zum masuk pada cermin. 254 00:11:00,900 --> 00:11:03,500 >> -Anda boleh melihat pantulan. 255 00:11:03,500 --> 00:11:04,700 >> -Bolehkah anda meningkatkan imej dari sini? 256 00:11:04,700 --> 00:11:05,700 >> -Bolehkah anda meningkatkan dia di sini? 257 00:11:05,700 --> 00:11:06,500 >> -Bolehkah anda meningkatkan ia? 258 00:11:06,500 --> 00:11:07,380 >> -Bolehkah anda meningkatkan ia? 259 00:11:07,380 --> 00:11:08,190 >> -Bolehkah kita meningkatkan ini? 260 00:11:08,190 --> 00:11:08,940 >> -Bolehkah anda meningkatkan ia? 261 00:11:08,940 --> 00:11:10,280 >> -Pegang pada kali kedua, saya akan meningkatkan. 262 00:11:10,280 --> 00:11:11,570 >> -Zum masuk di pintu. 263 00:11:11,570 --> 00:11:12,180 >> -X10. 264 00:11:12,180 --> 00:11:13,052 >> -Zoom. 265 00:11:13,052 --> 00:11:13,197 >> [Ketawa] 266 00:11:13,197 --> 00:11:14,360 >> -Pindah masuk 267 00:11:14,360 --> 00:11:15,100 >> -Tunggu, berhenti. 268 00:11:15,100 --> 00:11:15,740 >> -Stop. 269 00:11:15,740 --> 00:11:16,290 >> -Jeda itu. 270 00:11:16,290 --> 00:11:19,390 >> -Putar 75 darjah di sekitar sila menegak. 271 00:11:19,390 --> 00:11:19,886 >> [Ketawa] 272 00:11:19,886 --> 00:11:24,350 >> -Stop, dan kembali ke bahagian kira-kira pintu lagi. 273 00:11:24,350 --> 00:11:26,330 >> -Got imej penambah yang boleh bitmap? 274 00:11:26,330 --> 00:11:28,990 >> -Mungkin kita boleh menggunakan Pradeep Sen kaedah untuk melihat ke tingkap. 275 00:11:28,990 --> 00:11:30,680 >> -Ini perisian adalah keadaan seni. 276 00:11:30,680 --> 00:11:31,676 >> Nilai-icon dimatikan. 277 00:11:31,676 --> 00:11:34,166 >> -Dengan kombinasi yang betul algoritma. 278 00:11:34,166 --> 00:11:38,399 >> -Dia diambil algoritma pencahayaan untuk tahap yang seterusnya dan saya boleh menggunakan mereka untuk 279 00:11:38,399 --> 00:11:38,648 meningkatkan gambar ini. 280 00:11:38,648 --> 00:11:42,050 >> Kunci-pada dan membesarkan paksi z. 281 00:11:42,050 --> 00:11:42,760 >> -Meningkatkan. 282 00:11:42,760 --> 00:11:43,060 >> -Meningkatkan. 283 00:11:43,060 --> 00:11:43,760 >> -Meningkatkan. 284 00:11:43,760 --> 00:11:45,010 >> -Pembekuan dan meningkatkan. 285 00:11:45,010 --> 00:11:47,470 286 00:11:47,470 --> 00:11:47,910 >> [AKHIR VIDEO MAIN SEMULA] 287 00:11:47,910 --> 00:11:51,470 >> DAVID J. MALAN: Set Masalah Jadi 5 adalah apa yang akan berlaku di sana. 288 00:11:51,470 --> 00:11:55,260 Oleh itu, kita tidak lama lagi akan mendapat pemahaman yang lebih baik bila dan mengapa anda boleh 289 00:11:55,260 --> 00:11:57,300 dan kita tidak boleh meningkatkan dengan cara itu. 290 00:11:57,300 --> 00:12:00,090 Tetapi pertama, mari kita kembali perhatian kita kepada beberapa blok bangunan kita akan 291 00:12:00,090 --> 00:12:02,250 perlu berupaya untuk memberitahu cerita itu. 292 00:12:02,250 --> 00:12:05,580 >> Jadi ingat bahawa kita menarik gambar ini pada Isnin dan sedikit minggu lepas. 293 00:12:05,580 --> 00:12:09,970 Dan ini menerangkan kedudukan perkara-perkara di dalam memori komputer anda apabila 294 00:12:09,970 --> 00:12:11,000 menjalankan beberapa program. 295 00:12:11,000 --> 00:12:14,310 Segmen teknologi top up, ingat, merujuk kepada sifar sebenar dan orang-orang yang 296 00:12:14,310 --> 00:12:16,000 yang mengarang program anda. 297 00:12:16,000 --> 00:12:19,340 Ada, di bawah itu, beberapa dimulakan atau data tidak diisytiharkan, yang biasanya 298 00:12:19,340 --> 00:12:22,910 merujuk kepada perkara-perkara seperti pemalar atau tali atau pembolehubah global yang mempunyai 299 00:12:22,910 --> 00:12:24,200 diisytiharkan terlebih dahulu. 300 00:12:24,200 --> 00:12:26,500 Terdapat timbunan itu, tetapi kita akan datang kembali kepada yang dalam sedikit. 301 00:12:26,500 --> 00:12:27,410 >> Dan kemudian ada timbunan. 302 00:12:27,410 --> 00:12:30,660 Sama seperti timbunan dulang di kafeteria, ini adalah di mana memori mendapat 303 00:12:30,660 --> 00:12:33,610 berlapis dan berlapis apabila anda melakukan apa dalam program? 304 00:12:33,610 --> 00:12:36,380 305 00:12:36,380 --> 00:12:37,730 Apakah penggunaan timbunan untuk? 306 00:12:37,730 --> 00:12:39,320 >> Ya? 307 00:12:39,320 --> 00:12:40,000 >> Memanggil fungsi. 308 00:12:40,000 --> 00:12:42,890 Bila-bila masa anda memanggil fungsi, ia diberikan kepada sekerat memori untuk yang 309 00:12:42,890 --> 00:12:45,020 pembolehubah tempatan atau parameternya. 310 00:12:45,020 --> 00:12:48,810 Dan bergambar, kita lihat bahawa dengan setiap fungsi berturut-turut dipanggil, apabila A 311 00:12:48,810 --> 00:12:52,520 panggilan panggilan B C panggilan D, mereka mendapatkan berlapis ke dalam tindanan. 312 00:12:52,520 --> 00:12:55,630 Dan dalam setiap daripada mereka keping memori asasnya skop yang unik 313 00:12:55,630 --> 00:12:58,590 untuk fungsi itu, yang, sememangnya, bermasalah jika anda mahu menyerahkan 314 00:12:58,590 --> 00:13:01,850 dari satu fungsi yang lain sekeping A data yang anda mahu 315 00:13:01,850 --> 00:13:03,500 bermutasi atau berubah. 316 00:13:03,500 --> 00:13:08,060 >> Jadi apa penyelesaian kami untuk membolehkan Satu fungsi diwakili oleh satu timbunan 317 00:13:08,060 --> 00:13:11,390 bingkai menukar memori di dalam kerangka susunan yang lain? 318 00:13:11,390 --> 00:13:14,590 Bagaimana kedua-dua bercakap dengan satu sama lain? 319 00:13:14,590 --> 00:13:18,510 Jadi dengan cara petunjuk atau alamat, yang, sekali lagi, hanya menggambarkan di mana dalam 320 00:13:18,510 --> 00:13:22,280 ingatan, dengan cara tertentu beberapa menggigit, tertentu 321 00:13:22,280 --> 00:13:23,830 nilai boleh didapati. 322 00:13:23,830 --> 00:13:26,860 Jadi ingat masa lalu juga kita terus kisah dan memandang pada 323 00:13:26,860 --> 00:13:28,280 agak program kereta. 324 00:13:28,280 --> 00:13:32,900 Dan program ini adalah kereta untuk beberapa sebab, tetapi yang paling membimbangkan ialah 325 00:13:32,900 --> 00:13:34,620 kerana ia gagal untuk memeriksa apa? 326 00:13:34,620 --> 00:13:39,111 327 00:13:39,111 --> 00:13:40,450 >> Ya, ia gagal untuk memeriksa input. 328 00:13:40,450 --> 00:13:41,870 Maaf? 329 00:13:41,870 --> 00:13:43,880 >> Jika ia adalah lebih daripada 12 aksara. 330 00:13:43,880 --> 00:13:47,260 Jadi sangat bijak, apabila memanggil memcopy, yang, seperti namanya, hanya 331 00:13:47,260 --> 00:13:50,630 salinan ingatan dari hujah kedua ke dalam hujah pertama. 332 00:13:50,630 --> 00:13:54,730 Hujah ketiga, sangat bijak, adalah diperiksa untuk memastikan bahawa anda tidak 333 00:13:54,730 --> 00:13:59,400 tulis lebih daripada, dalam kes ini, panjang bar, beberapa watak-watak, 334 00:13:59,400 --> 00:14:03,810 ke destinasi, yang ini pelbagai C. Tetapi masalahnya ialah bahawa apa yang 335 00:14:03,810 --> 00:14:07,230 jika C itu sendiri tidak cukup besar untuk mengendalikan itu? 336 00:14:07,230 --> 00:14:09,900 Anda akan tulis bilangan bait yang anda telah diberikan. 337 00:14:09,900 --> 00:14:13,040 Tetapi apa yang anda benar-benar mempunyai lebih bait daripada anda mempunyai ruang untuk? 338 00:14:13,040 --> 00:14:16,770 >> Well, program ini sangat bodoh hanya membuta tuli hasil untuk mengambil apa-apa ia 339 00:14:16,770 --> 00:14:20,650 diberikan, hello backslash 0 adalah besar jika rentetan pendek 340 00:14:20,650 --> 00:14:22,040 cukup, seperti lima aksara. 341 00:14:22,040 --> 00:14:26,470 Tetapi jika ia sebenarnya 12 aksara atau 1,200 aksara, kita melihat masa lalu 342 00:14:26,470 --> 00:14:29,380 bahawa anda hanya akan benar-benar menulis semula memori yang 343 00:14:29,380 --> 00:14:30,470 bukan milik anda. 344 00:14:30,470 --> 00:14:34,390 Dan kes paling teruk, jika anda menulis bahawa bahagian merah sana yang kita dipanggil 345 00:14:34,390 --> 00:14:35,380 kembali alamat - 346 00:14:35,380 --> 00:14:38,370 ini adalah tempat di mana komputer secara automatik, untuk anda, di belakang 347 00:14:38,370 --> 00:14:43,130 tabir, tucks jauh nilai 32-bit yang mengingatkan kepada apa alamat yang sepatutnya 348 00:14:43,130 --> 00:14:47,080 kembali apabila foo, fungsi ini lain, dilakukan melaksanakan. 349 00:14:47,080 --> 00:14:49,320 Ia adalah satu roti meremahkan pelbagai yang mana ianya kembali. 350 00:14:49,320 --> 00:14:52,490 Jika anda menulis bahawa, berpotensi, jika anda seorang lelaki yang buruk, boleh boleh 351 00:14:52,490 --> 00:14:54,750 berpotensi mengambil alih komputer seseorang. 352 00:14:54,750 --> 00:14:58,020 Dan anda akan pasti kemalangan di dalam kebanyakan kes. 353 00:14:58,020 --> 00:15:01,690 >> Sekarang masalah ini hanya diburukkan lagi seperti yang kita mula bercakap tentang ingatan 354 00:15:01,690 --> 00:15:03,010 pengurusan yang lebih umum. 355 00:15:03,010 --> 00:15:07,150 Dan malloc, peruntukan memori, adalah fungsi yang boleh kita gunakan untuk memperuntukkan 356 00:15:07,150 --> 00:15:11,260 memori apabila kita tidak tahu terlebih dahulu bahawa kita mungkin memerlukan. 357 00:15:11,260 --> 00:15:13,960 Jadi, sebagai contoh, jika saya kembali kepada perkakas di sini. 358 00:15:13,960 --> 00:15:21,010 Dan saya membuka hello2.c dari masa lalu, ingat program ini di sini, yang kelihatan 359 00:15:21,010 --> 00:15:23,500 sesuatu yang kecil seperti ini, hanya tiga baris - 360 00:15:23,500 --> 00:15:27,940 menyatakan nama, maka nama tali, di sebelah kiri, sama getstring. 361 00:15:27,940 --> 00:15:29,690 Dan kemudian kita mencetak ia keluar, Nama pengguna. 362 00:15:29,690 --> 00:15:31,170 >> Jadi ini adalah satu program yang sangat mudah. 363 00:15:31,170 --> 00:15:34,870 Untuk menjadi jelas, izinkan saya pergi ke hadapan dan membuat hello-2. 364 00:15:34,870 --> 00:15:36,680 Saya akan melakukan dot slash hello-2. 365 00:15:36,680 --> 00:15:37,750 Nyatakan nama anda - 366 00:15:37,750 --> 00:15:38,140 Daud. 367 00:15:38,140 --> 00:15:38,840 Enter. 368 00:15:38,840 --> 00:15:39,540 Hello Daud. 369 00:15:39,540 --> 00:15:41,060 Ia seolah-olah bekerja OK. 370 00:15:41,060 --> 00:15:43,140 Tetapi apa yang benar-benar berlaku di bawah hud di sini? 371 00:15:43,140 --> 00:15:44,670 Pertama mari kita mengupas kembali beberapa lapisan. 372 00:15:44,670 --> 00:15:48,380 Rentetan hanya sinonim kita telah sedar untuk apa? 373 00:15:48,380 --> 00:15:49,110 Bintang Char. 374 00:15:49,110 --> 00:15:52,740 Jadi mari kita membuat ia sedikit lebih batin tetapi yang lebih teknikal yang betul yang ini 375 00:15:52,740 --> 00:15:55,570 adalah bintang char, yang bermaksud bahawa nama, ya, adalah pembolehubah. 376 00:15:55,570 --> 00:15:59,920 Tetapi apa yang kedai-kedai nama alamat a char, yang berasa sedikit pelik 377 00:15:59,920 --> 00:16:01,050 kerana saya mendapat kembali rentetan. 378 00:16:01,050 --> 00:16:03,580 Saya mendapat kembali pelbagai aksara bukan char. 379 00:16:03,580 --> 00:16:07,400 >> Tetapi tentu saja, anda hanya perlu pertama alamat char untuk mengingati di mana 380 00:16:07,400 --> 00:16:08,870 rentetan keseluruhannya adalah kerana mengapa? 381 00:16:08,870 --> 00:16:12,700 Bagaimana anda mengetahui di mana akhir tali itu mengetahui awal? 382 00:16:12,700 --> 00:16:13,630 Sifar garis sendeng terbalik. 383 00:16:13,630 --> 00:16:17,260 Jadi dengan kedua-dua petunjuk yang anda memikirkan sebelum permulaan dan akhir 384 00:16:17,260 --> 00:16:20,280 mana-mana tali adalah, selagi mereka betul ditubuhkan dengan nol bahawa 385 00:16:20,280 --> 00:16:22,110 terminator, yang sifar garis sendeng terbalik. 386 00:16:22,110 --> 00:16:24,520 >> Tetapi ini memanggil getstring. 387 00:16:24,520 --> 00:16:28,020 Dan ternyata bahawa getstring sepanjang masa ini telah menjadi jenis 388 00:16:28,020 --> 00:16:28,820 menipu untuk kita. 389 00:16:28,820 --> 00:16:32,460 Ia telah melakukan kerja ini, untuk memastikan, mendapatkan rentetan daripada pengguna. 390 00:16:32,460 --> 00:16:34,580 Tetapi di mana adalah memori yang telah datang dari? 391 00:16:34,580 --> 00:16:38,440 Jika kita kembali kepada gambar di sini dan memohon definisi daripada hanya 392 00:16:38,440 --> 00:16:42,610 masa lalu, bahawa timbunan adalah di mana memori berlaku apabila fungsi dipanggil, 393 00:16:42,610 --> 00:16:45,370 oleh logik itu, apabila anda memanggil getstring, dan kemudian saya menaip 394 00:16:45,370 --> 00:16:50,900 D-A-V-I-D Masukkan, di mana D-A-V-I-D backslash sifar disimpan, berdasarkan 395 00:16:50,900 --> 00:16:53,480 cerita kami telah memberitahu kami ini? 396 00:16:53,480 --> 00:16:55,190 >> Ia seolah-olah berada di dalam timbunan, kan? 397 00:16:55,190 --> 00:16:58,120 Apabila anda memanggil mendapatkan tali anda mendapat keping sedikit memori pada timbunan. 398 00:16:58,120 --> 00:17:01,630 Maka dengan sebab bahawa D-A-V-I-D backslash sifar disimpan 399 00:17:01,630 --> 00:17:02,770 terdapat dalam timbunan. 400 00:17:02,770 --> 00:17:07,680 Tetapi tunggu satu minit, getstring pulangan tali itu, jadi untuk bercakap, yang bermaksud 401 00:17:07,680 --> 00:17:11,700 ia dulang dari kafeteria diambil dari timbunan. 402 00:17:11,700 --> 00:17:14,560 Dan kita berkata Kali terakhir sebaik sahaja mengembalikan, dan anda mengambil 403 00:17:14,560 --> 00:17:20,109 dulang, jadi untuk bercakap, dari timbunan, apa anda boleh menganggap mengenai sisa-sisa 404 00:17:20,109 --> 00:17:21,819 memori yang? 405 00:17:21,819 --> 00:17:25,160 Saya jenis redrew mereka sebagai tanda tanya kerana mereka berkesan menjadi 406 00:17:25,160 --> 00:17:26,250 nilai-nilai yang tidak diketahui. 407 00:17:26,250 --> 00:17:29,500 Mereka boleh digunakan semula apabila beberapa fungsi seterusnya dipanggil. 408 00:17:29,500 --> 00:17:31,870 >> Dalam erti kata lain, jika kita berlaku untuk menyimpan - 409 00:17:31,870 --> 00:17:34,350 Saya akan menarik gambar cepat sini timbunan. 410 00:17:34,350 --> 00:17:38,690 Jika kita berada melukis bawah segmen ingatan saya, dan kami akan mengatakan 411 00:17:38,690 --> 00:17:42,230 bahawa ini adalah tempat memori diduduki oleh Arg utama dan mungkin c dan 412 00:17:42,230 --> 00:17:46,790 Arg v dan apa-apa lagi dalam program ini, apabila getstring dipanggil, 413 00:17:46,790 --> 00:17:51,120 mungkin getstring mendapat sebahagian memori di sini. 414 00:17:51,120 --> 00:17:53,940 Dan kemudian D-A-V-I-D entah bagaimana berakhir dalam fungsi ini. 415 00:17:53,940 --> 00:17:55,320 Dan saya akan menggampangkan. 416 00:17:55,320 --> 00:18:00,050 Tetapi mari kita andaikan bahawa D-A-V-I-D backslash sifar. 417 00:18:00,050 --> 00:18:03,500 Jadi ini banyak bait yang digunakan dalam rangka bagi getstring. 418 00:18:03,500 --> 00:18:08,270 >> Tetapi sebaik sahaja pulangan getstring, kita berkata kali terakhir bahawa memori ini lebih 419 00:18:08,270 --> 00:18:11,340 di sini semua menjadi - Woops! - 420 00:18:11,340 --> 00:18:14,270 semua menjadi terpadam berkesan. 421 00:18:14,270 --> 00:18:17,220 Dan kita boleh berfikir ini kini sebagai soalan markah kerana yang tahu 422 00:18:17,220 --> 00:18:18,720 apa yang akan menjadi memori yang. 423 00:18:18,720 --> 00:18:22,130 Malah, saya sangat sering memanggil fungsi selain daripada getstring. 424 00:18:22,130 --> 00:18:24,750 Dan sebaik sahaja saya panggil yang lain fungsi daripada getstring, mungkin tidak 425 00:18:24,750 --> 00:18:28,860 program ini kita hanya melihat di tetapi beberapa yang lain, pasti yang lain 426 00:18:28,860 --> 00:18:34,180 fungsi mungkin berakhir diberikan tempat ini akan datang dalam timbunan. 427 00:18:34,180 --> 00:18:39,410 >> Jadi ia tidak boleh bahawa kedai-kedai getstring D-A-V-I-D pada timbunan kerana saya akan 428 00:18:39,410 --> 00:18:41,040 segera kehilangan akses kepadanya. 429 00:18:41,040 --> 00:18:43,720 Tetapi kita tahu mereka getstring hanya mengembalikan apa? 430 00:18:43,720 --> 00:18:47,220 Ia tidak kembali ke saya enam aksara. 431 00:18:47,220 --> 00:18:51,090 Apakah ia benar-benar kembali tidak kita membuat kesimpulan masa lalu? 432 00:18:51,090 --> 00:18:52,480 Alamat pertama. 433 00:18:52,480 --> 00:18:56,650 Jadi entah bagaimana, apabila anda dipanggil getstring, ia memperuntukkan sebahagian daripada memori untuk 434 00:18:56,650 --> 00:18:59,620 rentetan yang jenis pengguna dan alamat kemudian kembali itu. 435 00:18:59,620 --> 00:19:02,930 Dan ternyata bahawa apabila anda mahu berfungsi untuk memperuntukkan ingatan dalam 436 00:19:02,930 --> 00:19:08,390 cara dan kembali kepada orang yang dipanggil fungsi itu, alamat 437 00:19:08,390 --> 00:19:11,870 bahawa sebahagian memori, anda benar-benar tidak boleh meletakkan ia dalam timbunan di 438 00:19:11,870 --> 00:19:14,750 bawah, kerana fungsi ia hanya akan anda tidak menjadi sangat 439 00:19:14,750 --> 00:19:17,800 dengan cepat, jadi anda mungkin boleh meneka di mana kita mungkin akan melemparkannya 440 00:19:17,800 --> 00:19:20,130 sebaliknya, timbunan kononnya. 441 00:19:20,130 --> 00:19:25,290 >> Jadi antara bahagian bawah memori yang anda susun atur dan atas memori yang anda 442 00:19:25,290 --> 00:19:26,820 susun atur adalah sekumpulan keseluruhan segmen. 443 00:19:26,820 --> 00:19:29,270 Satu adalah timbunan, dan kanan atas adalah timbunan itu. 444 00:19:29,270 --> 00:19:33,680 Dan timbunan hanya sebahagian yang berbeza memori yang tidak digunakan untuk fungsi-fungsi 445 00:19:33,680 --> 00:19:34,770 apabila mereka dipanggil. 446 00:19:34,770 --> 00:19:38,100 Ia digunakan untuk ingatan jangka panjang, apabila anda mahu satu fungsi untuk merebut beberapa 447 00:19:38,100 --> 00:19:42,700 memori dan mampu untuk menggantung pada kepadanya tanpa kehilangan kawalan ke atasnya. 448 00:19:42,700 --> 00:19:45,550 >> Sekarang anda boleh mungkin serta-merta melihat bahawa ini tidak 449 00:19:45,550 --> 00:19:48,060 semestinya reka bentuk yang sempurna. 450 00:19:48,060 --> 00:19:51,350 Sebagai program anda memperuntukkan memori pada timbunan itu, atau anda memanggil lebih 451 00:19:51,350 --> 00:19:55,540 lebih banyak fungsi, atau seperti yang anda memperuntukkan memori pada timbunan dengan malloc kira sebagai 452 00:19:55,540 --> 00:20:00,690 getstring lakukan, apa yang jelas seolah-olah menjadi masalah yang tidak dapat dielakkan? 453 00:20:00,690 --> 00:20:00,860 >> Betul. 454 00:20:00,860 --> 00:20:03,150 Seperti hakikat bahawa anak panah yang menghala ke arah satu sama lain 455 00:20:03,150 --> 00:20:04,380 tidak memberikan petanda yang baik. 456 00:20:04,380 --> 00:20:08,630 Dan sesungguhnya, kita sangat cepat boleh kemalangan satu program di mana-mana nombor cara. 457 00:20:08,630 --> 00:20:12,050 Malah, saya fikir kita mungkin mempunyai melakukan ini sengaja sekali. 458 00:20:12,050 --> 00:20:14,020 Atau jika tidak, mari kita melakukannya sengaja sekarang. 459 00:20:14,020 --> 00:20:21,330 Biar saya pergi ke hadapan dan menulis super cepat program yang dikenali sebagai dontdothis.c. 460 00:20:21,330 --> 00:20:26,730 Dan sekarang saya akan pergi di sini dan jangan tajam termasuk stdio.h. 461 00:20:26,730 --> 00:20:32,620 Mari kita mengisytiharkan fungsi foo mengambil ada hujah, yang merupakan 462 00:20:32,620 --> 00:20:34,040 ditandakan serta dengan tidak sah. 463 00:20:34,040 --> 00:20:37,830 >> Dan satu-satunya foo akan lakukan ialah panggilan foo, yang mungkin bukan 464 00:20:37,830 --> 00:20:39,100 idea bijak, tetapi begitu ia. 465 00:20:39,100 --> 00:20:40,490 Tidak sah utama Ent. 466 00:20:40,490 --> 00:20:45,270 Kini satu-satunya perkara utama yang akan lakukan ialah memanggil foo juga. 467 00:20:45,270 --> 00:20:51,050 Dan hanya untuk tendangan, saya akan pergi hadapan di sini dan mengatakan printf "Hello dari 468 00:20:51,050 --> 00:20:52,340 foo. " 469 00:20:52,340 --> 00:20:52,890 >> OK. 470 00:20:52,890 --> 00:21:00,160 Jadi, jika saya tidak membuat apa-apa kesilapan, Buat dontdothis dot slash. 471 00:21:00,160 --> 00:21:01,960 Dan mari kita melakukannya dalam tingkap yang lebih besar - 472 00:21:01,960 --> 00:21:03,210 dot slash, dontdothis. 473 00:21:03,210 --> 00:21:07,590 474 00:21:07,590 --> 00:21:08,840 Datang. 475 00:21:08,840 --> 00:21:10,940 476 00:21:10,940 --> 00:21:11,890 Uh oh. 477 00:21:11,890 --> 00:21:13,100 Rupa-rupanya, anda boleh melakukan ini. 478 00:21:13,100 --> 00:21:15,190 Celaka. 479 00:21:15,190 --> 00:21:16,190 OK. 480 00:21:16,190 --> 00:21:16,580 Tunggu. 481 00:21:16,580 --> 00:21:17,370 Berdiri. 482 00:21:17,370 --> 00:21:18,270 Adakah kita - 483 00:21:18,270 --> 00:21:20,110 Kami menggunakannya dengan Buat. 484 00:21:20,110 --> 00:21:22,050 >> [Mengeluh] 485 00:21:22,050 --> 00:21:25,110 >> Saya tahu tetapi saya fikir kita hanya dihapuskan itu. 486 00:21:25,110 --> 00:21:28,410 Uh, yeah. 487 00:21:28,410 --> 00:21:30,660 Celaka. 488 00:21:30,660 --> 00:21:32,640 Menyelesaikan Rob ini. 489 00:21:32,640 --> 00:21:34,678 Apa? 490 00:21:34,678 --> 00:21:35,928 Ia amat mudah. 491 00:21:35,928 --> 00:21:43,820 492 00:21:43,820 --> 00:21:47,360 Ya, kita beralih pengoptimuman off. 493 00:21:47,360 --> 00:21:48,970 OK, berdiri tinggal. 494 00:21:48,970 --> 00:21:49,950 Sekarang saya berasa lebih baik. 495 00:21:49,950 --> 00:21:51,390 OK. 496 00:21:51,390 --> 00:21:51,780 Baiklah. 497 00:21:51,780 --> 00:21:53,430 >> Jadi mari kita susun semula ini - 498 00:21:53,430 --> 00:21:55,880 Membuat anda dontdothis. 499 00:21:55,880 --> 00:22:00,090 Anda mungkin perlu menukar nama ini kepada dothis.c dalam hanya seketika. 500 00:22:00,090 --> 00:22:00,710 Ada kita pergi. 501 00:22:00,710 --> 00:22:01,240 Terima kasih. 502 00:22:01,240 --> 00:22:02,050 OK. 503 00:22:02,050 --> 00:22:05,480 Jadi hakikat bahawa saya telah mencetak sesuatu yang keluar adalah sebenarnya hanya 504 00:22:05,480 --> 00:22:08,150 melambatkan proses yang kita akan mencapai titik. 505 00:22:08,150 --> 00:22:08,510 OK. 506 00:22:08,510 --> 00:22:08,870 Phew! 507 00:22:08,870 --> 00:22:11,180 >> Jadi apa yang sebenarnya berlaku? 508 00:22:11,180 --> 00:22:14,440 Sebab di sana, hanya sebagai diketepikan, adalah melakukan apa-apa dari segi input dan 509 00:22:14,440 --> 00:22:17,270 output cenderung untuk menjadi lebih perlahan kerana anda perlu menulis watak-watak kepada 510 00:22:17,270 --> 00:22:18,600 skrin, Ia mempunyai untuk menatal. 511 00:22:18,600 --> 00:22:21,720 Jadi cerita panjang pendek, saya sebenarnya mempunyai berlaku begitu tidak sabar, kita akan mempunyai 512 00:22:21,720 --> 00:22:23,260 melihat hasil akhir ini juga. 513 00:22:23,260 --> 00:22:26,220 Sekarang saya mendapat menaiki cetak-up, kita lihat dengan segera. 514 00:22:26,220 --> 00:22:28,410 Lalu mengapa ini berlaku. 515 00:22:28,410 --> 00:22:31,300 Nah, penjelasan yang mudah, sudah tentu, ialah foo mungkin tidak perlu 516 00:22:31,300 --> 00:22:32,500 memanggil sendiri. 517 00:22:32,500 --> 00:22:34,470 >> Sekarang secara umum, ini adalah rekursi. 518 00:22:34,470 --> 00:22:36,970 Dan kita berfikir dua minggu lalu rekursi adalah baik. 519 00:22:36,970 --> 00:22:40,330 Rekursi ialah cara ajaib menyatakan diri super ringkas. 520 00:22:40,330 --> 00:22:41,400 Dan ia hanya berfungsi. 521 00:22:41,400 --> 00:22:45,060 Tetapi ada satu ciri utama semua program rekursi kita telah berbincang 522 00:22:45,060 --> 00:22:48,260 kira-kira dan melihat setakat ini, yang adalah bahawa mereka mempunyai apa? 523 00:22:48,260 --> 00:22:52,610 Satu kes asas, yang sedikit keras berkod kes yang berkata dalam sesetengah keadaan 524 00:22:52,610 --> 00:22:56,210 tidak memanggil foo, yang jelas tidak berlaku di sini. 525 00:22:56,210 --> 00:22:58,920 >> Jadi apa sebenarnya yang berlaku dari segi gambar ini? 526 00:22:58,920 --> 00:23:01,790 Nah, apabila utama panggilan foo, ia mendapat keping ingatan. 527 00:23:01,790 --> 00:23:04,150 Apabila panggilan foo foo, ia mendapat sepotong ingatan. 528 00:23:04,150 --> 00:23:06,430 Apabila panggilan foo foo, ia menjadi sepotong. 529 00:23:06,430 --> 00:23:07,080 Ia mendapat keping. 530 00:23:07,080 --> 00:23:08,120 Ia mendapat keping. 531 00:23:08,120 --> 00:23:09,460 Kerana foo tidak pernah kembali. 532 00:23:09,460 --> 00:23:12,160 Kami tidak pernah memadamkan salah seorang daripada mereka bingkai dari timbunan. 533 00:23:12,160 --> 00:23:15,930 Jadi kita sedang bertiup melalui timbunan itu, tidak lagi yang tahu apa yang lain, dan 534 00:23:15,930 --> 00:23:19,600 kami overstepping batas-batas kami yang dipanggil segmen ingatan. 535 00:23:19,600 --> 00:23:21,790 Ralat pergi segmentasi palsu. 536 00:23:21,790 --> 00:23:24,110 >> Jadi penyelesaian yang ada jelas tidak melakukan ini. 537 00:23:24,110 --> 00:23:28,830 Tetapi implikasi yang lebih besar ialah, ya, ada benar-benar adalah had tertentu, 538 00:23:28,830 --> 00:23:32,470 walaupun ia tidak ditakrifkan dengan baik, tentang bagaimana banyak fungsi yang anda boleh memanggil satu 539 00:23:32,470 --> 00:23:34,970 program, berapa kali fungsi boleh memanggil sendiri. 540 00:23:34,970 --> 00:23:38,430 Jadi, walaupun kita tidak berdakwah rekursi sebagai perkara ini berpotensi yang ajaib 541 00:23:38,430 --> 00:23:41,870 beberapa minggu lalu untuk sigma fungsi, dan apabila kita mendapatkan data 542 00:23:41,870 --> 00:23:45,270 struktur dan CS50, anda akan melihat yang lain aplikasi untuk itu, ia tidak 543 00:23:45,270 --> 00:23:46,500 semestinya perkara yang terbaik. 544 00:23:46,500 --> 00:23:50,070 Kerana jika fungsi panggilan sendiri, panggilan sendiri, walaupun ada asas 545 00:23:50,070 --> 00:23:54,860 kes ini, jika anda tidak melanda kes asas untuk 1,000 panggilan atau 10,000 panggilan, oleh 546 00:23:54,860 --> 00:23:58,800 bahawa masa anda mungkin telah berjalan keluar dari bilik pada timbunan yang dipanggil dan hit 547 00:23:58,800 --> 00:24:00,400 beberapa segmen lain ingatan. 548 00:24:00,400 --> 00:24:03,950 Jadi ia juga merupakan reka bentuk keseimbangan antara keanggunan dan antara 549 00:24:03,950 --> 00:24:06,920 keteguhan tertentu anda pelaksanaan. 550 00:24:06,920 --> 00:24:10,780 >> Jadi ada keburukan yang lain atau gotcha lain dengan apa yang kita telah 551 00:24:10,780 --> 00:24:11,720 telah lakukan setakat ini. 552 00:24:11,720 --> 00:24:12,980 Apabila saya dipanggil getstring - 553 00:24:12,980 --> 00:24:15,120 biarlah saya kembali ke hello-2. 554 00:24:15,120 --> 00:24:18,170 Perhatikan bahawa saya menyeru getstring, yang kembali alamat. 555 00:24:18,170 --> 00:24:20,730 Dan kita mendakwa hari ini bahawa alamat adalah dari timbunan itu. 556 00:24:20,730 --> 00:24:24,480 Dan kini saya mencetak keluar tali di alamat itu. 557 00:24:24,480 --> 00:24:27,000 Tetapi kita tidak pernah dipanggil bertentangan dengan getstring. 558 00:24:27,000 --> 00:24:30,850 Kami tidak pernah calll fungsi seperti ungetstring, di mana anda kembali tangan 559 00:24:30,850 --> 00:24:31,610 memori itu. 560 00:24:31,610 --> 00:24:33,250 Tetapi terus terang kita mungkin sepatutnya. 561 00:24:33,250 --> 00:24:37,390 Kerana jika kita terus bertanya komputer untuk ingatan, dengan cara seseorang seperti 562 00:24:37,390 --> 00:24:40,830 getstring tetapi tidak pernah memberikan kembali, pasti itu juga adalah terikat untuk membawa kepada 563 00:24:40,830 --> 00:24:42,970 masalah di mana kita kehabisan memori. 564 00:24:42,970 --> 00:24:46,140 >> Dan sebenarnya, kita boleh melihat bagi masalah dengan alat baru yang penggunaan 565 00:24:46,140 --> 00:24:47,640 adalah samar sedikit untuk menaip. 566 00:24:47,640 --> 00:24:50,960 Tetapi biarlah saya pergi ke hadapan dan percikan ia pada skrin dalam seketika. 567 00:24:50,960 --> 00:24:56,940 Saya akan pergi ke hadapan dan menjalankan Valgrind dengan parameter yang perintah pertama 568 00:24:56,940 --> 00:25:00,260 hujah baris adalah nama program yang hello-2. 569 00:25:00,260 --> 00:25:02,650 Dan malangnya ia output atrociously 570 00:25:02,650 --> 00:25:04,290 kompleks tanpa sebab yang baik. 571 00:25:04,290 --> 00:25:06,280 Jadi kita lihat semua keadaan kucar-kacir itu. 572 00:25:06,280 --> 00:25:07,530 David menyatakan nama saya. 573 00:25:07,530 --> 00:25:09,760 Jadi itulah program sebenarnya berjalan. 574 00:25:09,760 --> 00:25:11,180 Dan sekarang kita mendapatkan output ini. 575 00:25:11,180 --> 00:25:13,400 >> Jadi Valgrind adalah sama dalam semangat untuk GDB. 576 00:25:13,400 --> 00:25:14,950 Ia bukan satu penyahpepijat per se. 577 00:25:14,950 --> 00:25:16,270 Tetapi ia adalah satu pemeriksa ingatan. 578 00:25:16,270 --> 00:25:20,140 Ia adalah satu program yang akan berjalan anda program dan memberitahu anda jika anda bertanya 579 00:25:20,140 --> 00:25:23,860 komputer untuk memori dan tidak menyerahkannya belakang, dengan itu bererti bahawa anda mempunyai 580 00:25:23,860 --> 00:25:24,570 kebocoran memori. 581 00:25:24,570 --> 00:25:26,240 Dan kebocoran memori cenderung untuk menjadi buruk. 582 00:25:26,240 --> 00:25:29,120 Dan anda adalah pengguna komputer mempunyai mungkin merasakan ini, sama ada anda mempunyai 583 00:25:29,120 --> 00:25:30,300 Mac atau PC. 584 00:25:30,300 --> 00:25:33,730 Pernahkah anda menggunakan komputer anda untuk sementara dan tidak reboot dalam beberapa 585 00:25:33,730 --> 00:25:36,820 hari, atau anda baru sahaja mendapat banyak program berjalan, dan perkara yang bodoh 586 00:25:36,820 --> 00:25:42,360 melambatkan terhenti, atau sekurang-kurangnya ia adalah super menjengkelkan untuk digunakan, kerana 587 00:25:42,360 --> 00:25:44,350 segala-galanya hanya mendapat super perlahan. 588 00:25:44,350 --> 00:25:46,260 >> Sekarang boleh mana-mana beberapa sebab. 589 00:25:46,260 --> 00:25:49,600 Ia boleh menjadi gelung tak terhingga, bug dalam kod seseorang, atau, lebih mudah, ia 590 00:25:49,600 --> 00:25:53,250 boleh bermakna bahawa anda menggunakan lebih memori, atau cuba, daripada anda 591 00:25:53,250 --> 00:25:54,920 komputer sebenarnya mempunyai. 592 00:25:54,920 --> 00:25:57,770 Dan mungkin ada bug dalam program beberapa yang terus bertanya untuk ingatan. 593 00:25:57,770 --> 00:26:02,480 Pelayar selama bertahun-tahun telah terkenal ini, meminta memori yang lebih dan lebih 594 00:26:02,480 --> 00:26:03,870 tetapi tidak pernah menyerahkan kembali. 595 00:26:03,870 --> 00:26:07,220 Sesungguhnya, jika anda hanya mempunyai terhingga jumlah memori, anda tidak boleh meminta 596 00:26:07,220 --> 00:26:09,990 terhingga banyak kali untuk beberapa memori yang. 597 00:26:09,990 --> 00:26:13,070 >> Dan jadi apa yang anda lihat di sini, walaupun lagi output Valgrind adalah 598 00:26:13,070 --> 00:26:17,490 tidak perlu rumit untuk renungan pertama, ini adalah bahagian yang menarik. 599 00:26:17,490 --> 00:26:18,890 Heap - 600 00:26:18,890 --> 00:26:20,060 digunakan pada keluar. 601 00:26:20,060 --> 00:26:22,810 Jadi di sini adalah berapa banyak memori adalah digunakan dalam timbunan itu pada 602 00:26:22,810 --> 00:26:24,300 masa program saya keluar - 603 00:26:24,300 --> 00:26:27,280 nampaknya enam bait dalam satu blok. 604 00:26:27,280 --> 00:26:28,710 Jadi saya akan melambai tangan saya apa blok adalah. 605 00:26:28,710 --> 00:26:31,270 Fikirkan ia hanya sebahagian satu, yang lebih perkataan teknikal bagi sebahagian. 606 00:26:31,270 --> 00:26:33,140 Tetapi enam bait - 607 00:26:33,140 --> 00:26:36,870 apakah enam bait yang masih digunakan? 608 00:26:36,870 --> 00:26:37,390 >> Tepat sekali. 609 00:26:37,390 --> 00:26:41,520 D-A-V-I-D backslash sifar, lima surat Nama campur null. 610 00:26:41,520 --> 00:26:46,350 Jadi program ini Valgrind menyedari bahawa saya meminta enam bait, nampaknya, oleh 611 00:26:46,350 --> 00:26:48,950 cara getstring, tetapi tidak pernah memberikan mereka kembali. 612 00:26:48,950 --> 00:26:52,030 Dan sebenarnya, ini mungkin tidak begitu jelas jika program saya bukan tiga 613 00:26:52,030 --> 00:26:53,590 baris, tetapi ia 300 baris. 614 00:26:53,590 --> 00:26:56,920 Oleh itu, kita sebenarnya boleh memberi arahan lain hujah garis Valgrind untuk 615 00:26:56,920 --> 00:26:58,290 menjadikannya lebih lantung. 616 00:26:58,290 --> 00:26:59,760 Ia sedikit menjengkelkan untuk ingat. 617 00:26:59,760 --> 00:27:01,580 Tetapi jika saya lakukan - 618 00:27:01,580 --> 00:27:01,930 mari kita lihat. 619 00:27:01,930 --> 00:27:03,540 Bocor - 620 00:27:03,540 --> 00:27:05,030 Adakah ia bocor - 621 00:27:05,030 --> 00:27:07,580 walaupun saya tidak ingat apa yang ia adalah kira tangan. 622 00:27:07,580 --> 00:27:08,550 >> - Bocor cek sama penuh. 623 00:27:08,550 --> 00:27:10,180 Ya, terima kasih. 624 00:27:10,180 --> 00:27:12,520 - Bocor cek sama penuh. 625 00:27:12,520 --> 00:27:13,800 Enter. 626 00:27:13,800 --> 00:27:14,940 Program yang sama sedang berjalan. 627 00:27:14,940 --> 00:27:16,180 Menaip David lagi. 628 00:27:16,180 --> 00:27:17,660 Sekarang saya melihat sedikit lebih terperinci. 629 00:27:17,660 --> 00:27:20,890 Tetapi di bawah ringkasan timbunan itu, yang adalah sama dengan empat - ah, 630 00:27:20,890 --> 00:27:22,120 ini adalah jenis baik. 631 00:27:22,120 --> 00:27:25,460 Sekarang Valgrind sebenarnya mencari agak sukar dalam kod saya. 632 00:27:25,460 --> 00:27:29,580 Dan ia mengatakan bahawa, nampaknya, malloc di talian - 633 00:27:29,580 --> 00:27:30,580 kita zum keluar. 634 00:27:30,580 --> 00:27:31,980 Pada line - 635 00:27:31,980 --> 00:27:32,930 kita tidak melihat apa garis itu. 636 00:27:32,930 --> 00:27:35,110 Tetapi malloc adalah punca pertama. 637 00:27:35,110 --> 00:27:38,630 Ada satu blog di malloc. 638 00:27:38,630 --> 00:27:39,810 >> Semua betul? 639 00:27:39,810 --> 00:27:40,450 OK, tidak. 640 00:27:40,450 --> 00:27:40,940 Betul? 641 00:27:40,940 --> 00:27:42,520 Saya dipanggil getstring. 642 00:27:42,520 --> 00:27:44,460 getstring nampaknya panggilan malloc. 643 00:27:44,460 --> 00:27:47,800 Jadi apa baris kod nampaknya bersalah kerana 644 00:27:47,800 --> 00:27:49,050 diperuntukkan memori ini? 645 00:27:49,050 --> 00:27:51,560 646 00:27:51,560 --> 00:27:55,540 Mari kita andaikan bahawa sesiapa yang menulis malloc telah wujud cukup lama bahawa ia adalah 647 00:27:55,540 --> 00:27:56,390 bukan kesalahan mereka. 648 00:27:56,390 --> 00:27:57,520 Jadi ia mungkin saya. 649 00:27:57,520 --> 00:28:02,000 getstring dalam cs50.c - supaya satu memfailkan suatu tempat di komputer - 650 00:28:02,000 --> 00:28:05,210 sejajar 286 seolah-olah menjadi pelakunya. 651 00:28:05,210 --> 00:28:08,140 Sekarang mari kita andaikan bahawa cs50 telah sekitar untuk jumlah yang baik masa, jadi 652 00:28:08,140 --> 00:28:09,720 kita juga adalah sempurna. 653 00:28:09,720 --> 00:28:14,080 Dan jadi ia mungkin tidak dalam getstring bug yang terletak, tetapi dalam 654 00:28:14,080 --> 00:28:17,810 talian hello-2.c 18. 655 00:28:17,810 --> 00:28:20,670 >> Jadi mari kita lihat apa garis bahawa 18 adalah. 656 00:28:20,670 --> 00:28:21,130 Oh. 657 00:28:21,130 --> 00:28:27,130 Entah bagaimana baris ini tidak semestinya kereta, per se, tetapi ia adalah sebab 658 00:28:27,130 --> 00:28:28,630 di sebalik itu kebocoran memori. 659 00:28:28,630 --> 00:28:32,140 Jadi super semata-mata, apa yang akan gerak hati menjadi penyelesaian di sini? 660 00:28:32,140 --> 00:28:34,710 Jika kita meminta ingatan, tidak pernah memberi kembali, dan yang seolah-olah menjadi 661 00:28:34,710 --> 00:28:37,940 masalah kerana dari masa ke masa komputer saya mungkin kehabisan ingatan, mungkin lambat 662 00:28:37,940 --> 00:28:42,110 turun, perkara-perkara buruk yang mungkin berlaku, baik, apa penyelesaian yang mudah intuitif? 663 00:28:42,110 --> 00:28:43,140 Hanya memberi kembali. 664 00:28:43,140 --> 00:28:44,770 >> Bagaimana anda membebaskan memori yang? 665 00:28:44,770 --> 00:28:49,970 Nah, bersyukur kerana ia agak mudah hanya menyebut nama percuma. 666 00:28:49,970 --> 00:28:51,260 Dan kita tidak pernah dilakukan sebelum ini. 667 00:28:51,260 --> 00:28:55,890 Tetapi anda pada asasnya boleh berfikir percuma sebagai bertentangan dengan malloc. 668 00:28:55,890 --> 00:28:58,030 bebas adalah bertentangan dengan memperuntukkan ingatan. 669 00:28:58,030 --> 00:28:59,540 Jadi sekarang biarlah saya susun semula ini. 670 00:28:59,540 --> 00:29:02,050 Buat hello-2. 671 00:29:02,050 --> 00:29:04,620 Biar saya berjalan lagi. hello-2 David. 672 00:29:04,620 --> 00:29:07,290 Jadi, ia seolah-olah untuk bekerja di cara yang sama. 673 00:29:07,290 --> 00:29:11,180 Tetapi jika saya kembali ke Valgrind dan jalankan semula bahawa perintah yang sama pada yang baru saya 674 00:29:11,180 --> 00:29:14,720 program disusun, menaip nama saya seperti sebelum ini - 675 00:29:14,720 --> 00:29:15,370 bagus. 676 00:29:15,370 --> 00:29:16,760 Ringkasan Heap - 677 00:29:16,760 --> 00:29:17,740 digunakan pada keluar - 678 00:29:17,740 --> 00:29:19,370 sifar bait dalam blok sifar. 679 00:29:19,370 --> 00:29:21,840 Dan ini adalah super nice, semua blok timbunan telah dibebaskan. 680 00:29:21,840 --> 00:29:23,480 Tiada kebocoran yang mungkin. 681 00:29:23,480 --> 00:29:27,200 >> Jadi datang, bukan dengan Set Masalah 4, tetapi dengan Set Masalah 5, forensik 682 00:29:27,200 --> 00:29:30,740 dan seterusnya, ini juga akan menjadi ukuran kebenaran anda 683 00:29:30,740 --> 00:29:33,630 program, sama ada atau tidak anda mempunyai atau tidak mempunyai kebocoran memori. 684 00:29:33,630 --> 00:29:36,900 Tetapi bersyukur, bukan sahaja anda boleh sebab melalui mereka intuitif, yang 685 00:29:36,900 --> 00:29:40,430 adalah, boleh dikatakan, mudah bagi program kecil tetapi sukar untuk program-program yang lebih besar, 686 00:29:40,430 --> 00:29:43,860 Valgrind, bagi program-program yang lebih besar, boleh membantu anda mengenal pasti 687 00:29:43,860 --> 00:29:45,360 masalah tertentu. 688 00:29:45,360 --> 00:29:47,500 >> Tetapi ada satu masalah lain yang mungkin timbul. 689 00:29:47,500 --> 00:29:51,245 Izinkan saya membuka fail ini di sini, yang adalah, lagi, satu contoh yang agak mudah. 690 00:29:51,245 --> 00:29:53,760 Tetapi mari memberi tumpuan kepada apa program ini tidak. 691 00:29:53,760 --> 00:29:55,190 Ini dipanggil memory.c. 692 00:29:55,190 --> 00:29:58,380 Kami akan hantar ini hari ini kemudian di zip kod sumber hari ini. 693 00:29:58,380 --> 00:30:01,610 Dan notis bahawa saya mempunyai fungsi yang dipanggil f yang tidak mengambil hujah-hujah dan 694 00:30:01,610 --> 00:30:02,800 mengembalikan apa-apa. 695 00:30:02,800 --> 00:30:07,240 Selaras 20, saya nampaknya mengisytiharkan penunjuk kepada int dan memanggilnya x. 696 00:30:07,240 --> 00:30:09,570 Saya memberikan tempat kembali nilai malloc. 697 00:30:09,570 --> 00:30:14,590 Dan hanya untuk menjadi jelas, berapa banyak bait am Saya mungkin mendapat kembali dari malloc 698 00:30:14,590 --> 00:30:17,080 dalam situasi ini? 699 00:30:17,080 --> 00:30:18,040 >> Mungkin 40. 700 00:30:18,040 --> 00:30:18,840 Di manakah anda mendapatkan dari? 701 00:30:18,840 --> 00:30:22,410 Nah, jika anda masih ingat bahawa int adalah sering 4 bait, sekurang-kurangnya ia adalah dalam 702 00:30:22,410 --> 00:30:25,110 perkakas, 10 kali 4 adalah jelas 40. 703 00:30:25,110 --> 00:30:28,920 Jadi malloc adalah kembali alamat sesuatu sebahagian memori dan menyimpan bahawa 704 00:30:28,920 --> 00:30:30,800 menangani akhirnya di x. 705 00:30:30,800 --> 00:30:32,570 Jadi jelas, apa yang kemudian berlaku? 706 00:30:32,570 --> 00:30:34,990 Baiklah, biar saya menukar kembali untuk gambar kami di sini. 707 00:30:34,990 --> 00:30:38,150 Biar saya tidak hanya menarik bahagian bawah saya memori komputer, izinkan saya pergi ke hadapan dan 708 00:30:38,150 --> 00:30:42,990 menarik seluruh segiempat tepat yang mewakili semua RAM saya. 709 00:30:42,990 --> 00:30:44,790 >> Kami akan mengatakan bahawa timbunan adalah di bahagian bawah. 710 00:30:44,790 --> 00:30:47,010 Dan ada satu segmen teks dalam data yang tidak diisytiharkan. 711 00:30:47,010 --> 00:30:49,880 Tetapi saya hanya akan abstrak mereka perkara-perkara lain yang jauh sebagai dot, dot dot. 712 00:30:49,880 --> 00:30:53,470 Saya hanya akan merujuk kepada ini sebagai timbunan itu di atas. 713 00:30:53,470 --> 00:30:57,070 Dan kemudian di bahagian bawah gambar ini, untuk mewakili utama, saya akan 714 00:30:57,070 --> 00:30:59,880 untuk memberikan memori keping dalam timbunan. 715 00:30:59,880 --> 00:31:03,150 Untuk f, saya akan memberikan sepotong memori dalam timbunan. 716 00:31:03,150 --> 00:31:05,140 Sekarang, saya mendapat untuk berunding dengan saya kod sumber lagi. 717 00:31:05,140 --> 00:31:07,170 Apakah pembolehubah tempatan utama? 718 00:31:07,170 --> 00:31:10,710 Rupa-rupanya apa-apa, jadi keping yang berkesan kosong atau tidak sebesar 719 00:31:10,710 --> 00:31:11,600 kerana saya telah disediakan itu. 720 00:31:11,600 --> 00:31:15,730 Tetapi dalam f, saya mempunyai pembolehubah tempatan, yang dipanggil x. 721 00:31:15,730 --> 00:31:20,410 Jadi, saya akan pergi ke hadapan dan memberikan f sebahagian memori, ia memanggil x. 722 00:31:20,410 --> 00:31:24,680 >> Dan kini malloc sebanyak 10 kali 4, Jadi malloc 40, mana yang 723 00:31:24,680 --> 00:31:25,430 memori yang datang dari? 724 00:31:25,430 --> 00:31:27,530 Kami tidak dilukis gambar seperti ini sebelum ini. 725 00:31:27,530 --> 00:31:31,140 Tetapi mari kita andaikan bahawa ia berkesan datang dari sini, jadi satu, 726 00:31:31,140 --> 00:31:33,170 dua, tiga, empat, lima. 727 00:31:33,170 --> 00:31:34,680 Dan sekarang saya perlu 40 ini. 728 00:31:34,680 --> 00:31:37,540 Jadi saya hanya akan melakukan dot, dot, dot mencadangkan bahawa terdapat memori yang lebih 729 00:31:37,540 --> 00:31:39,350 kembali dari timbunan itu. 730 00:31:39,350 --> 00:31:40,710 Sekarang apa yang alamat? 731 00:31:40,710 --> 00:31:42,620 Mari kita sewenang-wenangnya memilih kami menangani seperti biasa - 732 00:31:42,620 --> 00:31:46,310 Ox123, walaupun ia mungkin akan untuk menjadi sesuatu yang berbeza. 733 00:31:46,310 --> 00:31:50,420 Itulah alamat bait yang pertama di memori yang saya meminta malloc untuk. 734 00:31:50,420 --> 00:31:53,630 >> Jadi dalam jangka pendek, garis sekali 20 melaksanakan, apa yang benar-benar 735 00:31:53,630 --> 00:31:57,170 disimpan di dalam x di sini? 736 00:31:57,170 --> 00:31:58,730 Ox123. 737 00:31:58,730 --> 00:32:00,370 Ox123. 738 00:32:00,370 --> 00:32:01,550 Dan Ox itu tidak menarik. 739 00:32:01,550 --> 00:32:03,200 Ia hanya bermakna di sini adalah nombor perenambelasan. 740 00:32:03,200 --> 00:32:06,490 Tetapi apa yang penting ialah apa yang saya telah menyimpan x, yang adalah pembolehubah tempatan. 741 00:32:06,490 --> 00:32:10,260 Tetapi jenis data, sekali lagi, adalah alamat int an. 742 00:32:10,260 --> 00:32:12,710 Well, saya akan menyimpan Ox123. 743 00:32:12,710 --> 00:32:16,610 Tetapi sekali lagi, jika itu terlalu tidak perlu rumit, jika saya menatal 744 00:32:16,610 --> 00:32:21,490 belakang, kita boleh abstrak ini jauh agak munasabah dan hanya mengatakan bahawa x ialah 745 00:32:21,490 --> 00:32:23,910 penunjuk kepada yang sebahagian memori. 746 00:32:23,910 --> 00:32:24,070 >> OK. 747 00:32:24,070 --> 00:32:26,230 Sekarang soalan di tangan adalah seperti berikut - 748 00:32:26,230 --> 00:32:29,910 line 21, ternyata, adalah kereta. 749 00:32:29,910 --> 00:32:31,160 Mengapa? 750 00:32:31,160 --> 00:32:34,890 751 00:32:34,890 --> 00:32:36,930 >> Maaf? 752 00:32:36,930 --> 00:32:38,640 Ia tidak mempunyai - 753 00:32:38,640 --> 00:32:40,390 mengatakan bahawa sekali lagi. 754 00:32:40,390 --> 00:32:41,240 Well, ia tidak percuma. 755 00:32:41,240 --> 00:32:42,350 Jadi itulah kedua tetapi. 756 00:32:42,350 --> 00:32:45,000 Jadi ada satu sama lain tetapi khusus di talian 21. 757 00:32:45,000 --> 00:32:49,480 758 00:32:49,480 --> 00:32:50,040 >> Tepat sekali. 759 00:32:50,040 --> 00:32:54,980 Ini sejajar mudah kod hanya buffer overflow, yang ditakluki buffer. 760 00:32:54,980 --> 00:32:57,050 Penampan A hanya bermakna sebahagian memori. 761 00:32:57,050 --> 00:33:01,520 Tetapi itu sebahagian memori adalah saiz 10, 10 integer, yang bermakna jika kita 762 00:33:01,520 --> 00:33:05,350 indeks ke dalamnya menggunakan gula sintaktik notasi pelbagai, dataran 763 00:33:05,350 --> 00:33:09,220 kurungan, anda mempunyai akses kepada x kurungan 0 x kurungan 1 x, 764 00:33:09,220 --> 00:33:10,390 kurungan dot, dot, dot. 765 00:33:10,390 --> 00:33:13,270 x kurungan 9 adalah yang terbesar. 766 00:33:13,270 --> 00:33:17,680 Jadi, jika saya x kurungan 10, di mana Saya sebenarnya akan dalam ingatan? 767 00:33:17,680 --> 00:33:19,120 >> Nah, jika saya mempunyai 10 int - 768 00:33:19,120 --> 00:33:21,070 mari kita benar-benar menarik semua daripada keluar ini di sini. 769 00:33:21,070 --> 00:33:22,700 Jadi itu adalah lima pertama. 770 00:33:22,700 --> 00:33:24,660 Berikut adalah lima yang lain Ints. 771 00:33:24,660 --> 00:33:29,580 Jadi x kurungan 0 di sini. x kurungan 1 adalah di sini. x kurungan 9 di sini. x kurungan 772 00:33:29,580 --> 00:33:37,960 10 adalah di sini, yang bermakna saya memberitahu, di line 21, komputer untuk meletakkan 773 00:33:37,960 --> 00:33:39,400 beberapa di mana? 774 00:33:39,400 --> 00:33:42,010 Nombor 0 di mana? 775 00:33:42,010 --> 00:33:43,380 Nah, ia adalah 0, ya. 776 00:33:43,380 --> 00:33:45,460 Tetapi hakikat bahawa 0 yang adalah jenis kebetulan. 777 00:33:45,460 --> 00:33:47,140 Ia boleh menjadi nombor 50, untuk semua yang kita peduli. 778 00:33:47,140 --> 00:33:50,480 Tetapi kita cuba untuk meletakkan ia di x kurungan 10, yang mana ini 779 00:33:50,480 --> 00:33:53,700 tanda tanya diambil, yang bukan satu perkara yang baik. 780 00:33:53,700 --> 00:33:57,070 Program ini mungkin sangat baik kemalangan akibat. 781 00:33:57,070 --> 00:33:59,400 >> Sekarang, mari kita pergi ke hadapan dan lihat jika ini adalah, sesungguhnya, apa yang berlaku. 782 00:33:59,400 --> 00:34:02,600 Buat ingatan, kerana fail dipanggil memory.c. 783 00:34:02,600 --> 00:34:05,950 Mari kita pergi ke hadapan dan menjalankan memori program. 784 00:34:05,950 --> 00:34:08,239 Oleh itu, kita bernasib baik, sebenarnya, ia seolah-olah. 785 00:34:08,239 --> 00:34:09,340 Kami bernasib baik. 786 00:34:09,340 --> 00:34:11,060 Tetapi mari kita lihat jika kita kini dikendalikan Valgrind. 787 00:34:11,060 --> 00:34:14,170 Pada pandangan pertama, program saya mungkin seolah-olah menjadi sempurna betul. 788 00:34:14,170 --> 00:34:18,010 Tetapi biarlah saya berjalan Valgrind dengan - Bocor cek sama penuh pada ingatan. 789 00:34:18,010 --> 00:34:20,110 >> Dan sekarang apabila saya berjalan ini - 790 00:34:20,110 --> 00:34:21,030 menarik. 791 00:34:21,030 --> 00:34:26,800 Tidak sah menulis saiz 4 pada line 21 memory.c. 792 00:34:26,800 --> 00:34:29,284 Line 21 memory.c yang mana satu? 793 00:34:29,284 --> 00:34:30,340 Oh, menarik. 794 00:34:30,340 --> 00:34:31,080 Tetapi tunggu. 795 00:34:31,080 --> 00:34:32,389 Saiz 4, apakah yang merujuk kepada? 796 00:34:32,389 --> 00:34:34,969 Saya hanya tidak salah menulis, tetapi ia adalah saiz 4. 797 00:34:34,969 --> 00:34:36,889 Mengapa 4? 798 00:34:36,889 --> 00:34:39,280 Ini kerana ia merupakan int, yang , sekali lagi, empat bait. 799 00:34:39,280 --> 00:34:42,510 Jadi Valgrind terdapat bug yang saya, sambil mengerling ke arah kod saya, tidak. 800 00:34:42,510 --> 00:34:45,040 Dan mungkin TF anda akan atau tidak. 801 00:34:45,040 --> 00:34:48,469 Tetapi apa yang Valgrind pasti mendapati bahawa kita telah membuat kesilapan di sana, walaupun 802 00:34:48,469 --> 00:34:52,719 walaupun kita bernasib baik, dan komputer memutuskan, eh, saya tidak akan kemalangan 803 00:34:52,719 --> 00:34:57,470 hanya kerana anda menyentuh satu bait, satu bernilai int ini memori yang anda tidak 804 00:34:57,470 --> 00:34:58,550 sebenarnya sendiri. 805 00:34:58,550 --> 00:35:00,380 >> Nah, apa lagi yang kereta di sini. 806 00:35:00,380 --> 00:35:01,180 Alamat - 807 00:35:01,180 --> 00:35:03,190 ini adalah alamat yang gila cari dalam perenambelasan. 808 00:35:03,190 --> 00:35:06,890 Itu hanya bermakna suatu tempat di timbunan itu sifar bait selepas blok saiz 40 809 00:35:06,890 --> 00:35:07,620 diperuntukkan. 810 00:35:07,620 --> 00:35:10,610 Biar saya zum di sini dan lihat jika ini adalah sedikit lebih membantu. 811 00:35:10,610 --> 00:35:11,410 Menarik. 812 00:35:11,410 --> 00:35:15,600 40 bytes pasti hilang kehilangan rekod 1 daripada 1. 813 00:35:15,600 --> 00:35:17,840 Sekali lagi, banyak kata-kata daripada yang berguna di sini. 814 00:35:17,840 --> 00:35:21,350 Tetapi berdasarkan garis diserlahkan, di mana perlu saya mungkin memberi tumpuan saya 815 00:35:21,350 --> 00:35:24,070 perhatian untuk bug yang lain? 816 00:35:24,070 --> 00:35:26,570 Kelihatan seperti line 20 daripada memory.c. 817 00:35:26,570 --> 00:35:30,990 >> Jadi, jika kita kembali ke garisan 20, itulah salah satu yang anda pasti lebih awal. 818 00:35:30,990 --> 00:35:33,030 Dan ia tidak semestinya kereta. 819 00:35:33,030 --> 00:35:35,160 Tetapi kita ini berubah kesannya. 820 00:35:35,160 --> 00:35:38,790 Jadi bagaimana saya boleh membetulkan sekurang-kurangnya salah satu kesilapan? 821 00:35:38,790 --> 00:35:42,240 Apa yang saya boleh lakukan selepas line 21? 822 00:35:42,240 --> 00:35:47,110 Saya boleh lakukan bebas daripada x, begitu juga untuk memberi kembali memori itu. 823 00:35:47,110 --> 00:35:49,230 Dan bagaimana saya boleh membaiki bug ini? 824 00:35:49,230 --> 00:35:52,120 Saya pasti akan pergi tidak jauh daripada 0. 825 00:35:52,120 --> 00:35:53,670 Jadi biarlah saya cuba lari semula ini. 826 00:35:53,670 --> 00:35:56,080 Maaf, pasti pergi tidak jauh daripada 9. 827 00:35:56,080 --> 00:35:57,510 Buat ingatan. 828 00:35:57,510 --> 00:36:00,650 Izinkan saya jalankan Valgrind dalam tetingkap yang lebih besar. 829 00:36:00,650 --> 00:36:01,580 Dan kini melihat. 830 00:36:01,580 --> 00:36:02,250 Nice. 831 00:36:02,250 --> 00:36:03,270 Semua blok timbunan telah dibebaskan. 832 00:36:03,270 --> 00:36:04,270 Tiada kebocoran yang mungkin. 833 00:36:04,270 --> 00:36:07,520 Dan sehingga di atas di sini, tidak ada menyebut apa-apa lagi hak yang sah. 834 00:36:07,520 --> 00:36:09,820 >> Hanya untuk mendapatkan tamak, dan mari melihat jika demonstrasi lain 835 00:36:09,820 --> 00:36:11,050 tidak pergi seperti yang dirancang - 836 00:36:11,050 --> 00:36:12,560 Saya bernasib baik masa lalu. 837 00:36:12,560 --> 00:36:15,530 Dan hakikat bahawa ini adalah 0 mungkin tidak perlu mengelirukan. 838 00:36:15,530 --> 00:36:20,650 Mari kita hanya melakukan 50, yang agak sewenang-wenangnya nombor, membuat dot slash memori memori - 839 00:36:20,650 --> 00:36:21,410 masih mendapat bertuah. 840 00:36:21,410 --> 00:36:22,510 Tiada apa-apa yang terhempas. 841 00:36:22,510 --> 00:36:26,150 Katakan saya hanya melakukan sesuatu yang benar-benar bodoh, dan saya 100. 842 00:36:26,150 --> 00:36:30,360 Biar saya membentuk semula ingatan, dot slash memori - 843 00:36:30,360 --> 00:36:31,075 bernasib baik lagi. 844 00:36:31,075 --> 00:36:32,800 Bagaimana kira-kira 1,000? 845 00:36:32,800 --> 00:36:35,370 Ints luar, kira-kira, di mana saya perlu? 846 00:36:35,370 --> 00:36:37,410 Buat ingatan - 847 00:36:37,410 --> 00:36:38,570 sialan. 848 00:36:38,570 --> 00:36:39,920 >> [Ketawa] 849 00:36:39,920 --> 00:36:41,270 >> OK. 850 00:36:41,270 --> 00:36:43,920 Mari kita tidak kucar-kacir di sekeliling lagi. 851 00:36:43,920 --> 00:36:45,120 Memutarkan ingatan. 852 00:36:45,120 --> 00:36:45,840 Ada kita pergi. 853 00:36:45,840 --> 00:36:46,410 Baiklah. 854 00:36:46,410 --> 00:36:52,500 Jadi nampaknya anda indeks 100,000 Ints di luar di mana anda perlu telah 855 00:36:52,500 --> 00:36:54,410 ingatan, perkara-perkara buruk berlaku. 856 00:36:54,410 --> 00:36:56,430 Jadi ini adalah jelas tidak a, kaedah cepat keras. 857 00:36:56,430 --> 00:36:58,190 Saya adalah jenis menggunakan percubaan dan kesilapan untuk sampai ke sana. 858 00:36:58,190 --> 00:37:02,230 Tetapi ini adalah kerana, cerita panjang pendek, memori komputer anda juga dibahagikan 859 00:37:02,230 --> 00:37:03,580 ke dalam perkara-perkara yang dipanggil segmen. 860 00:37:03,580 --> 00:37:07,260 Dan kadang-kadang, komputer sebenarnya telah memberikan anda memori yang lebih sedikit 861 00:37:07,260 --> 00:37:08,400 daripada apa yang anda meminta. 862 00:37:08,400 --> 00:37:12,170 Tetapi bagi kecekapan, ia hanya lebih mudah untuk mendapatkan memori yang lebih tetapi hanya memberitahu anda 863 00:37:12,170 --> 00:37:13,780 bahawa anda mendapat sebahagian daripada itu. 864 00:37:13,780 --> 00:37:16,370 >> Dan jika anda bernasib baik kadang-kadang, oleh itu, anda mungkin boleh menyentuh 865 00:37:16,370 --> 00:37:17,795 memori yang bukan milik anda. 866 00:37:17,795 --> 00:37:21,860 Anda tidak mempunyai jaminan bahawa apa nilai anda diletakkan di sana akan tinggal di sana, kerana 867 00:37:21,860 --> 00:37:25,080 komputer masih berpendapat ia bukan anda, tetapi ia tidak semestinya akan 868 00:37:25,080 --> 00:37:29,910 untuk mencapai satu lagi segmen memori dalam komputer dan menyebabkan kesilapan seperti 869 00:37:29,910 --> 00:37:31,710 yang satu ini di sini. 870 00:37:31,710 --> 00:37:32,060 Baiklah. 871 00:37:32,060 --> 00:37:37,240 Mana-mana soalan-soalan maka pada ingatan? 872 00:37:37,240 --> 00:37:37,590 >> Baiklah. 873 00:37:37,590 --> 00:37:40,610 Mari kita lihat di sini, maka, pada sesuatu yang kita telah mengambil untuk 874 00:37:40,610 --> 00:37:48,361 diberikan untuk tempoh yang agak lama, yang adalah dalam fail ini dipanggil cs50.h. 875 00:37:48,361 --> 00:37:49,420 Jadi ini adalah fail. 876 00:37:49,420 --> 00:37:51,130 Ini hanya sejumlah komen ke atas. 877 00:37:51,130 --> 00:37:53,900 Dan anda mungkin telah melihat ini jika anda mencucuk seluruh perkakas. 878 00:37:53,900 --> 00:37:57,000 Tetapi ternyata bahawa sepanjang masa, apabila kita digunakan untuk menggunakan tali sebagai 879 00:37:57,000 --> 00:38:01,130 sinonim, cara-cara yang kita diisytiharkan yang sinonim adalah dengan ini 880 00:38:01,130 --> 00:38:03,990 kata kunci typedef, untuk definisi jenis. 881 00:38:03,990 --> 00:38:07,500 Dan kami pada dasarnya berkata, membuat rentetan sinonim untuk bintang char. 882 00:38:07,500 --> 00:38:11,190 Itulah cara dengan mana timbunan dicipta ini roda latihan yang dikenali sebagai 883 00:38:11,190 --> 00:38:12,040 tali. 884 00:38:12,040 --> 00:38:14,830 >> Sekarang di sini hanya prototaip untuk getchar. 885 00:38:14,830 --> 00:38:17,350 Kita mungkin telah melihat sebelum ini, tetapi itu sesungguhnya apa yang ia. getchar 886 00:38:17,350 --> 00:38:19,070 tidak mengambil hujah-hujah, mengembalikan char. 887 00:38:19,070 --> 00:38:21,340 getdouble tidak mengambil hujah-hujah, mengembalikan dua kali. 888 00:38:21,340 --> 00:38:24,440 getfloat tidak mengambil hujah-hujah, pulangan yang terapung, dan sebagainya. 889 00:38:24,440 --> 00:38:27,270 getint adalah di sini. getlonglong adalah di sini. 890 00:38:27,270 --> 00:38:28,820 Dan getstring adalah di sini. 891 00:38:28,820 --> 00:38:29,420 Dan itu sahaja. 892 00:38:29,420 --> 00:38:33,080 Ini sejajar ungu adalah prapemproses lain arahan kerana 893 00:38:33,080 --> 00:38:35,550 hashtag pada awal itu. 894 00:38:35,550 --> 00:38:35,870 >> Baiklah. 895 00:38:35,870 --> 00:38:38,380 Jadi sekarang biarlah saya pergi ke cs50.c. 896 00:38:38,380 --> 00:38:40,400 Dan kita tidak akan bercakap terlalu lama mengenai perkara ini. 897 00:38:40,400 --> 00:38:43,280 Tetapi untuk memberi anda gambaran tentang apa yang telah berlaku semua ini 898 00:38:43,280 --> 00:38:46,434 masa, izinkan saya pergi ke - 899 00:38:46,434 --> 00:38:48,250 mari kita buat getchar. 900 00:38:48,250 --> 00:38:51,050 Jadi getchar kebanyakannya komen. 901 00:38:51,050 --> 00:38:52,060 Tetapi ia kelihatan seperti ini. 902 00:38:52,060 --> 00:38:54,800 Jadi ini adalah fungsi sebenar getchar yang kita telah 903 00:38:54,800 --> 00:38:56,055 mengambil untuk diberikan wujud. 904 00:38:56,055 --> 00:38:59,370 Dan walaupun kita tidak menggunakan satu ini yang sering, jika pernah, ia sekurang-kurangnya 905 00:38:59,370 --> 00:39:00,470 agak mudah. 906 00:39:00,470 --> 00:39:02,580 Jadi ia adalah bernilai mengambil melihat cepat di sini. 907 00:39:02,580 --> 00:39:06,540 >> Jadi getchar mempunyai gelung tak terhingga, sengaja jadi nampaknya. 908 00:39:06,540 --> 00:39:10,050 Ia kemudian memanggil - dan ini adalah jenis semula nice kod kita sendiri menulis. 909 00:39:10,050 --> 00:39:11,220 Ia memerlukan getstring. 910 00:39:11,220 --> 00:39:12,460 Kerana apa yang ia bermakna untuk mendapatkan char? 911 00:39:12,460 --> 00:39:14,730 Nah, anda mungkin juga cuba untuk mendapatkan garis keseluruhan teks daripada pengguna dan 912 00:39:14,730 --> 00:39:16,940 kemudian hanya melihat satu mereka watak-watak. 913 00:39:16,940 --> 00:39:19,170 Selaras 60, di sini adalah sedikit sedikit cek kewarasan. 914 00:39:19,170 --> 00:39:21,610 Jika getstring kembali batal, jangan teruskan. 915 00:39:21,610 --> 00:39:22,820 Sesuatu telah berlaku. 916 00:39:22,820 --> 00:39:28,120 >> Sekarang ini adalah agak menjengkelkan tetapi konvensional C. char max mungkin 917 00:39:28,120 --> 00:39:29,960 mewakili apa sahaja berdasarkan namanya? 918 00:39:29,960 --> 00:39:31,670 Ia adalah satu yang berterusan. 919 00:39:31,670 --> 00:39:36,040 Ia seperti nilai angka yang terbesar char anda boleh mewakili dengan 920 00:39:36,040 --> 00:39:40,370 satu gigitan, yang mungkin bilangan 255, yang merupakan bilangan terbesar anda 921 00:39:40,370 --> 00:39:42,720 mewakili lapan bit, bermula dari sifar. 922 00:39:42,720 --> 00:39:47,460 Jadi saya telah menggunakan ini, dalam fungsi ini, apabila menulis kod ini, hanya kerana 923 00:39:47,460 --> 00:39:51,753 jika ada masalah dalam getchar tetapi tujuan dalam hidup adalah untuk mengembalikan 924 00:39:51,753 --> 00:39:54,830 char, anda perlu entah bagaimana dapat untuk memberi isyarat kepada pengguna yang 925 00:39:54,830 --> 00:39:55,840 sesuatu yang tidak kena. 926 00:39:55,840 --> 00:39:56,970 Kita tidak boleh kembali null. 927 00:39:56,970 --> 00:39:58,480 Ia ternyata bahawa batal adalah penunjuk. 928 00:39:58,480 --> 00:40:01,030 Dan sekali lagi, getchar mempunyai untuk mengembalikan char. 929 00:40:01,030 --> 00:40:04,760 >> Jadi konvensyen itu, jika ada salah, adalah anda, programmer, atau dalam 930 00:40:04,760 --> 00:40:08,160 kes ini, saya dengan perpustakaan, saya terpaksa yang hanya membuat keputusan sewenang-wenangnya, jika 931 00:40:08,160 --> 00:40:12,230 ada masalah, saya akan kembali nombor 255, yang benar-benar 932 00:40:12,230 --> 00:40:17,240 bermakna kita boleh tidak, pengguna tidak boleh menaip watak yang diwakili oleh 933 00:40:17,240 --> 00:40:21,410 nombor 255 kerana kita mempunyai mencuri sebagai nilai pengawal yang dipanggil untuk 934 00:40:21,410 --> 00:40:23,410 mewakili satu masalah. 935 00:40:23,410 --> 00:40:27,010 Kini ia ternyata bahawa watak 255 bukan sesuatu yang anda boleh menaip pada 936 00:40:27,010 --> 00:40:28,380 keyboard anda, jadi ia tiada masalah besar. 937 00:40:28,380 --> 00:40:30,910 Pengguna tidak menyedari bahawa Saya telah dicuri watak ini. 938 00:40:30,910 --> 00:40:34,620 Tetapi jika anda pernah melihat di muka surat lelaki pada sistem komputer beberapa rujukan kepada 939 00:40:34,620 --> 00:40:38,560 semua topi yang berterusan seperti ini yang berkata, dalam kes-kes kesilapan kekuatan ini berterusan 940 00:40:38,560 --> 00:40:42,720 dikembalikan, itu beberapa manusia tidak tahun lalu telah sewenang-wenangnya membuat keputusan untuk 941 00:40:42,720 --> 00:40:45,680 kembali nilai ini khas dan memanggilnya yang berterusan dalam kes 942 00:40:45,680 --> 00:40:46,840 sesuatu berlaku. 943 00:40:46,840 --> 00:40:48,580 >> Sekarang keajaiban berlaku di sini. 944 00:40:48,580 --> 00:40:52,600 Pertama, saya mengisytiharkan di talian 67 dua watak, C1 dan C2. 945 00:40:52,600 --> 00:40:57,080 Dan kemudian dalam talian 68, ada sebenarnya garis kod itu mengingatkan 946 00:40:57,080 --> 00:41:01,140 kawan kita printf, memandangkan ia tidak mempunyai peratus Cs dalam petikan. 947 00:41:01,140 --> 00:41:06,490 Tetapi melihat apa yang berlaku di sini. sscanf bermakna imbasan rentetan - 948 00:41:06,490 --> 00:41:11,690 bermakna mengimbas format tali, sscanf ergo. 949 00:41:11,690 --> 00:41:12,590 Apa maksudnya? 950 00:41:12,590 --> 00:41:16,310 Ia bermakna anda lulus untuk sscanf rentetan. 951 00:41:16,310 --> 00:41:18,420 Dan garis adalah apa sahaja jenis pengguna masuk 952 00:41:18,420 --> 00:41:23,520 Anda berpindah kepada sscanf rentetan format seperti ini yang memberitahu scanf apakah 953 00:41:23,520 --> 00:41:25,870 anda berharap pengguna telah ditaip masuk 954 00:41:25,870 --> 00:41:29,730 Anda kemudian lulus dalam alamat dua ketulan ingatan, dalam kes ini, 955 00:41:29,730 --> 00:41:31,150 kerana saya mempunyai dua ruang letak. 956 00:41:31,150 --> 00:41:34,610 Jadi, saya akan memberikan alamat C1 dan alamat C2. 957 00:41:34,610 --> 00:41:37,700 >> Dan ingat bahawa anda memberi fungsi yang alamat beberapa berubah-ubah, apa yang 958 00:41:37,700 --> 00:41:38,950 implikasi? 959 00:41:38,950 --> 00:41:41,400 960 00:41:41,400 --> 00:41:45,050 Apa yang boleh melakukan fungsi yang hasilnya daripada memberikan alamat yang 961 00:41:45,050 --> 00:41:48,170 berubah-ubah, yang bertentangan dengan berubah-ubah itu sendiri? 962 00:41:48,170 --> 00:41:49,450 Ia boleh mengubahnya, betul? 963 00:41:49,450 --> 00:41:53,250 Jika anda mempunyai seseorang peta untuk fizikal alamat, mereka boleh pergi ke sana dan melakukan 964 00:41:53,250 --> 00:41:54,750 apa sahaja yang mereka mahu di alamat itu. 965 00:41:54,750 --> 00:41:55,800 Idea yang sama di sini. 966 00:41:55,800 --> 00:41:59,950 Jika kita lulus untuk sscanf, alamat dua ketulan ingatan, walaupun ini kecil 967 00:41:59,950 --> 00:42:03,585 ketulan sedikit memori, C1 dan C2, tetapi kita beritahu alamat mereka, 968 00:42:03,585 --> 00:42:05,170 sscanf boleh mengubahnya. 969 00:42:05,170 --> 00:42:08,530 >> Jadi tujuan sscanf dalam kehidupan, jika kita membaca halaman lelaki itu, adalah untuk membaca apa yang 970 00:42:08,530 --> 00:42:13,420 pengguna ditaip dalam, berharap untuk pengguna yang mempunyai ditaip dalam watak dan mungkin 971 00:42:13,420 --> 00:42:16,470 watak lain, dan apa yang turun ditaip, watak pertama pergi 972 00:42:16,470 --> 00:42:19,310 di sini, watak kedua pergi di sini. 973 00:42:19,310 --> 00:42:22,470 Kini, sebagai diketepikan, ini, dan anda akan hanya tahu ini daripada dokumentasi, 974 00:42:22,470 --> 00:42:25,570 hakikat bahawa saya meletakkan ruang kosong terdapat hanya bermaksud bahawa saya tidak peduli jika 975 00:42:25,570 --> 00:42:28,440 pengguna hits bar Space beberapa kali sebelum dia mengambil 976 00:42:28,440 --> 00:42:30,400 watak, saya akan mengabaikan mana-mana ruang putih. 977 00:42:30,400 --> 00:42:32,510 Jadi, saya tahu dari dokumentasi. 978 00:42:32,510 --> 00:42:36,570 >> Hakikat bahawa terdapat% c kedua diikuti dengan ruang putih sebenarnya 979 00:42:36,570 --> 00:42:37,410 sengaja. 980 00:42:37,410 --> 00:42:41,190 Saya mahu dapat mengesan jika pengguna diskru atau tidak bekerjasama. 981 00:42:41,190 --> 00:42:45,630 Jadi saya berharap bahawa pengguna hanya ditaip dalam satu watak, oleh itu saya berharap 982 00:42:45,630 --> 00:42:50,640 sscanf yang hanya akan kembali nilai 1 kerana, sekali lagi, jika saya membaca 983 00:42:50,640 --> 00:42:55,400 dokumentasi, tujuan sscanf dalam hidup adalah untuk kembali kepada bilangan 984 00:42:55,400 --> 00:42:59,170 pembolehubah yang telah diisi dengan input pengguna. 985 00:42:59,170 --> 00:43:02,270 >> Saya lulus dalam dua pembolehubah alamat, C1 dan C2. 986 00:43:02,270 --> 00:43:06,420 Saya berharap, walaupun, bahawa hanya satu daripada mereka mendapat dibunuh kerana jika sscanf 987 00:43:06,420 --> 00:43:11,130 pulangan 2, apa yang mungkin implikasi logik? 988 00:43:11,130 --> 00:43:14,600 Bahawa pengguna tidak hanya memberi saya satu watak seperti saya memberitahu dia atau dia. 989 00:43:14,600 --> 00:43:17,860 Mereka mungkin ditaip pada kurangnya dua watak-watak. 990 00:43:17,860 --> 00:43:22,430 Jadi jika saya bukannya tidak mempunyai kedua % C, saya hanya mempunyai satu, yang 991 00:43:22,430 --> 00:43:25,370 terus terang akan lebih intuitif pendekatan, saya fikir pandangan pertama, 992 00:43:25,370 --> 00:43:30,220 anda tidak akan dapat mengesan jika pengguna telah memberikan anda lebih 993 00:43:30,220 --> 00:43:31,780 input daripada anda benar-benar mahu. 994 00:43:31,780 --> 00:43:34,100 Jadi ini adalah satu bentuk tersirat daripada pemeriksaan kesilapan. 995 00:43:34,100 --> 00:43:35,640 >> Tetapi melihat apa yang saya lakukan di sini. 996 00:43:35,640 --> 00:43:39,970 Setelah saya yakin bahawa pengguna memberikan aku satu watak, saya membebaskan baris, melakukan 997 00:43:39,970 --> 00:43:44,450 bertentangan dengan getstring, yang seterusnya menggunakan malloc, dan kemudian saya kembali 998 00:43:44,450 --> 00:43:51,030 C1, watak yang saya berharap pengguna yang disediakan dan hanya disediakan. 999 00:43:51,030 --> 00:43:54,680 Jadi cepat celah sahaja, tetapi sebarang pertanyaan mengenai getchar? 1000 00:43:54,680 --> 00:43:57,450 1001 00:43:57,450 --> 00:43:59,590 Kita akan kembali kepada beberapa orang lain. 1002 00:43:59,590 --> 00:44:03,770 >> Baiklah, biar saya pergi ke hadapan dan melakukan ini - rasa sekarang, hanya untuk memberi motivasi kepada kami 1003 00:44:03,770 --> 00:44:08,910 perbincangan dalam seminggu dengan masa, ini adalah fail yang dipanggil structs.h. 1004 00:44:08,910 --> 00:44:11,440 Dan sekali lagi, ini adalah hanya rasa sesuatu yang menanti. 1005 00:44:11,440 --> 00:44:13,090 Tetapi notis bahawa banyak ini adalah komen. 1006 00:44:13,090 --> 00:44:17,440 Jadi biarlah saya hanya menyerlahkan bahagian yang menarik buat masa sekarang. 1007 00:44:17,440 --> 00:44:18,020 typedef - 1008 00:44:18,020 --> 00:44:19,700 ada kata kunci yang sama sekali lagi. 1009 00:44:19,700 --> 00:44:23,100 typedef kita gunakan untuk mengisytiharkan tali sebagai jenis data khas. 1010 00:44:23,100 --> 00:44:27,490 Anda boleh menggunakan typedef untuk mewujudkan jenama baru jenis data yang tidak wujud apabila 1011 00:44:27,490 --> 00:44:28,570 C dicipta. 1012 00:44:28,570 --> 00:44:32,520 Sebagai contoh, int datang dengan C. char datang dengan C. dua datang dengan C. Tetapi 1013 00:44:32,520 --> 00:44:34,000 tidak ada tanggapan pelajar. 1014 00:44:34,000 --> 00:44:37,230 Dan lagi ia akan menjadi agak berguna untuk dapat menulis satu program yang menyimpan 1015 00:44:37,230 --> 00:44:40,440 dalam pembolehubah, nombor ID pelajar, nama mereka, dan rumah mereka. 1016 00:44:40,440 --> 00:44:42,890 Dalam erti kata lain, tiga keping data, seperti yang int dan 1017 00:44:42,890 --> 00:44:44,420 tali dan tali yang lain. 1018 00:44:44,420 --> 00:44:48,220 >> Dengan typedef, apa yang cukup kuat tentang perkara ini dan sturct kata kunci untuk 1019 00:44:48,220 --> 00:44:53,660 struktur, anda, pengaturcara pada tahun 2013, sebenarnya boleh menentukan sendiri anda 1020 00:44:53,660 --> 00:44:57,530 jenis data yang tidak wujud tahun lalu tetapi yang sesuai dengan tujuan anda. 1021 00:44:57,530 --> 00:45:01,910 Dan sebagainya di sini, dalam barisan 13 hingga 19, kami mengisytiharkan jenis data baru, seperti 1022 00:45:01,910 --> 00:45:04,320 an int, tetapi ia memanggil pelajar. 1023 00:45:04,320 --> 00:45:09,310 Dan dalam pembolehubah ini akan ada tiga perkara - an int, tali, 1024 00:45:09,310 --> 00:45:09,930 dan rentetan. 1025 00:45:09,930 --> 00:45:13,040 Jadi, anda boleh berfikir tentang apa yang benar-benar berlaku di sini, walaupun ini adalah satu 1026 00:45:13,040 --> 00:45:17,160 sedikit memudahkan untuk hari ini, pelajar pada asasnya akan 1027 00:45:17,160 --> 00:45:19,450 untuk kelihatan seperti ini. 1028 00:45:19,450 --> 00:45:22,580 Yang akan menjadi sebahagian daripada memori dengan ID, nama 1029 00:45:22,580 --> 00:45:25,580 bidang dan bidang rumah. 1030 00:45:25,580 --> 00:45:30,670 Dan kita akan dapat menggunakan mereka ketulan memori dan akses mereka seperti berikut. 1031 00:45:30,670 --> 00:45:38,870 >> Jika saya pergi ke struct0.c, di sini adalah agak lama, tetapi selepas 1032 00:45:38,870 --> 00:45:42,630 corak, kod yang menggunakan helah baru ini. 1033 00:45:42,630 --> 00:45:45,790 Jadi pertama, izinkan saya menarik perhatian anda ke bahagian-bahagian yang menarik sehingga atas. 1034 00:45:45,790 --> 00:45:49,670 Sharp mentakrifkan pelajar 3, mengisytiharkan berterusan dipanggil pelajar dan penerima serah hak 1035 00:45:49,670 --> 00:45:53,450 ia sewenang-wenangnya nombor 3, hanya jadi saya mempunyai tiga pelajar yang menggunakan 1036 00:45:53,450 --> 00:45:54,830 program ini buat masa ini. 1037 00:45:54,830 --> 00:45:55,960 Di sini datang Utama. 1038 00:45:55,960 --> 00:45:58,860 Dan notis, bagaimana saya mengaku pelbagai pelajar? 1039 00:45:58,860 --> 00:46:00,480 Well, saya hanya menggunakan sintaks yang sama. 1040 00:46:00,480 --> 00:46:02,110 Pelajar perkataan jelas baru. 1041 00:46:02,110 --> 00:46:04,790 Tetapi pelajar, kelas, pelajar kurungan. 1042 00:46:04,790 --> 00:46:06,720 >> Lebih malang lagi ada banyak penggunaan semula syarat-syarat di sini. 1043 00:46:06,720 --> 00:46:07,660 Ini hanya nombor. 1044 00:46:07,660 --> 00:46:09,040 Jadi ini adalah seperti mengatakan tiga. 1045 00:46:09,040 --> 00:46:11,430 Kelas hanya apa yang saya mahu untuk memanggil pembolehubah. 1046 00:46:11,430 --> 00:46:12,840 Saya boleh memanggilnya pelajar. 1047 00:46:12,840 --> 00:46:15,880 Tetapi kelas, ini bukan kelas dalam berorientasikan objek jenis Java cara. 1048 00:46:15,880 --> 00:46:17,220 Ia hanya satu kelas pelajar. 1049 00:46:17,220 --> 00:46:20,590 Dan jenis data bagi setiap elemen dalam barisan yang pelajar. 1050 00:46:20,590 --> 00:46:23,040 Jadi, ini adalah sedikit berbeza dan dari berkata sesuatu 1051 00:46:23,040 --> 00:46:25,250 seperti ini, ia hanya - 1052 00:46:25,250 --> 00:46:29,500 Saya katakan memberi saya tiga pelajar dan memanggil kelas array. 1053 00:46:29,500 --> 00:46:29,800 >> Baiklah. 1054 00:46:29,800 --> 00:46:30,680 Sekarang di sini adalah empat gelung. 1055 00:46:30,680 --> 00:46:33,480 Biasa ini lelaki ini - Itekadar dari sifar pada sehingga tiga. 1056 00:46:33,480 --> 00:46:35,160 Dan di sini adalah sekeping baru sintaksis. 1057 00:46:35,160 --> 00:46:37,710 Program ini akan mendorong saya, manusia, untuk memberikan pelajar 1058 00:46:37,710 --> 00:46:39,200 ID, yang int an. 1059 00:46:39,200 --> 00:46:44,650 Dan di sini adalah sintaks yang anda boleh menyimpan sesuatu dalam bidang ID di 1060 00:46:44,650 --> 00:46:48,630 lokasi kelas kurungan I. Jadi sintaks ini bukanlah sesuatu yang baru. 1061 00:46:48,630 --> 00:46:51,450 Ini hanya bermaksud memberi saya kelapan pelajar di dalam kelas. 1062 00:46:51,450 --> 00:46:52,940 Tetapi simbol ini adalah baru. 1063 00:46:52,940 --> 00:46:56,320 Sehingga kini, kita masih tidak boleh digunakan dot, sekurang-kurangnya dalam kod seperti ini. 1064 00:46:56,320 --> 00:47:01,490 Ini bermakna pergi ke struct yang dikenali sebagai seorang pelajar dan meletakkan sesuatu di sana. 1065 00:47:01,490 --> 00:47:05,670 Begitu juga, di dalam bidang ini akan datang, 31, pergi hadapan dan meletakkan apa sahaja jenis pengguna 1066 00:47:05,670 --> 00:47:10,530 nama di sini dan apa yang mereka lakukan untuk rumah, perkara yang sama, pergi ke hadapan dan 1067 00:47:10,530 --> 00:47:13,230 memasukkannya ke dalam. rumah. 1068 00:47:13,230 --> 00:47:15,955 >> Jadi apakah program ini akhirnya lakukan? 1069 00:47:15,955 --> 00:47:17,220 Anda boleh melihat penggoda sedikit di sana. 1070 00:47:17,220 --> 00:47:24,780 Biar saya pergi ke hadapan dan jangan membuat structs 0 dot slash struct 0, ID pelajar 1, 1071 00:47:24,780 --> 00:47:28,250 mengatakan David Mather, pelajar ID 2. 1072 00:47:28,250 --> 00:47:32,070 Rob Kirkland, pelajar ID 3. 1073 00:47:32,070 --> 00:47:35,010 Lauren Leverit - 1074 00:47:35,010 --> 00:47:38,380 dan satu-satunya program ini lakukan, yang hanya benar-benar sewenang-wenangnya, adalah 1075 00:47:38,380 --> 00:47:40,980 Saya mahu melakukan sesuatu dengan data ini, sekarang bahawa saya telah mengajar kita bagaimana untuk 1076 00:47:40,980 --> 00:47:43,450 menggunakan structs, adalah Saya hanya mempunyai gelung tambahan ini di sini. 1077 00:47:43,450 --> 00:47:45,260 Saya melelar atas pelbagai pelajar. 1078 00:47:45,260 --> 00:47:49,170 Saya pernah, kawan mungkin kini biasa kita, rentetan membandingkan, stircomp untuk 1079 00:47:49,170 --> 00:47:53,780 cek rumah pelajar ke-8 ini sama dengan Mather? 1080 00:47:53,780 --> 00:47:56,760 Dan jika demikian, hanya mencetak sesuatu sewenang-wenangnya suka, ya, ia adalah. 1081 00:47:56,760 --> 00:47:59,430 Tetapi sekali lagi, hanya memberi saya peluang untuk digunakan dan mengguna semula dan 1082 00:47:59,430 --> 00:48:02,270 semula notasi titik baru ini. 1083 00:48:02,270 --> 00:48:03,250 >> Jadi siapa yang peduli, betul? 1084 00:48:03,250 --> 00:48:06,270 Datang dengan program pelajar agak sewenang-wenangnya, tetapi ternyata 1085 00:48:06,270 --> 00:48:09,800 bahawa kita boleh melakukan perkara-perkara yang berguna dengan ini, sebagai contoh seperti berikut. 1086 00:48:09,800 --> 00:48:14,600 Ini adalah struct yang lebih rumit di C. Ia mempunyai sedozen atau lebih bidang, 1087 00:48:14,600 --> 00:48:15,880 agak cryptically dinamakan. 1088 00:48:15,880 --> 00:48:20,110 Tetapi jika anda pernah mendengar tentang grafik format fail dipanggil bitmap, BMP, ia 1089 00:48:20,110 --> 00:48:22,830 ternyata bahawa format fail bitmap cukup banyak kelihatan seperti ini. 1090 00:48:22,830 --> 00:48:24,200 Ia adalah satu Smiley sedikit muka bodoh. 1091 00:48:24,200 --> 00:48:27,840 Ia adalah satu imej kecil yang saya telah dizum dalam pada yang agak besar supaya saya dapat melihat setiap 1092 00:48:27,840 --> 00:48:30,410 daripada titik individu atau piksel. 1093 00:48:30,410 --> 00:48:33,800 Kini, ternyata kita boleh mewakili titik hitam dengan, katakan, nombor 0. 1094 00:48:33,800 --> 00:48:35,520 Dan titik putih dengan nombor 1. 1095 00:48:35,520 --> 00:48:39,140 >> Jadi, dalam erti kata lain, jika anda mahu untuk menarik Muka senyum dan menyelamatkan bahawa imej dalam 1096 00:48:39,140 --> 00:48:42,680 komputer, ia mencukupi untuk menyimpan sifar dan orang-orang yang kelihatan seperti ini, di mana, 1097 00:48:42,680 --> 00:48:45,250 sekali lagi, orang-orang yang putih dan sifar adalah hitam. 1098 00:48:45,250 --> 00:48:48,290 Dan bersama-sama, jika anda berkesan mempunyai yang menyandang orang yang dan sifar, anda mempunyai 1099 00:48:48,290 --> 00:48:51,030 grid piksel, dan jika anda meletakkan mereka keluar, anda mempunyai yang comel 1100 00:48:51,030 --> 00:48:52,560 sedikit Smiley muka. 1101 00:48:52,560 --> 00:48:58,150 Sekarang, format fail bitmap, BMP, adalah berkesan bahawa di bawah hud, 1102 00:48:58,150 --> 00:49:00,970 tetapi dengan lebih banyak piksel pemabuk yang anda sebenarnya boleh mewakili warna. 1103 00:49:00,970 --> 00:49:05,170 >> Tetapi apabila anda mempunyai yang lebih canggih format fail seperti BMP dan JPEG dan GIF 1104 00:49:05,170 --> 00:49:09,360 yang anda mungkin biasa, orang-orang fail pada cakera biasanya tidak hanya 1105 00:49:09,360 --> 00:49:13,760 mempunyai sifar dan orang-orang untuk piksel, tetapi mereka mempunyai beberapa metadata juga - 1106 00:49:13,760 --> 00:49:16,960 meta dalam erti kata bahawa tidak benar-benar data tetapi ia berguna untuk mempunyai. 1107 00:49:16,960 --> 00:49:21,370 Jadi bidang ini di sini membayangkan, dan kita akan melihat perkara ini dengan lebih terperinci dalam P-set 1108 00:49:21,370 --> 00:49:25,810 5, yang sebelum sifar dan orang-orang yang mewakili piksel dalam imej, 1109 00:49:25,810 --> 00:49:29,110 ada sekumpulan metadata seperti saiz imej dan 1110 00:49:29,110 --> 00:49:30,250 lebar imej. 1111 00:49:30,250 --> 00:49:32,910 Dan notis Saya memetik daripada beberapa perkara sewenang-wenangnya di sini - 1112 00:49:32,910 --> 00:49:34,260 lebar dan tinggi. 1113 00:49:34,260 --> 00:49:36,160 Kiraan sedikit dan beberapa perkara lain. 1114 00:49:36,160 --> 00:49:37,840 Jadi ada beberapa metadata dalam fail. 1115 00:49:37,840 --> 00:49:41,470 >> Tetapi dengan memahami bagaimana fail dibentangkan keluar dengan cara ini, anda boleh sebenarnya 1116 00:49:41,470 --> 00:49:45,890 kemudian memanipulasi imej, pulih imej dari cakera, mengubah saiz imej. 1117 00:49:45,890 --> 00:49:47,560 Tetapi anda tidak boleh semestinya meningkatkan mereka. 1118 00:49:47,560 --> 00:49:48,480 Saya memerlukan gambar. 1119 00:49:48,480 --> 00:49:52,840 Jadi saya kembali ke RJ sini, yang anda lihat pada skrin yang agak sedikit masa lalu. 1120 00:49:52,840 --> 00:49:57,160 Dan jika saya membuka Ucapan di sini, ini adalah apa yang berlaku jika anda cuba untuk mengezum masuk dan 1121 00:49:57,160 --> 00:49:59,380 meningkatkan RJ. 1122 00:49:59,380 --> 00:50:01,480 Dia tidak mendapat apa-apa lebih baik benar-benar. 1123 00:50:01,480 --> 00:50:06,240 Sekarang Ucapan adalah jenis kabur ia sedikit, hanya untuk menyembunyikan yang 1124 00:50:06,240 --> 00:50:11,040 Hakikat bahawa RJ tidak mendapat terutamanya dipertingkatkan apabila anda zum masuk 1125 00:50:11,040 --> 00:50:13,310 Dan jika melakukannya dengan cara ini, melihat dataran? 1126 00:50:13,310 --> 00:50:15,490 Ya, anda pasti dapat melihat dataran di projektor. 1127 00:50:15,490 --> 00:50:17,690 >> Itulah apa yang anda dapat apabila anda meningkatkan. 1128 00:50:17,690 --> 00:50:22,570 Tetapi dalam memahami bagaimana RJ kami atau Muka senyum dilaksanakan membenarkan kami 1129 00:50:22,570 --> 00:50:24,950 sebenarnya menulis kod yang memanipulasi perkara-perkara ini. 1130 00:50:24,950 --> 00:50:29,970 Dan saya fikir saya akan berakhir pada nota ini, dengan 55 saat yang meningkatkan itu, 1131 00:50:29,970 --> 00:50:31,230 Saya berani, berkata agak mengelirukan. 1132 00:50:31,230 --> 00:50:32,990 >> [MAIN SEMULA VIDEO] 1133 00:50:32,990 --> 00:50:34,790 >> -Dia berbohong. 1134 00:50:34,790 --> 00:50:38,310 Mengenai apa, saya tidak tahu. 1135 00:50:38,310 --> 00:50:41,200 >> -Jadi apa yang kita tahu? 1136 00:50:41,200 --> 00:50:45,280 >> -Itu pada 9:15 Ray Santoya berada di ATM. 1137 00:50:45,280 --> 00:50:47,830 >> -Jadi persoalannya ialah apa telah dia lakukan pada 9:16? 1138 00:50:47,830 --> 00:50:50,750 >> Menembak-sembilan milimeter pada sesuatu. 1139 00:50:50,750 --> 00:50:52,615 Mungkin dia melihat sniper. 1140 00:50:52,615 --> 00:50:54,760 >> -Atau telah bekerjasama dengan beliau. 1141 00:50:54,760 --> 00:50:56,120 >> -Tunggu. 1142 00:50:56,120 --> 00:50:57,450 Kembali satu. 1143 00:50:57,450 --> 00:50:58,700 >> -Apa yang anda nampak? 1144 00:50:58,700 --> 00:51:05,530 1145 00:51:05,530 --> 00:51:09,490 >> -Bawa mukanya ke atas, skrin penuh. 1146 00:51:09,490 --> 00:51:09,790 >> -Nya kaca mata. 1147 00:51:09,790 --> 00:51:11,040 >> -Ada satu pantulan. 1148 00:51:11,040 --> 00:51:21,790 1149 00:51:21,790 --> 00:51:23,520 >> -Itulah pasukan besbol Neuvitas. 1150 00:51:23,520 --> 00:51:24,530 Itulah logo mereka. 1151 00:51:24,530 --> 00:51:27,040 >> -Dan dia bercakap kepada sesiapa yang memakai jaket itu. 1152 00:51:27,040 --> 00:51:27,530 >> [AKHIR VIDEO MAIN SEMULA] 1153 00:51:27,530 --> 00:51:29,180 >> DAVID J. MALAN: Ini akan menjadi Set Masalah 5. 1154 00:51:29,180 --> 00:51:30,720 Kami akan melihat anda minggu depan. 1155 00:51:30,720 --> 00:51:32,330 >> SPEAKER LELAKI: Pada CS50 seterusnya. 1156 00:51:32,330 --> 00:51:39,240 >> [Cengkerik kicauan] 1157 00:51:39,240 --> 00:51:41,270 >> [Bermain muzik]