1 00:00:00,000 --> 00:00:02,500 [Powered by Google Translate] [5 skirsnis - patogiau] 2 00:00:02,500 --> 00:00:04,690 [Rob Bowden - Harvardo universiteto] 3 00:00:04,690 --> 00:00:07,250 [Tai CS50. - CS50.TV] 4 00:00:08,990 --> 00:00:14,250 >> Kaip ir sakiau mano elektroninio pašto adresą, yra daug dalykų, kuriuos galite naudoti, 5 00:00:14,250 --> 00:00:17,060 išskyrus prietaisą, iš tikrųjų problemines rinkinius. 6 00:00:17,060 --> 00:00:19,910 Mes rekomenduojame jums padaryti tik todėl, kad jį į prietaisą, tada mes galime daugiau lengvai padėti jums 7 00:00:19,910 --> 00:00:22,070 ir mes žinome, kaip viskas vyksta į darbą. 8 00:00:22,070 --> 00:00:26,950 Bet kaip vienas iš pavyzdžių, kur jūs galite padaryti dalykų, jei, tarkim, jums nereikia turėti prieigą 9 00:00:26,950 --> 00:00:31,570 prietaisą arba norite dirbti mokslo centro rūsyje - 10 00:00:31,570 --> 00:00:33,090 kurios iš tikrųjų jie turi prietaisą taip pat - 11 00:00:33,090 --> 00:00:35,150 jei norite dirbti bet kur. 12 00:00:35,150 --> 00:00:42,370 Vienas pavyzdys yra matėte / girdėjote apie SSH? 13 00:00:44,380 --> 00:00:47,780 SSH yra iš esmės tik kaip prisijungti prie ko nors. 14 00:00:47,780 --> 00:00:51,340 Tiesą sakant, dabar aš SSHed į aparatą. 15 00:00:51,340 --> 00:00:54,290 Aš niekada tiesiai į prietaisą. 16 00:00:55,930 --> 00:01:01,060 Čia yra prietaisas, ir jei jums atrodo čia matote šį IP adresą. 17 00:01:01,060 --> 00:01:03,650 Aš niekada dirbti paties prietaiso; 18 00:01:03,650 --> 00:01:08,840 Aš visada ateis į iTerm2 lango / terminalo lange. 19 00:01:08,840 --> 00:01:15,910 Galite SSH šį IP adresą, ssh jharvard@192.168.129.128. 20 00:01:15,910 --> 00:01:20,390 Aš atsimenu, kad skaičius labai lengvai, nes jis toks gražus modelis. 21 00:01:20,390 --> 00:01:24,920 Bet tai bus paklausti manęs už savo slaptažodį, ir dabar aš į prietaisą. 22 00:01:24,920 --> 00:01:33,060 Iš esmės, šiuo metu, jei jūs atidarėte terminalo viduje paties prietaiso, 23 00:01:33,060 --> 00:01:36,350 šią sąsają, tačiau jūs ją naudoti, yra lygiai tokia pati 24 00:01:36,350 --> 00:01:40,010 kaip sąsaja aš čia, bet dabar jūs SSHed. 25 00:01:42,240 --> 00:01:44,920 Jūs neturite SSH prietaiso. 26 00:01:44,920 --> 00:01:52,360 Vienas iš pavyzdžių kitoje vietoje galėtum SSH, aš esu gana įsitikinęs, turite pagal nutylėjimą - 27 00:01:52,360 --> 00:01:55,020 Oh. Didesnis. 28 00:01:55,020 --> 00:02:01,130 Jums visiems turėtų būti pagal nutylėjimą FAS sąskaitų fas serverių. 29 00:02:01,130 --> 00:02:06,840 Už mane, aš norėčiau SSH į rbowden@nice.fas.harvard.edu. 30 00:02:06,840 --> 00:02:11,610 Ji ketina paprašyti, kad pirmą kartą, ir pasakyti "taip". 31 00:02:11,610 --> 00:02:15,840 Mano slaptažodis yra tiesiog bus mano FAS slaptažodį. 32 00:02:15,840 --> 00:02:22,650 Ir todėl dabar, aš SSHed gražūs serverių ir galiu daryti, ką noriu čia. 33 00:02:22,650 --> 00:02:28,560 Daug klasių, jums gali imtis, kaip 124, ketinate norite įkelti stuff čia 34 00:02:28,560 --> 00:02:30,950 faktiškai pateikti jūsų problema rinkinius. 35 00:02:30,950 --> 00:02:34,100 Bet pasakyti, kad jūs neturite prieigos prie įrenginio. 36 00:02:34,100 --> 00:02:37,910 Tada jūs galite padaryti dalykus, kaip čia jis pasakys - 37 00:02:37,910 --> 00:02:42,160 Tai tik mūsų skyriuje klausimų. 38 00:02:42,160 --> 00:02:45,070 Jis paklaus jūsų, tai padaryti prietaisą. 39 00:02:45,070 --> 00:02:47,790 Vietoj to, aš tiesiog padaryti jį serveryje. 40 00:02:47,790 --> 00:02:50,560 Aš einu, išpakuokite, kad. 41 00:02:50,560 --> 00:02:55,670 Problema bus, kad esate pripratę naudojant kažką panašaus į gedit 42 00:02:55,670 --> 00:02:58,160 ar kokia prietaiso viduje. 43 00:02:58,160 --> 00:03:01,830 Jūs esate nesiruošia turėti, kad kad ŪKS serveryje. 44 00:03:01,830 --> 00:03:04,110 Visa tai tiesiog bus tai tekstinė sąsaja. 45 00:03:04,110 --> 00:03:09,180 Taigi jums gali arba viena, pasistenkite išmokti teksto redaktoriumi, kad jie turi. 46 00:03:09,180 --> 00:03:12,130 Jie turi Nano. 47 00:03:12,130 --> 00:03:14,990 Nano yra paprastai gana paprasta naudotis. 48 00:03:14,990 --> 00:03:19,470 Galite naudoti savo strėles ir įveskite paprastai. 49 00:03:19,470 --> 00:03:21,250 Taigi, tai nėra sunku. 50 00:03:21,250 --> 00:03:24,720 Jei norite gauti tikrai išgalvotas galite naudoti emacs, 51 00:03:24,720 --> 00:03:29,850 aš tikriausiai neturėtų atvėrė, nes aš net nežinau kaip uždaryti Emacs. 52 00:03:29,850 --> 00:03:32,760 Kontrolė X valdymo C? Taip. 53 00:03:32,760 --> 00:03:35,310 Arba galite naudoti VIM, o tai, ką aš naudoju. 54 00:03:35,310 --> 00:03:37,800 Ir taip yra jūsų pasirinkimai. 55 00:03:37,800 --> 00:03:43,830 Jei nenorite to daryti, taip pat galite, jei peržvelgsite manual.cs50.net - 56 00:03:43,830 --> 00:03:45,410 Oh. 57 00:03:45,410 --> 00:03:49,920 Kompiuteriu, galite SSH naudojant glaistai, 58 00:03:49,920 --> 00:03:51,940 , kuriame jūs turite atsisiųsti atskirai. 59 00:03:51,940 --> 00:03:55,460 Apie Mac, galite tiesiog pagal nutylėjimą naudoti terminalo arba galite atsisiųsti iTerm2 60 00:03:55,460 --> 00:03:58,490 kuris yra tarsi gražus, išgalvotas terminalo. 61 00:03:58,490 --> 00:04:03,780 Jeigu jūs einate į manual.cs50.net pamatysite nuorodą į užrašų knygelę + +, 62 00:04:03,780 --> 00:04:07,120 o tai, ką galite naudoti kompiuterio. 63 00:04:07,120 --> 00:04:13,340 Jis leidžia jums SFTP su Notepad + +, kuris yra iš esmės SSH. 64 00:04:13,340 --> 00:04:17,750 Ką tai leis jums padaryti redaguoti savo failus vietoje, 65 00:04:17,750 --> 00:04:20,670 ir tada, kai norite juos išsaugoti, tai padės sutaupyti nice.fas 66 00:04:20,670 --> 00:04:23,670 kur tada galite paleisti juos. 67 00:04:23,670 --> 00:04:26,880 Ir ant Mac ekvivalentas būti TextWrangler. 68 00:04:26,880 --> 00:04:28,760 Taigi ji leidžia jums padaryti tą patį. 69 00:04:28,760 --> 00:04:32,800 Jis leidžia jums redaguoti failus vietiniame ir įrašyti juos į nice.fas 70 00:04:32,800 --> 00:04:35,730 kur tada galite paleisti juos. 71 00:04:35,730 --> 00:04:40,400 Taigi, jei jūs kada nors pakimba be prietaiso, turite šias galimybes 72 00:04:40,400 --> 00:04:44,230 vis dar padaryti jūsų problema rinkinius. 73 00:04:44,230 --> 00:04:48,250 Viena problema bus, kad jūs nesiruošia turėti CS50 biblioteką 74 00:04:48,250 --> 00:04:51,580 nes nice.fas nėra pagal nutylėjimą, kad. 75 00:04:51,580 --> 00:04:55,970 Jūs galite atsisiųsti CS50 biblioteka - 76 00:04:55,970 --> 00:04:58,470 Nemanau, kad man reikia, kad šiuo metu. 77 00:04:58,470 --> 00:05:03,270 Jūs galite atsisiųsti CS50 biblioteką ir nukopijuokite jį į nice.fas 78 00:05:03,270 --> 00:05:07,450 ar aš manau, kad šiuo metu mes ne naudoti it anymore vistiek. 79 00:05:07,450 --> 00:05:12,720 Arba, jei mes darome, galite šiuo metu yra pakeisti jį su 80 00:05:12,720 --> 00:05:18,480 CS50 bibliotekos funkcijų diegimas vistiek. 81 00:05:18,480 --> 00:05:21,370 Kad neturėtų būti kad daug apribojimo. 82 00:05:21,370 --> 00:05:23,710 Ir tai, kad. 83 00:05:26,460 --> 00:05:29,820 >> Grįšiu prie prietaiso, mes padarysime viską, kad prietaiso. 84 00:05:29,820 --> 00:05:37,510 Žiūri mūsų skyriuje klausimų, pradžioje, kaip sakiau mano elektroninio pašto adresą, 85 00:05:37,510 --> 00:05:43,620 mes turime kalbėti apie vieną trumpą jums turėjo žiūrėti. 86 00:05:43,620 --> 00:05:51,980 Mes turime Skamb ir vamzdžiai, ir į šiuos tris klausimus. 87 00:05:51,980 --> 00:05:56,070 >> , Kuri srautas printf rašyti funkcijas, pavyzdžiui, pagal nutylėjimą? 88 00:05:56,070 --> 00:05:59,130 Taigi, srautas. Kas yra upelis? 89 00:06:06,520 --> 00:06:15,100 Srautas iš esmės, kaip tai tik keletas 90 00:06:15,100 --> 00:06:21,450 Tai net ne 1s ir 0s šaltinis. 91 00:06:21,450 --> 00:06:24,920 Srautas, jis klausia čia yra standartinis. 92 00:06:24,920 --> 00:06:27,250 Ir taigi standartinio iš srautas, kai jūs į jį rašyti, 93 00:06:27,250 --> 00:06:30,940 jis pasirodo ekrane. 94 00:06:30,940 --> 00:06:36,860 Standartinis išvada, srautą, tai reiškia, kad jūs tiesiog parašyti 1s ir 0s jai, 95 00:06:36,860 --> 00:06:40,220 Standartinis išvada kitas galas tiesiog skamba nuo to upelio. 96 00:06:40,220 --> 00:06:43,540 Tai tiesiog 1s ir 0s eilutę. 97 00:06:43,540 --> 00:06:45,570 Jūs galite rašyti srautų arba galite perskaityti iš srautų 98 00:06:45,570 --> 00:06:47,950 priklausomai nuo to, srautas iš tikrųjų yra. 99 00:06:47,950 --> 00:06:52,800 Kiti du numatytieji srautai yra standartinis ir standartinė paklaida. 100 00:06:52,800 --> 00:06:57,540 Standartas yra kai jūs GetString, laukia tavęs įvesti stuff. 101 00:06:57,540 --> 00:07:01,570 Taigi ji laukia jūsų, tai iš tikrųjų laukia standarto, 102 00:07:01,570 --> 00:07:04,880 yra tai, ką jūs gaunate, kai jūs įvedate į klaviatūrą. 103 00:07:04,880 --> 00:07:07,530 Įvedate į standartą in 104 00:07:07,530 --> 00:07:10,050 Standartinė paklaida yra iš esmės atitinka standartinio out, 105 00:07:10,050 --> 00:07:13,280 bet tai specializuojasi, kad kai spausdinate standartinė paklaida, 106 00:07:13,280 --> 00:07:16,770 jums turėjo tik spausdinimo klaida pranešimus 107 00:07:16,770 --> 00:07:20,200 , kad būtų galima atskirti reguliariai pranešimus, atspausdintus į ekraną 108 00:07:20,200 --> 00:07:24,560 palyginti su klaidų pranešimų, priklausomai nuo to, ar jie nuvyko į standartinį atsisakymą arba standartinė paklaida. 109 00:07:24,560 --> 00:07:28,660 Failus per. 110 00:07:28,660 --> 00:07:32,440 Standartinis out, standartinis, ir standartinė paklaida yra tik specialios srautai, 111 00:07:32,440 --> 00:07:36,810 bet tikrai bet kokį failą, kai atidarote failą, jis tampa baitų srautas 112 00:07:36,810 --> 00:07:40,740 kur Jūs galite tiesiog skaityti nuo to srauto. 113 00:07:40,740 --> 00:07:47,770 Jūs, didžiąja dalimi, gali tiesiog manau, kaip baitų srautą faile. 114 00:07:47,770 --> 00:07:51,190 Taigi, kas srautus jie parašyti pagal nutylėjimą? Standartinis išvada. 115 00:07:51,190 --> 00:07:56,980 >> Koks yra skirtumas tarp> ir >>? 116 00:07:58,140 --> 00:08:03,710 Ar kas nors peržiūrėti šį video įrašą iš anksto? Gerai. 117 00:08:03,710 --> 00:08:10,960 > Bus kaip jūs nukreipti į failus, 118 00:08:10,960 --> 00:08:15,240 ir >> taip pat ketina išvedimo į failus, 119 00:08:15,240 --> 00:08:17,820 bet tai, o ne pridėti prie bylos. 120 00:08:17,820 --> 00:08:23,430 Pavyzdžiui, tarkime, kad Aš atsitikti, kad dict čia, 121 00:08:23,430 --> 00:08:27,020 ir tik stuff viduje dict katės, katė, šuo, žuvis, šuo. 122 00:08:27,020 --> 00:08:31,530 Viena komanda, kad jūs turite į komandų eilutę yra katė, 123 00:08:31,530 --> 00:08:34,539 kuris yra tik ketinate spausdinti faile. 124 00:08:34,539 --> 00:08:40,679 Taigi, kai aš sakau, kačių dict, jis ketina spausdinti kačių, kačių, šunų, žuvis, šunį. Kad viskas katė daro. 125 00:08:40,679 --> 00:08:46,280 Tai reiškia, kad spausdinami standarto iš katė, katė, šuo, žuvis, šuo. 126 00:08:46,280 --> 00:08:53,240 Jei aš vietoj norite peradresuoti, kad į failą, aš galiu naudoti> ir nukreipti jį į ką failas yra. 127 00:08:53,240 --> 00:08:56,460 Aš kviesiu rinkmenoje. 128 00:08:56,460 --> 00:09:00,320 Taigi dabar, jei I ls, aš turiu naują failą pavadinimu failas. 129 00:09:00,320 --> 00:09:05,700 Ir jei aš jį atidaryti, ji ketina turėti, ką katė įdėti į komandų eilutę. 130 00:09:05,700 --> 00:09:11,040 Taigi dabar, jei aš tai padaryti dar kartą, tada jis vyksta nukreipti išvestį į failą, 131 00:09:11,040 --> 00:09:13,930 ir aš norėčiau turėti tą patį tiksliai dalykas. 132 00:09:13,930 --> 00:09:17,910 Taigi techniškai, ji visiškai svarbesnis, ką mes turėjome. 133 00:09:17,910 --> 00:09:22,970 Ir mes pamatyti, jei aš pakeisiu dict, aš paėmė šunį. 134 00:09:22,970 --> 00:09:29,980 Dabar, jei mes katė dict į failą dar kartą, mes ketiname turėti naują versiją su šuo ištrintas. 135 00:09:29,980 --> 00:09:32,400 Taigi tai paneigia. 136 00:09:32,400 --> 00:09:36,640 Vietoj to, jei mes naudojame >> ketinate pridėti failą. 137 00:09:36,640 --> 00:09:40,860 Dabar atidaryti failo, mes matome, mes turime tik du kartus tą patį spausdintą 138 00:09:40,860 --> 00:09:44,920 nes ten vieną kartą, tada mes pridėtas į originalą. 139 00:09:44,920 --> 00:09:48,130 Tam, kad tai, ką> ir >> padaryti. 140 00:09:48,130 --> 00:09:50,580 Ar kitą paklausti - Tai nereiškia, paklausti apie tai. 141 00:09:50,580 --> 00:09:59,050 >> Kita, kad mes turime yra <, kuri, jei> nukreipimus standartinį, 142 00:09:59,050 --> 00:10:01,970 00:10:12,050 Leiskite pamatyti, jei mes turime pavyzdį. 144 00:10:14,750 --> 00:10:16,930 Gebu rašyti vieną nekilnojamojo greitai. 145 00:10:17,870 --> 00:10:25,700 Paimkime bet kokį failą, hello.c. 146 00:10:56,060 --> 00:10:59,070 Gana paprasta byla. 147 00:10:59,070 --> 00:11:03,570 Aš tiesiog gauti eilutę ir tada spausdinti "Labas", neatsižvelgiant į tai, kokia eilutė Aš ką tik atvyko. 148 00:11:03,570 --> 00:11:07,990 Todėl įsitikinkite, Apie ir tada. / Hello. 149 00:11:07,990 --> 00:11:10,720 Dabar ji paskatino mane ką nors įvesti, 150 00:11:10,720 --> 00:11:15,070 tai reiškia, kad laukia dalykų, turi būti įtraukti į standartą in 151 00:11:15,070 --> 00:11:20,450 Todėl įveskite ką noriu standartus. Mes tik going to say hello, Rob! 152 00:11:20,450 --> 00:11:23,310 Tada jis spausdinate standarto out Sveiki, Rob! 153 00:11:23,310 --> 00:11:28,860 Jei aš tai padaryti. / "Hello" ir tada nukreipti, 154 00:11:30,740 --> 00:11:34,310 dabar jūs galite tik nukreipti iš failo. 155 00:11:34,310 --> 00:11:41,720 Taigi, jei aš įdėti kai kurių failų, txt, ir aš įdėti Rob 156 00:11:41,720 --> 00:11:52,300 , jei aš paleisti hello and tada nukreipti failo txt į / Sveiki, tai ketinate pasakyti Sveiki, Rob! iš karto. 157 00:11:52,300 --> 00:11:57,160 Kai ji pirmą kartą gauna GetString ir laukia standartą, 158 00:11:57,160 --> 00:12:01,730 standartas nebėra laukia ant klaviatūros gauti įvestų duomenų. 159 00:12:01,730 --> 00:12:05,980 Vietoj to, mes nukreipti standartas skaityti iš failo txt. 160 00:12:05,980 --> 00:12:10,290 Ir todėl ji ketina skaityti iš failo txt, kuris yra tik linija Rob 161 00:12:10,290 --> 00:12:13,380 ir tada ji ketina spausdinti Sveiki, Rob! 162 00:12:13,380 --> 00:12:18,180 Ir jei aš norėjau, aš taip pat galėtų padaryti. / Sveiki 00:12:21,500 ir tada standartinis, kad tai spauda, ​​kuri yra Hello, Rob, 164 00:12:21,500 --> 00:12:24,700 Galiu nukreipti į savo failą. 165 00:12:24,700 --> 00:12:29,790 Aš tiesiog paskambinkite failą hello - ne, aš ne, nes tai vykdomąjį - txt2. 166 00:12:29,790 --> 00:12:40,150 Dabar txt2 teks. / Sveiki, 00:12:43,520 >> Turite klausimų? 168 00:12:45,900 --> 00:12:49,090 >> Gerai. Taip, tada čia mes turime vamzdynas. 169 00:12:49,090 --> 00:12:53,510 Vamzdžiai yra paskutinis vienetas peradresavimo. 170 00:12:53,510 --> 00:12:58,750 >> Oh. Manau, dar vienas vienetas peradresavimo jei vietoj> jūs darote 2> 171 00:12:58,750 --> 00:13:01,070 kad nukreipti standartinė paklaida. 172 00:13:01,070 --> 00:13:06,280 Taigi, jei kažkas standartinė paklaida, tai nebūtų gauti įdėti į txt2. 173 00:13:06,280 --> 00:13:12,480 , Bet pastebėsite, jei aš 2>, tada jis vis dar spausdinti Sveiki, Rob! į komandų eilutę 174 00:13:12,480 --> 00:13:18,600 nes aš tik nukreipti standartinė paklaida, aš nenukreipiama standartą. 175 00:13:18,600 --> 00:13:22,210 Standartinė paklaida ir standartas iš yra skirtingi. 176 00:13:24,210 --> 00:13:27,080 Jeigu jūs norėjote, kad iš tikrųjų rašyti standartinė paklaida, 177 00:13:27,080 --> 00:13:35,080 tada galėčiau pakeisti, kad tai bus fprintf į išvestį. 178 00:13:35,080 --> 00:13:37,850 Iki printf, pagal nutylėjimą spausdina su standartine out. 179 00:13:37,850 --> 00:13:41,720 Jei aš noriu spausdinti standartinė paklaida rankiniu būdu, tada aš turiu naudoti fprintf 180 00:13:41,720 --> 00:13:45,010 ir nurodyti, ką norite spausdinti. 181 00:13:45,010 --> 00:13:49,720 Jei vietoj to aš fprintf STDOUT, tada, kad iš esmės atitinka printf. 182 00:13:49,720 --> 00:13:55,530 Bet fprintf standartinė paklaida. 183 00:13:57,790 --> 00:14:03,650 Taigi dabar, jei aš nukreipti į tai txt2, Sveiki, rob! vis dar gauti atspausdintas į komandų eilutę 184 00:14:03,650 --> 00:14:08,270 nes jis vis spausdinami standartinė paklaida ir aš tik nukreipti standartą. 185 00:14:08,270 --> 00:14:16,420 Jei aš dabar nukreipti standartinė paklaida, dabar ji negali gauti spausdinti, ir txt2 bus Sveiki, Rob! 186 00:14:16,420 --> 00:14:21,910 Taigi, dabar, jūs galite spausdinti savo faktines klaidas standartinė paklaida 187 00:14:21,910 --> 00:14:24,720 ir spausdinti savo nuolatinius pranešimus į standartinę out. 188 00:14:24,720 --> 00:14:31,420 Ir todėl, kai jūs paleisti savo programą, galite paleisti jį. / Apie šio tipo su 2> 189 00:14:31,420 --> 00:14:33,800 taip, kad jūsų programa vyksta normaliai važinėti, 190 00:14:33,800 --> 00:14:38,400 bet bet koks klaidos pranešimas, kad jūs gaunate jums gali patikrinti vėliau savo klaidų žurnalą, 191 00:14:38,400 --> 00:14:44,500 todėl klaidų, ir tada ieškoti vėliau ir savo klaidų byla turės kokių nors klaidų, kas nutiko. 192 00:14:45,200 --> 00:14:47,540 >> Turite klausimų? 193 00:14:47,540 --> 00:14:58,070 >> Naujausia yra vamzdis, kurį jūs galite galvoti, kaip standartą iš vienos komandos 194 00:14:58,070 --> 00:15:01,210 ir todėl standartas taikomas kitą komandą. 195 00:15:01,210 --> 00:15:05,570 Pavyzdys čia echo yra komandų eilutės dalykas 196 00:15:05,570 --> 00:15:11,840 kad yra tik ketina pakartoti, ką aš įdėti kaip savo argumentą. Aš ne įdėti kabučių. 197 00:15:11,840 --> 00:15:16,150 Echo, blah, blah, blah yra tik ketina spausdinti blah, blah, blah. 198 00:15:16,150 --> 00:15:20,600 Anksčiau, kai aš sakiau, aš turėjo įdėti Rob į txt failą 199 00:15:20,600 --> 00:15:28,830 , nes aš galiu tik nukreipti TXT failus, o ne / jei aš echo Rob 200 00:15:28,830 --> 00:15:35,520 ir tada vamzdis jį į / hello, kad bus taip pat padaryti tos pačios rūšies dalykas. 201 00:15:35,520 --> 00:15:39,160 Tai užtruko šią komandą galia, aidas Rob, 202 00:15:39,160 --> 00:15:43,610 ir naudoti jį kaip įvesties / hello. 203 00:15:44,790 --> 00:15:49,560 Jūs galite galvoti apie tai, kaip pirmasis peradresavimas ir echo Rob į failą 204 00:15:49,560 --> 00:15:54,160 ir tada įvesti į / Apie šio failo, kuris buvo tik išvedamas. 205 00:15:54,160 --> 00:15:57,850 Bet tai trunka laikiną bylą iš paveikslėlio. 206 00:16:01,890 --> 00:16:04,460 >> Turite klausimų apie tai? 207 00:16:04,460 --> 00:16:07,150 >> Kitas klausimas ketina įtraukti. 208 00:16:07,150 --> 00:16:15,310 Kas dujotiekis gali naudoti norėdami rasti unikalių pavadinimų failą pavadinimu names.txt? 209 00:16:15,310 --> 00:16:24,160 Komandos, mes ketiname norite naudoti, yra unikalus, todėl Uniq ir tada wc. 210 00:16:24,160 --> 00:16:28,840 Tai galite padaryti vyro Uniq kas, kad tai iš tikrųjų atrodo, 211 00:16:28,840 --> 00:16:34,840 ir tai tik ketina filtruoti gretimų atitikimo linijas įėjimo. 212 00:16:34,840 --> 00:16:40,690 Vyras wc ketina spausdinti naujos eilutės simbolį, žodį, ir kiekvieno failo baitų skaičius. 213 00:16:40,690 --> 00:16:43,760 Ir naujausia mes ketiname norite naudoti, yra tarsi 214 00:16:43,760 --> 00:16:47,410 kuris vyksta tiesiog rūšiuoti eilutes txt failą. 215 00:16:47,410 --> 00:16:58,080 , Jei aš padaryti šiek tiek txt failas, names.txt, ir tai Rob, Tommy, Juozapas, Tommy, Juozapas, RJ, Rob, 216 00:16:58,080 --> 00:17:03,910 ką aš noriu padaryti, čia yra rasti unikalių pavadinimai šiame faile. 217 00:17:03,910 --> 00:17:08,750 Taigi, kas jei atsakymas būtų? >> [Studentas] 4. >> Taip. 218 00:17:08,750 --> 00:17:13,780 Jis turi būti 4 nuo Rob, Tommy, Juozapo, RJ yra tik unikalūs pavadinimai šiame faile. 219 00:17:13,780 --> 00:17:20,180 Pirmas žingsnis, jei aš tiesiog padaryti Word count names.txt 220 00:17:20,180 --> 00:17:24,290 tai tikrai sakau man viską. 221 00:17:24,290 --> 00:17:32,560 Iš tikrųjų tai yra spausdinimas - pažiūrėkime, vyras wc - naujų eilučių, žodžių, ir baitų skaičius. 222 00:17:32,560 --> 00:17:38,270 Jeigu aš tik rūpi linijų, tada aš galiu tiesiog padaryti wc-l names.txt. 223 00:17:41,730 --> 00:17:44,300 Taip, kad 1 žingsnis. 224 00:17:44,300 --> 00:17:50,510 Bet aš nenoriu wc-l names.txt, nes names.txt tiesiog yra visi vardai, 225 00:17:50,510 --> 00:17:54,170 ir aš noriu filtruoti jokių Neunikalus. 226 00:17:54,170 --> 00:18:01,200 Taigi, jei aš UNIQ names.txt, kuris ne visai duoti man, ką aš noriu 227 00:18:01,200 --> 00:18:03,760 nes dubliuoti pavadinimai vis dar ten. 228 00:18:03,760 --> 00:18:07,690 Kodėl taip yra? Kodėl Uniq ne daryti ką noriu? 229 00:18:07,690 --> 00:18:10,500 [Studentas] dublikatai nėra [nesigirdi] >> Taip. 230 00:18:10,500 --> 00:18:16,370 Prisiminti man puslapius, UNIQ sako filtro gretimų atitinkančių eilučių. 231 00:18:16,370 --> 00:18:19,680 Jie nėra šalia, kad ji bus ne filtruoti juos. 232 00:18:19,680 --> 00:18:31,100 Jei aš rūšiuoti juos pirma, rūšiuoti names.txt ketina pateikti visus pasikartojančius eilutes kartu. 233 00:18:31,100 --> 00:18:34,450 Taigi dabar rūšiuoti names.txt kad. 234 00:18:34,450 --> 00:18:40,550 Aš ruošiuosi norite naudoti, kad įėjime Uniq, kuris yra | Uniq. 235 00:18:40,550 --> 00:18:43,390 , Kuri suteikia man Juozapą, RJ, Rob, Tommy, 236 00:18:43,390 --> 00:18:49,260 ir aš noriu naudoti, kad kaip indėlį į wc-l, 237 00:18:49,260 --> 00:18:52,740 ketina duoti man 4. 238 00:18:52,740 --> 00:18:56,930 , Kaip ji sako, čia, vamzdynas gali naudoti? 239 00:18:56,930 --> 00:19:01,390 Daug dalykų jūs galite padaryti, komandų serija, pavyzdžiui, naudojant 240 00:19:01,390 --> 00:19:05,130 kur jūs naudojate produkciją iš vienos komandos kaip įėjimo į kitą komandą. 241 00:19:05,130 --> 00:19:08,780 Jūs galite padaryti daug dalykų, daug protingų dalykų. 242 00:19:08,780 --> 00:19:11,440 >> Turite klausimų? 243 00:19:12,910 --> 00:19:14,600 Gerai. 244 00:19:14,600 --> 00:19:17,880 Štai ir viskas vamzdžių ir perorientavimas. 245 00:19:18,370 --> 00:19:24,090 >> Dabar mes pereiti prie faktinio dalykų, kodavimo stuff. 246 00:19:24,090 --> 00:19:29,100 Viduje šis PDF, pamatysite šią komandą, 247 00:19:29,100 --> 00:19:32,950 , ir jūs norite paleisti šią komandą savo prietaiso. 248 00:19:36,240 --> 00:19:42,250 wget komanda tiesiog gauti ką nors iš interneto, iš esmės, 249 00:19:42,250 --> 00:19:45,180 taip wget ir šį URL. 250 00:19:45,180 --> 00:19:49,110 Jei Jūs patekote į šį URL savo naršyklėje, ji būtų atsisiųsti šį failą. 251 00:19:49,110 --> 00:19:52,510 Aš tiesiog paspaudžia ant jo, todėl man atsisiųsti failą. 252 00:19:52,510 --> 00:19:55,650 Bet raštu wget šito daikto viduje terminalo 253 00:19:55,650 --> 00:19:58,620 yra tik ketina jį atsisiųsti į savo terminalą. 254 00:19:58,620 --> 00:20:02,750 Turiu section5.zip, ir jūs norite išpakuokite section5.zip 255 00:20:02,750 --> 00:20:06,520 kuris ketina suteikti jums aplanką, pavadintą section5 256 00:20:06,520 --> 00:20:11,550 kuris vyksta, kad visi failai, mes ketiname naudoti šiandien viduje ji. 257 00:20:33,380 --> 00:20:37,710 Kaip šių programų failų pavadinimai rodo, kad jie šiek tiek Buggy, 258 00:20:37,710 --> 00:20:40,990 todėl jūsų tikslas yra išsiaiškinti, kodėl naudojant gdb. 259 00:20:40,990 --> 00:20:44,560 Ar visus juos parsisiųsti / žinoti, kaip juos gauti atsisiųsti 260 00:20:44,560 --> 00:20:47,480 į savo prietaiso? Gerai. 261 00:20:47,480 --> 00:20:56,400 >> Veikia ./buggy1, jis pasakys SEGMENTAVIMAS gedimą (Core dempingo kaina), 262 00:20:56,400 --> 00:21:00,500 bet kuriuo metu gausite segfault, tai yra blogas dalykas. 263 00:21:00,500 --> 00:21:03,810 Kokiomis aplinkybėmis jūs gaunate segfault? 264 00:21:03,810 --> 00:21:08,210 [Studentas] Dereferencing NULL pointeris. >> Taip. Taigi, kad yra vienas iš pavyzdžių. 265 00:21:08,210 --> 00:21:11,580 NULL pointeris Dereferencing jūs ketinate gauti segfault. 266 00:21:11,580 --> 00:21:16,720 Kas segfault priemones jūs liesdami atmintį, jums neturėtų būti neliesti. 267 00:21:16,720 --> 00:21:21,350 Taigi dereferencing NULL pointeris yra neliesti Adresas 0 268 00:21:21,350 --> 00:21:28,060 ir iš esmės, šiandien pasakyti, kad visi kompiuteriai adresas 0 yra atminties, jums neturėtų būti neliesti. 269 00:21:28,060 --> 00:21:31,920 Štai kodėl dereferencing NULL pointeris rezultatų segfault. 270 00:21:31,920 --> 00:21:37,210 Kai jums atsitikti, kad negali inicijuoti rodyklę, tada ji turi šiukšlių vertę, 271 00:21:37,210 --> 00:21:41,520 ir taip, kai bandote dereference, greičiausiai jūs liesdami atmintį 272 00:21:41,520 --> 00:21:43,540 tai į niekur viduryje. 273 00:21:43,540 --> 00:21:45,650 Jei atsitiktų gauti pasisekė ir šiukšlių vertė 274 00:21:45,650 --> 00:21:48,440 atsitiko, kad rodytų į kažkur ant kamino ar kažką, 275 00:21:48,440 --> 00:21:50,820 tada, kai jums dereference kad žymeklį, kuriuos dar inicializuoti, 276 00:21:50,820 --> 00:21:52,730 nieko bus negerai. 277 00:21:52,730 --> 00:21:55,480 Bet jei ji nukreipta į, tarkim, kažkur tarp kamino ir krūvos, 278 00:21:55,480 --> 00:21:59,850 ar ji nukreipta tik kažkur, kad nebuvo buvo naudojami pagal savo programą dar, 279 00:21:59,850 --> 00:22:02,240 tada jūs liesdami atminties jums neturėtų būti neliesti ir jums segfault. 280 00:22:02,240 --> 00:22:06,370 Rašydami rekursinis funkciją ir ji recurses per daug kartų 281 00:22:06,370 --> 00:22:08,720 ir jūsų kamino auga per didelis ir kamino pataiko į dalykus 282 00:22:08,720 --> 00:22:12,270 kad ji neturėtų susidurti su, jūs liesdami atmintį, jums neturėtų būti neliesti, 283 00:22:12,270 --> 00:22:14,810 todėl jūs segfault. 284 00:22:14,810 --> 00:22:17,010 Kad yra ką segfault. 285 00:22:17,010 --> 00:22:21,810 >> Tai taip pat dėl ​​tos pačios priežasties, kad jei turite eilutę, pavyzdžiui, 286 00:22:21,810 --> 00:22:23,930 grįžkime su ankstesne programa. 287 00:22:23,930 --> 00:22:28,530 Hello.c-Aš tik ketina padaryti ką nors kita. 288 00:22:28,530 --> 00:22:33,770 char * s = "hello world!"; 289 00:22:33,770 --> 00:22:42,310 Jei aš naudoju * = kažkas ar s [0] = "X"; 290 00:22:42,310 --> 00:22:47,290 todėl įsitikinkite, labas,. / hello, kodėl, kad segfault? 291 00:22:48,410 --> 00:22:51,250 Kodėl taip segfault? 292 00:22:55,660 --> 00:22:57,890 Ką būtų galima tikėtis, kad taip atsitiktų? 293 00:22:57,890 --> 00:23:06,640 Jeigu aš printf ("% s \ n",-os), ką jūs tikėtis, kad bus spausdinami? 294 00:23:06,640 --> 00:23:09,930 [Studentas] X hello. >> Taip. 295 00:23:09,930 --> 00:23:15,140 Problema yra ta, kad, kai jūs deklaruoja panašaus į tai eilutę, 296 00:23:15,140 --> 00:23:18,190 s yra žymeklis, kad ketina eiti kamino, 297 00:23:18,190 --> 00:23:25,880 ir kas s nukreipta į ši eilutė, kuri yra tik skaitomos atminties. 298 00:23:25,880 --> 00:23:30,560 Taigi tik vardą, pavardę, tik skaitomos atminties, turėtumėte gauti idėja 299 00:23:30,560 --> 00:23:33,010 kad jei bandysite pakeisti tai, kas yra tik skaitomos atminties, 300 00:23:33,010 --> 00:23:36,670 jūs darote kažką, kad jums nereikėtų daryti su atmintim ir jums segfault. 301 00:23:36,670 --> 00:23:45,360 Iš tikrųjų tai yra didelis skirtumas tarp char * s ir char s []. 302 00:23:45,360 --> 00:23:48,790 Taigi char [], dabar ši eilutė bus įdėti į steką, 303 00:23:48,790 --> 00:23:53,960 kamino yra ne tik skaityti, o tai reiškia, kad tai turėtų veikti puikiai baudą. 304 00:23:55,500 --> 00:23:57,370 Ir ji tai daro. 305 00:23:57,370 --> 00:24:06,250 Atminkite, kad kai aš char * s = "hello world!", Pati yra kamino 306 00:24:06,250 --> 00:24:10,390 bet kažkur kitur, ir kad kažkur kitur būna, kad tik skaityti. 307 00:24:10,390 --> 00:24:15,640 Bet char [] yra tik kažkas kamino. 308 00:24:17,560 --> 00:24:21,760 Taigi, tai dar vienas pavyzdys, segfault vyksta. 309 00:24:21,760 --> 00:24:27,820 >> Mes matėme kad ./buggy1 lėmė segfault. 310 00:24:27,820 --> 00:24:31,810 Teoriškai neturėtų pažvelgti buggy1.c nedelsiant. 311 00:24:31,810 --> 00:24:35,170 Vietoj to, mes pažvelgti į jį per gdb. 312 00:24:35,170 --> 00:24:37,750 Atkreipkite dėmesį, kad, kai jūs gaunate SEGMENTAVIMAS kaltės (Core dempingo kaina), 313 00:24:37,750 --> 00:24:40,850 gausite šį failą per čia vadinama šerdies. 314 00:24:40,850 --> 00:24:45,200 Jei mes ls-l, mes pamatysime, kad esmė yra paprastai gana didelis failas. 315 00:24:45,200 --> 00:24:51,580 Tai bylos baitų skaičius, todėl atrodo, kad jis 250-kažkas kilobaitai. 316 00:24:51,580 --> 00:24:56,120 Taip yra todėl, kad tai, ką core dump iš tikrųjų yra 317 00:24:56,120 --> 00:25:01,410 yra tada, kai jūsų programos avarijos, atminties savo programą valstybės 318 00:25:01,410 --> 00:25:05,230 tiesiog gauna nukopijuoti ir įklijuoti į šį failą. 319 00:25:05,230 --> 00:25:07,270 Ji gauna dempingo kaina į šio failo. 320 00:25:07,270 --> 00:25:13,060 Ši programa, o ji buvo paleista, įvyko apie 250 kilobaitų atminties naudojimą, 321 00:25:13,060 --> 00:25:17,040 ir kad tai, ką gavo dempingo kaina į šį failą. 322 00:25:17,040 --> 00:25:23,630 Dabar jūs galite peržvelgti šio failo, jei mes gdb buggy1 branduolį. 323 00:25:23,630 --> 00:25:30,130 Mes galime tik daryti gdb buggy1, ir kad bus tiesiog paleidžiant gdb reguliariai, 324 00:25:30,130 --> 00:25:33,800 naudojant kaip savo įvesties failo buggy1. 325 00:25:33,800 --> 00:25:38,260 Bet jei jūs gdb buggy1 branduolį, tada jis konkrečiai ketina pradėti gdb 326 00:25:38,260 --> 00:25:40,330 žiūri šią pagrindinę bylą. 327 00:25:40,330 --> 00:25:45,560 Ir tu sakai, buggy1 reiškia gdb žino, kad pagrindinė byla ateina iš buggy1 programą. 328 00:25:45,560 --> 00:25:49,580 Taigi gdb buggy1 esmė yra nedelsiant atnešti mums 329 00:25:49,580 --> 00:25:52,060 kur programa atsitiko nutraukti. 330 00:25:57,720 --> 00:26:02,340 Čia mes matome, programa nutrauktas signalo 11, segmentavimo kaltės. 331 00:26:02,340 --> 00:26:10,110 Atsitiks pamatyti liniją susirinkimų, kurį tikriausiai nėra labai naudinga. 332 00:26:10,110 --> 00:26:15,360 Bet jei įvesite BT arba pėdsako, kad bus funkcija 333 00:26:15,360 --> 00:26:19,430 , kuri suteikia mums mūsų dabartinių kamino kadrų sąrašą. 334 00:26:19,430 --> 00:26:23,150 Taigi Backtrace. Atrodo, kad mes tik du kamino rėmus. 335 00:26:23,150 --> 00:26:26,310 Pirmasis mūsų pagrindinis kamino rėmas, 336 00:26:26,310 --> 00:26:29,810 , o antrasis yra kamino rėmas šią funkciją, kad mes atsitiktų būti, 337 00:26:29,810 --> 00:26:34,440 atrodo, kad mes tik surinkimo kodą. 338 00:26:34,440 --> 00:26:38,050 Taigi, grįžkime į mūsų pagrindinę funkciją, 339 00:26:38,050 --> 00:26:42,300 ir padaryti, kad mes galime padaryti 1 kadrą, ir manau, kad mes taip pat galime tai padaryti žemyn, 340 00:26:42,300 --> 00:26:45,160 bet aš beveik niekada daryti žemyn - arba iki. Taip. 341 00:26:45,160 --> 00:26:50,710 Aukštyn ir žemyn. Iki atneša jums vieną kamino rėmo, žemyn atneša jums žemyn kamino rėmo. 342 00:26:50,710 --> 00:26:53,240 Aš paprastai niekada naudoti, kad. 343 00:26:53,240 --> 00:26:59,120 Aš tiesiog konkrečiai pasakyti 1 kadrą, kuris yra eiti į rėmo, pažymėtą 1. 344 00:26:59,120 --> 00:27:01,750 Rėmelis 1 ketina atnešti mums į pagrindinį kamino rėmo, 345 00:27:01,750 --> 00:27:05,570 ir ji sako, čia kodo eilutę atsitiktų būti. 346 00:27:05,570 --> 00:27:07,950 Jei mes norėjome dar keletą eilučių kodo, mes galime pasakyti, sąrašą, 347 00:27:07,950 --> 00:27:11,280 ir kad ketina duoti mums visus kodo linijomis aplink jį. 348 00:27:11,280 --> 00:27:13,360 Linija segfaulted buvo 6: 349 00:27:13,360 --> 00:27:17,360 if (strcmp ("CS50 uolienos", argv [1]) == 0). 350 00:27:17,360 --> 00:27:24,130 Jei tai nėra akivaizdu dar galite gauti jį tiesiai iš čia, tiesiog galvoju, kodėl ji segfaulted. 351 00:27:24,130 --> 00:27:28,800 Tačiau mes galime imtis dar vieną žingsnį ir pasakyti: "Kodėl argv [1] segfault?" 352 00:27:28,800 --> 00:27:38,830 Leiskite spausdinimo argv [1], ir atrodo, tai 0x0, kuris yra niekinis rodyklė. 353 00:27:38,830 --> 00:27:44,750 Mes strcmping CS50 uolų ir NULL, ir todėl, kad vyksta segfault. 354 00:27:44,750 --> 00:27:48,280 Ir kodėl tai argv [1] null? 355 00:27:48,640 --> 00:27:51,280 [Studentas] Kadangi mes nesuteikė jai jokių komandų eilutės argumentus. 356 00:27:51,280 --> 00:27:53,390 Taip. Mes nesuteikė jai jokių komandų eilutės argumentus. 357 00:27:53,390 --> 00:27:58,460 Taigi ./buggy1 yra tik ketina argv [0] būti ./buggy1. 358 00:27:58,460 --> 00:28:02,100 Ji nesiruošia turėti argv [1], kad ketina segfault. 359 00:28:02,100 --> 00:28:07,450 Bet jei, vietoj to, aš tai tiesiog CS50, jis ketina pasakyti Jūs gaunate D 360 00:28:07,450 --> 00:28:09,950 nes tai, ką ji turėtų daryti. 361 00:28:09,950 --> 00:28:15,240 Žiūri buggy1.c, tai turėtų spausdinti "Jūs gaunate D" - 362 00:28:15,240 --> 00:28:20,820 Jei argv [1] nėra "CS50 uolienos", "Jūs gaunate D", kitaip "Jūs gaunate tai!" 363 00:28:20,820 --> 00:28:25,660 Taigi, jei norime, turime tai palyginti kaip tiesa, 364 00:28:25,660 --> 00:28:28,710 tai reiškia, kad ji lygina su 0. 365 00:28:28,710 --> 00:28:31,100 Taigi argv [1] turi būti "CS50 uolų". 366 00:28:31,100 --> 00:28:35,660 Jei norite padaryti, kad į komandų eilutę, jūs turite naudoti \ pabėgti erdvę. 367 00:28:35,660 --> 00:28:41,690 Taigi CS50 \ uolienos ir gausite A! 368 00:28:41,690 --> 00:28:44,060 Jei jums nereikia daryti "Backslash, kodėl tai neveikia? 369 00:28:44,060 --> 00:28:47,190 [Studentas] Tai du skirtingi argumentai. >> Taip. 370 00:28:47,190 --> 00:28:52,540 Argv [1] bus CS50, ir argv [2] bus uolienos. Gerai. 371 00:28:52,540 --> 00:28:56,470 >> Dabar ./buggy2 vėl ketina segfault. 372 00:28:56,470 --> 00:29:01,880 Vietoj atidaryti jį su savo pagrindine byla, mes tiesiog atverti buggy2 tiesiogiai 373 00:29:01,880 --> 00:29:05,000 taip gdb buggy2. 374 00:29:05,000 --> 00:29:09,590 Dabar, jei mes tiesiog paleisti programą, tada jis ketina pasakyti, kad programa gavo signalo SIGSEGV 375 00:29:09,590 --> 00:29:15,530 kuris yra segfault signalą, kur tai įvyko, kad taip atsitiktų. 376 00:29:15,530 --> 00:29:21,250 Žiūri mūsų pėdsako, mes matome, kad mes buvome funkciniam oh_no 377 00:29:21,250 --> 00:29:23,900 , kuris buvo vadinamas funkcijos Dinky, kuris buvo vadinamas funkcijos Binky, 378 00:29:23,900 --> 00:29:26,460 , kuris buvo vadinamas pagrindinis. 379 00:29:26,460 --> 00:29:31,680 Mes taip pat galime pamatyti argumentus šių funkcijų. 380 00:29:31,680 --> 00:29:34,680 Buvo argumentas Dinky ir Binky 1. 381 00:29:34,680 --> 00:29:44,390 Jei mes sąrašą funkcija oh_no, matome, kad oh_no tiesiog daro char ** S = NULL; 382 00:29:44,390 --> 00:29:47,410 * = "STRĖLĖ"; 383 00:29:47,410 --> 00:29:50,330 Kodėl tai nepavyksta? 384 00:29:54,330 --> 00:29:58,380 [Studentas] Jūs negalite dereference null žymeklį? >> Taip. 385 00:29:58,380 --> 00:30:06,090 Tai tiesiog pasakyti ai yra NULL, nepriklausomai nuo to, ar būna, kad char ** 386 00:30:06,090 --> 00:30:12,070 , kuri, priklausomai nuo to, kaip jūs jį interpretuoti, tai gali būti žymiklį į rodyklę į eilutę 387 00:30:12,070 --> 00:30:15,550 arba eilučių masyvas. 388 00:30:15,550 --> 00:30:21,430 Tai ai yra NULL, todėl * s dereferencing NULL pointeris, 389 00:30:21,430 --> 00:30:24,800 ir taip tai vyksta į avariją. 390 00:30:24,800 --> 00:30:27,540 Tai yra vienas iš greičiausių būdų, galite galbūt segfault. 391 00:30:27,540 --> 00:30:31,300 Tai tiesiog skelbiantis null žymiklį ir iš karto segfaulting. 392 00:30:31,300 --> 00:30:34,570 Štai ką oh_no daro. 393 00:30:34,570 --> 00:30:43,400 Jei mes einame po vieną kadrą, tada mes ketiname gauti į funkcija, kuri vadinama oh_no. 394 00:30:43,400 --> 00:30:44,830 Man reikia daryti, kad žemyn. 395 00:30:44,830 --> 00:30:48,610 Jei jūs neturite įvesti komandą, ir jūs tiesiog paspauskite "Enter" dar kartą, 396 00:30:48,610 --> 00:30:52,350 tai bus tik pakartoti ankstesnę komandą, kad jūs anksčiau. 397 00:30:52,350 --> 00:30:56,610 Mes esame Rėmelis 1. 398 00:30:56,610 --> 00:31:04,650 Listingavimas Ši rėmo, matome, čia yra mūsų funkcija. 399 00:31:04,650 --> 00:31:08,520 Jūs galite paspausti dar kartą, ar jūs galite padaryti sąrašą 20 ir ji bus sąraše daugiau. 400 00:31:08,520 --> 00:31:13,640 Ši funkcija Subtili sako, jei i 1, tai eikite į oh_no funkcija, 401 00:31:13,640 --> 00:31:15,960 kitur eiti lieso funkciją. 402 00:31:15,960 --> 00:31:18,700 Ir mes žinome, i 1, nes mes atsitiktų pamatyti čia 403 00:31:18,700 --> 00:31:22,560 kad Subtili buvo iškviestas argumentu, 1. 404 00:31:22,560 --> 00:31:27,560 Arba galite tiesiog spausdinti i ir jis pasakys, i 1. 405 00:31:27,560 --> 00:31:33,770 Mes šiuo metu Dinky, ir jei mes einame kito kadro, mes žinome, kad galų gale į Binky. 406 00:31:33,770 --> 00:31:36,600 Aukštyn. Dabar mes Binky. 407 00:31:36,600 --> 00:31:41,340 Listingavimas Ši funkciją - iš prieš pusę tuoj mane sąrašą 408 00:31:41,340 --> 00:31:52,670 prasidėjo taip, lyg i 0, tada mes ketiname jį vadiname oh_no, dar Subtili. 409 00:31:52,670 --> 00:31:57,000 Mes žinome, man buvo 1, todėl jis vadinamas Subtili. 410 00:31:57,000 --> 00:32:05,030 Ir dabar mes grįžome pagrindinis ir pagrindinis tiesiog bus int i = rand ()% 3; 411 00:32:05,030 --> 00:32:08,790 Kad yra tik ketina suteikti jums atsitiktinį skaičių, kuris yra arba 0, 1 arba 2. 412 00:32:08,790 --> 00:32:12,780 Ji ketina skambinti Binky su tuo numeriu, ir jis grįš 0. 413 00:32:12,780 --> 00:32:16,700 Žvelgiant į šią 414 00:32:16,700 --> 00:32:19,880 tiesiog vaikščioti per programą rankiniu būdu be paleisti jį iš karto, 415 00:32:19,880 --> 00:32:25,400 galėtumėte nustatyti pertraukos tašką Main, o tai reiškia, kad, kai mes paleisti programą 416 00:32:25,400 --> 00:32:31,020 jūsų programa veikia iki tol, kol ji hitai pertraukos tašką. 417 00:32:31,020 --> 00:32:35,450 Taigi, paleisti programą, ji veiks ir tada ji nukentėjo pagrindinė funkcija ir nustoti veikti. 418 00:32:35,450 --> 00:32:44,700 Dabar mes viduje pagrindinis, ir žingsnis ar kiti ketina vesti mus į kitą eilutę kodo. 419 00:32:44,700 --> 00:32:47,050 Jūs galite padaryti, žingsnis arba kitą. 420 00:32:47,050 --> 00:32:51,800 Pereis į kitą, dabar aš buvo rand ()% 3, taigi mes galime atspausdinti aš vertė, 421 00:32:51,800 --> 00:32:55,280 ir jis pasakys, i 1. 422 00:32:55,280 --> 00:32:58,110 Dabar ji, nepriklausomai nuo to, ar mes naudojame kitą arba ankstesnį žingsnį. 423 00:32:58,110 --> 00:33:01,000 Manau, kad svarbiau ankstesniojo, bet mes norime naudoti kitą. 424 00:33:01,000 --> 00:33:06,000 Jei mes naudojame žingsnį, mes žingsnis į funkciją, o tai reiškia pažvelgti į faktinį dalykas 425 00:33:06,000 --> 00:33:07,940 kad vyksta viduje Binky. 426 00:33:07,940 --> 00:33:10,510 Jei mes naudojame kitą, tai reiškia eiti per funkciją 427 00:33:10,510 --> 00:33:14,070 ir tiesiog eiti į kitą eilutę kodo Mūsų pagrindinė funkcija. 428 00:33:14,070 --> 00:33:17,900 Štai čia, šioje linijoje, man buvo, kur jis sakė, rand ()% 3; 429 00:33:17,900 --> 00:33:21,320 jei aš žingsnį, tai būtų eiti į rand įgyvendinimo 430 00:33:21,320 --> 00:33:25,110 ir pažvelgti į tai, kas vyksta ten, ir aš galėjau žingsnis per randas funkcija. 431 00:33:25,110 --> 00:33:26,920 Bet man nerūpi apie randas funkcija. 432 00:33:26,920 --> 00:33:30,190 Aš tik noriu eiti į kitą eilutę kodo pagrindinis, tad aš naudoju kitą. 433 00:33:30,190 --> 00:33:35,800 Bet dabar aš rūpintis apie Binky funkcija, todėl aš noriu dėti į. 434 00:33:35,800 --> 00:33:37,730 Dabar aš Binky. 435 00:33:37,730 --> 00:33:42,040 Pirmoje eilutėje kodas going to say if (i == 0), aš žengti žingsnį, 436 00:33:42,040 --> 00:33:44,930 matome mes galų gale dinky. 437 00:33:44,930 --> 00:33:51,620 Jei mes sąrašas dalykų, matome, kad jį patikrinti yra i = 0. 438 00:33:51,620 --> 00:33:55,470 i nėra lygus 0, todėl jis išvyko į kitas sąlyga, 439 00:33:55,470 --> 00:33:59,540 kuris ketina skambinti Dinky (i). 440 00:33:59,540 --> 00:34:04,030 Jums gali susipainioti. 441 00:34:04,030 --> 00:34:07,380 Jei jūs tiesiog pažvelgti į šias eilutes, jūs manote, if (i == 0) 442 00:34:07,380 --> 00:34:10,800 gerai, tada aš paėmė dar vieną žingsnį ir dabar aš Dinky (i), 443 00:34:10,800 --> 00:34:14,120 jūs manote, kad turėtų reikšti, i = 0 ar kažkas. 444 00:34:14,120 --> 00:34:18,980 Ne, tai tiesiog reiškia, kad jis žino, kad tai galima klijuoti tiesiai į linijos Dinky (i). 445 00:34:18,980 --> 00:34:23,300 Nes aš ne 0, kitas žingsnis yra nesiruošia baigti else. 446 00:34:23,300 --> 00:34:26,239 Dar yra ne linija, ji ketina sustoti. 447 00:34:26,239 --> 00:34:31,570 Tai dabar einu į kitą eilutę, ji iš tikrųjų gali vykdyti, kuri yra Subtili (i). 448 00:34:31,570 --> 00:34:36,090 Kovos į dinky (i), matome, if (i == 1). 449 00:34:36,090 --> 00:34:42,670 Mes žinome, i = 1, todėl, kai mes žingsnį, mes žinome, kad jūs ketinate baigti oh_no 450 00:34:42,670 --> 00:34:46,489 nes i = 1 iškviečia funkciją oh_no, kurį galite žengti į, 451 00:34:46,489 --> 00:34:52,969 kuris ketina nustatyti char ** s = NULL ir nedelsiant "STRĖLĖ". 452 00:34:54,270 --> 00:34:59,690 Ir tada iš tikrųjų žiūri į buggy2 įgyvendinimo, 453 00:34:59,690 --> 00:35:04,590 tai, aš tiesiog gauti atsitiktinių skaičių - 0, 1 arba 2 - Calling Binky 454 00:35:04,590 --> 00:35:10,610 jei i 0 ragina oh_no, dar ji vadina Subtili, kuris ateina čia. 455 00:35:10,610 --> 00:35:18,100 Jei i 1, skambinkite oh_no, dar lieso, kuris ateina čia, 456 00:35:18,100 --> 00:35:20,460 jei i 2, skambinkite oh_no. 457 00:35:20,460 --> 00:35:24,720 Aš net manau, kad yra būdas, 458 00:35:24,720 --> 00:35:30,030 Ar kas nors būdas padaryti programa, kad nebus segfault? 459 00:35:30,030 --> 00:35:37,530 Nes jei aš kažko trūksta, jei i 0, jūs iš karto segfault 460 00:35:37,530 --> 00:35:41,250 nors jums eiti į funkciją, kuri, jei i yra 1 Jūs segfault 461 00:35:41,250 --> 00:35:44,540 nors jums eiti prie funkcijos, kur, jei aš yra 2 segfault. 462 00:35:44,540 --> 00:35:46,810 Todėl nesvarbu, ką jūs darote, jūs segfault. 463 00:35:46,810 --> 00:35:52,380 >> Manau, vienas iš būdų nustatyti, kad būtų, o ne daryti char ** S = NULL, 464 00:35:52,380 --> 00:35:55,610 jums gali malloc vietos už tą eilutę. 465 00:35:55,610 --> 00:36:04,230 Mes galime padaryti malloc (sizeof) - sizeof ką? 466 00:36:09,910 --> 00:36:15,190 [Studentas] (char) * 5? >> Ar tai atrodo tiesa? 467 00:36:15,190 --> 00:36:21,060 Aš darant prielaidą, kad tai veiks, jei aš iš tikrųjų vyko, bet tai ne tai, ko aš ieškau. 468 00:36:24,400 --> 00:36:32,940 Pažvelgti s tipo. Pridėkime int *, todėl int * x. 469 00:36:32,940 --> 00:36:35,600 Noriu daryti malloc (sizeof (int)). 470 00:36:35,600 --> 00:36:40,490 Arba, jei aš norėjau iš 5 masyvo, aš norėčiau tai padaryti (sizeof (int) * 5); 471 00:36:40,490 --> 00:36:44,210 Ką daryti, jei int **? 472 00:36:46,260 --> 00:36:49,140 Ką aš malloc? 473 00:36:49,140 --> 00:36:53,510 [Studentas], tuomet rodyklė dydis. >> Taip. (Sizeof (int *)); 474 00:36:53,510 --> 00:36:56,960 Tas pats dalykas čia. 475 00:36:56,960 --> 00:37:01,280 Noriu (sizeof (char *)); 476 00:37:06,170 --> 00:37:12,840 Tai ketina skirti vietos žymeklis, kad rodo, kad "bumo". 477 00:37:12,840 --> 00:37:15,330 Man nereikia skirti vietos "bumo" pati 478 00:37:15,330 --> 00:37:17,210 , nes tai iš esmės atitinka tai, ką minėjau anksčiau 479 00:37:17,210 --> 00:37:20,870 char * x = "STRĖLĖ". 480 00:37:20,870 --> 00:37:27,950 "Bumo" jau egzistuoja. Taip atsitinka, kad egzistuoja tik skaityti atminties regione. 481 00:37:27,950 --> 00:37:35,200 Bet jis jau egzistuoja, o tai reiškia, šią kodo eilutę, jei s char ** 482 00:37:35,200 --> 00:37:43,900 * s char * ir jūs nustatote šį char * "boom". 483 00:37:43,900 --> 00:37:50,040 Jei aš norėjau kopijuoti "bumo" į S, tada man reikės skirti vietos s. 484 00:37:55,170 --> 00:38:03,900 Aš padarysiu * = malloc (sizeof (char) * 5); 485 00:38:03,900 --> 00:38:06,210 Kodėl 5? 486 00:38:06,210 --> 00:38:10,860 Kodėl gi ne 4? Atrodo, kad "STRĖLĖ" yra 4 simboliai. >> [Studentas] null charakterį. 487 00:38:10,860 --> 00:38:14,580 Taip. Savo stygos ketinate reikia nulinę pobūdžio. 488 00:38:14,580 --> 00:38:23,590 Dabar galiu padaryti kažką panašaus strcat - Kas yra funkcija kopijuoti eilutę? 489 00:38:23,590 --> 00:38:28,520 [Studentas] CPy? >> Strcpy. 490 00:38:28,520 --> 00:38:32,700 vyras strcpy. 491 00:38:36,120 --> 00:38:39,590 Taigi strcpy arba strncpy. 492 00:38:39,590 --> 00:38:43,410 strncpy yra šiek tiek saugiau, nes galite nurodyti tiksliai, kiek simbolių, 493 00:38:43,410 --> 00:38:46,190 bet čia nesvarbu, nes mes žinome. 494 00:38:46,190 --> 00:38:50,340 Taigi strcpy ir ieškoti argumentų,. 495 00:38:50,340 --> 00:38:53,100 Pirmasis argumentas yra mūsų tikslas. 496 00:38:53,100 --> 00:38:56,770 Antrasis argumentas yra mūsų šaltinis. 497 00:38:56,770 --> 00:39:10,310 Mes ketiname kopijuoti į mūsų paskirties * s rodyklė "STRĖLĖ". 498 00:39:10,310 --> 00:39:19,820 Kodėl jūs norite tai padaryti, o ne apie tai, ką mes turėjome strcpy prieš 499 00:39:19,820 --> 00:39:22,800 * S = "STRĖLĖ"? 500 00:39:22,800 --> 00:39:28,630 Yra priežastis, kodėl jūs galbūt norėsite tai padaryti, bet kas tai yra priežastis? 501 00:39:28,630 --> 00:39:31,940 [Studentas] Jei norite ką nors pakeisti "boom". >> Taip. 502 00:39:31,940 --> 00:39:37,950 Dabar galiu padaryti kažką panašaus s [0] = "X"; 503 00:39:37,950 --> 00:39:48,190 nes taškai, dėl krūvos į krūvą, ir ši vieta, kad yra nukreipta į 504 00:39:48,190 --> 00:39:52,320 yra rodyklė daugiau vietos krūvos, kuri yra saugoti "bumo". 505 00:39:52,320 --> 00:39:55,150 Taigi, šis "bumo" kopija yra saugomas krūvos. 506 00:39:55,150 --> 00:39:58,780 Yra techniškai dvi kopijas "bumo" mūsų programoje. 507 00:39:58,780 --> 00:40:03,500 Yra pirmasis, kad tik šio "BOOM" styginių konstantos, 508 00:40:03,500 --> 00:40:09,250 , o antroji kopija "bumo", strcpy sukūrė "bumo" kopiją. 509 00:40:09,250 --> 00:40:13,100 Bet kopija "bumo" yra saugomi krūvos, ir krūvos esate laisvai keisti. 510 00:40:13,100 --> 00:40:17,250 Krūvos yra ne tik skaityti, todėl tai reiškia, kad [0] 511 00:40:17,250 --> 00:40:20,500 ketina leisti jums pakeisti "bumo" vertę. 512 00:40:20,500 --> 00:40:23,130 Ji ketina leisti pakeisti šiuos simbolius. 513 00:40:23,130 --> 00:40:26,640 >> Turite klausimų? 514 00:40:27,740 --> 00:40:29,290 Gerai. 515 00:40:29,290 --> 00:40:35,500 >> Persikėlimas į buggy3, tegul gdb buggy3. 516 00:40:35,500 --> 00:40:39,840 Mes tiesiog paleiskite jį ir matome mes gauname segfault. 517 00:40:39,840 --> 00:40:46,550 Jei mes Backtrace, yra tik dvi funkcijos. 518 00:40:46,550 --> 00:40:52,970 Jei mes einame į mūsų pagrindinę funkciją, mes matome,, kad mes segfaulted šioje eilutėje. 519 00:40:52,970 --> 00:41:00,180 Taigi, tiesiog žiūri į šią eilutę, už (int linija = 0; "fgets ši medžiaga nėra lygi NULL; 520 00:41:00,180 --> 00:41:03,770 linija + +). 521 00:41:03,770 --> 00:41:08,010 Mūsų ankstesnis kadras buvo vadinamas _IO_fgets. 522 00:41:08,010 --> 00:41:10,720 Pamatysite, kad su built-in C funkcijų daug, 523 00:41:10,720 --> 00:41:15,350 , kad, kai jūs gaunate segfault, ten bus tikrai paslaptingas funkcijų pavadinimuose 524 00:41:15,350 --> 00:41:18,090 kaip tai _IO_fgets. 525 00:41:18,090 --> 00:41:21,770 Bet tai vyksta, susijusios su šio fgets skambučio. 526 00:41:21,770 --> 00:41:25,850 Kažkur viduje čia, mes segfaulting. 527 00:41:25,850 --> 00:41:30,340 Jei pažvelgsime į argumentų fgets, mes galime atspausdinti buferio. 528 00:41:30,340 --> 00:41:41,180 Leiskite spausdinti - O, ne. 529 00:41:48,980 --> 00:41:51,900 Spausdinti nesiruošia tiksliai taip, kaip aš noriu jį dirbti. 530 00:41:55,460 --> 00:41:58,000 Pažvelkime į faktinį programos. 531 00:42:02,200 --> 00:42:09,640 Buferis yra simbolių masyvas. Tai skaitmenu rinkinys 128 simbolių. 532 00:42:09,640 --> 00:42:14,980 Taigi, kai aš sakau, spausdinimo buferio, tai ketinate spausdinti tuos 128 simboliai, 533 00:42:14,980 --> 00:42:18,300 Manau, tai, ko tikimasi. 534 00:42:18,300 --> 00:42:21,390 Ką aš ieškojau spausdinti buferio adresą, 535 00:42:21,390 --> 00:42:23,680 bet tai nereiškia, tikrai pasakyti, man daug. 536 00:42:23,680 --> 00:42:30,770 Taigi, kai aš atsitiktų, tai čia x buferis, tai rodo man 0xbffff090, 537 00:42:30,770 --> 00:42:38,690 kuri, jei prisiminti, iš anksčiau ar tam tikru momentu, Oxbffff linkęs būti kamino ish regionas. 538 00:42:38,690 --> 00:42:46,020 Kamino linkęs pradėti kažkur tik pagal 0xc000. 539 00:42:46,020 --> 00:42:51,890 Tiesiog matyti šį adresą, aš žinau, kad buferis vyksta kamino. 540 00:42:51,890 --> 00:43:04,500 Perkrauti savo programą, paleisti,, buferio mes matėme šią ženklų seką 541 00:43:04,500 --> 00:43:06,530 yra gana daug prasmės. 542 00:43:06,530 --> 00:43:12,270 Tada spausdinimo failą, ką failas atrodo? 543 00:43:15,120 --> 00:43:17,310 [Studentas] null. >> Taip. 544 00:43:17,310 --> 00:43:22,610 Failas yra tipo FILE *, todėl yra rodyklė, 545 00:43:22,610 --> 00:43:26,610 ir tos rodyklė vertė yra tuščias. 546 00:43:26,610 --> 00:43:33,240 Taigi fgets ketiname bandyti skaityti iš tos rodyklė netiesioginiu būdu, 547 00:43:33,240 --> 00:43:37,320 tačiau, norint pasiekti, kad žymeklį, jis turi dereference jį. 548 00:43:37,320 --> 00:43:40,550 Arba tam, kad būtų pasiekti, ką ji turėtų būti nukreipta į, ji dereferences, kurių. 549 00:43:40,550 --> 00:43:43,810 Taigi tai dereferencing NULL pointeris ir IT segfaults. 550 00:43:46,600 --> 00:43:48,730 Aš galėčiau iš naujo paleiskite jį ten. 551 00:43:48,730 --> 00:43:52,170 Jei mes pertrauka mūsų pagrindinį punktą ir paleisti, 552 00:43:52,170 --> 00:43:57,320 pirmoje eilutėje kodas yra char * filename = "nonexistent.txt"; 553 00:43:57,320 --> 00:44:00,870 Tai turėtų duoti gana didelis užuominą, kodėl ši programa nepavyksta. 554 00:44:00,870 --> 00:44:06,080 Rašyti kitą iškelia mane į kitą eilutę, kur aš atidaryti šį failą, 555 00:44:06,080 --> 00:44:11,140 ir tada aš iš karto gauti į mūsų linijos, kur, kai aš paspauskite šalia, ji ketina į segfault. 556 00:44:11,140 --> 00:44:16,880 Ar kas nors nori išmesti priežastis, kodėl mes galime būti segfaulting? 557 00:44:16,880 --> 00:44:19,130 [Studentas] Failo neegzistuoja. >> Taip. 558 00:44:19,130 --> 00:44:22,250 Tai turėtų būti užuomina 559 00:44:22,250 --> 00:44:29,570 kad, kai jūs atidarote failą, kurį reikia patikrinti, kad byla iš tikrųjų egzistuoja. 560 00:44:29,570 --> 00:44:31,510 Taigi čia, "nonexistent.txt"; 561 00:44:31,510 --> 00:44:34,700 Kai mes fopen failo vardas skaityti, mes tada reikia pasakyti, 562 00:44:34,700 --> 00:44:45,870 if (failas == NULL) ir sako: printf ("Failas neegzistuoja!" 563 00:44:45,870 --> 00:44:56,340 arba - dar geriau - filename); return 1; 564 00:44:56,340 --> 00:45:00,300 Taigi dabar mes patikrinti, pamatyti, jei ji yra NULL 565 00:45:00,300 --> 00:45:03,930 prieš faktiškai tęsti ir bando skaityti iš šio failo. 566 00:45:03,930 --> 00:45:08,800 Mes galime perdaryti jį tik pamatyti, kad darbus. 567 00:45:11,020 --> 00:45:14,970 Siekiama įtraukti naują eilutę. 568 00:45:21,090 --> 00:45:25,290 Taigi dabar nonexistent.txt neegzistuoja. 569 00:45:26,890 --> 00:45:30,040 Jūs visada turėtumėte patikrinti, ar šis dalykas rūšiuoti. 570 00:45:30,040 --> 00:45:33,870 Jūs visada turėtumėte patikrinti, norėdami pamatyti, jei fopen grąžina NULL. 571 00:45:33,870 --> 00:45:38,170 Jūs visada turėtumėte patikrinti, įsitikinti, kad malloc negrįžta NULL, 572 00:45:38,170 --> 00:45:41,410 arba kita jums segfault. 573 00:45:42,200 --> 00:45:45,930 >> Dabar buggy4.c. 574 00:45:49,190 --> 00:45:58,440 Veikia. Spėju, kad šis laukia pirkimo arba galbūt begalinis Looping. 575 00:45:58,440 --> 00:46:01,870 Taip, tai begalinis Looping. 576 00:46:01,870 --> 00:46:05,560 Taigi buggy4. Atrodo, kad mes begalinis Looping. 577 00:46:05,560 --> 00:46:12,590 Mes galime sulaužyti pagrindinis, paleisti mūsų programą. 578 00:46:12,590 --> 00:46:20,180 Į gdb, kaip ilgai, kaip jūs naudojate santrumpa yra vienareikšmis 579 00:46:20,180 --> 00:46:23,420 arba specialios santrumpos, kad jie suteiks jums, 580 00:46:23,420 --> 00:46:29,020 tada galite naudoti n naudoti kitą vietoj to, kad įvesti kitą visą kelią. 581 00:46:29,020 --> 00:46:33,730 Ir dabar, kad aš hit n kartą, aš galiu tiesiog paspauskite Enter, kad nuolat vyksta šalia 582 00:46:33,730 --> 00:46:36,640 vietoj to, kad pasiektų n Įveskite n Įveskite n Įveskite. 583 00:46:36,640 --> 00:46:44,630 Atrodo, kad aš esu tam tikros rūšies for ciklas, kuriame masyvas [i] 0. 584 00:46:44,630 --> 00:46:50,510 Jis atrodo, kaip aš niekada išeities tai už linijos. 585 00:46:50,510 --> 00:46:54,780 Jei galiu atspausdinti aš, todėl aš yra 2, tada aš eiti toliau. 586 00:46:54,780 --> 00:46:59,250 Aš spausdinti i, i 3, tada aš eiti toliau. 587 00:46:59,250 --> 00:47:05,360 Aš spausdinti i ir i yra 3. Kitas, spausdinti i, i 4. 588 00:47:05,360 --> 00:47:14,520 Tiesą sakant, spausdinti sizeof (array), todėl masyvo dydis yra 20. 589 00:47:16,310 --> 00:47:32,870 Bet atrodo, kad yra keletas specialios gdb komanda vyksta kol kas nors atsitiks. 590 00:47:32,870 --> 00:47:37,620 Tai kaip nustatyti sąlygą kintamojo vertę. Bet aš nepamenu, kas tai yra. 591 00:47:37,620 --> 00:47:44,100 Taigi, jei mes nuolat vyksta - 592 00:47:44,100 --> 00:47:47,120 Ką tu sakai? Ką jums atnešti? 593 00:47:47,120 --> 00:47:50,500 [Studentas] Ar rodyti i Įdėti >> Taip. Taigi, rodyti, aš galiu padėti. 594 00:47:50,500 --> 00:47:54,530 Jei mes tiesiog i rodyti, jis bus įdėti čia ką i reikšmė yra 595 00:47:54,530 --> 00:47:56,470 todėl aš neturiu atspausdinti jį kiekvieną kartą. 596 00:47:56,470 --> 00:48:02,930 Jei mes tiesiog nuolat vyksta šalia, mes matome, 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 Kažkas vyksta siaubingai negerai, ir aš yra atstatyti į 0. 598 00:48:13,330 --> 00:48:22,220 Žiūri buggy4.c, mes matome, kas atsitinka, yra int masyvas [5]; 599 00:48:22,220 --> 00:48:26,200 (i = 0; i <= sizeof (array); + +) 600 00:48:26,200 --> 00:48:28,550 masyvas [i] = 0; 601 00:48:28,550 --> 00:48:31,390 Ką mes matome, kad negerai čia? 602 00:48:31,390 --> 00:48:39,480 Kaip užuominą,, kai darau gdb buggy4 - tegul pertrauka pagrindinis, paleisti - 603 00:48:39,480 --> 00:48:45,980 Aš spausdinimo sizeof (array) tik pamatyti, ką ši sąlyga yra, kur aš pagaliau išeiti. 604 00:48:47,690 --> 00:48:51,100 Kur aš esu? Ar galiu paleisti? 605 00:48:51,100 --> 00:48:54,280 Aš dar nedeklaravo. 606 00:48:54,280 --> 00:48:58,680 Taigi spausdinti sizeof (array), ir tai yra 20, 607 00:48:58,680 --> 00:49:06,690 kuri, kaip tikimasi, nes mano matrica yra dydis 5, ir tai iš 5 sveikųjų skaičių, 608 00:49:06,690 --> 00:49:12,410 todėl visą dalykas turi būti 5 * sizeof (int) baitų, sizeof (int) tendenciją būti 4. 609 00:49:12,410 --> 00:49:14,780 Taigi, sizeof (masyvas) yra 20. 610 00:49:14,780 --> 00:49:17,420 Ką tai turėtų būti? 611 00:49:17,420 --> 00:49:21,720 [Studentas] Padalinta iš sizeof (int). >> Taip, / sizeof (int). 612 00:49:21,720 --> 00:49:30,630 Atrodo, kad dar yra problema čia. Manau, kad tai turėtų būti tik < 613 00:49:30,630 --> 00:49:36,960 , nes tai beveik visada tarp 00:49:44,860 Dabar pagalvokime apie tai, kodėl tai iš tikrųjų buvo sulaužytas. 615 00:49:44,860 --> 00:49:53,370 Ar kas nors turite spėlionės kodėl buvo atstatyti į 0 per kiekvieną kilpą iteracijos? 616 00:50:01,300 --> 00:50:09,350 Viduje, kad čia vyksta vienintelis dalykas, yra tai, kad masyvas [i] yra nustatytas į 0. 617 00:50:09,350 --> 00:50:15,350 Taigi kažkaip, tai kodo eilutę reiškia, kad mūsų int i būti nustatyta į 0. 618 00:50:16,730 --> 00:50:23,130 [Studentas] gali būti, nes tai neatsižvelgti į šio I dalis atmintį 619 00:50:23,130 --> 00:50:27,970 , kai ji mano, kad tai kitas masyvo elementas? >> [Bowden] Taip. 620 00:50:27,970 --> 00:50:33,880 Kai mes einame už mūsų masyvo pabaigos, 621 00:50:33,880 --> 00:50:39,870 kažkaip, kad erdvė, kad mes privalomaisiais svarbesnio ï vertę. 622 00:50:39,870 --> 00:50:48,030 Ir todėl, jei mes žiūrime į buggy4, pertrauka Main, paleisti, 623 00:50:48,030 --> 00:50:53,120 galime spausdinti ï adresą. 624 00:50:53,120 --> 00:50:57,280 Atrodo, kad jis yra bffff124. 625 00:50:57,280 --> 00:51:03,930 Dabar galime spausdinti adresas masyvo [0]. 110. 626 00:51:03,930 --> 00:51:06,290 Ką apie [1]? 114. 627 00:51:06,290 --> 00:51:07,920 [2], 118. 628 00:51:07,920 --> 00:51:14,530 11c, 120. masyvas [5] bfff124. 629 00:51:14,530 --> 00:51:26,990 Taigi masyvas [5] turi tą patį adresą, kaip aš, o tai reiškia, kad masyvas [5] yra i. 630 00:51:26,990 --> 00:51:30,720 , Jei jie turi tą patį adresą, jie yra tas pats dalykas. 631 00:51:30,720 --> 00:51:38,410 Taigi, kai mes masyvas [5], kad būtų 0, mes nustatome i 0. 632 00:51:38,410 --> 00:51:46,070 Ir jei jūs manote apie tai kamino, 633 00:51:46,070 --> 00:51:55,590 int i pirma yra paskelbtas, o tai reiškia, i gauna šiek tiek erdvės kamino. 634 00:51:55,590 --> 00:52:04,730 Tada masyvas [5] paskirstoma taip, tada 20 baitų skiriama kamino. 635 00:52:04,730 --> 00:52:08,400 Taigi, aš bus skiriama pirmą kartą, tada šie 20 baitų gauti skiriama. 636 00:52:08,400 --> 00:52:11,400 Taigi, aš nutinka prieš masyvo, 637 00:52:11,400 --> 00:52:19,230 ir dėl to, kaip, kaip aš praėjusią savaitę sakė, kur techniškai kamino auga žemyn, 638 00:52:19,230 --> 00:52:28,520 , kai į masyvo indeksas, mes garantuoti, kad 0. pozicija masyve 639 00:52:28,520 --> 00:52:31,970 visada vyksta prieš pirmąjį poziciją masyve. 640 00:52:31,970 --> 00:52:35,900 Tai yra natūra, kaip aš išsitraukė jį praėjusią savaitę. 641 00:52:35,900 --> 00:52:42,210 Atkreipkite dėmesį, kad apačioje turime Adresas 0 viršuje turime adresas Max. 642 00:52:42,210 --> 00:52:44,880 Kamino visada auga žemyn. 643 00:52:48,100 --> 00:52:53,500 Leiskite pasakyti, kad mes skirti i. 644 00:52:53,500 --> 00:52:59,680 Mes skirti sveikasis skaičius i, o tai reiškia, tegul tiesiog pasakyti, čia sveikasis skaičius i gauna skirta. 645 00:52:59,680 --> 00:53:06,420 Tada mes skirti mūsų 5 sveikųjų skaičių masyvas, tai reiškia, kad apačioje, kad, 646 00:53:06,420 --> 00:53:11,230 nuo kamino auga, tie 5 sveikieji skaičiai, gauti skiriama. 647 00:53:11,230 --> 00:53:15,900 Bet kadangi, kaip matricos dirbti, mes garantuojame, kad pirmoji vieta masyve 648 00:53:15,900 --> 00:53:22,260 visada yra adresas yra mažesnis nei antrojo masyvo dalykas. 649 00:53:22,260 --> 00:53:28,270 Taigi matrica pozicija 0 visada turi įvykti pirmoji atminties, 650 00:53:28,270 --> 00:53:30,700 kadangi masyvas 1 padėtis turi įvykti po to 651 00:53:30,700 --> 00:53:33,310 ir masyvo pozicija 2 turi įvykti po to, 652 00:53:33,310 --> 00:53:37,900 o tai reiškia, kad matrica pozicija 0 nutiktų, kažkur žemyn čia, 653 00:53:37,900 --> 00:53:40,690 masyvas 1 padėtis nutiktų, kas išdėstyta pirmiau, 654 00:53:40,690 --> 00:53:45,530 nes juda aukštyn reiškia didesnes adresus, nes didžiausia adresas yra čia. 655 00:53:45,530 --> 00:53:50,490 Taigi masyvas [0] Žemyn čia, masyvas [1] iki čia, masyvas [2] iki čia, masyvas [3] čia. 656 00:53:50,490 --> 00:53:55,620 Atkreipkite dėmesį, kaip prieš skyrėme sveikasis skaičius, aš visą kelią iki čia, 657 00:53:55,620 --> 00:54:01,040 kaip mes judėti toliau ir toliau į mūsų masyvas, mes vis arčiau ir arčiau mūsų sveikojo skaičiaus i. 658 00:54:01,040 --> 00:54:07,640 Jis tiesiog taip atsitinka masyvo, [5], kuri yra viena vieta už mūsų masyvas, 659 00:54:07,640 --> 00:54:13,010 yra tiksliai, kur sveikasis skaičius man teko būti skiriama. 660 00:54:13,010 --> 00:54:16,920 Taigi, kad yra vieta, kur mes atsitiktų būti pataikyti vietos kamino 661 00:54:16,920 --> 00:54:21,680 integer i kuri buvo skirta, ir mes nustatant, kad 0. 662 00:54:21,680 --> 00:54:26,160 >> Štai kaip tai veikia. Turite klausimų? Taip. 663 00:54:26,160 --> 00:54:30,710 [Studentas] Never mind. Gerai. 664 00:54:30,710 --> 00:54:33,090 [Studentas] Kaip išvengti šių klaidų rūšiuoti? 665 00:54:33,090 --> 00:54:41,190 Šių klaidų rūšiuoti? Nenaudokite savo programavimo kalbą C. 666 00:54:41,190 --> 00:54:45,840 Naudoti kalbą, kuri yra masyvo ribas kontrolės. 667 00:54:45,840 --> 00:54:55,900 Tol, kol jūs esate atsargus, jums tiesiog reikia, kad būtų išvengta vyksta praeityje jūsų masyvo ribų. 668 00:54:55,900 --> 00:54:58,300 [Studentas] Taigi čia, kai mes Eime praeityje jūsų masyvo ribų 669 00:54:58,300 --> 00:55:01,840 [Bowden] Štai kur ko pradėti going wrong. >> [Studentas] O, gerai. 670 00:55:01,840 --> 00:55:05,730 Tol, kol jūs likti per jūsų masyvo paskirtą atmintį, jūs gerai. 671 00:55:05,730 --> 00:55:12,400 Tačiau C nedaro klaidų. Jei aš masyvas [1000], tai mielai tiesiog pakeisti, kas beatsitiktų - 672 00:55:12,400 --> 00:55:16,500 Jis eina į masyvo pradžioje, tada jis eina 1000 pozicijas po ir nustatyta į 0. 673 00:55:16,500 --> 00:55:20,000 Jis nedaro jokių patikrinti, kad oh, tai ne iš tikrųjų turėti 1000 dalykų. 674 00:55:20,000 --> 00:55:22,750 1000 yra būdas ne tik tai, ką aš turėtų būti pakeisti, 675 00:55:22,750 --> 00:55:26,940 kadangi Java arba kažkas jums gauti masyvas iš greitai indeksas 676 00:55:26,940 --> 00:55:29,820 arba indekso, išskyrus tam tikras ribas. 677 00:55:29,820 --> 00:55:33,950 Štai kodėl daug aukštesnio lygio kalbų šiuos dalykus 678 00:55:33,950 --> 00:55:37,340 kur, jei jūs einate už masyvo ribų, jums nepavyksta 679 00:55:37,340 --> 00:55:40,070 taip, kad jūs negalite pakeisti dalykų su Jumis 680 00:55:40,070 --> 00:55:42,590 ir tada viskas vyks daug blogiau nei tiesiog gauti išimtį 681 00:55:42,590 --> 00:55:44,940 suprantama, kad jūs nuėjo už masyvo pabaigos. 682 00:55:44,940 --> 00:55:50,970 [Studentas] Ir tokiu būdu mes ką tik pasikeitė <= tiesiog > [Bowden] Yeah. 683 00:55:50,970 --> 00:55:54,800 Ji turėtų būti 00:55:59,560 nes sizeof (array) yra 20, bet mes tik norime, 5. >> [Studentas] Teisė. 685 00:55:59,560 --> 00:56:04,060 Daugiau klausimų? Gerai. 686 00:56:04,060 --> 00:56:07,380 >> [Studentas] Turiu klausimą. >> Taip. 687 00:56:07,380 --> 00:56:16,440 [Studentas] Kas yra tikrasis masyvo kintamasis? 688 00:56:16,440 --> 00:56:20,000 [Bowden] Kaip, kas yra masyvas? 689 00:56:20,000 --> 00:56:24,930 Masyvas pati yra simbolis. 690 00:56:24,930 --> 00:56:31,490 Tai tik iš 20 baitų, kad mes nuorodų pradžios adresas. 691 00:56:31,490 --> 00:56:38,070 Jūs galite galvoti apie tai, kaip žymeklis, tačiau ji yra pastovi rodyklė. 692 00:56:38,070 --> 00:56:44,140 Kuo greičiau viskas susitvarko rengiami, kintamasis matrica neegzistuoja anymore. 693 00:56:44,140 --> 00:56:48,210 [Studentas] Taigi, kaip tai rasti masyvo dydį? 694 00:56:48,210 --> 00:56:54,130 Masyvo dydis reiškia to bloko dydžio, kad šis simbolis yra susijusi su. 695 00:56:54,130 --> 00:57:01,240 Kai aš kažką panašaus printf ("% p \ n", masyvas); 696 00:57:01,240 --> 00:57:05,140 tegul jį paleisti. 697 00:57:12,960 --> 00:57:15,530 Ką aš tiesiog padaryti neteisingai? 698 00:57:15,530 --> 00:57:19,220 Array "masyvas" pateikiamas čia. 699 00:57:20,820 --> 00:57:23,200 O, čia. 700 00:57:23,200 --> 00:57:31,250 Apsukite metalinis garsas yra protingas, ir tai atsitinka pastebėti, kad Aš paskelbiau kaip 5 elementų masyvo 701 00:57:31,250 --> 00:57:34,540 bet aš indeksavimo į poziciją 1000. 702 00:57:34,540 --> 00:57:38,450 Ji gali tai daryti, nes tai yra tik konstantos. 703 00:57:38,450 --> 00:57:43,370 Jis gali tik eiti taip toli pastebėti, kad aš ruošiuosi už masyvo ribų. 704 00:57:43,370 --> 00:57:46,880 , Bet pastebėsite, anksčiau, kai mes turėjo galiu būti neteisingas, 705 00:57:46,880 --> 00:57:51,040 tai niekaip negali nustatyti, kiek vertės galėčiau imtis, 706 00:57:51,040 --> 00:57:55,540 todėl ji negali nustatyti, kad aš buvau ketinate už masyvo pabaigos. 707 00:57:55,540 --> 00:57:59,430 Tai tiesiog Apsukite metalinis garsas yra protingas. 708 00:57:59,430 --> 00:58:03,340 >> Bet dabar buggy4. Taigi, ką dar aš darau blogai? 709 00:58:03,340 --> 00:58:05,970 Netiesiogiai skelbiantis bibliotekos funkcija printf ". 710 00:58:05,970 --> 00:58:14,960 Aš einu, kad nori # include . 711 00:58:14,960 --> 00:58:18,710 Gerai. Dabar veikia buggy4. 712 00:58:18,710 --> 00:58:24,840 Spausdinti masyvo vertę, kaip aš čia, spausdinimo jį kaip rodykle 713 00:58:24,840 --> 00:58:30,060 grafika kažkas, kad atrodo taip - bfb8805c - kai adresas 714 00:58:30,060 --> 00:58:33,450 tai kamino ish regione. 715 00:58:33,450 --> 00:58:41,820 Masyvas pati yra kaip žymeklis, bet tai nėra tikrasis rodyklė, 716 00:58:41,820 --> 00:58:45,410 nes reguliariai rodyklė, mes galime pakeisti. 717 00:58:45,410 --> 00:58:54,700 Masyvas yra tik keletas pastovus. 20 atminties blokai pradėti adresu 0xbfb8805c. 718 00:58:54,700 --> 00:59:09,020 Taigi bfb8805c per šiuo adresu +20- ar aš atspėti -20 - 719 00:59:09,020 --> 00:59:17,400 yra visi atminties, skirto šio masyvo. 720 00:59:17,400 --> 00:59:20,350 Masyvas, kintamasis savaime nėra saugomi bet kur. 721 00:59:20,350 --> 00:59:27,660 Kai jūs sudarymą, sudarytojas - į jį ranka banga - 722 00:59:27,660 --> 00:59:33,060 bet kompiliatorius tiesiog naudoti kur jis žino, masyvas. 723 00:59:33,060 --> 00:59:36,090 Ji žino, kur tas masyvas prasideda, 724 00:59:36,090 --> 00:59:40,910 ir todėl ji gali visada tiesiog daryti tai, ko Kompensacijų nuo tos pradžios. 725 00:59:40,910 --> 00:59:43,960 Ji nebūtinai turi kintamąjį pati atstovauti masyvo. 726 00:59:43,960 --> 00:59:53,730 Bet kai aš kažką panašaus int * p = masyvo; dabar p - rodyklė, kuri nurodo masyvo, 727 00:59:53,730 --> 00:59:57,830 ir dabar p tikrųjų egzistuoja kamino. 728 00:59:57,830 --> 01:00:01,950 Aš esu laisvai keisti psl. Galiu padaryti p = malloc. 729 01:00:01,950 --> 01:00:06,500 Taigi, jis iš pat pradžių atkreipė dėmesį į masyvą, dabar ji pažymi, kad šiek tiek erdvės krūvos. 730 01:00:06,500 --> 01:00:09,620 Aš negaliu to padaryti masyvai = malloc. 731 01:00:09,620 --> 01:00:13,710 Jei Apsukite metalinis garsas yra protingas, jis bus klykauti ne man Iškart. 732 01:00:17,000 --> 01:00:21,430 Tiesą sakant, aš esu gana įsitikinęs, gcc tai padaryti per. 733 01:00:21,430 --> 01:00:25,010 Taigi masyvas tipas 'int [5] "nėra jam priskiriamos pajamos. 734 01:00:25,010 --> 01:00:28,040 Jūs negalite priskirti kažką masyvo tipo 735 01:00:28,040 --> 01:00:30,500 nes masyvas yra tik konstanta. 736 01:00:30,500 --> 01:00:34,760 Tai yra simbolis, kuris nuorodos šie 20 baitų. Aš negaliu pakeisti. 737 01:00:34,760 --> 01:00:37,690 >> [Studentas] Ir kur yra saugomi masyvo dydis? 738 01:00:37,690 --> 01:00:40,670 [Bowden] Tai niekur nėra saugomi. Tai, kai jis sudarant. 739 01:00:40,670 --> 01:00:46,310 Taigi, kur yra saugomi masyvo dydis? 740 01:00:46,310 --> 01:00:51,870 Galite naudoti tik sizeof (masyvas) viduje funkciją, masyvas pasiskelbė. 741 01:00:51,870 --> 01:01:03,150 Taigi, jei aš galiu padaryti tam tikrą funkciją, foo, ir aš (int masyvas []) 742 01:01:03,150 --> 01:01:10,450 printf ("% d \ n", sizeof (array)); 743 01:01:10,450 --> 01:01:21,330 ir tada žemyn, čia aš vadinu foo (masyvas); 744 01:01:21,330 --> 01:01:24,840 šios funkcijos viduje - galime jį paleisti. 745 01:01:34,200 --> 01:01:36,840 Tai Apsukite metalinis garsas vėl yra protingas. 746 01:01:36,840 --> 01:01:43,890 Jis man sako, kad sizeof masyvo funkcijos parametras 747 01:01:43,890 --> 01:01:46,690 grįš dydis 'int *'. 748 01:01:46,690 --> 01:01:55,150 Tai būtų klaida, jei tai ne tai, ką norėjau, kad taip atsitiktų. 749 01:01:55,150 --> 01:01:58,960 Leiskite išjungti Werror. 750 01:02:14,950 --> 01:02:17,590 Įspėjimas. Įspėjimai gerai. 751 01:02:17,590 --> 01:02:19,960 Jis vis dar sudaryti tol, kol jis turi įspėjimą. 752 01:02:19,960 --> 01:02:22,910 . / A.out ketinate spausdinti 4. 753 01:02:22,910 --> 01:02:28,650 Įspėjimas, kuris buvo sukurtas aiškus rodiklis, kas nutiko. 754 01:02:28,650 --> 01:02:34,120 Šis int masyvas yra tik ketina spausdinti sizeof (int *). 755 01:02:34,120 --> 01:02:39,790 Net jei aš įdėti masyvas [5] čia, tai dar tik ketinate spausdinti sizeof (int *). 756 01:02:39,790 --> 01:02:47,440 Todėl, kai tik jums perduoti į funkciją, skirtumas tarp matricas ir rodyklės 757 01:02:47,440 --> 01:02:49,670 neegzistuoja. 758 01:02:49,670 --> 01:02:52,640 Panašu, kad tai masyvas, kuri buvo paskelbta kamino, 759 01:02:52,640 --> 01:02:58,300 bet kaip tik mes pereiname tą vertę, kad 0xbf blah, blah, blah į šią funkciją, 760 01:02:58,300 --> 01:03:03,350 rodyklė nurodo masyvo, kamino. 761 01:03:03,350 --> 01:03:08,310 Taigi, tai reiškia, kad sizeof taikoma tik funkciją, masyvas buvo paskelbta, 762 01:03:08,310 --> 01:03:11,230 , o tai reiškia, kad, kai jūs sudarant šią funkciją, 763 01:03:11,230 --> 01:03:17,330 Apsukite metalinis garsas eina per šią funkciją, jo manymu, masyvas int masyvas dydis 5. 764 01:03:17,330 --> 01:03:20,640 Taip, tada ji mato, sizeof (array). Na, tai 20. 765 01:03:20,640 --> 01:03:26,440 Kad iš tikrųjų, kaip sizeof iš esmės veikia beveik visais atvejais. 766 01:03:26,440 --> 01:03:31,150 Sizeof tai ne funkcija, tai operatorius. 767 01:03:31,150 --> 01:03:33,570 Jūs neturite skambinti sizeof funkciją. 768 01:03:33,570 --> 01:03:38,280 Sizeof (int), kompiliatorių bus tik išversti, kad iki 4. 769 01:03:41,480 --> 01:03:43,700 Got it? Gerai. 770 01:03:43,700 --> 01:03:47,520 >> [Studentas] Taigi, kas yra skirtumas tarp sizeof (array) pagrindinis ir foo? 771 01:03:47,520 --> 01:03:52,840 Tai yra todėl, kad mes sakome sizeof (array), kuris yra tipo int *, 772 01:03:52,840 --> 01:03:57,120 kadangi masyvas žemyn čia yra ne tipo int *, tai int masyvas. 773 01:03:57,120 --> 01:04:04,540 >> [Studentas] Taigi, jei jums turėjo parametrą masyvas [], o ne int * masyvas, 774 01:04:04,540 --> 01:04:09,230 reikštų, kad jūs vis dar gali pakeisti masyvas nes dabar rodyklė? 775 01:04:09,230 --> 01:04:14,250 [Bowden] Kaip tai? >> [Studentas] Yeah. Galite pakeisti masyvas per funkcija? 776 01:04:14,250 --> 01:04:18,420 [Bowden] Jūs galite pakeisti masyvo abiem atvejais. 777 01:04:18,420 --> 01:04:23,130 Abiem šiais atvejais esate laisvai pasakyti, masyvas [4] = 0. 778 01:04:23,130 --> 01:04:26,590 [Studentas] Bet jūs galite padaryti masyvo tašką į ką nors kita? 779 01:04:26,590 --> 01:04:30,230 [Bowden] Oh. Taip. Bet kuriuo atveju - >> [studentas] Yeah. 780 01:04:30,230 --> 01:04:38,410 [Bowden] Skirtumas tarp masyvas [] ir int * masyvas, nėra nė vieno. 781 01:04:38,410 --> 01:04:42,570 Taip pat galite gauti kai daugialypį masyvas čia 782 01:04:42,570 --> 01:04:47,050 dėl tam tikrų patogioje sintaksė, bet tai dar tik rodyklė. 783 01:04:47,050 --> 01:04:56,400 Tai reiškia, kad aš esu laisvai daryti, masyvas = malloc (sizeof (int)), o dabar atkreipti kažkur kitur. 784 01:04:56,400 --> 01:04:59,610 Bet tiesiog patinka, kaip tai veikia amžinai ir visada, 785 01:04:59,610 --> 01:05:03,210 keičiant šį masyvą todėl atkreipti dėmesį į ką nors kita 786 01:05:03,210 --> 01:05:07,570 nekeičia šio masyvo čia, nes tai argumentu, kopija, 787 01:05:07,570 --> 01:05:10,780 tai ne rodyklė į šį argumentą. 788 01:05:10,780 --> 01:05:16,070 Ir iš tikrųjų, kaip nuoroda, kad tai lygiai tas pats - 789 01:05:16,070 --> 01:05:21,100 mes jau pamatė, ką spausdinimo masyvo spaudinius - 790 01:05:21,100 --> 01:05:31,410 ką daryti, jei mes spausdinti iš masyvo adresą arba adresą masyvo adresą 791 01:05:31,410 --> 01:05:36,290 viena iš šių dviejų? 792 01:05:41,770 --> 01:05:45,220 Ignoruoti šį vieną. 793 01:05:48,140 --> 01:05:51,660 Gerai. Tai yra gerai. Dabar jis veikia / a.out. 794 01:05:51,660 --> 01:06:00,220 Spausdinimo masyvas, tada spausdinti masyvo adresą, yra tas pats dalykas. 795 01:06:00,220 --> 01:06:02,870 Masyvas tiesiog neegzistuoja. 796 01:06:02,870 --> 01:06:08,190 Ji žino, kai jūs spausdinate masyvas, jūs spausdinate simbolį, kuris reiškia, kad šių 20 baitų. 797 01:06:08,190 --> 01:06:11,940 Spausdinti masyvo adresą, gerai, masyvas neturi egzistuoti. 798 01:06:11,940 --> 01:06:17,200 Ji neturi adresą, taigi jis tiesiog spausdina šių 20 baitų adresą. 799 01:06:20,820 --> 01:06:28,150 Kuo greičiau jums sudaryti, kaip ir savo sukompiliuotą buggy4. / A.out 800 01:06:28,150 --> 01:06:30,340 matrica neegzistuoja. 801 01:06:30,340 --> 01:06:33,640 Pointeriai egzistuoja. Masyvai to padaryti negali. 802 01:06:34,300 --> 01:06:38,060 Atminties blokai, atstovaujantys masyvo vis dar egzistuoja, 803 01:06:38,060 --> 01:06:43,270 tačiau tokio tipo kintamasis masyvo ir kintamieji nėra. 804 01:06:46,260 --> 01:06:50,270 Tie, kurie, pavyzdžiui, pagrindinių skirtumų tarp matricas ir rodykles 805 01:06:50,270 --> 01:06:55,590 kuo greičiau padaryti funkcijų iškvietimų, nėra jokio skirtumo. 806 01:06:55,590 --> 01:07:00,460 Bet viduje funkciją, masyvo pati yra paskelbta, sizeof veikia skirtingai 807 01:07:00,460 --> 01:07:05,190 nes jūs spausdinate vietoj tipo dydžio blokų dydį, 808 01:07:05,190 --> 01:07:08,950 ir jūs negalite pakeisti jį, nes jis yra simbolis. 809 01:07:08,950 --> 01:07:14,370 Spausdinimas dalykas ir adresą dalykas spausdina tą patį. 810 01:07:14,370 --> 01:07:18,480 Ir kad gana daug. 811 01:07:18,480 --> 01:07:20,820 [Studentas] Ar galite pasakyti, kad dar kartą? 812 01:07:21,170 --> 01:07:24,170 Aš galėčiau ką nors praleido. 813 01:07:24,170 --> 01:07:29,260 Spausdinimo masyvas ir adresas masyvo spausdina tą patį, 814 01:07:29,260 --> 01:07:33,180 kadangi jei spausdinate Versus rodyklė adresas žymeklį, 815 01:07:33,180 --> 01:07:36,010 vienas dalykas, spausdina, ką jūs nukreipta į adresą, 816 01:07:36,010 --> 01:07:40,360 kitų spaudinių kamino rodyklė adresą. 817 01:07:40,360 --> 01:07:47,040 Galite pakeisti pelės žymeklį, jūs negalite pakeisti masyvo simbolį. 818 01:07:47,740 --> 01:07:53,270 Ir sizeof žymeklis ketinate spausdinti tos rodyklės tipo dydį. 819 01:07:53,270 --> 01:07:57,470 Taigi, int * p sizeof (p) ketinate spausdinti 4 820 01:07:57,470 --> 01:08:04,110 bet int masyvas [5] Spausdinti sizeof (masyvas) ketinate spausdinti 20. 821 01:08:04,110 --> 01:08:07,480 [Studentas] int masyvas [5] bus atspausdinti 20? >> Taip. 822 01:08:07,480 --> 01:08:13,300 Štai kodėl viduje buggy4, kai ji naudojama sizeof (array) 823 01:08:13,300 --> 01:08:16,660 tai darė i <20, o tai yra ne tai, ką norėjo. 824 01:08:16,660 --> 01:08:20,880 Mes norime, I <5. >> [Studentas] Gerai. 825 01:08:20,880 --> 01:08:25,569 [Bowden] Ir tada, kai, kaip jums pradėti perduoti funkcijų, 826 01:08:25,569 --> 01:08:34,340 jei mes int * p = array; 827 01:08:34,340 --> 01:08:39,779 šios funkcijos viduje, mes iš esmės gali naudoti P ir masyvo lygiai tais pačiais būdais, 828 01:08:39,779 --> 01:08:43,710 išskyrus sizeof problemos ir besikeičiančios problema. 829 01:08:43,710 --> 01:08:49,810 Bet p [0] = 1; yra tas pats, kaip pasakyti masyvas [0] = 1; 830 01:08:49,810 --> 01:08:55,600 Ir kuo greičiau, kaip mes sakome, foo (masyvas), arba foo (p); 831 01:08:55,600 --> 01:08:59,760 viduje foo funkcija, tai yra tas pats skambutis du kartus. 832 01:08:59,760 --> 01:09:03,350 Yra skirtumas tarp šių dviejų skambučių. 833 01:09:07,029 --> 01:09:11,080 >> Kiekvienas gerai? Gerai. 834 01:09:14,620 --> 01:09:17,950 Mes turime 10 minučių. 835 01:09:17,950 --> 01:09:28,319 >> Mes pasistengsime gauti per šio Hacker typer programos, 836 01:09:28,319 --> 01:09:32,350 šioje svetainėje, kuris išėjo pernai ar kažką. 837 01:09:34,149 --> 01:09:41,100 Tai tiesiog turėtų būti kaip jūs įvedate atsitiktinai ir ji spausdina 838 01:09:41,100 --> 01:09:46,729 Nepriklausomai byla taip atsitinka, kad įdėjote, kas atrodo, kad jūs įvedėte. 839 01:09:46,729 --> 01:09:52,069 Atrodo, kad kažkoks operacinės sistemos kodas. 840 01:09:53,760 --> 01:09:56,890 Štai ką norime įgyvendinti. 841 01:10:08,560 --> 01:10:11,690 Jūs turite failus vykdomais pavadinimu hacker_typer 842 01:10:11,690 --> 01:10:14,350 kad mano vieną argumentą, failo "hacker tipo." 843 01:10:14,350 --> 01:10:16,480 Paleisti vykdomąjį turėtų išvalyti ekraną 844 01:10:16,480 --> 01:10:20,850 ir tada atsispausdinti iš praėjo rinkmenų, kiekvieną kartą, kai vartotojas paspaudžia klavišą, vieną simbolį. 845 01:10:20,850 --> 01:10:24,990 Taigi kokia raktas paspaudžiate, tai turėtų išmesti, o vietoj to atspausdinti simbolį iš failo 846 01:10:24,990 --> 01:10:27,810 tai yra argumentas. 847 01:10:29,880 --> 01:10:34,350 Aš gana daug pasakyti jums, ką yra tai, ką mes ketiname reikia žinoti. 848 01:10:34,350 --> 01:10:36,440 Bet mes norime patikrinti termios biblioteką. 849 01:10:36,440 --> 01:10:44,840 Aš niekada naudojamas šią biblioteką per visą savo gyvenimą, todėl ji turi labai nedaug tikslais. 850 01:10:44,840 --> 01:10:48,610 Bet tai bus biblioteka, mes galime naudoti išmesti simbolį, kurį nukentėjo 851 01:10:48,610 --> 01:10:52,390 kai jūs renkate į standartą in 852 01:10:56,970 --> 01:11:05,840 Taigi hacker_typer.c, ir mes ketiname norite # include . 853 01:11:05,840 --> 01:11:12,870 Žiūri žinyno puslapyje termios - I 'atspėti galinius OS ar kažką - 854 01:11:12,870 --> 01:11:16,240 Aš nežinau, kaip jį perskaityti. 855 01:11:16,240 --> 01:11:21,040 Žiūri į tai, ji sako, įtraukti šiuos 2 failus, kad mes tai padarysime. 856 01:11:37,620 --> 01:11:46,820 >> Pirmas dalykas, pirma, mes norime imtis vieną argumentą, kuris yra failas turėtume atidaryti. 857 01:11:46,820 --> 01:11:52,420 Taigi, ką aš noriu daryti? Kaip aš galiu patikrinti, turiu vieną argumentą? 858 01:11:52,420 --> 01:11:56,480 [Studentas] Jei argc lygus. >> [Bowden] Yeah. 859 01:11:56,480 --> 01:12:21,250 Taigi, jei (argc = 2!) Printf ("Naudojimas:% s [failą atidaryti]"). 860 01:12:21,250 --> 01:12:32,750 Taigi dabar, jei aš paleisti tai be suteikti antrą argumentą - O, aš turiu naują liniją - 861 01:12:32,750 --> 01:12:36,240 pamatysite, ji sako, naudojimas: / hacker_typer 862 01:12:36,240 --> 01:12:39,770 ir tada Antrasis argumentas turėtų būti aš noriu atidaryti failą. 863 01:12:58,430 --> 01:13:01,260 Dabar ką man daryti? 864 01:13:01,260 --> 01:13:08,490 Noriu skaityti šį failą. Kaip skaityti iš failo? 865 01:13:08,490 --> 01:13:11,920 [Studentas] Atidarote jį pirmiausia. >> Taip. 866 01:13:11,920 --> 01:13:15,010 Taigi, fopen. Ką fopen atrodyti? 867 01:13:15,010 --> 01:13:22,980 [Studentas] Failo vardas. >> [Bowden] Failo pavadinimas bus argv [1]. 868 01:13:22,980 --> 01:13:26,110 [Studentas] Ir tada tai, ką norite daryti su juo, kad - >> [Bowden] Taip. 869 01:13:26,110 --> 01:13:28,740 Taigi, jei tu negali prisiminti, jums gali tiesiog padaryti vyro fopen, 870 01:13:28,740 --> 01:13:32,960 kur jis bus const char * kelias, kur kelias failo vardas, 871 01:13:32,960 --> 01:13:34,970 const char * režimu. 872 01:13:34,970 --> 01:13:38,660 Jei atsitiktų, kad neprisimenu režimas, tada jūs galite pažvelgti veiksena. 873 01:13:38,660 --> 01:13:44,660 Brūkšnio simboliu viduje žinyno puslapių, yra tai, ką jūs galite naudoti norėdami ieškoti dalykų. 874 01:13:44,660 --> 01:13:49,790 Taigi, aš tipo / paieškos režimas režimo. 875 01:13:49,790 --> 01:13:57,130 N ir N yra tai, ką jūs galite naudoti paieškos rungtynių ciklą per. 876 01:13:57,130 --> 01:13:59,800 Štai jis sako, kad argumentas, režimas taškus į eilutę 877 01:13:59,800 --> 01:14:01,930 pradžioje su vieną iš šių sekų. 878 01:14:01,930 --> 01:14:06,480 Taigi, R, atviras teksto failą skaitymui. Kad tai, ką mes norime daryti. 879 01:14:08,930 --> 01:14:13,210 Skaityti, ir aš noriu laikyti, kad. 880 01:14:13,210 --> 01:14:18,720 Dalykas bus FILE *. Dabar, ką aš noriu padaryti? 881 01:14:18,720 --> 01:14:21,200 Duok man per sekundę. 882 01:14:28,140 --> 01:14:30,430 Gerai. Dabar, ką aš noriu padaryti? 883 01:14:30,430 --> 01:14:32,940 [Studentas] Patikrinkite, ar jis yra NULL. >> [Bowden] Yeah. 884 01:14:32,940 --> 01:14:38,690 Bet kuriuo metu galite atidaryti failą, įsitikinkite, kad jūs sėkmingai galėtų jį atidaryti. 885 01:14:58,930 --> 01:15:10,460 >> Dabar aš noriu padaryti, kad termios stuff, kur aš noriu pirmiausia perskaityti mano dabartinius nustatymus 886 01:15:10,460 --> 01:15:14,050 ir išgelbėti tuos, į kažką, tada aš noriu pasikeisti savo nustatymus 887 01:15:14,050 --> 01:15:19,420 mesti į simbolį, kuris I tipo, 888 01:15:19,420 --> 01:15:22,520 ir tada aš noriu atnaujinti šiuos parametrus. 889 01:15:22,520 --> 01:15:27,250 Ir tada programos pabaigoje, aš noriu pakeisti atgal į savo pradinius parametrus. 890 01:15:27,250 --> 01:15:32,080 Taigi struct bus tipo termios, ir aš norėčiau, kad nori du iš šių. 891 01:15:32,080 --> 01:15:35,600 Pirmasis vyksta būti mano current_settings, 892 01:15:35,600 --> 01:15:42,010 ir tada jie ketina būti mano hacker_settings. 893 01:15:42,010 --> 01:15:48,070 Pirma, aš ketinate norite išsaugoti savo dabartinius nustatymus, 894 01:15:48,070 --> 01:15:53,790 tada aš ruošiuosi norite atnaujinti hacker_settings 895 01:15:53,790 --> 01:16:01,570 ir tada mano programos pabaigos būdas, aš noriu grįžti prie esamais nustatymais. 896 01:16:01,570 --> 01:16:08,660 Taupo dabartinius nustatymus, taip, kad veikia, Mes vyras termios. 897 01:16:08,660 --> 01:16:15,810 Mes matome, kad turime šį int tcsetattr, int tcgetattr. 898 01:16:15,810 --> 01:16:22,960 Galiu perduoti termios struct pagal jo rodyklė. 899 01:16:22,960 --> 01:16:30,640 Kaip ši atrodys - I've jau pamiršote, ką funkcija buvo vadinama. 900 01:16:30,640 --> 01:16:34,930 Nukopijuokite ir įklijuokite jį. 901 01:16:39,150 --> 01:16:45,500 Taigi tcgetattr, tuomet aš noriu važiuoti, struct, kad aš taupymo informaciją, 902 01:16:45,500 --> 01:16:49,650 kuris vyksta būti current_settings, 903 01:16:49,650 --> 01:16:59,120 ir pirmasis argumentas yra failo deskriptorius dalykas, kurį noriu išsaugoti atributus. 904 01:16:59,120 --> 01:17:04,360 Kas failo deskriptorius, kaip ir bet kuriuo metu, kai atidarote failą, jis gauna failo deskriptorius. 905 01:17:04,360 --> 01:17:14,560 Kai aš fopen argv [1], ji pasireiškia failo deskriptorius, kurioje esate nuorodų 906 01:17:14,560 --> 01:17:16,730 jei norite skaityti arba rašyti į jį. 907 01:17:16,730 --> 01:17:19,220 Kad nėra failo deskriptorius, aš noriu naudoti čia. 908 01:17:19,220 --> 01:17:21,940 Yra trys failų deskriptoriai turite pagal nutylėjimą, 909 01:17:21,940 --> 01:17:24,310 standartas standartas atlikti, ir standartinė paklaida. 910 01:17:24,310 --> 01:17:29,960 Pagal nutylėjimą, aš manau, kad tai standartas yra 0, standartas iš 1, ir standartinė paklaida yra 2. 911 01:17:29,960 --> 01:17:33,980 Taigi, ką aš noriu pakeisti nustatymus? 912 01:17:33,980 --> 01:17:37,370 Noriu pakeisti parametrus, kai aš paspauskite simbolį, 913 01:17:37,370 --> 01:17:41,590 Noriu mesti tą simbolį karto, o ne spausdinti į ekraną. 914 01:17:41,590 --> 01:17:45,960 Kas srautas - standartinis, standartinės, arba kad standartinė paklaida - 915 01:17:45,960 --> 01:17:52,050 reaguoja į dalykų, kai aš tipo į klaviatūrą? >> [Studentas] Standartinis in >> Yeah. 916 01:17:52,050 --> 01:17:56,450 Taigi aš galiu padaryti arba 0 arba Galiu padaryti STDIN. 917 01:17:56,450 --> 01:17:59,380 Gaunu standartą current_settings, in 918 01:17:59,380 --> 01:18:01,720 >> Dabar aš noriu atnaujinti šiuos parametrus, 919 01:18:01,720 --> 01:18:07,200 todėl pirmiausia aš kopijuoti į hacker_settings ką mano current_settings yra. 920 01:18:07,200 --> 01:18:10,430 Ir kaip structs darbas tai tiesiog nukopijuoti. 921 01:18:10,430 --> 01:18:14,510 Kopijuoja visus laukus, kaip galima tikėtis. 922 01:18:14,510 --> 01:18:17,410 >> Dabar aš noriu atnaujinti, kai kurie laukai. 923 01:18:17,410 --> 01:18:21,670 Žiūri termios, jums reikės perskaityti daug šio 924 01:18:21,670 --> 01:18:24,110 tik pamatyti, ką jūs norėtumėte ieškoti, 925 01:18:24,110 --> 01:18:28,210 tačiau jūs ketinate norite ieškoti vėliavos echo, 926 01:18:28,210 --> 01:18:33,110 todėl Echo Echo įvesties ženklai. 927 01:18:33,110 --> 01:18:37,710 Pirmiausia noriu nustatyti - I've jau pamiršote, ką laukai yra. 928 01:18:45,040 --> 01:18:47,900 Tai, ką struct atrodo. 929 01:18:47,900 --> 01:18:51,060 Taigi įvesties režimai, aš manau, kad mes norime pakeisti. 930 01:18:51,060 --> 01:18:54,210 Mes pažvelgti į tirpalą, įsitikinti, kad tai, ką mes norime pakeisti. 931 01:19:04,060 --> 01:19:12,610 Mes norime pakeisti, siekiant užkirsti kelią, reikia ieškoti per visus šiuos lflag. 932 01:19:12,610 --> 01:19:14,670 Mes norime pakeisti vietos režimus. 933 01:19:14,670 --> 01:19:17,710 Jums reikės perskaityti visą šį dalyką suprasti, kur viskas priklauso 934 01:19:17,710 --> 01:19:19,320 kad mes norime pakeisti. 935 01:19:19,320 --> 01:19:24,120 Bet tai viduje vietinių rūšių, kur mes einame, kad nori pakeisti, kad. 936 01:19:27,080 --> 01:19:33,110 Taigi hacker_settings.cc_lmode yra tai, ką ji vadinama. 937 01:19:39,630 --> 01:19:43,020 c_lflag. 938 01:19:49,060 --> 01:19:52,280 Tai kur mes patekti į Bitinis operatorių. 939 01:19:52,280 --> 01:19:54,860 Mes rūšies Out Of Time, bet mes pereiti per jį nekilnojamojo greitai. 940 01:19:54,860 --> 01:19:56,600 Tai yra, kai mes gauname į Bitinis operatorių, 941 01:19:56,600 --> 01:19:59,950 ten, kur aš manau, vieną kartą seniai sakė, kad, kai paleidus, susijusius su vėliavomis, 942 01:19:59,950 --> 01:20:03,370 jūs ketinate naudoti Bitinis operacijų daug. 943 01:20:03,370 --> 01:20:08,240 Kiekviena vėliavos bitų atitinka kažkoks elgesio. 944 01:20:08,240 --> 01:20:14,090 Taigi čia, ši vėliava yra krūva įvairių dalykų, kai visi jie reiškia kažką kitą. 945 01:20:14,090 --> 01:20:18,690 Bet ką aš noriu padaryti, tai tiesiog išjungti grąžtą, kuris atitinka ECHO. 946 01:20:18,690 --> 01:20:25,440 Taip pasukti, kad ne aš & = ¬ ECHO. 947 01:20:25,440 --> 01:20:30,110 Tiesą sakant, aš manau, kad tai kaip techo ar kažką. Aš tik ketina patikrinti dar kartą. 948 01:20:30,110 --> 01:20:34,050 Galiu termios. Tai tiesiog ECHO. 949 01:20:34,050 --> 01:20:38,440 ECHO bus vienas tiek. 950 01:20:38,440 --> 01:20:44,230 ¬ ECHO ketina tai visi bitai yra nustatyti 1, o tai reiškia, visi vėliavas true 951 01:20:44,230 --> 01:20:47,140 išskyrus ECHO bitų. 952 01:20:47,140 --> 01:20:53,830 Baigti Mano vietos vėliava, tai reiškia, kad visų šalių vėliavomis, kurie šiuo metu nustatyta, kad tiesa 953 01:20:53,830 --> 01:20:56,520 vis dar bus true. 954 01:20:56,520 --> 01:21:03,240 Jei mano ECHO vėliava yra true, tada tai yra būtinai false ECHO vėliava. 955 01:21:03,240 --> 01:21:07,170 Taigi tiesiog išjungė šią kodo eilutę ECHO vėliava. 956 01:21:07,170 --> 01:21:16,270 Kitų eilučių kodo, aš tiesiog nukopijuokite juos laiko interesus ir tada juos paaiškinti. 957 01:21:27,810 --> 01:21:30,180 Tirpale, sakė jis 0. 958 01:21:30,180 --> 01:21:33,880 Tai turbūt geriau aiškiai pasakyti STDIN. 959 01:21:33,880 --> 01:21:42,100 >> Atkreipkite dėmesį, kad aš taip pat daro ECHO | ICANON čia. 960 01:21:42,100 --> 01:21:46,650 ICANON nurodo į kažką atskirą, o tai reiškia kanoninė režimą. 961 01:21:46,650 --> 01:21:50,280 Kas kanoninė režimas reiškia, paprastai, kai jūs įvedate į komandų eilutę, 962 01:21:50,280 --> 01:21:54,670 standartas netvarko nieko, kol paspausite naujos eilutės. 963 01:21:54,670 --> 01:21:58,230 Taigi, kai jūs GetString, įvedate dalykų krūva, tada paspausite naujos eilutės. 964 01:21:58,230 --> 01:22:00,590 Štai, kada ji buvo išsiųsta standarto in 965 01:22:00,590 --> 01:22:02,680 Tai yra numatytasis nustatymas. 966 01:22:02,680 --> 01:22:05,830 Kai aš išjungti kanoninė režimą, dabar kiekvienas, kai paspausite vieną simbolį 967 01:22:05,830 --> 01:22:10,910 yra tai, ką gauna tvarkomi, kuris paprastai yra natūra blogo, nes jis lėtai apdoroti šiuos dalykus, 968 01:22:10,910 --> 01:22:14,330 kuris yra, kodėl ji yra gera sušvelninti jį į visą linijų. 969 01:22:14,330 --> 01:22:16,810 Bet aš noriu, kiekvienas simbolis turi būti tvarkomi 970 01:22:16,810 --> 01:22:18,810 nes aš nenoriu laukti man, kad pasiektų naują eilutę 971 01:22:18,810 --> 01:22:21,280 , prieš tai apdoroja visus simbolius aš rašyti. 972 01:22:21,280 --> 01:22:24,760 Tai išjungia kanoninė režimą. 973 01:22:24,760 --> 01:22:31,320 Ši medžiaga tiesiog reiškia, kai jis iš tikrųjų apdoroja simbolių. 974 01:22:31,320 --> 01:22:35,830 Tai reiškia, apdoroti juos nedelsiant; kuo greičiau aš rašyti juos, apdoroti. 975 01:22:35,830 --> 01:22:42,510 Ir tai yra funkcija, kuri atnaujina savo nustatymus standartą, 976 01:22:42,510 --> 01:22:45,480 ir TCSA priemonė tai padaryti dabar. 977 01:22:45,480 --> 01:22:50,310 Kiti variantai laukti, kol visa tai, kas šiuo metu upelio yra tvarkomi. 978 01:22:50,310 --> 01:22:52,030 Kad tikrai ne klausimas. 979 01:22:52,030 --> 01:22:56,920 Tiesiog dabar pasikeisi savo nustatymus, kokia yra šiuo metu hacker_typer_settings. 980 01:22:56,920 --> 01:23:02,210 Spėju, kad pavadino jį hacker_settings, todėl galime pakeisti, kad. 981 01:23:09,610 --> 01:23:13,500 Pakeiskite viską hacker_settings. 982 01:23:13,500 --> 01:23:16,870 >> Dabar mūsų programos pabaigoje mes ketiname norite grįžti 983 01:23:16,870 --> 01:23:20,210 kas šiuo metu viduje normal_settings 984 01:23:20,210 --> 01:23:26,560 kuris vyksta tiesiog atrodyti ir normal_settings. 985 01:23:26,560 --> 01:23:30,650 Atkreipkite dėmesį, nepasikeitė bet mano normal_settings nuo pradžių gauti jį. 986 01:23:30,650 --> 01:23:34,520 Tada tiesiog pakeisti juos atgal, galiu perduoti juos atgal pabaigoje. 987 01:23:34,520 --> 01:23:38,390 Tai buvo atnaujinta. Gerai. 988 01:23:38,390 --> 01:23:43,900 >> Dabar viduje čia aš tik paaiškinti kodą laikui interesų. 989 01:23:43,900 --> 01:23:46,350 Tai nereiškia, kad daug kodas. 990 01:23:50,770 --> 01:24:03,750 Mes matome, mes skaityti iš bylos pobūdį. Mes pavadino jį f. 991 01:24:03,750 --> 01:24:07,850 Dabar galite vyras fgetc, bet kaip fgetc ketina dirbti 992 01:24:07,850 --> 01:24:11,910 yra tik jis ketina grįžti į simbolį, kad jūs tiesiog perskaityti ar eof 993 01:24:11,910 --> 01:24:15,680 kuris atitinka failą arba kai klaidos vyksta pabaigos. 994 01:24:15,680 --> 01:24:19,900 Mes kilpų, toliau skaityti vieną simbolį iš failo, 995 01:24:19,900 --> 01:24:22,420 kol mes pritrūksta simbolių skaitomas. 996 01:24:22,420 --> 01:24:26,650 Ir nors, ką mes darome, mes laukti vienas simbolis nuo standartinių in 997 01:24:26,650 --> 01:24:29,090 Kiekvieną kartą jūs tipo kažkas į komandų eilutę, 998 01:24:29,090 --> 01:24:32,820 , skaito simbolį nuo standartinių in 999 01:24:32,820 --> 01:24:38,330 Tada putchar yra tik ketina įdėti char mes skaitome čia failą su standartine out. 1000 01:24:38,330 --> 01:24:42,890 Galite vyras putchar, bet tai tik pradėti standarto, tai spausdinant tą simbolį. 1001 01:24:42,890 --> 01:24:51,600 Taip pat Jūs galite tiesiog padaryti printf ("% c", c); tą pačią idėją. 1002 01:24:53,330 --> 01:24:56,670 Kad ketina padaryti didžiąją dalį mūsų darbo. 1003 01:24:56,670 --> 01:25:00,300 >> Paskutinis dalykas, mes ketiname norite daryti yra tiesiog fclose mūsų failą. 1004 01:25:00,300 --> 01:25:03,310 Jei jūs neturite fclose, Atminties nutekėjimas. 1005 01:25:03,310 --> 01:25:06,680 Mes norime fclose failą, mes iš pradžių atidarytas, ir aš manau, kad viskas. 1006 01:25:06,680 --> 01:25:13,810 Jei mes darome, kad aš jau turiu problemų. 1007 01:25:13,810 --> 01:25:17,260 Pažiūrėkime. 1008 01:25:17,260 --> 01:25:19,960 Ką ji skųstis? 1009 01:25:19,960 --> 01:25:30,220 Tikimasi "int", bet argumentas yra tipas "struct _IO_FILE *". 1010 01:25:36,850 --> 01:25:39,370 Mes pamatyti, jei tai veikia. 1011 01:25:45,210 --> 01:25:53,540 Leidžiama tik C99. Augh. Gerai, kad hacker_typer. 1012 01:25:53,540 --> 01:25:57,760 Dabar mes turime daugiau naudingų aprašymus. 1013 01:25:57,760 --> 01:25:59,900 Taigi naudoti nedeklaruoto identifikatorius "normal_settings". 1014 01:25:59,900 --> 01:26:04,170 Aš ne ją vadina normal_settings. Aš jį pavadino current_settings. 1015 01:26:04,170 --> 01:26:12,090 Todėl galime pakeisti visa tai. 1016 01:26:17,920 --> 01:26:21,710 Dabar artimųjų argumentą. 1017 01:26:26,290 --> 01:26:29,500 Aš padaryti šį 0 dabar. 1018 01:26:29,500 --> 01:26:36,720 Gerai. . / Hacker_typer cp.c. 1019 01:26:36,720 --> 01:26:39,590 Aš taip pat nebuvo išvalyti ekraną pradžioje. 1020 01:26:39,590 --> 01:26:42,960 , Bet jūs galite pažvelgti atgal į paskutinę problemą, pamatyti, kaip jūs išvalyti ekraną. 1021 01:26:42,960 --> 01:26:45,160 Tai tiesiog spausdinti keletą simbolių 1022 01:26:45,160 --> 01:26:47,210 o tai yra tai, ką aš noriu padaryti. 1023 01:26:47,210 --> 01:26:48,900 Gerai. 1024 01:26:48,900 --> 01:26:55,280 Ir galvoju apie tai, kodėl tai turėjo būti 0 vietoj standartinio įvesties, 1025 01:26:55,280 --> 01:27:00,560 , kurios turėtų būti # define 0, 1026 01:27:00,560 --> 01:27:03,890 tai skundžiasi, kad 1027 01:27:13,150 --> 01:27:19,360 Anksčiau, kai aš sakė, kad yra failų deskriptoriai, bet tada jūs taip pat turite savo failą * 1028 01:27:19,360 --> 01:27:23,210 failo deskriptorius yra tik vienas sveikasis skaičius, 1029 01:27:23,210 --> 01:27:26,970 kadangi FILE * turi visa krūva daiktų su juo susijusios. 1030 01:27:26,970 --> 01:27:30,380 Priežastis, kodėl mes turime pasakyti 0 vietoj stdin 1031 01:27:30,380 --> 01:27:37,480 kad stdin FILE *, kurioje nurodoma dalykas, kad yra nuorodų failo deskriptorius 0. 1032 01:27:37,480 --> 01:27:45,070 Taigi, net čia, kai aš fopen (argv [1], Gaunu failą *. 1033 01:27:45,070 --> 01:27:51,180 Bet kažkur tame faile * yra dalykas, atitinkantis šio failo failo deskriptorius. 1034 01:27:51,180 --> 01:27:57,430 Jei peržvelgsite žinyno puslapyje atvira, todėl manau, kad jūs turite padaryti atvirą man 3 - Ne - 1035 01:27:57,430 --> 01:27:59,380 vyras 2 atviri - taip. 1036 01:27:59,380 --> 01:28:06,250 Jei pažvelgti atviromis puslapyje, atviras kaip žemesnio lygio fopen, 1037 01:28:06,250 --> 01:28:09,350 ir jis grąžina tikrasis failo deskriptorius. 1038 01:28:09,350 --> 01:28:12,050 fopen veikia pagal atviro ant daiktų krūva, 1039 01:28:12,050 --> 01:28:17,640 , o ne grąžinant tik, kad failo deskriptorius grąžina visa bylos * žymeklį 1040 01:28:17,640 --> 01:28:20,590 kurio viduje yra mūsų mažai failo deskriptorius. 1041 01:28:20,590 --> 01:28:25,020 Taigi standartinio nuoroda į failą * dalykas, 1042 01:28:25,020 --> 01:28:29,120 o 0 reiškia, kad tik failo deskriptorius standarto savaime. 1043 01:28:29,120 --> 01:28:32,160 >> Turite klausimų? 1044 01:28:32,160 --> 01:28:35,930 [Juokiasi] išmetė per tą. 1045 01:28:35,930 --> 01:28:39,140 Gerai. Baigsime. [Juokiasi] 1046 01:28:39,140 --> 01:28:42,000 >> [CS50.TV]