1 00:00:00,000 --> 00:00:10,970 >> [MUSIC PLAYING] 2 00:00:10,970 --> 00:00:12,536 >> DAVID J. Malan: Baiklah. 3 00:00:12,536 --> 00:00:13,392 >> [Tertawa] 4 00:00:13,392 --> 00:00:14,240 >> Selamat datang kembali. 5 00:00:14,240 --> 00:00:14,990 Ini adalah CS50. 6 00:00:14,990 --> 00:00:16,890 Dan ini akhir minggu lima. 7 00:00:16,890 --> 00:00:20,020 Dan sampai sekarang, kami telah cukup banyak telah mengambil begitu saja bahwa ada 8 00:00:20,020 --> 00:00:23,480 ada compiler ini, dentang, bahwa Anda telah telah memohon dengan cara ini 9 00:00:23,480 --> 00:00:27,100 alat lain yang disebut Membuat entah bagaimana ajaib mengkonversi kode sumber Anda 10 00:00:27,100 --> 00:00:31,350 ke dalam kode objek, nol dan satu bahwa CPU komputer Anda, central 11 00:00:31,350 --> 00:00:33,410 processing unit, benar-benar mengerti. 12 00:00:33,410 --> 00:00:36,770 Tapi ternyata ada sejumlah yang terjadi di bawah tenda di 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 mengusulkan agar kita daging bahwa dalam sedikit lebih detail ke 15 00:00:41,800 --> 00:00:45,130 empat langkah, memiliki sesuatu yang disebut pra-pengolahan, sesuatu 16 00:00:45,130 --> 00:00:48,300 disebut kompilasi, yang telah kita lihat, sesuatu yang disebut perakitan, dan 17 00:00:48,300 --> 00:00:49,420 sesuatu yang disebut menghubungkan. 18 00:00:49,420 --> 00:00:53,270 Jadi sampai sekarang, di beberapa kami program, kami sudah tajam termasuk. 19 00:00:53,270 --> 00:00:56,650 Baru-baru ini kami telah memiliki beberapa tajam mendefinisikan untuk konstanta. 20 00:00:56,650 --> 00:01:00,660 Jadi ternyata bahwa hal-hal yang diawali dengan simbol hash atau 21 00:01:00,660 --> 00:01:04,150 simbol pound adalah pra-prosesor arahan. 22 00:01:04,150 --> 00:01:07,960 Itu hanya cara mewah untuk mengatakan itu baris kode yang sebenarnya 23 00:01:07,960 --> 00:01:12,280 diubah menjadi sesuatu yang lain sebelum komputer bahkan mencoba untuk mengubah Anda 24 00:01:12,280 --> 00:01:13,800 program ke nol dan satu. 25 00:01:13,800 --> 00:01:19,000 >> Misalnya, tajam mencakup standar I / O. H, cukup banyak hanya berarti pergi 26 00:01:19,000 --> 00:01:24,010 depan, ambil isi dari file stdio.h dan paste di sana. 27 00:01:24,010 --> 00:01:25,880 Jadi tidak ada nol dan satu pada saat itu belum. 28 00:01:25,880 --> 00:01:27,470 Ini benar-benar hanya substitusi. 29 00:01:27,470 --> 00:01:30,790 Dan itu dilakukan selama apa yang disebut tahap pra-pengolahan, ketika Anda 30 00:01:30,790 --> 00:01:34,230 benar-benar menjalankan dentang atau khusus Membuat dalam banyak kasus. 31 00:01:34,230 --> 00:01:36,950 Jadi semua ini telah terjadi pertama secara otomatis sejauh ini. 32 00:01:36,950 --> 00:01:38,800 >> Kemudian datang langkah kompilasi. 33 00:01:38,800 --> 00:01:40,920 Tapi kami sudah disederhanakan kompilasi. 34 00:01:40,920 --> 00:01:45,060 Menyusun program benar-benar berarti untuk mengambilnya dari sesuatu seperti C, 35 00:01:45,060 --> 00:01:48,430 kode sumber kami telah menulis, turun sesuatu yang disebut perakitan. 36 00:01:48,430 --> 00:01:52,900 Bahasa assembly adalah tingkat yang lebih rendah bahasa yang, untungnya, kita tidak akan 37 00:01:52,900 --> 00:01:55,480 memiliki banyak kesempatan untuk menulis semester ini. 38 00:01:55,480 --> 00:01:59,100 Tapi itu di tingkat terendah dalam arti bahwa Anda benar-benar mulai menulis 39 00:01:59,100 --> 00:02:04,270 menambah dan mengurangi dan berkembang biak dan beban dari memori dan menyimpan ke memori, 40 00:02:04,270 --> 00:02:08,259 petunjuk yang sangat dasar yang komputer, bawah kap mesin, 41 00:02:08,259 --> 00:02:09,639 benar-benar mengerti. 42 00:02:09,639 --> 00:02:14,930 >> Terakhir, perakitan membutuhkan bahasa yang ke nol dan satu bahwa kita telah 43 00:02:14,930 --> 00:02:16,190 menggambarkan sejauh ini. 44 00:02:16,190 --> 00:02:19,270 Dan benar-benar terakhir, ada yang disebut menghubungkan fase, yang kita akan 45 00:02:19,270 --> 00:02:22,360 melihat hanya sesaat, yang menggabungkan nol dan yang dengan nol dan 46 00:02:22,360 --> 00:02:24,870 yang orang lain sebelum telah Anda buat. 47 00:02:24,870 --> 00:02:26,660 >> Jadi mempertimbangkan program super sederhana. 48 00:02:26,660 --> 00:02:27,560 Itu dari Minggu 1. 49 00:02:27,560 --> 00:02:29,610 Itu hanya mengatakan, Hello World, di layar. 50 00:02:29,610 --> 00:02:30,920 Kami berlari ini melalui dentang. 51 00:02:30,920 --> 00:02:33,200 Atau kita berlari melalui Membuat yang berlari dentang. 52 00:02:33,200 --> 00:02:36,170 Dan dikeluarkan pada saat mana beberapa angka satu dan nol. 53 00:02:36,170 --> 00:02:38,100 Tapi ternyata ada langkah menengah. 54 00:02:38,100 --> 00:02:40,460 Jika saya pergi ke sini - oops, tidak ingin melihat dia belum. 55 00:02:40,460 --> 00:02:44,800 Jika saya pergi ke sini untuk alat saya dan saya membuka hello.c, di sini 56 00:02:44,800 --> 00:02:46,160 adalah bahwa program yang sama. 57 00:02:46,160 --> 00:02:48,600 Dan apa yang akan saya lakukan di terminal saya window sini aku akan 58 00:02:48,600 --> 00:02:51,430 menjalankan dentang daripada Membuat, yang mengotomatiskan keempat 59 00:02:51,430 --> 00:02:52,870 langkah-langkah bagi kita. 60 00:02:52,870 --> 00:02:58,620 Dan aku akan melakukan dentang-S dan kemudian hello.c dan kemudian masukkan. 61 00:02:58,620 --> 00:03:00,590 >> Dan saya mendapatkan prompt berkedip lagi, yang baik. 62 00:03:00,590 --> 00:03:05,280 Dan sekarang di jendela sedikit lebih besar, Aku akan membuka gedit di sini. 63 00:03:05,280 --> 00:03:09,610 Dan aku akan membuka file itu, Ternyata, disebut hello.s ini 64 00:03:09,610 --> 00:03:11,870 berisi bahwa bahasa assembly Saya sebut sebelumnya. 65 00:03:11,870 --> 00:03:15,060 Dan ini adalah apa yang disebut perakitan bahasa, tingkat yang cukup rendah 66 00:03:15,060 --> 00:03:18,470 petunjuk bahwa CPU Intel Anda atau apa pun yang ada di dalam 67 00:03:18,470 --> 00:03:19,350 mengerti. 68 00:03:19,350 --> 00:03:24,480 Dan mov adalah untuk bergerak. panggilan untuk memanggil, fungsi tingkat yang sangat rendah. 69 00:03:24,480 --> 00:03:26,380 sub adalah untuk kurangi. 70 00:03:26,380 --> 00:03:30,370 >> Jadi, ketika Anda memiliki CPU tertentu dalam komputer Anda, apa yang membuatnya 71 00:03:30,370 --> 00:03:34,300 berbeda, dibandingkan lainnya CPU pada pasar, yang mana instruksi itu 72 00:03:34,300 --> 00:03:39,460 mengerti dan sering seberapa efisien adalah, seberapa cepat itu di mengeksekusi beberapa 73 00:03:39,460 --> 00:03:40,380 dari instruksi tersebut. 74 00:03:40,380 --> 00:03:45,150 Sekarang untuk lebih lanjut tentang ini, Anda dapat mengambil selanjutnya CS61 Jatuh di kampus. 75 00:03:45,150 --> 00:03:48,170 Tapi di sini kita miliki, misalnya, beberapa pengidentifikasi yang mungkin tampak akrab. 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 ada banyak yang menarik di sana sekarang, mengingat bahwa teks 79 00:03:54,190 --> 00:03:59,190 segmen, pada Senin, di mana di memori program anda benar-benar berakhir. 80 00:03:59,190 --> 00:04:01,330 Jadi itulah setidaknya samar-samar akrab ada. 81 00:04:01,330 --> 00:04:03,730 Di sini, tentu saja, adalah menyebutkan fungsi utama kami. 82 00:04:03,730 --> 00:04:07,220 Bergulir ke bawah, ini mengacu pada hal-hal disebut register, potongan yang sangat kecil 83 00:04:07,220 --> 00:04:09,190 dalam memori CPU Anda yang sebenarnya. 84 00:04:09,190 --> 00:04:12,930 Dan jika saya gulir ke bawah bahkan lebih lanjut, saya melihat beberapa jenis 85 00:04:12,930 --> 00:04:14,240 menyebutkan tidak langsung ASCII. 86 00:04:14,240 --> 00:04:17,120 Dan, memang, adalah string, halo, koma, dunia. 87 00:04:17,120 --> 00:04:20,079 >> Jadi cerita panjang pendek, ini telah terjadi untuk Anda, secara otomatis, 88 00:04:20,079 --> 00:04:22,140 bawah tenda sepanjang waktu ini. 89 00:04:22,140 --> 00:04:26,450 Dan apa yang terjadi benar-benar sekali Anda menjalankan dentang, atau dengan cara 90 00:04:26,450 --> 00:04:29,150 Membuat, Anda mendapatkan pertama, dari kode sumber, 91 00:04:29,150 --> 00:04:30,700 disebut bahasa assembly. 92 00:04:30,700 --> 00:04:35,210 Kemudian dentang adalah mengkonversi perakitan ini bahasa ke angka satu dan nol. 93 00:04:35,210 --> 00:04:38,340 Dan ini adalah slide yang kami mulai diskusi kita dalam Minggu 0 pada - 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, mereka nol dan satu digabungkan dengan nol dan satu 96 00:04:44,030 --> 00:04:47,190 dari orang-orang perpustakaan kami telah mengambil untuk diberikan seperti Standard I / O atau 97 00:04:47,190 --> 00:04:50,010 String Perpustakaan atau bahkan yang CS50 perpustakaan. 98 00:04:50,010 --> 00:04:54,200 >> Jadi untuk melukis gambar ini lebih visual, kita memiliki hello.c. 99 00:04:54,200 --> 00:04:57,220 Dan, tentu saja, menggunakan printf berfungsi untuk mengatakan, hello world. 100 00:04:57,220 --> 00:05:01,810 Kompilasi langkah membawanya ke file kita hanya melihat hello.s, bahkan 101 00:05:01,810 --> 00:05:04,290 meskipun itu biasanya dihapus secara otomatis untuk Anda. 102 00:05:04,290 --> 00:05:06,050 Tapi itu kode assembly pada langkah tengah. 103 00:05:06,050 --> 00:05:09,750 Dan kemudian ketika kita merakit perakitan bahasa, sehingga untuk berbicara, saat itulah Anda 104 00:05:09,750 --> 00:05:10,830 mendapatkan orang-nol dan satu. 105 00:05:10,830 --> 00:05:13,920 Jadi kita sudah diperbesar efektif hari ini apa yang kita telah mengambil untuk diberikan, 106 00:05:13,920 --> 00:05:16,430 berarti akan kode sumber keberatan kode. 107 00:05:16,430 --> 00:05:18,850 >> Tapi akhirnya, sekarang gambar yang sama - mari kita mendorong itu ke 108 00:05:18,850 --> 00:05:20,020 sisi kiri. 109 00:05:20,020 --> 00:05:22,880 Dan perhatikan bahwa di atas ada Saya sebutkan stdio.h. 110 00:05:22,880 --> 00:05:25,030 Itu file yang kami menyertakan di hampir semua 111 00:05:25,030 --> 00:05:26,250 program yang kami telah menulis. 112 00:05:26,250 --> 00:05:28,830 Dan itu file yang isinya mendapatkan copy paste, 113 00:05:28,830 --> 00:05:30,350 efektif atas kode Anda. 114 00:05:30,350 --> 00:05:34,170 Tapi ternyata bahwa, pada komputer sistem di suatu tempat, ada yang mungkin 115 00:05:34,170 --> 00:05:39,150 File stdio.c bahwa seseorang menulis tahun lalu yang menerapkan semua 116 00:05:39,150 --> 00:05:41,870 fungsi yang dinyatakan di stdio.h. 117 00:05:41,870 --> 00:05:45,465 >> Sekarang dalam kenyataannya itu mungkin bukan pada Mac atau PC Anda atau bahkan di 118 00:05:45,465 --> 00:05:47,660 CS50 alat adalah kode C mentah. 119 00:05:47,660 --> 00:05:52,710 Seseorang sudah dikompilasi dan termasuk . O file untuk kode obyek atau. A 120 00:05:52,710 --> 00:05:56,020 File, yang mengacu pada shared library yang telah pra-instal dan 121 00:05:56,020 --> 00:05:57,240 pre-compiled untuk Anda. 122 00:05:57,240 --> 00:06:01,950 Tapi anggaplah bahwa memang ada pada stdio.c komputer kita secara paralel 123 00:06:01,950 --> 00:06:02,650 dengan dentang. 124 00:06:02,650 --> 00:06:04,960 Kode Anda sedang dikompilasi dan dirakit. 125 00:06:04,960 --> 00:06:09,200 kode stdio.c 's sedang disusun dan dirakit, sehingga ini yang terakhir 126 00:06:09,200 --> 00:06:13,730 langkah, di sini, kita harus entah bagaimana link, sehingga untuk berbicara, nol dan yang 127 00:06:13,730 --> 00:06:18,430 dengan nya nol dan satu menjadi satu program sederhana yang pada akhirnya adalah 128 00:06:18,430 --> 00:06:20,540 disebut hanya Hello. 129 00:06:20,540 --> 00:06:23,340 >> Jadi itulah semua keajaiban itu telah terjadi sejauh ini. 130 00:06:23,340 --> 00:06:26,430 Dan akan terus mengambil ini proses untuk diberikan, tetapi menyadari 131 00:06:26,430 --> 00:06:28,750 ada banyak juicy rincian terjadi 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 khususnya yang berbeda. 134 00:06:33,940 --> 00:06:37,020 >> Jadi pada catatan itu, jika Anda ingin bergabung dengan kami untuk makan siang hari Jumat ini, pergi 135 00:06:37,020 --> 00:06:41,570 ke tempat biasa cs50.net/rsvp, 13:15 Jumat ini. 136 00:06:41,570 --> 00:06:43,400 Dan sekarang beberapa pengumuman. 137 00:06:43,400 --> 00:06:44,670 Jadi kita punya kabar baik. 138 00:06:44,670 --> 00:06:45,970 Dan kami memiliki beberapa berita buruk. 139 00:06:45,970 --> 00:06:47,260 Mulailah dengan beberapa kabar baik di sini. 140 00:06:47,260 --> 00:06:52,038 141 00:06:52,038 --> 00:06:54,510 >> [Mengerang] 142 00:06:54,510 --> 00:06:54,710 >> Baik. 143 00:06:54,710 --> 00:06:56,670 Yah, secara teknis liburan, sehingga itu tidak begitu banyak hadiah dari kami. 144 00:06:56,670 --> 00:06:58,030 Tapi kemudian kabar buruk tentu saja. 145 00:06:58,030 --> 00:07:00,550 146 00:07:00,550 --> 00:07:01,880 >> [Mengerang] 147 00:07:01,880 --> 00:07:03,530 >> Aku menghabiskan banyak waktu pada animasi ini. 148 00:07:03,530 --> 00:07:04,690 >> [Tertawa] 149 00:07:04,690 --> 00:07:07,000 >> Akan ada sesi review ini hari Senin mendatang. 150 00:07:07,000 --> 00:07:08,340 Ini akan berada di 5:30 PM. 151 00:07:08,340 --> 00:07:11,210 Kami akan mengingatkan Anda tentang semua rincian ini melalui email di lapangan itu 152 00:07:11,210 --> 00:07:13,470 situs hanya dalam beberapa waktu hari. 153 00:07:13,470 --> 00:07:16,610 Ini akan difilmkan dan tersedia segera sesudahnya. 154 00:07:16,610 --> 00:07:19,200 Jadi, jika Anda tidak dapat membuat hari Senin Slot malam, jangan khawatir. 155 00:07:19,200 --> 00:07:22,270 Bagian ini minggu mendatang juga akan fokus pada ulasan untuk kuis. 156 00:07:22,270 --> 00:07:25,670 Jika bagian Anda pada hari Senin, yang merupakan memang liburan universitas, kita akan 157 00:07:25,670 --> 00:07:26,920 masih bertemu dalam bagian. 158 00:07:26,920 --> 00:07:28,890 Jika Anda tidak bisa membuat Bagian karena Anda akan 159 00:07:28,890 --> 00:07:29,860 pergi, itu bagus. 160 00:07:29,860 --> 00:07:33,710 Menghadiri hari Minggu atau Selasa bagian atau tune-in ke bagian Jason, yang 161 00:07:33,710 --> 00:07:35,110 tersedia secara online. 162 00:07:35,110 --> 00:07:37,490 >> Jadi, berita buruk. 163 00:07:37,490 --> 00:07:41,960 Jadi menurut silabus, kita memiliki kuliah Jumat depan. 164 00:07:41,960 --> 00:07:43,690 Tetapi kabar baiknya - 165 00:07:43,690 --> 00:07:44,860 jelas, aku menghabiskan terlalu banyak waktu untuk hal ini. 166 00:07:44,860 --> 00:07:45,280 >> [Tertawa] 167 00:07:45,280 --> 00:07:47,140 >> Kami akan membatalkan ceramah Jumat berikutnya. 168 00:07:47,140 --> 00:07:50,590 Sehingga akan menjadi hadiah bagi kami, sehingga Anda benar-benar dapat memiliki jeda bagus di 169 00:07:50,590 --> 00:07:52,990 antara minggu ini dan dua minggu kemudian. 170 00:07:52,990 --> 00:07:57,460 Jadi tidak ada kuliah minggu depan, hanya kecil sedikit kuis, yang Anda harus 171 00:07:57,460 --> 00:07:59,030 semakin semakin bersemangat. 172 00:07:59,030 --> 00:08:03,870 >> Sekarang, mari kita mengalihkan perhatian kita untuk sesuatu yang memang lebih visual 173 00:08:03,870 --> 00:08:06,990 dan lebih menarik dan untuk mengatur panggung untuk apa yang akan berada di cakrawala 174 00:08:06,990 --> 00:08:08,420 hanya dalam beberapa minggu waktu. 175 00:08:08,420 --> 00:08:12,160 Setelah kuis pertama, kita akan mengubah fokus set masalah kita yang lain 176 00:08:12,160 --> 00:08:16,710 masalah khusus domain, yaitu forensik atau keamanan yang lebih umum. 177 00:08:16,710 --> 00:08:19,550 >> Bahkan, tradisi dengan masalah ini set bagi saya salah satu 178 00:08:19,550 --> 00:08:24,850 mengajar sesama atau CA untuk berjalan di seberang kampus mengambil beberapa foto 179 00:08:24,850 --> 00:08:29,450 diidentifikasi tetapi non orang yang jelas, tempat, atau hal-hal, maka setiap tahun saya 180 00:08:29,450 --> 00:08:34,520 entah bagaimana berhasil sengaja menghapus atau merusak kartu 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 Tapi tidak ada masalah besar. 183 00:08:36,860 --> 00:08:39,200 Aku bisa pergi ke depan dan pasang yang ke komputer saya. 184 00:08:39,200 --> 00:08:43,010 Aku bisa membuat gambar forensik, jadi untuk berbicara, dengan menyalin nol dan 185 00:08:43,010 --> 00:08:46,830 yang off dari kartu memori, apakah kartu SD atau kartu compact flash atau 186 00:08:46,830 --> 00:08:48,100 apa pun yang Anda kenal. 187 00:08:48,100 --> 00:08:49,300 Dan kemudian kita bisa menyerahkan itu keluar. 188 00:08:49,300 --> 00:08:53,190 >> Dan sehingga tantangan ke depan, antara lain hal untuk Anda, akan menulis 189 00:08:53,190 --> 00:08:58,630 Kode C yang pulih sejumlah besar JPEG untuk saya dan mengungkapkan akan 190 00:08:58,630 --> 00:09:00,190 orang-orang, tempat, atau hal-hal. 191 00:09:00,190 --> 00:09:03,340 Dan kita juga akan bicara, dalam masalah ini menetapkan dan di masa yang akan datang, sekitar 192 00:09:03,340 --> 00:09:04,440 grafis yang lebih umum. 193 00:09:04,440 --> 00:09:06,140 Kami telah menggunakan mereka, tentu saja, untuk keluar. 194 00:09:06,140 --> 00:09:09,080 Tapi kau semacam diambil untuk diberikan terdapat konsep-konsep tingkat tinggi 195 00:09:09,080 --> 00:09:10,680 persegi panjang dan oval. 196 00:09:10,680 --> 00:09:12,450 Tetapi di bawah tenda ada piksel. 197 00:09:12,450 --> 00:09:14,370 Dan Anda harus memulai berpikir tentang mereka. 198 00:09:14,370 --> 00:09:18,800 Atau Anda akan untuk p-set 4 harus berpikir tentang kesenjangan antara batu bata, bagaimana 199 00:09:18,800 --> 00:09:21,990 cepat Anda bola bergerak di layar untuk keluar. 200 00:09:21,990 --> 00:09:24,830 Jadi ada gagasan dari titik pada layar Anda yang 201 00:09:24,830 --> 00:09:26,290 ikut bermain sudah. 202 00:09:26,290 --> 00:09:29,430 >> Sekarang apa yang Anda lihat, meskipun, adalah apa Anda mendapatkan pada layar komputer. 203 00:09:29,430 --> 00:09:33,680 Jika Anda pernah melihat beberapa baik atau TV yang buruk, kemungkinan besar mereka cukup banyak 204 00:09:33,680 --> 00:09:36,280 memperlakukan penonton seperti technophobes yang tidak benar-benar 205 00:09:36,280 --> 00:09:37,630 tahu banyak tentang komputasi. 206 00:09:37,630 --> 00:09:40,840 Dan sehingga sangat mudah bagi polisi detektif mengatakan, bisa Anda 207 00:09:40,840 --> 00:09:41,710 bersih bahwa untuk saya? 208 00:09:41,710 --> 00:09:42,710 Atau meningkatkan, kan? 209 00:09:42,710 --> 00:09:45,550 Meningkatkan adalah seperti kata buzz di hampir semua kejahatan terkait acara. 210 00:09:45,550 --> 00:09:49,240 Dan kenyataannya adalah jika Anda mengambil sangat foto buram seorang tersangka melakukan 211 00:09:49,240 --> 00:09:51,620 sesuatu yang buruk, Anda tidak bisa hanya meningkatkan itu. 212 00:09:51,620 --> 00:09:53,080 Anda tidak dapat memperbesar jauh. 213 00:09:53,080 --> 00:09:56,350 Anda tidak dapat melihat dalam kilatan seseorang mata yang melakukan itu 214 00:09:56,350 --> 00:09:59,860 kejahatan tertentu, meskipun prevalensi ini di TV. 215 00:09:59,860 --> 00:10:04,110 >> Dan dengan itu mari kita memotivasi bahwa Masalah mendatang set dengan sekilas di 216 00:10:04,110 --> 00:10:05,765 beberapa acara yang Anda mungkin akrab. 217 00:10:05,765 --> 00:10:06,500 >> [VIDEO PEMUTARAN] 218 00:10:06,500 --> 00:10:07,835 >> -OK. 219 00:10:07,835 --> 00:10:09,956 Sekarang, mari kita melihat yang baik pada Anda. 220 00:10:09,956 --> 00:10:17,060 221 00:10:17,060 --> 00:10:17,766 >> -Tunggu. 222 00:10:17,766 --> 00:10:18,658 Jalankan kembali itu. 223 00:10:18,658 --> 00:10:19,550 >> -Tunggu sebentar. 224 00:10:19,550 --> 00:10:21,580 Ke kanan. 225 00:10:21,580 --> 00:10:21,800 >> -Ada. 226 00:10:21,800 --> 00:10:22,690 Bekukan itu. 227 00:10:22,690 --> 00:10:23,692 >> Layar penuh. 228 00:10:23,692 --> 00:10:23,846 >> -OK. 229 00:10:23,846 --> 00:10:24,154 Bekukan itu. 230 00:10:24,154 --> 00:10:25,140 >> Kencangkan-up pada itu, akan ya? 231 00:10:25,140 --> 00:10:27,090 >> Vector-dalam pada pria yang 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 tepat, yang dicitrakan dapat diperbesar dan dipertajam. 234 00:10:33,700 --> 00:10:34,490 >> -Apa itu? 235 00:10:34,490 --> 00:10:35,870 >> -Ini adalah program peningkatan. 236 00:10:35,870 --> 00:10:36,793 >> -Dapatkah Anda menjelaskan bahwa apa pun? 237 00:10:36,793 --> 00:10:38,560 >> -Saya tidak tahu. 238 00:10:38,560 --> 00:10:39,090 Mari kita meningkatkan itu. 239 00:10:39,090 --> 00:10:41,690 >> -Meningkatkan bagian A-6. 240 00:10:41,690 --> 00:10:43,510 >> -Saya ditingkatkan detail dan - 241 00:10:43,510 --> 00:10:44,456 >> -Saya pikir ada cukup untuk meningkatkan. 242 00:10:44,456 --> 00:10:45,402 Melepaskannya ke layar saya. 243 00:10:45,402 --> 00:10:47,300 >> -Meningkatkan refleksi di matanya. 244 00:10:47,300 --> 00:10:49,330 >> -Mari kita jalankan ini melalui peningkatan video. 245 00:10:49,330 --> 00:10:50,340 >> -Edgar, dapat menyempurnakan ini? 246 00:10:50,340 --> 00:10:52,320 >> -Tunggu. 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 refleksi itu. 249 00:10:55,560 --> 00:10:56,440 >> -Refleksi. 250 00:10:56,440 --> 00:10:57,940 >> -Ada refleksi dari wajah pria itu. 251 00:10:57,940 --> 00:10:58,860 >> -Refleksi. 252 00:10:58,860 --> 00:10:59,710 >> -Ada refleksi. 253 00:10:59,710 --> 00:11:00,900 >> -Zoom in pada cermin. 254 00:11:00,900 --> 00:11:03,500 >> -Anda dapat melihat refleksi. 255 00:11:03,500 --> 00:11:04,700 >> -Dapatkah Anda meningkatkan citra dari sini? 256 00:11:04,700 --> 00:11:05,700 >> -Dapatkah Anda meningkatkan dia di sini? 257 00:11:05,700 --> 00:11:06,500 >> -Dapatkah Anda meningkatkan itu? 258 00:11:06,500 --> 00:11:07,380 >> -Dapatkah Anda meningkatkan itu? 259 00:11:07,380 --> 00:11:08,190 >> -Bisakah kita meningkatkan ini? 260 00:11:08,190 --> 00:11:08,940 >> -Dapatkah Anda meningkatkan itu? 261 00:11:08,940 --> 00:11:10,280 >> -Tunggu sebentar, aku akan meningkatkan. 262 00:11:10,280 --> 00:11:11,570 >> -Zoom in pada 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 >> [Tertawa] 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 >> -Memutar 75 derajat sekitar silahkan vertikal. 271 00:11:19,390 --> 00:11:19,886 >> [Tertawa] 272 00:11:19,886 --> 00:11:24,350 >> -Stop, dan kembali ke bagian tentang pintu lagi. 273 00:11:24,350 --> 00:11:26,330 >> -Punya peningkat gambar yang dapat bitmap? 274 00:11:26,330 --> 00:11:28,990 >> -Mungkin kita bisa menggunakan Pradeep Sen metode untuk melihat ke jendela. 275 00:11:28,990 --> 00:11:30,680 >> -Perangkat lunak ini adalah bagian dari seni. 276 00:11:30,680 --> 00:11:31,676 >> -Nilai ikon off. 277 00:11:31,676 --> 00:11:34,166 >> -Dengan kombinasi yang tepat algoritma. 278 00:11:34,166 --> 00:11:38,399 >> -Dia mengambil algoritma pencahayaan untuk tingkat berikutnya dan saya dapat menggunakannya untuk 279 00:11:38,399 --> 00:11:38,648 meningkatkan foto ini. 280 00:11:38,648 --> 00:11:42,050 >> -Lock dan memperbesar sumbu 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 >> -Freeze dan meningkatkan. 285 00:11:45,010 --> 00:11:47,470 286 00:11:47,470 --> 00:11:47,910 >> [END VIDEO PEMUTARAN] 287 00:11:47,910 --> 00:11:51,470 >> DAVID J. Malan: Jadi Masalah Set 5 adalah apa yang ada di depan sana. 288 00:11:51,470 --> 00:11:55,260 Jadi kita akan segera mendapatkan pemahaman yang lebih baik kapan dan mengapa Anda bisa 289 00:11:55,260 --> 00:11:57,300 dan kita tidak bisa meningkatkan dengan cara itu. 290 00:11:57,300 --> 00:12:00,090 Tapi pertama-tama, mari kita kembali perhatian kita dengan beberapa blok bangunan kita akan 291 00:12:00,090 --> 00:12:02,250 harus mampu menceritakan kisah itu. 292 00:12:02,250 --> 00:12:05,580 >> Jadi ingat bahwa kita menggambar gambar ini pada Senin dan sedikit pekan lalu. 293 00:12:05,580 --> 00:12:09,970 Dan ini menjelaskan tata letak hal-hal dalam memori komputer Anda saat 294 00:12:09,970 --> 00:12:11,000 menjalankan beberapa program yang. 295 00:12:11,000 --> 00:12:14,310 The teknologi segmen di bagian atas, ingat, mengacu ke nol aktual dan yang 296 00:12:14,310 --> 00:12:16,000 yang membentuk program anda. 297 00:12:16,000 --> 00:12:19,340 Ada, di bawah itu, beberapa diinisialisasi atau uninitialized data, yang biasanya 298 00:12:19,340 --> 00:12:22,910 mengacu pada hal-hal seperti konstanta atau string atau variabel global yang memiliki 299 00:12:22,910 --> 00:12:24,200 dinyatakan di muka. 300 00:12:24,200 --> 00:12:26,500 Ada tumpukan, tapi kami akan datang kembali ke dalam sedikit. 301 00:12:26,500 --> 00:12:27,410 >> Dan kemudian ada tumpukan. 302 00:12:27,410 --> 00:12:30,660 Sama seperti tumpukan nampan di kantin, ini adalah di mana memori mendapat 303 00:12:30,660 --> 00:12:33,610 berlapis dan berlapis kapanpun Anda melakukan apa dalam sebuah program? 304 00:12:33,610 --> 00:12:36,380 305 00:12:36,380 --> 00:12:37,730 Apa gunanya stack untuk? 306 00:12:37,730 --> 00:12:39,320 >> Ya? 307 00:12:39,320 --> 00:12:40,000 >> Panggil fungsi. 308 00:12:40,000 --> 00:12:42,890 Setiap kali Anda memanggil fungsi, itu diberikan kepada sepotong memori untuk nya 309 00:12:42,890 --> 00:12:45,020 variabel lokal atau parameter. 310 00:12:45,020 --> 00:12:48,810 Dan pictorially, kita melihat bahwa dengan masing-masing Fungsi berturut-turut disebut, bila A 311 00:12:48,810 --> 00:12:52,520 panggilan panggilan B C D panggilan, mereka mendapatkan berlapis ke stack. 312 00:12:52,520 --> 00:12:55,630 Dan dalam masing-masing irisan memori pada dasarnya adalah sebuah lingkup yang unik 313 00:12:55,630 --> 00:12:58,590 untuk fungsi itu, yang, tentu saja, bermasalah jika Anda ingin tangan 314 00:12:58,590 --> 00:13:01,850 dari satu fungsi ke sepotong A data yang Anda inginkan 315 00:13:01,850 --> 00:13:03,500 bermutasi atau berubah. 316 00:13:03,500 --> 00:13:08,060 >> Jadi apa solusi kami untuk memungkinkan Sebuah fungsi diwakili oleh satu tumpukan 317 00:13:08,060 --> 00:13:11,390 bingkai mengubah memori dalam tumpukan bingkai lain? 318 00:13:11,390 --> 00:13:14,590 Bagaimana kedua berbicara satu sama lain? 319 00:13:14,590 --> 00:13:18,510 Jadi dengan cara pointer atau alamat, yang, sekali lagi, hanya menjelaskan di mana di 320 00:13:18,510 --> 00:13:22,280 memori, dengan cara tertentu nomor gigitan, yang khusus 321 00:13:22,280 --> 00:13:23,830 Nilai dapat ditemukan. 322 00:13:23,830 --> 00:13:26,860 Jadi ingat terakhir kali juga kami terus cerita dan memandang 323 00:13:26,860 --> 00:13:28,280 program yang cukup buggy. 324 00:13:28,280 --> 00:13:32,900 Dan program ini adalah kereta untuk beberapa alasan, tetapi yang paling mengkhawatirkan adalah 325 00:13:32,900 --> 00:13:34,620 karena gagal untuk memeriksa apa? 326 00:13:34,620 --> 00:13:39,111 327 00:13:39,111 --> 00:13:40,450 >> Ya, gagal untuk memeriksa input. 328 00:13:40,450 --> 00:13:41,870 Maaf? 329 00:13:41,870 --> 00:13:43,880 >> Jika lebih dari 12 karakter. 330 00:13:43,880 --> 00:13:47,260 Jadi sangat rapi, saat memanggil memcopy, yang, seperti namanya, hanya 331 00:13:47,260 --> 00:13:50,630 salinan memori dari argumen kedua menjadi argumen pertama. 332 00:13:50,630 --> 00:13:54,730 Argumen ketiga, sangat cerdas, adalah diperiksa untuk memastikan bahwa Anda tidak 333 00:13:54,730 --> 00:13:59,400 menyalin lebih dari, dalam hal ini, panjang bar, jumlah karakter, 334 00:13:59,400 --> 00:14:03,810 ke tujuan, yang ini Array C. Tapi masalahnya adalah bahwa apa 335 00:14:03,810 --> 00:14:07,230 jika C itu sendiri tidak cukup besar untuk mengatasinya? 336 00:14:07,230 --> 00:14:09,900 Anda akan menyalin jumlah byte yang Anda telah diberikan. 337 00:14:09,900 --> 00:14:13,040 Tapi apa yang Anda benar-benar memiliki lebih banyak byte dari Anda memiliki ruang untuk? 338 00:14:13,040 --> 00:14:16,770 >> Nah, program ini sangat bodoh hanya membabi buta melanjutkan untuk mengambil apa pun itu 339 00:14:16,770 --> 00:14:20,650 diberikan, halo backslash 0 adalah besar jika string pendek 340 00:14:20,650 --> 00:14:22,040 cukup, seperti lima karakter. 341 00:14:22,040 --> 00:14:26,470 Tapi jika itu benar-benar 12 karakter atau 1.200 karakter, kami melihat terakhir kali 342 00:14:26,470 --> 00:14:29,380 bahwa Anda hanya akan benar-benar menimpa memori yang 343 00:14:29,380 --> 00:14:30,470 bukan milik Anda. 344 00:14:30,470 --> 00:14:34,390 Dan kasus terburuk, jika Anda menimpa bagian merah di sana bahwa kami disebut 345 00:14:34,390 --> 00:14:35,380 kembali alamat - 346 00:14:35,380 --> 00:14:38,370 ini hanya di mana komputer otomatis, untuk Anda, di balik 347 00:14:38,370 --> 00:14:43,130 adegan, melipat jauhnya nilai 32-bit yang mengingatkan untuk apa alamat seharusnya 348 00:14:43,130 --> 00:14:47,080 kembali ketika foo, fungsi ini lain, dilakukan mengeksekusi. 349 00:14:47,080 --> 00:14:49,320 Ini adalah remah roti macam yang ia mengembalikan. 350 00:14:49,320 --> 00:14:52,490 Jika Anda menimpa itu, berpotensi, jika Anda adalah orang jahat, bisa bisa 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 kecelakaan itu dalam banyak kasus. 353 00:14:58,020 --> 00:15:01,690 >> Sekarang masalah ini hanya memperburuk seperti yang kita mulai berbicara tentang memori 354 00:15:01,690 --> 00:15:03,010 manajemen yang lebih umum. 355 00:15:03,010 --> 00:15:07,150 Dan malloc, untuk alokasi memori, adalah fungsi yang dapat kita gunakan untuk mengalokasikan 356 00:15:07,150 --> 00:15:11,260 memori ketika kita tidak tahu sebelumnya bahwa kita mungkin perlu beberapa. 357 00:15:11,260 --> 00:15:13,960 Jadi, misalnya, jika aku kembali ke alat sini. 358 00:15:13,960 --> 00:15:21,010 Dan saya membuka dari waktu hello2.c lalu, mengingat program ini di sini, yang tampak 359 00:15:21,010 --> 00:15:23,500 sedikit sesuatu seperti ini, hanya tiga baris - 360 00:15:23,500 --> 00:15:27,940 sebutkan nama, maka nama String, di sebelah kiri, sama GetString. 361 00:15:27,940 --> 00:15:29,690 Dan kemudian kita mencetaknya, nama pengguna. 362 00:15:29,690 --> 00:15:31,170 >> Jadi ini adalah sebuah program super sederhana. 363 00:15:31,170 --> 00:15:34,870 Untuk menjadi jelas, biarkan aku pergi ke depan dan membuat hello-2. 364 00:15:34,870 --> 00:15:36,680 Aku akan melakukan slash dot hello-2. 365 00:15:36,680 --> 00:15:37,750 Sebutkan nama - 366 00:15:37,750 --> 00:15:38,140 David. 367 00:15:38,140 --> 00:15:38,840 Enter. 368 00:15:38,840 --> 00:15:39,540 Hello David. 369 00:15:39,540 --> 00:15:41,060 Ini tampaknya bekerja OK. 370 00:15:41,060 --> 00:15:43,140 Tapi apa yang sebenarnya terjadi bawah tenda di sini? 371 00:15:43,140 --> 00:15:44,670 Pertama mari kita mengupas beberapa lapisan. 372 00:15:44,670 --> 00:15:48,380 String hanya sinonim kita sudah menyadari 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 membuatnya sedikit lebih misterius tetapi lebih teknis benar bahwa ini 375 00:15:52,740 --> 00:15:55,570 adalah bintang char, yang berarti bahwa Nama, ya, adalah variabel. 376 00:15:55,570 --> 00:15:59,920 Tapi toko nama apa alamat char, yang terasa agak aneh 377 00:15:59,920 --> 00:16:01,050 karena aku mendapatkan kembali string. 378 00:16:01,050 --> 00:16:03,580 Saya mendapatkan kembali beberapa chars bukan char. 379 00:16:03,580 --> 00:16:07,400 >> Tapi tentu saja, Anda hanya perlu pertama char alamat untuk mengingat di mana 380 00:16:07,400 --> 00:16:08,870 seluruh string adalah karena mengapa? 381 00:16:08,870 --> 00:16:12,700 Bagaimana Anda mengetahui di mana akhir string adalah mengetahui awal? 382 00:16:12,700 --> 00:16:13,630 Backslash nol. 383 00:16:13,630 --> 00:16:17,260 Jadi, dengan dua petunjuk Anda mengetahui sebelum awal dan akhir 384 00:16:17,260 --> 00:16:20,280 setiap string adalah, asalkan mereka benar dibentuk dengan nol bahwa 385 00:16:20,280 --> 00:16:22,110 terminator, bahwa backslash nol. 386 00:16:22,110 --> 00:16:24,520 >> Tapi ini memanggil GetString. 387 00:16:24,520 --> 00:16:28,020 Dan ternyata bahwa GetString selama ini telah jenis 388 00:16:28,020 --> 00:16:28,820 kecurangan bagi kita. 389 00:16:28,820 --> 00:16:32,460 Sudah melakukan kerja ini, untuk memastikan, mendapatkan string dari pengguna. 390 00:16:32,460 --> 00:16:34,580 Tapi di mana memori yang telah datang dari? 391 00:16:34,580 --> 00:16:38,440 Jika kita kembali ke gambar di sini dan menerapkan definisi dari hanya 392 00:16:38,440 --> 00:16:42,610 saat yang lalu, bahwa tumpukan mana memori terjadi saat fungsi dipanggil, 393 00:16:42,610 --> 00:16:45,370 dengan logika bahwa, ketika Anda menelepon GetString, dan kemudian saya ketik di 394 00:16:45,370 --> 00:16:50,900 D-A-V-I-D Enter, dimana D-A-V-I-D backslash nol disimpan, berdasarkan 395 00:16:50,900 --> 00:16:53,480 cerita kita sudah bilang kita jauh? 396 00:16:53,480 --> 00:16:55,190 >> Tampaknya berada di stack, kan? 397 00:16:55,190 --> 00:16:58,120 Ketika Anda menelepon mendapatkan string yang Anda mendapatkan sedikit sepotong memori pada stack. 398 00:16:58,120 --> 00:17:01,630 Jadi bisa dipastikan bahwa D-A-V-I-D backslash nol disimpan 399 00:17:01,630 --> 00:17:02,770 ada di stack. 400 00:17:02,770 --> 00:17:07,680 Tapi tunggu dulu, getString kembali string itu, sehingga untuk berbicara, yang berarti 401 00:17:07,680 --> 00:17:11,700 itu nampan dari kantin diambil dari tumpukan. 402 00:17:11,700 --> 00:17:14,560 Dan kami katakan terakhir kali bahwa segera sebagai kembali fungsi, dan Anda mengambil 403 00:17:14,560 --> 00:17:20,109 nampan, sehingga untuk berbicara, dari tumpukan, apa Anda dapat mengasumsikan tentang sisa-sisa 404 00:17:20,109 --> 00:17:21,819 memori itu? 405 00:17:21,819 --> 00:17:25,160 Aku semacam menggambar ulang mereka sebagai tanda tanya karena mereka efektif menjadi 406 00:17:25,160 --> 00:17:26,250 nilai yang tidak diketahui. 407 00:17:26,250 --> 00:17:29,500 Mereka dapat digunakan kembali ketika beberapa fungsi berikutnya disebut. 408 00:17:29,500 --> 00:17:31,870 >> Dengan kata lain, jika kita terjadi untuk menyimpan - 409 00:17:31,870 --> 00:17:34,350 Aku akan menggambar cepat di sini dari stack. 410 00:17:34,350 --> 00:17:38,690 Jika kita kebetulan menggambar bagian bawah segmen memori saya, dan kita akan mengatakan 411 00:17:38,690 --> 00:17:42,230 bahwa ini adalah tempat memori diduduki oleh utama dan mungkin arg c dan 412 00:17:42,230 --> 00:17:46,790 arg v dan apa pun dalam program ini, ketika GetString disebut, 413 00:17:46,790 --> 00:17:51,120 mungkin GetString mendapat sepotong memori di sini. 414 00:17:51,120 --> 00:17:53,940 Dan kemudian D-A-V-I-D entah bagaimana berakhir di fungsi ini. 415 00:17:53,940 --> 00:17:55,320 Dan aku akan menggampangkan. 416 00:17:55,320 --> 00:18:00,050 Tapi mari kita asumsikan bahwa D-A-V-I-D backslash nol. 417 00:18:00,050 --> 00:18:03,500 Jadi ini banyak byte yang digunakan dalam frame untuk GetString. 418 00:18:03,500 --> 00:18:08,270 >> Tapi begitu kembali GetString, kami mengatakan terakhir kali bahwa memori ini lebih 419 00:18:08,270 --> 00:18:11,340 di sini semuanya menjadi - woops! - 420 00:18:11,340 --> 00:18:14,270 semuanya menjadi terhapus secara efektif. 421 00:18:14,270 --> 00:18:17,220 Dan kita dapat menganggap ini sebagai pertanyaan sekarang tanda karena siapa 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 Memang, saya sangat sering memanggil fungsi-fungsi selain GetString. 424 00:18:22,130 --> 00:18:24,750 Dan segera setelah saya memanggil beberapa lainnya Fungsi dari GetString, mungkin tidak 425 00:18:24,750 --> 00:18:28,860 Program khusus ini kami hanya melihat di tetapi beberapa lainnya, sudah pasti beberapa lainnya 426 00:18:28,860 --> 00:18:34,180 Fungsi mungkin berakhir diberikan tempat ini berikutnya dalam stack. 427 00:18:34,180 --> 00:18:39,410 >> Jadi tidak dapat bahwa toko GetString D-A-V-I-D di stack karena saya akan 428 00:18:39,410 --> 00:18:41,040 segera kehilangan akses ke sana. 429 00:18:41,040 --> 00:18:43,720 Tapi kita tahu mereka getString hanya mengembalikan apa? 430 00:18:43,720 --> 00:18:47,220 Ini tidak kembali ke saya enam karakter. 431 00:18:47,220 --> 00:18:51,090 Apa itu benar-benar kembali tidak kami menyimpulkan terakhir kali? 432 00:18:51,090 --> 00:18:52,480 Alamat yang pertama. 433 00:18:52,480 --> 00:18:56,650 Jadi entah bagaimana, ketika Anda menelepon GetString, itu mengalokasikan sepotong memori untuk 434 00:18:56,650 --> 00:18:59,620 string bahwa jenis pengguna dan alamat, maka kembali itu. 435 00:18:59,620 --> 00:19:02,930 Dan ternyata bahwa bila Anda ingin berfungsi untuk mengalokasikan memori dalam 436 00:19:02,930 --> 00:19:08,390 cara dan kembali kepada orang yang disebut fungsi itu, alamat 437 00:19:08,390 --> 00:19:11,870 bahwa sepotong memori, Anda benar-benar tidak bisa memasukkannya ke dalam tumpukan di 438 00:19:11,870 --> 00:19:14,750 bawah, karena secara fungsional itu hanya akan tidak menjadi milikmu sangat 439 00:19:14,750 --> 00:19:17,800 cepat, sehingga Anda mungkin bisa menebak mana kita mungkin akan melemparkannya 440 00:19:17,800 --> 00:19:20,130 sebagai gantinya, yang disebut tumpukan. 441 00:19:20,130 --> 00:19:25,290 >> Jadi antara bagian bawah memori Anda tata letak dan bagian atas memori Anda 442 00:19:25,290 --> 00:19:26,820 tata letak adalah sekelompok seluruh segmen. 443 00:19:26,820 --> 00:19:29,270 Salah satunya adalah stack, dan kanan di atas itu adalah tumpukan. 444 00:19:29,270 --> 00:19:33,680 Dan tumpukan hanya sepotong berbeda memori yang tidak digunakan untuk fungsi 445 00:19:33,680 --> 00:19:34,770 ketika mereka disebut. 446 00:19:34,770 --> 00:19:38,100 Ini digunakan untuk memori jangka panjang, ketika Anda ingin satu fungsi untuk ambil beberapa 447 00:19:38,100 --> 00:19:42,700 memori dan dapat menggantungkan itu tanpa kehilangan kontrol atas hal itu. 448 00:19:42,700 --> 00:19:45,550 >> Sekarang Anda bisa segera mungkin melihat bahwa ini bukan 449 00:19:45,550 --> 00:19:48,060 tentu desain yang sempurna. 450 00:19:48,060 --> 00:19:51,350 Sebagai program dialokasikan memori pada stack, atau Anda menelepon lebih dan 451 00:19:51,350 --> 00:19:55,540 fungsi lebih, atau saat Anda mengalokasikan memori pada heap dengan malloc off 452 00:19:55,540 --> 00:20:00,690 GetString lakukan, apa yang jelas tampaknya menjadi masalah yang tak terelakkan? 453 00:20:00,690 --> 00:20:00,860 >> Benar. 454 00:20:00,860 --> 00:20:03,150 Seperti fakta bahwa anak panah tersebut yang saling berhadapan 455 00:20:03,150 --> 00:20:04,380 bukan pertanda baik. 456 00:20:04,380 --> 00:20:08,630 Dan memang, kita bisa sangat cepat kecelakaan program dalam berbagai cara. 457 00:20:08,630 --> 00:20:12,050 Bahkan, saya pikir kita mungkin memiliki melakukan ini sengaja sekali. 458 00:20:12,050 --> 00:20:14,020 Atau jika tidak, mari kita lakukan sengaja sekarang. 459 00:20:14,020 --> 00:20:21,330 Biarkan aku pergi ke depan dan menulis Super cepat sebuah program yang disebut dontdothis.c. 460 00:20:21,330 --> 00:20:26,730 Dan sekarang aku akan pergi di sini dan jangan tajam termasuk stdio.h. 461 00:20:26,730 --> 00:20:32,620 Mari kita mendeklarasikan fungsi foo mengambil tanpa argumen, yaitu 462 00:20:32,620 --> 00:20:34,040 dinotasikan serta melalui void. 463 00:20:34,040 --> 00:20:37,830 >> Dan satu-satunya hal foo yang akan dilakukan adalah panggilan foo, yang mungkin bukan 464 00:20:37,830 --> 00:20:39,100 ide cerdas, tapi biarlah. 465 00:20:39,100 --> 00:20:40,490 Ent void main. 466 00:20:40,490 --> 00:20:45,270 Sekarang satu-satunya hal utama yang akan lakukan adalah memanggil foo juga. 467 00:20:45,270 --> 00:20:51,050 Dan hanya untuk iseng, aku akan pergi depan di sini dan mengatakan printf "Halo 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 melakukan kesalahan, Membuat dontdothis dot slash. 471 00:21:00,160 --> 00:21:01,960 Dan mari kita lakukan di jendela 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 Ayolah. 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 Rupanya, Anda dapat melakukan ini. 478 00:21:13,100 --> 00:21:15,190 Sialan. 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 Stand by. 482 00:21:17,370 --> 00:21:18,270 Apakah kita - 483 00:21:18,270 --> 00:21:20,110 Kami menggunakannya dengan Make. 484 00:21:20,110 --> 00:21:22,050 >> [Mendesah] 485 00:21:22,050 --> 00:21:25,110 >> Saya tahu, tapi saya pikir kita hanya yang dihapus. 486 00:21:25,110 --> 00:21:28,410 Uh, yeah. 487 00:21:28,410 --> 00:21:30,660 Sialan. 488 00:21:30,660 --> 00:21:32,640 Memecahkan Rob ini. 489 00:21:32,640 --> 00:21:34,678 Apa? 490 00:21:34,678 --> 00:21:35,928 Ini sangat sederhana. 491 00:21:35,928 --> 00:21:43,820 492 00:21:43,820 --> 00:21:47,360 Ya, kami berbelok optimasi off. 493 00:21:47,360 --> 00:21:48,970 OK, berdiri bye. 494 00:21:48,970 --> 00:21:49,950 Sekarang saya merasa lebih baik. 495 00:21:49,950 --> 00:21:51,390 OK. 496 00:21:51,390 --> 00:21:51,780 Baik. 497 00:21:51,780 --> 00:21:53,430 >> Jadi mari kita ulang ini - 498 00:21:53,430 --> 00:21:55,880 Membuat Anda dontdothis. 499 00:21:55,880 --> 00:22:00,090 Anda mungkin harus mengubah nama ini untuk dothis.c hanya dalam beberapa saat. 500 00:22:00,090 --> 00:22:00,710 Di sana kami 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 fakta bahwa saya mencetak sesuatu yang sebenarnya hanya 504 00:22:05,480 --> 00:22:08,150 memperlambat proses dimana kita akan mencapai titik itu. 505 00:22:08,150 --> 00:22:08,510 OK. 506 00:22:08,510 --> 00:22:08,870 Fiuh! 507 00:22:08,870 --> 00:22:11,180 >> Jadi apa yang sebenarnya terjadi? 508 00:22:11,180 --> 00:22:14,440 Alasan di sana, hanya sebagai samping, adalah melakukan apa-apa dalam hal input dan 509 00:22:14,440 --> 00:22:17,270 Output cenderung lebih lambat karena Anda harus menulis karakter ke 510 00:22:17,270 --> 00:22:18,600 layar, itu harus gulir. 511 00:22:18,600 --> 00:22:21,720 Jadi cerita panjang pendek, aku benar-benar telah terjadi begitu sabar, kita akan memiliki 512 00:22:21,720 --> 00:22:23,260 melihat ini hasil akhir juga. 513 00:22:23,260 --> 00:22:26,220 Sekarang saya mendapat tumpangan dari cetak-up, kita lihat segera. 514 00:22:26,220 --> 00:22:28,410 Jadi mengapa hal ini terjadi. 515 00:22:28,410 --> 00:22:31,300 Nah, penjelasan sederhana, tentu saja, adalah bahwa foo mungkin tidak seharusnya 516 00:22:31,300 --> 00:22:32,500 memanggil dirinya. 517 00:22:32,500 --> 00:22:34,470 >> Sekarang secara umum, ini rekursi. 518 00:22:34,470 --> 00:22:36,970 Dan kami pikir beberapa minggu lalu rekursif baik. 519 00:22:36,970 --> 00:22:40,330 Rekursi ini cara magis mengekspresikan diri Super ringkas. 520 00:22:40,330 --> 00:22:41,400 Dan itu hanya bekerja. 521 00:22:41,400 --> 00:22:45,060 Tapi ada fitur kunci dari semua program rekursif kami sudah bicara 522 00:22:45,060 --> 00:22:48,260 tentang dan melihat sejauh ini, yang adalah bahwa mereka memiliki apa? 523 00:22:48,260 --> 00:22:52,610 Sebuah kasus dasar, yang beberapa dikodekan Kasus yang mengatakan dalam beberapa situasi 524 00:22:52,610 --> 00:22:56,210 jangan panggil foo, yang jelas tidak terjadi di sini. 525 00:22:56,210 --> 00:22:58,920 >> Jadi apa yang sebenarnya terjadi dalam hal gambar ini? 526 00:22:58,920 --> 00:23:01,790 Nah, ketika utama panggilan foo, itu mendapat sepotong memori. 527 00:23:01,790 --> 00:23:04,150 Ketika foo foo panggilan, itu akan sepotong memori. 528 00:23:04,150 --> 00:23:06,430 Ketika foo foo panggilan, mendapat sepotong. 529 00:23:06,430 --> 00:23:07,080 Ia mendapat sepotong. 530 00:23:07,080 --> 00:23:08,120 Ia mendapat sepotong. 531 00:23:08,120 --> 00:23:09,460 Karena foo tidak pernah kembali. 532 00:23:09,460 --> 00:23:12,160 Kami tidak pernah menghapus salah satu dari mereka frame dari stack. 533 00:23:12,160 --> 00:23:15,930 Jadi kita bertiup melalui tumpukan, tidak untuk menyebutkan siapa tahu apa lagi, dan 534 00:23:15,930 --> 00:23:19,600 kita melangkahi batas-batas kami disebut segmen memori. 535 00:23:19,600 --> 00:23:21,790 Kesalahan pergi segmentasi palsu. 536 00:23:21,790 --> 00:23:24,110 >> Jadi solusi ada jelas tidak melakukan hal ini. 537 00:23:24,110 --> 00:23:28,830 Namun implikasi yang lebih besar adalah bahwa, ya, ada benar-benar beberapa batas, 538 00:23:28,830 --> 00:23:32,470 bahkan jika itu tidak didefinisikan dengan baik, seperti bagaimana banyak fungsi dapat Anda hubungi dalam 539 00:23:32,470 --> 00:23:34,970 Program, berapa kali fungsi dapat memanggil dirinya sendiri. 540 00:23:34,970 --> 00:23:38,430 Jadi meskipun kita melakukan memberitakan rekursi sebagai hal ini berpotensi ajaib yang 541 00:23:38,430 --> 00:23:41,870 beberapa minggu yang lalu untuk sigma fungsi, dan ketika kita mendapatkan data 542 00:23:41,870 --> 00:23:45,270 struktur dan CS50, Anda akan melihat lain aplikasi untuk itu, itu tidak 543 00:23:45,270 --> 00:23:46,500 tentu hal terbaik. 544 00:23:46,500 --> 00:23:50,070 Karena jika fungsi menyebut dirinya, menyebut dirinya, bahkan jika ada dasar 545 00:23:50,070 --> 00:23:54,860 kasus, jika Anda tidak memukul kasus dasar untuk 1.000 panggilan atau 10.000 panggilan, oleh 546 00:23:54,860 --> 00:23:58,800 saat itu Anda mungkin telah kehabisan ruang pada Anda disebut stack dan hit 547 00:23:58,800 --> 00:24:00,400 beberapa segmen lain dari memori. 548 00:24:00,400 --> 00:24:03,950 Jadi itu juga merupakan desain trade-off antara keanggunan dan antara 549 00:24:03,950 --> 00:24:06,920 ketahanan khusus Anda implementasi. 550 00:24:06,920 --> 00:24:10,780 >> Jadi ada downside lain atau Gotcha lain untuk apa yang kita punya 551 00:24:10,780 --> 00:24:11,720 telah melakukan sejauh ini. 552 00:24:11,720 --> 00:24:12,980 Ketika saya menelepon GetString - 553 00:24:12,980 --> 00:24:15,120 biarkan aku kembali ke hello-2. 554 00:24:15,120 --> 00:24:18,170 Perhatikan bahwa aku menelepon GetString, yang kembali alamat. 555 00:24:18,170 --> 00:24:20,730 Dan kita mengklaim hari ini bahwa alamat adalah dari tumpukan. 556 00:24:20,730 --> 00:24:24,480 Dan sekarang saya mencetak keluar string pada alamat tersebut. 557 00:24:24,480 --> 00:24:27,000 Tapi kita tidak pernah disebut kebalikan dari GetString. 558 00:24:27,000 --> 00:24:30,850 Kami tidak pernah harus calll fungsi seperti ungetstring, di mana Anda menyerahkan kembali 559 00:24:30,850 --> 00:24:31,610 memori itu. 560 00:24:31,610 --> 00:24:33,250 Tapi terus terang kita mungkin seharusnya. 561 00:24:33,250 --> 00:24:37,390 Karena jika kita terus bertanya komputer untuk memori, dengan cara seseorang seperti 562 00:24:37,390 --> 00:24:40,830 GetString tetapi tidak pernah mengembalikannya, pasti yang juga adalah terikat untuk menyebabkan 563 00:24:40,830 --> 00:24:42,970 masalah dimana kita kehabisan memori. 564 00:24:42,970 --> 00:24:46,140 >> Dan pada kenyataannya, kita bisa mencari ini masalah dengan alat baru yang penggunaan 565 00:24:46,140 --> 00:24:47,640 adalah samar sedikit untuk mengetik. 566 00:24:47,640 --> 00:24:50,960 Tapi biarkan aku pergi ke depan dan percikan itu pada layar hanya dalam beberapa saat. 567 00:24:50,960 --> 00:24:56,940 Aku akan pergi ke depan dan menjalankan Valgrind dengan parameter yang perintah pertama 568 00:24:56,940 --> 00:25:00,260 argumen baris adalah nama program yang hello-2. 569 00:25:00,260 --> 00:25:02,650 Dan sayangnya itu output atrociously 570 00:25:02,650 --> 00:25:04,290 kompleks tanpa alasan. 571 00:25:04,290 --> 00:25:06,280 Jadi kita melihat semua yang berantakan. 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 benar-benar 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 mirip semangat yang GDB. 576 00:25:13,400 --> 00:25:14,950 Ini bukan debugger per se. 577 00:25:14,950 --> 00:25:16,270 Tapi itu pemeriksa memori. 578 00:25:16,270 --> 00:25:20,140 Ini adalah program yang akan dijalankan Anda memprogram dan memberitahu Anda jika Anda bertanya 579 00:25:20,140 --> 00:25:23,860 komputer untuk memori dan tidak pernah menyerahkannya kembali, dengan demikian berarti bahwa Anda harus 580 00:25:23,860 --> 00:25:24,570 kebocoran memori. 581 00:25:24,570 --> 00:25:26,240 Dan kebocoran memori cenderung buruk. 582 00:25:26,240 --> 00:25:29,120 Dan Anda adalah pengguna komputer memiliki mungkin merasa ini, apakah Anda memiliki 583 00:25:29,120 --> 00:25:30,300 Mac atau PC. 584 00:25:30,300 --> 00:25:33,730 Apakah Anda pernah menggunakan komputer Anda untuk sementara dan tidak reboot dalam beberapa 585 00:25:33,730 --> 00:25:36,820 hari, atau Anda baru saja punya banyak program yang berjalan, dan sialan 586 00:25:36,820 --> 00:25:42,360 memperlambat berhenti grinding, atau setidaknya itu super menjengkelkan untuk digunakan, karena 587 00:25:42,360 --> 00:25:44,350 semuanya hanya mendapat super lambat. 588 00:25:44,350 --> 00:25:46,260 >> Sekarang yang dapat sejumlah alasan. 589 00:25:46,260 --> 00:25:49,600 Ini bisa menjadi infinite loop, bug dalam Kode seseorang, atau, lebih sederhana, 590 00:25:49,600 --> 00:25:53,250 bisa berarti bahwa Anda menggunakan lebih memori, atau mencoba untuk, daripada Anda 591 00:25:53,250 --> 00:25:54,920 komputer sebenarnya memiliki. 592 00:25:54,920 --> 00:25:57,770 Dan mungkin ada bug pada beberapa program yang terus meminta untuk memori. 593 00:25:57,770 --> 00:26:02,480 Browser selama bertahun-tahun yang terkenal untuk ini, meminta lebih banyak memori 594 00:26:02,480 --> 00:26:03,870 tetapi tidak pernah menyerahkan kembali. 595 00:26:03,870 --> 00:26:07,220 Tentunya, jika Anda hanya memiliki terbatas jumlah memori, Anda tidak dapat meminta 596 00:26:07,220 --> 00:26:09,990 jauh berkali-kali untuk beberapa memori yang. 597 00:26:09,990 --> 00:26:13,070 >> Dan jadi apa yang Anda lihat di sini, meskipun kembali outputnya Valgrind adalah 598 00:26:13,070 --> 00:26:17,490 tidak perlu kompleks untuk melirik pertama, ini adalah bagian 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, inilah berapa banyak memori itu digunakan di tumpukan di 602 00:26:22,810 --> 00:26:24,300 waktu program saya keluar - 603 00:26:24,300 --> 00:26:27,280 ternyata enam byte dalam satu blok. 604 00:26:27,280 --> 00:26:28,710 Jadi aku akan melambaikan tangan saya apa sebuah blok. 605 00:26:28,710 --> 00:26:31,270 Pikirkan itu hanya sepotong, yang lebih kata teknis untuk potongan. 606 00:26:31,270 --> 00:26:33,140 Tapi enam byte - 607 00:26:33,140 --> 00:26:36,870 apa saja enam byte yang yang masih digunakan? 608 00:26:36,870 --> 00:26:37,390 >> Tepat. 609 00:26:37,390 --> 00:26:41,520 D-A-V-I-D backslash nol, lima surat Nama ditambah null terminator. 610 00:26:41,520 --> 00:26:46,350 Jadi program ini valgrind menyadari bahwa saya meminta enam byte, tampaknya, oleh 611 00:26:46,350 --> 00:26:48,950 cara GetString, tetapi tidak pernah memberi mereka kembali. 612 00:26:48,950 --> 00:26:52,030 Dan pada kenyataannya, ini mungkin tidak begitu jelas jika program saya tidak tiga 613 00:26:52,030 --> 00:26:53,590 garis, tapi itu 300 baris. 614 00:26:53,590 --> 00:26:56,920 Jadi kita benar-benar bisa memberikan perintah lain argumen baris untuk Valgrind ke 615 00:26:56,920 --> 00:26:58,290 membuatnya lebih verbose. 616 00:26:58,290 --> 00:26:59,760 Ini sedikit mengganggu untuk diingat. 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 Leak - 620 00:27:03,540 --> 00:27:05,030 Apakah itu bocor - 621 00:27:05,030 --> 00:27:07,580 bahkan aku tidak ingat apa itu dari tangan. 622 00:27:07,580 --> 00:27:08,550 >> - Kebocoran-cek sama penuh. 623 00:27:08,550 --> 00:27:10,180 Yap, terima kasih. 624 00:27:10,180 --> 00:27:12,520 - Kebocoran-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 berjalan. 627 00:27:14,940 --> 00:27:16,180 Ketik David lagi. 628 00:27:16,180 --> 00:27:17,660 Sekarang saya melihat sedikit lebih detail. 629 00:27:17,660 --> 00:27:20,890 Tetapi di bawah ringkasan tumpukan, yang identik dengan empat - ah, 630 00:27:20,890 --> 00:27:22,120 ini adalah jenis yang baik. 631 00:27:22,120 --> 00:27:25,460 Sekarang Valgrind sebenarnya mencari lebih sulit dalam kode kecilku. 632 00:27:25,460 --> 00:27:29,580 Dan itu mengatakan bahwa, tampaknya, malloc pada baris - 633 00:27:29,580 --> 00:27:30,580 kita zoom out. 634 00:27:30,580 --> 00:27:31,980 Pada baris - 635 00:27:31,980 --> 00:27:32,930 kita tidak melihat apa garis itu. 636 00:27:32,930 --> 00:27:35,110 Tapi malloc adalah penyebab pertama. 637 00:27:35,110 --> 00:27:38,630 Ada sebuah blog dalam malloc. 638 00:27:38,630 --> 00:27:39,810 >> Baiklah? 639 00:27:39,810 --> 00:27:40,450 OK, tidak ada. 640 00:27:40,450 --> 00:27:40,940 Benar? 641 00:27:40,940 --> 00:27:42,520 Aku menelepon getString. 642 00:27:42,520 --> 00:27:44,460 GetString rupanya panggilan malloc. 643 00:27:44,460 --> 00:27:47,800 Jadi apa baris kode ini rupanya bersalah karena telah 644 00:27:47,800 --> 00:27:49,050 dialokasikan memori ini? 645 00:27:49,050 --> 00:27:51,560 646 00:27:51,560 --> 00:27:55,540 Mari kita berasumsi bahwa siapapun yang menulis malloc telah ada cukup lama bahwa itu 647 00:27:55,540 --> 00:27:56,390 bukan kesalahan mereka. 648 00:27:56,390 --> 00:27:57,520 Jadi itu mungkin saya. 649 00:27:57,520 --> 00:28:02,000 getString di cs50.c - jadi itu mengajukan suatu tempat di komputer - 650 00:28:02,000 --> 00:28:05,210 sejalan 286 tampaknya menjadi pelakunya. 651 00:28:05,210 --> 00:28:08,140 Sekarang mari kita asumsikan bahwa CS50 telah sekitar untuk jumlah waktu yang layak, sehingga 652 00:28:08,140 --> 00:28:09,720 kita juga tidak bisa salah. 653 00:28:09,720 --> 00:28:14,080 Dan jadi mungkin tidak getString bug tersebut terletak, melainkan dalam 654 00:28:14,080 --> 00:28:17,810 baris halo-2c 18. 655 00:28:17,810 --> 00:28:20,670 >> Jadi mari kita lihat apa baris yang 18 itu. 656 00:28:20,670 --> 00:28:21,130 Oh. 657 00:28:21,130 --> 00:28:27,130 Entah bagaimana baris ini tidak selalu buggy, per se, tetapi itu adalah alasan 658 00:28:27,130 --> 00:28:28,630 belakang kebocoran memori. 659 00:28:28,630 --> 00:28:32,140 Jadi super sederhana, apa yang akan intuitif menjadi solusi di sini? 660 00:28:32,140 --> 00:28:34,710 Jika kita meminta memori, tidak pernah memberikan kembali, dan yang tampaknya menjadi 661 00:28:34,710 --> 00:28:37,940 masalah karena dari waktu ke waktu komputer saya mungkin kehabisan memori, bisa memperlambat 662 00:28:37,940 --> 00:28:42,110 bawah, hal-hal buruk yang mungkin terjadi, baik, apa solusi sederhana intuitif? 663 00:28:42,110 --> 00:28:43,140 Hanya mengembalikannya. 664 00:28:43,140 --> 00:28:44,770 >> Bagaimana Anda membebaskan memori itu? 665 00:28:44,770 --> 00:28:49,970 Yah, untungnya itu cukup sederhana hanya mengatakan nama gratis. 666 00:28:49,970 --> 00:28:51,260 Dan kami tidak pernah melakukan hal ini sebelumnya. 667 00:28:51,260 --> 00:28:55,890 Tapi Anda pada dasarnya bisa memikirkan gratis sebagai kebalikan dari malloc. 668 00:28:55,890 --> 00:28:58,030 bebas adalah kebalikan dari mengalokasikan memori. 669 00:28:58,030 --> 00:28:59,540 Jadi sekarang biarkan aku mengkompilasi ulang ini. 670 00:28:59,540 --> 00:29:02,050 Membuat hello-2. 671 00:29:02,050 --> 00:29:04,620 Mari saya jalankan lagi. hello-2 David. 672 00:29:04,620 --> 00:29:07,290 Jadi sepertinya untuk bekerja di cara yang persis sama. 673 00:29:07,290 --> 00:29:11,180 Tapi jika saya kembali ke Valgrind dan kembali menjalankan bahwa perintah yang sama pada saya baru 674 00:29:11,180 --> 00:29:14,720 program yang dikompilasi, mengetik dalam nama-Ku seperti sebelumnya - 675 00:29:14,720 --> 00:29:15,370 bagus. 676 00:29:15,370 --> 00:29:16,760 Heap ringkasan - 677 00:29:16,760 --> 00:29:17,740 digunakan pada keluar - 678 00:29:17,740 --> 00:29:19,370 nol byte dalam blok nol. 679 00:29:19,370 --> 00:29:21,840 Dan ini adalah super bagus, semua blok tumpukan dibebaskan. 680 00:29:21,840 --> 00:29:23,480 Tidak ada kebocoran yang mungkin. 681 00:29:23,480 --> 00:29:27,200 >> Jadi datang, bukan dengan Soal Set 4, tapi dengan Masalah Set 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, apakah Anda memiliki atau tidak memiliki kebocoran memori. 684 00:29:33,630 --> 00:29:36,900 Tapi untungnya, Anda tidak hanya dapat alasan melalui mereka intuitif, yang 685 00:29:36,900 --> 00:29:40,430 adalah, bisa dibilang, mudah untuk program kecil tapi lebih sulit untuk program yang lebih besar, 686 00:29:40,430 --> 00:29:43,860 Valgrind, untuk program-program yang lebih besar, dapat membantu Anda mengidentifikasi 687 00:29:43,860 --> 00:29:45,360 masalah tertentu. 688 00:29:45,360 --> 00:29:47,500 >> Tapi ada satu masalah lain yang mungkin timbul. 689 00:29:47,500 --> 00:29:51,245 Mari saya membuka file ini di sini, yang adalah, lagi, contoh yang agak sederhana. 690 00:29:51,245 --> 00:29:53,760 Tapi mari kita fokus pada apa yang program ini tidak. 691 00:29:53,760 --> 00:29:55,190 Ini disebut memory.c. 692 00:29:55,190 --> 00:29:58,380 Kami akan posting kemudian hari ini di zip kode sumber saat ini. 693 00:29:58,380 --> 00:30:01,610 Dan melihat bahwa saya memiliki fungsi yang disebut f yang tidak mengambil argumen dan 694 00:30:01,610 --> 00:30:02,800 mengembalikan apa-apa. 695 00:30:02,800 --> 00:30:07,240 Sejalan 20, aku ternyata mendeklarasikan pointer ke int dan menyebutnya x. 696 00:30:07,240 --> 00:30:09,570 Aku menugaskan adalah kembalinya nilai malloc. 697 00:30:09,570 --> 00:30:14,590 Dan hanya harus jelas, berapa banyak byte am Aku mungkin 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 mana Anda mendapatkan bahwa dari? 701 00:30:18,840 --> 00:30:22,410 Nah, jika Anda ingat bahwa int sering 4 byte, setidaknya itu dalam 702 00:30:22,410 --> 00:30:25,110 alat, 10 kali 4 jelas 40. 703 00:30:25,110 --> 00:30:28,920 Jadi malloc kembali sebuah alamat sepotong memori dan penyimpanan yang 704 00:30:28,920 --> 00:30:30,800 alamat akhirnya dalam x. 705 00:30:30,800 --> 00:30:32,570 Jadi harus jelas, apa yang kemudian yang terjadi? 706 00:30:32,570 --> 00:30:34,990 Nah, biarkan aku beralih kembali ke gambar kami di sini. 707 00:30:34,990 --> 00:30:38,150 Biarkan aku hanya menggambar bagian bawah saya memori komputer, biarkan aku pergi ke depan dan 708 00:30:38,150 --> 00:30:42,990 menarik seluruh persegi panjang yang mewakili semua RAM saya. 709 00:30:42,990 --> 00:30:44,790 >> Kami akan mengatakan bahwa tumpukan adalah di bagian bawah. 710 00:30:44,790 --> 00:30:47,010 Dan ada segmen teks dalam data diinisiasi. 711 00:30:47,010 --> 00:30:49,880 Tapi aku hanya akan abstrak mereka hal-hal lain yang jauh seperti titik, titik dot. 712 00:30:49,880 --> 00:30:53,470 Aku hanya akan lihat ini sebagai tumpukan di bagian atas. 713 00:30:53,470 --> 00:30:57,070 Dan kemudian di bagian bawah gambar ini, untuk mewakili utama, aku akan 714 00:30:57,070 --> 00:30:59,880 untuk memberikan memori irisan di stack. 715 00:30:59,880 --> 00:31:03,150 Untuk f, aku akan memberikan sepotong memori di stack. 716 00:31:03,150 --> 00:31:05,140 Sekarang, saya harus berkonsultasi saya source code lagi. 717 00:31:05,140 --> 00:31:07,170 Apa variabel lokal untuk utama? 718 00:31:07,170 --> 00:31:10,710 Ternyata tidak ada, sehingga slice yang efektif kosong atau tidak bahkan sebesar 719 00:31:10,710 --> 00:31:11,600 seperti yang telah saya ditarik itu. 720 00:31:11,600 --> 00:31:15,730 Tapi dalam f, saya memiliki variabel lokal, yang disebut x. 721 00:31:15,730 --> 00:31:20,410 Jadi aku akan pergi ke depan dan memberikan f sepotong memori, menyebutnya x. 722 00:31:20,410 --> 00:31:24,680 >> Dan sekarang malloc dari 10 kali 4, Jadi malloc 40, di mana itu 723 00:31:24,680 --> 00:31:25,430 memori berasal? 724 00:31:25,430 --> 00:31:27,530 Kami sudah tidak ditarik gambar seperti ini sebelumnya. 725 00:31:27,530 --> 00:31:31,140 Tapi anggap bahwa itu efektif 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 aku perlu 40 ini. 728 00:31:34,680 --> 00:31:37,540 Jadi saya hanya akan melakukan titik, titik, titik untuk menyarankan bahwa ada lebih banyak memori 729 00:31:37,540 --> 00:31:39,350 datang kembali dari tumpukan. 730 00:31:39,350 --> 00:31:40,710 Sekarang apa alamatnya? 731 00:31:40,710 --> 00:31:42,620 Mari kita memilih sewenang-wenang kami alamat seperti biasa - 732 00:31:42,620 --> 00:31:46,310 Ox123, meskipun itu mungkin akan menjadi sesuatu yang sama sekali berbeda. 733 00:31:46,310 --> 00:31:50,420 Itulah alamat byte pertama dalam memori yang saya minta untuk malloc. 734 00:31:50,420 --> 00:31:53,630 >> Jadi singkatnya, setelah baris 20 dijalankan, apa yang benar-benar 735 00:31:53,630 --> 00:31:57,170 disimpan dalam x 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 Kerbau tidak menarik. 739 00:32:01,550 --> 00:32:03,200 Ini hanya berarti di sini adalah angka heksadesimal. 740 00:32:03,200 --> 00:32:06,490 Tapi apa yang utama adalah bahwa apa yang telah saya toko dalam x, yang merupakan variabel lokal. 741 00:32:06,490 --> 00:32:10,260 Tapi tipe datanya, sekali lagi, adalah alamat dari sebuah int. 742 00:32:10,260 --> 00:32:12,710 Yah, aku akan menyimpan Ox123. 743 00:32:12,710 --> 00:32:16,610 Tapi sekali lagi, kalau itu agak terlalu rumit tidak perlu, jika saya gulir 744 00:32:16,610 --> 00:32:21,490 kembali, kita bisa abstrak ini pergi cukup cukup dan hanya mengatakan bahwa x adalah 745 00:32:21,490 --> 00:32:23,910 pointer dengan sepotong memori. 746 00:32:23,910 --> 00:32:24,070 >> OK. 747 00:32:24,070 --> 00:32:26,230 Sekarang pertanyaan di tangan adalah sebagai berikut - 748 00:32:26,230 --> 00:32:29,910 line 21, ternyata, adalah kereta. 749 00:32:29,910 --> 00:32:31,160 Kenapa? 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 Itu tidak memiliki - 753 00:32:38,640 --> 00:32:40,390 mengatakan bahwa sekali lagi. 754 00:32:40,390 --> 00:32:41,240 Yah, itu tidak gratis. 755 00:32:41,240 --> 00:32:42,350 Jadi itulah kedua tetapi. 756 00:32:42,350 --> 00:32:45,000 Jadi ada yang lain namun secara khusus pada baris 21. 757 00:32:45,000 --> 00:32:49,480 758 00:32:49,480 --> 00:32:50,040 >> Tepat. 759 00:32:50,040 --> 00:32:54,980 Ini baris kode sederhana hanya buffer overflow, buffer overrun. 760 00:32:54,980 --> 00:32:57,050 Buffer hanya berarti sepotong memori. 761 00:32:57,050 --> 00:33:01,520 Tapi itu sepotong memori adalah ukuran 10, 10 bilangan bulat, yang berarti jika kita 762 00:33:01,520 --> 00:33:05,350 indeks ke dalamnya menggunakan sintaksis gula notasi array, alun-alun 763 00:33:05,350 --> 00:33:09,220 kurung, Anda memiliki akses ke x braket 0 x 1 x braket, 764 00:33:09,220 --> 00:33:10,390 braket titik, titik, titik. 765 00:33:10,390 --> 00:33:13,270 x braket 9 adalah yang terbesar. 766 00:33:13,270 --> 00:33:17,680 Jadi jika saya melakukan x braket 10, di mana Aku benar-benar akan di memori? 767 00:33:17,680 --> 00:33:19,120 >> Nah, jika saya memiliki 10 int - 768 00:33:19,120 --> 00:33:21,070 mari kita benar-benar menarik semua ini keluar di sini. 769 00:33:21,070 --> 00:33:22,700 Jadi itu lima pertama. 770 00:33:22,700 --> 00:33:24,660 Berikut lima ints lainnya. 771 00:33:24,660 --> 00:33:29,580 Jadi x braket 0 di sini. x braket 1 adalah di sini. x braket 9 di sini. x braket 772 00:33:29,580 --> 00:33:37,960 10 di sini, yang berarti saya mengatakan, di line 21, komputer untuk menempatkan 773 00:33:37,960 --> 00:33:39,400 nomor di mana? 774 00:33:39,400 --> 00:33:42,010 Angka 0 di mana? 775 00:33:42,010 --> 00:33:43,380 Yah, itu 0, ya. 776 00:33:43,380 --> 00:33:45,460 Tapi fakta bahwa 0 nya adalah jenis kebetulan. 777 00:33:45,460 --> 00:33:47,140 Ini bisa menjadi nomor 50, untuk semua kita peduli. 778 00:33:47,140 --> 00:33:50,480 Tapi kami berusaha untuk memasukkannya pada x braket 10, yang mana ini 779 00:33:50,480 --> 00:33:53,700 tanda tanya ditarik, yang bukanlah hal yang baik. 780 00:33:53,700 --> 00:33:57,070 Program ini mungkin sangat baik kecelakaan sebagai hasilnya. 781 00:33:57,070 --> 00:33:59,400 >> Sekarang, mari kita pergi ke depan dan melihat apakah ini adalah, memang, apa yang terjadi. 782 00:33:59,400 --> 00:34:02,600 Membuat memori, karena file disebut memory.c. 783 00:34:02,600 --> 00:34:05,950 Mari kita pergi ke depan dan menjalankan memori program. 784 00:34:05,950 --> 00:34:08,239 Jadi kita beruntung, sebenarnya, tampaknya. 785 00:34:08,239 --> 00:34:09,340 Kami beruntung. 786 00:34:09,340 --> 00:34:11,060 Tapi mari kita lihat apakah kita sekarang menjalankan Valgrind. 787 00:34:11,060 --> 00:34:14,170 Pada pandangan pertama, program saya mungkin tampaknya sempurna benar. 788 00:34:14,170 --> 00:34:18,010 Tapi biarkan aku menjalankan Valgrind dengan - Kebocoran-cek sama penuh pada memori. 789 00:34:18,010 --> 00:34:20,110 >> Dan sekarang ketika saya menjalankan ini - 790 00:34:20,110 --> 00:34:21,030 menarik. 791 00:34:21,030 --> 00:34:26,800 Valid menulis ukuran 4 di baris 21 memory.c. 792 00:34:26,800 --> 00:34:29,284 Baris 21 memory.c adalah yang mana? 793 00:34:29,284 --> 00:34:30,340 Oh, menarik. 794 00:34:30,340 --> 00:34:31,080 Tapi tunggu. 795 00:34:31,080 --> 00:34:32,389 Ukuran 4, apa itu maksud? 796 00:34:32,389 --> 00:34:34,969 Saya hanya melakukan satu menulis, tapi itu ukuran 4. 797 00:34:34,969 --> 00:34:36,889 Mengapa 4? 798 00:34:36,889 --> 00:34:39,280 Itu karena itu adalah int, yang , sekali lagi, empat byte. 799 00:34:39,280 --> 00:34:42,510 Jadi Valgrind menemukan bug yang saya, melirik kode saya, tidak. 800 00:34:42,510 --> 00:34:45,040 Dan mungkin Anda akan TF atau tidak. 801 00:34:45,040 --> 00:34:48,469 Apa Tapi Valgrind pasti menemukan bahwa kami telah membuat kesalahan di sana, bahkan 802 00:34:48,469 --> 00:34:52,719 meskipun kami beruntung, dan komputer memutuskan, eh, aku tidak akan crash 803 00:34:52,719 --> 00:34:57,470 hanya karena Anda menyentuh satu byte, satu senilai int tentang memori yang tidak 804 00:34:57,470 --> 00:34:58,550 benar-benar 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 mencari alamat gila dalam heksadesimal. 808 00:35:03,190 --> 00:35:06,890 Itu hanya berarti suatu tempat di tumpukan merupakan nol byte setelah blok ukuran 40 809 00:35:06,890 --> 00:35:07,620 dialokasikan. 810 00:35:07,620 --> 00:35:10,610 Mari saya zoom out di sini dan melihat apakah ini sedikit lebih bermanfaat. 811 00:35:10,610 --> 00:35:11,410 Menarik. 812 00:35:11,410 --> 00:35:15,600 40 byte pasti hilang dalam catatan kehilangan 1 dari 1. 813 00:35:15,600 --> 00:35:17,840 Sekali lagi, kata-kata lebih dari yang berguna di sini. 814 00:35:17,840 --> 00:35:21,350 Tapi berdasarkan garis disorot, mana yang harus saya mungkin fokus saya 815 00:35:21,350 --> 00:35:24,070 perhatian untuk bug lain? 816 00:35:24,070 --> 00:35:26,570 Sepertinya garis 20 dari memory.c. 817 00:35:26,570 --> 00:35:30,990 >> Jadi, jika kita kembali ke jalur 20, itulah salah satu yang Anda identifikasi sebelumnya. 818 00:35:30,990 --> 00:35:33,030 Dan itu belum tentu kereta. 819 00:35:33,030 --> 00:35:35,160 Tapi kita ini terbalik dampaknya. 820 00:35:35,160 --> 00:35:38,790 Jadi bagaimana cara memperbaiki setidaknya salah satu kesalahan? 821 00:35:38,790 --> 00:35:42,240 Apa yang bisa saya lakukan setelah line 21? 822 00:35:42,240 --> 00:35:47,110 Aku bisa melakukan bebas dari x, begitu juga untuk memberikan kembali memori itu. 823 00:35:47,110 --> 00:35:49,230 Dan bagaimana cara memperbaiki bug ini? 824 00:35:49,230 --> 00:35:52,120 Saya pasti harus pergi tidak lebih jauh dari 0. 825 00:35:52,120 --> 00:35:53,670 Jadi biarkan saya mencoba dan kembali menjalankan ini. 826 00:35:53,670 --> 00:35:56,080 Maaf, pasti pergi tidak lebih jauh dari 9. 827 00:35:56,080 --> 00:35:57,510 Membuat memori. 828 00:35:57,510 --> 00:36:00,650 Biarkan aku memutarkan Valgrind di jendela yang lebih besar. 829 00:36:00,650 --> 00:36:01,580 Dan sekarang lihat. 830 00:36:01,580 --> 00:36:02,250 Nice. 831 00:36:02,250 --> 00:36:03,270 Semua blok tumpukan dibebaskan. 832 00:36:03,270 --> 00:36:04,270 Tidak ada kebocoran yang mungkin. 833 00:36:04,270 --> 00:36:07,520 Dan sampai di atas sini, tidak ada lagi lagi hak valid. 834 00:36:07,520 --> 00:36:09,820 >> Hanya untuk serakah, dan mari kita melihat apakah demonstrasi lain 835 00:36:09,820 --> 00:36:11,050 tidak pergi sebagaimana dimaksud - 836 00:36:11,050 --> 00:36:12,560 Aku beruntung beberapa saat yang lalu. 837 00:36:12,560 --> 00:36:15,530 Dan fakta bahwa ini adalah 0 mungkin tidak perlu menyesatkan. 838 00:36:15,530 --> 00:36:20,650 Mari kita lakukan 50, agak sewenang-wenang nomor, membuat memori memori dot slash - 839 00:36:20,650 --> 00:36:21,410 masih beruntung. 840 00:36:21,410 --> 00:36:22,510 Tidak ada yang menerjang. 841 00:36:22,510 --> 00:36:26,150 Misalkan saya hanya melakukan sesuatu yang benar-benar bodoh, dan saya melakukan 100. 842 00:36:26,150 --> 00:36:30,360 Biarkan aku remake memori, dot slash memori - 843 00:36:30,360 --> 00:36:31,075 beruntung lagi. 844 00:36:31,075 --> 00:36:32,800 Bagaimana sekitar 1.000? 845 00:36:32,800 --> 00:36:35,370 ints luar, kasar, di mana saya seharusnya? 846 00:36:35,370 --> 00:36:37,410 Membuat memori - 847 00:36:37,410 --> 00:36:38,570 sialan. 848 00:36:38,570 --> 00:36:39,920 >> [Tertawa] 849 00:36:39,920 --> 00:36:41,270 >> OK. 850 00:36:41,270 --> 00:36:43,920 Jangan main-main lagi. 851 00:36:43,920 --> 00:36:45,120 Jalankan kembali memori. 852 00:36:45,120 --> 00:36:45,840 Di sana kami pergi. 853 00:36:45,840 --> 00:36:46,410 Baik. 854 00:36:46,410 --> 00:36:52,500 Jadi tampaknya Anda indeks 100.000 ints di luar di mana Anda seharusnya berada di 855 00:36:52,500 --> 00:36:54,410 memori, hal buruk terjadi. 856 00:36:54,410 --> 00:36:56,430 Jadi ini jelas tidak keras, aturan cepat. 857 00:36:56,430 --> 00:36:58,190 Aku agak menggunakan trial and error untuk sampai ke sana. 858 00:36:58,190 --> 00:37:02,230 Tapi ini karena, singkat cerita, memori komputer Anda juga dibagi 859 00:37:02,230 --> 00:37:03,580 dalam hal ini disebut segmen. 860 00:37:03,580 --> 00:37:07,260 Dan kadang-kadang, komputer benar-benar telah memberi Anda sedikit lebih banyak memori 861 00:37:07,260 --> 00:37:08,400 dari yang Anda minta. 862 00:37:08,400 --> 00:37:12,170 Tapi untuk efisiensi, itu hanya lebih mudah untuk mendapatkan lebih banyak memori, tetapi hanya memberitahu Anda 863 00:37:12,170 --> 00:37:13,780 bahwa Anda mendapatkan sebagian darinya. 864 00:37:13,780 --> 00:37:16,370 >> Dan jika Anda beruntung kadang-kadang, Oleh karena itu, Anda mungkin bisa 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 memiliki jaminan bahwa apa yang nilai Anda diletakkan di sana akan tinggal di sana, karena 867 00:37:21,860 --> 00:37:25,080 komputer masih berpikir itu tidak Anda, tapi itu belum tentu akan 868 00:37:25,080 --> 00:37:29,910 untuk memukul segmen memori yang lain dalam komputer dan menyebabkan kesalahan seperti 869 00:37:29,910 --> 00:37:31,710 ini satu di sini. 870 00:37:31,710 --> 00:37:32,060 Baik. 871 00:37:32,060 --> 00:37:37,240 Setiap pertanyaan kemudian pada memori? 872 00:37:37,240 --> 00:37:37,590 >> Baik. 873 00:37:37,590 --> 00:37:40,610 Mari kita lihat di sini, kemudian, pada sesuatu yang kita telah mengambil untuk 874 00:37:40,610 --> 00:37:48,361 diberikan untuk beberapa waktu, yang dalam file ini disebut cs50.h. 875 00:37:48,361 --> 00:37:49,420 Jadi ini adalah file. 876 00:37:49,420 --> 00:37:51,130 Ini hanya keseluruhan sekelompok komentar atas. 877 00:37:51,130 --> 00:37:53,900 Dan Anda mungkin telah melihat ini jika Anda menjulurkan sekitar pada alat. 878 00:37:53,900 --> 00:37:57,000 Tapi ternyata itu sepanjang waktu, ketika kita digunakan untuk menggunakan string sebagai 879 00:37:57,000 --> 00:38:01,130 sinonim, cara-cara yang kami nyatakan yang sinonim adalah dengan 880 00:38:01,130 --> 00:38:03,990 kata kunci typedef, untuk jenis definisi. 881 00:38:03,990 --> 00:38:07,500 Dan kita pada dasarnya mengatakan, membuat merangkai sinonim untuk bintang arang. 882 00:38:07,500 --> 00:38:11,190 Itu cara-cara yang stack menciptakan roda pelatihan ini dikenal sebagai 883 00:38:11,190 --> 00:38:12,040 string. 884 00:38:12,040 --> 00:38:14,830 >> Sekarang inilah hanya prototipe untuk getchar. 885 00:38:14,830 --> 00:38:17,350 Kita mungkin telah melihat itu sebelumnya, tapi itu memang apa yang dilakukannya. getchar 886 00:38:17,350 --> 00:38:19,070 tidak membutuhkan argumen, mengembalikan char. 887 00:38:19,070 --> 00:38:21,340 getdouble tidak membutuhkan argumen, mengembalikan ganda. 888 00:38:21,340 --> 00:38:24,440 getFloat tidak membutuhkan argumen, pengembalian pelampung, dan sebagainya. 889 00:38:24,440 --> 00:38:27,270 getInt berada di sini. getlonglong ada di sini. 890 00:38:27,270 --> 00:38:28,820 Dan GetString berada di sini. 891 00:38:28,820 --> 00:38:29,420 Dan itu saja. 892 00:38:29,420 --> 00:38:33,080 Ini garis ungu adalah preprocessor lain direktif karena 893 00:38:33,080 --> 00:38:35,550 hashtag di awal itu. 894 00:38:35,550 --> 00:38:35,870 >> Baik. 895 00:38:35,870 --> 00:38:38,380 Jadi sekarang biarkan aku pergi ke cs50.c. 896 00:38:38,380 --> 00:38:40,400 Dan kita tidak akan berbicara terlalu lama ini. 897 00:38:40,400 --> 00:38:43,280 Tetapi untuk memberikan sekilas tentang apa yang terjadi pada semua ini 898 00:38:43,280 --> 00:38:46,434 waktu, biarkan aku pergi ke - 899 00:38:46,434 --> 00:38:48,250 mari kita lakukan getchar. 900 00:38:48,250 --> 00:38:51,050 Jadi getchar sebagian besar komentar. 901 00:38:51,050 --> 00:38:52,060 Tapi sepertinya ini. 902 00:38:52,060 --> 00:38:54,800 Jadi ini adalah fungsi yang sebenarnya getchar bahwa kita telah 903 00:38:54,800 --> 00:38:56,055 mengambil untuk diberikan ada. 904 00:38:56,055 --> 00:38:59,370 Dan meskipun kita belum menggunakan yang satu ini yang sering, jika pernah, itu setidaknya 905 00:38:59,370 --> 00:39:00,470 relatif sederhana. 906 00:39:00,470 --> 00:39:02,580 Sehingga layak mengambil cepat melihat di sini. 907 00:39:02,580 --> 00:39:06,540 >> Jadi getchar memiliki loop tak terbatas, sengaja begitu rupanya. 908 00:39:06,540 --> 00:39:10,050 Ini kemudian memanggil - dan ini adalah jenis reuse baik kode kita sendiri aja. 909 00:39:10,050 --> 00:39:11,220 Ini panggilan GetString. 910 00:39:11,220 --> 00:39:12,460 Karena apa fungsinya berarti untuk mendapatkan char? 911 00:39:12,460 --> 00:39:14,730 Nah, Anda mungkin juga mencoba untuk mendapatkan seluruh baris teks dari pengguna dan 912 00:39:14,730 --> 00:39:16,940 kemudian hanya melihat salah satu dari karakter-karakter. 913 00:39:16,940 --> 00:39:19,170 Sejalan 60, inilah sedikit sedikit cek kewarasan. 914 00:39:19,170 --> 00:39:21,610 Jika GetString kembali null, jangan lanjutkan. 915 00:39:21,610 --> 00:39:22,820 Sesuatu yang tidak beres. 916 00:39:22,820 --> 00:39:28,120 >> Sekarang ini agak menjengkelkan tapi konvensional dalam C. arang mungkin max 917 00:39:28,120 --> 00:39:29,960 mewakili apa yang baru saja berdasarkan namanya? 918 00:39:29,960 --> 00:39:31,670 Ini adalah konstan. 919 00:39:31,670 --> 00:39:36,040 Ini seperti nilai numerik dari terbesar Char Anda dapat mewakili dengan 920 00:39:36,040 --> 00:39:40,370 satu gigitan, yang mungkin nomor 255, yang merupakan jumlah terbesar Anda 921 00:39:40,370 --> 00:39:42,720 mewakili delapan bit, mulai dari nol. 922 00:39:42,720 --> 00:39:47,460 Jadi saya sudah menggunakan ini, dalam fungsi ini, ketika menulis kode ini, hanya karena 923 00:39:47,460 --> 00:39:51,753 jika sesuatu yang tidak beres di getchar tetapi tujuan dalam hidup adalah untuk mengembalikan 924 00:39:51,753 --> 00:39:54,830 char, Anda perlu entah bagaimana dapat untuk sinyal kepada pengguna bahwa 925 00:39:54,830 --> 00:39:55,840 sesuatu yang tidak beres. 926 00:39:55,840 --> 00:39:56,970 Kita tidak bisa mengembalikan null. 927 00:39:56,970 --> 00:39:58,480 Ternyata null pointer. 928 00:39:58,480 --> 00:40:01,030 Dan lagi, getchar memiliki untuk kembali char. 929 00:40:01,030 --> 00:40:04,760 >> Jadi konvensi, jika terjadi salah, adalah Anda, programmer, atau 930 00:40:04,760 --> 00:40:08,160 kasus ini, saya dengan perpustakaan, aku hanya memutuskan sewenang-wenang, jika 931 00:40:08,160 --> 00:40:12,230 sesuatu yang tidak beres, aku akan kembali jumlah 255, yang benar-benar 932 00:40:12,230 --> 00:40:17,240 berarti kita tidak bisa, pengguna tidak dapat mengetik karakter diwakili oleh 933 00:40:17,240 --> 00:40:21,410 nomor 255 karena kami memiliki mencurinya sebagai yang disebut nilai sentinel untuk 934 00:40:21,410 --> 00:40:23,410 merupakan masalah. 935 00:40:23,410 --> 00:40:27,010 Sekarang ternyata bahwa karakter 255 bukanlah sesuatu yang Anda dapat mengetik pada 936 00:40:27,010 --> 00:40:28,380 keyboard Anda, jadi itu bukan masalah besar. 937 00:40:28,380 --> 00:40:30,910 Pengguna tidak melihat bahwa Aku telah mencuri karakter ini. 938 00:40:30,910 --> 00:40:34,620 Tapi jika Anda pernah melihat di halaman manual pada sistem komputer beberapa referensi ke 939 00:40:34,620 --> 00:40:38,560 semua topi konstan seperti ini yang mengatakan, dalam kasus kesalahan kekuatan konstan ini 940 00:40:38,560 --> 00:40:42,720 dikembalikan, itu saja beberapa manusia melakukan tahun yang lalu sewenang-wenang memutuskan untuk 941 00:40:42,720 --> 00:40:45,680 mengembalikan nilai ini khusus dan menyebutnya konstan dalam kasus 942 00:40:45,680 --> 00:40:46,840 sesuatu yang tidak beres. 943 00:40:46,840 --> 00:40:48,580 >> Sekarang keajaiban terjadi di sini. 944 00:40:48,580 --> 00:40:52,600 Pertama, saya menyatakan sejalan 67 dua karakter, C1 dan C2. 945 00:40:52,600 --> 00:40:57,080 Dan kemudian di baris 68, sebenarnya ada baris kode yang mengingatkan 946 00:40:57,080 --> 00:41:01,140 teman kita printf, mengingat bahwa itu memang memiliki persen Cs dalam tanda kutip. 947 00:41:01,140 --> 00:41:06,490 Tapi perhatikan apa yang terjadi di sini. sscanf berarti string scan - 948 00:41:06,490 --> 00:41:11,690 berarti memindai diformat String, ergo sscanf. 949 00:41:11,690 --> 00:41:12,590 Apa artinya? 950 00:41:12,590 --> 00:41:16,310 Ini berarti Anda lolos ke sscanf string. 951 00:41:16,310 --> 00:41:18,420 Dan garis apapun jenis pengguna masuk 952 00:41:18,420 --> 00:41:23,520 Anda lulus untuk sscanf format string seperti ini yang memberitahu scanf apa 953 00:41:23,520 --> 00:41:25,870 Anda berharap pengguna telah diketik masuk 954 00:41:25,870 --> 00:41:29,730 Anda kemudian lulus-in alamat dua potongan memori, dalam hal ini, 955 00:41:29,730 --> 00:41:31,150 karena saya memiliki dua penampung. 956 00:41:31,150 --> 00:41:34,610 Jadi aku akan memberikan alamat C1 dan alamat C2. 957 00:41:34,610 --> 00:41:37,700 >> Dan ingat bahwa Anda memberikan fungsi yang alamat beberapa variabel, apa 958 00:41:37,700 --> 00:41:38,950 implikasinya? 959 00:41:38,950 --> 00:41:41,400 960 00:41:41,400 --> 00:41:45,050 Apa yang bisa fungsi yang dilakukan sebagai hasil memberikannya alamat dari 961 00:41:45,050 --> 00:41:48,170 variabel, sebagai lawan variabel itu sendiri? 962 00:41:48,170 --> 00:41:49,450 Hal ini dapat mengubahnya, kan? 963 00:41:49,450 --> 00:41:53,250 Jika Anda memiliki seseorang peta ke fisik alamat, mereka bisa pergi ke sana dan melakukan 964 00:41:53,250 --> 00:41:54,750 apapun yang mereka inginkan di alamat itu. 965 00:41:54,750 --> 00:41:55,800 Ide yang sama di sini. 966 00:41:55,800 --> 00:41:59,950 Jika kita lolos ke sscanf, alamat dua potongan memori, bahkan ini kecil 967 00:41:59,950 --> 00:42:03,585 potongan kecil memori, C1 dan C2, tapi kita kirim alamat mereka, 968 00:42:03,585 --> 00:42:05,170 sscanf dapat mengubahnya. 969 00:42:05,170 --> 00:42:08,530 >> Jadi tujuan sscanf dalam hidup, jika kita membaca halaman manual, adalah dengan membaca apa yang 970 00:42:08,530 --> 00:42:13,420 pengguna mengetik, berharap pengguna harus mengetik karakter dan mungkin 971 00:42:13,420 --> 00:42:16,470 karakter lain, dan apa pun pengguna diketik, karakter pertama berjalan 972 00:42:16,470 --> 00:42:19,310 di sini, karakter kedua goes here. 973 00:42:19,310 --> 00:42:22,470 Sekarang, sebagai samping, ini, dan Anda akan hanya tahu ini dari dokumentasi, 974 00:42:22,470 --> 00:42:25,570 fakta bahwa saya menempatkan ruang kosong di sana hanya berarti bahwa saya tidak peduli jika 975 00:42:25,570 --> 00:42:28,440 pengguna hits Space bar beberapa kali sebelum ia mengambil 976 00:42:28,440 --> 00:42:30,400 karakter, aku akan mengabaikan setiap ruang putih. 977 00:42:30,400 --> 00:42:32,510 Sehingga, saya tahu dari dokumentasi. 978 00:42:32,510 --> 00:42:36,570 >> Fakta bahwa ada% c kedua diikuti dengan spasi sebenarnya 979 00:42:36,570 --> 00:42:37,410 disengaja. 980 00:42:37,410 --> 00:42:41,190 Saya ingin bisa mendeteksi jika pengguna mengacaukan atau tidak bekerja sama. 981 00:42:41,190 --> 00:42:45,630 Jadi saya berharap bahwa pengguna hanya mengetik dalam satu karakter, karena itu saya berharap 982 00:42:45,630 --> 00:42:50,640 yang sscanf hanya akan mengembalikan nilai 1 karena, sekali lagi, jika saya membaca 983 00:42:50,640 --> 00:42:55,400 dokumentasi, tujuan sscanf di hidup adalah untuk kembali ke jumlah 984 00:42:55,400 --> 00:42:59,170 variabel yang diisi dengan input pengguna. 985 00:42:59,170 --> 00:43:02,270 >> Aku melewati dua variabel alamat, C1 dan C2. 986 00:43:02,270 --> 00:43:06,420 Aku berharap, meskipun, bahwa hanya satu dari mereka terbunuh karena jika sscanf 987 00:43:06,420 --> 00:43:11,130 kembali 2, apa mungkin implikasi logis? 988 00:43:11,130 --> 00:43:14,600 Bahwa pengguna tidak hanya memberi saya satu Karakter seperti saya katakan dia. 989 00:43:14,600 --> 00:43:17,860 Mereka mungkin diketik di sedikitnya dua karakter. 990 00:43:17,860 --> 00:43:22,430 Jadi jika saya bukannya tidak memiliki kedua % C, saya hanya punya satu, yang 991 00:43:22,430 --> 00:43:25,370 terus terang akan lebih intuitif Pendekatan, saya pikir pandangan pertama, 992 00:43:25,370 --> 00:43:30,220 Anda tidak akan dapat mendeteksi jika pengguna telah memberikan Anda lebih banyak 993 00:43:30,220 --> 00:43:31,780 masukan dari Anda benar-benar ingin. 994 00:43:31,780 --> 00:43:34,100 Jadi ini adalah bentuk implisit dari pengecekan error. 995 00:43:34,100 --> 00:43:35,640 >> Tapi perhatikan apa yang saya lakukan di sini. 996 00:43:35,640 --> 00:43:39,970 Setelah saya yakin bahwa pengguna memberiku satu karakter, saya membebaskan garis, melakukan 997 00:43:39,970 --> 00:43:44,450 kebalikan dari GetString, yang pada gilirannya menggunakan malloc, dan kemudian aku kembali 998 00:43:44,450 --> 00:43:51,030 C1, karakter bahwa saya berharap pengguna disediakan dan hanya disediakan. 999 00:43:51,030 --> 00:43:54,680 Jadi cepat melihat sekilas saja, tetapi pertanyaan pada getchar? 1000 00:43:54,680 --> 00:43:57,450 1001 00:43:57,450 --> 00:43:59,590 Kami akan kembali ke beberapa yang lain. 1002 00:43:59,590 --> 00:44:03,770 >> Nah, biarkan aku pergi ke depan dan melakukan hal ini - misalkan sekarang, hanya untuk memotivasi kami 1003 00:44:03,770 --> 00:44:08,910 diskusi dalam seminggu ditambah waktu, ini adalah file yang bernama structs.h. 1004 00:44:08,910 --> 00:44:11,440 Dan sekali lagi, ini hanya rasa sesuatu yang ada di depan. 1005 00:44:11,440 --> 00:44:13,090 Tetapi perhatikan bahwa banyak ini adalah komentar. 1006 00:44:13,090 --> 00:44:17,440 Jadi biarkan saya menyoroti hanya Bagian yang menarik untuk saat ini. 1007 00:44:17,440 --> 00:44:18,020 typedef - 1008 00:44:18,020 --> 00:44:19,700 ada kata kunci yang sama lagi. 1009 00:44:19,700 --> 00:44:23,100 typedef kita gunakan untuk menyatakan string yang sebagai tipe data khusus. 1010 00:44:23,100 --> 00:44:27,490 Anda dapat menggunakan typedef untuk menciptakan merek baru jenis data yang tidak ada ketika 1011 00:44:27,490 --> 00:44:28,570 C diciptakan. 1012 00:44:28,570 --> 00:44:32,520 Misalnya, int dilengkapi dengan arang C. dilengkapi dengan C. ganda dilengkapi dengan C. Tetapi 1013 00:44:32,520 --> 00:44:34,000 tidak ada gagasan mahasiswa. 1014 00:44:34,000 --> 00:44:37,230 Namun itu akan sangat berguna untuk mampu menulis sebuah program yang menyimpan 1015 00:44:37,230 --> 00:44:40,440 dalam variabel, nomor ID siswa, nama mereka, dan rumah mereka. 1016 00:44:40,440 --> 00:44:42,890 Dengan kata lain, tiga potong data, seperti int dan 1017 00:44:42,890 --> 00:44:44,420 String dan string lainnya. 1018 00:44:44,420 --> 00:44:48,220 >> Dengan typedef, apa cukup kuat tentang hal ini dan sturct kata kunci untuk 1019 00:44:48,220 --> 00:44:53,660 struktur, Anda, programmer tahun 2013, benar-benar dapat menentukan Anda sendiri 1020 00:44:53,660 --> 00:44:57,530 tipe data yang tidak ada tahun lalu tapi itu sesuai dengan tujuan Anda. 1021 00:44:57,530 --> 00:45:01,910 Dan jadi di sini, di baris 13 sampai 19, kita mendeklarasikan sebuah tipe data baru, seperti 1022 00:45:01,910 --> 00:45:04,320 int, tetapi menyebutnya siswa. 1023 00:45:04,320 --> 00:45:09,310 Dan dalam variabel ini akan ada tiga hal - int, string, 1024 00:45:09,310 --> 00:45:09,930 dan string. 1025 00:45:09,930 --> 00:45:13,040 Sehingga Anda dapat memikirkan apa yang benar-benar terjadi di sini, meskipun ini adalah 1026 00:45:13,040 --> 00:45:17,160 sedikit penyederhanaan untuk hari ini, seorang siswa pada dasarnya akan 1027 00:45:17,160 --> 00:45:19,450 terlihat seperti ini. 1028 00:45:19,450 --> 00:45:22,580 Yang akan menjadi sepotong memori dengan ID, nama 1029 00:45:22,580 --> 00:45:25,580 lapangan, dan bidang rumah. 1030 00:45:25,580 --> 00:45:30,670 Dan kita akan dapat menggunakan potongan tersebut dari memori dan mengaksesnya sebagai berikut. 1031 00:45:30,670 --> 00:45:38,870 >> Jika saya pergi ke struct0.c, di sini adalah relatif lama, namun setelah 1032 00:45:38,870 --> 00:45:42,630 pola, kode yang menggunakan ini trik baru. 1033 00:45:42,630 --> 00:45:45,790 Jadi pertama, biarkan aku menarik perhatian Anda ke bagian yang menarik di bagian atas. 1034 00:45:45,790 --> 00:45:49,670 Tajam mendefinisikan siswa 3, mendeklarasikan disebut siswa dan penerima konstan 1035 00:45:49,670 --> 00:45:53,450 itu sewenang-wenang nomor 3, hanya jadi saya memiliki tiga siswa menggunakan 1036 00:45:53,450 --> 00:45:54,830 program ini untuk saat ini. 1037 00:45:54,830 --> 00:45:55,960 Di sinilah Utama. 1038 00:45:55,960 --> 00:45:58,860 Dan perhatikan, bagaimana cara mendeklarasikan array siswa? 1039 00:45:58,860 --> 00:46:00,480 Yah, saya hanya menggunakan sintaks yang sama. 1040 00:46:00,480 --> 00:46:02,110 Mahasiswa kata adalah jelas baru. 1041 00:46:02,110 --> 00:46:04,790 Tapi siswa, kelas, siswa braket. 1042 00:46:04,790 --> 00:46:06,720 >> Jadi sayangnya ada banyak dari penggunaan kembali istilah di sini. 1043 00:46:06,720 --> 00:46:07,660 Ini hanya nomor. 1044 00:46:07,660 --> 00:46:09,040 Jadi ini seperti mengatakan tiga. 1045 00:46:09,040 --> 00:46:11,430 Class adalah hanya apa yang saya inginkan untuk memanggil variabel. 1046 00:46:11,430 --> 00:46:12,840 Saya bisa menyebutnya siswa. 1047 00:46:12,840 --> 00:46:15,880 Tapi kelas, ini bukan kelas dalam berorientasi objek Java macam cara. 1048 00:46:15,880 --> 00:46:17,220 Ini hanya kelas siswa. 1049 00:46:17,220 --> 00:46:20,590 Dan tipe data setiap elemen dalam array yang adalah siswa. 1050 00:46:20,590 --> 00:46:23,040 Jadi ini adalah sedikit berbeda dan dari mengatakan sesuatu 1051 00:46:23,040 --> 00:46:25,250 seperti ini, hanya saja - 1052 00:46:25,250 --> 00:46:29,500 Saya mengatakan memberi saya tiga mahasiswa dan memanggil array kelas. 1053 00:46:29,500 --> 00:46:29,800 >> Baik. 1054 00:46:29,800 --> 00:46:30,680 Sekarang inilah empat lingkaran. 1055 00:46:30,680 --> 00:46:33,480 Orang ini akrab - iterate dari nol pada hingga tiga. 1056 00:46:33,480 --> 00:46:35,160 Dan inilah bagian baru dari sintaks. 1057 00:46:35,160 --> 00:46:37,710 Program ini akan meminta saya, manusia, untuk memberikan mahasiswa 1058 00:46:37,710 --> 00:46:39,200 ID, yang merupakan int. 1059 00:46:39,200 --> 00:46:44,650 Dan inilah sintaks yang dapat anda menyimpan sesuatu di bidang ID di 1060 00:46:44,650 --> 00:46:48,630 lokasi kelas I. Jadi braket sintaks ini bukanlah hal baru. 1061 00:46:48,630 --> 00:46:51,450 Ini hanya berarti memberikan kedelapan siswa di kelas. 1062 00:46:51,450 --> 00:46:52,940 Tapi simbol ini adalah baru. 1063 00:46:52,940 --> 00:46:56,320 Sampai sekarang, kita sudah tidak bisa digunakan dot, setidaknya dalam kode seperti ini. 1064 00:46:56,320 --> 00:47:01,490 Ini berarti pergi ke struct dikenal sebagai seorang mahasiswa dan menempatkan sesuatu di sana. 1065 00:47:01,490 --> 00:47:05,670 Demikian pula, di baris ini berikutnya, 31, pergi depan dan menempatkan apa pun jenis pengguna 1066 00:47:05,670 --> 00:47:10,530 untuk nama di sini dan apa yang mereka lakukan untuk rumah, hal yang sama, maju dan 1067 00:47:10,530 --> 00:47:13,230 memasukkannya ke dalam rumah.. 1068 00:47:13,230 --> 00:47:15,955 >> Jadi, apa program ini akhirnya lakukan? 1069 00:47:15,955 --> 00:47:17,220 Anda dapat melihat teaser kecil di sana. 1070 00:47:17,220 --> 00:47:24,780 Biarkan aku pergi ke depan dan jangan membuat structs 0 dot slash struct 0, ID mahasiswa 1, 1071 00:47:24,780 --> 00:47:28,250 David mengatakan Mather, mahasiswa ID 2. 1072 00:47:28,250 --> 00:47:32,070 Rob Kirkland, mahasiswa 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-wenang, yang 1075 00:47:38,380 --> 00:47:40,980 Saya ingin melakukan sesuatu dengan data ini, sekarang aku sudah mengajarkan kita bagaimana untuk 1076 00:47:40,980 --> 00:47:43,450 menggunakan struct, adalah aku hanya punya tambahan ini lingkaran di sini. 1077 00:47:43,450 --> 00:47:45,260 Aku iterate atas array siswa. 1078 00:47:45,260 --> 00:47:49,170 Aku digunakan, teman mungkin sekarang kita kenal, String membandingkan, stircomp ke 1079 00:47:49,170 --> 00:47:53,780 check adalah rumah 8th siswa sama dengan Mather? 1080 00:47:53,780 --> 00:47:56,760 Dan jika demikian, hanya mencetak sesuatu sewenang-wenang seperti, ya, itu. 1081 00:47:56,760 --> 00:47:59,430 Tapi sekali lagi, hanya memberi saya kesempatan untuk menggunakan dan menggunakan kembali dan 1082 00:47:59,430 --> 00:48:02,270 menggunakan kembali ini notasi titik baru. 1083 00:48:02,270 --> 00:48:03,250 >> Jadi siapa yang peduli, kan? 1084 00:48:03,250 --> 00:48:06,270 Datang dengan program siswa adalah agak sewenang-wenang, tapi ternyata 1085 00:48:06,270 --> 00:48:09,800 bahwa kita dapat melakukan hal-hal yang berguna dengan ini, misalnya sebagai berikut. 1086 00:48:09,800 --> 00:48:14,600 Ini adalah struct jauh lebih rumit di C. Itu punya selusin atau lebih banyak bidang, 1087 00:48:14,600 --> 00:48:15,880 agak samar bernama. 1088 00:48:15,880 --> 00:48:20,110 Namun jika Anda sudah pernah mendengar tentang grafis format file yang disebut bitmap, BMP, itu 1089 00:48:20,110 --> 00:48:22,830 ternyata bahwa format file bitmap cukup banyak terlihat seperti ini. 1090 00:48:22,830 --> 00:48:24,200 Ini wajah Smiley kecil bodoh. 1091 00:48:24,200 --> 00:48:27,840 Ini adalah gambar kecil yang aku sudah diperbesar pada cukup besar sehingga saya bisa melihat setiap 1092 00:48:27,840 --> 00:48:30,410 dari titik-titik individu atau piksel. 1093 00:48:30,410 --> 00:48:33,800 Sekarang, ternyata kita dapat mewakili titik hitam dengan, katakanlah, angka 0. 1094 00:48:33,800 --> 00:48:35,520 Dan titik putih dengan nomor 1. 1095 00:48:35,520 --> 00:48:39,140 >> Jadi dengan kata lain, jika Anda ingin menggambar Wajah tersenyum dan menyimpan bahwa gambar dalam 1096 00:48:39,140 --> 00:48:42,680 komputer, itu sudah cukup untuk menyimpan nol dan orang yang terlihat seperti ini, di mana, 1097 00:48:42,680 --> 00:48:45,250 lagi, yang berwarna putih dan nol berwarna hitam. 1098 00:48:45,250 --> 00:48:48,290 Dan bersama-sama, jika Anda secara efektif memiliki a sandang dari satu dan nol, Anda memiliki 1099 00:48:48,290 --> 00:48:51,030 grid pixel, dan jika Anda berbaring mereka keluar, Anda memiliki lucu 1100 00:48:51,030 --> 00:48:52,560 sedikit Smiley wajah. 1101 00:48:52,560 --> 00:48:58,150 Sekarang, format file bitmap, BMP, adalah efektif bahwa di balik kap mesin, 1102 00:48:58,150 --> 00:49:00,970 tapi dengan piksel lebih sot bahwa Anda benar-benar dapat mewakili warna. 1103 00:49:00,970 --> 00:49:05,170 >> Tetapi bila Anda memiliki lebih canggih format file seperti BMP dan JPEG dan GIF 1104 00:49:05,170 --> 00:49:09,360 dengan yang Anda mungkin akrab, mereka file pada disk biasanya tidak hanya 1105 00:49:09,360 --> 00:49:13,760 memiliki angka satu dan nol untuk pixel, tetapi mereka memiliki beberapa metadata juga - 1106 00:49:13,760 --> 00:49:16,960 meta dalam arti bahwa tidak benar-benar Data tapi itu berguna untuk memiliki. 1107 00:49:16,960 --> 00:49:21,370 Jadi bidang ini di sini menyiratkan, dan kita akan melihat ini secara lebih rinci dalam P-set 1108 00:49:21,370 --> 00:49:25,810 5, bahwa sebelum angka satu dan nol yang mewakili piksel dalam gambar, 1109 00:49:25,810 --> 00:49:29,110 ada sekelompok metadata seperti ukuran gambar dan 1110 00:49:29,110 --> 00:49:30,250 lebar gambar. 1111 00:49:30,250 --> 00:49:32,910 Dan perhatikan aku memetik dari beberapa hal sewenang-wenang di sini - 1112 00:49:32,910 --> 00:49:34,260 lebar dan tinggi. 1113 00:49:34,260 --> 00:49:36,160 Jumlah bit dan beberapa hal lain. 1114 00:49:36,160 --> 00:49:37,840 Jadi ada beberapa metadata dalam file. 1115 00:49:37,840 --> 00:49:41,470 >> Tapi dengan memahami bagaimana file diletakkan keluar dengan cara ini, Anda dapat benar-benar 1116 00:49:41,470 --> 00:49:45,890 kemudian memanipulasi gambar, memulihkan gambar dari disk, mengubah ukuran gambar. 1117 00:49:45,890 --> 00:49:47,560 Tapi Anda tidak bisa selalu meningkatkan mereka. 1118 00:49:47,560 --> 00:49:48,480 Aku butuh sebuah foto. 1119 00:49:48,480 --> 00:49:52,840 Jadi aku kembali ke RJ sini, siapa Anda melihat pada layar beberapa waktu lalu. 1120 00:49:52,840 --> 00:49:57,160 Dan jika saya membuka Keynote di sini, ini adalah apa yang terjadi jika Anda mencoba untuk memperbesar dan 1121 00:49:57,160 --> 00:49:59,380 meningkatkan RJ. 1122 00:49:59,380 --> 00:50:01,480 Dia tidak mendapatkan apapun lebih baik benar-benar. 1123 00:50:01,480 --> 00:50:06,240 Sekarang Keynote adalah jenis kabur itu sedikit, hanya untuk menutup-nutupi yang 1124 00:50:06,240 --> 00:50:11,040 Fakta bahwa RJ tidak mendapatkan khususnya ditingkatkan ketika Anda zoom in 1125 00:50:11,040 --> 00:50:13,310 Dan jika melakukannya dengan cara ini, melihat kotak? 1126 00:50:13,310 --> 00:50:15,490 Ya, Anda pasti dapat melihat kotak pada proyektor. 1127 00:50:15,490 --> 00:50:17,690 >> Itulah apa yang Anda dapatkan ketika Anda meningkatkan. 1128 00:50:17,690 --> 00:50:22,570 Namun dalam memahami bagaimana RJ kita atau Wajah tersenyum diimplementasikan akan membiarkan kita 1129 00:50:22,570 --> 00:50:24,950 benar-benar menulis kode yang memanipulasi hal-hal ini. 1130 00:50:24,950 --> 00:50:29,970 Dan saya pikir saya akan berakhir pada catatan ini, dengan 55 detik dari meningkatkan itu, 1131 00:50:29,970 --> 00:50:31,230 Saya berani, katakan agak menyesatkan. 1132 00:50:31,230 --> 00:50:32,990 >> [VIDEO PEMUTARAN] 1133 00:50:32,990 --> 00:50:34,790 >> -Dia berbohong. 1134 00:50:34,790 --> 00:50:38,310 Tentang 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 >> -Bahwa at 9:15 Ray Santoya berada di ATM. 1137 00:50:45,280 --> 00:50:47,830 >> -Jadi pertanyaannya adalah apa yang yang dia lakukan at 9:16? 1138 00:50:47,830 --> 00:50:50,750 >> Shooting-sembilan milimeter pada sesuatu. 1139 00:50:50,750 --> 00:50:52,615 Mungkin ia melihat penembak jitu. 1140 00:50:52,615 --> 00:50:54,760 >> -Atau bekerja dengan dia. 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 lihat? 1144 00:50:58,700 --> 00:51:05,530 1145 00:51:05,530 --> 00:51:09,490 >> -Membawa wajahnya, layar penuh. 1146 00:51:09,490 --> 00:51:09,790 >> -Nya kacamata. 1147 00:51:09,790 --> 00:51:11,040 >> -Ada refleksi. 1148 00:51:11,040 --> 00:51:21,790 1149 00:51:21,790 --> 00:51:23,520 >> -Itulah tim bisbol Neuvitas. 1150 00:51:23,520 --> 00:51:24,530 Itulah logo mereka. 1151 00:51:24,530 --> 00:51:27,040 >> -Dan dia berbicara dengan siapa pun yang mengenakan jaket itu. 1152 00:51:27,040 --> 00:51:27,530 >> [END VIDEO PEMUTARAN] 1153 00:51:27,530 --> 00:51:29,180 >> DAVID J. Malan: Ini akan menjadi masalah Set 5. 1154 00:51:29,180 --> 00:51:30,720 Kita akan melihat Anda minggu depan. 1155 00:51:30,720 --> 00:51:32,330 >> MALE SPEAKER: Pada CS50 berikutnya. 1156 00:51:32,330 --> 00:51:39,240 >> [Jangkrik] 1157 00:51:39,240 --> 00:51:41,270 >> [MUSIC PLAYING]