1 00:00:00,000 --> 00:00:02,500 [Powered by Google Translate] [Seksyen 5 - Lebih Selesa] 2 00:00:02,500 --> 00:00:04,690 [Rob Bowden - Universiti Harvard] 3 00:00:04,690 --> 00:00:07,250 [Ini adalah CS50. - CS50.TV] 4 00:00:08,990 --> 00:00:14,250 >> Seperti yang saya katakan dalam e-mel saya, terdapat banyak perkara yang anda boleh menggunakan 5 00:00:14,250 --> 00:00:17,060 selain daripada perkakas untuk benar-benar melakukan set masalah. 6 00:00:17,060 --> 00:00:19,910 Kami mengesyorkan anda melakukannya dalam perkakas hanya kerana maka kita lebih mudah boleh membantu anda 7 00:00:19,910 --> 00:00:22,070 dan kita tahu bagaimana segala-galanya akan untuk bekerja. 8 00:00:22,070 --> 00:00:26,950 Tetapi sebagai salah satu contoh di mana anda boleh melakukan perkara-perkara yang jika, katakan, anda tidak mempunyai akses 9 00:00:26,950 --> 00:00:31,570 perkakas atau anda mahu bekerja di bawah tanah Pusat Sains - 10 00:00:31,570 --> 00:00:33,090 yang sebenarnya mereka mempunyai perkakas terlalu - 11 00:00:33,090 --> 00:00:35,150 jika anda mahu bekerja di mana-mana. 12 00:00:35,150 --> 00:00:42,370 Satu contoh anda telah melihat / mendengar SSH? 13 00:00:44,380 --> 00:00:47,780 SSH pada asasnya seperti menyambung kepada sesuatu. 14 00:00:47,780 --> 00:00:51,340 Sebenarnya, sekarang saya SSHed ke dalam perkakas. 15 00:00:51,340 --> 00:00:54,290 Saya tidak pernah bekerja secara langsung di dalam perkakas. 16 00:00:55,930 --> 00:01:01,060 Berikut adalah perkakas, dan jika anda melihat ke sini anda melihat ini alamat IP. 17 00:01:01,060 --> 00:01:03,650 Saya tidak pernah bekerja dalam perkakas sendiri; 18 00:01:03,650 --> 00:01:08,840 Saya sentiasa datang ke tetingkap iTerm2 tetingkap / terminal. 19 00:01:08,840 --> 00:01:15,910 Anda boleh SSH ke alamat IP, jharvard@192.168.129.128 ssh. 20 00:01:15,910 --> 00:01:20,390 Saya masih ingat nombor itu sangat mudah kerana ia adalah seperti corak yang bagus. 21 00:01:20,390 --> 00:01:24,920 Tetapi yang akan bertanya kepada saya untuk kata laluan saya, dan sekarang saya dalam perkakas. 22 00:01:24,920 --> 00:01:33,060 Pada asasnya, pada masa ini, jika anda membuka terminal di dalam perkakas itu sendiri, 23 00:01:33,060 --> 00:01:36,350 antara muka ini, tetapi anda akan menggunakan ia, adalah sama 24 00:01:36,350 --> 00:01:40,010 sebagai antara muka saya menggunakan lebih di sini tetapi kini anda SSHed. 25 00:01:42,240 --> 00:01:44,920 Anda tidak perlu SSH untuk perkakas. 26 00:01:44,920 --> 00:01:52,360 Satu contoh tempat lain anda boleh SSH untuk Saya agak pasti anda mempunyai secara lalai - 27 00:01:52,360 --> 00:01:55,020 Oh. Yang lebih besar. 28 00:01:55,020 --> 00:02:01,130 Semua anda perlu mempunyai oleh akaun FAS lalai pada pelayan FAS. 29 00:02:01,130 --> 00:02:06,840 Bagi saya, saya akan SSH kepada rbowden@nice.fas.harvard.edu. 30 00:02:06,840 --> 00:02:11,610 Ia akan meminta anda bahawa kali pertama, dan anda mengatakan ya. 31 00:02:11,610 --> 00:02:15,840 Password saya hanya akan menjadi kata laluan FAS saya. 32 00:02:15,840 --> 00:02:22,650 Dan jadi sekarang, saya SSHed pelayan bagus, dan saya boleh melakukan apa sahaja yang saya mahu di sini. 33 00:02:22,650 --> 00:02:28,560 Banyak kelas anda mungkin mengambil masa, seperti 124, akan mempunyai anda memuat naik barangan ke sini 34 00:02:28,560 --> 00:02:30,950 sebenarnya mengemukakan set masalah anda. 35 00:02:30,950 --> 00:02:34,100 Tetapi mengatakan anda tidak mempunyai akses kepada perkakas anda. 36 00:02:34,100 --> 00:02:37,910 Kemudian anda boleh melakukan perkara-perkara, seperti di sini ia akan berkata - 37 00:02:37,910 --> 00:02:42,160 Ini adalah hanya bahagian soalan. 38 00:02:42,160 --> 00:02:45,070 Ia akan meminta anda untuk melakukan ini di dalam perkakas. 39 00:02:45,070 --> 00:02:47,790 Sebaliknya saya hanya akan melakukannya pada pelayan. 40 00:02:47,790 --> 00:02:50,560 Saya akan untuk unzip bahawa. 41 00:02:50,560 --> 00:02:55,670 Masalah ini akan menjadi bahawa anda digunakan untuk menggunakan sesuatu seperti gedit 42 00:02:55,670 --> 00:02:58,160 atau apa-apa bahagian dalam perkakas. 43 00:02:58,160 --> 00:03:01,830 Anda tidak akan mempunyai bahawa pada pelayan FAS. 44 00:03:01,830 --> 00:03:04,110 Itu semua hanya akan menjadi antara muka teks. 45 00:03:04,110 --> 00:03:09,180 Jadi, anda boleh sama ada satu, cuba untuk belajar editor teks yang mereka tidak mempunyai. 46 00:03:09,180 --> 00:03:12,130 Mereka mempunyai Nano. 47 00:03:12,130 --> 00:03:14,990 Nano biasanya agak mudah untuk digunakan. 48 00:03:14,990 --> 00:03:19,470 Anda boleh menggunakan anak panah anda dan menaip biasanya. 49 00:03:19,470 --> 00:03:21,250 Supaya tidak sukar. 50 00:03:21,250 --> 00:03:24,720 Jika anda ingin mendapatkan benar-benar mewah anda boleh menggunakan Emacs, 51 00:03:24,720 --> 00:03:29,850 yang saya mungkin tidak sepatutnya dibuka kerana saya tidak tahu bagaimana untuk menutup Emacs. 52 00:03:29,850 --> 00:03:32,760 Kawalan X, Kawalan C? Yeah. 53 00:03:32,760 --> 00:03:35,310 Atau anda boleh menggunakan Vim, yang adalah apa yang saya gunakan. 54 00:03:35,310 --> 00:03:37,800 Dan supaya mereka adalah pilihan anda. 55 00:03:37,800 --> 00:03:43,830 Jika anda tidak mahu berbuat demikian, anda boleh juga, jika anda melihat manual.cs50.net - 56 00:03:43,830 --> 00:03:45,410 Oh. 57 00:03:45,410 --> 00:03:49,920 Pada PC, anda boleh SSH menggunakan dempul, 58 00:03:49,920 --> 00:03:51,940 yang anda akan perlu untuk memuat turun secara berasingan. 59 00:03:51,940 --> 00:03:55,460 Pada Mac, anda boleh hanya dengan penggunaan Terminal lalai atau anda boleh memuat turun iTerm2, 60 00:03:55,460 --> 00:03:58,490 yang seperti Terminal bagus, mewah. 61 00:03:58,490 --> 00:04:03,780 Jika anda pergi untuk manual.cs50.net anda akan melihat pautan ke Notepad + +, 62 00:04:03,780 --> 00:04:07,120 yang adalah apa yang anda boleh gunakan pada PC. 63 00:04:07,120 --> 00:04:13,340 Ia membolehkan anda SFTP dari Notepad + +, yang pada asasnya SSH. 64 00:04:13,340 --> 00:04:17,750 Apakah ini akan membiarkan anda lakukan adalah mengedit fail anda tempatan, 65 00:04:17,750 --> 00:04:20,670 dan kemudian apabila anda mahu untuk menyelamatkan mereka, ia akan menjimatkan nice.fas, 66 00:04:20,670 --> 00:04:23,670 di mana anda boleh menjalankan mereka. 67 00:04:23,670 --> 00:04:26,880 Dan bersamaan pada Mac akan menjadi TextWrangler. 68 00:04:26,880 --> 00:04:28,760 Jadi ia membolehkan anda melakukan perkara yang sama. 69 00:04:28,760 --> 00:04:32,800 Ia membolehkan anda mengedit fail tempatan dan menyelamatkan mereka untuk nice.fas, 70 00:04:32,800 --> 00:04:35,730 di mana anda boleh menjalankan mereka. 71 00:04:35,730 --> 00:04:40,400 Jadi, jika anda pernah terjebak tanpa perkakas, anda mempunyai pilihan ini 72 00:04:40,400 --> 00:04:44,230 masih melakukan set masalah anda. 73 00:04:44,230 --> 00:04:48,250 Satu masaalah yang akan menjadi bahawa anda tidak akan mempunyai perpustakaan CS50 74 00:04:48,250 --> 00:04:51,580 kerana nice.fas tidak secara lalai mempunyai bahawa. 75 00:04:51,580 --> 00:04:55,970 Anda boleh sama ada memuat turun perpustakaan CS50 - 76 00:04:55,970 --> 00:04:58,470 Saya tidak fikir saya perlu bahawa pada ketika ini. 77 00:04:58,470 --> 00:05:03,270 Anda boleh sama ada memuat turun perpustakaan CS50 dan salinan ke nice.fas, 78 00:05:03,270 --> 00:05:07,450 atau saya fikir pada ketika ini kita tidak menggunakan lagi anyway. 79 00:05:07,450 --> 00:05:12,720 Atau jika kita lakukan, anda boleh pada masa itu menggantikannya dengan 80 00:05:12,720 --> 00:05:18,480 pelaksanaan fungsi di perpustakaan CS50 anyway. 81 00:05:18,480 --> 00:05:21,370 Jadi yang tidak perlu yang banyak sekatan. 82 00:05:21,370 --> 00:05:23,710 Dan itulah yang. 83 00:05:26,460 --> 00:05:29,820 >> Saya akan kembali kepada perkakas sekarang; kami akan melakukan segala-galanya di dalam perkakas. 84 00:05:29,820 --> 00:05:37,510 Melihat seksyen kami soalan, pada permulaan, seperti yang saya katakan dalam e-mel saya, 85 00:05:37,510 --> 00:05:43,620 kita perlu bercakap tentang satu pendek anda sepatutnya untuk menonton. 86 00:05:43,620 --> 00:05:51,980 Kami mempunyai Dialihkan & Paip dan ketiga-tiga soalan. 87 00:05:51,980 --> 00:05:56,070 >> Aliran yang tidak fungsi seperti printf menulis secara lalai? 88 00:05:56,070 --> 00:05:59,130 Jadi aliran. Apakah aliran? 89 00:06:06,520 --> 00:06:15,100 Aliran adalah pada dasarnya seperti ia hanya beberapa - 90 00:06:15,100 --> 00:06:21,450 Ia bukan walaupun sumber 1s dan 0-an. 91 00:06:21,450 --> 00:06:24,920 Aliran ia meminta sini adalah keluar standard. 92 00:06:24,920 --> 00:06:27,250 Dan keluar begitu standard adalah sungai yang apabila anda menulis kepada, 93 00:06:27,250 --> 00:06:30,940 ia muncul pada skrin. 94 00:06:30,940 --> 00:06:36,860 Keluar Standard, oleh aliran, ia bermakna anda hanya menulis 1s dan 0s kepadanya, 95 00:06:36,860 --> 00:06:40,220 dan hujung yang lain daripada standard hanya membaca daripada aliran itu. 96 00:06:40,220 --> 00:06:43,540 Ia hanya rentetan 1s dan 0-an. 97 00:06:43,540 --> 00:06:45,570 Anda boleh menulis kepada aliran atau anda boleh membaca daripada aliran 98 00:06:45,570 --> 00:06:47,950 bergantung kepada apa aliran sebenarnya. 99 00:06:47,950 --> 00:06:52,800 Dua lagi aliran lalai adalah standard dalam kesesatan dan standard. 100 00:06:52,800 --> 00:06:57,540 Standard dalam apabila anda GetString, ia menunggu untuk anda barangan input. 101 00:06:57,540 --> 00:07:01,570 Jadi ia menunggu untuk anda, ia sebenarnya menunggu standard dalam, 102 00:07:01,570 --> 00:07:04,880 yang benar-benar apa yang anda dapat apabila anda menaip di keyboard. 103 00:07:04,880 --> 00:07:07,530 Anda sedang menaip menjadi standard masuk 104 00:07:07,530 --> 00:07:10,050 Ralat piawai adalah pada dasarnya setara dengan standard keluar, 105 00:07:10,050 --> 00:07:13,280 tetapi ia adalah khusus dalam bahawa apabila anda mencetak ralat piawai, 106 00:07:13,280 --> 00:07:16,770 anda sepatutnya hanya mencetak mesej ralat bahawa 107 00:07:16,770 --> 00:07:20,200 jadi anda boleh membezakan antara mesej biasa dicetak untuk skrin 108 00:07:20,200 --> 00:07:24,560 berbanding mesej ralat bergantung pada sama ada mereka pergi ke keluar standard atau ralat piawai. 109 00:07:24,560 --> 00:07:28,660 Fail juga. 110 00:07:28,660 --> 00:07:32,440 Keluar standard, standard dalam, dan ralat piawai beberapa aliran yang hanya khas, 111 00:07:32,440 --> 00:07:36,810 tetapi benar-benar apa-apa fail, apabila anda membuka fail, ia menjadi satu aliran bait 112 00:07:36,810 --> 00:07:40,740 mana anda hanya boleh membaca daripada aliran itu. 113 00:07:40,740 --> 00:07:47,770 Anda, bagi sebahagian besar, hanya boleh berfikir fail sebagai aliran bait. 114 00:07:47,770 --> 00:07:51,190 Jadi aliran apa yang mereka menulis secara lalai? Keluar standard. 115 00:07:51,190 --> 00:07:56,980 >> Apakah perbezaan antara> dan >>? 116 00:07:58,140 --> 00:08:03,710 Adakah sesiapa menonton video terlebih dahulu? Okay. 117 00:08:03,710 --> 00:08:10,960 > Akan menjadi bagaimana anda redirect ke dalam fail, 118 00:08:10,960 --> 00:08:15,240 dan >> juga akan redirect output ke dalam fail, 119 00:08:15,240 --> 00:08:17,820 tetapi ia sebaliknya akan untuk melampirkan ke fail. 120 00:08:17,820 --> 00:08:23,430 Sebagai contoh, katakan saya berlaku mempunyai Dict di sini, 121 00:08:23,430 --> 00:08:27,020 dan barangan hanya dalam Dict kucing, kucing, anjing, ikan, anjing. 122 00:08:27,020 --> 00:08:31,530 Satu perintah bahawa anda mempunyai sekurang baris arahan adalah kucing, 123 00:08:31,530 --> 00:08:34,539 yang hanya akan mencetak apa dalam fail. 124 00:08:34,539 --> 00:08:40,679 Jadi, apabila saya mengatakan Dict kucing, ia akan mencetak kucing, kucing, anjing, ikan, anjing. Itu semua kucing tidak. 125 00:08:40,679 --> 00:08:46,280 Ini bermakna bahawa ia dicetak standard keluar kucing, kucing, anjing, ikan, anjing,. 126 00:08:46,280 --> 00:08:53,240 Jika saya bukannya mahu redirect yang ke fail, saya boleh menggunakan> redirect kepada apa sahaja fail. 127 00:08:53,240 --> 00:08:56,460 Saya akan memanggil fail fail. 128 00:08:56,460 --> 00:09:00,320 Jadi sekarang jika saya ls, saya akan melihat saya mempunyai fail baru yang dipanggil fail. 129 00:09:00,320 --> 00:09:05,700 Dan jika saya membukanya, ia akan mempunyai apa sebenarnya kucing meletakkan pada baris arahan. 130 00:09:05,700 --> 00:09:11,040 Jadi sekarang jika saya berbuat demikian sekali lagi, maka ia akan redirect output ke fail, 131 00:09:11,040 --> 00:09:13,930 dan saya akan mempunyai perkara yang sama. 132 00:09:13,930 --> 00:09:17,910 Jadi secara teknikal, ia benar-benar overrode apa yang kita ada. 133 00:09:17,910 --> 00:09:22,970 Dan kita akan melihat jika saya menukar Dict, saya mengambil anjing. 134 00:09:22,970 --> 00:09:29,980 Sekarang jika kita kucing Dict ke fail sekali lagi, kita akan mempunyai versi baru dengan anjing yang dikeluarkan. 135 00:09:29,980 --> 00:09:32,400 Jadi ia benar-benar mengatasi. 136 00:09:32,400 --> 00:09:36,640 Sebaliknya, jika kita menggunakan >>, ia akan melampirkan fail. 137 00:09:36,640 --> 00:09:40,860 Sekarang, membuka fail, kita lihat kita hanya mempunyai perkara yang sama dicetak dua kali 138 00:09:40,860 --> 00:09:44,920 kerana ia berada di sana sekali, maka kita dilampirkan kepada asal. 139 00:09:44,920 --> 00:09:48,130 Apa supaya> dan >> lakukan. 140 00:09:48,130 --> 00:09:50,580 Adakah yang seterusnya bertanya - Ia tidak bertanya tentang ia. 141 00:09:50,580 --> 00:09:59,050 >> Yang lain yang kita ada adalah <, yang jika> pelencongan keluar standard, 142 00:09:59,050 --> 00:10:01,970 00:10:12,050 Mari kita lihat jika kita mempunyai contoh. 144 00:10:14,750 --> 00:10:16,930 Saya boleh menulis satu cepat sebenar. 145 00:10:17,870 --> 00:10:25,700 Mari kita mengambil mana-mana fail, hello.c. 146 00:10:56,060 --> 00:10:59,070 Fail agak mudah. 147 00:10:59,070 --> 00:11:03,570 Saya hanya mendapat tali dan kemudian mencetak "Hello" apa jua rentetan saya hanya memasuki. 148 00:11:03,570 --> 00:11:07,990 Jadi membuat khabar dan kemudian. / Hello. 149 00:11:07,990 --> 00:11:10,720 Kini ia mendorong saya untuk memasukkan sesuatu, 150 00:11:10,720 --> 00:11:15,070 yang bermakna ia menunggu perkara untuk dimasukkan ke dalam standard. 151 00:11:15,070 --> 00:11:20,450 Jadi masukkan apa sahaja yang saya mahu ke standard masuk Kami hanya akan mengatakan Hello, Rob! 152 00:11:20,450 --> 00:11:23,310 Kemudian ia mencetak kepada standard keluar Hello, Rob! 153 00:11:23,310 --> 00:11:28,860 Jika saya lakukan. / Khabar dan kemudian mengalihkan, 154 00:11:30,740 --> 00:11:34,310 buat masa sekarang, anda hanya boleh mengalihkan dari fail. 155 00:11:34,310 --> 00:11:41,720 Jadi jika saya dimasukkan ke dalam beberapa fail, txt, dan saya meletakkan Rob, 156 00:11:41,720 --> 00:11:52,300 jika saya menjalankan hello dan kemudian mengalihkan txt fail ke dalam. / hello, ia akan mengatakan Hello, Rob! serta-merta. 157 00:11:52,300 --> 00:11:57,160 Apabila ia mula-mula mendapat kepada GetString dan ia menunggu standard dalam, 158 00:11:57,160 --> 00:12:01,730 standard dalam tidak lagi menunggu pada keyboard untuk data untuk mendapatkan dimasukkan. 159 00:12:01,730 --> 00:12:05,980 Sebaliknya, kita telah diarahkan standard untuk membaca dari txt file. 160 00:12:05,980 --> 00:12:10,290 Dan sebagainya ia akan untuk membaca daripada txt fail, yang hanya line Rob, 161 00:12:10,290 --> 00:12:13,380 dan kemudian ia akan mencetak Hello, Rob! 162 00:12:13,380 --> 00:12:18,180 Dan jika saya mahu, saya juga boleh melakukan / hello 00:12:21,500 dan kemudian standard bahawa ia percetakan, yang merupakan Hello, Rob! 164 00:12:21,500 --> 00:12:24,700 Saya boleh mengalihkan ke dalam fail sendiri. 165 00:12:24,700 --> 00:12:29,790 Saya hanya akan memanggil fail hello - tidak, saya tidak akan, kerana itulah yang laku - txt2. 166 00:12:29,790 --> 00:12:40,150 Sekarang, txt2 akan mempunyai output / hello 00:12:43,520 >> Soalan? 168 00:12:45,900 --> 00:12:49,090 >> Okay. Jadi maka di sini kita mempunyai saluran paip. 169 00:12:49,090 --> 00:12:53,510 Paip adalah unit terakhir redirection. 170 00:12:53,510 --> 00:12:58,750 >> Oh. Saya rasa satu unit yang lebih redirection jika bukan> anda lakukan 2> 171 00:12:58,750 --> 00:13:01,070 itu mengalihkan ralat piawai. 172 00:13:01,070 --> 00:13:06,280 Jadi, jika sesuatu yang pergi ke ralat piawai, ia tidak akan mendapat dimasukkan ke dalam txt2. 173 00:13:06,280 --> 00:13:12,480 Tetapi notis jika saya lakukan 2>, maka ia masih percetakan Hello, Rob! baris arahan 174 00:13:12,480 --> 00:13:18,600 kerana saya hanya mengalihkan ralat piawai, saya tidak mengalihkan standard. 175 00:13:18,600 --> 00:13:22,210 Ralat piawai dan standard keluar adalah berbeza. 176 00:13:24,210 --> 00:13:27,080 Jika anda mahu untuk benar-benar menulis kepada ralat piawai, 177 00:13:27,080 --> 00:13:35,080 maka saya boleh menukar ini menjadi fprintf untuk stderr. 178 00:13:35,080 --> 00:13:37,850 Jadi printf, secara lalai, mencetak keluar standard. 179 00:13:37,850 --> 00:13:41,720 Jika saya mahu mencetak ralat piawai manual, maka saya perlu menggunakan fprintf 180 00:13:41,720 --> 00:13:45,010 dan nyatakan apa yang saya mahu untuk mencetak. 181 00:13:45,010 --> 00:13:49,720 Jika sebaliknya saya lakukan stdout fprintf, maka itulah pada dasarnya bersamaan dengan printf. 182 00:13:49,720 --> 00:13:55,530 Tetapi fprintf kesilapan standard. 183 00:13:57,790 --> 00:14:03,650 Jadi sekarang, jika saya redirect ini ke txt2, Hello, Rob! masih mendapat dicetak pada baris arahan 184 00:14:03,650 --> 00:14:08,270 kerana ia mendapat dicetak kesilapan standard dan saya hanya mengalihkan standard keluar. 185 00:14:08,270 --> 00:14:16,420 Jika saya kini mengalihkan ralat piawai, kini ia tidak mendapat dicetak, dan txt2 akan menjadi Hello, Rob! 186 00:14:16,420 --> 00:14:21,910 Jadi sekarang, anda boleh mencetak kesilapan sebenar anda untuk ralat piawai 187 00:14:21,910 --> 00:14:24,720 dan mencetak mesej biasa anda untuk keluar standard. 188 00:14:24,720 --> 00:14:31,420 Dan jadi apabila anda menjalankan program anda, anda boleh menjalankan ia sebagai / hello jenis ini dengan 2> 189 00:14:31,420 --> 00:14:33,800 supaya program anda akan berjalan dengan normal, 190 00:14:33,800 --> 00:14:38,400 tetapi apa-apa mesej ralat bahawa anda mendapatkan anda boleh menyemak kemudian dalam log ralat anda, 191 00:14:38,400 --> 00:14:44,500 supaya kesilapan, dan kemudian melihat kemudian dan fail kesilapan anda akan mempunyai apa-apa kesilapan yang berlaku. 192 00:14:45,200 --> 00:14:47,540 >> Soalan? 193 00:14:47,540 --> 00:14:58,070 >> Yang terakhir adalah paip, yang anda boleh berfikir sebagai mengambil standard keluar dari satu arahan 194 00:14:58,070 --> 00:15:01,210 dan membuat ia standard dalam arahan seterusnya. 195 00:15:01,210 --> 00:15:05,570 Satu contoh di sini echo adalah satu perkara yang baris arahan 196 00:15:05,570 --> 00:15:11,840 yang hanya akan echo apa yang saya meletakkan sebagai hujah. Saya tidak akan meletakkan sebut harga. 197 00:15:11,840 --> 00:15:16,150 Gema blah, blah, blah hanya akan mencetak blah, blah, blah. 198 00:15:16,150 --> 00:15:20,600 Sebelum ini, apabila saya berkata, saya terpaksa meletakkan Rob ke dalam fail txt 199 00:15:20,600 --> 00:15:28,830 kerana saya hanya boleh mengalihkan fail txt, sebaliknya, / jika saya echo Rob 200 00:15:28,830 --> 00:15:35,520 dan kemudian paip ke. / hello, yang juga akan melakukan jenis yang sama perkara. 201 00:15:35,520 --> 00:15:39,160 Ini mengambil output arahan ini, echo Rob, 202 00:15:39,160 --> 00:15:43,610 dan menggunakan ia sebagai input bagi. / hello. 203 00:15:44,790 --> 00:15:49,560 Anda boleh berfikir ia sebagai pertama redirect echo Rob ke dalam fail 204 00:15:49,560 --> 00:15:54,160 dan kemudian input ke dalam fail. / hello bahawa yang hanya outputted. 205 00:15:54,160 --> 00:15:57,850 Tetapi ia mengambil fail sementara keluar gambar. 206 00:16:01,890 --> 00:16:04,460 >> Soalan pada itu? 207 00:16:04,460 --> 00:16:07,150 >> Persoalan seterusnya akan melibatkan ini. 208 00:16:07,150 --> 00:16:15,310 Apakah perancangan yang anda boleh gunakan untuk mencari beberapa nama-nama yang unik dalam fail yang dipanggil names.txt? 209 00:16:15,310 --> 00:16:24,160 Arahan kita akan mahu menggunakan di sini adalah unik, jadi uniq, dan kemudian tandas. 210 00:16:24,160 --> 00:16:28,840 Anda boleh melakukan uniq lelaki untuk benar-benar melihat apa yang tidak, 211 00:16:28,840 --> 00:16:34,840 dan ia hanya akan menapis bersebelahan padanan garisan dari input. 212 00:16:34,840 --> 00:16:40,690 Dan lelaki tandas akan mencetak newline, perkataan, dan tuduhan bait bagi setiap fail. 213 00:16:40,690 --> 00:16:43,760 Dan yang terakhir yang kita akan mahu menggunakan adalah jenis, 214 00:16:43,760 --> 00:16:47,410 yang akan hanya menyusun garisan fail txt. 215 00:16:47,410 --> 00:16:58,080 Jika saya membuat beberapa fail txt, names.txt, dan ia Rob, Tommy, Yusuf, Tommy, Yusuf, RJ, Rob, 216 00:16:58,080 --> 00:17:03,910 apa yang saya mahu lakukan di sini ialah mencari beberapa nama-nama yang unik dalam fail ini. 217 00:17:03,910 --> 00:17:08,750 Jadi apa jawapan yang sepatutnya? >> [Pelajar] 4. >> Yeah. 218 00:17:08,750 --> 00:17:13,780 Ia harus menjadi 4 sejak Rob, Tommy, Joseph, RJ adalah nama-nama yang hanya unik dalam fail ini. 219 00:17:13,780 --> 00:17:20,180 Langkah pertama, jika saya hanya melakukan kiraan perkataan pada names.txt, 220 00:17:20,180 --> 00:17:24,290 ini sebenarnya memberitahu saya segala-galanya. 221 00:17:24,290 --> 00:17:32,560 Ini sebenarnya adalah percetakan - Mari kita lihat, tandas lelaki - baris baru, perkataan, dan kiraan bait. 222 00:17:32,560 --> 00:17:38,270 Jika saya hanya mengambil berat tentang garisan, maka saya hanya boleh melakukan wc-l names.txt. 223 00:17:41,730 --> 00:17:44,300 Jadi itulah langkah 1. 224 00:17:44,300 --> 00:17:50,510 Tetapi saya tidak mahu names.txt wc-l kerana names.txt hanya mengandungi semua nama-nama, 225 00:17:50,510 --> 00:17:54,170 dan saya mahu menapis apa-apa yang bukan unik. 226 00:17:54,170 --> 00:18:01,200 Jadi, jika saya lakukan names.txt uniq, yang tidak cukup memberi saya apa yang saya mahu 227 00:18:01,200 --> 00:18:03,760 kerana nama ulangan masih ada. 228 00:18:03,760 --> 00:18:07,690 Mengapa? Mengapa uniq tidak melakukan apa yang saya mahu? 229 00:18:07,690 --> 00:18:10,500 [Pelajar] salinan tidak [didengar] >> Yeah. 230 00:18:10,500 --> 00:18:16,370 Ingat halaman lelaki untuk uniq mengatakan garisan padanan penapis bersebelahan. 231 00:18:16,370 --> 00:18:19,680 Mereka tidak berada bersebelahan, jadi ia tidak akan menapis mereka. 232 00:18:19,680 --> 00:18:31,100 Jika saya menyelesaikan terlebih dahulu, names.txt apapun akan meletakkan semua garisan salinan bersama-sama. 233 00:18:31,100 --> 00:18:34,450 Jadi kini names.txt apapun. 234 00:18:34,450 --> 00:18:40,550 Saya akan mahu menggunakan bahawa sebagai input kepada uniq, yang | uniq. 235 00:18:40,550 --> 00:18:43,390 Yang memberikan saya Yusuf, RJ, Rob, Tommy, 236 00:18:43,390 --> 00:18:49,260 dan saya mahu menggunakan bahawa sebagai input ke wc-l, 237 00:18:49,260 --> 00:18:52,740 yang akan memberi saya 4. 238 00:18:52,740 --> 00:18:56,930 Seperti ia berkata di sini, apa perancangan yang anda boleh gunakan? 239 00:18:56,930 --> 00:19:01,390 Anda boleh melakukan banyak perkara seperti menggunakan satu siri arahan 240 00:19:01,390 --> 00:19:05,130 di mana anda menggunakan output dari satu arahan sebagai input untuk arahan seterusnya. 241 00:19:05,130 --> 00:19:08,780 Anda boleh melakukan banyak perkara, banyak perkara yang bijak. 242 00:19:08,780 --> 00:19:11,440 >> Soalan? 243 00:19:12,910 --> 00:19:14,600 Okay. 244 00:19:14,600 --> 00:19:17,880 Itulah untuk paip dan redirection. 245 00:19:18,370 --> 00:19:24,090 >> Sekarang kita pergi kepada barangan sebenar, barangan kod. 246 00:19:24,090 --> 00:19:29,100 Dalam PDF ini, anda akan melihat arahan ini, 247 00:19:29,100 --> 00:19:32,950 dan anda akan mahu menjalankan arahan ini di dalam perkakas anda. 248 00:19:36,240 --> 00:19:42,250 wget adalah arahan hanya untuk mendapat sesuatu dari Internet, pada dasarnya, 249 00:19:42,250 --> 00:19:45,180 begitu wget dan URL ini. 250 00:19:45,180 --> 00:19:49,110 Jika anda pergi ke URL ini dalam pelayar anda, ia akan memuat turun fail tersebut. 251 00:19:49,110 --> 00:19:52,510 Saya hanya klik di atasnya, supaya ia turun fail bagi saya. 252 00:19:52,510 --> 00:19:55,650 Tetapi bertulis wget perkara itu di dalam terminal 253 00:19:55,650 --> 00:19:58,620 hanya akan memuat turun ke dalam terminal anda. 254 00:19:58,620 --> 00:20:02,750 Saya mempunyai yang section5.zip, dan anda akan mahu unzip section5.zip, 255 00:20:02,750 --> 00:20:06,520 yang akan memberikan anda folder yang dipanggil section5, 256 00:20:06,520 --> 00:20:11,550 yang akan mempunyai semua fail yang kita akan menggunakan hari ini di dalamnya. 257 00:20:33,380 --> 00:20:37,710 Sebagai mencadangkan nama fail program-program ini, mereka bit buggy, 258 00:20:37,710 --> 00:20:40,990 jadi misi anda adalah untuk memahami mengapa menggunakan Pra-Pemasangan. 259 00:20:40,990 --> 00:20:44,560 Adakah semua orang telah mereka turun / tahu bagaimana untuk mendapatkan mereka turun 260 00:20:44,560 --> 00:20:47,480 ke dalam perkakas mereka? Okay. 261 00:20:47,480 --> 00:20:56,400 >> Running ./buggy1, ia akan mengatakan kesalahan Segmentasi (teras dibuang), 262 00:20:56,400 --> 00:21:00,500 mana-mana masa anda mendapat segfault, ia adalah satu perkara yang buruk. 263 00:21:00,500 --> 00:21:03,810 Dalam keadaan apakah anda mendapat segfault? 264 00:21:03,810 --> 00:21:08,210 [Pelajar] Dereferencing penunjuk nol. >> Yeah. Jadi itu adalah satu contoh. 265 00:21:08,210 --> 00:21:11,580 Dereferencing penunjuk nol anda pergi untuk mendapatkan segfault. 266 00:21:11,580 --> 00:21:16,720 Apa segfault cara anda menyentuh memori anda tidak perlu menyentuh. 267 00:21:16,720 --> 00:21:21,350 Yang Jadi dereferencing penunjuk nol menyentuh alamat 0, 268 00:21:21,350 --> 00:21:28,060 dan pada dasarnya, semua komputer pada masa kini mengatakan bahawa alamat 0 memori anda tidak perlu menyentuh. 269 00:21:28,060 --> 00:21:31,920 Jadi itulah sebabnya dereferencing keputusan yang penunjuk nol dalam segfault. 270 00:21:31,920 --> 00:21:37,210 Apabila anda berlaku untuk tidak memulakan penunjuk, maka ia mempunyai nilai sampah, 271 00:21:37,210 --> 00:21:41,520 dan sebagainya apabila anda cuba untuk dereference ia, dalam semua kemungkinan anda menyentuh memori 272 00:21:41,520 --> 00:21:43,540 yang di tengah-tengah di mana-mana. 273 00:21:43,540 --> 00:21:45,650 Jika anda berlaku untuk mendapatkan bertuah dan nilai sampah 274 00:21:45,650 --> 00:21:48,440 berlaku untuk menunjukkan ke suatu tempat pada timbunan atau sesuatu, 275 00:21:48,440 --> 00:21:50,820 kemudian apabila anda dereference bahawa penunjuk yang anda tidak dimulakan, 276 00:21:50,820 --> 00:21:52,730 tiada apa yang akan pergi salah. 277 00:21:52,730 --> 00:21:55,480 Tetapi jika ia menunjuk ke, katakan, suatu tempat di antara timbunan dan longgokan itu, 278 00:21:55,480 --> 00:21:59,850 atau ia menunjuk hanya untuk tempat yang tidak digunakan oleh program anda lagi, 279 00:21:59,850 --> 00:22:02,240 maka anda menyentuh ingatan anda tidak perlu menyentuh dan anda segfault. 280 00:22:02,240 --> 00:22:06,370 Apabila anda menulis fungsi rekursi dan ia recurses terlalu banyak kali 281 00:22:06,370 --> 00:22:08,720 dan timbunan anda tumbuh terlalu besar dan bertembung timbunan ke dalam perkara-perkara 282 00:22:08,720 --> 00:22:12,270 bahawa ia tidak perlu berlanggar dengan, anda menyentuh memori anda tidak perlu menyentuh, 283 00:22:12,270 --> 00:22:14,810 jadi anda segfault. 284 00:22:14,810 --> 00:22:17,010 Itulah apa segfault. 285 00:22:17,010 --> 00:22:21,810 >> Ia juga merupakan sebab yang sama bahawa jika anda mempunyai rentetan seperti - 286 00:22:21,810 --> 00:22:23,930 mari kita kembali program sebelumnya. 287 00:22:23,930 --> 00:22:28,530 Di hello.c-: saya hanya akan membuat sesuatu yang lain. 288 00:22:28,530 --> 00:22:33,770 char * s = "hello dunia!"; 289 00:22:33,770 --> 00:22:42,310 Jika saya menggunakan * s = sesuatu atau s [0] = 'X'; 290 00:22:42,310 --> 00:22:47,290 supaya membuat hello, / hello, kenapa bahawa segfault? 291 00:22:48,410 --> 00:22:51,250 Mengapa ini segfault? 292 00:22:55,660 --> 00:22:57,890 Apa yang anda inginkan berlaku? 293 00:22:57,890 --> 00:23:06,640 Jika saya lakukan printf ("% s \ n", s); apa yang anda inginkan untuk dicetak? 294 00:23:06,640 --> 00:23:09,930 [Pelajar] X hello. >> Yeah. 295 00:23:09,930 --> 00:23:15,140 Masalahnya ialah bahawa apabila anda mengisytiharkan rentetan seperti ini, 296 00:23:15,140 --> 00:23:18,190 s adalah penunjuk yang akan pergi pada timbunan, 297 00:23:18,190 --> 00:23:25,880 dan apa yang s menunjuk kepada rentetan ini yang terkandung dalam ingatan baca sahaja. 298 00:23:25,880 --> 00:23:30,560 Jadi hanya dengan nama, ingatan baca sahaja, anda perlu mendapatkan idea 299 00:23:30,560 --> 00:23:33,010 bahawa jika anda cuba untuk menukar apa yang dalam ingatan baca sahaja, 300 00:23:33,010 --> 00:23:36,670 anda sedang melakukan sesuatu yang anda tidak perlu melakukan dengan ingatan dan anda segfault. 301 00:23:36,670 --> 00:23:45,360 Ini sebenarnya adalah satu perbezaan yang besar antara char * s dan char []. 302 00:23:45,360 --> 00:23:48,790 Jadi char s [], kini tali ini akan diletakkan pada timbunan, 303 00:23:48,790 --> 00:23:53,960 dan timbunan tidak baca sahaja, yang bermaksud bahawa ini perlu bekerja dengan sempurna halus. 304 00:23:55,500 --> 00:23:57,370 Dan ia tidak. 305 00:23:57,370 --> 00:24:06,250 Ingatlah bahawa apabila saya melakukan char * s = "hello dunia!", S sendiri pada timbunan 306 00:24:06,250 --> 00:24:10,390 tetapi s mata ke tempat lain, dan tempat lain yang berlaku kepada menjadi baca sahaja. 307 00:24:10,390 --> 00:24:15,640 Tetapi s char [] adalah hanya sesuatu pada timbunan. 308 00:24:17,560 --> 00:24:21,760 Jadi itulah lagi contoh sebuah segfault berlaku. 309 00:24:21,760 --> 00:24:27,820 >> Kami melihat bahawa ./buggy1 mengakibatkan dalam segfault. 310 00:24:27,820 --> 00:24:31,810 Secara teori, anda tidak perlu melihat buggy1.c segera. 311 00:24:31,810 --> 00:24:35,170 Sebaliknya, kita akan melihat ia melalui Pra-Pemasangan. 312 00:24:35,170 --> 00:24:37,750 Perhatikan bahawa apabila anda mendapat kesalahan Segmentasi (teras dibuang), 313 00:24:37,750 --> 00:24:40,850 anda mendapat fail ini lebih teras yang di sini dipanggil. 314 00:24:40,850 --> 00:24:45,200 Jika kita ls-l, kita akan melihat teras yang biasanya fail yang agak besar. 315 00:24:45,200 --> 00:24:51,580 Ini adalah nombor bait fail, jadi ia kelihatan seperti ia adalah 250-sesuatu kilobytes. 316 00:24:51,580 --> 00:24:56,120 Sebab untuk ini adalah bahawa apa yang dump teras sebenarnya adalah 317 00:24:56,120 --> 00:25:01,410 apabila program kemalangan anda, keadaan ingatan program anda 318 00:25:01,410 --> 00:25:05,230 hanya mendapat disalin dan ditampal ke dalam fail ini. 319 00:25:05,230 --> 00:25:07,270 Ia mendapat dibuang ke dalam fail tersebut. 320 00:25:07,270 --> 00:25:13,060 Program ini, ketika ia berlari, yang berlaku kepada mempunyai penggunaan memori sekitar 250 kilobytes, 321 00:25:13,060 --> 00:25:17,040 dan supaya apa yang mendapat dibuang ke fail ini. 322 00:25:17,040 --> 00:25:23,630 Sekarang anda boleh melihat fail yang jika kita lakukan Pra-Pemasangan buggy1 teras. 323 00:25:23,630 --> 00:25:30,130 Kita hanya boleh melakukan Pra-Pemasangan buggy1, dan yang hanya akan memulakan Pra-Pemasangan kerap, 324 00:25:30,130 --> 00:25:33,800 menggunakan buggy1 sebagai fail input. 325 00:25:33,800 --> 00:25:38,260 Tetapi jika anda melakukan Pra-Pemasangan buggy1 teras, maka ia adalah khas akan memulakan Pra-Pemasangan 326 00:25:38,260 --> 00:25:40,330 dengan melihat fail teras yang. 327 00:25:40,330 --> 00:25:45,560 Dan anda berkata buggy1 cara Pra-Pemasangan tahu bahawa fail teras datang dari program buggy1. 328 00:25:45,560 --> 00:25:49,580 Jadi Pra-Pemasangan buggy1 teras akan segera membawa kita 329 00:25:49,580 --> 00:25:52,060 mana program yang berlaku untuk menamatkan. 330 00:25:57,720 --> 00:26:02,340 Kita lihat di sini Program ditamatkan dengan isyarat 11, Segmentasi kesalahan. 331 00:26:02,340 --> 00:26:10,110 Kita berlaku untuk melihat barisan pemasangan, yang mungkin tidak sangat membantu. 332 00:26:10,110 --> 00:26:15,360 Tetapi jika anda menaip bt atau jejakundur, yang akan menjadi fungsi 333 00:26:15,360 --> 00:26:19,430 yang memberikan kami senarai bingkai timbunan semasa kami. 334 00:26:19,430 --> 00:26:23,150 Jadi jejakundur Ia kelihatan seperti kami hanya mempunyai dua bingkai tindanan. 335 00:26:23,150 --> 00:26:26,310 Yang pertama adalah bingkai tindanan utama kami, 336 00:26:26,310 --> 00:26:29,810 dan yang kedua ialah bingkai tindanan untuk fungsi ini bahawa kita berada dalam, 337 00:26:29,810 --> 00:26:34,440 yang kelihatan seperti kita hanya mempunyai kod pemasangan untuk. 338 00:26:34,440 --> 00:26:38,050 Jadi mari kita kembali ke dalam fungsi utama kita, 339 00:26:38,050 --> 00:26:42,300 dan untuk berbuat demikian kita boleh melakukan bingkai 1, dan saya fikir kita juga boleh melakukan turun, 340 00:26:42,300 --> 00:26:45,160 tetapi saya hampir tidak pernah melakukan - atau sehingga. Yeah. 341 00:26:45,160 --> 00:26:50,710 Naik dan turun. Sehingga membawa anda satu timbunan bingkai, turun membawa anda ke bawah bingkai tindanan. 342 00:26:50,710 --> 00:26:53,240 Saya cenderung untuk tidak menggunakan bahawa. 343 00:26:53,240 --> 00:26:59,120 Saya hanya khusus mengatakan frame 1, yang pergi ke bingkai dilabel 1. 344 00:26:59,120 --> 00:27:01,750 Frame 1 akan membawa kita ke dalam bingkai tindanan utama, 345 00:27:01,750 --> 00:27:05,570 dan ia mengatakan di sini baris kod kita berada di. 346 00:27:05,570 --> 00:27:07,950 Jika kita mahu pasangan lebih baris kod, kita boleh mengatakan senarai, 347 00:27:07,950 --> 00:27:11,280 dan itu akan memberikan kita semua baris kod sekelilingnya. 348 00:27:11,280 --> 00:27:13,360 Barisan kita segfaulted pada 6: 349 00:27:13,360 --> 00:27:17,360 jika (strcmp ("CS50 batu", argv [1]) == 0). 350 00:27:17,360 --> 00:27:24,130 Jika ia tidak jelas lagi, anda boleh mendapatkan terus dari sini hanya dengan berfikir mengapa ia segfaulted. 351 00:27:24,130 --> 00:27:28,800 Tetapi kita boleh mengambil ia satu langkah ke hadapan dan berkata, "Mengapa argv [1] segfault?" 352 00:27:28,800 --> 00:27:38,830 Cetak Mari argv [1], dan ia kelihatan seperti 0x0, ia yang merupakan penunjuk nol. 353 00:27:38,830 --> 00:27:44,750 Kami strcmping CS50 batu dan batal, dan sebagainya yang akan segfault. 354 00:27:44,750 --> 00:27:48,280 Dan mengapa argv [1] null? 355 00:27:48,640 --> 00:27:51,280 [Pelajar] Kerana kita tidak memberikan apa-apa hujah baris arahan. 356 00:27:51,280 --> 00:27:53,390 Yeah. Kami tidak memberikan apa-apa hujah baris arahan. 357 00:27:53,390 --> 00:27:58,460 Jadi ./buggy1 hanya akan mempunyai argv [0] ./buggy1. 358 00:27:58,460 --> 00:28:02,100 Ia tidak akan mempunyai argv [1], supaya akan segfault. 359 00:28:02,100 --> 00:28:07,450 Tetapi jika, sebaliknya, yang saya lakukan hanya CS50, ia akan mengatakan Anda mendapatkan D 360 00:28:07,450 --> 00:28:09,950 kerana itulah apa yang ia sepatutnya lakukan. 361 00:28:09,950 --> 00:28:15,240 Melihat di buggy1.c, ia sepatutnya untuk mencetak "Anda mendapat D" - 362 00:28:15,240 --> 00:28:20,820 Jika argv [1] tidak "CS50 batu", "Anda mendapat D", lain "Anda mendapat A!" 363 00:28:20,820 --> 00:28:25,660 Jadi, jika kita mahu A, kita perlu ini untuk membandingkan sebagai benar, 364 00:28:25,660 --> 00:28:28,710 yang bermaksud bahawa ia membandingkan kepada 0. 365 00:28:28,710 --> 00:28:31,100 Jadi argv [1] perlu "CS50 batu". 366 00:28:31,100 --> 00:28:35,660 Jika anda ingin berbuat demikian pada baris arahan, anda perlu menggunakan \ untuk melarikan diri ruang. 367 00:28:35,660 --> 00:28:41,690 Jadi CS50 \ batu dan Anda mendapat A! 368 00:28:41,690 --> 00:28:44,060 Jika anda tidak berbuat backslash, mengapa ini tidak berfungsi? 369 00:28:44,060 --> 00:28:47,190 [Pelajar] Ia adalah dua hujah yang berbeza. >> Yeah. 370 00:28:47,190 --> 00:28:52,540 Argv [1] akan menjadi CS50, dan argv [2] akan menjadi batu. Okay. 371 00:28:52,540 --> 00:28:56,470 >> Sekarang ./buggy2 akan segfault lagi. 372 00:28:56,470 --> 00:29:01,880 Sebaliknya membukanya dengan fail terasnya, kita hanya akan membuka buggy2 langsung, 373 00:29:01,880 --> 00:29:05,000 jadi Pra-Pemasangan buggy2. 374 00:29:05,000 --> 00:29:09,590 Sekarang jika kita hanya menjalankan program kami, maka ia akan berkata Program menerima SIGSEGV isyarat, 375 00:29:09,590 --> 00:29:15,530 yang merupakan segfault isyarat, dan ini adalah di mana ia berlaku berlaku. 376 00:29:15,530 --> 00:29:21,250 Melihat jejakundur kita, kita melihat bahawa kita adalah dalam oh_no fungsi, 377 00:29:21,250 --> 00:29:23,900 yang telah dipanggil oleh Dinky fungsi, yang dipanggil oleh binky fungsi, 378 00:29:23,900 --> 00:29:26,460 yang telah dipanggil oleh utama. 379 00:29:26,460 --> 00:29:31,680 Kita juga boleh melihat hujah-hujah untuk fungsi-fungsi ini. 380 00:29:31,680 --> 00:29:34,680 Hujah untuk Dinky dan binky adalah 1. 381 00:29:34,680 --> 00:29:44,390 Jika kita menyenaraikan fungsi oh_no, kita lihat bahawa oh_no hanya melakukan char ** s = NULL; 382 00:29:44,390 --> 00:29:47,410 * S = "BOOM"; 383 00:29:47,410 --> 00:29:50,330 Mengapa yang akan gagal? 384 00:29:54,330 --> 00:29:58,380 [Pelajar] Anda tidak boleh dereference penunjuk nol? >> Yeah. 385 00:29:58,380 --> 00:30:06,090 Ini hanya mengatakan s adalah NULL, tanpa mengira jika ia berlaku untuk menjadi ** char, 386 00:30:06,090 --> 00:30:12,070 yang, bergantung kepada bagaimana anda mentafsir, ia boleh menjadi penunjuk kepada penunjuk kepada rentetan 387 00:30:12,070 --> 00:30:15,550 atau pelbagai rentetan. 388 00:30:15,550 --> 00:30:21,430 Ia s adalah NULL, jadi * s dereferencing penunjuk nol, 389 00:30:21,430 --> 00:30:24,800 dan sebagainya ini akan kemalangan. 390 00:30:24,800 --> 00:30:27,540 Ini adalah salah satu cara paling cepat anda mungkin boleh segfault. 391 00:30:27,540 --> 00:30:31,300 Ia hanya mengisytiharkan penunjuk nol dan segera segfaulting. 392 00:30:31,300 --> 00:30:34,570 Itulah apa yang oh_no lakukan. 393 00:30:34,570 --> 00:30:43,400 Jika kita pergi satu bingkai, maka kita akan masuk ke dalam fungsi yang dipanggil oh_no. 394 00:30:43,400 --> 00:30:44,830 Saya perlu untuk melakukan yang turun. 395 00:30:44,830 --> 00:30:48,610 Jika anda tidak memasukkan arahan dan anda hanya tekan Enter lagi, 396 00:30:48,610 --> 00:30:52,350 ia hanya akan mengulangi arahan sebelumnya yang anda berlari. 397 00:30:52,350 --> 00:30:56,610 Kami dalam bingkai 1. 398 00:30:56,610 --> 00:31:04,650 Penyenaraian bingkai ini, kita lihat sini adalah fungsi kita. 399 00:31:04,650 --> 00:31:08,520 Anda boleh menekan senarai lagi, atau anda boleh melakukan senarai 20 dan ia akan menyenaraikan lebih. 400 00:31:08,520 --> 00:31:13,640 Dinky fungsi mengatakan jika i adalah 1, maka pergi kepada fungsi oh_no, 401 00:31:13,640 --> 00:31:15,960 lain pergi ke fungsi Slinky. 402 00:31:15,960 --> 00:31:18,700 Dan kita tahu i ialah 1 kerana kita berlaku untuk melihat di sini 403 00:31:18,700 --> 00:31:22,560 Dinky yang dipanggil dengan hujah 1. 404 00:31:22,560 --> 00:31:27,560 Atau anda hanya boleh melakukan mencetak i dan ia akan berkata i ialah 1. 405 00:31:27,560 --> 00:31:33,770 Kami sedang dalam Dinky, dan jika kita naik bingkai lain, kita tahu kita akan berakhir di binky. 406 00:31:33,770 --> 00:31:36,600 Up. Sekarang kita berada dalam binky. 407 00:31:36,600 --> 00:31:41,340 Menyenaraikan fungsi ini - senarai dari sebelum separuh memotong saya - 408 00:31:41,340 --> 00:31:52,670 ia bermula seolah-olah i ialah 0, maka kita akan untuk memanggil ia oh_no, lain memanggil Dinky. 409 00:31:52,670 --> 00:31:57,000 Kita tahu i 1, jadi ia dipanggil Dinky. 410 00:31:57,000 --> 00:32:05,030 Dan kini kami kembali utama, dan utama hanya akan menjadi int i = rand ()% 3; 411 00:32:05,030 --> 00:32:08,790 Itu hanya akan memberi anda satu nombor rawak yang sama ada 0, 1, atau 2. 412 00:32:08,790 --> 00:32:12,780 Ia akan memanggil binky dengan nombor itu, dan ia akan kembali 0. 413 00:32:12,780 --> 00:32:16,700 Melihat ini, 414 00:32:16,700 --> 00:32:19,880 hanya berjalan melalui program ini secara manual tanpa berjalan dengan segera, 415 00:32:19,880 --> 00:32:25,400 anda akan menetapkan titik rehat di utama, yang bermaksud bahawa apabila kita menjalankan program 416 00:32:25,400 --> 00:32:31,020 program anda berjalan sehingga ia mencecah titik rehat. 417 00:32:31,020 --> 00:32:35,450 Jadi menjalankan program ini, ia akan berjalan dan kemudian ia akan melanda fungsi utama dan berhenti berjalan. 418 00:32:35,450 --> 00:32:44,700 Sekarang kita berada di dalam utama, dan langkah atau seterusnya akan membawa kita ke baris seterusnya kod. 419 00:32:44,700 --> 00:32:47,050 Anda boleh melakukan langkah atau seterusnya. 420 00:32:47,050 --> 00:32:51,800 Memukul seterusnya, sekarang i telah bersedia untuk rand () 3%, jadi kami boleh mencetak nilai i, 421 00:32:51,800 --> 00:32:55,280 dan ia akan mengatakan i ialah 1. 422 00:32:55,280 --> 00:32:58,110 Sekarang ia tidak kira sama ada kita gunakan seterusnya atau langkah. 423 00:32:58,110 --> 00:33:01,000 Saya rasa ia mattered dalam satu sebelumnya, tetapi kita mahu menggunakan seterusnya. 424 00:33:01,000 --> 00:33:06,000 Jika kita menggunakan langkah, kita melangkah ke fungsi, yang bermakna melihat perkara yang sebenar 425 00:33:06,000 --> 00:33:07,940 yang berlaku di dalam binky. 426 00:33:07,940 --> 00:33:10,510 Jika kita gunakan seterusnya, maka ia bermakna pergi ke fungsi 427 00:33:10,510 --> 00:33:14,070 dan hanya pergi ke baris seterusnya kod dalam fungsi utama kami. 428 00:33:14,070 --> 00:33:17,900 Hak di sini pada baris ini, saya berada di mana ia berkata rand ()% 3; 429 00:33:17,900 --> 00:33:21,320 jika saya lakukan langkah, ia akan pergi ke pelaksanaan rand 430 00:33:21,320 --> 00:33:25,110 dan melihat apa yang berlaku di sana, dan saya boleh melangkah melalui fungsi rand. 431 00:33:25,110 --> 00:33:26,920 Tetapi saya tidak peduli mengenai fungsi rand. 432 00:33:26,920 --> 00:33:30,190 Saya hanya mahu untuk pergi ke baris seterusnya kod utama, jadi saya gunakan seterusnya. 433 00:33:30,190 --> 00:33:35,800 Tetapi kini saya lakukan penjagaan mengenai fungsi binky, jadi saya mahu melangkah ke itu. 434 00:33:35,800 --> 00:33:37,730 Sekarang saya dalam binky. 435 00:33:37,730 --> 00:33:42,040 Baris pertama kod akan mengatakan jika (i == 0), saya mengambil langkah, 436 00:33:42,040 --> 00:33:44,930 kita lihat kita berakhir di Dinky. 437 00:33:44,930 --> 00:33:51,620 Jika perkara senarai kita, kita lihat bahawa ia diperiksa adalah i = 0. 438 00:33:51,620 --> 00:33:55,470 i tidak sama dengan 0, jadi ia pergi ke keadaan yang lain, 439 00:33:55,470 --> 00:33:59,540 yang akan memanggil Dinky (i). 440 00:33:59,540 --> 00:34:04,030 Anda mungkin terkeliru. 441 00:34:04,030 --> 00:34:07,380 Jika anda hanya melihat ayat-ayat ini secara langsung, anda mungkin berfikir jika (i == 0), 442 00:34:07,380 --> 00:34:10,800 okay, maka saya telah mengambil langkah dan kini saya di Dinky (i), 443 00:34:10,800 --> 00:34:14,120 anda mungkin berfikir bahawa mesti bermakna i = 0 atau sesuatu. 444 00:34:14,120 --> 00:34:18,980 Ia hanya bermakna bahawa ia tahu ia boleh melekat terus ke Dinky baris (i). 445 00:34:18,980 --> 00:34:23,300 Kerana saya tidak adalah 0, langkah seterusnya tidak akan berakhir di lain. 446 00:34:23,300 --> 00:34:26,239 Lain tidak adalah selaras ia akan berhenti pada. 447 00:34:26,239 --> 00:34:31,570 Ia hanya akan pergi ke baris berikutnya ia sebenarnya boleh melaksanakan, yang Dinky (i). 448 00:34:31,570 --> 00:34:36,090 Melangkah ke Dinky (i), kita lihat jika (i == 1). 449 00:34:36,090 --> 00:34:42,670 Kita tahu i = 1, jadi apabila kita melangkah, kita tahu kita akan berakhir di oh_no 450 00:34:42,670 --> 00:34:46,489 kerana i = 1 panggilan oh_no fungsi, yang anda boleh melangkah ke, 451 00:34:46,489 --> 00:34:52,969 yang akan menetapkan char ** s = batal dan segera "BOOM". 452 00:34:54,270 --> 00:34:59,690 Dan kemudian sebenarnya melihat pelaksanaan buggy2, 453 00:34:59,690 --> 00:35:04,590 ini, saya hanya mendapat nombor rawak - 0, 1, atau 2 - memanggil binky, 454 00:35:04,590 --> 00:35:10,610 yang jika i adalah 0 ia memerlukan oh_no, jika tidak, ia memerlukan Dinky, yang datang sini. 455 00:35:10,610 --> 00:35:18,100 Jika i 1, panggilan oh_no, lain memanggil Slinky, yang datang sini, 456 00:35:18,100 --> 00:35:20,460 jika i 2, hubungi oh_no. 457 00:35:20,460 --> 00:35:24,720 Saya tidak fikir ada cara - 458 00:35:24,720 --> 00:35:30,030 Adakah sesiapa yang melihat cara membuat ini satu program yang tidak akan segfault? 459 00:35:30,030 --> 00:35:37,530 Kerana melainkan saya hilang sesuatu, jika i ialah 0, anda akan segera segfault, 460 00:35:37,530 --> 00:35:41,250 lain yang anda pergi ke fungsi yang jika i adalah 1 anda segfault, 461 00:35:41,250 --> 00:35:44,540 lain anda pergi untuk fungsi mana jika i 2 anda segfault. 462 00:35:44,540 --> 00:35:46,810 Jadi tidak kira apa yang anda lakukan, anda segfault. 463 00:35:46,810 --> 00:35:52,380 >> Saya rasa salah satu cara menetapkan ia akan menjadi bukannya melakukan char ** s = NULL, 464 00:35:52,380 --> 00:35:55,610 anda boleh malloc ruang untuk rentetan itu. 465 00:35:55,610 --> 00:36:04,230 Kita boleh melakukan malloc (sizeof) - sizeof apa? 466 00:36:09,910 --> 00:36:15,190 [Pelajar] (char) * 5? >> Adakah ini kelihatan betul? 467 00:36:15,190 --> 00:36:21,060 Saya menganggap ini akan bekerja jika saya sebenarnya berlari, tetapi ia bukan apa yang saya cari. 468 00:36:24,400 --> 00:36:32,940 Lihatlah jenis s. Mari kita menambah * int, jadi int * x. 469 00:36:32,940 --> 00:36:35,600 Saya akan lakukan malloc (sizeof (int)). 470 00:36:35,600 --> 00:36:40,490 Atau jika saya mahu pelbagai 5, saya akan lakukan (sizeof (int) * 5); 471 00:36:40,490 --> 00:36:44,210 Bagaimana jika saya mempunyai ** int? 472 00:36:46,260 --> 00:36:49,140 Apa yang akan saya malloc? 473 00:36:49,140 --> 00:36:53,510 [Pelajar] Saiz penunjuk. >> Yeah. (Sizeof (int *)); 474 00:36:53,510 --> 00:36:56,960 Perkara yang sama di sini. 475 00:36:56,960 --> 00:37:01,280 Saya mahu (sizeof (char *)); 476 00:37:06,170 --> 00:37:12,840 Ini akan untuk memperuntukkan ruang bagi penunjuk bahawa mata untuk "BOOM". 477 00:37:12,840 --> 00:37:15,330 Saya tidak perlu untuk memperuntukkan ruang bagi "BOOM" itu sendiri 478 00:37:15,330 --> 00:37:17,210 kerana ini adalah pada dasarnya bersamaan dengan apa yang saya katakan sebelum ini 479 00:37:17,210 --> 00:37:20,870 char * x = "BOOM". 480 00:37:20,870 --> 00:37:27,950 "BOOM" sudah wujud. Ia berlaku kepada wujud di rantau baca sahaja memori. 481 00:37:27,950 --> 00:37:35,200 Tetapi ia sudah wujud, yang bermakna garis kod ini, jika s adalah ** char, 482 00:37:35,200 --> 00:37:43,900 maka * s * char dan anda menetapkan ini * char untuk menunjukkan "BOOM". 483 00:37:43,900 --> 00:37:50,040 Jika saya mahu menyalin "BOOM" ke dalam s, maka saya akan perlu untuk memperuntukkan ruang untuk s. 484 00:37:55,170 --> 00:38:03,900 Saya akan lakukan * s = malloc (sizeof (char) * 5); 485 00:38:03,900 --> 00:38:06,210 Mengapa 5? 486 00:38:06,210 --> 00:38:10,860 Mengapa not 4? Ia kelihatan seperti "BOOM" adalah 4 aksara. >> [Pelajar] Watak nol. 487 00:38:10,860 --> 00:38:14,580 Yeah. Semua rentetan anda akan memerlukan watak batal. 488 00:38:14,580 --> 00:38:23,590 Sekarang saya boleh melakukan sesuatu seperti strcat - Apakah fungsi untuk menyalin rentetan? 489 00:38:23,590 --> 00:38:28,520 [Pelajar] cpy? >> Strcpy. 490 00:38:28,520 --> 00:38:32,700 strcpy manusia. 491 00:38:36,120 --> 00:38:39,590 Jadi strcpy atau strncpy. 492 00:38:39,590 --> 00:38:43,410 strncpy adalah sedikit lebih selamat kerana anda boleh menentukan dengan tepat berapa banyak aksara, 493 00:38:43,410 --> 00:38:46,190 tetapi di sini ia tidak menjadi masalah kerana kita tahu. 494 00:38:46,190 --> 00:38:50,340 Jadi strcpy dan lihat dalam hujah-hujah. 495 00:38:50,340 --> 00:38:53,100 Hujah pertama adalah destinasi kita. 496 00:38:53,100 --> 00:38:56,770 Hujah kedua adalah sumber kami. 497 00:38:56,770 --> 00:39:10,310 Kami pergi untuk menyalin ke destinasi kita * s penunjuk "BOOM". 498 00:39:10,310 --> 00:39:19,820 Mengapa anda mungkin mahu melakukan ini dengan strcpy bukan hanya apa yang kita sebelum 499 00:39:19,820 --> 00:39:22,800 * s = "BOOM"? 500 00:39:22,800 --> 00:39:28,630 Terdapat satu sebab anda mungkin mahu melakukan ini, tetapi apakah sebab itu? 501 00:39:28,630 --> 00:39:31,940 [Pelajar] Jika anda mahu menukar sesuatu dalam "BOOM". >> Yeah. 502 00:39:31,940 --> 00:39:37,950 Sekarang saya boleh melakukan sesuatu seperti s [0] = 'X'; 503 00:39:37,950 --> 00:39:48,190 kerana s mata kepada timbunan dan ruang yang pada timbunan bahawa s menunjuk ke 504 00:39:48,190 --> 00:39:52,320 adalah penunjuk kepada lebih banyak ruang pada timbunan, yang menyimpan "BOOM". 505 00:39:52,320 --> 00:39:55,150 Jadi ini salinan "BOOM" yang disimpan dalam timbunan. 506 00:39:55,150 --> 00:39:58,780 Teknikal Terdapat dua salinan "BOOM" dalam program kami. 507 00:39:58,780 --> 00:40:03,500 Ada yang pertama itu hanya diberikan oleh "BOOM" pemalar rentetan, 508 00:40:03,500 --> 00:40:09,250 dan salinan kedua "BOOM", strcpy mencipta salinan "BOOM". 509 00:40:09,250 --> 00:40:13,100 Tetapi salinan "BOOM" yang disimpan pada timbunan, dan timbunan itu anda bebas untuk menukar. 510 00:40:13,100 --> 00:40:17,250 Timbunan tidak baca sahaja, supaya bermakna bahawa s [0] 511 00:40:17,250 --> 00:40:20,500 akan membiarkan anda menukar nilai "BOOM". 512 00:40:20,500 --> 00:40:23,130 Ia akan membiarkan anda menukar watak-watak mereka. 513 00:40:23,130 --> 00:40:26,640 >> Soalan? 514 00:40:27,740 --> 00:40:29,290 Okay. 515 00:40:29,290 --> 00:40:35,500 >> Beralih kepada buggy3, Pra-Pemasangan buggy3 mari. 516 00:40:35,500 --> 00:40:39,840 Kami hanya menjalankan dan kita lihat kita mendapatkan segfault. 517 00:40:39,840 --> 00:40:46,550 Jika kita jejakundur, terdapat hanya dua fungsi. 518 00:40:46,550 --> 00:40:52,970 Jika kita pergi ke dalam fungsi utama kita, kita lihat bahawa kita segfaulted di garisan ini. 519 00:40:52,970 --> 00:41:00,180 Jadi hanya mencari di garisan ini, untuk (int line = 0; fgets barangan ini tidak NULL tidak sama; 520 00:41:00,180 --> 00:41:03,770 line + +). 521 00:41:03,770 --> 00:41:08,010 Bingkai sebelumnya kami telah dipanggil _IO_fgets. 522 00:41:08,010 --> 00:41:10,720 Anda akan melihat bahawa banyak dengan fungsi terbina dalam C, 523 00:41:10,720 --> 00:41:15,350 bahawa apabila anda mendapat segfault, akan ada nama fungsi yang benar-benar samar 524 00:41:15,350 --> 00:41:18,090 seperti _IO_fgets ini. 525 00:41:18,090 --> 00:41:21,770 Tetapi itu akan berkaitan dengan panggilan fgets ini. 526 00:41:21,770 --> 00:41:25,850 Di suatu tempat di dalam sini, kita segfaulting. 527 00:41:25,850 --> 00:41:30,340 Jika kita melihat hujah-hujah fgets, kita boleh mencetak penampan. 528 00:41:30,340 --> 00:41:41,180 Mari mencetak sebagai - Oh, tidak. 529 00:41:48,980 --> 00:41:51,900 Cetak tidak akan bekerja dengan tepat kerana saya mahu ia. 530 00:41:55,460 --> 00:41:58,000 Mari kita lihat pada program sebenar. 531 00:42:02,200 --> 00:42:09,640 Penimbal adalah pelbagai watak. Ia adalah pelbagai watak 128 aksara. 532 00:42:09,640 --> 00:42:14,980 Jadi, apabila saya mengatakan penampan cetak, ia akan untuk mencetak mereka 128 aksara, 533 00:42:14,980 --> 00:42:18,300 yang saya rasa adalah apa yang diharapkan. 534 00:42:18,300 --> 00:42:21,390 Apa yang saya cari adalah mencetak alamat penampan, 535 00:42:21,390 --> 00:42:23,680 tetapi itu tidak benar-benar memberitahu saya banyak. 536 00:42:23,680 --> 00:42:30,770 Jadi, apabila saya berlaku untuk mengatakan sini x penampan, ia menunjukkan saya 0xbffff090, 537 00:42:30,770 --> 00:42:38,690 yang, jika anda ingat dari awal atau beberapa titik, Oxbffff cenderung untuk menjadi rantau timbunan-ish. 538 00:42:38,690 --> 00:42:46,020 Timbunan cenderung untuk memulakan suatu tempat hanya di bawah 0xc000. 539 00:42:46,020 --> 00:42:51,890 Hanya dengan melihat alamat ini, saya tahu bahawa penampan yang berlaku pada timbunan. 540 00:42:51,890 --> 00:43:04,500 Memulakan semula program saya, berlari, up, penampan yang kita lihat adalah jujukan aksara 541 00:43:04,500 --> 00:43:06,530 yang cukup banyak sia-sia. 542 00:43:06,530 --> 00:43:12,270 Kemudian mencetak fail, apakah fail kelihatan seperti? 543 00:43:15,120 --> 00:43:17,310 [Pelajar] Nol. >> Yeah. 544 00:43:17,310 --> 00:43:22,610 Fail adalah * FILE jenis, jadi ia adalah penunjuk, 545 00:43:22,610 --> 00:43:26,610 dan nilai penunjuk bahawa adalah batal. 546 00:43:26,610 --> 00:43:33,240 Jadi fgets akan cuba untuk membaca daripada penunjuk yang secara tidak langsung, 547 00:43:33,240 --> 00:43:37,320 tetapi dalam usaha untuk mengakses penunjuk bahawa, ia mempunyai dereference ia. 548 00:43:37,320 --> 00:43:40,550 Atau, untuk mengakses apa yang ia harus menunjuk, ia dereferences ia. 549 00:43:40,550 --> 00:43:43,810 Jadi ia dereferencing penunjuk nol dan segfaults ia. 550 00:43:46,600 --> 00:43:48,730 Saya boleh dimulakan semula sana. 551 00:43:48,730 --> 00:43:52,170 Jika kita memecahkan di titik utama kami dan berlari, 552 00:43:52,170 --> 00:43:57,320 baris pertama kod char * filename = "nonexistent.txt"; 553 00:43:57,320 --> 00:44:00,870 Yang harus memberi petunjuk yang cukup besar mengapa program ini gagal. 554 00:44:00,870 --> 00:44:06,080 Menaip seterusnya membawa saya kepada baris seterusnya, di mana saya membuka fail ini, 555 00:44:06,080 --> 00:44:11,140 dan kemudian saya segera masuk ke dalam barisan kami, di mana apabila saya memukul seterusnya, ia akan untuk segfault. 556 00:44:11,140 --> 00:44:16,880 Adakah sesiapa yang mahu membuang keluar sebab mengapa kita mungkin segfaulting? 557 00:44:16,880 --> 00:44:19,130 [Pelajar] Fail tidak wujud. >> Yeah. 558 00:44:19,130 --> 00:44:22,250 Ini sepatutnya menjadi petunjuk 559 00:44:22,250 --> 00:44:29,570 bahawa apabila anda membuka fail, anda perlu menyemak bahawa fail itu sebenarnya wujud. 560 00:44:29,570 --> 00:44:31,510 Jadi di sini, "nonexistent.txt"; 561 00:44:31,510 --> 00:44:34,700 Apabila kita fopen nama fail untuk membaca, maka kita perlu mengatakan 562 00:44:34,700 --> 00:44:45,870 jika (file == NULL) dan mengatakan printf ("Fail tidak wujud!" 563 00:44:45,870 --> 00:44:56,340 atau - lebih baik lagi - nama fail); pulangan 1; 564 00:44:56,340 --> 00:45:00,300 Jadi sekarang kita memeriksa untuk melihat jika ia adalah NULL 565 00:45:00,300 --> 00:45:03,930 sebelum sebenarnya berterusan dan cuba untuk membaca dari fail itu. 566 00:45:03,930 --> 00:45:08,800 Kita boleh membentuk semula ia hanya untuk melihat bahawa kerja-kerja. 567 00:45:11,020 --> 00:45:14,970 Saya bertujuan untuk memasukkan baris baru. 568 00:45:21,090 --> 00:45:25,290 Jadi sekarang nonexistent.txt tidak wujud. 569 00:45:26,890 --> 00:45:30,040 Anda harus selalu memeriksa untuk menyelesaikan perkara ini. 570 00:45:30,040 --> 00:45:33,870 Anda harus selalu memeriksa untuk melihat jika fopen mengembalikan NULL. 571 00:45:33,870 --> 00:45:38,170 Anda harus selalu memeriksa untuk memastikan bahawa malloc tidak kembali NULL, 572 00:45:38,170 --> 00:45:41,410 atau lain anda segfault. 573 00:45:42,200 --> 00:45:45,930 >> Sekarang buggy4.c. 574 00:45:49,190 --> 00:45:58,440 Berjalan. Saya meneka ini sedang menunggu untuk input atau gelung mungkin terbatas. 575 00:45:58,440 --> 00:46:01,870 Ya, ia adalah gelung tidak terhingga. 576 00:46:01,870 --> 00:46:05,560 Jadi buggy4. Ia kelihatan seperti kami gelung tidak terhingga. 577 00:46:05,560 --> 00:46:12,590 Kita boleh memecahkan di utama, jalankan program kami. 578 00:46:12,590 --> 00:46:20,180 Pra-Pemasangan, selagi singkatan yang anda gunakan adalah jelas 579 00:46:20,180 --> 00:46:23,420 atau singkatan khas bahawa mereka menyediakan untuk anda, 580 00:46:23,420 --> 00:46:29,020 maka anda boleh menggunakan n menggunakan seterusnya bukannya perlu menaip depan, semua cara. 581 00:46:29,020 --> 00:46:33,730 Dan sekarang bahawa saya telah melanda n sekali, saya hanya boleh memukul Enter untuk menyimpan berterusan seterusnya 582 00:46:33,730 --> 00:46:36,640 bukannya perlu untuk memukul n Enter, n Masukkan, n Masukkan. 583 00:46:36,640 --> 00:46:44,630 Ia kelihatan seperti saya dalam beberapa jenis untuk gelung itu menetapkan pelbagai [i] kepada 0. 584 00:46:44,630 --> 00:46:50,510 Ia kelihatan seperti saya pernah memecah keluar ini untuk gelung. 585 00:46:50,510 --> 00:46:54,780 Jika saya hendak mencetak i, jadi saya ialah 2, maka saya akan pergi seterusnya. 586 00:46:54,780 --> 00:46:59,250 Saya akan mencetak i, i 3, maka saya akan pergi seterusnya. 587 00:46:59,250 --> 00:47:05,360 Saya akan mencetak i dan i ialah 3. Seterusnya, mencetak i, i 4. 588 00:47:05,360 --> 00:47:14,520 Sebenarnya, cetak sizeof (pelbagai), jadi saiz array ialah 20. 589 00:47:16,310 --> 00:47:32,870 Tetapi ia kelihatan seperti terdapat beberapa arahan Pra-Pemasangan khas untuk pergi sehingga sesuatu berlaku. 590 00:47:32,870 --> 00:47:37,620 Ia seperti menetapkan keadaan pada nilai pembolehubah. Tetapi saya tidak ingat apa ia adalah. 591 00:47:37,620 --> 00:47:44,100 Jadi, jika kita terus pergi - 592 00:47:44,100 --> 00:47:47,120 Apa yang kau katakan? Apa yang kau membawa? 593 00:47:47,120 --> 00:47:50,500 [Pelajar] Adakah memaparkan i menambah - >> Yeah. Jadi memaparkan i boleh membantu. 594 00:47:50,500 --> 00:47:54,530 Jika kita hanya memaparkan i, ia akan meletakkan di sini apa nilai i adalah 595 00:47:54,530 --> 00:47:56,470 jadi saya tidak perlu untuk mencetak ia keluar setiap kali. 596 00:47:56,470 --> 00:48:02,930 Jika kita hanya menyimpan akan datang, kita lihat 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5. 597 00:48:02,930 --> 00:48:08,530 Sesuatu yang sedang berlaku betul-betul salah, dan saya sedang menetap semula kepada 0. 598 00:48:13,330 --> 00:48:22,220 Melihat di buggy4.c, kita lihat semua yang berlaku adalah pelbagai int [5]; 599 00:48:22,220 --> 00:48:26,200 (i = 0; i <= sizeof (pelbagai); i + +) 600 00:48:26,200 --> 00:48:28,550 pelbagai [i] = 0; 601 00:48:28,550 --> 00:48:31,390 Apa yang kita lihat bahawa salah di sini? 602 00:48:31,390 --> 00:48:39,480 Sebagai petunjuk, apabila saya telah melakukan Pra-Pemasangan buggy4 - mari kita memecahkan utama, run - 603 00:48:39,480 --> 00:48:45,980 Saya tidak cetak sizeof (susunan) hanya untuk melihat apa keadaan di mana akhirnya saya harus keluar. 604 00:48:47,690 --> 00:48:51,100 Di mana saya? Adakah saya menjalankan? 605 00:48:51,100 --> 00:48:54,280 Saya tidak mengisytiharkan lagi. 606 00:48:54,280 --> 00:48:58,680 Jadi mencetak sizeof (pelbagai) dan yang adalah 20, 607 00:48:58,680 --> 00:49:06,690 yang dijangka sejak pelbagai saya adalah saiz 5 dan ia sebanyak 5 integer, 608 00:49:06,690 --> 00:49:12,410 jadi keseluruhan perkara harus 5 * sizeof (int) bait, mana sizeof (int) cenderung untuk menjadi 4. 609 00:49:12,410 --> 00:49:14,780 Jadi sizeof (pelbagai) adalah 20. 610 00:49:14,780 --> 00:49:17,420 Apakah ini harus? 611 00:49:17,420 --> 00:49:21,720 [Pelajar] Terbahagi oleh sizeof (int). >> Yeah, / sizeof (int). 612 00:49:21,720 --> 00:49:30,630 Ia kelihatan seperti masih ada masalah di sini. Saya fikir ini hanya perlu menjadi < 613 00:49:30,630 --> 00:49:36,960 kerana ia adalah cukup banyak sentiasa 00:49:44,860 Sekarang mari kita berfikir tentang mengapa ini sebenarnya pecah. 615 00:49:44,860 --> 00:49:53,370 Adakah sesiapa yang telah tekaan mengapa i menetap semula kepada 0 melalui setiap lelaran gelung? 616 00:50:01,300 --> 00:50:09,350 Satu-satunya perkara di sini yang berlaku adalah bahawa pelbagai [i] sedang disetkan kepada 0. 617 00:50:09,350 --> 00:50:15,350 Jadi, entah bagaimana, baris kod ini menyebabkan int kami i akan disetkan kepada 0. 618 00:50:16,730 --> 00:50:23,130 [Pelajar] Bolehkah ia menjadi kerana ia mengatasi memori bahagian ini i 619 00:50:23,130 --> 00:50:27,970 apabila ia difikirkan ia adalah elemen yang seterusnya pelbagai? >> [Bowden] Ya. 620 00:50:27,970 --> 00:50:33,880 Apabila kita pergi luar akhir pelbagai kami, 621 00:50:33,880 --> 00:50:39,870 entah bagaimana bahawa ruang yang kita sedang mengatasi mengatasi nilai i. 622 00:50:39,870 --> 00:50:48,030 Dan sebagainya jika kita melihat ke buggy4, memecahkan utama, larian, 623 00:50:48,030 --> 00:50:53,120 mari kita mencetak alamat i. 624 00:50:53,120 --> 00:50:57,280 Ia kelihatan seperti ia bffff124. 625 00:50:57,280 --> 00:51:03,930 Sekarang mari kita mencetak alamat array [0]. 110. 626 00:51:03,930 --> 00:51:06,290 Apa kira-kira [1]? 114. 627 00:51:06,290 --> 00:51:07,920 [2], 118. 628 00:51:07,920 --> 00:51:14,530 11c, 120. pelbagai [5] bfff124. 629 00:51:14,530 --> 00:51:26,990 Jadi pelbagai [5] mempunyai alamat yang sama seperti i, yang bermaksud bahawa pelbagai [5] adalah i. 630 00:51:26,990 --> 00:51:30,720 Jika mereka mempunyai alamat yang sama, mereka adalah perkara yang sama. 631 00:51:30,720 --> 00:51:38,410 Jadi apabila kita menetapkan pelbagai [5] kepada 0, kita menetapkan i ke 0. 632 00:51:38,410 --> 00:51:46,070 Dan jika anda berfikir tentang ini dari segi susunan, 633 00:51:46,070 --> 00:51:55,590 int i diisytiharkan pertama, yang bermaksud i mendapat beberapa ruang pada timbunan. 634 00:51:55,590 --> 00:52:04,730 Kemudian pelbagai [5] diperuntukkan, jadi kemudian 20 bytes diperuntukkan pada timbunan. 635 00:52:04,730 --> 00:52:08,400 Jadi saya mendapat diperuntukkan terlebih dahulu, maka ini 20 bytes mendapat diperuntukkan. 636 00:52:08,400 --> 00:52:11,400 Jadi saya berlaku sejurus sebelum array, 637 00:52:11,400 --> 00:52:19,230 dan kerana cara, seperti saya berkata minggu lepas, di mana teknikal timbunan tumbuh ke bawah, 638 00:52:19,230 --> 00:52:28,520 apabila anda indeks ke array, kita dijamin bahawa kedudukan 0 dalam pelbagai 639 00:52:28,520 --> 00:52:31,970 sentiasa berlaku sebelum kedudukan pertama dalam array. 640 00:52:31,970 --> 00:52:35,900 Ini adalah jenis bagaimana saya melukisnya minggu lepas. 641 00:52:35,900 --> 00:52:42,210 Perhatikan bahawa di bawah kita mempunyai alamat 0 dan di atas kita mempunyai Max alamat. 642 00:52:42,210 --> 00:52:44,880 Tindanan sentiasa berkembang. 643 00:52:48,100 --> 00:52:53,500 Mari kita mengatakan bahawa kita memperuntukkan i. 644 00:52:53,500 --> 00:52:59,680 Kami memperuntukkan integer i, yang bermaksud mari kita hanya mengatakan di sini integer i mendapat diperuntukkan. 645 00:52:59,680 --> 00:53:06,420 Kemudian kita memperuntukkan pelbagai kami 5 integer, yang bermaksud bahawa di bawah itu, 646 00:53:06,420 --> 00:53:11,230 sejak timbunan berkembang ke bawah, mereka 5 integer mendapat diperuntukkan. 647 00:53:11,230 --> 00:53:15,900 Tetapi kerana bagaimana array bekerja, kita dijamin bahawa kedudukan pertama dalam pelbagai 648 00:53:15,900 --> 00:53:22,260 sentiasa mempunyai alamat yang kurang daripada perkara yang kedua dalam array. 649 00:53:22,260 --> 00:53:28,270 Jadi pelbagai kedudukan 0 sentiasa berlaku pertama dalam ingatan, 650 00:53:28,270 --> 00:53:30,700 sedangkan pelbagai kedudukan 1 telah berlaku selepas itu 651 00:53:30,700 --> 00:53:33,310 dan pelbagai kedudukan 2 mempunyai berlaku selepas itu, 652 00:53:33,310 --> 00:53:37,900 yang bermaksud bahawa 0 array kedudukan akan berlaku suatu hari nanti di sini, 653 00:53:37,900 --> 00:53:40,690 pelbagai kedudukan 1 akan berlaku atas bahawa 654 00:53:40,690 --> 00:53:45,530 kerana bergerak ke atas bermakna alamat yang lebih tinggi sejak alamat maksimum adalah sehingga di sini. 655 00:53:45,530 --> 00:53:50,490 Jadi [0] array turun sini, array [1] sehingga di sini, pelbagai [2] sehingga di sini, pelbagai [3] di sini. 656 00:53:50,490 --> 00:53:55,620 Notis bagaimana sebelum ini kita memperuntukkan integer i semua cara di sini, 657 00:53:55,620 --> 00:54:01,040 seperti yang kita bergerak lagi dan lagi ke dalam pelbagai kami, kami mendapat lebih dekat dan lebih dekat kepada integer i kami. 658 00:54:01,040 --> 00:54:07,640 Ia hanya kebetulan bahawa pelbagai [5], yang merupakan salah satu kedudukan luar array kami, 659 00:54:07,640 --> 00:54:13,010 sebenarnya mana integer i berlaku diperuntukkan. 660 00:54:13,010 --> 00:54:16,920 Jadi itulah titik di mana kita berada memukul ruang pada timbunan 661 00:54:16,920 --> 00:54:21,680 yang telah diperuntukkan untuk i integer, dan kami menetapkan bahawa kepada 0. 662 00:54:21,680 --> 00:54:26,160 >> Itulah bagaimana ia berfungsi. Soalan? Yeah. 663 00:54:26,160 --> 00:54:30,710 [Pelajar] Jangan sekali-kali fikiran. Okay. 664 00:54:30,710 --> 00:54:33,090 [Pelajar] Bagaimana anda mengelakkan ini jenis kesilapan? 665 00:54:33,090 --> 00:54:41,190 Ini jenis kesilapan? Jangan gunakan C sebagai bahasa pengaturcaraan anda. 666 00:54:41,190 --> 00:54:45,840 Gunakan bahasa yang mempunyai batas pelbagai memeriksa. 667 00:54:45,840 --> 00:54:55,900 Selagi anda berhati-hati, anda hanya perlu untuk mengelakkan pergi lalu batas array anda. 668 00:54:55,900 --> 00:54:58,300 [Pelajar] Jadi di sini apabila kita pergi lalu batas array anda - 669 00:54:58,300 --> 00:55:01,840 [Bowden] Itulah di mana perkara mula tersilap. >> [Pelajar] Oh, okay. 670 00:55:01,840 --> 00:55:05,730 Selagi anda tinggal dalam memori yang diperuntukkan untuk pelbagai anda, anda denda. 671 00:55:05,730 --> 00:55:12,400 Tetapi C tidak ada semakan ralat. Jika saya melakukan pelbagai [1000], ia akan dengan senang hati hanya mengubah apa yang berlaku - 672 00:55:12,400 --> 00:55:16,500 Ia pergi ke permulaan array, maka ia pergi 1000 jawatan selepas dan set kepada 0. 673 00:55:16,500 --> 00:55:20,000 Ia tidak melakukan apa-apa semakan bahawa oh, ini tidak benar-benar mempunyai 1000 perkara di dalamnya. 674 00:55:20,000 --> 00:55:22,750 1000 adalah jauh melebihi apa yang saya harus berubah, 675 00:55:22,750 --> 00:55:26,940 manakala Jawa atau sesuatu anda akan mendapat pelbagai indeks batas 676 00:55:26,940 --> 00:55:29,820 atau indeks daripada batas pengecualian. 677 00:55:29,820 --> 00:55:33,950 Itulah sebabnya banyak bahasa tahap yang lebih tinggi mempunyai perkara-perkara 678 00:55:33,950 --> 00:55:37,340 di mana jika anda melampaui batas array, anda gagal 679 00:55:37,340 --> 00:55:40,070 supaya anda tidak boleh mengubah perkara-perkara dari bawah anda 680 00:55:40,070 --> 00:55:42,590 dan kemudian perkara pergi lebih buruk daripada hanya mendapat pengecualian 681 00:55:42,590 --> 00:55:44,940 mengatakan bahawa anda pergi di luar akhir array. 682 00:55:44,940 --> 00:55:50,970 [Pelajar] Dan sebagainya harus kita telah hanya berubah <= hanya > [Bowden] Yeah. 683 00:55:50,970 --> 00:55:54,800 Ia harus 00:55:59,560 sejak sizeof (array) ialah 20, tetapi kita hanya mahu 5. >> [Pelajar] Hak. 685 00:55:59,560 --> 00:56:04,060 Lebih banyak soalan? Okay. 686 00:56:04,060 --> 00:56:07,380 >> [Pelajar] Saya mempunyai satu soalan. >> Yeah. 687 00:56:07,380 --> 00:56:16,440 [Pelajar] Apakah pembolehubah array sebenar? 688 00:56:16,440 --> 00:56:20,000 [Bowden] Seperti apa yang pelbagai? 689 00:56:20,000 --> 00:56:24,930 Array itu sendiri adalah simbol. 690 00:56:24,930 --> 00:56:31,490 Ia hanya alamat permulaan daripada 20 bait yang kita rujukan. 691 00:56:31,490 --> 00:56:38,070 Anda boleh berfikir ia sebagai penunjuk, tetapi ia adalah penunjuk berterusan. 692 00:56:38,070 --> 00:56:44,140 Secepat perkara mendapatkan disusun, pelbagai pembolehubah tidak lagi wujud. 693 00:56:44,140 --> 00:56:48,210 [Pelajar] Jadi bagaimana ia mencari saiz array? 694 00:56:48,210 --> 00:56:54,130 Saiz pelbagai merujuk kepada saiz blok itu bahawa simbol yang merujuk kepada. 695 00:56:54,130 --> 00:57:01,240 Apabila saya melakukan sesuatu seperti printf ("% p \ n", array); 696 00:57:01,240 --> 00:57:05,140 mari kita jalankan ia. 697 00:57:12,960 --> 00:57:15,530 Apa yang tidak saya hanya zalim? 698 00:57:15,530 --> 00:57:19,220 'Array' Array diisytiharkan di sini. 699 00:57:20,820 --> 00:57:23,200 Oh, di sini. 700 00:57:23,200 --> 00:57:31,250 Dilafaz pandai, dan ia berlaku kepada notis bahawa saya mengisytiharkan array sebagai 5 elemen 701 00:57:31,250 --> 00:57:34,540 tetapi saya mengindeks kepada 1000 kedudukan. 702 00:57:34,540 --> 00:57:38,450 Ia boleh berbuat demikian kerana ini adalah hanya pemalar. 703 00:57:38,450 --> 00:57:43,370 Ia hanya boleh pergi setakat perasan bahawa saya akan melampaui batas array. 704 00:57:43,370 --> 00:57:46,880 Tetapi notis sebelum ini apabila kita terpaksa i tidak betul, 705 00:57:46,880 --> 00:57:51,040 ia tidak mungkin boleh menentukan berapa banyak nilai i boleh mengambil, 706 00:57:51,040 --> 00:57:55,540 jadi ia tidak boleh menentukan bahawa saya telah melampaui akhir array. 707 00:57:55,540 --> 00:57:59,430 Itu hanya dilafaz pandai. 708 00:57:59,430 --> 00:58:03,340 >> Tetapi sekarang membuat buggy4. Jadi apa lagi yang saya lakukan salah? 709 00:58:03,340 --> 00:58:05,970 Tersirat mengisytiharkan fungsi perpustakaan 'printf'. 710 00:58:05,970 --> 00:58:14,960 Saya akan mahu # include . 711 00:58:14,960 --> 00:58:18,710 Okay. Kini berjalan buggy4. 712 00:58:18,710 --> 00:58:24,840 Percetakan nilai array seperti yang saya lakukan di sini, percetakan ia sebagai penunjuk 713 00:58:24,840 --> 00:58:30,060 sesuatu cetakan yang kelihatan seperti ini - bfb8805c - yang beberapa alamat 714 00:58:30,060 --> 00:58:33,450 itu di rantau timbunan-ish. 715 00:58:33,450 --> 00:58:41,820 Array itu sendiri adalah seperti penunjuk, tetapi ia tidak merupakan penunjuk sebenar, 716 00:58:41,820 --> 00:58:45,410 sejak penunjuk tetap kita boleh berubah. 717 00:58:45,410 --> 00:58:54,700 Tatasusunan adalah hanya beberapa berterusan. 20 blok memori bermula pada 0xbfb8805c alamat. 718 00:58:54,700 --> 00:59:09,020 Jadi bfb8805c melalui alamat ini +20--atau saya rasa -20 - 719 00:59:09,020 --> 00:59:17,400 semua memori yang diperuntukkan untuk pelbagai ini. 720 00:59:17,400 --> 00:59:20,350 Array, pembolehubah itu sendiri tidak disimpan di mana-mana. 721 00:59:20,350 --> 00:59:27,660 Apabila anda menyusun, pengkompil - gelombang tangan di dalamnya - 722 00:59:27,660 --> 00:59:33,060 tetapi pengkompil hanya akan menggunakan mana ia tahu pelbagai untuk menjadi. 723 00:59:33,060 --> 00:59:36,090 Ia tahu di mana pelbagai yang bermula, 724 00:59:36,090 --> 00:59:40,910 dan supaya ia boleh sentiasa hanya melakukan perkara-perkara dari segi ofset dari awal bahawa. 725 00:59:40,910 --> 00:59:43,960 Ia tidak memerlukan satu pemboleh ubah sendiri untuk mewakili pelbagai. 726 00:59:43,960 --> 00:59:53,730 Tetapi apabila saya melakukan sesuatu seperti int * p = array; kini p ialah penunjuk yang menunjukkan kepada pelbagai itu, 727 00:59:53,730 --> 00:59:57,830 dan kini p sebenarnya tidak wujud pada timbunan. 728 00:59:57,830 --> 01:00:01,950 Saya bebas untuk menukar p. Boleh saya lakukan p = malloc. 729 01:00:01,950 --> 01:00:06,500 Jadi ia asalnya menunjukkan pelbagai, kini ia menjurus kepada beberapa ruang pada timbunan. 730 01:00:06,500 --> 01:00:09,620 Saya tidak boleh melakukan pelbagai malloc =. 731 01:00:09,620 --> 01:00:13,710 Jika dilafaz pandai, ia akan menjerit pada saya kanan dari kelawar. 732 01:00:17,000 --> 01:00:21,430 Sebenarnya, saya agak pasti gcc akan melakukan ini terlalu. 733 01:00:21,430 --> 01:00:25,010 Jadi pelbagai jenis 'int [5]' tidak boleh diserahhakkan. 734 01:00:25,010 --> 01:00:28,040 Anda tidak boleh menetapkan sesuatu untuk jenis pelbagai 735 01:00:28,040 --> 01:00:30,500 kerana pelbagai hanya malar. 736 01:00:30,500 --> 01:00:34,760 Ia adalah simbol yang rujukan mereka 20 bytes. Saya tidak boleh menukar. 737 01:00:34,760 --> 01:00:37,690 >> [Pelajar] Dan di mana saiz array yang disimpan? 738 01:00:37,690 --> 01:00:40,670 [Bowden] Ia tidak disimpan di mana-mana. Ia adalah apabila ia menyusun. 739 01:00:40,670 --> 01:00:46,310 Jadi di mana saiz array yang disimpan? 740 01:00:46,310 --> 01:00:51,870 Anda hanya boleh menggunakan sizeof (pelbagai) di dalam fungsi array diisytiharkan sendiri. 741 01:00:51,870 --> 01:01:03,150 Jadi jika saya melakukan beberapa fungsi, foo, dan saya lakukan (int array []) 742 01:01:03,150 --> 01:01:10,450 printf ("% d \ n", sizeof (array)); 743 01:01:10,450 --> 01:01:21,330 dan kemudian turun di sini saya panggil foo (susunan); 744 01:01:21,330 --> 01:01:24,840 dalam fungsi ini - mari kita jalankan ia. 745 01:01:34,200 --> 01:01:36,840 Ini adalah dilafaz pandai lagi. 746 01:01:36,840 --> 01:01:43,890 Ia memberitahu saya bahawa sizeof pada pelbagai parameter fungsi 747 01:01:43,890 --> 01:01:46,690 akan kembali saiz '* int'. 748 01:01:46,690 --> 01:01:55,150 Ini akan menjadi satu kesilapan jika ia tidak apa yang saya mahu berlaku. 749 01:01:55,150 --> 01:01:58,960 Mari kita sebenarnya mematikan Werror. 750 01:02:14,950 --> 01:02:17,590 Amaran. Amaran yang halus. 751 01:02:17,590 --> 01:02:19,960 Ia masih akan menyusun selagi ia mempunyai amaran. 752 01:02:19,960 --> 01:02:22,910 / A.out akan mencetak 4. 753 01:02:22,910 --> 01:02:28,650 Amaran yang telah dijana adalah petunjuk jelas apa silapnya. 754 01:02:28,650 --> 01:02:34,120 Ini pelbagai int hanya akan mencetak sizeof (int *). 755 01:02:34,120 --> 01:02:39,790 Malah jika saya meletakkan pelbagai [5] di sini, ia masih hanya akan mencetak sizeof (int *). 756 01:02:39,790 --> 01:02:47,440 Demikian secepat anda lulus ia ke dalam fungsi, perbezaan antara tatasusunan dan penunjuk 757 01:02:47,440 --> 01:02:49,670 adalah tidak wujud. 758 01:02:49,670 --> 01:02:52,640 Ini berlaku untuk menjadi pelbagai yang telah diisytiharkan pada timbunan, 759 01:02:52,640 --> 01:02:58,300 tetapi sebaik sahaja kita lulus nilai itu, bahawa 0xbf blah, blah, blah ke dalam fungsi ini, 760 01:02:58,300 --> 01:03:03,350 maka penunjuk ini menunjukkan kepada pelbagai itu pada timbunan. 761 01:03:03,350 --> 01:03:08,310 Supaya bermakna bahawa sizeof hanya terpakai dalam fungsi yang pelbagai telah diisytiharkan, 762 01:03:08,310 --> 01:03:11,230 yang bermaksud bahawa apabila anda menyusun fungsi ini, 763 01:03:11,230 --> 01:03:17,330 apabila dilafaz pergi melalui fungsi ini, ia melihat pelbagai adalah pelbagai int bersaiz 5. 764 01:03:17,330 --> 01:03:20,640 Jadi maka ia melihat sizeof (array). Nah, itu 20. 765 01:03:20,640 --> 01:03:26,440 Itulah sebenarnya bagaimana sizeof pada dasarnya bekerja untuk hampir semua kes. 766 01:03:26,440 --> 01:03:31,150 Sizeof bukan fungsi, ia adalah pengendali. 767 01:03:31,150 --> 01:03:33,570 Anda tidak memanggil fungsi sizeof. 768 01:03:33,570 --> 01:03:38,280 Sizeof (int), pengkompil hanya akan menterjemahkan bahawa ke 4. 769 01:03:41,480 --> 01:03:43,700 Faham? Okay. 770 01:03:43,700 --> 01:03:47,520 >> [Pelajar] Jadi apakah perbezaan antara sizeof (susunan) utama dan dalam foo? 771 01:03:47,520 --> 01:03:52,840 Ini adalah kerana kita mengatakan sizeof (pelbagai), yang merupakan * int jenis, 772 01:03:52,840 --> 01:03:57,120 sedangkan array turun di sini tidak * int jenis, ia adalah pelbagai int. 773 01:03:57,120 --> 01:04:04,540 >> [Pelajar] Jadi jika anda mempunyai parameter dalam pelbagai [] bukannya * array int, 774 01:04:04,540 --> 01:04:09,230 yang akan bermakna bahawa anda masih boleh menukar pelbagai kerana sekarang ia adalah penunjuk? 775 01:04:09,230 --> 01:04:14,250 [Bowden] Seperti ini? >> [Pelajar] Yeah. Anda boleh menukar pelbagai dalam fungsi sekarang? 776 01:04:14,250 --> 01:04:18,420 [Bowden] Anda boleh menukar pelbagai dalam kedua-dua kes. 777 01:04:18,420 --> 01:04:23,130 Dalam kedua-dua kes ini, anda bebas untuk mengatakan pelbagai [4] = 0. 778 01:04:23,130 --> 01:04:26,590 [Pelajar] Tetapi anda boleh membuat pelbagai titik kepada sesuatu yang lain? 779 01:04:26,590 --> 01:04:30,230 [Bowden] Oh. Yeah. Dalam mana-mana kes - >> [pelajar] Yeah. 780 01:04:30,230 --> 01:04:38,410 [Bowden] perbezaan antara pelbagai [] dan * pelbagai int, maka tiada sesiapapun. 781 01:04:38,410 --> 01:04:42,570 Anda juga boleh mendapatkan beberapa pelbagai multidimensi di sini 782 01:04:42,570 --> 01:04:47,050 untuk beberapa sintaks mudah, tetapi ia masih hanya penunjuk. 783 01:04:47,050 --> 01:04:56,400 Ini bermakna bahawa saya bebas untuk melakukan pelbagai = malloc (sizeof (int)); dan kini menunjukkan tempat lain. 784 01:04:56,400 --> 01:04:59,610 Tetapi seperti bagaimana ini berfungsi selama-lamanya dan sentiasa, 785 01:04:59,610 --> 01:05:03,210 perubahan pelbagai ini dengan membuat ia menunjukkan kepada sesuatu yang lain 786 01:05:03,210 --> 01:05:07,570 tidak menukar pelbagai ini ke sini kerana ia adalah satu salinan hujah, 787 01:05:07,570 --> 01:05:10,780 ia bukan penunjuk kepada hujah itu. 788 01:05:10,780 --> 01:05:16,070 Dan sebenarnya, hanya sebagai petunjuk lebih bahawa ia adalah betul-betul sama - 789 01:05:16,070 --> 01:05:21,100 kita sudah melihat apa yang mencetak pelbagai percetakan - 790 01:05:21,100 --> 01:05:31,410 bagaimana jika kita mencetak alamat array atau alamat alamat array 791 01:05:31,410 --> 01:05:36,290 sama ada orang-orang? 792 01:05:41,770 --> 01:05:45,220 Mari kita mengabaikan yang satu ini. 793 01:05:48,140 --> 01:05:51,660 Okay. Ini adalah baik. Ia kini berjalan / a.out. 794 01:05:51,660 --> 01:06:00,220 Pelbagai percetakan, kemudian mencetak alamat array, adalah perkara yang sama. 795 01:06:00,220 --> 01:06:02,870 Array hanya tidak wujud. 796 01:06:02,870 --> 01:06:08,190 Ia tahu apabila anda mencetak pelbagai, anda mencetak simbol yang merujuk kepada orang-orang 20 bytes. 797 01:06:08,190 --> 01:06:11,940 Percetakan alamat array, baik, array tidak wujud. 798 01:06:11,940 --> 01:06:17,200 Ia tidak mempunyai alamat, jadi ia hanya mencetak alamat mereka 20 bytes. 799 01:06:20,820 --> 01:06:28,150 Secepat anda menyusun, seperti dalam buggy4 disusun anda. / A.out, 800 01:06:28,150 --> 01:06:30,340 pelbagai adalah tidak wujud. 801 01:06:30,340 --> 01:06:33,640 Penunjuk wujud. Tatasusunan tidak lakukan. 802 01:06:34,300 --> 01:06:38,060 Blok memori mewakili array masih wujud, 803 01:06:38,060 --> 01:06:43,270 tetapi array berubah-ubah dan pembolehubah jenis itu tidak wujud. 804 01:06:46,260 --> 01:06:50,270 Mereka adalah seperti perbezaan utama di antara barisan dan tunjuk ajar 805 01:06:50,270 --> 01:06:55,590 sebaik sahaja anda membuat panggilan fungsi, terdapat perbezaan tidak. 806 01:06:55,590 --> 01:07:00,460 Tetapi di dalam fungsi yang array sendiri diisytiharkan, sizeof kerja-kerja yang berbeza 807 01:07:00,460 --> 01:07:05,190 kerana anda mencetak saiz blok dan bukannya saiz jenis, 808 01:07:05,190 --> 01:07:08,950 dan anda tidak boleh menukar kerana ia adalah simbol. 809 01:07:08,950 --> 01:07:14,370 Percetakan perkara dan alamat benda yang mencetak perkara yang sama. 810 01:07:14,370 --> 01:07:18,480 Dan itulah yang cukup banyak. 811 01:07:18,480 --> 01:07:20,820 [Pelajar] Bolehkah anda mengatakan bahawa salah satu lebih banyak masa? 812 01:07:21,170 --> 01:07:24,170 Saya mungkin telah terlepas sesuatu. 813 01:07:24,170 --> 01:07:29,260 Pelbagai percetakan dan alamat pelbagai mencetak perkara yang sama, 814 01:07:29,260 --> 01:07:33,180 sedangkan jika anda mencetak penunjuk berbanding alamat penunjuk, 815 01:07:33,180 --> 01:07:36,010 satu perkara mencetak alamat apa yang anda menunjuk ke, 816 01:07:36,010 --> 01:07:40,360 yang lain mencetak alamat penunjuk pada timbunan. 817 01:07:40,360 --> 01:07:47,040 Anda boleh menukar penunjuk; anda tidak boleh menukar simbol pelbagai. 818 01:07:47,740 --> 01:07:53,270 Dan penunjuk sizeof akan untuk mencetak saiz jenis penunjuk bahawa. 819 01:07:53,270 --> 01:07:57,470 Jadi int * p sizeof (p) akan mencetak 4, 820 01:07:57,470 --> 01:08:04,110 tetapi int array [5] cetak sizeof (pelbagai) akan mencetak 20. 821 01:08:04,110 --> 01:08:07,480 [Pelajar] Maka int array [5] akan mencetak 20? >> Ya. 822 01:08:07,480 --> 01:08:13,300 Itulah sebabnya di dalam buggy4 apabila ia digunakan untuk menjadi sizeof (susunan) 823 01:08:13,300 --> 01:08:16,660 ini sedang melakukan i <20, yang tidak apa yang kita mahu. 824 01:08:16,660 --> 01:08:20,880 Kami mahu i <5. >> [Pelajar] Okay. 825 01:08:20,880 --> 01:08:25,569 [Bowden] Dan kemudian sebaik sahaja anda mula lulus dalam fungsi, 826 01:08:25,569 --> 01:08:34,340 jika kita lakukan int * p = array; 827 01:08:34,340 --> 01:08:39,779 dalam fungsi ini, kita pada dasarnya boleh menggunakan p dan pelbagai dalam cara yang tepat sama, 828 01:08:39,779 --> 01:08:43,710 kecuali untuk masalah sizeof dan masalah yang berubah-ubah. 829 01:08:43,710 --> 01:08:49,810 Tetapi p [0] = 1; adalah sama seperti mengatakan array [0] = 1; 830 01:08:49,810 --> 01:08:55,600 Dan dengan seberapa segera seperti yang kita katakan foo (pelbagai); atau foo (p); 831 01:08:55,600 --> 01:08:59,760 di dalam fungsi foo, ini adalah panggilan yang sama dua kali. 832 01:08:59,760 --> 01:09:03,350 Tidak terdapat perbezaan antara kedua-dua panggilan. 833 01:09:07,029 --> 01:09:11,080 >> Semua orang yang baik pada itu? Okay. 834 01:09:14,620 --> 01:09:17,950 Kami mempunyai 10 minit. 835 01:09:17,950 --> 01:09:28,319 >> Kami akan cuba untuk mendapatkan melalui program ini Typer Hacker, 836 01:09:28,319 --> 01:09:32,350 laman web ini, yang keluar tahun lepas atau sesuatu. 837 01:09:34,149 --> 01:09:41,100 Ia hanya sepatutnya menjadi seperti anda menaip secara rawak dan ia mencetak keluar - 838 01:09:41,100 --> 01:09:46,729 Apa sahaja fail ia berlaku telah dimuatkan adalah apa ia kelihatan seperti anda sedang menaip. 839 01:09:46,729 --> 01:09:52,069 Ia kelihatan seperti beberapa jenis kod sistem operasi. 840 01:09:53,760 --> 01:09:56,890 Itulah apa yang kita mahu untuk melaksanakan. 841 01:10:08,560 --> 01:10:11,690 Anda harus mempunyai laku binari bernama hacker_typer 842 01:10:11,690 --> 01:10:14,350 yang mengambil dalam hujah tunggal, fail untuk "jenis penggodam." 843 01:10:14,350 --> 01:10:16,480 Running executable perlu mengosongkan skrin 844 01:10:16,480 --> 01:10:20,850 dan kemudian mencetak satu aksara dari fail yang diluluskan dalam setiap kali pengguna menekan kekunci. 845 01:10:20,850 --> 01:10:24,990 Jadi apa jua kekunci yang anda tekan, ia harus buang dan bukannya mencetak watak dari fail 846 01:10:24,990 --> 01:10:27,810 yang hujah. 847 01:10:29,880 --> 01:10:34,350 Saya cukup banyak akan memberitahu anda apa perkara yang kita hendak perlu tahu. 848 01:10:34,350 --> 01:10:36,440 Tetapi kita mahu untuk menyemak perpustakaan termios. 849 01:10:36,440 --> 01:10:44,840 Saya tidak pernah menggunakan perpustakaan ini dalam seluruh hidup saya, jadi ia mempunyai tujuan yang sangat minimum. 850 01:10:44,840 --> 01:10:48,610 Tetapi ini akan menjadi perpustakaan yang boleh kita gunakan untuk buang watak anda memukul 851 01:10:48,610 --> 01:10:52,390 apabila anda menaip menjadi standard. 852 01:10:56,970 --> 01:11:05,840 Jadi hacker_typer.c, dan kita akan mahu # include . 853 01:11:05,840 --> 01:11:12,870 Melihat halaman lelaki untuk termios -: saya meneka terminal ia OS atau sesuatu - 854 01:11:12,870 --> 01:11:16,240 Saya tidak tahu bagaimana untuk membaca. 855 01:11:16,240 --> 01:11:21,040 Melihat ini, ia mengatakan termasuk 2 fail ini, jadi kami akan berbuat demikian. 856 01:11:37,620 --> 01:11:46,820 >> Perkara pertama yang pertama, kami mahu mengambil dalam hujah tunggal, yang kita harus membuka fail. 857 01:11:46,820 --> 01:11:52,420 Jadi, apa yang saya mahu lakukan? Bagaimanakah saya menyemak untuk melihat saya mempunyai hujah tunggal? 858 01:11:52,420 --> 01:11:56,480 [Pelajar] Jika argc sama ia. >> [Bowden] Yeah. 859 01:11:56,480 --> 01:12:21,250 Jadi, jika (argc = 2!) Printf ("Penggunaan:% s [fail untuk membuka]"). 860 01:12:21,250 --> 01:12:32,750 Jadi sekarang jika saya menjalankan ini tanpa memberikan hujah kedua - oh, saya memerlukan barisan baru - 861 01:12:32,750 --> 01:12:36,240 anda akan melihat ia mengatakan penggunaan: / hacker_typer, 862 01:12:36,240 --> 01:12:39,770 dan kemudian hujah kedua harus menjadi fail yang saya mahu untuk membuka. 863 01:12:58,430 --> 01:13:01,260 Sekarang apa yang perlu saya lakukan? 864 01:13:01,260 --> 01:13:08,490 Saya mahu membaca dari fail ini. Bagaimanakah saya membaca dari fail? 865 01:13:08,490 --> 01:13:11,920 [Pelajar] Anda membukanya pertama. >> Yeah. 866 01:13:11,920 --> 01:13:15,010 Jadi fopen Apakah fopen kelihatan seperti? 867 01:13:15,010 --> 01:13:22,980 [Pelajar] Filename. >> [Bowden] Filename akan menjadi argv [1]. 868 01:13:22,980 --> 01:13:26,110 [Pelajar] Dan kemudian apa yang anda mahu lakukan dengan ia, jadi - >> [Bowden] Yeah. 869 01:13:26,110 --> 01:13:28,740 Jadi jika anda tidak ingat, anda hanya boleh melakukan fopen lelaki, 870 01:13:28,740 --> 01:13:32,960 di mana ia akan menjadi laluan const char * di mana jalan adalah nama fail, 871 01:13:32,960 --> 01:13:34,970 const char * mod. 872 01:13:34,970 --> 01:13:38,660 Jika anda berlaku untuk tidak ingat apa yang mod, maka anda boleh melihat untuk mod. 873 01:13:38,660 --> 01:13:44,660 Dalam muka surat manusia, watak slash adalah apa yang anda boleh gunakan untuk mencari sesuatu. 874 01:13:44,660 --> 01:13:49,790 Jadi saya menaip / mod untuk mencari mod. 875 01:13:49,790 --> 01:13:57,130 n dan N adalah apa yang anda boleh gunakan untuk kitaran melalui perlawanan carian. 876 01:13:57,130 --> 01:13:59,800 Di sini ia berkata mata mod hujah kepada rentetan 877 01:13:59,800 --> 01:14:01,930 bermula dengan salah satu urutan berikut. 878 01:14:01,930 --> 01:14:06,480 Jadi r, fail teks Terbuka untuk membaca. Itulah apa yang kita mahu lakukan. 879 01:14:08,930 --> 01:14:13,210 Untuk membaca, dan saya mahu menyimpan. 880 01:14:13,210 --> 01:14:18,720 Perkara yang akan untuk menjadi * FILE. Sekarang apa yang saya mahu lakukan? 881 01:14:18,720 --> 01:14:21,200 Beri aku satu saat. 882 01:14:28,140 --> 01:14:30,430 Okay. Sekarang apa yang saya mahu lakukan? 883 01:14:30,430 --> 01:14:32,940 [Pelajar] Periksa jika ia NULL. >> [Bowden] Yeah. 884 01:14:32,940 --> 01:14:38,690 Bila-bila masa anda membuka fail, pastikan bahawa anda berjaya dapat untuk membuka. 885 01:14:58,930 --> 01:15:10,460 >> Sekarang saya mahu lakukan bahawa barangan termios di mana saya mahu untuk pertama membaca tetapan semasa saya 886 01:15:10,460 --> 01:15:14,050 dan menyelamatkan mereka ke dalam sesuatu, maka saya ingin untuk mengubah tetapan saya 887 01:15:14,050 --> 01:15:19,420 untuk buang mana-mana watak yang saya menaip, 888 01:15:19,420 --> 01:15:22,520 dan kemudian saya mahu untuk mengemas kini tetapan. 889 01:15:22,520 --> 01:15:27,250 Dan kemudian pada akhir program ini, saya ingin menukar kembali kepada tetapan asal saya. 890 01:15:27,250 --> 01:15:32,080 Jadi struct akan menjadi termios jenis, dan saya akan mahu dua daripada mereka. 891 01:15:32,080 --> 01:15:35,600 Yang pertama akan menjadi current_settings saya, 892 01:15:35,600 --> 01:15:42,010 dan kemudian mereka pergi untuk menjadi hacker_settings saya. 893 01:15:42,010 --> 01:15:48,070 Pertama, saya akan mahu menyimpan tetapan semasa saya, 894 01:15:48,070 --> 01:15:53,790 maka saya akan untuk mahu mengemaskini hacker_settings, 895 01:15:53,790 --> 01:16:01,570 dan kemudian cara pada akhir program saya, saya mahu kembali kepada tetapan semasa. 896 01:16:01,570 --> 01:16:08,660 Jadi menyimpan tetapan semasa, cara yang berfungsi, kita termios lelaki. 897 01:16:08,660 --> 01:16:15,810 Kita melihat bahawa kita mempunyai ini tcsetattr int, int tcgetattr. 898 01:16:15,810 --> 01:16:22,960 Saya lulus dalam struct termios oleh penunjuk. 899 01:16:22,960 --> 01:16:30,640 Cara ini akan kelihatan - I've sudah lupa apa fungsi dipanggil. 900 01:16:30,640 --> 01:16:34,930 Salin dan tampal. 901 01:16:39,150 --> 01:16:45,500 Jadi tcgetattr, maka saya mahu lulus dalam struct itu bahawa saya menyimpan maklumat dalam, 902 01:16:45,500 --> 01:16:49,650 yang akan menjadi current_settings, 903 01:16:49,650 --> 01:16:59,120 dan hujah pertama adalah pemerihal fail untuk perkara yang saya mahu menyimpan sifat-sifat. 904 01:16:59,120 --> 01:17:04,360 Apa pemerihal fail adalah seperti bila-bila masa anda membuka fail, ia mendapat penghurai fail. 905 01:17:04,360 --> 01:17:14,560 Apabila saya fopen argv [1], ia mendapat penghurai fail yang anda rujukan 906 01:17:14,560 --> 01:17:16,730 apabila anda mahu untuk membaca atau menulis kepadanya. 907 01:17:16,730 --> 01:17:19,220 Itu bukan pemerihal fail yang saya mahu menggunakan di sini. 908 01:17:19,220 --> 01:17:21,940 Terdapat tiga perihalan fail anda secara lalai, 909 01:17:21,940 --> 01:17:24,310 yang standard dalam, keluar standard, dan ralat piawai. 910 01:17:24,310 --> 01:17:29,960 Secara lalai, saya fikir ia adalah standard dalam ialah 0, keluar standard 1, dan ralat piawai ialah 2. 911 01:17:29,960 --> 01:17:33,980 Jadi, apa yang saya mahu untuk mengubah tetapan? 912 01:17:33,980 --> 01:17:37,370 Saya ingin menukar tetapan apabila saya mencecah watak, 913 01:17:37,370 --> 01:17:41,590 Saya mahu ia untuk membuang watak yang jauh bukannya mencetak skrin. 914 01:17:41,590 --> 01:17:45,960 Apa aliran - standard dalam, keluar standard, atau ralat piawai - 915 01:17:45,960 --> 01:17:52,050 respons kepada perkara yang apabila saya menaip di keyboard? >> [Pelajar] Standard masuk >> Yeah. 916 01:17:52,050 --> 01:17:56,450 Jadi saya boleh lakukan 0 atau boleh saya lakukan stdin. 917 01:17:56,450 --> 01:17:59,380 Saya mendapat current_settings standard masuk 918 01:17:59,380 --> 01:18:01,720 >> Sekarang saya mahu mengemas kini tetapan, 919 01:18:01,720 --> 01:18:07,200 jadi pertama saya akan menyalin ke hacker_settings apa current_settings saya. 920 01:18:07,200 --> 01:18:10,430 Dan bagaimana kerja structs ia hanya akan menyalin. 921 01:18:10,430 --> 01:18:14,510 Ini salinan semua bidang, seperti yang anda inginkan. 922 01:18:14,510 --> 01:18:17,410 >> Sekarang saya mahu untuk mengemaskini beberapa bidang. 923 01:18:17,410 --> 01:18:21,670 Melihat di termios, anda perlu membaca melalui banyak ini 924 01:18:21,670 --> 01:18:24,110 hanya untuk melihat apa yang anda mahu untuk mencari, 925 01:18:24,110 --> 01:18:28,210 tetapi bendera yang anda akan mahu untuk mencari adalah gema, 926 01:18:28,210 --> 01:18:33,110 jadi ECHO aksara input Gema. 927 01:18:33,110 --> 01:18:37,710 Pertama saya ingin menetapkan - I've sudah lupa apa bidang. 928 01:18:45,040 --> 01:18:47,900 Ini adalah apa struct kelihatan seperti. 929 01:18:47,900 --> 01:18:51,060 Jadi mod input saya fikir kita mahu kepada perubahan. 930 01:18:51,060 --> 01:18:54,210 Kami akan melihat penyelesaian untuk memastikan bahawa apa yang kita ingin menukar. 931 01:19:04,060 --> 01:19:12,610 Kami mahu menukar lflag untuk mengelakkan perlu untuk melihat melalui semua ini. 932 01:19:12,610 --> 01:19:14,670 Kita mahu untuk menukar mod tempatan. 933 01:19:14,670 --> 01:19:17,710 Anda perlu membaca melalui perkara ini keseluruhan untuk memahami di mana segala-galanya milik 934 01:19:17,710 --> 01:19:19,320 bahawa kita mahu berubah. 935 01:19:19,320 --> 01:19:24,120 Tetapi ia adalah dalam mod tempatan di mana kita akan mahu menukar bahawa. 936 01:19:27,080 --> 01:19:33,110 Jadi hacker_settings.cc_lmode adalah apa ia dipanggil. 937 01:19:39,630 --> 01:19:43,020 c_lflag. 938 01:19:49,060 --> 01:19:52,280 Ini adalah di mana kita masuk ke dalam pengendali bitwise. 939 01:19:52,280 --> 01:19:54,860 Kami jenis keluar masa, tetapi kita akan pergi melalui cepat sebenar. 940 01:19:54,860 --> 01:19:56,600 Ini adalah di mana kita masuk ke dalam pengendali bitwise, 941 01:19:56,600 --> 01:19:59,950 di mana saya fikir saya berkata satu masa dahulu bahawa apabila anda mula berurusan dengan bendera, 942 01:19:59,950 --> 01:20:03,370 anda akan menggunakan bitwise pengendali banyak. 943 01:20:03,370 --> 01:20:08,240 Setiap bit dalam bendera sepadan dengan sejenis tingkah laku. 944 01:20:08,240 --> 01:20:14,090 Jadi di sini, bendera ini mempunyai sekumpulan perkara yang berbeza, di mana mereka semua bermakna sesuatu yang berbeza. 945 01:20:14,090 --> 01:20:18,690 Tetapi apa yang saya mahu lakukan ialah hanya mematikan bit yang sepadan dengan ECHO. 946 01:20:18,690 --> 01:20:25,440 Jadi untuk menjadikan bahawa off I lakukan & = ¬ ECHO. 947 01:20:25,440 --> 01:20:30,110 Sebenarnya, saya fikir ia adalah seperti tECHO atau sesuatu. Saya hanya akan menyemak lagi. 948 01:20:30,110 --> 01:20:34,050 Saya boleh termios. Ia hanya ECHO. 949 01:20:34,050 --> 01:20:38,440 ECHO akan menjadi sedikit tunggal. 950 01:20:38,440 --> 01:20:44,230 ¬ ECHO akan bermakna semua bit ditetapkan kepada 1, yang bermakna semua bendera disetkan kepada true 951 01:20:44,230 --> 01:20:47,140 kecuali sedikit ECHO. 952 01:20:47,140 --> 01:20:53,830 Dengan berakhir bendera tempatan saya dengan ini, ia bermakna semua bendera yang sedang disetkan kepada true 953 01:20:53,830 --> 01:20:56,520 masih akan disetkan kepada true. 954 01:20:56,520 --> 01:21:03,240 Jika bendera ECHO saya disetkan kepada true, maka ini semestinya bersedia untuk palsu pada bendera ECHO. 955 01:21:03,240 --> 01:21:07,170 Jadi ini baris kod hanya dimatikan bendera ECHO. 956 01:21:07,170 --> 01:21:16,270 Baris kod lain, saya hanya akan menyalin mereka dalam kepentingan masa dan kemudian menjelaskan mereka. 957 01:21:27,810 --> 01:21:30,180 Dalam penyelesaian, katanya 0. 958 01:21:30,180 --> 01:21:33,880 Ia mungkin lebih baik tegas mengatakan stdin. 959 01:21:33,880 --> 01:21:42,100 >> Notis bahawa saya juga melakukan ECHO | ICANON sini. 960 01:21:42,100 --> 01:21:46,650 ICANON merujuk kepada sesuatu yang berasingan, yang bermaksud mod kanun. 961 01:21:46,650 --> 01:21:50,280 Apa cara mod kanun biasanya apabila anda menaip baris arahan, 962 01:21:50,280 --> 01:21:54,670 standard dalam tidak memproses apa-apa sehingga anda memukul newline. 963 01:21:54,670 --> 01:21:58,230 Jadi apabila anda GetString, anda menaip sekumpulan perkara, maka anda memukul newline. 964 01:21:58,230 --> 01:22:00,590 Itulah apabila ia dihantar kepada standard masuk 965 01:22:00,590 --> 01:22:02,680 Itulah lalai. 966 01:22:02,680 --> 01:22:05,830 Apabila saya mematikan mod kanun, kini setiap watak tunggal anda menekan 967 01:22:05,830 --> 01:22:10,910 adalah apa yang mendapat diproses, yang biasanya jenis buruk kerana ia lambat untuk memproses perkara-perkara ini, 968 01:22:10,910 --> 01:22:14,330 itulah sebabnya ia adalah baik untuk penampan ke dalam barisan keseluruhan. 969 01:22:14,330 --> 01:22:16,810 Tetapi saya mahu setiap aksara akan diproses 970 01:22:16,810 --> 01:22:18,810 kerana saya tidak mahu ia menunggu untuk saya memukul newline 971 01:22:18,810 --> 01:22:21,280 sebelum ia memproses semua watak-watak yang saya telah menaip. 972 01:22:21,280 --> 01:22:24,760 Ini mematikan mod kanun. 973 01:22:24,760 --> 01:22:31,320 Barangan ini hanya bermakna apabila ia sebenarnya proses watak-watak. 974 01:22:31,320 --> 01:22:35,830 Ini bermakna memprosesnya segera; secepat saya menaip mereka, memproses mereka. 975 01:22:35,830 --> 01:22:42,510 Dan ini adalah fungsi yang mengemaskini tetapan saya untuk standard dalam, 976 01:22:42,510 --> 01:22:45,480 dan cara TCSA melakukannya sekarang. 977 01:22:45,480 --> 01:22:50,310 Pilihan lain menunggu sehingga segala-galanya yang kini di sungai diproses. 978 01:22:50,310 --> 01:22:52,030 Itu tidak benar-benar perkara. 979 01:22:52,030 --> 01:22:56,920 Hanya sekarang mengubah tetapan saya untuk menjadi apa yang kini dalam hacker_typer_settings. 980 01:22:56,920 --> 01:23:02,210 Saya rasa saya dipanggil ia hacker_settings, jadi mari kita mengubah itu. 981 01:23:09,610 --> 01:23:13,500 Tukar segalanya untuk hacker_settings. 982 01:23:13,500 --> 01:23:16,870 >> Kini pada akhir program kami kita akan mahu kembali 983 01:23:16,870 --> 01:23:20,210 apa yang kini di dalam normal_settings, 984 01:23:20,210 --> 01:23:26,560 yang akan hanya kelihatan seperti & normal_settings. 985 01:23:26,560 --> 01:23:30,650 Notis saya tidak mengubah mana-mana normal_settings saya sejak asalnya mendapat ia. 986 01:23:30,650 --> 01:23:34,520 Kemudian hanya menukar mereka kembali, saya lulus mereka kembali pada akhir. 987 01:23:34,520 --> 01:23:38,390 Ini adalah kemas kini. Okay. 988 01:23:38,390 --> 01:23:43,900 >> Sekarang di dalam sini saya hanya akan menjelaskan kod dalam kepentingan masa. 989 01:23:43,900 --> 01:23:46,350 Ia tidak bahawa kod yang banyak. 990 01:23:50,770 --> 01:24:03,750 Kita melihat kita membaca watak dari fail. Kami dipanggil ia f. 991 01:24:03,750 --> 01:24:07,850 Sekarang anda boleh lelaki fgetc, tetapi bagaimana fgetc akan bekerja 992 01:24:07,850 --> 01:24:11,910 hanya ia akan kembali watak yang anda hanya membaca atau EOF, 993 01:24:11,910 --> 01:24:15,680 yang sepadan dengan akhir fail atau beberapa kesilapan berlaku. 994 01:24:15,680 --> 01:24:19,900 Kami menggelung, terus membaca watak tunggal dari fail, 995 01:24:19,900 --> 01:24:22,420 sehingga kita telah kehabisan aksara untuk membaca. 996 01:24:22,420 --> 01:24:26,650 Dan sementara kita berbuat demikian, kita tunggu pada watak tunggal dari standard. 997 01:24:26,650 --> 01:24:29,090 Setiap kali tunggal anda menaip sesuatu pada baris arahan, 998 01:24:29,090 --> 01:24:32,820 yang membaca dalam watak dari standard. 999 01:24:32,820 --> 01:24:38,330 Kemudian putchar hanya akan meletakkan char kita membaca di sini dari fail keluar standard. 1000 01:24:38,330 --> 01:24:42,890 Anda boleh lelaki putchar, tetapi ia hanya meletakkan standard keluar, ia mencetak watak itu. 1001 01:24:42,890 --> 01:24:51,600 Anda juga boleh hanya melakukan printf ("% c", c), idea Sama. 1002 01:24:53,330 --> 01:24:56,670 Itu akan melakukan sebahagian besar kerja kami. 1003 01:24:56,670 --> 01:25:00,300 >> Perkara terakhir yang kita akan mahu lakukan adalah hanya fclose fail kami. 1004 01:25:00,300 --> 01:25:03,310 Jika anda tidak fclose, itulah kebocoran memori. 1005 01:25:03,310 --> 01:25:06,680 Kami mahu fclose fail kita asalnya dibuka, dan saya fikir itulah ia. 1006 01:25:06,680 --> 01:25:13,810 Jika kita membuat demikian, saya pun mendapat masalah. 1007 01:25:13,810 --> 01:25:17,260 Mari kita lihat. 1008 01:25:17,260 --> 01:25:19,960 Apa yang ia mengadu tentang? 1009 01:25:19,960 --> 01:25:30,220 Dijangka 'int' tetapi hujah adalah jenis 'struct _IO_FILE *'. 1010 01:25:36,850 --> 01:25:39,370 Kita akan melihat jika yang berfungsi. 1011 01:25:45,210 --> 01:25:53,540 Hanya dibenarkan di C99. Augh. Okay, membuat hacker_typer. 1012 01:25:53,540 --> 01:25:57,760 Sekarang kita mendapat penerangan yang lebih berguna. 1013 01:25:57,760 --> 01:25:59,900 Jadi menggunakan pengecam tidak diisytiharkan 'normal_settings'. 1014 01:25:59,900 --> 01:26:04,170 Saya tidak memanggil ia normal_settings. Saya dipanggil ia current_settings. 1015 01:26:04,170 --> 01:26:12,090 Jadi mari kita mengubah semua itu. 1016 01:26:17,920 --> 01:26:21,710 Sekarang lulus hujah. 1017 01:26:26,290 --> 01:26:29,500 Saya akan membuat 0 ini untuk sekarang. 1018 01:26:29,500 --> 01:26:36,720 Okay. . / Hacker_typer cp.c. 1019 01:26:36,720 --> 01:26:39,590 Saya juga tidak mengosongkan skrin pada permulaan. 1020 01:26:39,590 --> 01:26:42,960 Tetapi anda boleh melihat kembali kepada set masalah terakhir untuk melihat bagaimana anda mengosongkan skrin. 1021 01:26:42,960 --> 01:26:45,160 Ia hanya mencetak beberapa watak 1022 01:26:45,160 --> 01:26:47,210 manakala ini melakukan apa yang saya mahu lakukan. 1023 01:26:47,210 --> 01:26:48,900 Okay. 1024 01:26:48,900 --> 01:26:55,280 Dan berfikir tentang mengapa ini diperlukan untuk menjadi 0 bukannya stdin, 1025 01:26:55,280 --> 01:27:00,560 yang perlu # define 0, 1026 01:27:00,560 --> 01:27:03,890 ini mengadu bahawa - 1027 01:27:13,150 --> 01:27:19,360 Sebelum apabila saya berkata bahawa terdapat perihalan fail tetapi kemudian anda juga mempunyai * FILE anda, 1028 01:27:19,360 --> 01:27:23,210 penghurai fail hanya integer tunggal, 1029 01:27:23,210 --> 01:27:26,970 sedangkan * FILE mempunyai sekumpulan keseluruhan barangan yang dikaitkan dengannya. 1030 01:27:26,970 --> 01:27:30,380 Sebab kita perlu untuk mengatakan 0 bukannya stdin 1031 01:27:30,380 --> 01:27:37,480 bahawa stdin * FILE yang menunjukkan kepada perkara yang rujukan pemerihal fail 0. 1032 01:27:37,480 --> 01:27:45,070 Jadi, walaupun di sini apabila saya melakukan fopen (argv [1], Saya mendapat FILE * kembali. 1033 01:27:45,070 --> 01:27:51,180 Tetapi tempat * FILE itu adalah satu perkara yang sepadan dengan huraian fail bagi fail yang. 1034 01:27:51,180 --> 01:27:57,430 Jika anda melihat halaman lelaki terbuka, jadi saya fikir anda akan mempunyai untuk melakukan lelaki terbuka 3 - ndak - 1035 01:27:57,430 --> 01:27:59,380 lelaki terbuka 2 - yeah. 1036 01:27:59,380 --> 01:28:06,250 Jika anda melihat halaman untuk terbuka, terbuka adalah seperti fopen rendah tahap, 1037 01:28:06,250 --> 01:28:09,350 dan ia kembali pemerihal fail sebenar. 1038 01:28:09,350 --> 01:28:12,050 fopen melakukan sekumpulan barangan di atas terbuka, 1039 01:28:12,050 --> 01:28:17,640 yang bukannya kembali hanya bahawa huraian fail mengembalikan FILE keseluruhan penunjuk * 1040 01:28:17,640 --> 01:28:20,590 di dalam mana adalah huraian fail kecil kami. 1041 01:28:20,590 --> 01:28:25,020 Jadi standard merujuk kepada perkara * FILE, 1042 01:28:25,020 --> 01:28:29,120 sedangkan 0 merujuk kepada hanya standard pemerihal fail dalam dirinya. 1043 01:28:29,120 --> 01:28:32,160 >> Soalan? 1044 01:28:32,160 --> 01:28:35,930 [Ketawa] meniup melalui itu. 1045 01:28:35,930 --> 01:28:39,140 Semua hak. Kami sedang dilakukan. [Ketawa] 1046 01:28:39,140 --> 01:28:42,000 >> [CS50.TV]