1 00:00:00,000 --> 00:00:02,500 [Powered by Google Translate] [5. jagu - mugavam] 2 00:00:02,500 --> 00:00:04,690 [Rob Bowden - Harvardi Ülikool] 3 00:00:04,690 --> 00:00:07,250 [See on CS50. - CS50.TV] 4 00:00:08,990 --> 00:00:14,250 >> Nagu ma ütlesin oma e-posti, seal on palju asju, mida saate kasutada 5 00:00:14,250 --> 00:00:17,060 peale seadme tegelikult teha probleem seab. 6 00:00:17,060 --> 00:00:19,910 Soovitame seda teha seadme lihtsalt, sest siis saame kergemini aidata teil 7 00:00:19,910 --> 00:00:22,070 ja me teame, kuidas kõik läheb tööle. 8 00:00:22,070 --> 00:00:26,950 Aga nagu üks näide, kus saab teha asju, kui, ütleme, sa ei pea juurdepääsu 9 00:00:26,950 --> 00:00:31,570 et seadme või soovite töötada teaduskeskus kelder - 10 00:00:31,570 --> 00:00:33,090 mis tegelikult neil on aparaat liiga - 11 00:00:33,090 --> 00:00:35,150 kui sa tahad töötada kõikjal. 12 00:00:35,150 --> 00:00:42,370 Üks näide on olete näinud / kuulnud SSH? 13 00:00:44,380 --> 00:00:47,780 SSH on põhimõtteliselt nagu ühendust midagi. 14 00:00:47,780 --> 00:00:51,340 Tegelikult praegu ma SSHed seadmesse. 15 00:00:51,340 --> 00:00:54,290 Ma ei tööta otse seadmesse. 16 00:00:55,930 --> 00:01:01,060 Siin on aparaat, ja kui sa vaatad alla siit näed seda IP-aadressi. 17 00:01:01,060 --> 00:01:03,650 Ma pole kunagi tööd seade ise; 18 00:01:03,650 --> 00:01:08,840 Olen alati tulema üle iTerm2 aken / terminaliakent. 19 00:01:08,840 --> 00:01:15,910 Võite SSH et IP-aadress, ssh jharvard@192.168.129.128. 20 00:01:15,910 --> 00:01:20,390 Mäletan, et mitmed väga lihtne, sest see on selline tore muster. 21 00:01:20,390 --> 00:01:24,920 Aga see küsib minu käest parooli ja nüüd olen seadmesse. 22 00:01:24,920 --> 00:01:33,060 Põhimõtteliselt sel hetkel, kui te avada terminal seadme sisemust ise, 23 00:01:33,060 --> 00:01:36,350 Selle liidese aga siis oleks seda kasutada, on täpselt sama 24 00:01:36,350 --> 00:01:40,010 nagu interface ma kasutan siin kuid nüüd olete SSHed. 25 00:01:42,240 --> 00:01:44,920 Sa ei pea SSH seade. 26 00:01:44,920 --> 00:01:52,360 Üks näide ühest kohast teise võid SSH on Ma olen päris kindel, mida vaikimisi - 27 00:01:52,360 --> 00:01:55,020 Oh. Suuremad. 28 00:01:55,020 --> 00:02:01,130 Kõik te peaks olema vaikimisi FAS kontod FAS servereid. 29 00:02:01,130 --> 00:02:06,840 Minu jaoks, ma oleks SSH rbowden@nice.fas.harvard.edu. 30 00:02:06,840 --> 00:02:11,610 See saab küsida, et esimest korda, ja te ütlete jah. 31 00:02:11,610 --> 00:02:15,840 Minu parool on lihtsalt saab olema minu FAS parool. 32 00:02:15,840 --> 00:02:22,650 Ja nüüd, ma SSHed et kena servereid ja ma saan teha midagi, ma tahan siia. 33 00:02:22,650 --> 00:02:28,560 Paljud klassid võite võtta, nagu 124, on plaanis teha saadate asju siin 34 00:02:28,560 --> 00:02:30,950 tegelikult esitada oma probleem seab. 35 00:02:30,950 --> 00:02:34,100 Aga öelda, et sa ei pääse oma seade. 36 00:02:34,100 --> 00:02:37,910 Siis saad teha asju, nagu siin seda ütlen - 37 00:02:37,910 --> 00:02:42,160 See on vaid meie osa küsimustele. 38 00:02:42,160 --> 00:02:45,070 Ta küsib, teha seda seadet. 39 00:02:45,070 --> 00:02:47,790 Selle asemel ma lihtsalt teha seda serveris. 40 00:02:47,790 --> 00:02:50,560 Ma lähen unzip et. 41 00:02:50,560 --> 00:02:55,670 Probleem saab olema, et sa oled harjunud kasutama midagi gedit 42 00:02:55,670 --> 00:02:58,160 või mis iganes seadme sisemust. 43 00:02:58,160 --> 00:03:01,830 Sa ei kavatse olla, et FAS server. 44 00:03:01,830 --> 00:03:04,110 See kõik on lihtsalt saab olema see tekstiline liides. 45 00:03:04,110 --> 00:03:09,180 Nii võid kas üks, proovige õppida tekstiredaktorit, mis nad on. 46 00:03:09,180 --> 00:03:12,130 Neil on Nano. 47 00:03:12,130 --> 00:03:14,990 Nano on tavaliselt üsna lihtne kasutada. 48 00:03:14,990 --> 00:03:19,470 Te saate kasutada oma nooled ja trükkige tavaliselt. 49 00:03:19,470 --> 00:03:21,250 Nii et see ei ole raske. 50 00:03:21,250 --> 00:03:24,720 Kui sa tahad saada tõeliselt fancy saate Emacs, 51 00:03:24,720 --> 00:03:29,850 mida ma ilmselt poleks pidanud alustama, sest ma ei tea isegi, kuidas sulgeda Emacs. 52 00:03:29,850 --> 00:03:32,760 Kontroll X, Control C? Jah. 53 00:03:32,760 --> 00:03:35,310 Või saab kasutada Vim, mis on see, mida ma kasutan. 54 00:03:35,310 --> 00:03:37,800 Ja nii need on teie võimalused. 55 00:03:37,800 --> 00:03:43,830 Kui te ei taha seda teha, saate ka, kui te vaatate manual.cs50.net-- 56 00:03:43,830 --> 00:03:45,410 Oh. 57 00:03:45,410 --> 00:03:49,920 PC, saate SSH kasutades pahtel, 58 00:03:49,920 --> 00:03:51,940 mis sa lähed on alla laadida eraldi. 59 00:03:51,940 --> 00:03:55,460 Mac'i, saate lihtsalt vaikimisi pesa või saad laadida iTerm2, 60 00:03:55,460 --> 00:03:58,490 mis on nagu kena, uhke Terminal. 61 00:03:58,490 --> 00:04:03,780 Kui te lähete manual.cs50.net näete lingi Notepad + +, 62 00:04:03,780 --> 00:04:07,120 mis on see, mida saab kasutada arvutis. 63 00:04:07,120 --> 00:04:13,340 See võimaldab teil SFTP Notepad + +, mis on põhimõtteliselt SSH. 64 00:04:13,340 --> 00:04:17,750 Mida see teile teha, on muuta oma faile kohapeal, 65 00:04:17,750 --> 00:04:20,670 ja siis, kui soovite, et neid päästa, siis salvestada nice.fas, 66 00:04:20,670 --> 00:04:23,670 kus saab siis käima panna. 67 00:04:23,670 --> 00:04:26,880 Ja samaväärne Mac saab olema TextWrangler. 68 00:04:26,880 --> 00:04:28,760 Nii et see võimaldab teil teha sama asi. 69 00:04:28,760 --> 00:04:32,800 See võimaldab teil redigeerida faile kohapeal ja salvestada neid nice.fas, 70 00:04:32,800 --> 00:04:35,730 kus saab siis käima panna. 71 00:04:35,730 --> 00:04:40,400 Seega, kui olete kunagi ummikus ilma aparaat, teil on neid võimalusi 72 00:04:40,400 --> 00:04:44,230 et ikka sinu probleem komplekti. 73 00:04:44,230 --> 00:04:48,250 Üks probleem saab olema, et sa ei kavatse on CS50 raamatukogu 74 00:04:48,250 --> 00:04:51,580 sest nice.fas ei vaikimisi on see. 75 00:04:51,580 --> 00:04:55,970 Võite alla laadida CS50 raamatukogu - 76 00:04:55,970 --> 00:04:58,470 Ma ei usu, mul on vaja, et selles punktis. 77 00:04:58,470 --> 00:05:03,270 Võite alla laadida CS50 raamatukogu ja kopeeri see üle nice.fas, 78 00:05:03,270 --> 00:05:07,450 või ma arvan, sel hetkel me ei kasuta seda enam niikuinii. 79 00:05:07,450 --> 00:05:12,720 Või kui me seda teeme, saab käesoleval ajal on asendada see 80 00:05:12,720 --> 00:05:18,480 rakenduste funktsioonide CS50 raamatukogu niikuinii. 81 00:05:18,480 --> 00:05:21,370 Nii et ei tohiks olla, et palju piiranguid. 82 00:05:21,370 --> 00:05:23,710 Ja ongi nii. 83 00:05:26,460 --> 00:05:29,820 >> Ma lähen tagasi seadme nüüd, me teeme kõik seadmesse. 84 00:05:29,820 --> 00:05:37,510 Vaadates meie osa küsimusi, alguses, nagu ma ütlesin oma e-posti, 85 00:05:37,510 --> 00:05:43,620 meil rääkida üks lühike sa pidid valvama. 86 00:05:43,620 --> 00:05:51,980 Meil on Suunan ja torud ning need kolm küsimust. 87 00:05:51,980 --> 00:05:56,070 >> Et mis oja ei funktsioone nagu printf kirjutada vaikimisi? 88 00:05:56,070 --> 00:05:59,130 Nii oja. Mis on oja? 89 00:06:06,520 --> 00:06:15,100 Oja on põhimõtteliselt nagu see on lihtsalt mõned - 90 00:06:15,100 --> 00:06:21,450 See ei ole isegi allikas 1s ja 0.. 91 00:06:21,450 --> 00:06:24,920 Oja see küsib siin on standard välja. 92 00:06:24,920 --> 00:06:27,250 Ja nii standard välja on oja, et kui sa kirjutad see, 93 00:06:27,250 --> 00:06:30,940 see ekraanile. 94 00:06:30,940 --> 00:06:36,860 Standard välja, mida oja, see tähendab, et sa lihtsalt kirjutada 1s ja 0. sellele 95 00:06:36,860 --> 00:06:40,220 ja teises otsas tavaline välja loeb vaid sellest oja. 96 00:06:40,220 --> 00:06:43,540 See on lihtsalt jada 1s ja 0.. 97 00:06:43,540 --> 00:06:45,570 Võite kirjutada, et voolu või saate lugeda ojad 98 00:06:45,570 --> 00:06:47,950 sõltuvalt sellest, mida oja tegelikult on. 99 00:06:47,950 --> 00:06:52,800 Ülejäänud kaks vaikimisi ojad on standard ja standardviga. 100 00:06:52,800 --> 00:06:57,540 Standard on, kui sa ei getString, see ootab sind sisestada kraami. 101 00:06:57,540 --> 00:07:01,570 Nii et ootame teid, see on tegelikult ootab standard, 102 00:07:01,570 --> 00:07:04,880 mis on tõesti, mida sa saad, kui kirjutad klaviatuuri. 103 00:07:04,880 --> 00:07:07,530 Sa kirjutades standard sisse 104 00:07:07,530 --> 00:07:10,050 Standardviga on põhimõtteliselt samaväärne standard välja, 105 00:07:10,050 --> 00:07:13,280 aga see on spetsialiseerunud, et kui sa printida standardviga, 106 00:07:13,280 --> 00:07:16,770 sa peaksid ainult printida veateated, mis 107 00:07:16,770 --> 00:07:20,200 nii saab eristada regulaarselt sõnumeid trükkida ekraanil 108 00:07:20,200 --> 00:07:24,560 versus veateateid sõltuvalt sellest, kas nad läksid standard välja või standardviga. 109 00:07:24,560 --> 00:07:28,660 Faile liiga. 110 00:07:28,660 --> 00:07:32,440 Standard läbi, standard, ja standardviga on lihtsalt eriline ojad, 111 00:07:32,440 --> 00:07:36,810 kuid tegelikult ühtegi faili, kui avate faili, muutub see oja baiti 112 00:07:36,810 --> 00:07:40,740 kus saab lihtsalt lugeda, et oja. 113 00:07:40,740 --> 00:07:47,770 Sa, enamasti, saab lihtsalt mõelda faili oja baiti. 114 00:07:47,770 --> 00:07:51,190 Mida ojad nad kirjutada vaikimisi? Standard välja. 115 00:07:51,190 --> 00:07:56,980 >> Mis vahe on> ja >>? 116 00:07:58,140 --> 00:08:03,710 Kas keegi video eelnevalt? Okei. 117 00:08:03,710 --> 00:08:10,960 > Saab olema kuidas suunata failidena, 118 00:08:10,960 --> 00:08:15,240 ja >> ka saab suunata väljundi faili, 119 00:08:15,240 --> 00:08:17,820 aga see on vaid kavatse lisab faili. 120 00:08:17,820 --> 00:08:23,430 Näiteks oletame, et ma juhtun olema dict siin, 121 00:08:23,430 --> 00:08:27,020 ja ainult kraami sees dict on kass, kass, koer, kalad, koer. 122 00:08:27,020 --> 00:08:31,530 Üks käsk, et teil on käsurida on kass, 123 00:08:31,530 --> 00:08:34,539 mis on lihtsalt trükkimise mis on faili. 124 00:08:34,539 --> 00:08:40,679 Nii et kui ma ütlen, kass dict, see saab printida kass, kass, koer, kalad, koer. See on kõik, kass teeb. 125 00:08:40,679 --> 00:08:46,280 See tähendab, et trükitud standard välja kass, kass, koer, kalad, koer. 126 00:08:46,280 --> 00:08:53,240 Kui ma selle asemel soovite ümber suunata, et faili, saan kasutada> ja suunata see iganes fail on. 127 00:08:53,240 --> 00:08:56,460 Ma helistan faili fail. 128 00:08:56,460 --> 00:09:00,320 Nii et nüüd, kui ma LS, ma vaatan, et mul on uus fail nimega faili. 129 00:09:00,320 --> 00:09:05,700 Ja kui ma seda avatumaks, see saab olema just see, mida kass panna käsurida. 130 00:09:05,700 --> 00:09:11,040 Nüüd, kui ma seda uuesti teha, siis see läheb ümber väljundi faili, 131 00:09:11,040 --> 00:09:13,930 ja ma lähen on täpselt sama asi. 132 00:09:13,930 --> 00:09:17,910 Nii tehniliselt, see täiesti kaalus mis meil oli. 133 00:09:17,910 --> 00:09:22,970 Ja me näeme, kui ma muudan dict, võtsin koera. 134 00:09:22,970 --> 00:09:29,980 Nüüd, kui me kass dict arvesse fail uuesti, me lähed on uus versioon koeraga eemaldada. 135 00:09:29,980 --> 00:09:32,400 Nii et täiesti alistab ta. 136 00:09:32,400 --> 00:09:36,640 Selle asemel, kui me kasutame >>, see saab lisada faili. 137 00:09:36,640 --> 00:09:40,860 Nüüd, avades faili, näeme me just sama asja trükitud kaks korda 138 00:09:40,860 --> 00:09:44,920 sest see oli seal üks kord, siis me lisada originaal. 139 00:09:44,920 --> 00:09:48,130 Nii see on, mida> ja >> teha. 140 00:09:48,130 --> 00:09:50,580 Kas järgmise küsida - see ei küsi midagi. 141 00:09:50,580 --> 00:09:59,050 >> Teine, et meil on <, mis, kui> ümbersuunamised standard välja, 142 00:09:59,050 --> 00:10:01,970 00:10:12,050 Vaatame, kas meil on näiteks. 144 00:10:14,750 --> 00:10:16,930 Oskan kirjutada üks tõeline kiiresti. 145 00:10:17,870 --> 00:10:25,700 Võtame suvalise faili, hello.c. 146 00:10:56,060 --> 00:10:59,070 Suhteliselt lihtne faili. 147 00:10:59,070 --> 00:11:03,570 Ma lihtsalt saada stringi ja seejärel printida "Tere" mis iganes string ma just sisenenud oli. 148 00:11:03,570 --> 00:11:07,990 Nii et tere ja siis. / Hello. 149 00:11:07,990 --> 00:11:10,720 Nüüd on see sunnib mind midagi kirjutada, 150 00:11:10,720 --> 00:11:15,070 mis tähendab, et ta ootab asju kantavad standard sisse 151 00:11:15,070 --> 00:11:20,450 Nii et sisestada mida iganes tahan kirjakeele sisse Me lihtsalt tere öelda, Rob! 152 00:11:20,450 --> 00:11:23,310 Siis on see trükkimise standardile läbi Tere, Rob! 153 00:11:23,310 --> 00:11:28,860 Kui ma teen. / Hello ja seejärel suunata, 154 00:11:30,740 --> 00:11:34,310 nüüd saab ainult suunata failist. 155 00:11:34,310 --> 00:11:41,720 Nii et kui panin mõned faili, txt, ja panin Rob, 156 00:11:41,720 --> 00:11:52,300 kui ma saan tere ja siis suunata faili txt arvesse. / hello, see saab öelda Tere, Rob! kohe. 157 00:11:52,300 --> 00:11:57,160 Kui see esimene saab getString ja see ootab standard, 158 00:11:57,160 --> 00:12:01,730 standard ei ole enam ootab klaviatuuri andmeid hankida sisestatud. 159 00:12:01,730 --> 00:12:05,980 Selle asemel oleme suunatakse standardiks lugeda failist txt. 160 00:12:05,980 --> 00:12:10,290 Ja nii see läheb lugeda file txt, mis on vaid rida Rob, 161 00:12:10,290 --> 00:12:13,380 ja siis see läheb printida Tere, Rob! 162 00:12:13,380 --> 00:12:18,180 Ja kui ma tahtsin, ma võiks ka teha. / Hello 00:12:21,500 ja siis standard, et see printimine, mis on Tere, Rob!, 164 00:12:21,500 --> 00:12:24,700 Võin suunata, et tema enda faili. 165 00:12:24,700 --> 00:12:29,790 Ma helistan faili tere - ei, ma ei ole, sest see on käivitatav - txt2. 166 00:12:29,790 --> 00:12:40,150 Nüüd txt2 läheb on väljundiks. / Hello 00:12:43,520 >> Küsimused? 168 00:12:45,900 --> 00:12:49,090 >> Okei. Siis on meil siin tulemas. 169 00:12:49,090 --> 00:12:53,510 Torud on viimase ühiku ümbersuunamise. 170 00:12:53,510 --> 00:12:58,750 >> Oh. Ma arvan, et ühe ühiku ümbersuunamise on, kui mitte> teete 2>, 171 00:12:58,750 --> 00:13:01,070 et teada suunates standardviga. 172 00:13:01,070 --> 00:13:06,280 Nii et kui midagi läks standardviga, siis ei saa panna txt2. 173 00:13:06,280 --> 00:13:12,480 Aga teate, kui ma teen 2>, siis see on ikka trükkimine Tere, Rob! et käsurealt 174 00:13:12,480 --> 00:13:18,600 sest ma olen ainult suunates standardviga, ma ei suunates standard välja. 175 00:13:18,600 --> 00:13:22,210 Standardviga ja standard välja on erinevad. 176 00:13:24,210 --> 00:13:27,080 Kui sa tahtsid tegelikult kirjutada standardviga, 177 00:13:27,080 --> 00:13:35,080 siis ma võiks muuta, et see oleks fprintf stderr. 178 00:13:35,080 --> 00:13:37,850 Nii printf, vaikimisi trükib standard välja. 179 00:13:37,850 --> 00:13:41,720 Kui ma tahan printida standardviga käsitsi, siis ma pean kasutama fprintf 180 00:13:41,720 --> 00:13:45,010 ning täpsustab, millist ma tahan printida. 181 00:13:45,010 --> 00:13:49,720 Kui selle asemel tegin fprintf stdout, siis see on põhimõtteliselt samaväärne printf. 182 00:13:49,720 --> 00:13:55,530 Aga fprintf et standardviga. 183 00:13:57,790 --> 00:14:03,650 Nii et nüüd, kui ma ümber seda arvesse txt2, Tere, Rob! on endiselt saada trükitud käsureal 184 00:14:03,650 --> 00:14:08,270 kuna see on üha trükitud standardviga ja ma olen ainult suunates standard välja. 185 00:14:08,270 --> 00:14:16,420 Kui ma nüüd suunata standardviga, nüüd ta ei saanud trükkida, ja txt2 saab olema Tere, Rob! 186 00:14:16,420 --> 00:14:21,910 Nüüd saate printida oma tegelikku vigu standardviga 187 00:14:21,910 --> 00:14:24,720 ja printida oma regulaarset sõnumite standard välja. 188 00:14:24,720 --> 00:14:31,420 Ja nii, kui sa käivitada oma programmi, saate käivitada seda. / Hello seda tüüpi 2> 189 00:14:31,420 --> 00:14:33,800 nii et teie programm läheb normaalselt, 190 00:14:33,800 --> 00:14:38,400 kuid mingeid veateateid, et sa saad saate vaadata hiljem oma tõrkelogile 191 00:14:38,400 --> 00:14:44,500 nii vigu, ja siis vaatame hiljem ja oma vigu fail on kõik vead, mis juhtus. 192 00:14:45,200 --> 00:14:47,540 >> Küsimused? 193 00:14:47,540 --> 00:14:58,070 >> Viimane on toru, mis sa ei mõtle nagu võttes standard välja ühe käsu 194 00:14:58,070 --> 00:15:01,210 ja teha see standard, et järgmise käsu. 195 00:15:01,210 --> 00:15:05,570 Näiteks siin on kaja on käsurea asi 196 00:15:05,570 --> 00:15:11,840 et lihtsalt läheb echo iganes ma panen selle väitega. Ma ei pane jutumärgid. 197 00:15:11,840 --> 00:15:16,150 Kaja blaa, blaa, blaa, on lihtsalt trükkimise blaa, blaa, blaa. 198 00:15:16,150 --> 00:15:20,600 Enne, kui ma ütlesin, mul oli panna Rob arvesse txt faili 199 00:15:20,600 --> 00:15:28,830 sest ma saan ainult suunata txt faili, selle asemel, / kui ma kordan Rob 200 00:15:28,830 --> 00:15:35,520 ja siis toru see. / hello, et ka tegema sama tüüpi asi. 201 00:15:35,520 --> 00:15:39,160 See võtab antud käsu väljundit, kaja Rob, 202 00:15:39,160 --> 00:15:43,610 ja kasutades seda sisendiks. / hello. 203 00:15:44,790 --> 00:15:49,560 Sa ei mõtle seda kui esimene suunata kaja Rob see faili 204 00:15:49,560 --> 00:15:54,160 ja siis sisestatud. / hello, et faili, mis oli just väljastada. 205 00:15:54,160 --> 00:15:57,850 Aga see võtab ajutise faili välja pilt. 206 00:16:01,890 --> 00:16:04,460 >> Küsimused, mis? 207 00:16:04,460 --> 00:16:07,150 >> Järgmine küsimus on planeeritud kaasata see. 208 00:16:07,150 --> 00:16:15,310 Mis gaasijuhe võib kasutate leida mitmeid unikaalseid nimesid faili nimega names.txt? 209 00:16:15,310 --> 00:16:24,160 Käsud me ei kavatse soovite kasutada siin on unikaalne, nii ainulaadset, ja siis wc. 210 00:16:24,160 --> 00:16:28,840 Seda saab teha mees UNIQ tegelikult vaadata, mida see teeb, 211 00:16:28,840 --> 00:16:34,840 ja see lihtsalt läheb filtreerida kõrval sobitamine read sisend. 212 00:16:34,840 --> 00:16:40,690 Ja mees WC on trükkimineku reavahetus, sõna ja baitides iga faili. 213 00:16:40,690 --> 00:16:43,760 Ja viimane läheme soovite kasutada on omamoodi, 214 00:16:43,760 --> 00:16:47,410 mis läheb lihtsalt sortida rida txt faili. 215 00:16:47,410 --> 00:16:58,080 Kui ma teen mõned txt faili, names.txt, ja see on Rob, Tommy, Joseph, Tommy, Joseph, RJ, Rob, 216 00:16:58,080 --> 00:17:03,910 mida ma tahan teha, on leida mitmeid unikaalseid nimesid seda faili. 217 00:17:03,910 --> 00:17:08,750 Mida peaks vastus olema? >> [Üliõpilane] 4. >> Jah. 218 00:17:08,750 --> 00:17:13,780 See peaks olema 4, sest Rob, Tommy, Joseph, RJ on ainult unikaalsed nimed selles failis. 219 00:17:13,780 --> 00:17:20,180 Esimene samm, kui ma lihtsalt ei sõnaarvestus kohta names.txt, 220 00:17:20,180 --> 00:17:24,290 see on tegelikult mulle kõike. 221 00:17:24,290 --> 00:17:32,560 See on tegelikult trükkimine - Vaatame, mees WC - reavahetused, sõnade ja baitide arv. 222 00:17:32,560 --> 00:17:38,270 Kui ma ainult hoolid read, siis ma saan lihtsalt teha wc-l names.txt. 223 00:17:41,730 --> 00:17:44,300 Nii et 1. etapis. 224 00:17:44,300 --> 00:17:50,510 Aga ma ei taha wc-l names.txt sest names.txt lihtsalt sisaldab kõiki nimesid, 225 00:17:50,510 --> 00:17:54,170 ja ma tahan välja filtreerida mis tahes mitteunikaalse ones. 226 00:17:54,170 --> 00:18:01,200 Nii et kui ma teen UNIQ names.txt, et ei ole päris mulle, mida ma tahan 227 00:18:01,200 --> 00:18:03,760 sest dubleeritud nimed on ikka veel seal. 228 00:18:03,760 --> 00:18:07,690 Miks nii? Miks on UNIQ ei tee seda, mida ma tahan? 229 00:18:07,690 --> 00:18:10,500 [Üliõpilane] duplikaate ei ole [kuuldamatu] >> Jah. 230 00:18:10,500 --> 00:18:16,370 Pea meeles, man-leheküljelt UNIQ ütleb filtri kõrval sobivad read. 231 00:18:16,370 --> 00:18:19,680 Nad ei külgne, nii et see ei filtreerida neid. 232 00:18:19,680 --> 00:18:31,100 Kui ma natuke neid esimesena, sorteerida names.txt läheb panna kõik duplikaat read kokku. 233 00:18:31,100 --> 00:18:34,450 Nii et nüüd omamoodi names.txt on see, et. 234 00:18:34,450 --> 00:18:40,550 Ma tahan kasutada seda sisendina ainulaadset, mis on | UNIQ. 235 00:18:40,550 --> 00:18:43,390 See annab mulle Joseph, RJ, Rob, Tommy, 236 00:18:43,390 --> 00:18:49,260 ja ma tahan kasutada seda sisendina wc-l, 237 00:18:49,260 --> 00:18:52,740 mis on annan mulle 4. 238 00:18:52,740 --> 00:18:56,930 Nagu ta ütleb siin, mida gaasijuhe võib kasutate? 239 00:18:56,930 --> 00:19:01,390 Seda saab teha palju asju nagu kasutades mitmeid käske 240 00:19:01,390 --> 00:19:05,130 kui kasutad väljundi ühest käsu sisendiks järgmise käsu. 241 00:19:05,130 --> 00:19:08,780 Seda saab teha palju asju, palju tarku asju. 242 00:19:08,780 --> 00:19:11,440 >> Küsimused? 243 00:19:12,910 --> 00:19:14,600 Okei. 244 00:19:14,600 --> 00:19:17,880 Ongi torude ja ümbersuunamine. 245 00:19:18,370 --> 00:19:24,090 >> Nüüd me läheme edasi tegelik kraam, kodeerimine kraami. 246 00:19:24,090 --> 00:19:29,100 Toas käesoleva PDF, näete selle käsu, 247 00:19:29,100 --> 00:19:32,950 ja sa tahad teha selle käsu oma seade. 248 00:19:36,240 --> 00:19:42,250 wget on käsk lihtsalt saada midagi internetist, põhiliselt 249 00:19:42,250 --> 00:19:45,180 nii wget ja see link. 250 00:19:45,180 --> 00:19:49,110 Kui sa läksid see URL oma brauseri, siis oleks seda faili alla laadida. 251 00:19:49,110 --> 00:19:52,510 Ma lihtsalt klõpsasid seda, nii et see allalaetud fail minu jaoks. 252 00:19:52,510 --> 00:19:55,650 Aga kirjalikult wget selle asja sees terminal 253 00:19:55,650 --> 00:19:58,620 lihtsalt läheb alla see oma terminal. 254 00:19:58,620 --> 00:20:02,750 Mul on section5.zip, ja sa tahad, et unzip section5.zip, 255 00:20:02,750 --> 00:20:06,520 mis on annan teile kausta nimega 5. jao, 256 00:20:06,520 --> 00:20:11,550 mis läheb on kõik failid me ei kavatse olla kasutades täna sees on. 257 00:20:33,380 --> 00:20:37,710 Kuna need programmid "failinimed näitavad, et nad on natuke lollakas, 258 00:20:37,710 --> 00:20:40,990 nii teie ülesanne on aru saada, miks kasutatakse gdb. 259 00:20:40,990 --> 00:20:44,560 Kas kõik on neid alla laadida / tea kuidas saada neid alla laadida 260 00:20:44,560 --> 00:20:47,480 oma seadme? Okei. 261 00:20:47,480 --> 00:20:56,400 >> Running ./buggy1, siis öelda Segmentation fault (core dumpinguhinnaga), 262 00:20:56,400 --> 00:21:00,500 mis tahes ajal saad segfault, et see on halb asi. 263 00:21:00,500 --> 00:21:03,810 Millisel juhul sa saad segfault? 264 00:21:03,810 --> 00:21:08,210 [Üliõpilane] viite mahavõtmine nullviida. >> Jah. Nii et on üks näide. 265 00:21:08,210 --> 00:21:11,580 Viite mahavõtmine nullviida sa lähed, et saada segfault. 266 00:21:11,580 --> 00:21:16,720 Mis segfault tähendab, et sa liigutav mälu sa ei peaks liigutav. 267 00:21:16,720 --> 00:21:21,350 Nii viite mahavõtmine nullviida on liigutav aadress 0, 268 00:21:21,350 --> 00:21:28,060 ja põhimõtteliselt kõik arvutid tänapäeval öelda, et aadress 0 on mälu sa ei peaks liigutav. 269 00:21:28,060 --> 00:21:31,920 Nii et miks viite mahavõtmine nullviida tulemusi segfault. 270 00:21:31,920 --> 00:21:37,210 Kui juhtub, et ei initsialiseerida pointer, siis on prügi väärtus, 271 00:21:37,210 --> 00:21:41,520 ja nii kui püüad dereference see suure tõenäosusega Sa puudutad mälu 272 00:21:41,520 --> 00:21:43,540 see on eikuskil. 273 00:21:43,540 --> 00:21:45,650 Kui juhtub, et saada õnnelik ja prügi väärtus 274 00:21:45,650 --> 00:21:48,440 juhtus osutada kusagil virnas või midagi, 275 00:21:48,440 --> 00:21:50,820 siis kui sa dereference et osuti mida te pole vormindatud, 276 00:21:50,820 --> 00:21:52,730 Midagi ei lähe valesti. 277 00:21:52,730 --> 00:21:55,480 Aga kui see on suunatud, ütleme, kusagil virnas ja hunnik, 278 00:21:55,480 --> 00:21:59,850 või see osutavad lihtsalt kuskil, et ei ole kasutatud oma programmi veel, 279 00:21:59,850 --> 00:22:02,240 siis oled liigutav mälu sa ei peaks liigutav ja sa segfault. 280 00:22:02,240 --> 00:22:06,370 Kui Sa kirjutad rekursiivne funktsioon ja see recurses liiga palju kordi 281 00:22:06,370 --> 00:22:08,720 ja sinu stack kasvab liiga suur ja korstna põrkas asjadest 282 00:22:08,720 --> 00:22:12,270 et see ei tohiks põrgata kokku, Sa puudutad mälu sa ei peaks liigutav, 283 00:22:12,270 --> 00:22:14,810 nii et sa segfault. 284 00:22:14,810 --> 00:22:17,010 Just segfault on. 285 00:22:17,010 --> 00:22:21,810 >> See on ka samal põhjusel, et kui teil on string nagu - 286 00:22:21,810 --> 00:22:23,930 Lähme tagasi eelmisele programmile. 287 00:22:23,930 --> 00:22:28,530 Aastal hello.c--Ma lihtsalt kavatse teha midagi muud. 288 00:22:28,530 --> 00:22:33,770 char * s = "Tere maailm!"; 289 00:22:33,770 --> 00:22:42,310 Kui ma kasutan * s = midagi või s [0] = "X"; 290 00:22:42,310 --> 00:22:47,290 nii et tere,. / hello, miks see segfault? 291 00:22:48,410 --> 00:22:51,250 Miks see segfault? 292 00:22:55,660 --> 00:22:57,890 Mida ootate juhtuda? 293 00:22:57,890 --> 00:23:06,640 Kui ma tegin printf ("% s \ n", s); Mida ootate tuleb trükkida? 294 00:23:06,640 --> 00:23:09,930 [Üliõpilane] X tere. >> Jah. 295 00:23:09,930 --> 00:23:15,140 Probleem on selles, et kui te deklareerite string meeldib see, 296 00:23:15,140 --> 00:23:18,190 s on viit, et läheb minna korstna 297 00:23:18,190 --> 00:23:25,880 ja mida te ei osutades on see nöör, mis sisaldub püsimälu. 298 00:23:25,880 --> 00:23:30,560 Nii lihtsalt nime, püsimälu, sa peaksid idee 299 00:23:30,560 --> 00:23:33,010 et kui te proovida muuta mis kasu on püsimälu, 300 00:23:33,010 --> 00:23:36,670 sa teed midagi, mida sa ei peaks tegema mäluga ja sa segfault. 301 00:23:36,670 --> 00:23:45,360 See on tegelikult suur vahe char * s ja char s []. 302 00:23:45,360 --> 00:23:48,790 Nii char s [], nüüd see string läheb pannakse virna, 303 00:23:48,790 --> 00:23:53,960 ja korstna ei ole ainult lugemiseks, mis tähendab, et see peaks töötama täiesti korras. 304 00:23:55,500 --> 00:23:57,370 Ja ta teeb. 305 00:23:57,370 --> 00:24:06,250 Pea meeles, et kui ma teen char * s = "Tere maailm!", S ise on virnas 306 00:24:06,250 --> 00:24:10,390 kuid s viitab kusagil mujal, ja et kuhugi mujale juhtub olema ainult lugemiseks. 307 00:24:10,390 --> 00:24:15,640 Aga char s [] on lihtsalt midagi pinu. 308 00:24:17,560 --> 00:24:21,760 Nii et järjekordne näide segfault juhtub. 309 00:24:21,760 --> 00:24:27,820 >> Me nägime, et ./buggy1 tulemusena segfault. 310 00:24:27,820 --> 00:24:31,810 Teoreetiliselt ei tohiks te vaatate buggy1.c kohe. 311 00:24:31,810 --> 00:24:35,170 Selle asemel, me vaatame selle läbi gdb. 312 00:24:35,170 --> 00:24:37,750 Pange tähele, et kui sa saad Segmentation fault (core dumpinguhinnaga), 313 00:24:37,750 --> 00:24:40,850 sa saad seda faili siia kutsus tuum. 314 00:24:40,850 --> 00:24:45,200 Kui me ls-l, siis me näeme, et tuum on tavaliselt päris suur fail. 315 00:24:45,200 --> 00:24:51,580 See on number baiti faili, nii et tundub, et see on 250-midagi kilobaiti. 316 00:24:51,580 --> 00:24:56,120 Selle põhjuseks on see, et mida krahh tabab tegelikult on 317 00:24:56,120 --> 00:25:01,410 on siis teie programm jookseb kokku, riik mälu oma programmi 318 00:25:01,410 --> 00:25:05,230 lihtsalt saab kopeerida ja kleepida seda faili. 319 00:25:05,230 --> 00:25:07,270 Läheb visatakse selle faili. 320 00:25:07,270 --> 00:25:13,060 See programm, samal ajal kui see töötab, juhtus olema mälukasutust umbes 250 kilobaiti, 321 00:25:13,060 --> 00:25:17,040 ja nii see on, mida sai dumpinguhinnaga arvesse seda faili. 322 00:25:17,040 --> 00:25:23,630 Nüüd saate vaadata selle faili, kui me teeme gdb buggy1 tuum. 323 00:25:23,630 --> 00:25:30,130 Me ei saa lihtsalt teha gdb buggy1, ja see lihtsalt käivitada gdb regulaarselt, 324 00:25:30,130 --> 00:25:33,800 kasutades buggy1 oma sisendfail. 325 00:25:33,800 --> 00:25:38,260 Aga kui sa gdb buggy1 tuum, siis see on just kavatse alustada gdb 326 00:25:38,260 --> 00:25:40,330 vaadates, et core-faili. 327 00:25:40,330 --> 00:25:45,560 Ja sa tahad öelda, buggy1 vahenditega gdb teab, et core-faili pärineb buggy1 programm. 328 00:25:45,560 --> 00:25:49,580 Nii gdb buggy1 tuum läheb kohe meid 329 00:25:49,580 --> 00:25:52,060 et kui programm juhtus lõpetada. 330 00:25:57,720 --> 00:26:02,340 Me näeme siin Program lõpetada signaal 11, segmenteerimine süü. 331 00:26:02,340 --> 00:26:10,110 Meil juhtub, et näha liini kokkupanek, mis ilmselt ei ole väga kasulik. 332 00:26:10,110 --> 00:26:15,360 Aga kui kirjutad bt või tagasijälituse et see saab olema funktsioon 333 00:26:15,360 --> 00:26:19,430 mis annab meile nimekiri meie praegune korstnat raame. 334 00:26:19,430 --> 00:26:23,150 Nii tagasijälitust. Paistab, et meil on ainult kaks korstnat raame. 335 00:26:23,150 --> 00:26:26,310 Esimene on meie peamine freimi, 336 00:26:26,310 --> 00:26:29,810 ja teine ​​on freimi seda funktsiooni, et meil juhtub olema, 337 00:26:29,810 --> 00:26:34,440 mis näeb välja nagu meil on ainult koost koodi. 338 00:26:34,440 --> 00:26:38,050 Nii et lähme tagasi meie peamine ülesanne, 339 00:26:38,050 --> 00:26:42,300 ja mida teha, et me saame teha frame 1 ja ma arvan, saame teha ka maha, 340 00:26:42,300 --> 00:26:45,160 aga ma peaaegu kunagi seda alla - või üles. Jah. 341 00:26:45,160 --> 00:26:50,710 Üles-alla. Üles viib sind üles üks freimi, alla viib sind maha freimi. 342 00:26:50,710 --> 00:26:53,240 Ma pigem ei kasuta kunagi seda. 343 00:26:53,240 --> 00:26:59,120 Ma lihtsalt konkreetselt öelda, korpus 1, mis on minna sektsioonis 1. 344 00:26:59,120 --> 00:27:01,750 Frame 1 läheb toob meid peamine freimi, 345 00:27:01,750 --> 00:27:05,570 ja ta ütleb siinsamas rida koodi me juhtub olema. 346 00:27:05,570 --> 00:27:07,950 Kui me tahtsime veel paar rida koodi, saame öelda nimekirja, 347 00:27:07,950 --> 00:27:11,280 ja mis läheb meile kõigile rida koodi ümber. 348 00:27:11,280 --> 00:27:13,360 Liin me GDB kell oli 6: 349 00:27:13,360 --> 00:27:17,360 if (strcmp ("CS50 kivid", argv [1]) == 0). 350 00:27:17,360 --> 00:27:24,130 Kui see ei ilmne veel, saad seda kohe siit lihtsalt mõtlesin, miks see GDB. 351 00:27:24,130 --> 00:27:28,800 Aga me saame võtta see üks samm edasi ja öelda: "Miks argv [1] segfault?" 352 00:27:28,800 --> 00:27:38,830 Lähme prindi argv [1], ja tundub, et see on 0x0, mis on null pointer. 353 00:27:38,830 --> 00:27:44,750 Me strcmping CS50 kivid ja null, ja nii, et läheb segfault. 354 00:27:44,750 --> 00:27:48,280 Ja miks on argv [1] null? 355 00:27:48,640 --> 00:27:51,280 [Üliõpilane] Kuna me ei anna see mingeid käsurea argumente. 356 00:27:51,280 --> 00:27:53,390 Jah. Me ei anna see mingeid käsurea argumente. 357 00:27:53,390 --> 00:27:58,460 Nii ./buggy1 on ainult kavatse olla argv [0] olema ./buggy1. 358 00:27:58,460 --> 00:28:02,100 Ta ei kavatse olla argv [1], nii et läheb segfault. 359 00:28:02,100 --> 00:28:07,450 Aga kui selle asemel, ma lihtsalt CS50, see saab öelda Saad D 360 00:28:07,450 --> 00:28:09,950 sest see on, mida see peaks tegema. 361 00:28:09,950 --> 00:28:15,240 Vaadates buggy1.c, see peaks print "Sa saad D" - 362 00:28:15,240 --> 00:28:20,820 Kui argv [1] ei "CS50 kivid", "Sa saad D", teine ​​"Sa saad!" 363 00:28:20,820 --> 00:28:25,660 Nii et kui me tahame, me vajame seda võrrelda kui tõsi, 364 00:28:25,660 --> 00:28:28,710 mis tähendab, et see on võrreldav 0. 365 00:28:28,710 --> 00:28:31,100 Nii argv [1] peab olema "CS50 kivid". 366 00:28:31,100 --> 00:28:35,660 Kui soovite teha seda käsurealt, peate kasutama \ põgeneda ruumi. 367 00:28:35,660 --> 00:28:41,690 Nii CS50 \ kivid ja saad! 368 00:28:41,690 --> 00:28:44,060 Kui sa ei tee längkriips, miks see ei tööta? 369 00:28:44,060 --> 00:28:47,190 [Üliõpilane] See on kaks eri argumente. >> Jah. 370 00:28:47,190 --> 00:28:52,540 Argv [1] saab olema CS50 ja argv [2] saab olema kivid. Okei. 371 00:28:52,540 --> 00:28:56,470 >> Nüüd ./buggy2 läheb segfault uuesti. 372 00:28:56,470 --> 00:29:01,880 Selle asemel, et seda avada oma tuum faili, me lihtsalt avada buggy2 otse, 373 00:29:01,880 --> 00:29:05,000 nii gdb buggy2. 374 00:29:05,000 --> 00:29:09,590 Nüüd, kui me lihtsalt joosta meie programmi, siis see saab öelda Program signaal SIGSEGV, 375 00:29:09,590 --> 00:29:15,530 mis on segfault signaali, ja see on, kus see juhtus juhtuda. 376 00:29:15,530 --> 00:29:21,250 Vaadates meie tagasijälitust, näeme, et me olime funktsioon oh_no, 377 00:29:21,250 --> 00:29:23,900 mis oli kutsunud funktsioon tilluke, mis oli kutsunud funktsioon Binky, 378 00:29:23,900 --> 00:29:26,460 mis oli kutsunud peamine. 379 00:29:26,460 --> 00:29:31,680 Me näeme ka argumente nende funktsioonidega. 380 00:29:31,680 --> 00:29:34,680 Väide, et tilluke ja Binky oli 1. 381 00:29:34,680 --> 00:29:44,390 Kui me loetelu funktsiooni oh_no, näeme, et oh_no on lihtsalt teed char ** s = NULL; 382 00:29:44,390 --> 00:29:47,410 * S = "buum"; 383 00:29:47,410 --> 00:29:50,330 Miks peaks, et ei suuda? 384 00:29:54,330 --> 00:29:58,380 [Üliõpilane] Sa ei saa dereference nullviit? >> Jah. 385 00:29:58,380 --> 00:30:06,090 See on lihtsalt öeldes s on NULL, sõltumata sellest, kas see juhtub olema char ** 386 00:30:06,090 --> 00:30:12,070 mis, sõltuvalt sellest, kuidas seda tõlgendada, võiks see olla kursor kursor string 387 00:30:12,070 --> 00:30:15,550 või massiivi stringe. 388 00:30:15,550 --> 00:30:21,430 See s on NULL, siis * s viite mahavõtmine nullviida, 389 00:30:21,430 --> 00:30:24,800 ja nii see läheb krahhi. 390 00:30:24,800 --> 00:30:27,540 See on üks kiiremaid viise saab olla segfault. 391 00:30:27,540 --> 00:30:31,300 See on lihtsalt kuulutatakse nullviida ja kohe segfaulting. 392 00:30:31,300 --> 00:30:34,570 Seda oh_no teeb. 393 00:30:34,570 --> 00:30:43,400 Kui me läheme üles ühe kaadri, siis me hakka funktsioon, mis nõudis oh_no. 394 00:30:43,400 --> 00:30:44,830 Ma pean tegema, et alla. 395 00:30:44,830 --> 00:30:48,610 Kui te ei sisesta käsk ja sa lihtsalt vajuta Enter uuesti, 396 00:30:48,610 --> 00:30:52,350 see lihtsalt korrata eelmise käsu, et sa jooksid. 397 00:30:52,350 --> 00:30:56,610 Meil on frame 1. 398 00:30:56,610 --> 00:31:04,650 Videod see raam, näeme siin on meie funktsioon. 399 00:31:04,650 --> 00:31:08,520 Võite tabas nimekirja uuesti, või saate teha nimekiri 20 ja see nimekiri veel. 400 00:31:08,520 --> 00:31:13,640 Funktsioon tilluke ütleb, et kui ma 1, siis minge oh_no funktsioon, 401 00:31:13,640 --> 00:31:15,960 muidu minna Keimaileva funktsioon. 402 00:31:15,960 --> 00:31:18,700 Ja me teame, i on 1, sest me juhtuda näha siin 403 00:31:18,700 --> 00:31:22,560 et tilluke kutsuti välja argumendi 1. 404 00:31:22,560 --> 00:31:27,560 Või saab lihtsalt printida i ja siis öelda, i on 1. 405 00:31:27,560 --> 00:31:33,770 Meil on praegu tilluke, ja kui me läheme üles teise raami, me teame, me lõpuks Binky. 406 00:31:33,770 --> 00:31:36,600 Up. Nüüd oleme Binky. 407 00:31:36,600 --> 00:31:41,340 Videod see funktsioon - nimekirja enne poole katkestas mind - 408 00:31:41,340 --> 00:31:52,670 Ta alustas nagu ma on 0, siis me ei kavatse seda nimetada oh_no, muidu kutsun tilluke. 409 00:31:52,670 --> 00:31:57,000 Me teame, olin 1, nii ta kutsus tilluke. 410 00:31:57,000 --> 00:32:05,030 Ja nüüd oleme tagasi peamine ja põhiline on lihtsalt saab olema int i = rand ()% 3; 411 00:32:05,030 --> 00:32:08,790 See on lihtsalt annan teile juhuslik arv, mis on kas 0, 1 või 2. 412 00:32:08,790 --> 00:32:12,780 See saab helistada Binky selle numbri ja siis tagastab 0. 413 00:32:12,780 --> 00:32:16,700 Vaadates seda, 414 00:32:16,700 --> 00:32:19,880 lihtsalt jalgsi läbi programmi käsitsi, ilma et tekiks kohe, 415 00:32:19,880 --> 00:32:25,400 sa paneks murdepunkt on peamine, mis tähendab, et kui me käivitada programmi 416 00:32:25,400 --> 00:32:31,020 teie programm töötab kuni see tabab murdepunkt. 417 00:32:31,020 --> 00:32:35,450 Nii töötab programm, see kestab ja siis tabab põhiülesanne ja peatub. 418 00:32:35,450 --> 00:32:44,700 Nüüd oleme sees peamine, ja järku või järgmise läheb toob meid järgmise rida koodi. 419 00:32:44,700 --> 00:32:47,050 Seda saab teha samm või kõrval. 420 00:32:47,050 --> 00:32:51,800 Lööb kõrval, nüüd ma on seatud rand ()% 3, seega saame trükkida väärtus i, 421 00:32:51,800 --> 00:32:55,280 ja siis öelda, i on 1. 422 00:32:55,280 --> 00:32:58,110 Nüüd see küsimus, kas me kasutame või järgmise sammu. 423 00:32:58,110 --> 00:33:01,000 Ma arvan, et ta Olulised eelmises, kuid me tahaks järgmisena kasutada. 424 00:33:01,000 --> 00:33:06,000 Kui me kasutame samm, me samm funktsioon, mis tähendab, pilk tegelik asi 425 00:33:06,000 --> 00:33:07,940 , mis toimub sees Binky. 426 00:33:07,940 --> 00:33:10,510 Kui me kasutame kõrval, siis see tähendab, minna üle funktsioon 427 00:33:10,510 --> 00:33:14,070 ja lihtsalt minna järgmisele koodirida meie peamine ülesanne. 428 00:33:14,070 --> 00:33:17,900 Siinsamas sellel liinil, olin kus ta ütles rand ()% 3; 429 00:33:17,900 --> 00:33:21,320 kui ma tegin samm oleks minna rakendamiseks rand 430 00:33:21,320 --> 00:33:25,110 ja vaata, mis toimub seal, ja ma võiksin sammult läbi Rand funktsioon. 431 00:33:25,110 --> 00:33:26,920 Aga ma ei hooli rand funktsiooni. 432 00:33:26,920 --> 00:33:30,190 Ma tahan minna järgmisele reale koodi peamine, et ma järgmisena kasutada. 433 00:33:30,190 --> 00:33:35,800 Aga nüüd ma hoolin Binky funktsioon, nii et ma tahan astuda sellest. 434 00:33:35,800 --> 00:33:37,730 Nüüd ma olen Binky. 435 00:33:37,730 --> 00:33:42,040 Esimene rida koodi on öelda, kui (i == 0), mina teen sammu, 436 00:33:42,040 --> 00:33:44,930 näeme me lõpuks kell tilluke. 437 00:33:44,930 --> 00:33:51,620 Kui me nimekiri asjadest, me näeme, et seda kontrollida on i = 0. 438 00:33:51,620 --> 00:33:55,470 Ma ei võrdu 0, nii et see läks teine ​​tingimus, 439 00:33:55,470 --> 00:33:59,540 mis läheb helistada tilluke (i). 440 00:33:59,540 --> 00:34:04,030 Te võite saada segaduses. 441 00:34:04,030 --> 00:34:07,380 Kui sa lihtsalt pilk need read otse, siis võiks arvata, kui (i == 0), 442 00:34:07,380 --> 00:34:10,800 okei, siis ma võtsin sammu ja nüüd ma olen tilluke (i), 443 00:34:10,800 --> 00:34:14,120 siis võiks arvata, et peab tähendama i = 0 või midagi. 444 00:34:14,120 --> 00:34:18,980 Ei, see tähendab lihtsalt, et ta teab seda saab kinni otse liin tilluke (i). 445 00:34:18,980 --> 00:34:23,300 Sest ma ei ole 0, siis järgmine samm ei kavatse lõpeb teine. 446 00:34:23,300 --> 00:34:26,239 Else ei ole kooskõlas see läheb peatu. 447 00:34:26,239 --> 00:34:31,570 See lihtsalt läheb minema järgmisele reale võib see tegelikult täidab, mis on tilluke (i). 448 00:34:31,570 --> 00:34:36,090 Astudes tilluke (i), näeme, kui (i == 1). 449 00:34:36,090 --> 00:34:42,670 Me ei tea, i = 1, nii et kui me samm, me teame, me ei kavatse sattuda oh_no 450 00:34:42,670 --> 00:34:46,489 sest i = 1 nõuab funktsiooni oh_no, kuhu saab astuda, 451 00:34:46,489 --> 00:34:52,969 mis läheb seada char ** s = null ja kohe "buum". 452 00:34:54,270 --> 00:34:59,690 Ja siis tegelikult vaadates rakendamise buggy2, 453 00:34:59,690 --> 00:35:04,590 seda, ma lihtsalt saada juhusliku numbri - 0, 1 või 2 - helistamine Binky, 454 00:35:04,590 --> 00:35:10,610 mis siis, kui ma on 0 see nõuab oh_no, muidu nõuab tilluke, mis kerkib siin. 455 00:35:10,610 --> 00:35:18,100 Kui i on 1 kõne oh_no, muidu kutsun Keimaileva, mis tulemas siin, 456 00:35:18,100 --> 00:35:20,460 kui i on 2, helistada oh_no. 457 00:35:20,460 --> 00:35:24,720 Ma isegi ei usu, et on viis - 458 00:35:24,720 --> 00:35:30,030 Kas keegi näeb, kuidas muuta see programm, mis ei segfault? 459 00:35:30,030 --> 00:35:37,530 Sest kui ma olen midagi puudu, kui i on 0, saate kohe segfault, 460 00:35:37,530 --> 00:35:41,250 muidu lähete funktsioon, mis, kui ma 1 sa segfault, 461 00:35:41,250 --> 00:35:44,540 muidu sa lähed funktsioon, kui ma on 2 te segfault. 462 00:35:44,540 --> 00:35:46,810 Nii et ükskõik, mida te teete, te segfault. 463 00:35:46,810 --> 00:35:52,380 >> Ma arvan, et üks võimalus millega oleks selle asemel teeme char ** s = NULL, 464 00:35:52,380 --> 00:35:55,610 võid malloc ruumi, et stringid. 465 00:35:55,610 --> 00:36:04,230 Võiksime teha malloc (sizeof) - sizeof mida? 466 00:36:09,910 --> 00:36:15,190 [Üliõpilane] (char) * 5? >> Kas see tundub õige? 467 00:36:15,190 --> 00:36:21,060 Ma oletan, et see toimib, kui ma tegelikult jooksis, kuid see pole see, mida ma otsin. 468 00:36:24,400 --> 00:36:32,940 Vaata tüüpi s. Olgem lisada int *, nii int * x. 469 00:36:32,940 --> 00:36:35,600 Teeksin malloc (sizeof (int)). 470 00:36:35,600 --> 00:36:40,490 Või kui ma tahtsin massiivi 5, ma teeksin (sizeof (int) * 5); 471 00:36:40,490 --> 00:36:44,210 Mis siis, kui mul on int **? 472 00:36:46,260 --> 00:36:49,140 Mida ma malloc? 473 00:36:49,140 --> 00:36:53,510 [Üliõpilane] suurus kursor. >> Jah. (Sizeof (int *)); 474 00:36:53,510 --> 00:36:56,960 Sama asi siin. 475 00:36:56,960 --> 00:37:01,280 Ma tahan (sizeof (char *)); 476 00:37:06,170 --> 00:37:12,840 See saab eraldada ruumi osuti, mis näitab, et "buum". 477 00:37:12,840 --> 00:37:15,330 Ma ei vaja eraldada ruumi "buum" ise 478 00:37:15,330 --> 00:37:17,210 sest see on põhimõtteliselt samaväärne sellega, mis ma enne ütlesin 479 00:37:17,210 --> 00:37:20,870 char * x = "buum". 480 00:37:20,870 --> 00:37:27,950 "Buum" on juba olemas. See juhtub, et on olemas ainult lugemiseks piirkonnas mälu. 481 00:37:27,950 --> 00:37:35,200 Aga see on juba olemas, mis tähendab seda rida koodi, kui s on char ** 482 00:37:35,200 --> 00:37:43,900 siis * s on char * ja sa oled, millega see char * käsk "buum". 483 00:37:43,900 --> 00:37:50,040 Kui ma tahtsin kopeerida "BOOM" ümber on, siis mul oleks vaja eraldada ruumi s. 484 00:37:55,170 --> 00:38:03,900 Ma teen * s = malloc (sizeof (char) * 5); 485 00:38:03,900 --> 00:38:06,210 Miks 5? 486 00:38:06,210 --> 00:38:10,860 Miks mitte 4? Tundub "buum" on 4 tähemärki. >> [Üliõpilane] null iseloomu. 487 00:38:10,860 --> 00:38:14,580 Jah. Kõik teie stringid läheb vaja null iseloomu. 488 00:38:14,580 --> 00:38:23,590 Nüüd ma saan teha midagi strcat - Mis on funktsioon, millega saab kopeerida string? 489 00:38:23,590 --> 00:38:28,520 [Üliõpilane] CPY? >> Strcpy. 490 00:38:28,520 --> 00:38:32,700 mees strcpy. 491 00:38:36,120 --> 00:38:39,590 Nii strcpy või strncpy. 492 00:38:39,590 --> 00:38:43,410 strncpy on veidi turvalisem, kuna saad määrata täpselt, kui palju märke, 493 00:38:43,410 --> 00:38:46,190 kuid siin ei ole oluline, sest me teame. 494 00:38:46,190 --> 00:38:50,340 Nii strcpy ja vaatan argumendid. 495 00:38:50,340 --> 00:38:53,100 Esimene argument on meie sihtkohta. 496 00:38:53,100 --> 00:38:56,770 Teine argument on meie allikas. 497 00:38:56,770 --> 00:39:10,310 Me läheme kopeerida meie sihtkohta * s pointer "buum". 498 00:39:10,310 --> 00:39:19,820 Miks võiks sa teha tahad seda strcpy asemel just see, mida meil oli enne 499 00:39:19,820 --> 00:39:22,800 kohta * s = "buum"? 500 00:39:22,800 --> 00:39:28,630 On põhjust võiksite seda teha, kuid mis see on põhjus? 501 00:39:28,630 --> 00:39:31,940 [Üliõpilane] Kui soovite midagi muuta "buum". >> Jah. 502 00:39:31,940 --> 00:39:37,950 Nüüd ma saan teha midagi s [0] = "X"; 503 00:39:37,950 --> 00:39:48,190 sest s punkte hunnik ja et ruumi hunnik et s on suunaga 504 00:39:48,190 --> 00:39:52,320 on viit rohkem ruumi hunnik, mis on hoidmiseks "buum". 505 00:39:52,320 --> 00:39:55,150 Nii et see koopia "buum" on salvestatud hunnik. 506 00:39:55,150 --> 00:39:58,780 Seal on tehniliselt kaks koopiat "buum" meie programmis. 507 00:39:58,780 --> 00:40:03,500 Seal on esimene, mis on lihtsalt antud seda "buum" string konstantne, 508 00:40:03,500 --> 00:40:09,250 ja teine ​​koopia "buum", strcpy loodud koopia "buum". 509 00:40:09,250 --> 00:40:13,100 Aga koopia "buum" on salvestatud hunnik, ja hunnik oled vaba muuta. 510 00:40:13,100 --> 00:40:17,250 Hunnik ei ole ainult lugemiseks, nii et tähendab, et s [0] 511 00:40:17,250 --> 00:40:20,500 läheb teil muuta väärtust "buum". 512 00:40:20,500 --> 00:40:23,130 See läheb teil muuta need märgid. 513 00:40:23,130 --> 00:40:26,640 >> Küsimused? 514 00:40:27,740 --> 00:40:29,290 Okei. 515 00:40:29,290 --> 00:40:35,500 >> Liikudes edasi buggy3, olgem gdb buggy3. 516 00:40:35,500 --> 00:40:39,840 Me lihtsalt käivitada ja näeme me segfault. 517 00:40:39,840 --> 00:40:46,550 Kui me tagasijälituse on ainult kaks ülesannet. 518 00:40:46,550 --> 00:40:52,970 Kui me läheme üles meie peamine ülesanne, näeme, et me GDB selles rida. 519 00:40:52,970 --> 00:41:00,180 Nii lihtsalt vaatab seda joont, for (int rida = 0; fgets see kraam ei võrdu NULL; 520 00:41:00,180 --> 00:41:03,770 rida + +). 521 00:41:03,770 --> 00:41:08,010 Meie eelmise kaadri kutsuti _IO_fgets. 522 00:41:08,010 --> 00:41:10,720 Sa näed, et palju sisseehitatud C funktsioone, 523 00:41:10,720 --> 00:41:15,350 et kui sa segfault, tekib tõesti segasena funktsioonide nimed 524 00:41:15,350 --> 00:41:18,090 Asjalik _IO_fgets. 525 00:41:18,090 --> 00:41:21,770 Aga see läheb seotud selle fgets kõne. 526 00:41:21,770 --> 00:41:25,850 Kusagil sisemuses siin oleme segfaulting. 527 00:41:25,850 --> 00:41:30,340 Kui me vaatame argumente fgets, saame trükkida puhver. 528 00:41:30,340 --> 00:41:41,180 Olgem printida - Oh, ei. 529 00:41:48,980 --> 00:41:51,900 Trüki ei kavatse tööd täpselt nii, nagu ma tahan seda. 530 00:41:55,460 --> 00:41:58,000 Vaatame programmi tegelik. 531 00:42:02,200 --> 00:42:09,640 Puhvrit iseloomu massiivi. See on märk array 128 märki. 532 00:42:09,640 --> 00:42:14,980 Nii et kui ma ütlen prindi puhver, see saab printida need 128 tähemärki 533 00:42:14,980 --> 00:42:18,300 mis ma arvan, on see, mida oodatakse. 534 00:42:18,300 --> 00:42:21,390 Mida ma otsisin on printida aadress puhver, 535 00:42:21,390 --> 00:42:23,680 kuid mis tegelikult ei ütle mulle palju. 536 00:42:23,680 --> 00:42:30,770 Nii et kui ma juhtun ütlema siin x puhver, näitab see mulle 0xbffff090, 537 00:42:30,770 --> 00:42:38,690 mis, kui sa mäletad varasemate või mingil hetkel Oxbffff kipub olema korstna-ish piirkonnas. 538 00:42:38,690 --> 00:42:46,020 Korstnat kipub kuskilt alustama veidi alla 0xc000. 539 00:42:46,020 --> 00:42:51,890 Lihtsalt nähes seda aadressi, ma tean, et puhvrit juhtub pinu. 540 00:42:51,890 --> 00:43:04,500 Taaskäivitamine minu programmi käivitada, üles puhverdada nägime oli see märgijada 541 00:43:04,500 --> 00:43:06,530 et on päris palju mõttetu. 542 00:43:06,530 --> 00:43:12,270 Siis printida faili, mida ei faili välja näeb? 543 00:43:15,120 --> 00:43:17,310 [Üliõpilane] Null. >> Jah. 544 00:43:17,310 --> 00:43:22,610 Fail on tüüpi FILE *, seega on pointer, 545 00:43:22,610 --> 00:43:26,610 ja väärtus, et osuti on null. 546 00:43:26,610 --> 00:43:33,240 Nii fgets läheb püüdma lugeda, et kursorit kaudses mõttes, 547 00:43:33,240 --> 00:43:37,320 vaid selleks, et pääseda et osuti, peab ta dereference ta. 548 00:43:37,320 --> 00:43:40,550 Või selleks, et pääseda mida tuleb osutades, see dereferences ta. 549 00:43:40,550 --> 00:43:43,810 Nii et see on viite mahavõtmine nullviida ja see segfaults. 550 00:43:46,600 --> 00:43:48,730 Ma oleks uuesti sinna. 551 00:43:48,730 --> 00:43:52,170 Kui me break meie Peaasi ja joosta, 552 00:43:52,170 --> 00:43:57,320 esimene rida koodi on char * filename = "nonexistent.txt"; 553 00:43:57,320 --> 00:44:00,870 See peaks andma päris suur vihje, miks seda programmi ei õnnestu. 554 00:44:00,870 --> 00:44:06,080 Kirjutamise kõrval toob mind järgmise rea, kus ma seda faili avada, 555 00:44:06,080 --> 00:44:11,140 ja siis ma kohe sattuda meie rida, kus kord ma tabanud kõrval, see läheb segfault. 556 00:44:11,140 --> 00:44:16,880 Kas keegi taha visata põhjus, miks me võiks segfaulting? 557 00:44:16,880 --> 00:44:19,130 [Üliõpilane] Faili ei ole olemas. >> Jah. 558 00:44:19,130 --> 00:44:22,250 See peaks olema vihje 559 00:44:22,250 --> 00:44:29,570 et kui sa avad faili peate kontrollima, et fail on tegelikult olemas. 560 00:44:29,570 --> 00:44:31,510 Nii et siin, "nonexistent.txt"; 561 00:44:31,510 --> 00:44:34,700 Kui me fopen failinimi lugemiseks, me siis peame ütlema 562 00:44:34,700 --> 00:44:45,870 if (fail == NULL) ja öelda printf ("Faili ei ole olemas!" 563 00:44:45,870 --> 00:44:56,340 või - veel parem - failinimi); return 1; 564 00:44:56,340 --> 00:45:00,300 Nii et nüüd me vaadata, kui see on NULL 565 00:45:00,300 --> 00:45:03,930 enne tegelikult jätkub ja üritab lugeda, et faili. 566 00:45:03,930 --> 00:45:08,800 Saame uusversioon see lihtsalt näha, et see toimib. 567 00:45:11,020 --> 00:45:14,970 Ma ette lisada uus rida. 568 00:45:21,090 --> 00:45:25,290 Nüüd nonexistent.txt ei eksisteeri. 569 00:45:26,890 --> 00:45:30,040 Alati tuleb kontrollida sellist asja. 570 00:45:30,040 --> 00:45:33,870 Alati tuleb vaadata, kui fopen tagastab NULL. 571 00:45:33,870 --> 00:45:38,170 Alati tuleb vaadata, et veenduda, et malloc ei tagasta NULL, 572 00:45:38,170 --> 00:45:41,410 või sa segfault. 573 00:45:42,200 --> 00:45:45,930 >> Nüüd buggy4.c. 574 00:45:49,190 --> 00:45:58,440 Running. Olen aim see ootab sisend või olla lõpmatu silmuspõletamise. 575 00:45:58,440 --> 00:46:01,870 Jah, see on lõpmatu silmuspõletamise. 576 00:46:01,870 --> 00:46:05,560 Nii buggy4. Tundub, et me oleme lõpmatu silmuspõletamise. 577 00:46:05,560 --> 00:46:12,590 Me ei poolita peamine, kulgema meie programm. 578 00:46:12,590 --> 00:46:20,180 In gdb, kui lühend te kasutate on ühemõtteline 579 00:46:20,180 --> 00:46:23,420 või eriline lühendid, et nad pakuvad teile, 580 00:46:23,420 --> 00:46:29,020 siis saate kasutada n järgmisena kasutada, selle asemel et tüüp välja järgmisel lõpuni. 581 00:46:29,020 --> 00:46:33,730 Ja nüüd, et ma olen tabanud n kord, ma ei saa lihtsalt vajuta Enter hoida läheb järgmisel 582 00:46:33,730 --> 00:46:36,640 selle asemel, et tabanud n Enter, n Enter, n Enter. 583 00:46:36,640 --> 00:46:44,630 Tundub, et ma olen mingi loop mis on millega massiiv [i] 0-ga. 584 00:46:44,630 --> 00:46:50,510 Tundub, et ma olen kunagi murrab läbi selle jaoks silmus. 585 00:46:50,510 --> 00:46:54,780 Kui ma printida i, nii et ma on 2, siis ma lähen järgmine. 586 00:46:54,780 --> 00:46:59,250 Ma printida i, i on 3, siis ma lähen järgmine. 587 00:46:59,250 --> 00:47:05,360 Ma printida i ja i on 3. Seejärel printida i, i on 4. 588 00:47:05,360 --> 00:47:14,520 Tegelikult prindi sizeof (massiiv), nii suurus massiiv on 20. 589 00:47:16,310 --> 00:47:32,870 Aga tundub, seal on mõned erilised gdb käsk läheb kuni midagi juhtub. 590 00:47:32,870 --> 00:47:37,620 See on nagu milles tingimus, muutuja väärtus. Aga ma ei mäleta, mis see on. 591 00:47:37,620 --> 00:47:44,100 Nii et kui me jätkame - 592 00:47:44,100 --> 00:47:47,120 Mida sa öelda tahad? Mida sa tuua? 593 00:47:47,120 --> 00:47:50,500 [Üliõpilane] Kas kuvada i lisada - >> Jah. Nii et kuvada saan aidata. 594 00:47:50,500 --> 00:47:54,530 Kui me lihtsalt kuvada i, siis panna siin, mida I väärtus on 595 00:47:54,530 --> 00:47:56,470 nii et ma ei pea seda välja printida iga kord. 596 00:47:56,470 --> 00:48:02,930 Kui me muudkui läheb järgmisel näeme 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 Midagi läheb kohutavalt valesti, ja ma on nullitud kuni 0. 598 00:48:13,330 --> 00:48:22,220 Vaadates buggy4.c näeme kõik, mis juhtub on int massiiv [5]; 599 00:48:22,220 --> 00:48:26,200 for (i = 0; i <= sizeof (massiiv); i + +) 600 00:48:26,200 --> 00:48:28,550 massiiv [i] = 0; 601 00:48:28,550 --> 00:48:31,390 Mida me näeme, et on valesti siin? 602 00:48:31,390 --> 00:48:39,480 Nagu vihje, kui ma tegin gdb buggy4 - olgem murda peamine, run - 603 00:48:39,480 --> 00:48:45,980 Ma ei prindi sizeof (massiiv) lihtsalt näha, mis seisukorras on, kus ma peaks lõpuks välja murda. 604 00:48:47,690 --> 00:48:51,100 Kus ma olen? Kas ma saan? 605 00:48:51,100 --> 00:48:54,280 Ma ei tunnistanud veel. 606 00:48:54,280 --> 00:48:58,680 Nii et printida sizeof (massiiv) ja see on 20, 607 00:48:58,680 --> 00:49:06,690 mida oodata, sest minu massiiv on suurus 5 ja see on 5 täisarvud, 608 00:49:06,690 --> 00:49:12,410 nii et kogu asi peaks olema 5 * sizeof (int) baiti, kus sizeof (int) kipub olema 4. 609 00:49:12,410 --> 00:49:14,780 Nii sizeof (massiiv) on 20. 610 00:49:14,780 --> 00:49:17,420 Mis see peaks olema? 611 00:49:17,420 --> 00:49:21,720 [Üliõpilane] jagatud sizeof (int). >> Jah, / sizeof (int). 612 00:49:21,720 --> 00:49:30,630 Tundub, seal on ikka probleem. Arvan, et see peaks just olema < 613 00:49:30,630 --> 00:49:36,960 kuna see on päris palju alati 00:49:44,860 Nüüd mõtleme, miks see tegelikult katki. 615 00:49:44,860 --> 00:49:53,370 Kas keegi on arvailtaisiin Miks ma reset 0 kuni iga iteratsiooni loop? 616 00:50:01,300 --> 00:50:09,350 Ainuke asi sees siin, et juhtub on see, et massiiv [i] on 0.. 617 00:50:09,350 --> 00:50:15,350 Nii kuidagi, see koodirida põhjustab meie int i tuleb 0.. 618 00:50:16,730 --> 00:50:23,130 [Üliõpilane] Kas võib olla, sest see on tunduvalt mälu see osa i 619 00:50:23,130 --> 00:50:27,970 kui ta arvab, et see on järgmine element massiivi? >> [Bowden] Jah. 620 00:50:27,970 --> 00:50:33,880 Kui me läheme kaugemale lõpuks meie massiiv, 621 00:50:33,880 --> 00:50:39,870 kuidagi seda ruumi, et me ülekaaluka on ülekaalukas väärtus i. 622 00:50:39,870 --> 00:50:48,030 Ja kui me vaatame buggy4, murda peamine, run, 623 00:50:48,030 --> 00:50:53,120 olgem printida aadress i. 624 00:50:53,120 --> 00:50:57,280 Tundub, et see on bffff124. 625 00:50:57,280 --> 00:51:03,930 Vaatame nüüd printida aadress massiiv [0]. 110. 626 00:51:03,930 --> 00:51:06,290 Aga [1]? 114. 627 00:51:06,290 --> 00:51:07,920 [2], 118. 628 00:51:07,920 --> 00:51:14,530 11c, 120. array [5] on bfff124. 629 00:51:14,530 --> 00:51:26,990 Nii array [5] on samal aadressil, i, mis tähendab, et array [5] on i. 630 00:51:26,990 --> 00:51:30,720 Kui nad on sama aadress, siis on sama asi. 631 00:51:30,720 --> 00:51:38,410 Nii et kui me seame array [5] 0, seame me I 0. 632 00:51:38,410 --> 00:51:46,070 Ja kui sina arvad sellest nii korstnat 633 00:51:46,070 --> 00:51:55,590 int i tunnistatakse esimene, mis tähendab i saab mõned ruumi virnas. 634 00:51:55,590 --> 00:52:04,730 Siis array [5] on eraldatud, nii siis 20 baiti jaotatakse pinu. 635 00:52:04,730 --> 00:52:08,400 Nii et ma saab eraldada, siis need 20 baiti saada eraldatud. 636 00:52:08,400 --> 00:52:11,400 Nii et ma juhtub just enne massiivi 637 00:52:11,400 --> 00:52:19,230 ja selle tõttu, kuidas, nagu ma ütlesin eelmisel nädalal, kui see on tehniliselt stack kasvab alla 638 00:52:19,230 --> 00:52:28,520 kui indeks array, meil on tagatud, et 0. positsiooni massiivi 639 00:52:28,520 --> 00:52:31,970 alati juhtub enne esimest positsiooni massiivi. 640 00:52:31,970 --> 00:52:35,900 See on selline kuidas ma joonistasin ta eelmisel nädalal. 641 00:52:35,900 --> 00:52:42,210 Pange tähele, et allosas meil aadressile 0 ja ülaosas oleme aadress Max. 642 00:52:42,210 --> 00:52:44,880 Stack kasvab pidevalt maha. 643 00:52:48,100 --> 00:52:53,500 Oletame, et me eraldada i. 644 00:52:53,500 --> 00:52:59,680 Me eraldada täisarv i, mis tähendab, ütleme lihtsalt siia täisarv i saab eraldada. 645 00:52:59,680 --> 00:53:06,420 Siis me eraldada meie massiivi 5 täisarvud, mis tähendab, et selle all, et 646 00:53:06,420 --> 00:53:11,230 Kuna stack kasvab alla, need 5 täisarvud saada eraldatud. 647 00:53:11,230 --> 00:53:15,900 Aga kuna kuidas massiivid töötada, me garanteerida, et esimesele kohale massiivi 648 00:53:15,900 --> 00:53:22,260 alati on aadress väiksem kui teine ​​asi massiiv. 649 00:53:22,260 --> 00:53:28,270 Nii massiivi asendisse 0 alati peab juhtuma esimene mälu, 650 00:53:28,270 --> 00:53:30,700 arvestades massiivi positsiooni 1 peab juhtuma pärast seda 651 00:53:30,700 --> 00:53:33,310 ja massiivi positsiooni 2 peab juhtuma pärast seda, 652 00:53:33,310 --> 00:53:37,900 mis tähendab, et massiivi asendisse 0 juhtuks kuskil siin all, 653 00:53:37,900 --> 00:53:40,690 massiivi positsiooni 1 juhtuks eespool, et 654 00:53:40,690 --> 00:53:45,530 sest liikuva tähendab kõrgemat aadressid, sest maksimaalne aadress on siin. 655 00:53:45,530 --> 00:53:50,490 Nii massiiv [0] siin all, massiiv [1] siin, massiiv [2] siin, massiiv [3] siin. 656 00:53:50,490 --> 00:53:55,620 Teade kuidas enne me eraldatud täisarvu i kogu tee siia, 657 00:53:55,620 --> 00:54:01,040 kui me liigume kaugemale ja sügavamale meie massiiv, saame üha lähemale meie täisarv i. 658 00:54:01,040 --> 00:54:07,640 See lihtsalt nii juhtub, et array [5], mis on üks positsioon väljaspool meie massiiv, 659 00:54:07,640 --> 00:54:13,010 on täpselt, kus täisarv sattusin eraldatud. 660 00:54:13,010 --> 00:54:16,920 Nii et see punkt, kus me juhtumisi lööb ruumi virnas 661 00:54:16,920 --> 00:54:21,680 mis oli eraldatud täisarvu i, ja me kehtestamisel, et 0-ga. 662 00:54:21,680 --> 00:54:26,160 >> Nii et toimib. Küsimused? Jah. 663 00:54:26,160 --> 00:54:30,710 [Üliõpilane] Never mind. Okei. 664 00:54:30,710 --> 00:54:33,090 [Üliõpilane] Kuidas vältida neid omamoodi vigu? 665 00:54:33,090 --> 00:54:41,190 Need omamoodi vigu? Ärge kasutage C oma programmeerimiskeelt. 666 00:54:41,190 --> 00:54:45,840 Kasuta keelt, mis on massiivi piire kontrollida. 667 00:54:45,840 --> 00:54:55,900 Niikaua kui sa oled ettevaatlik, sa lihtsalt vaja, et vältida läheb mööda piire oma massiivi. 668 00:54:55,900 --> 00:54:58,300 [Üliõpilane] Nii siin, kui me läksime mööda piire oma massiivi - 669 00:54:58,300 --> 00:55:01,840 [Bowden] See, kui asjad hakkavad valesti. >> [Üliõpilane] Oh, okei. 670 00:55:01,840 --> 00:55:05,730 Niikaua kui teil jäävad mällu eraldatud oma massiiv, sa oled hea. 671 00:55:05,730 --> 00:55:12,400 Aga C ei ole veatuvastuse. Kui ma massiiv [1000], siis hea meelega lihtsalt muuta mis juhtub - 672 00:55:12,400 --> 00:55:16,500 See läheb alguses massiivi, siis läheb 1000 asukoha pärast ja seab selle 0-ks. 673 00:55:16,500 --> 00:55:20,000 Ta ei tee ühtegi kontrolli, et oh, see ei ole tegelikult olla 1000 asjad seal. 674 00:55:20,000 --> 00:55:22,750 1000 on nii kaugemale Oleksin muutumises, 675 00:55:22,750 --> 00:55:26,940 arvestades, Java või midagi saad massiivi audis indeks 676 00:55:26,940 --> 00:55:29,820 või indeks auti erand. 677 00:55:29,820 --> 00:55:33,950 Sellepärast palju kõrgemal tasemel keeles on need asjad 678 00:55:33,950 --> 00:55:37,340 kus, kui te minna kaugemale piire massiiv, sa ei suuda 679 00:55:37,340 --> 00:55:40,070 nii et sa ei saa muuta asju altpoolt te 680 00:55:40,070 --> 00:55:42,590 ja siis lähevad asjad palju hullem kui lihtsalt saada erand 681 00:55:42,590 --> 00:55:44,940 ütle, et sa ületasid lõpuks massiiv. 682 00:55:44,940 --> 00:55:50,970 [Üliõpilane] Ja nii me peaksime just muutunud <= lihtsalt > [Bowden] Jah. 683 00:55:50,970 --> 00:55:54,800 See peaks olema 00:55:59,560 alates sizeof (massiiv) on 20, kuid me tahame ainult 5. >> [Üliõpilane] Õigus. 685 00:55:59,560 --> 00:56:04,060 Veel küsimusi? Okei. 686 00:56:04,060 --> 00:56:07,380 >> [Üliõpilane] Mul on küsimus. >> Jah. 687 00:56:07,380 --> 00:56:16,440 [Üliõpilane] Mis on tegelik massiivi muutuja? 688 00:56:16,440 --> 00:56:20,000 [Bowden] Nagu mida on massiivi? 689 00:56:20,000 --> 00:56:24,930 Array ise on sümbol. 690 00:56:24,930 --> 00:56:31,490 See on lihtsalt aadress algust 20 baiti, et me viitamine. 691 00:56:31,490 --> 00:56:38,070 Sa ei mõtle seda kui osuti, kuid see on pidev pointer. 692 00:56:38,070 --> 00:56:44,140 Niipea kui asjad koostatud, muutuja massiivi ei eksisteeri enam. 693 00:56:44,140 --> 00:56:48,210 [Üliõpilane] Niisiis, kuidas see leida suurust massiivi? 694 00:56:48,210 --> 00:56:54,130 Suurus array viitab suurus, mis blokeerivad et sümbol viitab. 695 00:56:54,130 --> 00:57:01,240 Kui ma midagi sellist printf ("% p \ n", array); 696 00:57:01,240 --> 00:57:05,140 olgem käivitada. 697 00:57:12,960 --> 00:57:15,530 Mida ma just tegin valesti? 698 00:57:15,530 --> 00:57:19,220 Array Massiiv deklareeritakse siin. 699 00:57:20,820 --> 00:57:23,200 Oh, siin. 700 00:57:23,200 --> 00:57:31,250 Rõkkama on tark, ja see juhtub märkama, et ma kuulutatud array 5 elementi 701 00:57:31,250 --> 00:57:34,540 aga ma indekseerimise kohale 1000. 702 00:57:34,540 --> 00:57:38,450 Seda saab teha, sest need on lihtsalt konstandid. 703 00:57:38,450 --> 00:57:43,370 Ta saab minna ainult nii kaugele märganud, et ma lähen piiridest massiivi. 704 00:57:43,370 --> 00:57:46,880 Aga teate enne, kui meil oli i vale, 705 00:57:46,880 --> 00:57:51,040 see ei ole võimalik määrata, kui palju väärtusi ma võiks võtta, 706 00:57:51,040 --> 00:57:55,540 nii et see ei saa kindlaks teha, et ma läksin kauem massiivi. 707 00:57:55,540 --> 00:57:59,430 See on lihtsalt rõkkama on tark. 708 00:57:59,430 --> 00:58:03,340 >> Aga nüüd teha buggy4. Mis siis veel ma teen valesti? 709 00:58:03,340 --> 00:58:05,970 Kaudselt kuulutatakse raamatukogu funktsiooni "printf". 710 00:58:05,970 --> 00:58:14,960 Ma tahan # include . 711 00:58:14,960 --> 00:58:18,710 Okei. Nüüd töötab buggy4. 712 00:58:18,710 --> 00:58:24,840 Printimine väärtuse massiivi nagu ma siin tegin, trüki see pointer 713 00:58:24,840 --> 00:58:30,060 trükib midagi, mis näeb välja selline - bfb8805c - mis on mõned aadress 714 00:58:30,060 --> 00:58:33,450 see on seadmes-ish piirkonnas. 715 00:58:33,450 --> 00:58:41,820 Array ise on nagu osuti, kuid see ei ole tegelik pointer, 716 00:58:41,820 --> 00:58:45,410 kuna regulaarne osuti saame muuta. 717 00:58:45,410 --> 00:58:54,700 Array on vaid mõned konstantne. 20 kvartalit mälu algab aadress 0xbfb8805c. 718 00:58:54,700 --> 00:59:09,020 Nii bfb8805c läbi selle aadressi +20--või ma arvan -20 - 719 00:59:09,020 --> 00:59:17,400 on kõik mälu eraldatakse see massiiv. 720 00:59:17,400 --> 00:59:20,350 Array, muutuja ise ei salvestata kuhugi. 721 00:59:20,350 --> 00:59:27,660 Kui olete koostamise, tõlkija - käsi lehvita seda - 722 00:59:27,660 --> 00:59:33,060 kuid kompilaator lihtsalt kasutada kui ta teab massiiv olla. 723 00:59:33,060 --> 00:59:36,090 Ta teab, kus see massiiv hakkab, 724 00:59:36,090 --> 00:59:40,910 ja nii see saab alati lihtsalt teha asju nii korvab selle algust. 725 00:59:40,910 --> 00:59:43,960 See ei pea muutuja ise esindada massiivi. 726 00:59:43,960 --> 00:59:53,730 Aga kui ma midagi sellist int * p = array; nüüd p on viit, mis osutab, et massiiv, 727 00:59:53,730 --> 00:59:57,830 ja nüüd p tegelikult ei eksisteeri pinu. 728 00:59:57,830 --> 01:00:01,950 Ma olen vabalt muuta lk. Ma suudan p = malloc. 729 01:00:01,950 --> 01:00:06,500 Nii see algselt viitas massiivis nüüd see esile mõningaid ruumi hunnik. 730 01:00:06,500 --> 01:00:09,620 Ma ei saa array = malloc. 731 01:00:09,620 --> 01:00:13,710 Kui rõkkama on tark, siis karju mu õigus ära nahkhiir. 732 01:00:17,000 --> 01:00:21,430 Tegelikult olen ma üsna kindel, et gcc teeks seda ka. 733 01:00:21,430 --> 01:00:25,010 Nii massiivi tüüp "int [5]" ei ole võõrandatav. 734 01:00:25,010 --> 01:00:28,040 Sa ei saa anda midagi massiivi tüüp 735 01:00:28,040 --> 01:00:30,500 sest massiiv on lihtsalt konstant. 736 01:00:30,500 --> 01:00:34,760 See on sümbol, millised viited need 20 baiti. Ma ei saa seda muuta. 737 01:00:34,760 --> 01:00:37,690 >> [Üliõpilane] Ja kus on suurus array salvestada? 738 01:00:37,690 --> 01:00:40,670 [Bowden] See ei ole salvestatud kuhugi. See on, kui ta on koostamisel. 739 01:00:40,670 --> 01:00:46,310 Nii et kui on suurus array salvestada? 740 01:00:46,310 --> 01:00:51,870 Seda saab kasutada ainult sizeof (massiiv) sees funktsiooni, et massiiv on kuulutanud end. 741 01:00:51,870 --> 01:01:03,150 Nii et kui ma teen mingi funktsiooni, suva, ja mina (int massiiv []) 742 01:01:03,150 --> 01:01:10,450 printf ("% d \ n", sizeof (massiiv)); 743 01:01:10,450 --> 01:01:21,330 ja siis siia ma kutsun foo (massiiv); 744 01:01:21,330 --> 01:01:24,840 sees seda funktsiooni - olgem käivitada. 745 01:01:34,200 --> 01:01:36,840 See on rõkkama on tark uuesti. 746 01:01:36,840 --> 01:01:43,890 See ütleb mulle, et sizeof kohta massiivi funktsiooni parameeter 747 01:01:43,890 --> 01:01:46,690 naaseb suurus "int *". 748 01:01:46,690 --> 01:01:55,150 See oleks viga, kui see pole see, mida ma tahtsin juhtuda. 749 01:01:55,150 --> 01:01:58,960 Olgem tegelikult lülitada Werror. 750 01:02:14,950 --> 01:02:17,590 Hoiatus. Hoiatused on kõik korras. 751 01:02:17,590 --> 01:02:19,960 See on siiski koguda nii kaua, kui see on hoiatus. 752 01:02:19,960 --> 01:02:22,910 . / A.out läheb printida 4. 753 01:02:22,910 --> 01:02:28,650 Hoiatus, mis oli loodud on selge märk, mis läks valesti. 754 01:02:28,650 --> 01:02:34,120 See int massiiv on lihtsalt trükkimise sizeof (int *). 755 01:02:34,120 --> 01:02:39,790 Isegi kui ma panen array [5] siin, see on ikka lihtsalt trükkimise sizeof (int *). 756 01:02:39,790 --> 01:02:47,440 Nii et niipea kui sa sinna juhitakse funktsioon, vahet massiivid ja viiteid 757 01:02:47,440 --> 01:02:49,670 on olematu. 758 01:02:49,670 --> 01:02:52,640 See juhtub olema massiivi kuulutas korstnat 759 01:02:52,640 --> 01:02:58,300 kuid niipea, kui võtame seda väärtust, et 0xbf blaa, blaa, blaa sellesse funktsiooni, 760 01:02:58,300 --> 01:03:03,350 siis see osuti osutab, et massiivi kohta virna. 761 01:03:03,350 --> 01:03:08,310 See tähendab, et sizeof kehtib ainult funktsioon, mis massiivi tunnistati, 762 01:03:08,310 --> 01:03:11,230 mis tähendab, et kui teil on koostamisel seda funktsiooni, 763 01:03:11,230 --> 01:03:17,330 kui rõkkama läbib seda funktsiooni, see näeb massiiv on int array suurus 5. 764 01:03:17,330 --> 01:03:20,640 Siis ta näeb sizeof (massiiv). Noh, see on 20. 765 01:03:20,640 --> 01:03:26,440 See on tegelikult kuidas sizeof põhimõtteliselt töötab peaaegu kõikidel juhtudel. 766 01:03:26,440 --> 01:03:31,150 Sizeof ei ole funktsioon, see on operaator. 767 01:03:31,150 --> 01:03:33,570 Sa ei helista sizeof funktsioon. 768 01:03:33,570 --> 01:03:38,280 Sizeof (int), kompilaator lihtsalt tõlkida, et kuni 4. 769 01:03:41,480 --> 01:03:43,700 Said aru? Okei. 770 01:03:43,700 --> 01:03:47,520 >> [Üliõpilane] Mis vahe on sizeof (massiiv) on peamine ja suva? 771 01:03:47,520 --> 01:03:52,840 Seda seetõttu, et me ütleme sizeof (massiiv), mis on tüüpi int *, 772 01:03:52,840 --> 01:03:57,120 arvestades, et massiivi siin all ei ole tüüpi int *, see on int massiiv. 773 01:03:57,120 --> 01:04:04,540 >> [Üliõpilane] Nii et kui teil oli parameetri array [] asemel int * massiiv, 774 01:04:04,540 --> 01:04:09,230 kas see tähendab, et sa võiksid veel muutuda massiivi, sest nüüd on pointer? 775 01:04:09,230 --> 01:04:14,250 [Bowden] Nagu see on? >> [Üliõpilane] Jah. Kas te muudate array jooksul funktsioon nüüd? 776 01:04:14,250 --> 01:04:18,420 [Bowden] Sa võid muuta massiivi mõlemal juhul. 777 01:04:18,420 --> 01:04:23,130 Mõlemal juhul võite vabalt öelda, massiiv [4] = 0. 778 01:04:23,130 --> 01:04:26,590 [Üliõpilane] Aga sa saad teha massiivi käsk midagi muud? 779 01:04:26,590 --> 01:04:30,230 [Bowden] Oh. Jah. Mõlemal juhul - >> [üliõpilane] Jah. 780 01:04:30,230 --> 01:04:38,410 [Bowden] vahet massiiv [] ja int * massiiv, ei ole. 781 01:04:38,410 --> 01:04:42,570 Samuti saate mõned mitmemõõtmelise massiivi siin 782 01:04:42,570 --> 01:04:47,050 mõned mugav süntaks, kuid see on ikka lihtsalt kursor. 783 01:04:47,050 --> 01:04:56,400 See tähendab, et ma olen vaba tegema massiiv = malloc (sizeof (int)); ja nüüd juhtida kusagil mujal. 784 01:04:56,400 --> 01:04:59,610 Aga lihtsalt meeldib, kuidas see töötab igavesti ja alati, 785 01:04:59,610 --> 01:05:03,210 muutes selle massiivi muutes viitavad millegi muuga 786 01:05:03,210 --> 01:05:07,570 Seda ei muuda massiivi siia alla kuna see on koopia argument, 787 01:05:07,570 --> 01:05:10,780 see ei ole osuti sellele argumendile. 788 01:05:10,780 --> 01:05:16,070 Ja tegelikult, nagu rohkem märge, et see on täpselt sama - 789 01:05:16,070 --> 01:05:21,100 me juba nägime, mida trükkimine massiivi pildid - 790 01:05:21,100 --> 01:05:31,410 Mis siis, kui me printida aadress massiiv või aadress aadress massiivi 791 01:05:31,410 --> 01:05:36,290 et kumbki neist? 792 01:05:41,770 --> 01:05:45,220 Olgem ignoreerida seda. 793 01:05:48,140 --> 01:05:51,660 Okei. See on hea. See on nüüd töökorras. / A.out. 794 01:05:51,660 --> 01:06:00,220 Trükkimine massiiv, siis trüki aadress massiiv, on sama asi. 795 01:06:00,220 --> 01:06:02,870 Array lihtsalt ei ole olemas. 796 01:06:02,870 --> 01:06:08,190 Ta teab, kui te prindite massiiv, te prindite sümbol, mis viitab neile 20 baiti. 797 01:06:08,190 --> 01:06:11,940 Printimine aadress massiivi, noh, massiiv ei eksisteeri. 798 01:06:11,940 --> 01:06:17,200 See ei pea aadress, nii see lihtsalt trükib aadress need 20 baiti. 799 01:06:20,820 --> 01:06:28,150 Niipea kui sa kompileerida alla, nagu teie koostatud buggy4. / A.out, 800 01:06:28,150 --> 01:06:30,340 massiiv on olematu. 801 01:06:30,340 --> 01:06:33,640 Näiturid olemas. Massiivid ei ole. 802 01:06:34,300 --> 01:06:38,060 Plokid mälu esindavad massiivi endiselt olemas, 803 01:06:38,060 --> 01:06:43,270 kuid muutuja massiivi ja muutujate seda tüüpi ei eksisteeri. 804 01:06:46,260 --> 01:06:50,270 Need on nagu peamised erinevused massiivid ja viiteid 805 01:06:50,270 --> 01:06:55,590 on niipea kui teete funktsioon nõuab, ei ole mingit vahet. 806 01:06:55,590 --> 01:07:00,460 Aga sees funktsiooni, et massiiv ise on välja kuulutatud, sizeof töötab erinevalt 807 01:07:00,460 --> 01:07:05,190 kuna te prindite suurus plokid asemel suurusest tüüp, 808 01:07:05,190 --> 01:07:08,950 ja sa ei saa seda muuta, sest see on sümbol. 809 01:07:08,950 --> 01:07:14,370 Printimine asi ja aadress asi prindib sama asi. 810 01:07:14,370 --> 01:07:18,480 Ja see on päris palju see. 811 01:07:18,480 --> 01:07:20,820 [Üliõpilane] Kas te ütlete, et veel üks kord? 812 01:07:21,170 --> 01:07:24,170 Ma oleks võinud vastamata midagi. 813 01:07:24,170 --> 01:07:29,260 Trükkimine massiivi ja aadress massiivi prindib sama asi, 814 01:07:29,260 --> 01:07:33,180 samas kui prindite pointer vs aadress pointer, 815 01:07:33,180 --> 01:07:36,010 üks asi prindib aadress mida sa osutades, 816 01:07:36,010 --> 01:07:40,360 muud prindib aadress kursorit pinu. 817 01:07:40,360 --> 01:07:47,040 Saate muuta pointer, sa ei saa muuta massiivi sümbol. 818 01:07:47,740 --> 01:07:53,270 Ja sizeof osuti läheb printida suurusest et osutiloendurid. 819 01:07:53,270 --> 01:07:57,470 Nii int * p sizeof (p) trükkimineku 4, 820 01:07:57,470 --> 01:08:04,110 kuid int massiiv [5] prindi sizeof (massiiv) on trükkimineku 20. 821 01:08:04,110 --> 01:08:07,480 [Üliõpilane] Nii int massiiv [5] prindib 20? >> Jah. 822 01:08:07,480 --> 01:08:13,300 Sellepärast sees buggy4 kui ta varem sizeof (massiiv) 823 01:08:13,300 --> 01:08:16,660 Selle tegin ma <20, mis ei ole see, mida tahtsime. 824 01:08:16,660 --> 01:08:20,880 Tahame i <5. >> [Üliõpilane] Okei. 825 01:08:20,880 --> 01:08:25,569 [Bowden] Ja siis niipea kui hakkate läbivad ülesanded, 826 01:08:25,569 --> 01:08:34,340 kui me tegime int * p = array; 827 01:08:34,340 --> 01:08:39,779 sees seda funktsiooni, saame põhimõtteliselt kasutada p ja massiivi täpselt samal viisil, 828 01:08:39,779 --> 01:08:43,710 välja arvatud sizeof probleem ja muutuva probleemi. 829 01:08:43,710 --> 01:08:49,810 Aga p [0] = 1; on sama, mis öelda massiiv [0] = 1; 830 01:08:49,810 --> 01:08:55,600 Ja niipea kui me ütleme foo (massiiv); või foo (p); 831 01:08:55,600 --> 01:08:59,760 sees suva funktsioon, see on sama kõne kaks korda. 832 01:08:59,760 --> 01:09:03,350 Ei ole erinevus nende kahe kõned. 833 01:09:07,029 --> 01:09:11,080 >> Igaüks head on? Okei. 834 01:09:14,620 --> 01:09:17,950 Meil on 10 minutit. 835 01:09:17,950 --> 01:09:28,319 >> Üritame saada läbi selle Hacker Typer programmi 836 01:09:28,319 --> 01:09:32,350 sellel veebilehel, mis tuli välja eelmisel aastal või midagi. 837 01:09:34,149 --> 01:09:41,100 See on lihtsalt pidi olema nagu kirjutad juhuslikult ja ta prindib välja - 838 01:09:41,100 --> 01:09:46,729 Ükskõik faili see juhtub laaditud on see, mis tundub nagu sa kirjutad. 839 01:09:46,729 --> 01:09:52,069 See näeb välja nagu mingi operatsioonisüsteemi koodi. 840 01:09:53,760 --> 01:09:56,890 See, mida me tahame rakendada. 841 01:10:08,560 --> 01:10:11,690 Sul peaks olema binaarsel nimega hacker_typer 842 01:10:11,690 --> 01:10:14,350 mis võtab ühe argumendi, fail "häkker tüüp." 843 01:10:14,350 --> 01:10:16,480 Running käivitatava peaks selge ekraan 844 01:10:16,480 --> 01:10:20,850 ja siis printida välja üks sümbolitest edasikanduvad failis iga kord, kui kasutaja vajutab. 845 01:10:20,850 --> 01:10:24,990 Mida iganes klahvi vajutate, peaks ta minema visata ja selle asemel trükkida tegelasele fail 846 01:10:24,990 --> 01:10:27,810 mis on argument. 847 01:10:29,880 --> 01:10:34,350 Ma päris palju öelda, mida asjadest me ei kavatse vaja teada on. 848 01:10:34,350 --> 01:10:36,440 Aga me tahame kontrollida termios raamatukogu. 849 01:10:36,440 --> 01:10:44,840 Ma ei ole kunagi kasutanud seda raamatukogu kogu mu elu, nii et see on väga minimaalne eesmärkidel. 850 01:10:44,840 --> 01:10:48,610 Aga see saab olema raamatukogu saame kasutada ära visata märk põrkad 851 01:10:48,610 --> 01:10:52,390 kui sa kirjutad kirjakeele sisse 852 01:10:56,970 --> 01:11:05,840 Nii hacker_typer.c, ja me ei kavatse taha # include . 853 01:11:05,840 --> 01:11:12,870 Vaadates man-leheküljelt termios - Ma aim see terminal OS või midagi - 854 01:11:12,870 --> 01:11:16,240 Ma ei tea, kuidas seda lugeda. 855 01:11:16,240 --> 01:11:21,040 Vaadates seda, ta ütleb, et hõlmata need 2 faili, nii et me teeme seda. 856 01:11:37,620 --> 01:11:46,820 >> Kõigepealt esimene, me tahame võtta ühe argumendi, mis on faili peaksime avama. 857 01:11:46,820 --> 01:11:52,420 Mida ma tahan teha? Kuidas vaadata Mul on üks argument? 858 01:11:52,420 --> 01:11:56,480 [Üliõpilane] Kui argc võrdub see. >> [Bowden] Jah. 859 01:11:56,480 --> 01:12:21,250 Nii et kui (argc! = 2) printf ("Kasutamine:% s [Avatav]"). 860 01:12:21,250 --> 01:12:32,750 Nii et nüüd, kui ma saan seda ilma et teine ​​argument - oh, mul on vaja uut rida - 861 01:12:32,750 --> 01:12:36,240 näete seda ütleb kasutamine:. / hacker_typer, 862 01:12:36,240 --> 01:12:39,770 ja siis teine ​​argument peaks olema faili tahan avada. 863 01:12:58,430 --> 01:13:01,260 Mida ma nüüd teen? 864 01:13:01,260 --> 01:13:08,490 Ma tahan lugeda seda pilti. Kuidas lugeda failist? 865 01:13:08,490 --> 01:13:11,920 [Üliõpilane] avate seda esimesena. >> Jah. 866 01:13:11,920 --> 01:13:15,010 Nii fopen. Mis fopen välja näeb? 867 01:13:15,010 --> 01:13:22,980 [Üliõpilane] Filename. >> [Bowden] Faili saab olema argv [1]. 868 01:13:22,980 --> 01:13:26,110 [Üliõpilane] Ja siis, mida sa tahad sellega teha, nii - >> [Bowden] Jah. 869 01:13:26,110 --> 01:13:28,740 Nii et kui te ei mäleta, siis võiks lihtsalt teha mees fopen, 870 01:13:28,740 --> 01:13:32,960 kus see saab olema const char * tee, kus tee on failinimi, 871 01:13:32,960 --> 01:13:34,970 const char * režiimis. 872 01:13:34,970 --> 01:13:38,660 Kui juhtub, et ei mäleta, mida režiim on, siis võid otsida režiimis. 873 01:13:38,660 --> 01:13:44,660 Toas man lehekülgi kaldkriipsuga mida saate otsida asju. 874 01:13:44,660 --> 01:13:49,790 Nii et ma kirjutada / mode otsida režiimis. 875 01:13:49,790 --> 01:13:57,130 n ja N, mida saab kasutada tsükli läbi otsida vastet. 876 01:13:57,130 --> 01:13:59,800 Siin öeldakse argument režiim viitab string 877 01:13:59,800 --> 01:14:01,930 alustades üks järgnevatest koodidest. 878 01:14:01,930 --> 01:14:06,480 Nii R, avatud tekstifaili lugemiseks. See, mida me tahame teha. 879 01:14:08,930 --> 01:14:13,210 Lugemiseks, ja ma tahan hoida seda. 880 01:14:13,210 --> 01:14:18,720 Asi saab olema FILE *. Mida ma nüüd teha tahad? 881 01:14:18,720 --> 01:14:21,200 Andke mulle hetk aega. 882 01:14:28,140 --> 01:14:30,430 Okei. Mida ma nüüd teha tahad? 883 01:14:30,430 --> 01:14:32,940 [Üliõpilane] Kontrollige, kas see on NULL. >> [Bowden] Jah. 884 01:14:32,940 --> 01:14:38,690 Iga kord, kui avate faili, veenduge, et olete edukalt suutnud seda avada. 885 01:14:58,930 --> 01:15:10,460 >> Nüüd ma tahan teha, et termios värk, kus ma tahan kõigepealt lugeda minu praegused seaded 886 01:15:10,460 --> 01:15:14,050 ning salvestada need millekski, siis tahan ma oma seadeid muuta 887 01:15:14,050 --> 01:15:19,420 visata suvaline märk, et ma tüüpi, 888 01:15:19,420 --> 01:15:22,520 ja siis ma tahan uuendada neid seadeid. 889 01:15:22,520 --> 01:15:27,250 Ja siis lõpus programm, ma tahan muuta tagasi oma algsed seaded. 890 01:15:27,250 --> 01:15:32,080 Nii struct saab olema tüüpi termios, ja ma lähen taha kaks neist. 891 01:15:32,080 --> 01:15:35,600 Esimene saab olema minu current_settings, 892 01:15:35,600 --> 01:15:42,010 ja siis nad ei kavatse olla minu hacker_settings. 893 01:15:42,010 --> 01:15:48,070 Esiteks, ma lähen soovite salvestada minu praegused seaded, 894 01:15:48,070 --> 01:15:53,790 siis ma lähen soovite värskendada hacker_settings, 895 01:15:53,790 --> 01:16:01,570 ja siis tee lõpus minu programm, ma tahan tagasi praegused seaded. 896 01:16:01,570 --> 01:16:08,660 Nii säästa praeguste seadetega viisil, mis toimib, siis mees termios. 897 01:16:08,660 --> 01:16:15,810 Me näeme, et meil on see int tcsetattr, int tcgetattr. 898 01:16:15,810 --> 01:16:22,960 Ma läbida termios struct oma pointer. 899 01:16:22,960 --> 01:16:30,640 Kuidas see välja nägema on - Ma olen juba unustanud, mida funktsioon kutsuti. 900 01:16:30,640 --> 01:16:34,930 Kopeeri ja kleebi see. 901 01:16:39,150 --> 01:16:45,500 Nii tcgetattr, siis ma tahan läbida struct, et ma hoian teavet, 902 01:16:45,500 --> 01:16:49,650 mis saab olema current_settings, 903 01:16:49,650 --> 01:16:59,120 ja esimene argument on failipide jaoks asi, mida ma tahan salvestada atribuudid. 904 01:16:59,120 --> 01:17:04,360 Mis failipide on nagu iga kord, kui avate faili, see läheb failipide. 905 01:17:04,360 --> 01:17:14,560 Kui ma fopen argv [1], siis saab faili deskriptor mis sa viitad 906 01:17:14,560 --> 01:17:16,730 kui soovite lugeda või sellele kirjutada. 907 01:17:16,730 --> 01:17:19,220 See pole failipide ma tahan kasutada siin. 908 01:17:19,220 --> 01:17:21,940 On kolm faili kirjelduste teil on vaikimisi 909 01:17:21,940 --> 01:17:24,310 mis on standard, standardi välja ja standardviga. 910 01:17:24,310 --> 01:17:29,960 Vaikimisi Ma arvan, et see standard on 0, standard välja on 1 ja standard viga on 2.. 911 01:17:29,960 --> 01:17:33,980 Mida ma tahan muutke? 912 01:17:33,980 --> 01:17:37,370 Ma tahan muutke kui ma tabanud iseloomuga, 913 01:17:37,370 --> 01:17:41,590 Ma tahan seda visata, et iseloomu ära printimise asemel selle ekraani. 914 01:17:41,590 --> 01:17:45,960 Mis oja - standard, standard välja, või standardviga - 915 01:17:45,960 --> 01:17:52,050 vastab asju, kui ma tüüpi kell klaviatuuri? >> [Üliõpilane] Standard logitud >> Jah. 916 01:17:52,050 --> 01:17:56,450 Ma võin kas teha 0 või ma teha saan stdin. 917 01:17:56,450 --> 01:17:59,380 Ma saan current_settings standardi sisse 918 01:17:59,380 --> 01:18:01,720 >> Nüüd ma tahan uuendada need seaded, 919 01:18:01,720 --> 01:18:07,200 Nii et esimene Ma kopeerida sisse hacker_settings mida mu current_settings on. 920 01:18:07,200 --> 01:18:10,430 Ja kuidas structs töö on see lihtsalt kopeerida. 921 01:18:10,430 --> 01:18:14,510 See kopeerib kõik väljad, kui te ootaks. 922 01:18:14,510 --> 01:18:17,410 >> Nüüd ma tahan uuendada mõned väljad. 923 01:18:17,410 --> 01:18:21,670 Vaadates termios, siis oleks läbi lugeda palju see 924 01:18:21,670 --> 01:18:24,110 lihtsalt näha, mida te soovite otsida, 925 01:18:24,110 --> 01:18:28,210 kuid lippe sa lähed tahad otsida on kaja, 926 01:18:28,210 --> 01:18:33,110 nii Kaja Kaja sisend tähemärki. 927 01:18:33,110 --> 01:18:37,710 Esiteks tahan, et seada - Ma olen juba unustanud, mis väljad on. 928 01:18:45,040 --> 01:18:47,900 See on see, mida struct välja näeb. 929 01:18:47,900 --> 01:18:51,060 Nii režiime Ma arvan, me tahame muuta. 930 01:18:51,060 --> 01:18:54,210 Me vaatame lahendus veenduda, et see, mida me tahame muuta. 931 01:19:04,060 --> 01:19:12,610 Me tahame muuta lflag vältimiseks oleks vaja vaadata läbi kõik need. 932 01:19:12,610 --> 01:19:14,670 Me tahame muuta kohalike olekutes. 933 01:19:14,670 --> 01:19:17,710 Sa oleks võinud läbi lugeda kogu see asi, et mõista, kus kõik kuulub 934 01:19:17,710 --> 01:19:19,320 et me tahame muuta. 935 01:19:19,320 --> 01:19:24,120 Aga see on sees kohalike režiimid, kuhu me läheme, et soovite muuta. 936 01:19:27,080 --> 01:19:33,110 Nii hacker_settings.cc_lmode on, kuidas seda nimetatakse. 937 01:19:39,630 --> 01:19:43,020 c_lflag. 938 01:19:49,060 --> 01:19:52,280 See on koht, kus me sattuda BitWise ettevõtjad. 939 01:19:52,280 --> 01:19:54,860 Oleme selline aeg otsa, aga me läheme läbi see reaalne kiire. 940 01:19:54,860 --> 01:19:56,600 See on koht, kus me sattuda BitWise ettevõtjad, 941 01:19:56,600 --> 01:19:59,950 kus ma arvan, ma ütlesin üks kord ammu, et kui hakkate tegelevad lipud, 942 01:19:59,950 --> 01:20:03,370 sa kavatsed kasutada BitWise operaatori palju. 943 01:20:03,370 --> 01:20:08,240 Iga natuke lipu vastab mingisugune käitumine. 944 01:20:08,240 --> 01:20:14,090 Nii et siin, see lipp on hunnik erinevaid asju, kus nad kõik tähendab midagi muud. 945 01:20:14,090 --> 01:20:18,690 Aga mida ma tahan teha, on lihtsalt lülitage natuke, mis vastab kaja. 946 01:20:18,690 --> 01:20:25,440 Nii et olukorda muuta ära mina & = ¬ humanitaarabi. 947 01:20:25,440 --> 01:20:30,110 Tegelikult ma arvan, et see on nagu techo või midagi. Ma lähen, et kontrollida uuesti. 948 01:20:30,110 --> 01:20:34,050 Ma ei termios ta. See on lihtsalt kaja. 949 01:20:34,050 --> 01:20:38,440 ECHO saab olema ühe natuke. 950 01:20:38,440 --> 01:20:44,230 ¬ humanitaarabi läheb tähenda kõik bitid on seatud 1, mis tähendab, kõik lipud on seatud tõeseks 951 01:20:44,230 --> 01:20:47,140 välja arvatud humanitaarabi natuke. 952 01:20:47,140 --> 01:20:53,830 Autor lõpeb mu kohalik lipud sellega, see tähendab, kõik lipud, mis on praegu seatud tõeseks 953 01:20:53,830 --> 01:20:56,520 ikkagi on true. 954 01:20:56,520 --> 01:21:03,240 Kui minu ECHO lipp on seatud tõeseks, siis see on tingimata seatud vale kohta ECHO lipp. 955 01:21:03,240 --> 01:21:07,170 Nii et see rida koodi lihtsalt lülitab ECHO lipp. 956 01:21:07,170 --> 01:21:16,270 Teine rida koodi, ma lihtsalt kopeerida neid huvides aega ja siis selgitada. 957 01:21:27,810 --> 01:21:30,180 Lahuses, ütles ta 0. 958 01:21:30,180 --> 01:21:33,880 See on ilmselt parem selgesõnaliselt öelda stdin. 959 01:21:33,880 --> 01:21:42,100 >> Pange tähele, et ma olen ka teed ECHO | icanon siin. 960 01:21:42,100 --> 01:21:46,650 Icanon viitab millelegi eraldi, mis tähendab, kanooniline režiimis. 961 01:21:46,650 --> 01:21:50,280 Mis kanooniline režiimi abil on tavaliselt siis, kui tipite välja käsurealt 962 01:21:50,280 --> 01:21:54,670 standard ei töötle midagi, kuni te tabanud reavahetus. 963 01:21:54,670 --> 01:21:58,230 Nii et kui sa getString, kirjutad hunnik asju, siis põrkad reavahetus. 964 01:21:58,230 --> 01:22:00,590 See, kui see on saadetud standard sisse 965 01:22:00,590 --> 01:22:02,680 See on vaikimisi. 966 01:22:02,680 --> 01:22:05,830 Kui ma välja lülitada kanooniline režiim, nüüd iga märgi, kui vajutate 967 01:22:05,830 --> 01:22:10,910 on see, mida saab töödelda, mis on tavaliselt selline halb, sest see on aeglane protsess nende hulgas 968 01:22:10,910 --> 01:22:14,330 mis on põhjus, miks see hea puhverdada see kogu liini. 969 01:22:14,330 --> 01:22:16,810 Aga ma tahan iga märk tuleb töödelda 970 01:22:16,810 --> 01:22:18,810 sest ma ei taha seda ootama mind lüüa reavahetus 971 01:22:18,810 --> 01:22:21,280 enne ta töötleb kõik märgid ma olen kirjutades. 972 01:22:21,280 --> 01:22:24,760 See lülitab kanooniline režiimis. 973 01:22:24,760 --> 01:22:31,320 See värk lihtsalt tähendab, kui ta tegelikult töötleb tähemärki. 974 01:22:31,320 --> 01:22:35,830 See tähendab, töödelda neid koheselt niipea, kui ma kirjutades neid, töötleb neid. 975 01:22:35,830 --> 01:22:42,510 Ja see on funktsioon, mis värskendab minu seaded standard, 976 01:22:42,510 --> 01:22:45,480 ja TCSA vahenditega seda teha just nüüd. 977 01:22:45,480 --> 01:22:50,310 Teised viisid on oodata kõike, mis on praegu oja on töödeldud. 978 01:22:50,310 --> 01:22:52,030 See ei ole tegelikult küsimus. 979 01:22:52,030 --> 01:22:56,920 Just praegu oma seadeid muuta, et kõik, mis on praegu hacker_typer_settings. 980 01:22:56,920 --> 01:23:02,210 Ma arvan, et ma kutsusin seda hacker_settings, niiet muuda. 981 01:23:09,610 --> 01:23:13,500 Muutus kõike hacker_settings. 982 01:23:13,500 --> 01:23:16,870 >> Nüüd lõpus meie programmi me ei kavatse soovivad naasta 983 01:23:16,870 --> 01:23:20,210 sellega, mis on praegu sees normal_settings, 984 01:23:20,210 --> 01:23:26,560 mis läheb lihtsalt nägema ja normal_settings. 985 01:23:26,560 --> 01:23:30,650 Teade ma ei ole muutunud kõik mu normal_settings kuna algselt saada tööd. 986 01:23:30,650 --> 01:23:34,520 Siis lihtsalt muuta neid tagasi, annan neile tagasi lõpus. 987 01:23:34,520 --> 01:23:38,390 See oli uuendatud. Okei. 988 01:23:38,390 --> 01:23:43,900 >> Nüüd sees siin ma lihtsalt seletada kood huvides aeg. 989 01:23:43,900 --> 01:23:46,350 See ei ole nii palju koodi. 990 01:23:50,770 --> 01:24:03,750 Me näeme me lugeda tegelasele faili. Me nimetasime seda f. 991 01:24:03,750 --> 01:24:07,850 Nüüd saate mees fgetc, kuid kuidas fgetc läheb tööle 992 01:24:07,850 --> 01:24:11,910 on lihtsalt see läheb tagasi märk, et sa lihtsalt lugeda või EOF, 993 01:24:11,910 --> 01:24:15,680 mis vastab faili lõppu või mõni viga juhtub. 994 01:24:15,680 --> 01:24:19,900 Meil on silmuspõletamise, jätkates lugeda ühe märgi toimikust, 995 01:24:19,900 --> 01:24:22,420 kuni meil otsa tähemärki lugeda. 996 01:24:22,420 --> 01:24:26,650 Ja kui me teeme, et me ootame ühele tegelasele standard sisse 997 01:24:26,650 --> 01:24:29,090 Iga kord, kui kirjutad midagi, mida käsurea, 998 01:24:29,090 --> 01:24:32,820 et loeb ka tegelasele standard sisse 999 01:24:32,820 --> 01:24:38,330 Siis putchar on lihtsalt panen char loeme siin failist standard välja. 1000 01:24:38,330 --> 01:24:42,890 Võite mees putchar, aga see on lihtsalt paneb standard välja, see trükkimise et iseloomu. 1001 01:24:42,890 --> 01:24:51,600 Võid ka teha printf ("% c", c); sama mõte. 1002 01:24:53,330 --> 01:24:56,670 See saab teha suurema osa meie tööst. 1003 01:24:56,670 --> 01:25:00,300 >> Viimane asi, mida me kavatseme teha tahad on lihtsalt kirjutamisel meie fail. 1004 01:25:00,300 --> 01:25:03,310 Kui sul ei ole kirjutamisel, see on mälu leke. 1005 01:25:03,310 --> 01:25:06,680 Me tahame kirjutamisel faili me algselt avatud, ja ma arvan, et see on. 1006 01:25:06,680 --> 01:25:13,810 Kui me teeme seda, ma juba sain probleeme. 1007 01:25:13,810 --> 01:25:17,260 Vaatame. 1008 01:25:17,260 --> 01:25:19,960 Mida see kurdavad? 1009 01:25:19,960 --> 01:25:30,220 Oodati 'int', kuid argument on tüüpi "struct _IO_FILE *". 1010 01:25:36,850 --> 01:25:39,370 Eks näis, kui see toimib. 1011 01:25:45,210 --> 01:25:53,540 Lubatud ainult C99. Augh. Okei, teha hacker_typer. 1012 01:25:53,540 --> 01:25:57,760 Nüüd saame kasulikum kirjeldusi. 1013 01:25:57,760 --> 01:25:59,900 Nii et kasutage deklareerimata tunnus "normal_settings". 1014 01:25:59,900 --> 01:26:04,170 Ma ei nimetaks seda normal_settings. Ma helistasin talle current_settings. 1015 01:26:04,170 --> 01:26:12,090 Nii et olgem muuta kõike seda. 1016 01:26:17,920 --> 01:26:21,710 Nüüd kulgeb argument. 1017 01:26:26,290 --> 01:26:29,500 Ma teen seda 0 nüüd. 1018 01:26:29,500 --> 01:26:36,720 Okei. . / Hacker_typer cp.c. 1019 01:26:36,720 --> 01:26:39,590 Ma ka ei ekraani tühjendamiseks alguses. 1020 01:26:39,590 --> 01:26:42,960 Aga sa võid vaadata tagasi viimase lahendamist näha, kuidas ekraani tühjendamiseks. 1021 01:26:42,960 --> 01:26:45,160 See on lihtsalt printida mõned märgid 1022 01:26:45,160 --> 01:26:47,210 Kuigi see teeb mida ma tahan teha. 1023 01:26:47,210 --> 01:26:48,900 Okei. 1024 01:26:48,900 --> 01:26:55,280 Ja mõelda, miks see vajalik on 0 standardsisendi asemel, 1025 01:26:55,280 --> 01:27:00,560 mida tuleks # define 0, 1026 01:27:00,560 --> 01:27:03,890 Selle kaebab, et - 1027 01:27:13,150 --> 01:27:19,360 Enne kui ma ütlesin, et seal on fail kirjeldustega, kuid siis on teil ka oma FILE *, 1028 01:27:19,360 --> 01:27:23,210 failipide on lihtsalt üks täisarv, 1029 01:27:23,210 --> 01:27:26,970 arvestades, FILE * on terve hunnik asju sellega seotud. 1030 01:27:26,970 --> 01:27:30,380 Põhjus, miks me peame ütlema 0 asemel stdin 1031 01:27:30,380 --> 01:27:37,480 on, et stdin on FILE * mis viitab asi, mis on viitamine failipide 0. 1032 01:27:37,480 --> 01:27:45,070 Nii et isegi siin, kui ma fopen (argv [1] Ma saan FILE * tagasi. 1033 01:27:45,070 --> 01:27:51,180 Aga kusagil seda faili * on asi vastab failipide seda toimikut. 1034 01:27:51,180 --> 01:27:57,430 Kui te vaatate mees leht avatud, nii et ma arvan, et sa pead tegema mees 3 avatud - nope - 1035 01:27:57,430 --> 01:27:59,380 mees 2 avatud - jah. 1036 01:27:59,380 --> 01:28:06,250 Kui te vaatate lehte avatud, avatud on nagu madalama taseme fopen, 1037 01:28:06,250 --> 01:28:09,350 ja see on jälle tegelik failipide. 1038 01:28:09,350 --> 01:28:12,050 fopen ei hunnik kraami peal avatud, 1039 01:28:12,050 --> 01:28:17,640 mis tagasipöördumise asemel just seda faili deskriptor tagastab kogu FILE * pointer 1040 01:28:17,640 --> 01:28:20,590 mille sees on meie väike failipide. 1041 01:28:20,590 --> 01:28:25,020 Nii standard viitab FILE * asi, 1042 01:28:25,020 --> 01:28:29,120 arvestades, 0 tähendab lihtsalt failipide standard iseenesest. 1043 01:28:29,120 --> 01:28:32,160 >> Küsimused? 1044 01:28:32,160 --> 01:28:35,930 [Naerab] puhus läbi, et. 1045 01:28:35,930 --> 01:28:39,140 Hea küll. Me oleme valmis. [Naerab] 1046 01:28:39,140 --> 01:28:42,000 >> [CS50.TV]