1 00:00:00,000 --> 00:00:02,500 [Powered by Google Translate] [5 jakso - More Comfortable] 2 00:00:02,500 --> 00:00:04,690 [Rob Bowden - Harvardin yliopisto] 3 00:00:04,690 --> 00:00:07,250 [Tämä on CS50. - CS50.TV] 4 00:00:08,990 --> 00:00:14,250 >> Kuten sanoin sähköpostitse, on paljon asioita, voit käyttää 5 00:00:14,250 --> 00:00:17,060 muu kuin laite itse tehdä ongelman sarjaa. 6 00:00:17,060 --> 00:00:19,910 Suosittelemme teet sen laitteen vain siksi voimme helpommin auttaa sinua 7 00:00:19,910 --> 00:00:22,070 ja me tiedämme, kuinka kaikki on menossa töihin. 8 00:00:22,070 --> 00:00:26,950 Mutta kuten yksi esimerkki, jossa voit tehdä asioita, jos vaikkapa sinulla ei ole pääsyä 9 00:00:26,950 --> 00:00:31,570 että laite tai haluat työskennellä Science Center kellarissa - 10 00:00:31,570 --> 00:00:33,090 joka todellisuudessa heillä laitetta liian - 11 00:00:33,090 --> 00:00:35,150 Jos haluat työskennellä missä tahansa. 12 00:00:35,150 --> 00:00:42,370 Yksi esimerkki on olet nähnyt / kuullut SSH? 13 00:00:44,380 --> 00:00:47,780 SSH on pohjimmiltaan aivan yhteyden jotain. 14 00:00:47,780 --> 00:00:51,340 Oikeastaan ​​nyt olen SSHed laitteeseen. 15 00:00:51,340 --> 00:00:54,290 En koskaan työskentele suoraan laitteeseen. 16 00:00:55,930 --> 00:01:01,060 Tässä on laite, ja jos katsotte tänne näet tämän IP-osoitteen. 17 00:01:01,060 --> 00:01:03,650 En koskaan työskentele itse laite; 18 00:01:03,650 --> 00:01:08,840 Olen aina tullut yli iTerm2 ikkunaan / pääteikkuna. 19 00:01:08,840 --> 00:01:15,910 Voit SSH että IP-osoite, ssh jharvard@192.168.129.128. 20 00:01:15,910 --> 00:01:20,390 Muistan, että joukko hyvin helposti, koska se on niin kiva kuvio. 21 00:01:20,390 --> 00:01:24,920 Mutta kysyy minulta salasanaa, ja nyt olen laitteeseen. 22 00:01:24,920 --> 00:01:33,060 Pohjimmiltaan tässä vaiheessa, jos avattu päätelaitteen sisällä itse laite, 23 00:01:33,060 --> 00:01:36,350 Tämän liitännän, mutta voit käyttää sitä, on täsmälleen sama 24 00:01:36,350 --> 00:01:40,010 kuten käyttöliittymän Käytän täällä, mutta nyt olet SSHed. 25 00:01:42,240 --> 00:01:44,920 Sinun ei tarvitse SSH laitteeseen. 26 00:01:44,920 --> 00:01:52,360 Yksi esimerkki toisessa paikassa voisit SSH on Olen melko varma olet oletuksena - 27 00:01:52,360 --> 00:01:55,020 Oh. Isompi. 28 00:01:55,020 --> 00:02:01,130 Kaikkien pitäisi olla oletuksena FAS tilinpäätöksen FAS palvelimiin. 29 00:02:01,130 --> 00:02:06,840 Minulle, haluan SSH rbowden@nice.fas.harvard.edu. 30 00:02:06,840 --> 00:02:11,610 Se tulee kysyä, että ensimmäistä kertaa, ja sanot kyllä. 31 00:02:11,610 --> 00:02:15,840 Minun salasanaa vain olemaan minun FAS salasanaa. 32 00:02:15,840 --> 00:02:22,650 Ja nyt, olen SSHed on mukava palvelimet, ja voin tehdä mitä haluan täällä. 33 00:02:22,650 --> 00:02:28,560 Monet luokat saatat ottaa, kuten 124, ovat menossa lataat tavaraa täällä 34 00:02:28,560 --> 00:02:30,950 todella lähettää ongelman sarjaa. 35 00:02:30,950 --> 00:02:34,100 Mutta sano et pääse käyttämään laitetta. 36 00:02:34,100 --> 00:02:37,910 Sitten voit tehdä asioita, kuten täällä sitä sanoa - 37 00:02:37,910 --> 00:02:42,160 Tämä on vain meidän osassa kysymyksiä. 38 00:02:42,160 --> 00:02:45,070 Se pyytää sinua tekemään tämän laitteen. 39 00:02:45,070 --> 00:02:47,790 Sen sijaan minä vain tehdä sen palvelimelle. 40 00:02:47,790 --> 00:02:50,560 Aion purkaa se. 41 00:02:50,560 --> 00:02:55,670 Ongelma tulee olemaan, että olet tottunut käyttämään jotain gedit 42 00:02:55,670 --> 00:02:58,160 tai mitä sisällä laitteen. 43 00:02:58,160 --> 00:03:01,830 Et aio olla, että FAS palvelimelle. 44 00:03:01,830 --> 00:03:04,110 Se kaikki on vain olemaan tämän tekstuaalisen liitäntä. 45 00:03:04,110 --> 00:03:09,180 Joten voit joko yhden, yrittää oppia tekstieditori, joka niillä on. 46 00:03:09,180 --> 00:03:12,130 Heillä on Nano. 47 00:03:12,130 --> 00:03:14,990 Nano on yleensä melko helppo käyttää. 48 00:03:14,990 --> 00:03:19,470 Voit käyttää nuolia ja kirjoita normaalisti. 49 00:03:19,470 --> 00:03:21,250 Joten se ei ole vaikeaa. 50 00:03:21,250 --> 00:03:24,720 Jos haluat saada todella fancy voit käyttää Emacs, 51 00:03:24,720 --> 00:03:29,850 joka luultavasti ei olisi pitänyt avata, koska en edes tiedä miten lopettaa Emacs. 52 00:03:29,850 --> 00:03:32,760 Ohjaus X, Control C? Joo. 53 00:03:32,760 --> 00:03:35,310 Tai voit käyttää Vim, joka on mitä käytän. 54 00:03:35,310 --> 00:03:37,800 Ja niin ne ovat vaihtoehtoja. 55 00:03:37,800 --> 00:03:43,830 Jos et halua tehdä sitä, voit myös, jos tarkastellaan manual.cs50.net-- 56 00:03:43,830 --> 00:03:45,410 Oh. 57 00:03:45,410 --> 00:03:49,920 Tietokoneella, voit SSH PuTTY, 58 00:03:49,920 --> 00:03:51,940 jotka olet menossa tarvitse ladata erikseen. 59 00:03:51,940 --> 00:03:55,460 Macissa voit vain oletuksena käytössä Terminal tai voit ladata iTerm2, 60 00:03:55,460 --> 00:03:58,490 joka on kuin mukava, hieno terminaali. 61 00:03:58,490 --> 00:04:03,780 Jos menet manual.cs50.net näet linkin Notepad + +, 62 00:04:03,780 --> 00:04:07,120 joka on mitä voit käyttää tietokonetta. 63 00:04:07,120 --> 00:04:13,340 Sen avulla voit SFTP alkaen Notepad + +, joka on pohjimmiltaan SSH. 64 00:04:13,340 --> 00:04:17,750 Mitä tämä avulla voit tehdä on muokata tiedostoa paikallisesti, 65 00:04:17,750 --> 00:04:20,670 ja sitten kun haluat tallentaa ne, se tallentaa nice.fas, 66 00:04:20,670 --> 00:04:23,670 jossa voit käyttää niitä. 67 00:04:23,670 --> 00:04:26,880 Ja vastaavaa Mac tulee olemaan TextWrangler. 68 00:04:26,880 --> 00:04:28,760 Joten sen avulla voit tehdä samoin. 69 00:04:28,760 --> 00:04:32,800 Sen avulla voit muokata tiedostoja paikallisesti ja tallentaa ne nice.fas, 70 00:04:32,800 --> 00:04:35,730 jossa voit käyttää niitä. 71 00:04:35,730 --> 00:04:40,400 Joten jos olet koskaan jumissa ilman laitetta, sinun on nämä vaihtoehdot 72 00:04:40,400 --> 00:04:44,230 Vielä tee ongelmaa sarjaa. 73 00:04:44,230 --> 00:04:48,250 Yksi ongelma tulee olemaan, että et aio olla CS50 kirjasto 74 00:04:48,250 --> 00:04:51,580 koska nice.fas ei oletuksena ole tätä. 75 00:04:51,580 --> 00:04:55,970 Voit joko ladata CS50 kirjasto - 76 00:04:55,970 --> 00:04:58,470 En mielestäni tarvitse, että tässä vaiheessa. 77 00:04:58,470 --> 00:05:03,270 Voit joko ladata CS50 kirjastosta ja kopioi se nice.fas, 78 00:05:03,270 --> 00:05:07,450 tai luulen tässä vaiheessa emme käytä sitä enää muutenkaan. 79 00:05:07,450 --> 00:05:12,720 Tai jos teemme, voit toistaiseksi vaihda se 80 00:05:12,720 --> 00:05:18,480 toteutuksia toimintojen CS50 kirjaston tapauksessa. 81 00:05:18,480 --> 00:05:21,370 Niin että ei pitäisi olla paljon rajoituksia. 82 00:05:21,370 --> 00:05:23,710 Ja se siitä. 83 00:05:26,460 --> 00:05:29,820 >> Menen takaisin laitteeseen nyt, me teemme kaiken laitteen. 84 00:05:29,820 --> 00:05:37,510 Tarkasteltaessa meidän osassa kysymyksiä, alussa, niin kuin sanoin email, 85 00:05:37,510 --> 00:05:43,620 meidän on puhuttava yhdellä lyhyellä sinun piti katsoa. 86 00:05:43,620 --> 00:05:51,980 Olemme suuntaamaan & Putket ja nämä kolme kysymystä. 87 00:05:51,980 --> 00:05:56,070 >> Jonka virta ei toimii kuten printf kirjoittaa oletuksena? 88 00:05:56,070 --> 00:05:59,130 Niin stream. Mikä on virta? 89 00:06:06,520 --> 00:06:15,100 Virta on pohjimmiltaan kuin se on vain muutamia - 90 00:06:15,100 --> 00:06:21,450 Se ei ole edes lähde 1s ja 0s. 91 00:06:21,450 --> 00:06:24,920 Virta se pyytää tässä on vakiona pois. 92 00:06:24,920 --> 00:06:27,250 Ja niin standardi ulos on virta, että kun kirjoittaa sitä, 93 00:06:27,250 --> 00:06:30,940 se näkyy näytössä. 94 00:06:30,940 --> 00:06:36,860 Standard ulos, jonka virta, se tarkoittaa vain kirjoittaa 1s ja 0s siihen, 95 00:06:36,860 --> 00:06:40,220 ja toinen pää standardin ulos vain lukee että virrasta. 96 00:06:40,220 --> 00:06:43,540 Se on vain merkkijono 1s ja 0s. 97 00:06:43,540 --> 00:06:45,570 Voit kirjoittaa virtoja tai voit lukea puroihin 98 00:06:45,570 --> 00:06:47,950 riippuen siitä, mitä stream todellisuudessa on. 99 00:06:47,950 --> 00:06:52,800 Kaksi muuta Oletuksena purot ovat vakiona ja keskivirhe. 100 00:06:52,800 --> 00:06:57,540 Vakiona on aina et GetString, se odottaa sinua syöttää tavaraa. 101 00:06:57,540 --> 00:07:01,570 Joten se odottaa teitä, se on oikeastaan ​​odotti standardin, 102 00:07:01,570 --> 00:07:04,880 joka on todella mitä saat, kun kirjoitat näppäimistöllä. 103 00:07:04,880 --> 00:07:07,530 Sinä kirjoitat tavallisiin sisään 104 00:07:07,530 --> 00:07:10,050 Keskivirhe on periaatteessa vastaa standardin ulos, 105 00:07:10,050 --> 00:07:13,280 mutta se on erikoistunut että kun tulostat keskivirhe, 106 00:07:13,280 --> 00:07:16,770 sinun pitäisi vain tulostaa virheilmoituksia että 107 00:07:16,770 --> 00:07:20,200 joten voit erottaa säännöllisesti viestejä tulostetaan näytölle 108 00:07:20,200 --> 00:07:24,560 vs. virheilmoituksia riippuen siitä menivät standardin ulos tai keskivirhe. 109 00:07:24,560 --> 00:07:28,660 Tiedostoja myös. 110 00:07:28,660 --> 00:07:32,440 Standard ulos, standardi, ja keskivirhe ovat vain erityisiä virtoja, 111 00:07:32,440 --> 00:07:36,810 mutta oikeastaan ​​minkä tahansa tiedoston, kun avaat tiedoston, se tulee tavuvirrasta 112 00:07:36,810 --> 00:07:40,740 jossa voit vain lukea tuosta virrasta. 113 00:07:40,740 --> 00:07:47,770 Sinä, suurimmaksi osaksi, voi vain ajatella tiedoston tavuvirrasta. 114 00:07:47,770 --> 00:07:51,190 Joten mitä virtoja ne kirjoita oletuksena? Standard ulos. 115 00:07:51,190 --> 00:07:56,980 >> Mitä eroa on> ja >>? 116 00:07:58,140 --> 00:08:03,710 Onko kukaan katsella videota etukäteen? Okei. 117 00:08:03,710 --> 00:08:10,960 > Tulee olemaan miten ohjaat tiedostoihin, 118 00:08:10,960 --> 00:08:15,240 ja >> aikoo myös suunnata tulosteen tiedostoja, 119 00:08:15,240 --> 00:08:17,820 mutta se sen sijaan tulee liittää tiedostoon. 120 00:08:17,820 --> 00:08:23,430 Esimerkiksi sanokaamme Minulla sattuu olemaan dict täällä, 121 00:08:23,430 --> 00:08:27,020 ja ainoa tavaraa sisällä dict on kissa, kissa, koira, kala, koira. 122 00:08:27,020 --> 00:08:31,530 Yksi komento, että sinulla on komentorivi on kissa, 123 00:08:31,530 --> 00:08:34,539 joka on juuri menossa painoon, mitä on tiedosto. 124 00:08:34,539 --> 00:08:40,679 Joten kun sanon kissa dict, se tulee tulostaa kissa, kissa, koira, kala, koira. Siinä kaikki kissa tekee. 125 00:08:40,679 --> 00:08:46,280 Tämä tarkoittaa, että se painettu standardin ulos kissa, kissa, koira, kala, koira. 126 00:08:46,280 --> 00:08:53,240 Jos minä sen sijaan halua ohjata että tiedostoon, voin käyttää> ja ohjaa sen mitä tiedosto on. 127 00:08:53,240 --> 00:08:56,460 Soitan tiedosto tiedosto. 128 00:08:56,460 --> 00:09:00,320 Joten nyt jos ls, näen olen uusi tiedosto nimeltä tiedosto. 129 00:09:00,320 --> 00:09:05,700 Ja jos avaan sen, se tulee olemaan mitä kissa laittaa komentoriviltä. 130 00:09:05,700 --> 00:09:11,040 Joten nyt jos teen sen uudelleen, niin se tulee suunnata tulosteen tiedostoon, 131 00:09:11,040 --> 00:09:13,930 ja aion olla täsmälleen sama asia. 132 00:09:13,930 --> 00:09:17,910 Joten teknisesti se kokonaan syrjäytti mitä meillä oli. 133 00:09:17,910 --> 00:09:22,970 Ja näemme jos muutan dict, otin koiran. 134 00:09:22,970 --> 00:09:29,980 Nyt jos kissa dict osaksi tiedoston uudelleen, aiomme saada uuden version koira poistettu. 135 00:09:29,980 --> 00:09:32,400 Joten se täysin korvaa sitä. 136 00:09:32,400 --> 00:09:36,640 Sen sijaan, jos käytämme >>, se tulee liittää tiedostoon. 137 00:09:36,640 --> 00:09:40,860 Nyt, avaa tiedosto, näemme meillä on vain sama asia painetaan kahdesti 138 00:09:40,860 --> 00:09:44,920 koska se oli siellä kerran, meidän liitteenä alkuperäiseen. 139 00:09:44,920 --> 00:09:48,130 Niin, että mitä> ja >> tehdä. 140 00:09:48,130 --> 00:09:50,580 Onko seuraava kysyä - Se ei kysy sitä. 141 00:09:50,580 --> 00:09:59,050 >> Toinen, että meillä on <, joka jos> uudelleenohjaa standardin ulos, 142 00:09:59,050 --> 00:10:01,970 00:10:12,050 Katsotaan, jos meillä on esimerkki. 144 00:10:14,750 --> 00:10:16,930 En voi kirjoittaa yhden todella nopeasti. 145 00:10:17,870 --> 00:10:25,700 Otetaan jokin tiedosto, hello.c. 146 00:10:56,060 --> 00:10:59,070 Suhteellisen yksinkertainen tiedosto. 147 00:10:59,070 --> 00:11:03,570 Haen vain merkkijonon ja sitten tulostaa "Hello" mitä merkkijono juuri tullut oli. 148 00:11:03,570 --> 00:11:07,990 Joten varmista Hei sitten. / Hello. 149 00:11:07,990 --> 00:11:10,720 Nyt se on kehotus minua tulla jotain, 150 00:11:10,720 --> 00:11:15,070 mikä tarkoittaa sitä odottaa asioita on tullut standardi sisään 151 00:11:15,070 --> 00:11:20,450 Joten anna mitä haluan tavallisiin sisään Olemme juuri menossa sanoa Hei, Rob! 152 00:11:20,450 --> 00:11:23,310 Sitten se tulostetaan standardin ulos Hei, Rob! 153 00:11:23,310 --> 00:11:28,860 Jos teen. / Hei ja ohjaa sitten, 154 00:11:30,740 --> 00:11:34,310 nyt voit vain ohjata tiedostosta. 155 00:11:34,310 --> 00:11:41,720 Joten jos laitan joissakin tiedoston txt, ja laitoin Rob, 156 00:11:41,720 --> 00:11:52,300 jos juoksen Hei ja ohjaa sitten tiedoston txt osaksi. / Hei, se tulee sanoa Hei, Rob! välittömästi. 157 00:11:52,300 --> 00:11:57,160 Kun se ensin saa GetString ja se odotti standardin, 158 00:11:57,160 --> 00:12:01,730 standardi ei enää odottamassa näppäimistö tietojen saada kirjoittaa. 159 00:12:01,730 --> 00:12:05,980 Sen sijaan olemme ohjataan standardin lukea tiedoston txt. 160 00:12:05,980 --> 00:12:10,290 Ja niin se tulee lukea tiedoston txt, joka on vain viiva Rob, 161 00:12:10,290 --> 00:12:13,380 ja sitten se tulee tulostaa Hei, Rob! 162 00:12:13,380 --> 00:12:18,180 Ja jos halusin, voisin myös tehdä. / Hei 00:12:21,500 ja sitten standardia että sen paino, joka on Hei, Rob!, 164 00:12:21,500 --> 00:12:24,700 Voin ohjata että omaan tiedostoon. 165 00:12:24,700 --> 00:12:29,790 Minä vain soittaa tiedoston Hei - Ei, en ole, koska se executable - txt2. 166 00:12:29,790 --> 00:12:40,150 Nyt, txt2 tulee olemaan ulostulo. / Hello 00:12:43,520 >> Kysymyksiä? 168 00:12:45,900 --> 00:12:49,090 >> Okei. Joten tässä meillä on putki. 169 00:12:49,090 --> 00:12:53,510 Putket ovat viimeinen yksikkö uudelleenohjaus. 170 00:12:53,510 --> 00:12:58,750 >> Oh. Luulen yksi yksikkö uudelleenohjaus on jos sen sijaan> teet 2>, 171 00:12:58,750 --> 00:13:01,070 joka on suuntaamalla keskivirhe. 172 00:13:01,070 --> 00:13:06,280 Joten jos jotain meni keskivirhe, se ei saa panna txt2. 173 00:13:06,280 --> 00:13:12,480 Mutta huomaa jos teen 2>, niin se on silti tulostuksen Hei, Rob! komentorivin 174 00:13:12,480 --> 00:13:18,600 koska olen vain kohdentamalla keskivirhe, en suuntaamaan standardin ulos. 175 00:13:18,600 --> 00:13:22,210 Keskivirhe ja standardi ulos ovat erilaisia. 176 00:13:24,210 --> 00:13:27,080 Jos halusi todella kirjoittaa keskivirhe, 177 00:13:27,080 --> 00:13:35,080 Sitten voisin muuttaa tämän olevan fprintf stderr. 178 00:13:35,080 --> 00:13:37,850 Joten printf, oletuksena tulostaa standardin ulos. 179 00:13:37,850 --> 00:13:41,720 Jos haluan tulostaa keskivirhe käsin, sitten minun täytyy käyttää fprintf 180 00:13:41,720 --> 00:13:45,010 ja määrittää, mitä haluan tulostaa. 181 00:13:45,010 --> 00:13:49,720 Jos sen sijaan tein fprintf stdout, niin se on pohjimmiltaan vastaa printf. 182 00:13:49,720 --> 00:13:55,530 Mutta fprintf vakiovirhetulosteeseen. 183 00:13:57,790 --> 00:14:03,650 Joten nyt, jos en ohjaa tämä otetaan txt2, Hei, Rob! edelleen saada tulostetaan komentoriviltä 184 00:14:03,650 --> 00:14:08,270 koska se on menossa painettu vakiovirhetulosteeseen ja olen vain suuntaamalla standardin ulos. 185 00:14:08,270 --> 00:14:16,420 Jos minä nyt uudelleenohjaus keskivirhe, nyt se ei tulosteta, ja txt2 tulee olemaan Hei, Rob! 186 00:14:16,420 --> 00:14:21,910 Joten nyt, voit tulostaa todellisia virheitä keskivirhe 187 00:14:21,910 --> 00:14:24,720 ja tulostaa säännöllisesti viestejä standardin ulos. 188 00:14:24,720 --> 00:14:31,420 Ja niin kun suoritat ohjelman, voit suorittaa sen. / Hei tämäntyyppiset 2> 189 00:14:31,420 --> 00:14:33,800 niin, että ohjelma tulee toimimaan normaalisti, 190 00:14:33,800 --> 00:14:38,400 mutta virheilmoituksia että saat voit tarkistaa myöhemmin omassa virhelokiin, 191 00:14:38,400 --> 00:14:44,500 niin virheet, ja katso sitten myöhemmin ja teidän virheet tiedosto on virheitä tapahtui. 192 00:14:45,200 --> 00:14:47,540 >> Kysymyksiä? 193 00:14:47,540 --> 00:14:58,070 >> Viimeisin on putki, jonka voit ajatella kuin ottaa standardin ulos yhden komennon 194 00:14:58,070 --> 00:15:01,210 ja tekee siitä standardin seuraavan komennon. 195 00:15:01,210 --> 00:15:05,570 Esimerkkinä tästä on kaiku on komentorivi juttu 196 00:15:05,570 --> 00:15:11,840 joka on juuri menossa echo mitä laitoin sen väitettä. En laita lainausmerkkejä. 197 00:15:11,840 --> 00:15:16,150 Echo blaa, blaa, blaa on juuri menossa painoon blaa, blaa, blaa. 198 00:15:16,150 --> 00:15:20,600 Ennen kun sanoin täytyi laittaa Rob osaksi txt-tiedostona 199 00:15:20,600 --> 00:15:28,830 koska en voi vain ohjata txt-tiedostoja, vaan, / jos toistan Rob 200 00:15:28,830 --> 00:15:35,520 ja sitten putki sen. / Hei, jotka tekevät saman tyyppinen asia. 201 00:15:35,520 --> 00:15:39,160 Tämä vie tuotos tämän komennon, kaiku Rob, 202 00:15:39,160 --> 00:15:43,610 ja käyttämällä sitä tulo. / hello. 203 00:15:44,790 --> 00:15:49,560 Voit ajatella sitä ensimmäisenä suunnata echo Rob tiedostoon 204 00:15:49,560 --> 00:15:54,160 ja sitten syötetään. / Hei että tiedosto oli juuri ulos. 205 00:15:54,160 --> 00:15:57,850 Mutta se vie tilapäisen tiedoston ulos kuvan. 206 00:16:01,890 --> 00:16:04,460 >> Kysymyksiä tästä? 207 00:16:04,460 --> 00:16:07,150 >> Seuraava kysymys tulee liittyä tähän. 208 00:16:07,150 --> 00:16:15,310 Mikä putki voisit käyttää löytää useita ainutlaatuisia nimiä tiedosto nimeltä names.txt? 209 00:16:15,310 --> 00:16:24,160 Komennot aiomme haluavat käyttää tässä ovat ainutlaatuisia, niin uniq, ja sitten wc. 210 00:16:24,160 --> 00:16:28,840 Voit tehdä miehen uniq todella katsoa, ​​mitä se tekee, 211 00:16:28,840 --> 00:16:34,840 ja se on juuri menossa suodattaa viereiseen rivejä syöttölokerosta. 212 00:16:34,840 --> 00:16:40,690 Ja mies wc aikoo tulostaa rivinvaihto, sana ja tavu laskee kunkin tiedoston. 213 00:16:40,690 --> 00:16:43,760 Ja viimeinen aiomme haluat käyttää, on lajitella, 214 00:16:43,760 --> 00:16:47,410 joka on menossa juuri lajitella rivit txt-tiedosto. 215 00:16:47,410 --> 00:16:58,080 Jos teen joitakin txt tiedoston, names.txt, ja se on Rob, Tommy, Joseph, Tommy, Joseph, RJ, Rob, 216 00:16:58,080 --> 00:17:03,910 mitä haluan tehdä tässä löytää useita ainutlaatuisia nimiä tähän tiedostoon. 217 00:17:03,910 --> 00:17:08,750 Joten mitä jos vastaus on? >> [Opiskelija] 4. >> Joo. 218 00:17:08,750 --> 00:17:13,780 Sen pitäisi olla 4, sillä Rob, Tommy, Joseph, RJ ovat vain ainutlaatuisia nimiä tähän tiedostoon. 219 00:17:13,780 --> 00:17:20,180 Ensimmäinen askel, jos en tee sanamäärä on names.txt, 220 00:17:20,180 --> 00:17:24,290 Tämä on oikeastaan ​​kertoo minulle kaiken. 221 00:17:24,290 --> 00:17:32,560 Tämä on todella tulostus - Katsotaan, mies wc - rivinvaihtoja, sanoja, ja tavu count. 222 00:17:32,560 --> 00:17:38,270 Jos minä vain välitä riviä, niin voin vain tehdä wc-l names.txt. 223 00:17:41,730 --> 00:17:44,300 Joten se vaihe 1. 224 00:17:44,300 --> 00:17:50,510 Mutta en halua wc-l names.txt koska names.txt juuri sisältää kaikki nimet, 225 00:17:50,510 --> 00:17:54,170 ja haluan suodattaa pois ei-ainutlaatuista niistä. 226 00:17:54,170 --> 00:18:01,200 Joten jos en Uniq names.txt, että ei oikein anna minulle mitä haluan 227 00:18:01,200 --> 00:18:03,760 koska kahdennettu nimet ovat edelleen olemassa. 228 00:18:03,760 --> 00:18:07,690 Miksi näin? Miksi Uniq ei tee mitä minä haluan? 229 00:18:07,690 --> 00:18:10,500 [Opiskelija] kaksoiskappaleet eivät [kuulumattomissa] >> Joo. 230 00:18:10,500 --> 00:18:16,370 Muista man-sivulla uniq sanoo suodattimen vieressä rivejä. 231 00:18:16,370 --> 00:18:19,680 He eivät vieressä, joten se ei suodata niitä. 232 00:18:19,680 --> 00:18:31,100 Jos minä lajitella ensin järjestä names.txt tulee laittaa kaikki päällekkäiset linjat yhdessä. 233 00:18:31,100 --> 00:18:34,450 Joten nyt sort names.txt että. 234 00:18:34,450 --> 00:18:40,550 Aion halua käyttää sitä tulo Uniq, mikä on | uniq. 235 00:18:40,550 --> 00:18:43,390 Se antaa minulle Joseph, RJ, Rob, Tommy, 236 00:18:43,390 --> 00:18:49,260 ja haluan käyttää sitä tulo wc-l, 237 00:18:49,260 --> 00:18:52,740 joka ei aio antaa minulle 4. 238 00:18:52,740 --> 00:18:56,930 Kuten tässä sanotaan, mitä putki voisi käytät? 239 00:18:56,930 --> 00:19:01,390 Voit tehdä monia asioita kuten käyttämällä useita komentoja 240 00:19:01,390 --> 00:19:05,130 jos käytät ulostulo yhdestä komento syöttää seuraavan komennon. 241 00:19:05,130 --> 00:19:08,780 Voit tehdä paljon asioita, paljon viisaita asioita. 242 00:19:08,780 --> 00:19:11,440 >> Kysymyksiä? 243 00:19:12,910 --> 00:19:14,600 Okei. 244 00:19:14,600 --> 00:19:17,880 Se on se putkia ja uudelleenohjaus. 245 00:19:18,370 --> 00:19:24,090 >> Nyt lähdemme varsinaiseen tavaraa, koodaus kamaa. 246 00:19:24,090 --> 00:19:29,100 Inside tämän PDF näet tämän komennon, 247 00:19:29,100 --> 00:19:32,950 ja sinun kannattaa suorittaa tämän komennon laitteesi. 248 00:19:36,240 --> 00:19:42,250 wget on komento vain saada jotain Internet pohjimmiltaan 249 00:19:42,250 --> 00:19:45,180 joten wget ja tämä URL. 250 00:19:45,180 --> 00:19:49,110 Jos meni tämä URL selaimessasi, se lataa tiedoston. 251 00:19:49,110 --> 00:19:52,510 Minä vain napsautti sen, niin se ladattu tiedosto minulle. 252 00:19:52,510 --> 00:19:55,650 Mutta kirjallisesti wget että asia sisällä terminaalin 253 00:19:55,650 --> 00:19:58,620 on juuri menossa ladata sen omaan terminaaliin. 254 00:19:58,620 --> 00:20:02,750 Olen section5.zip, ja sinun kannattaa purkaa section5.zip, 255 00:20:02,750 --> 00:20:06,520 joka aikoo antaa sinulle kansio nimeltä section5, 256 00:20:06,520 --> 00:20:11,550 joka tulee olemaan kaikkien tiedostojen aiomme käyttää tänään sen sisälle. 257 00:20:33,380 --> 00:20:37,710 Koska näiden ohjelmien tiedostojen nimiensämukaisesti he hieman buginen, 258 00:20:37,710 --> 00:20:40,990 joten sinun tehtäväsi on selvittää, miksi käyttää GDB. 259 00:20:40,990 --> 00:20:44,560 Onko kaikki ovat niitä ladannut / tietää miten saada ne ladattua 260 00:20:44,560 --> 00:20:47,480 heidän laitteeseen? Okei. 261 00:20:47,480 --> 00:20:56,400 >> Juoksu ./buggy1 se sano Segmentointi vika (core polkumyynnillä), 262 00:20:56,400 --> 00:21:00,500 mikä tahansa saat segfault, se on huono juttu. 263 00:21:00,500 --> 00:21:03,810 Missä olosuhteissa saat segfault? 264 00:21:03,810 --> 00:21:08,210 [Opiskelija] Dereferencing nollaosoittimen. >> Joo. Niin, että on yksi esimerkki. 265 00:21:08,210 --> 00:21:11,580 Dereferencing nollaosoittimen aiot saada segfault. 266 00:21:11,580 --> 00:21:16,720 Mikä segfault tarkoittaa olet koskettaa muistia pitäisi olla koskematta. 267 00:21:16,720 --> 00:21:21,350 Joten dereferencing nollaosoittimen koskettaa osoite 0, 268 00:21:21,350 --> 00:21:28,060 ja pohjimmiltaan kaikki tietokoneet nykyään sanoa, että osoite 0 on muistia pitäisi olla koskematta. 269 00:21:28,060 --> 00:21:31,920 Joten siksi dereferencing nollaosoittimen tuloksia segfault. 270 00:21:31,920 --> 00:21:37,210 Kun satut olemaan alustaa osoittimen, niin se on roskaa arvo, 271 00:21:37,210 --> 00:21:41,520 ja niin kun yrität dereference sitä, kaiken todennäköisyyden olet kosketat muistia 272 00:21:41,520 --> 00:21:43,540 joka on keskellä ei mitään. 273 00:21:43,540 --> 00:21:45,650 Jos satut onnekas ja roskat arvo 274 00:21:45,650 --> 00:21:48,440 tapahtui viitata jonnekin pinoon tai jotain, 275 00:21:48,440 --> 00:21:50,820 sitten kun dereference että osoitin joita et ole alustettu, 276 00:21:50,820 --> 00:21:52,730 mikään ei mene pieleen. 277 00:21:52,730 --> 00:21:55,480 Mutta jos se osoittaa vaikkapa jonnekin pino ja keko, 278 00:21:55,480 --> 00:21:59,850 tai se osoittaa vain jostain, että ei ole käytetty ohjelma vielä, 279 00:21:59,850 --> 00:22:02,240 Sitten olet koskettamalla muistia pitäisi olla koskematta ja sinä segfault. 280 00:22:02,240 --> 00:22:06,370 Kun kirjoittaa rekursiivinen funktio, ja se recurses liian monta kertaa 281 00:22:06,370 --> 00:22:08,720 ja pino kasvaa liian suureksi ja pinon törmää asioihin, 282 00:22:08,720 --> 00:22:12,270 että se ei tule törmäystä, et kosketa muistia pitäisi olla koskematta, 283 00:22:12,270 --> 00:22:14,810 joten segfault. 284 00:22:14,810 --> 00:22:17,010 Tämä on mitä segfault on. 285 00:22:17,010 --> 00:22:21,810 >> Se on myös samasta syystä, että jos sinulla on merkkijono kuten - 286 00:22:21,810 --> 00:22:23,930 Mennään takaisin edelliseen ohjelmaan. 287 00:22:23,930 --> 00:22:28,530 In hello.c--Olen juuri menossa tekemään jotain muuta. 288 00:22:28,530 --> 00:22:33,770 char * s = "Hei maailma!"; 289 00:22:33,770 --> 00:22:42,310 Jos käytän * s = jotain tai s [0] = 'X'; 290 00:22:42,310 --> 00:22:47,290 joten varmista Hei,. / Hei, miksi se segfault? 291 00:22:48,410 --> 00:22:51,250 Miksi tämä segfault? 292 00:22:55,660 --> 00:22:57,890 Mitä odotat tapahtumaan? 293 00:22:57,890 --> 00:23:06,640 Jos tein printf ("% s \ n", s); mitä odotat tulostaa? 294 00:23:06,640 --> 00:23:09,930 [Opiskelija] X hei. >> Joo. 295 00:23:09,930 --> 00:23:15,140 Ongelmana on, että kun julistaa merkkijonon, kuten tämä, 296 00:23:15,140 --> 00:23:18,190 s on osoitin, joka on menossa pinoon, 297 00:23:18,190 --> 00:23:25,880 ja mitä s on osoittaa tämä merkkijono, joka sisältyy lukumuistiin. 298 00:23:25,880 --> 00:23:30,560 Eli vain nimi, lukumuisti, sinun pitäisi saada idea 299 00:23:30,560 --> 00:23:33,010 että jos yrität muuttaa mitä vain luku-muisti, 300 00:23:33,010 --> 00:23:36,670 teet jotain ei pitäisi tehdä muistilla ja sinä segfault. 301 00:23:36,670 --> 00:23:45,360 Tämä on todella suuri ero char * s ja char s []. 302 00:23:45,360 --> 00:23:48,790 Joten char s [], nyt tämä merkkijono aiotaan laittaa pinon 303 00:23:48,790 --> 00:23:53,960 ja pino ei ole vain luku-eli tämän pitäisi toimia hienosäätää. 304 00:23:55,500 --> 00:23:57,370 Ja se tekee. 305 00:23:57,370 --> 00:24:06,250 Muista, että kun teen char * s = "Hello world!", S itsessään on pino 306 00:24:06,250 --> 00:24:10,390 mutta s viittaa jonnekin muualle, ja että jossain muualla sattuu olemaan vain lukea. 307 00:24:10,390 --> 00:24:15,640 Mutta char s [] on vain jotain pinoon. 308 00:24:17,560 --> 00:24:21,760 Joten se on toinen esimerkki segfault tapahtumassa. 309 00:24:21,760 --> 00:24:27,820 >> Näimme, että ./buggy1 johti segfault. 310 00:24:27,820 --> 00:24:31,810 Teoriassa sinun pitäisi tarkastella buggy1.c välittömästi. 311 00:24:31,810 --> 00:24:35,170 Sen sijaan me tarkastelemme sitä kautta GDB. 312 00:24:35,170 --> 00:24:37,750 Huomaa, että kun saat Segmentointi vika (core polkumyynnillä), 313 00:24:37,750 --> 00:24:40,850 saat tämän tiedoston tänne kutsutaan ydin. 314 00:24:40,850 --> 00:24:45,200 Jos me ls-l, näemme, että ydin on yleensä aika iso tiedosto. 315 00:24:45,200 --> 00:24:51,580 Tämä on monta tavua tiedoston, niin se näyttää se 250-jotain kilotavua. 316 00:24:51,580 --> 00:24:56,120 Syynä tähän on se, että mitä core dump todellisuudessa on 317 00:24:56,120 --> 00:25:01,410 on, kun ohjelma kaatuu, tila muistiin ohjelman 318 00:25:01,410 --> 00:25:05,230 vain saa kopioida ja liittää tämän tiedoston. 319 00:25:05,230 --> 00:25:07,270 Se saa polkumyynnillä tuohon tiedostoon. 320 00:25:07,270 --> 00:25:13,060 Tämä ohjelma, kun se oli käynnissä, sattui olemaan muistin käyttö noin 250 kilotavua, 321 00:25:13,060 --> 00:25:17,040 ja niin sitähän mutta polkumyynnillä tähän tiedostoon. 322 00:25:17,040 --> 00:25:23,630 Nyt voit katsoa, ​​että tiedosto jos teemme gdb buggy1 ydin. 323 00:25:23,630 --> 00:25:30,130 Voimme vain tehdä gdb buggy1, ja joka vain käynnisty gdb säännöllisesti, 324 00:25:30,130 --> 00:25:33,800 käyttäen buggy1 sen syötetiedosto. 325 00:25:33,800 --> 00:25:38,260 Mutta jos et gdb buggy1 ydin, niin se on nimenomaan aikoo käynnistää gdb 326 00:25:38,260 --> 00:25:40,330 katsomalla, että ydintiedostoa. 327 00:25:40,330 --> 00:25:45,560 Ja sanot buggy1 tarkoittaa gdb tietää että ydintiedostoa tulee buggy1 ohjelmasta. 328 00:25:45,560 --> 00:25:49,580 Joten gdb buggy1 ydin aikoo välittömästi tuoda meille 329 00:25:49,580 --> 00:25:52,060 missä ohjelmassa tapahtui lopettaa. 330 00:25:57,720 --> 00:26:02,340 Näemme täällä Program päättyy signaalia 11, segmentointi vika. 331 00:26:02,340 --> 00:26:10,110 Satumme näkemään linjan kokoonpano, joka todennäköisesti ei ole kovin hyödyllistä. 332 00:26:10,110 --> 00:26:15,360 Mutta jos kirjoitat BT tai backtrace, joka tulee olemaan funktio 333 00:26:15,360 --> 00:26:19,430 joka antaa meille luettelon nykyiseen pinon kehyksiä. 334 00:26:19,430 --> 00:26:23,150 Niin backtrace. Se näyttää meillä on vain kaksi pino kehyksiä. 335 00:26:23,150 --> 00:26:26,310 Ensimmäinen on tärkein pinokehys, 336 00:26:26,310 --> 00:26:29,810 ja toinen on pinokehys tätä toimintoa varten, että me sattuvat olemaan, 337 00:26:29,810 --> 00:26:34,440 joka näyttää meillä on vain kokoonpano koodi. 338 00:26:34,440 --> 00:26:38,050 Mennään takaisin meidän päätehtävä, 339 00:26:38,050 --> 00:26:42,300 ja tehdä, että me voimme tehdä runko 1, ja uskon, että voimme myös tehdä alas, 340 00:26:42,300 --> 00:26:45,160 mutta en juuri koskaan tee alas - tai ylöspäin. Joo. 341 00:26:45,160 --> 00:26:50,710 Ylös ja alas. Jopa tuo yhden pinokehys, alas tuo alas pinokehys. 342 00:26:50,710 --> 00:26:53,240 Olen taipuvainen koskaan käytä sitä. 343 00:26:53,240 --> 00:26:59,120 En vain nimenomaan sanoa rungon 1, joka on mene runkoon merkitty 1. 344 00:26:59,120 --> 00:27:01,750 Kehys 1 aikoo tuoda meidät tärkeimmät pinokehys, 345 00:27:01,750 --> 00:27:05,570 ja tässä sanotaan koodirivi satumme olemaan. 346 00:27:05,570 --> 00:27:07,950 Jos haluaisimme pari lisää riviä koodia, voimme sanoa luettelossa, 347 00:27:07,950 --> 00:27:11,280 Ja se antaa meille kaikille koodia sen ympärille. 348 00:27:11,280 --> 00:27:13,360 Linja meillä segfaulted osoitteessa oli 6: 349 00:27:13,360 --> 00:27:17,360 jos (strcmp ("CS50 kiviä", argv [1]) == 0). 350 00:27:17,360 --> 00:27:24,130 Jos se ei ole selvää vielä, saat sen suoraan täältä vain ajattelemalla miksi se segfaulted. 351 00:27:24,130 --> 00:27:28,800 Mutta voimme ottaa sen askeleen pidemmälle ja sanoa, "Miksi argv [1] segfault?" 352 00:27:28,800 --> 00:27:38,830 Katsotaanpa print argv [1], ja se näyttää sen 0x0, mikä on nollaosoittimen. 353 00:27:38,830 --> 00:27:44,750 Olemme strcmping CS50 kiviä ja nolla, ja niin että menee segfault. 354 00:27:44,750 --> 00:27:48,280 Ja miksi argv [1] null? 355 00:27:48,640 --> 00:27:51,280 [Opiskelija] Koska emme anna sille mitään komentorivin argumentteja. 356 00:27:51,280 --> 00:27:53,390 Joo. Emme anna sille mitään komentorivin argumentteja. 357 00:27:53,390 --> 00:27:58,460 Joten ./buggy1 vain olemaan argv [0] olla ./buggy1. 358 00:27:58,460 --> 00:28:02,100 Se ei tule olemaan argv [1], niin että menee segfault. 359 00:28:02,100 --> 00:28:07,450 Mutta jos sen sijaan, minä vain CS50, se tulee sanoa Saat D 360 00:28:07,450 --> 00:28:09,950 koska se mitä sen pitäisi tehdä. 361 00:28:09,950 --> 00:28:15,240 Tarkasteltaessa buggy1.c, se pitäisi tulostaa "Saat D" - 362 00:28:15,240 --> 00:28:20,820 Jos argv [1] ei "CS50 rocks", "Saat D", muuten "Saat!" 363 00:28:20,820 --> 00:28:25,660 Joten jos haluamme, me tarvitsemme tätä verrata niin totta, 364 00:28:25,660 --> 00:28:28,710 mikä tarkoittaa, että sitä voidaan verrata 0. 365 00:28:28,710 --> 00:28:31,100 Joten argv [1] on oltava "CS50 kiviä". 366 00:28:31,100 --> 00:28:35,660 Jos haluat tehdä komentorivillä, sinun täytyy käyttää \ paeta tilaa. 367 00:28:35,660 --> 00:28:41,690 Joten CS50 \ kiviä ja saat! 368 00:28:41,690 --> 00:28:44,060 Jos et tee kenoviiva, miksi tämä ei toimi? 369 00:28:44,060 --> 00:28:47,190 [Opiskelija] On kaksi eri argumentteja. >> Joo. 370 00:28:47,190 --> 00:28:52,540 Argv [1] tulee olemaan CS50, ja argv [2] tulee olemaan kiviä. Okei. 371 00:28:52,540 --> 00:28:56,470 >> Nyt ./buggy2 on menossa segfault uudelleen. 372 00:28:56,470 --> 00:29:01,880 Avaamisen sijaan se sen ydin tiedoston, me vain avata buggy2 suoraan, 373 00:29:01,880 --> 00:29:05,000 niin GDB buggy2. 374 00:29:05,000 --> 00:29:09,590 Nyt jos me vain ajaa ohjelmaamme, niin se tulee sanoa Program vastaanotetun signaalin SIGSEGV, 375 00:29:09,590 --> 00:29:15,530 joka on segfault signaali, ja tämä on silloin, kun se tapahtui tapahtua. 376 00:29:15,530 --> 00:29:21,250 Tarkasteltaessa meidän backtrace, näemme, että olimme toiminto oh_no, 377 00:29:21,250 --> 00:29:23,900 joka kutsui toimintoa dinky, joka kutsuttiin toiminto binky, 378 00:29:23,900 --> 00:29:26,460 joka kutsui tärkeimmät. 379 00:29:26,460 --> 00:29:31,680 Voimme myös nähdä argumentteja näitä toimintoja. 380 00:29:31,680 --> 00:29:34,680 Argumentti dinky ja binky oli 1. 381 00:29:34,680 --> 00:29:44,390 Jos me luettelo toiminnon oh_no, näemme, että oh_no on juuri tekemässä char ** s = NULL; 382 00:29:44,390 --> 00:29:47,410 * S = "BOOM"; 383 00:29:47,410 --> 00:29:50,330 Miksi se epäonnistui? 384 00:29:54,330 --> 00:29:58,380 [Opiskelija] Et voi dereference nollaosoittimen? >> Joo. 385 00:29:58,380 --> 00:30:06,090 Tämä on vain sanomalla s on NULL, riippumatta jos se sattuu olemaan char **, 386 00:30:06,090 --> 00:30:12,070 joka, riippuen siitä, miten tulkita se, se voisi olla osoitin osoittimen merkkijonon 387 00:30:12,070 --> 00:30:15,550 tai joukko merkkijonoja. 388 00:30:15,550 --> 00:30:21,430 Se s on NULL, niin * s on dereferencing nollaosoittimen, 389 00:30:21,430 --> 00:30:24,800 joten tämä tulee kaatumaan. 390 00:30:24,800 --> 00:30:27,540 Tämä on yksi nopeimmista tavoista voit mahdollisesti segfault. 391 00:30:27,540 --> 00:30:31,300 Se on vain julistaa nollaosoittimen ja heti segfaulting. 392 00:30:31,300 --> 00:30:34,570 Sitähän oh_no tekee. 393 00:30:34,570 --> 00:30:43,400 Jos menemme ylös yhden ruudun, niin aiomme päästä toiminto nimeltään oh_no. 394 00:30:43,400 --> 00:30:44,830 Minun täytyy tehdä se alas. 395 00:30:44,830 --> 00:30:48,610 Jos et anna komento ja juuri Enteriä uudelleen, 396 00:30:48,610 --> 00:30:52,350 se vain toistaa edellisen komennon että juoksi. 397 00:30:52,350 --> 00:30:56,610 Olemme runko 1. 398 00:30:56,610 --> 00:31:04,650 Listing tämä kehys, näemme tässä on meidän tehtävämme. 399 00:31:04,650 --> 00:31:08,520 Voit lyödä listasta, tai voit tehdä listan 20 ja se lista enemmän. 400 00:31:08,520 --> 00:31:13,640 Toiminto Dinky sanoo jos i on 1, siirry oh_no toiminto, 401 00:31:13,640 --> 00:31:15,960 muuten siirry slinky toiminto. 402 00:31:15,960 --> 00:31:18,700 Ja me tiedämme i on 1, koska satumme näkemään täällä 403 00:31:18,700 --> 00:31:22,560 että Dinky kutsuttiin argumentti 1. 404 00:31:22,560 --> 00:31:27,560 Tai voit vain tehdä tulostaa minä ja se sanoo i on 1. 405 00:31:27,560 --> 00:31:33,770 Olemme parhaillaan dinky, ja jos menemme ylös toiseen kehykseen, tiedämme päädyt binky. 406 00:31:33,770 --> 00:31:36,600 Up. Nyt olemme binky. 407 00:31:36,600 --> 00:31:41,340 Listing tämä toiminto - luettelon ennen puoli keskeytti minut - 408 00:31:41,340 --> 00:31:52,670 Se alkoi ikään kuin i on 0, niin me aiomme kutsua sitä oh_no, muuten soita dinky. 409 00:31:52,670 --> 00:31:57,000 Tiedämme olin 1, niin sitä kutsutaan dinky. 410 00:31:57,000 --> 00:32:05,030 Ja nyt olemme taas tärkein, ja tärkeimmät on vain olemaan int i = rand ()% 3; 411 00:32:05,030 --> 00:32:08,790 Tämä on juuri menossa antaa sinulle satunnaisluku joka on joko 0, 1 tai 2. 412 00:32:08,790 --> 00:32:12,780 Se tulee soittaa binky tuon numeron, ja se palaa 0. 413 00:32:12,780 --> 00:32:16,700 Tarkasteltaessa tätä, 414 00:32:16,700 --> 00:32:19,880 vain kävelemällä ohjelman manuaalisesti suorittamatta sitä välittömästi, 415 00:32:19,880 --> 00:32:25,400 voisitte asettaa taitekohta on tärkein, mikä tarkoittaa, että kun otamme ohjelmaan 416 00:32:25,400 --> 00:32:31,020 ohjelma toimii kunnes se osuu taitekohta. 417 00:32:31,020 --> 00:32:35,450 Joten käynnissä ohjelma, se kestää ja sitten se osuu päätehtävä ja lakkaa toimimasta. 418 00:32:35,450 --> 00:32:44,700 Nyt olemme sisällä tärkein, ja askel tai vieressä aikoo tuoda meidät seuraavalle koodirivin. 419 00:32:44,700 --> 00:32:47,050 Voit tehdä askel tai seuraava. 420 00:32:47,050 --> 00:32:51,800 Lyömällä seuraavaksi, nyt on asetettu rand ()% 3, jotta voimme tulostaa arvon I 421 00:32:51,800 --> 00:32:55,280 ja se sanoo i on 1. 422 00:32:55,280 --> 00:32:58,110 Nyt sillä on väliä, onko käytämme seuraavaan tai vaiheeseen. 423 00:32:58,110 --> 00:33:01,000 Kai se väliä edellisessä, mutta emme haluaisi käyttää seuraavaksi. 424 00:33:01,000 --> 00:33:06,000 Jos käytämme vaiheessa, astumme toiminto, mikä tarkoittaa katsomaan todellinen asia 425 00:33:06,000 --> 00:33:07,940 että tapahtuu sisällä binky. 426 00:33:07,940 --> 00:33:10,510 Jos käytämme seuraavaan, se tarkoittaa, mennä yli toiminnon 427 00:33:10,510 --> 00:33:14,070 ja vain siirtyä seuraavaan koodirivi meidän päätehtävä. 428 00:33:14,070 --> 00:33:17,900 Täällä tällä linjalla, olin missä se sanoi rand ()% 3; 429 00:33:17,900 --> 00:33:21,320 jos tein askel, se mennä täytäntöönpanoa randia 430 00:33:21,320 --> 00:33:25,110 ja katsoa mitä siellä tapahtuu, ja voisin selata randia toimintoa. 431 00:33:25,110 --> 00:33:26,920 Mutta en välitä randia toimintoa. 432 00:33:26,920 --> 00:33:30,190 Haluan vain mennä seuraavaan koodirivin main, joten käytän seuraavaksi. 433 00:33:30,190 --> 00:33:35,800 Mutta nyt en välitä binky toiminto, joten haluan astua siihen. 434 00:33:35,800 --> 00:33:37,730 Nyt olen binky. 435 00:33:37,730 --> 00:33:42,040 Ensimmäinen rivi koodia aikoo sanoa, jos (i == 0), otan askeleen, 436 00:33:42,040 --> 00:33:44,930 näemme päädymme klo dinky. 437 00:33:44,930 --> 00:33:51,620 Jos me lista asioita, huomaamme, että se tarkistaa on i = 0. 438 00:33:51,620 --> 00:33:55,470 i ei ole yhtä suuri kuin 0, niin se meni muuta kunnossa, 439 00:33:55,470 --> 00:33:59,540 , joka on menossa soittaa dinky (i). 440 00:33:59,540 --> 00:34:04,030 Saatat hämmentyä. 441 00:34:04,030 --> 00:34:07,380 Jos katsokaa näitä rivejä suoraan, saatat ajatella, jos (i == 0), 442 00:34:07,380 --> 00:34:10,800 Okei, sitten otin askeleen ja nyt olen dinky (i), 443 00:34:10,800 --> 00:34:14,120 saatat ajatella, että täytyy tarkoittaa i = 0 tai jotain. 444 00:34:14,120 --> 00:34:18,980 Ei, se vain tarkoittaa, että se tietää sen voi tarttua suoraan linjan dinky (i). 445 00:34:18,980 --> 00:34:23,300 Koska en ole 0, seuraava vaihe ei tule päättyä muuta. 446 00:34:23,300 --> 00:34:26,239 Else ei linjaa se tulee pysähtyä. 447 00:34:26,239 --> 00:34:31,570 Se on vain menossa seuraavalle riville se voi todella toteuttaa, mikä on sievä (i). 448 00:34:31,570 --> 00:34:36,090 Astumassa dinky (i), näemme, jos (i == 1). 449 00:34:36,090 --> 00:34:42,670 Tiedämme i = 1, joten kun astumme, me tiedämme aiomme päätyä oh_no 450 00:34:42,670 --> 00:34:46,489 koska i = 1 kutsuu funktiota oh_no, jossa voit astua, 451 00:34:46,489 --> 00:34:52,969 joka aikoo perustaa char ** s = NULL ja heti "BOOM". 452 00:34:54,270 --> 00:34:59,690 Ja sitten itse katsot täytäntöönpanon buggy2, 453 00:34:59,690 --> 00:35:04,590 Tässä, i on vain saada satunnaisluvun - 0, 1, tai 2 - kutsuvan binky, 454 00:35:04,590 --> 00:35:10,610 jotka, jos i on 0 se kutsuu oh_no, muuten se kutsuu dinky, joka tulee tänne. 455 00:35:10,610 --> 00:35:18,100 Jos i on 1, puhelu oh_no, muuten soita piukka, jotka tulevat tänne, 456 00:35:18,100 --> 00:35:20,460 jos i on 2, soita oh_no. 457 00:35:20,460 --> 00:35:24,720 En edes usko, että on keino - 458 00:35:24,720 --> 00:35:30,030 Onko kukaan katso tapa tehdä tämä ohjelma ei segfault? 459 00:35:30,030 --> 00:35:37,530 Koska jos olen puuttuu jotain, jos i on 0, voit heti segfault, 460 00:35:37,530 --> 00:35:41,250 muuten menet toiminto, joka jos i on 1 teitä segfault, 461 00:35:41,250 --> 00:35:44,540 muuten menet toiminto, jossa jos i on 2 sinua segfault. 462 00:35:44,540 --> 00:35:46,810 Joten ei ole väliä mitä teet, sinä segfault. 463 00:35:46,810 --> 00:35:52,380 >> Luulen yksi tapa vahvistaa se olisi sen sijaan tehdä char ** s = NULL, 464 00:35:52,380 --> 00:35:55,610 voisit malloc tilaa merkkijonon. 465 00:35:55,610 --> 00:36:04,230 Voisimme tehdä malloc (sizeof) - sizeof mitä? 466 00:36:09,910 --> 00:36:15,190 [Opiskelija] (char) * 5? >> Onko tämä tunnu oikealta? 467 00:36:15,190 --> 00:36:21,060 Oletan tämä toimi, jos olen itse juoksi sen, mutta se ei ole mitä etsin. 468 00:36:24,400 --> 00:36:32,940 Katsokaa tyyppi s. Katsotaanpa lisätä int *, joten int * x. 469 00:36:32,940 --> 00:36:35,600 Tekisin malloc (sizeof (int)). 470 00:36:35,600 --> 00:36:40,490 Tai jos halusin joukko 5, tekisin (sizeof (int) * 5); 471 00:36:40,490 --> 00:36:44,210 Mitä jos minulla on int **? 472 00:36:46,260 --> 00:36:49,140 Mitä minä malloc? 473 00:36:49,140 --> 00:36:53,510 [Opiskelija] koko osoittimen. >> Joo. (Sizeof (int *)); 474 00:36:53,510 --> 00:36:56,960 Sama juttu täällä. 475 00:36:56,960 --> 00:37:01,280 Haluan (sizeof (char *)); 476 00:37:06,170 --> 00:37:12,840 Tämä tulee jakaa tilan osoitin, joka viittaa "Boom". 477 00:37:12,840 --> 00:37:15,330 Minun ei tarvitse varata tilaa "BOOM" itse 478 00:37:15,330 --> 00:37:17,210 koska tämä on periaatteessa vastaa mitä sanoin aiemmin 479 00:37:17,210 --> 00:37:20,870 nieriää * x = "BOOM". 480 00:37:20,870 --> 00:37:27,950 "BOOM" on jo olemassa. Se tapahtuu olemassa vain luku-alue muistia. 481 00:37:27,950 --> 00:37:35,200 Mutta se on jo olemassa, joten tämä rivi koodia, jos s on char **, 482 00:37:35,200 --> 00:37:43,900 sitten * s on char * ja olet luomassa tätä char * viitata "BOOM". 483 00:37:43,900 --> 00:37:50,040 Jos halusin kopioida "BOOM" osaksi s, niin olisin tarvitse varata tilaa s. 484 00:37:55,170 --> 00:38:03,900 Teen * s = malloc (sizeof (char) * 5); 485 00:38:03,900 --> 00:38:06,210 Miksi 5? 486 00:38:06,210 --> 00:38:10,860 Miksei 4? Se näyttää "BOOM" on 4 merkkiä. >> [Opiskelija] nollamerkki. 487 00:38:10,860 --> 00:38:14,580 Joo. Kaikki jouset ovat menossa nollamerkki. 488 00:38:14,580 --> 00:38:23,590 Nyt voin tehdä jotain strcat - Mikä on funktio kopioitaessa merkkijono? 489 00:38:23,590 --> 00:38:28,520 [Opiskelija] CPY? >> Strcpy. 490 00:38:28,520 --> 00:38:32,700 mies strcpy. 491 00:38:36,120 --> 00:38:39,590 Joten strcpy tai strncpy. 492 00:38:39,590 --> 00:38:43,410 strncpy on vähän turvallisempi, koska voit määrittää tarkasti, kuinka monta merkkiä, 493 00:38:43,410 --> 00:38:46,190 mutta täällä sillä ei ole väliä, koska me tiedämme. 494 00:38:46,190 --> 00:38:50,340 Joten strcpy ja katsoa väitteitä. 495 00:38:50,340 --> 00:38:53,100 Ensimmäinen argumentti on päämäärämme. 496 00:38:53,100 --> 00:38:56,770 Toinen perustelu on meidän lähde. 497 00:38:56,770 --> 00:39:10,310 Aiomme kopioida päämääräämme * S osoitin "BOOM". 498 00:39:10,310 --> 00:39:19,820 Miksi ehkä haluat tehdä tämän strcpy eikä vain mitä meillä oli ennen 499 00:39:19,820 --> 00:39:22,800 ja * s = "BOOM"? 500 00:39:22,800 --> 00:39:28,630 On syytä saatat haluta tehdä tämän, mutta mikä on se syy? 501 00:39:28,630 --> 00:39:31,940 [Opiskelija] Jos haluat muuttaa jotain "BOOM". >> Joo. 502 00:39:31,940 --> 00:39:37,950 Nyt voin tehdä jotain s [0] = 'X'; 503 00:39:37,950 --> 00:39:48,190 koska s pistettä kasaan ja tilaa kasa että s on osoittaa 504 00:39:48,190 --> 00:39:52,320 on osoitin enemmän tilaa kasaan, joka tallennetaan "Boom". 505 00:39:52,320 --> 00:39:55,150 Joten tämä kopio "BOOM" on tallennettu kasaan. 506 00:39:55,150 --> 00:39:58,780 On teknisesti kaksi kappaletta "BOOM" meidän ohjelmaan. 507 00:39:58,780 --> 00:40:03,500 On ensimmäinen, joka on juuri antanut tämän "BOOM" string vakio, 508 00:40:03,500 --> 00:40:09,250 ja toinen kopio "BOOM", strcpy luotu kopio "BOOM". 509 00:40:09,250 --> 00:40:13,100 Mutta kopio "BOOM" on tallennettu kasaan, ja kasan olet vapaa muuttamaan. 510 00:40:13,100 --> 00:40:17,250 Keko ei ole vain luku-, niin se tarkoittaa, että s [0] 511 00:40:17,250 --> 00:40:20,500 tulee voit muuttaa arvoa "BOOM". 512 00:40:20,500 --> 00:40:23,130 Se tulee voit muuttaa näitä merkkejä. 513 00:40:23,130 --> 00:40:26,640 >> Kysymyksiä? 514 00:40:27,740 --> 00:40:29,290 Okei. 515 00:40:29,290 --> 00:40:35,500 >> Siirryn buggy3, katsotaanpa gdb buggy3. 516 00:40:35,500 --> 00:40:39,840 Me vain käyttää sitä ja näemme saamme segfault. 517 00:40:39,840 --> 00:40:46,550 Jos me backtrace, on olemassa vain kaksi tehtävää. 518 00:40:46,550 --> 00:40:52,970 Jos menemme ylös meidän päätehtävä, huomaamme, että me segfaulted tällä rivillä. 519 00:40:52,970 --> 00:41:00,180 Joten vain katsomalla tätä linjaa, for (int rivi = 0; fgets tätä kamaa ei ole yhtä NULL; 520 00:41:00,180 --> 00:41:03,770 line + +). 521 00:41:03,770 --> 00:41:08,010 Meidän edellinen kuva kutsuttiin _IO_fgets. 522 00:41:08,010 --> 00:41:10,720 Huomaat, että paljon sisäänrakennettu C funktioiden 523 00:41:10,720 --> 00:41:15,350 että kun saat segfault, siellä on todella arvoituksellinen funktioiden nimet 524 00:41:15,350 --> 00:41:18,090 näin _IO_fgets. 525 00:41:18,090 --> 00:41:21,770 Mutta se tulee suhteuttaa tähän fgets puhelun. 526 00:41:21,770 --> 00:41:25,850 Jossain sisällä täällä, olemme segfaulting. 527 00:41:25,850 --> 00:41:30,340 Jos katsomme argumentteja fgets, voimme tulostaa puskuriin. 528 00:41:30,340 --> 00:41:41,180 Katsotaanpa tulostaa - Voi ei. 529 00:41:48,980 --> 00:41:51,900 Tulosta ei tule toimimaan juuri niin kuin haluan sen. 530 00:41:55,460 --> 00:41:58,000 Katsokaamme varsinaisen ohjelman. 531 00:42:02,200 --> 00:42:09,640 Buffer on merkki array. Se on luonteeltaan joukko 128 merkkiä. 532 00:42:09,640 --> 00:42:14,980 Joten kun sanon tulostuspuskurissa, se tulee tulostaa ne 128 merkkiä, 533 00:42:14,980 --> 00:42:18,300 mikä kai on mitä odotetaan. 534 00:42:18,300 --> 00:42:21,390 Mitä olin etsimässä on tulostaa osoite puskuri, 535 00:42:21,390 --> 00:42:23,680 mutta se ei oikeastaan ​​kerro paljon. 536 00:42:23,680 --> 00:42:30,770 Joten kun Satun sanoa täällä x puskuri, se osoittaa minulle 0xbffff090, 537 00:42:30,770 --> 00:42:38,690 joka, jos muistat aiemmista tai jossain vaiheessa, Oxbffff yleensä pino-ish alueella. 538 00:42:38,690 --> 00:42:46,020 Pino taipumus aloittaa jostain hieman alle 0xc000. 539 00:42:46,020 --> 00:42:51,890 Vain katsomalla tätä osoitetta, tiedän että puskuri tapahtuu pinon. 540 00:42:51,890 --> 00:43:04,500 Uudelleenkäynnistys minun ohjelma, ajaa, ylös, puskuri näimme oli tämä merkkijono 541 00:43:04,500 --> 00:43:06,530 jotka ovat melko merkityksettömiä. 542 00:43:06,530 --> 00:43:12,270 Sitten tulostus tiedostoon, mitä tiedosto näyttää? 543 00:43:15,120 --> 00:43:17,310 [Opiskelija] Null. >> Joo. 544 00:43:17,310 --> 00:43:22,610 Tiedosto on tyyppiä FILE *, joten se on osoitin, 545 00:43:22,610 --> 00:43:26,610 ja arvo, että osoitin on nolla. 546 00:43:26,610 --> 00:43:33,240 Joten fgets aikoo yrittää lukea, että osoitin epäsuorasti, 547 00:43:33,240 --> 00:43:37,320 mutta päästäkseen että osoitin, se on dereference sitä. 548 00:43:37,320 --> 00:43:40,550 Tai, voidakseen käyttää mitä sen pitäisi osoittaa, se dereferences sitä. 549 00:43:40,550 --> 00:43:43,810 Joten se dereferencing nollaosoittimen ja sen segfaults. 550 00:43:46,600 --> 00:43:48,730 Olisin voinut uudelleen sinne. 551 00:43:48,730 --> 00:43:52,170 Jos rikomme meidän tärkein asia ja ajaa, 552 00:43:52,170 --> 00:43:57,320 ensimmäinen rivi koodia on char * filename = "nonexistent.txt"; 553 00:43:57,320 --> 00:44:00,870 Tämän pitäisi antaa aika iso vihje siitä, miksi tämä ohjelma epäonnistuu. 554 00:44:00,870 --> 00:44:06,080 Kirjoittamalla vieressä pääsen seuraavalle riville, jos avaan tämän tiedoston, 555 00:44:06,080 --> 00:44:11,140 ja sitten heti päästä meidän linja, jossa kerran osuin Seuraavaksi tulee segfault. 556 00:44:11,140 --> 00:44:16,880 Haluaako joku heittää ulos miksi emme voisi segfaulting? 557 00:44:16,880 --> 00:44:19,130 [Opiskelija] Tiedostoa ei löydy. >> Joo. 558 00:44:19,130 --> 00:44:22,250 Tämä on tarkoitus olla vihje 559 00:44:22,250 --> 00:44:29,570 että kun avaat tiedoston sinun tarkistaa, että tiedosto olemassa. 560 00:44:29,570 --> 00:44:31,510 Joten tässä, "nonexistent.txt"; 561 00:44:31,510 --> 00:44:34,700 Kun me fopen tiedostonimi käsittelyssä meillä sitten on sanottava 562 00:44:34,700 --> 00:44:45,870 if (tiedosto == NULL) ja sano printf ("Tiedostoa ei ole olemassa!" 563 00:44:45,870 --> 00:44:56,340 tai - vielä parempaa - filename), paluu 1; 564 00:44:56,340 --> 00:45:00,300 Joten nyt tarkistaa, jos se on NULL 565 00:45:00,300 --> 00:45:03,930 ennen itse jatkaa ja yrittää lukea tiedoston. 566 00:45:03,930 --> 00:45:08,800 Voimme sen uudestaan ​​vain nähdä, että toimii. 567 00:45:11,020 --> 00:45:14,970 Aioin sisällyttää uusi rivi. 568 00:45:21,090 --> 00:45:25,290 Joten nyt nonexistent.txt ei ole olemassa. 569 00:45:26,890 --> 00:45:30,040 Sinun tulisi aina tarkistaa tällaista asiaa. 570 00:45:30,040 --> 00:45:33,870 Sinun tulisi aina tarkistaa, jos fopen palauttaa NULL. 571 00:45:33,870 --> 00:45:38,170 Sinun tulisi aina varmista, että malloc ei palauta NULL, 572 00:45:38,170 --> 00:45:41,410 tai muuten segfault. 573 00:45:42,200 --> 00:45:45,930 >> Nyt buggy4.c. 574 00:45:49,190 --> 00:45:58,440 Running. Olen arvaamaan tätä odottaa syötteitä tai mahdollisesti ääretön silmukka. 575 00:45:58,440 --> 00:46:01,870 Kyllä, se on ääretön silmukka. 576 00:46:01,870 --> 00:46:05,560 Niin buggy4. Näyttää siltä, ​​että olemme äärettömän looping. 577 00:46:05,560 --> 00:46:12,590 Voimme murtaa tärkeimmissä, ajaa meidän ohjelma. 578 00:46:12,590 --> 00:46:20,180 In gdb, niin kauan kuin lyhenne käytät on yksiselitteinen 579 00:46:20,180 --> 00:46:23,420 tai erityisiä lyhenteitä että ne tarjoavat sinulle, 580 00:46:23,420 --> 00:46:29,020 voit käyttää n käyttöön seuraavan sijaan tarvitse kirjoittaa ulos ensi aina. 581 00:46:29,020 --> 00:46:33,730 Ja nyt kun olen lyönyt n kerran, voin vain Enter pitää käynnissä seuraavaksi 582 00:46:33,730 --> 00:46:36,640 sen sijaan, että osuma n Anna, N Anna, n Anna. 583 00:46:36,640 --> 00:46:44,630 Näyttää siltä, ​​että olen jonkinlaisessa varten silmukka, joka on asetus array [i] ja 0. 584 00:46:44,630 --> 00:46:50,510 Se näyttää olen koskaan murtaa pois tämä silmukka. 585 00:46:50,510 --> 00:46:54,780 Jos minä tulostaa i, niin i on 2, sitten menen seuraavaksi. 586 00:46:54,780 --> 00:46:59,250 Minä tulostaa i, i on 3, sitten menen seuraavaksi. 587 00:46:59,250 --> 00:47:05,360 Minä tulostaa i ja i on 3. Seuraavaksi, tulostaa i, i on 4. 588 00:47:05,360 --> 00:47:14,520 Oikeastaan ​​tulosta sizeof (array), joten koko joukko on 20. 589 00:47:16,310 --> 00:47:32,870 Mutta näyttää siltä, ​​että joitakin erityisiä gdb komento menee kunnes jotain tapahtuu. 590 00:47:32,870 --> 00:47:37,620 Se on kuin asettamalla ehdon muuttujan arvo. Mutta en muista mitä se on. 591 00:47:37,620 --> 00:47:44,100 Joten jos pidämme menossa - 592 00:47:44,100 --> 00:47:47,120 Mitä sanoit? Mitä toit esille? 593 00:47:47,120 --> 00:47:50,500 [Opiskelija] Onko näkyviin voin lisätä - >> Joo. Joten näyttää voin auttaa. 594 00:47:50,500 --> 00:47:54,530 Jos me vain näyttää i, se laittaa tänne mitä arvo I on 595 00:47:54,530 --> 00:47:56,470 joten minun ei tarvitse tulostaa sen joka kerta. 596 00:47:56,470 --> 00:48:02,930 Jos me vain pitää käynnissä seuraavan, näemme 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 Jotain menee pahasti pieleen, ja minä ollaan palauttaa 0. 598 00:48:13,330 --> 00:48:22,220 Tarkasteltaessa buggy4.c, näemme kaikki tapahtuu on int array [5]; 599 00:48:22,220 --> 00:48:26,200 for (i = 0; i <= sizeof (array); i + +) 600 00:48:26,200 --> 00:48:28,550 array [i] = 0; 601 00:48:28,550 --> 00:48:31,390 Mitä me näemme, että on väärin täällä? 602 00:48:31,390 --> 00:48:39,480 Kuten vihje, kun olin tekemässä gdb buggy4 - Katsotaanpa murtaa tärkein, run - 603 00:48:39,480 --> 00:48:45,980 En print sizeof (array) vain nähdä, mitä tila on, jos minun pitäisi viimein puhkeaa. 604 00:48:47,690 --> 00:48:51,100 Missä olen? Juoksinko? 605 00:48:51,100 --> 00:48:54,280 En julistaa vielä. 606 00:48:54,280 --> 00:48:58,680 Joten tulostaa sizeof (array) ja se on 20, 607 00:48:58,680 --> 00:49:06,690 joka on odotettavissa, koska minun joukko on kooltaan 5 ja se on 5 kokonaislukuja, 608 00:49:06,690 --> 00:49:12,410 niin koko juttu olisi 5 * sizeof (int) tavua, missä sizeof (int) on yleensä 4. 609 00:49:12,410 --> 00:49:14,780 Joten sizeof (array) on 20. 610 00:49:14,780 --> 00:49:17,420 Mitä pitäisi olla? 611 00:49:17,420 --> 00:49:21,720 [Opiskelija] jaettuna sizeof (int). >> Joo, / sizeof (int). 612 00:49:21,720 --> 00:49:30,630 Näyttää siltä, ​​että on vielä ongelma. Minusta tämän pitäisi olla vain < 613 00:49:30,630 --> 00:49:36,960 koska se on oikeastaan ​​aina 00:49:44,860 Nyt miettiä miksi tämä oli todella rikki. 615 00:49:44,860 --> 00:49:53,370 Onko kellään arvauksia miksi olin palauttaa 0 läpi kunkin iterointia silmukan? 616 00:50:01,300 --> 00:50:09,350 Ainoa asia sisällä täällä, että tapahtuu on että taulukko [i] on asetettu 0. 617 00:50:09,350 --> 00:50:15,350 Eli jotenkin tämä rivi koodia aiheuttaa meidän int i voidaan asettaa 0. 618 00:50:16,730 --> 00:50:23,130 [Opiskelija] Voisiko olla, koska se on pakottava muisti tämän osan I 619 00:50:23,130 --> 00:50:27,970 kun se luulee sen seuraavaan elementtiin array? >> [Bowden] Kyllä. 620 00:50:27,970 --> 00:50:33,880 Kun menemme pidemmälle loppua meidän array, 621 00:50:33,880 --> 00:50:39,870 jotenkin, että tilaa että olemme pakottavilla on ohittaa arvon i. 622 00:50:39,870 --> 00:50:48,030 Ja niin jos katsomme buggy4, rikkoa tärkein, run, 623 00:50:48,030 --> 00:50:53,120 Katsotaanpa tulostaa osoite i. 624 00:50:53,120 --> 00:50:57,280 Se näyttää se bffff124. 625 00:50:57,280 --> 00:51:03,930 Nyt tulostaa osoite array [0]. 110. 626 00:51:03,930 --> 00:51:06,290 Entä [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 Joten array [5] on sama osoite kuin minä, mikä tarkoittaa sitä, että ryhmä [5] on i. 630 00:51:26,990 --> 00:51:30,720 Jos niillä on sama osoite, niin ne ovat sama asia. 631 00:51:30,720 --> 00:51:38,410 Joten kun asetamme array [5] 0, asetamme i 0. 632 00:51:38,410 --> 00:51:46,070 Ja jos ajattelee tämän suhteen pinon, 633 00:51:46,070 --> 00:51:55,590 int i julistetaan ensin, mikä tarkoittaa minä saa vähän tilaa pinoon. 634 00:51:55,590 --> 00:52:04,730 Sitten array [5] on varattu, niin sitten 20 tavua jaetaan pinoon. 635 00:52:04,730 --> 00:52:08,400 Joten minä saa kohdistetaan ensin, sitten nämä 20 tavua saada jaettu. 636 00:52:08,400 --> 00:52:11,400 Joten olen tapahtuu juuri ennen array, 637 00:52:11,400 --> 00:52:19,230 ja sillä tavalla, niin kuin sanoin viime viikolla, kun se on teknisesti pino kasvaa alaspäin, 638 00:52:19,230 --> 00:52:28,520 kun indeksinä array, me taataan, että 0. asema array 639 00:52:28,520 --> 00:52:31,970 tapahtuu aina ennen ensimmäistä asemaa array. 640 00:52:31,970 --> 00:52:35,900 Tämä on tavallaan kuinka piirsin sen viime viikolla. 641 00:52:35,900 --> 00:52:42,210 Huomaa, että alareunassa meillä on osoite 0 ja yläreunassa meillä osoitetta Max. 642 00:52:42,210 --> 00:52:44,880 Pino kasvaa jatkuvasti alaspäin. 643 00:52:48,100 --> 00:52:53,500 Sanotaan kohdentaa i. 644 00:52:53,500 --> 00:52:59,680 Me jakaa kokonaisluku i, joka tarkoittaa Sanotaan vain tänne kokonaisluku i saa myönnetty. 645 00:52:59,680 --> 00:53:06,420 Sitten me jakaa myös joukko 5 kokonaislukuja, mikä tarkoittaa, että alla, että 646 00:53:06,420 --> 00:53:11,230 koska pino kasvaa alaspäin, ne 5 kokonaislukuja saada jaettu. 647 00:53:11,230 --> 00:53:15,900 Mutta koska kuinka paneelit toimi, olemme taattu, että ensimmäinen asema array 648 00:53:15,900 --> 00:53:22,260 aina osoitteen pienempi kuin toinen asia array. 649 00:53:22,260 --> 00:53:28,270 Joten array asentoon 0 on aina tapahtua ensin muistiin, 650 00:53:28,270 --> 00:53:30,700 taas array asento 1 on tapahduttava jälkeen 651 00:53:30,700 --> 00:53:33,310 ja array asema 2 on tapahtua sen jälkeen, 652 00:53:33,310 --> 00:53:37,900 mikä tarkoittaa, että joukko asennossa 0 tapahtuisi jossain täällä, 653 00:53:37,900 --> 00:53:40,690 array asennossa 1 kävisi yläpuolella 654 00:53:40,690 --> 00:53:45,530 koska liikkeestä tarkoittaa korkeampia osoitteita, koska suurin osoite on täällä. 655 00:53:45,530 --> 00:53:50,490 Joten array [0] tänne, array [1] täällä, array [2] täällä, array [3] täällä. 656 00:53:50,490 --> 00:53:55,620 Huomaa miten ennen me jaetaan kokonaisluku i aina tänne, 657 00:53:55,620 --> 00:54:01,040 kun siirrymme pidemmälle ja syvemmälle meidän array olemme pääsemässä lähemmäs ja lähemmäs kokonaisluku i. 658 00:54:01,040 --> 00:54:07,640 Se vain on niin, että array [5], joka on yksi paikka riistäytynyt array, 659 00:54:07,640 --> 00:54:13,010 on tarkalleen missä kokonaisluku satuin jaetaan. 660 00:54:13,010 --> 00:54:16,920 Niin, että piste missä satumme lyödä tilaa pinoon 661 00:54:16,920 --> 00:54:21,680 että oli varattu kokonaisluku i, ja olemme asettaa se, 0. 662 00:54:21,680 --> 00:54:26,160 >> Näin se toimii. Kysymyksiä? Joo. 663 00:54:26,160 --> 00:54:30,710 [Opiskelija] Älä välitä. Okei. 664 00:54:30,710 --> 00:54:33,090 [Opiskelija] Miten välttää näitä tavallaan virheitä? 665 00:54:33,090 --> 00:54:41,190 Nämä tavallaan virheitä? Älä käytä C ohjelmointikieli. 666 00:54:41,190 --> 00:54:45,840 Käytä kieltä, joka on indeksirajojen tarkistamista. 667 00:54:45,840 --> 00:54:55,900 Niin kauan kuin olet varovainen, sinun tarvitsee vain välttää menossa ohi rajat teidän array. 668 00:54:55,900 --> 00:54:58,300 [Opiskelija] Joten tässä kun menimme ohi rajat teidän array - 669 00:54:58,300 --> 00:55:01,840 [Bowden] Siinä missä asiat alkavat mennä pieleen. >> [Opiskelija] Ai, okei. 670 00:55:01,840 --> 00:55:05,730 Niin kauan kuin pysyt varattu muisti oman array, olet hieno. 671 00:55:05,730 --> 00:55:12,400 Mutta C ei ole Virheentarkistus. Jos en array [1000], se mielellään vain muuttaa mitä tapahtuu - 672 00:55:12,400 --> 00:55:16,500 Se menee alussa array, sitten se menee 1000 kannat jälkeen ja asettaa sen 0. 673 00:55:16,500 --> 00:55:20,000 Se ei tee mitään tarkastaminen, että oi, tämä ei oikeastaan ​​ole 1000 asioita siinä. 674 00:55:20,000 --> 00:55:22,750 1000 on paljon suurempi kuin minun pitäisi muuttaa, 675 00:55:22,750 --> 00:55:26,940 taas Java tai jotain saat joukko out of bounds indeksin 676 00:55:26,940 --> 00:55:29,820 tai indeksin out of bounds poikkeus. 677 00:55:29,820 --> 00:55:33,950 Siksi paljon korkeamman tason kielillä on näitä asioita 678 00:55:33,950 --> 00:55:37,340 jos jos ylittää rajoja array, ette 679 00:55:37,340 --> 00:55:40,070 joten et voi muuttaa asioita alta sinua 680 00:55:40,070 --> 00:55:42,590 ja sitten asiat menevät paljon pahempi kuin vain saada poikkeus 681 00:55:42,590 --> 00:55:44,940 sanomalla että menit päättymisen jälkeen jono. 682 00:55:44,940 --> 00:55:50,970 [Opiskelija] Ja niin meidän pitäisi olla juuri muuttuneet <= vain > [Bowden] Joo. 683 00:55:50,970 --> 00:55:54,800 Sen pitäisi olla 00:55:59,560 koska sizeof (array) on 20, mutta me vain haluamme 5. >> [Opiskelija] Oikea. 685 00:55:59,560 --> 00:56:04,060 Lisää kysymyksiä? Okei. 686 00:56:04,060 --> 00:56:07,380 >> [Opiskelija] Minulla on kysymys. >> Joo. 687 00:56:07,380 --> 00:56:16,440 [Opiskelija] Mikä on todellinen taulukkomuuttujaan? 688 00:56:16,440 --> 00:56:20,000 [Bowden] Kuten mitä on array? 689 00:56:20,000 --> 00:56:24,930 Array itsessään on symboli. 690 00:56:24,930 --> 00:56:31,490 Se on vain osoite alusta 20 tavua, että olemme viitataan. 691 00:56:31,490 --> 00:56:38,070 Voit ajatella sitä osoitin, mutta se on vakio osoitin. 692 00:56:38,070 --> 00:56:44,140 Heti asiat saavat koottu, muuttuja array ei ole enää. 693 00:56:44,140 --> 00:56:48,210 [Opiskelija] Joten miten se löytää kokoa array? 694 00:56:48,210 --> 00:56:54,130 Koko array viittaa kokoon, että lohko, että symboli viittaa. 695 00:56:54,130 --> 00:57:01,240 Kun teen jotain printf ("% p \ n", array); 696 00:57:01,240 --> 00:57:05,140 Katsotaanpa käyttää sitä. 697 00:57:12,960 --> 00:57:15,530 Mitä minä juuri teen väärin? 698 00:57:15,530 --> 00:57:19,220 Array "array" ilmoitetaan tässä. 699 00:57:20,820 --> 00:57:23,200 Voi, täällä. 700 00:57:23,200 --> 00:57:31,250 Clang on älykäs, ja se sattuu huomaan julisti levyjärjestelmän 5 elementtiä 701 00:57:31,250 --> 00:57:34,540 mutta olen indeksointi paikoilleen 1000. 702 00:57:34,540 --> 00:57:38,450 Se voi tehdä niin, koska nämä ovat vain vakioita. 703 00:57:38,450 --> 00:57:43,370 Se voi vain mennä niin pitkälle huomaamatta, että aion ylittää rajat array. 704 00:57:43,370 --> 00:57:46,880 Mutta huomaa ennen kun olimme minä olla virheellisiä, 705 00:57:46,880 --> 00:57:51,040 se ei voi päättää, kuinka monta arvot voisin ottaa, 706 00:57:51,040 --> 00:57:55,540 joten se ei voi määritellä, että olin menossa pään yli array. 707 00:57:55,540 --> 00:57:59,430 Se on vain clang olla fiksu. 708 00:57:59,430 --> 00:58:03,340 >> Mutta nyt tehdä buggy4. Joten mitä muuta teen väärin? 709 00:58:03,340 --> 00:58:05,970 Epäsuorasti todetaan kirjaston funktion 'printf'. 710 00:58:05,970 --> 00:58:14,960 Aion haluta # include . 711 00:58:14,960 --> 00:58:18,710 Okei. Nyt käynnissä buggy4. 712 00:58:18,710 --> 00:58:24,840 Tulostaminen arvo array kuten tein täällä, tulostaa sen osoitin 713 00:58:24,840 --> 00:58:30,060 tulosteita jotain, joka näyttää tältä - bfb8805c - mikä on jonkin verran osoite 714 00:58:30,060 --> 00:58:33,450 se on pinossa-ish alueella. 715 00:58:33,450 --> 00:58:41,820 Array itsessään on kuin osoitin, mutta se ei ole todellinen osoitin, 716 00:58:41,820 --> 00:58:45,410 koska säännöllinen osoittimen voimme muuttua. 717 00:58:45,410 --> 00:58:54,700 Array on vain joitakin vakio. 20 lohkot muistin alkavat osoitteesta 0xbfb8805c. 718 00:58:54,700 --> 00:59:09,020 Joten bfb8805c tällä osoite +20--tai kai -20 - 719 00:59:09,020 --> 00:59:17,400 on kaikki varattu muisti tämän taulukon. 720 00:59:17,400 --> 00:59:20,350 Array, muuttuja itsessään ei ole tallennettu minnekään. 721 00:59:20,350 --> 00:59:27,660 Kun olet laadinnassa, kääntäjä - käsi aalto sitä - 722 00:59:27,660 --> 00:59:33,060 mutta kääntäjä vain käyttää se tietää array olla. 723 00:59:33,060 --> 00:59:36,090 Se tietää missä se array alkaa, 724 00:59:36,090 --> 00:59:40,910 ja niin se voi aina vain tehdä asioita suhteen vastikkeiden tuosta alusta. 725 00:59:40,910 --> 00:59:43,960 Se ei tarvitse muuttuja itse edustaa array. 726 00:59:43,960 --> 00:59:53,730 Mutta kun teen jotain int * p = array; nyt p on osoitin, joka osoittaa, että jono, 727 00:59:53,730 --> 00:59:57,830 ja nyt p todella on olemassa pinoon. 728 00:59:57,830 --> 01:00:01,950 Olen vapaa muuttamaan s.. Voin tehdä p = malloc. 729 01:00:01,950 --> 01:00:06,500 Joten se alunperin huomautti array, nyt se osoittaa jonkin verran tilaa kasaan. 730 01:00:06,500 --> 01:00:09,620 En voi tehdä array = malloc. 731 01:00:09,620 --> 01:00:13,710 Jos clang on fiksu, se huutaa minulle oikeus pois bat. 732 01:00:17,000 --> 01:00:21,430 Oikeastaan, olen melko varma, gcc tekisi tämäkin. 733 01:00:21,430 --> 01:00:25,010 Joten array type "int [5] ei ole siirrettävissä. 734 01:00:25,010 --> 01:00:28,040 Et voi määrittää jotain array tyyppiä 735 01:00:28,040 --> 01:00:30,500 koska matriisi on vakio. 736 01:00:30,500 --> 01:00:34,760 Se on symboli mitkä nuo 20 tavua. En voi muuttaa sitä. 737 01:00:34,760 --> 01:00:37,690 >> [Opiskelija] Ja jos on taulukon koko säilytetään? 738 01:00:37,690 --> 01:00:40,670 [Bowden] Se ei tallenneta mihinkään. Se kun se kootaan. 739 01:00:40,670 --> 01:00:46,310 Eli jos on kokoa array säilytetään? 740 01:00:46,310 --> 01:00:51,870 Voit käyttää sizeof (array) sisällä toiminto matriisi on julistautunut. 741 01:00:51,870 --> 01:01:03,150 Joten jos teen jonkin toiminnon, foo, ja minä (int array []) 742 01:01:03,150 --> 01:01:10,450 printf ("% d \ n", sizeof (array)); 743 01:01:10,450 --> 01:01:21,330 ja sitten täällä Kutsun foo (array); 744 01:01:21,330 --> 01:01:24,840 sisällä tätä toimintoa - Katsotaanpa käyttää sitä. 745 01:01:34,200 --> 01:01:36,840 Tämä on clang olla fiksu uudelleen. 746 01:01:36,840 --> 01:01:43,890 Se kertoo minulle, että sizeof on array funktio parametrin 747 01:01:43,890 --> 01:01:46,690 palaa koko 'int *'. 748 01:01:46,690 --> 01:01:55,150 Tämä olisi virhe, jos se ei ole mitä halusin tapahtua. 749 01:01:55,150 --> 01:01:58,960 Katsotaan todellakin sammuu Werror. 750 01:02:14,950 --> 01:02:17,590 Varoitus. Varoitukset ovat hienoja. 751 01:02:17,590 --> 01:02:19,960 Se on edelleen kääntää niin kauan kuin se on varoitus. 752 01:02:19,960 --> 01:02:22,910 . / A.out tulee tulostaa 4. 753 01:02:22,910 --> 01:02:28,650 Varoitus, että syntyi on selkeä osoitus siitä, mikä meni pieleen. 754 01:02:28,650 --> 01:02:34,120 Tämä int array on juuri menossa painoon sizeof (int *). 755 01:02:34,120 --> 01:02:39,790 Vaikka laitan array [5] täällä, se on silti vain painoon sizeof (int *). 756 01:02:39,790 --> 01:02:47,440 Joten heti kun siihen johdetaan toiminto, ero taulukot ja osoittimet 757 01:02:47,440 --> 01:02:49,670 on olematon. 758 01:02:49,670 --> 01:02:52,640 Tämä sattuu olemaan joukko, joka oli ilmoitettu pinoon, 759 01:02:52,640 --> 01:02:58,300 mutta heti kun kuljemme tätä arvoa, että 0xbf blaa, blaa, blaa tähän toiminto, 760 01:02:58,300 --> 01:03:03,350 sitten tämä osoitin osoittaa, että array pinoon. 761 01:03:03,350 --> 01:03:08,310 Joten se tarkoittaa, että sizeof sovelletaan vain toiminto, joka array julistettiin, 762 01:03:08,310 --> 01:03:11,230 mikä tarkoittaa, että kun olet laadinnassa tätä toimintoa, 763 01:03:11,230 --> 01:03:17,330 kun clang kulkee tätä toimintoa, se näkee array on int joukko koko 5. 764 01:03:17,330 --> 01:03:20,640 Joten se näkee sizeof (array). No, se on 20. 765 01:03:20,640 --> 01:03:26,440 Se on oikeastaan ​​miten sizeof periaatteessa toimii lähes kaikissa tapauksissa. 766 01:03:26,440 --> 01:03:31,150 Sizeof ei funktio, se operaattori. 767 01:03:31,150 --> 01:03:33,570 Et soita sizeof toiminto. 768 01:03:33,570 --> 01:03:38,280 Sizeof (int), kääntäjä vain kääntää että 4. 769 01:03:41,480 --> 01:03:43,700 Ymmärsitkö? Okei. 770 01:03:43,700 --> 01:03:47,520 >> [Opiskelija] Mitä eroa on sizeof (array) pää-ja foo? 771 01:03:47,520 --> 01:03:52,840 Tämä johtuu siitä, että me sanomme sizeof (array), joka on tyyppiä int *, 772 01:03:52,840 --> 01:03:57,120 taas array täällä ei ole tyyppiä int *, se int array. 773 01:03:57,120 --> 01:04:04,540 >> [Opiskelija] Joten jos sinulla on ollut parametri array [] sijasta int * array, 774 01:04:04,540 --> 01:04:09,230 se tarkoittaisi, että voisit vielä muuttaa array koska nyt se osoitin? 775 01:04:09,230 --> 01:04:14,250 [Bowden] Pidätkö tästä? >> [Opiskelija] Joo. Voitko muuttaa array sisällä toiminto nyt? 776 01:04:14,250 --> 01:04:18,420 [Bowden] Voisit muuttaa array molemmissa tapauksissa. 777 01:04:18,420 --> 01:04:23,130 Molemmissa tapauksissa on ilmaiseksi sanoa array [4] = 0. 778 01:04:23,130 --> 01:04:26,590 [Opiskelija] Mutta voit tehdä erilaisia ​​valitse jotain muuta? 779 01:04:26,590 --> 01:04:30,230 [Bowden] Oh. Joo. Kummassakin tapauksessa - >> [opiskelija] Joo. 780 01:04:30,230 --> 01:04:38,410 [Bowden] ero array [] ja int * taulukko, ei kukaan. 781 01:04:38,410 --> 01:04:42,570 Voit myös saada joitakin moniulotteinen array täällä 782 01:04:42,570 --> 01:04:47,050 joillekin kätevä syntaksi, mutta se on silti vain osoitin. 783 01:04:47,050 --> 01:04:56,400 Tämä tarkoittaa sitä, että olen vapaa tekemään array = malloc (sizeof (int)); ja nyt kohta jossain muualla. 784 01:04:56,400 --> 01:04:59,610 Mutta aivan kuten miten tämä toimii ikuisesti ja aina, 785 01:04:59,610 --> 01:05:03,210 muuttamalla array tekemällä osoitat jotain muuta 786 01:05:03,210 --> 01:05:07,570 ei muuta tätä array tänne, koska se on kopio väitteen, 787 01:05:07,570 --> 01:05:10,780 se ei ole osoitin kyseiseen väitteeseen. 788 01:05:10,780 --> 01:05:16,070 Ja itse asiassa, kuten enemmän viitteitä siitä, että se on täsmälleen sama - 789 01:05:16,070 --> 01:05:21,100 me jo näki mitä tulostus array tulosteita - 790 01:05:21,100 --> 01:05:31,410 mitä jos me tulostaa osoite matriisissa tai osoite osoite array 791 01:05:31,410 --> 01:05:36,290 jompaankumpaan? 792 01:05:41,770 --> 01:05:45,220 Katsotaanpa sivuuttaa tätä. 793 01:05:48,140 --> 01:05:51,660 Okei. Tämä on hieno. Se on nyt käynnissä. / A.out. 794 01:05:51,660 --> 01:06:00,220 Tulostus array sitten tulostaa osoite array, ovat sama asia. 795 01:06:00,220 --> 01:06:02,870 Array vain ei ole olemassa. 796 01:06:02,870 --> 01:06:08,190 Se tietää, milloin olet tulostat array, olet tulostat symboli, joka viittaa niihin 20 tavua. 797 01:06:08,190 --> 01:06:11,940 Tulostaminen osoite array, hyvin, array ei ole olemassa. 798 01:06:11,940 --> 01:06:17,200 Se ei ole osoitetta, niin se vain tulostaa osoite näiden 20 tavua. 799 01:06:20,820 --> 01:06:28,150 Heti kun kääntää alas, kuten teidän koottu buggy4. / A.out, 800 01:06:28,150 --> 01:06:30,340 array on olematon. 801 01:06:30,340 --> 01:06:33,640 Pointers olemassa. Arrays ei. 802 01:06:34,300 --> 01:06:38,060 Lohkojen muistia edustavat array edelleen olemassa, 803 01:06:38,060 --> 01:06:43,270 mutta vaihteleva joukko, ja muuttujat, jotka tyyppiä ei ole olemassa. 804 01:06:46,260 --> 01:06:50,270 Ne ovat kuin tärkeimmät erot taulukot ja osoittimet 805 01:06:50,270 --> 01:06:55,590 ovat heti teet funktiokutsut, ei ole mitään eroa. 806 01:06:55,590 --> 01:07:00,460 Mutta sisällä toiminto itse taulukon julistetaan, sizeof toimii eri 807 01:07:00,460 --> 01:07:05,190 koska olet tulostaa niiden lohkojen koon sijasta koko tyyppiä, 808 01:07:05,190 --> 01:07:08,950 ja et voi muuttaa sitä, koska se on merkki. 809 01:07:08,950 --> 01:07:14,370 Tulostaminen asia ja osoitteen asia tulostuu sama asia. 810 01:07:14,370 --> 01:07:18,480 Ja se on aika paljon se. 811 01:07:18,480 --> 01:07:20,820 [Opiskelija] Voisitko sanoa, että vielä kerran? 812 01:07:21,170 --> 01:07:24,170 Olisin jäänyt jotain. 813 01:07:24,170 --> 01:07:29,260 Tulostus valikoima ja osoite array tulostaa sama asia, 814 01:07:29,260 --> 01:07:33,180 taas jos tulostat osoittimen vs. osoite osoitin, 815 01:07:33,180 --> 01:07:36,010 yksi asia tulostaa osoite mitä olet osoittaa, 816 01:07:36,010 --> 01:07:40,360 muut tulostaa osoitteen osoittimen pinoon. 817 01:07:40,360 --> 01:07:47,040 Voit muuttaa osoittimen, et voi muuttaa taulukon symboli. 818 01:07:47,740 --> 01:07:53,270 Ja sizeof osoitin tulee tulostaa koko tuon osoittimen tyyppiä. 819 01:07:53,270 --> 01:07:57,470 Joten int * p sizeof (p) on menossa painoon 4, 820 01:07:57,470 --> 01:08:04,110 mutta int array [5] print sizeof (taulukko) on menossa painoon 20. 821 01:08:04,110 --> 01:08:07,480 [Opiskelija] Joten int array [5] tulostaa 20? >> Kyllä. 822 01:08:07,480 --> 01:08:13,300 Siksi sisälle buggy4 kun se käytti olla sizeof (taulukko) 823 01:08:13,300 --> 01:08:16,660 tämä oli tekemässä i <20, joka ei ole sitä mitä halusimme. 824 01:08:16,660 --> 01:08:20,880 Haluamme i <5. >> [Opiskelija] Okei. 825 01:08:20,880 --> 01:08:25,569 [Bowden] Ja sitten heti aloittaa kulkevat toiminnot, 826 01:08:25,569 --> 01:08:34,340 jos teimme int * p = array; 827 01:08:34,340 --> 01:08:39,779 sisällä tätä toimintoa, voimme periaatteessa käyttää p ja array täsmälleen samalla tavalla, 828 01:08:39,779 --> 01:08:43,710 lukuun ottamatta sizeof ongelma ja muuttuviin ongelma. 829 01:08:43,710 --> 01:08:49,810 Mutta p [0] = 1, on sama kuin sanoa array [0] = 1; 830 01:08:49,810 --> 01:08:55,600 Ja heti kun sanomme foo (array) tai foo (p); 831 01:08:55,600 --> 01:08:59,760 sisällä foo-toiminto, tämä on sama puhelu kahdesti. 832 01:08:59,760 --> 01:09:03,350 Ei ole mitään eroa näiden kahden puhelun. 833 01:09:07,029 --> 01:09:11,080 >> Jokainen hyvä siitä? Okei. 834 01:09:14,620 --> 01:09:17,950 Meillä on 10 minuuttia. 835 01:09:17,950 --> 01:09:28,319 >> Yritämme päästä läpi Hacker Typer ohjelmaa, 836 01:09:28,319 --> 01:09:32,350 Tässä sivusto, joka tuli ulos viime vuonna tai jotain. 837 01:09:34,149 --> 01:09:41,100 Se vain pitäisi olla kuin kirjoitat satunnaisesti ja se tulostaa - 838 01:09:41,100 --> 01:09:46,729 Mitä tahansa tiedoston sattuu ladannut on sitä miltä näyttää kirjoitat. 839 01:09:46,729 --> 01:09:52,069 Se näyttää jonkinlainen käyttöjärjestelmän koodia. 840 01:09:53,760 --> 01:09:56,890 Sitähän me haluamme toteuttaa. 841 01:10:08,560 --> 01:10:11,690 Sinun pitäisi olla suoritettavassa nimeltä hacker_typer 842 01:10:11,690 --> 01:10:14,350 joka vie yhteen väitteeseen, tiedosto "hakkeri tyyppi." 843 01:10:14,350 --> 01:10:16,480 Running suoritettavan pitäisi tyhjentää näytön 844 01:10:16,480 --> 01:10:20,850 ja sitten tulostaa yhden merkin läpikulkevien-tiedostojen aina käyttäjä painaa näppäintä. 845 01:10:20,850 --> 01:10:24,990 Joten mitä näppäintä painat, sen pitäisi heittää pois, ja sen sijaan tulostaa hahmo tiedosto 846 01:10:24,990 --> 01:10:27,810 että on argumentti. 847 01:10:29,880 --> 01:10:34,350 Minä melko paljon kertoa teille, mitä asioita aiomme pitää tietää ovat. 848 01:10:34,350 --> 01:10:36,440 Mutta haluamme tarkistaa termios kirjastoon. 849 01:10:36,440 --> 01:10:44,840 En ole koskaan käyttänyt tätä kirjastoa koko elämässäni, joten se on hyvin minimaalinen tarkoituksiin. 850 01:10:44,840 --> 01:10:48,610 Mutta tämä tulee olemaan kirjastoon voimme heittää pois merkki osut 851 01:10:48,610 --> 01:10:52,390 Kun kirjoitat osaksi standardia sisään 852 01:10:56,970 --> 01:11:05,840 Joten hacker_typer.c, ja aiomme haluavat # include . 853 01:11:05,840 --> 01:11:12,870 Tarkasteltaessa man-sivulla termios - Olen arvaamaan se päätteelle OS tai jotain - 854 01:11:12,870 --> 01:11:16,240 En osaa lukea sitä. 855 01:11:16,240 --> 01:11:21,040 Tarkasteltaessa tätä, se sanoo sisällyttää näihin 2 tiedostoa, joten teemme sen. 856 01:11:37,620 --> 01:11:46,820 >> Ensimmäinen asia ensin haluamme toteuttaa yhtenä perustelu, joka on tiedosto pitäisi avata. 857 01:11:46,820 --> 01:11:52,420 Joten mitä haluan tehdä? Miten tarkistaa, minulla on yksi argumentti? 858 01:11:52,420 --> 01:11:56,480 [Opiskelija] Jos argc vastaa sitä. >> [Bowden] Joo. 859 01:11:56,480 --> 01:12:21,250 Joten jos (argc! = 2) printf ("Käyttö:% s [Avaa tiedosto]"). 860 01:12:21,250 --> 01:12:32,750 Joten nyt jos ajaa tämä ilman että toinen väite - oh, tarvitsen uuden linjan - 861 01:12:32,750 --> 01:12:36,240 näet sanotaan Käyttö:. / hacker_typer, 862 01:12:36,240 --> 01:12:39,770 ja sitten toinen argumentti olisi tiedosto Haluan avata. 863 01:12:58,430 --> 01:13:01,260 Nyt mitä teen? 864 01:13:01,260 --> 01:13:08,490 Haluan lukea tämän tiedoston. Miten lukea tiedostoa? 865 01:13:08,490 --> 01:13:11,920 [Opiskelija] Avaat sen ensin. >> Joo. 866 01:13:11,920 --> 01:13:15,010 Niin fopen. Mitä fopen näyttää? 867 01:13:15,010 --> 01:13:22,980 [Opiskelija] Tiedostonimi. >> [Bowden] Tiedoston tulee olemaan argv [1]. 868 01:13:22,980 --> 01:13:26,110 [Opiskelija] Ja sitten mitä haluat tehdä sen kanssa, joten - >> [Bowden] Joo. 869 01:13:26,110 --> 01:13:28,740 Joten jos et muista, voit vain tehdä mies fopen, 870 01:13:28,740 --> 01:13:32,960 jossa se tulee olemaan const char * polku missä polku on tiedostonimi, 871 01:13:32,960 --> 01:13:34,970 const char * mode. 872 01:13:34,970 --> 01:13:38,660 Jos satut muistaa missä tilassa on, voit etsiä tilaan. 873 01:13:38,660 --> 01:13:44,660 Sisällä ihmisen sivuja, kauttaviiva merkki on mitä voit etsiä asioita. 874 01:13:44,660 --> 01:13:49,790 Joten kirjoitan / tila etsiä tilaan. 875 01:13:49,790 --> 01:13:57,130 n ja N ovat mitä voit selata haku otteluissa. 876 01:13:57,130 --> 01:13:59,800 Täällä sanotaan väitteen tila osoittaa merkkijono 877 01:13:59,800 --> 01:14:01,930 alkaen yksi seuraavista sekvensseistä. 878 01:14:01,930 --> 01:14:06,480 Joten R, avaa tekstitiedosto lukemista varten. Sitähän me haluamme tehdä. 879 01:14:08,930 --> 01:14:13,210 Lukemiseen, ja haluan säilyttää se. 880 01:14:13,210 --> 01:14:18,720 Asia tulee olemaan FILE *. Nyt mitä haluan tehdä? 881 01:14:18,720 --> 01:14:21,200 Anna minulle toinen. 882 01:14:28,140 --> 01:14:30,430 Okei. Nyt mitä haluan tehdä? 883 01:14:30,430 --> 01:14:32,940 [Opiskelija] Tarkista se NULL. >> [Bowden] Joo. 884 01:14:32,940 --> 01:14:38,690 Aina kun avaat tiedoston, varmista, että olet onnistuneesti pystyä avaamaan sitä. 885 01:14:58,930 --> 01:15:10,460 >> Nyt haluan tehdä termios juttuja missä haluan ensin lukea minun nykyiset asetukset 886 01:15:10,460 --> 01:15:14,050 ja tallenna ne johonkin, niin haluan muuttaa asetuksia 887 01:15:14,050 --> 01:15:19,420 heittää pois mitä tahansa merkkiä, joka kirjoitan, 888 01:15:19,420 --> 01:15:22,520 ja sitten haluaisin päivittää näitä asetuksia. 889 01:15:22,520 --> 01:15:27,250 Ja sitten lopussa ohjelman, haluan vaihtaa takaisin alkuperäiseen asetukset. 890 01:15:27,250 --> 01:15:32,080 Joten struct tulee olemaan tyyppiä termios, ja aion haluavat kaksi näistä. 891 01:15:32,080 --> 01:15:35,600 Ensimmäinen tulee olemaan minun current_settings, 892 01:15:35,600 --> 01:15:42,010 ja sitten he tulevat olemaan minun hacker_settings. 893 01:15:42,010 --> 01:15:48,070 Ensiksi aion haluat tallentaa minun nykyiset asetukset, 894 01:15:48,070 --> 01:15:53,790 Sitten aion haluat päivittää hacker_settings, 895 01:15:53,790 --> 01:16:01,570 ja sitten miten lopussa minun, haluan palata nykyiset asetukset. 896 01:16:01,570 --> 01:16:08,660 Joten säästää nykyiset asetukset, niin että toimii, meillä mies termios. 897 01:16:08,660 --> 01:16:15,810 Näemme, että meillä on tämä int tcsetattr, int tcgetattr. 898 01:16:15,810 --> 01:16:22,960 Minä kulkea termios struct sen osoitin. 899 01:16:22,960 --> 01:16:30,640 Miten tämä näyttää on - I've jo unohtaneet mitä toimintoa kutsuttiin. 900 01:16:30,640 --> 01:16:34,930 Kopioi ja liitä se. 901 01:16:39,150 --> 01:16:45,500 Joten tcgetattr, niin haluan kulkea struct että olen säästö tietoa, 902 01:16:45,500 --> 01:16:49,650 joka tulee olemaan current_settings, 903 01:16:49,650 --> 01:16:59,120 ja ensimmäinen argumentti on tiedosto kuvaaja asia, jonka haluan tallentaa ominaisuuksia. 904 01:16:59,120 --> 01:17:04,360 Mikä tiedosto avainsana on on kuin aina, kun avaat tiedoston, se saa tiedoston avainsana. 905 01:17:04,360 --> 01:17:14,560 Kun minä fopen argv [1], se saa tiedoston avainsana johon viittaat 906 01:17:14,560 --> 01:17:16,730 kun haluat lukea tai kirjoittaa sitä. 907 01:17:16,730 --> 01:17:19,220 Se ei ole tiedoston avainsana haluan käyttää täällä. 908 01:17:19,220 --> 01:17:21,940 On kolme tiedostoa kuvaajat olet oletuksena, 909 01:17:21,940 --> 01:17:24,310 jotka ovat vakiona, vakio ulos, ja keskivirhe. 910 01:17:24,310 --> 01:17:29,960 Oletuksena mielestäni se on standardi on 0, standardi out on 1, ja keskivirhe on 2. 911 01:17:29,960 --> 01:17:33,980 Joten mitä haluan muuttaa asetuksia? 912 01:17:33,980 --> 01:17:37,370 Haluan muuttaa asetuksia kun osuin luonne, 913 01:17:37,370 --> 01:17:41,590 Haluan sen heittää, että merkki pois sen sijaan tulostaa sen näytölle. 914 01:17:41,590 --> 01:17:45,960 Mitä stream - standardi, standardi ulos tai keskivirhe - 915 01:17:45,960 --> 01:17:52,050 reagoi asioihin kun kirjoitan at näppäimistöä? >> [Opiskelija] Standard sisään >> Joo. 916 01:17:52,050 --> 01:17:56,450 Joten en voi joko tehdä 0 tai voin tehdä stdin. 917 01:17:56,450 --> 01:17:59,380 Saan current_settings standardin tuumaa 918 01:17:59,380 --> 01:18:01,720 >> Nyt haluan päivittää näitä asetuksia, 919 01:18:01,720 --> 01:18:07,200 joten ensin minä kopioida hacker_settings mitä minun current_settings ovat. 920 01:18:07,200 --> 01:18:10,430 Ja kuinka tietueet työ on se vain kopioi. 921 01:18:10,430 --> 01:18:14,510 Tämä kopioi kaikki kentät, kuten odottaa. 922 01:18:14,510 --> 01:18:17,410 >> Nyt haluan päivittää joitakin kenttiä. 923 01:18:17,410 --> 01:18:21,670 Looking at termios, sinun pitäisi lukea läpi paljon tämän 924 01:18:21,670 --> 01:18:24,110 vain nähdä mitä haluaisi etsiä, 925 01:18:24,110 --> 01:18:28,210 mutta liput aiot halua etsiä ovat kaiku, 926 01:18:28,210 --> 01:18:33,110 joten Echo Echo syötetyt merkit. 927 01:18:33,110 --> 01:18:37,710 Ensin haluan asettaa - I've jo unohtaneet, mitä kentät ovat. 928 01:18:45,040 --> 01:18:47,900 Tämä on mitä struct näyttää. 929 01:18:47,900 --> 01:18:51,060 Joten tulotiloissa mielestäni me haluamme muuttaa. 930 01:18:51,060 --> 01:18:54,210 Me tutustumme ratkaisu varmistaa, että se mitä me haluamme muuttaa. 931 01:19:04,060 --> 01:19:12,610 Haluamme muuttaa lflag estämiseksi tarvitse käydä läpi kaikkia näitä. 932 01:19:12,610 --> 01:19:14,670 Haluamme muuttaa paikallista tilaa. 933 01:19:14,670 --> 01:19:17,710 Sinun olisi pitänyt lukea läpi tätä koko juttu ymmärtää missä kaikki kuuluu 934 01:19:17,710 --> 01:19:19,320 että me haluamme muuttaa. 935 01:19:19,320 --> 01:19:24,120 Mutta se on sisällä paikallisia liikennemuotojen minne olemme menossa halua muuttaa sitä. 936 01:19:27,080 --> 01:19:33,110 Joten hacker_settings.cc_lmode on mikä sen nimi on. 937 01:19:39,630 --> 01:19:43,020 c_lflag. 938 01:19:49,060 --> 01:19:52,280 Tämä on, jos pääsemme bittioperaatioiden. 939 01:19:52,280 --> 01:19:54,860 Olemme aika myöhään, mutta menemme läpi todella nopeasti. 940 01:19:54,860 --> 01:19:56,600 Tästä me päästä bittioperaatioiden, 941 01:19:56,600 --> 01:19:59,950 missä Luulen sanoi kerran kauan sitten, että kun aloitat tekemisissä liput, 942 01:19:59,950 --> 01:20:03,370 aiot käyttää bittioperaattori paljon. 943 01:20:03,370 --> 01:20:08,240 Jokainen bitti lipun vastaa jonkinlaista käyttäytymistä. 944 01:20:08,240 --> 01:20:14,090 Joten tässä, tämä lippu on joukko erilaisia ​​asioita, jossa ne kaikki tarkoittaa jotain erilaista. 945 01:20:14,090 --> 01:20:18,690 Mutta mitä haluan tehdä, on vain sammuttaa bitin joka vastaa ECHO. 946 01:20:18,690 --> 01:20:25,440 Niin kääntää että pois en & = ¬ ECHO. 947 01:20:25,440 --> 01:20:30,110 Oikeastaan, mielestäni se on kuin techo tai jotain. Aion tarkistaa uudelleen. 948 01:20:30,110 --> 01:20:34,050 Voin termios sen. Se on vain ECHO. 949 01:20:34,050 --> 01:20:38,440 ECHO tulee olemaan yksi bitti. 950 01:20:38,440 --> 01:20:44,230 ¬ ECHO aikoo merkitä kaikki bitit asetetaan 1, mikä tarkoittaa kaikkia liput on asetettu true 951 01:20:44,230 --> 01:20:47,140 lukuun ottamatta ECHO vähän. 952 01:20:47,140 --> 01:20:53,830 Lopettamalla oman paikallisen lippuja tämän, se tarkoittaa kaikkia lippuja tällä hetkellä asetettu true 953 01:20:53,830 --> 01:20:56,520 edelleen asetetaan totta. 954 01:20:56,520 --> 01:21:03,240 Jos minun ECHO lippu on true, niin tämä on väistämättä asetettu FALSE ECHO lippua. 955 01:21:03,240 --> 01:21:07,170 Joten tämä koodirivi vain sammuu ECHO lippua. 956 01:21:07,170 --> 01:21:16,270 Muut riviä koodia, minä vain kopioida niitä edun ajan ja sitten selittää niitä. 957 01:21:27,810 --> 01:21:30,180 Liuoksessa, hän sanoi 0. 958 01:21:30,180 --> 01:21:33,880 Se on luultavasti parempi nimenomaan sanoa stdin. 959 01:21:33,880 --> 01:21:42,100 >> Huomaa, että olen myös tekemässä ECHO | ICANON täällä. 960 01:21:42,100 --> 01:21:46,650 ICANON viittaa jotain erillistä, mikä tarkoittaa kanoninen tilassa. 961 01:21:46,650 --> 01:21:50,280 Mitä kanoninen tila tarkoittaa yleensä kun kirjoitat ulos komentoriviltä, 962 01:21:50,280 --> 01:21:54,670 standardi ei käsittele mitään kunnes osut rivinvaihtoa. 963 01:21:54,670 --> 01:21:58,230 Joten jos et GetString, kirjoitat joukko asioita, niin osut rivinvaihtoa. 964 01:21:58,230 --> 01:22:00,590 Silloin se on lähetetty standardin tuumaa 965 01:22:00,590 --> 01:22:02,680 Tuo oletus. 966 01:22:02,680 --> 01:22:05,830 Kun suljen kanoninen tilassa, nyt jokainen merkki painat 967 01:22:05,830 --> 01:22:10,910 on mitä saa käsitellä, joka on yleensä sellainen huono, koska se on hidas käsitellä näitä asioita, 968 01:22:10,910 --> 01:22:14,330 minkä vuoksi se on hyvä puskuri sen koko riviä. 969 01:22:14,330 --> 01:22:16,810 Mutta haluan jokaisen merkin voidaan käsitellä 970 01:22:16,810 --> 01:22:18,810 koska en halua sitä odottaa minua lyödä rivinvaihto 971 01:22:18,810 --> 01:22:21,280 ennen kuin se käsittelee kaikki merkit olen kirjoittamalla. 972 01:22:21,280 --> 01:22:24,760 Tämä poistaa kanoninen tilassa. 973 01:22:24,760 --> 01:22:31,320 Tämä kamaa vain tarkoittaa, kun se todellisuudessa käsittelee merkkiä. 974 01:22:31,320 --> 01:22:35,830 Tämä tarkoittaa käsittelee ne välittömästi; pian kirjoittaessani heitä, käsitellä niitä. 975 01:22:35,830 --> 01:22:42,510 Ja tämä on toiminto, joka päivittää minun asetukset vakiona, 976 01:22:42,510 --> 01:22:45,480 ja TCSA keinot tehdä se nyt. 977 01:22:45,480 --> 01:22:50,310 Muut vaihtoehdot ovat odottaa kaiken on parhaillaan prosessoidaan. 978 01:22:50,310 --> 01:22:52,030 Se ei oikeastaan ​​väliä. 979 01:22:52,030 --> 01:22:56,920 Juuri nyt muutan asetuksia on mitä on tällä hetkellä hacker_typer_settings. 980 01:22:56,920 --> 01:23:02,210 Luulen sitä kutsui hacker_settings, joten katsotaanpa muuttaa. 981 01:23:09,610 --> 01:23:13,500 Vaihda kaiken hacker_settings. 982 01:23:13,500 --> 01:23:16,870 >> Nyt lopussa ohjelmamme aiomme haluat palauttaa 983 01:23:16,870 --> 01:23:20,210 , mikä on tällä hetkellä sisällä normal_settings, 984 01:23:20,210 --> 01:23:26,560 joka tulee vain näyttää & normal_settings. 985 01:23:26,560 --> 01:23:30,650 Ilmoitus En ole muuttanut mitään minun normal_settings koska alunperin saada se. 986 01:23:30,650 --> 01:23:34,520 Sitten vain muuttaa niitä takaisin, välitän ne takaisin lopussa. 987 01:23:34,520 --> 01:23:38,390 Tämä oli päivitys. Okei. 988 01:23:38,390 --> 01:23:43,900 >> Nyt sisällä täällä minä vain selittää koodi edun ajan. 989 01:23:43,900 --> 01:23:46,350 Se ei ole paljon koodia. 990 01:23:50,770 --> 01:24:03,750 Näemme luemme merkin tiedostosta. Kutsuimme sitä f.. 991 01:24:03,750 --> 01:24:07,850 Nyt voit ihminen fgetc, mutta miten fgetc menee töihin 992 01:24:07,850 --> 01:24:11,910 on juuri se tulee palauttaa merkin, että olet juuri lukenut tai EOF, 993 01:24:11,910 --> 01:24:15,680 joka vastaa tiedoston loppuun tai tapahtuu jokin virhe tapahtuu. 994 01:24:15,680 --> 01:24:19,900 Olemme looping, edelleen lukea yhden merkin tiedostosta, 995 01:24:19,900 --> 01:24:22,420 kunnes olemme loppuu merkkiä lukea. 996 01:24:22,420 --> 01:24:26,650 Ja kun me teemme, että odotamme yhteen hahmo vakio tuumaa 997 01:24:26,650 --> 01:24:29,090 Joka kerta kun kirjoitat jotain komentoriviltä, 998 01:24:29,090 --> 01:24:32,820 että on lukemista hahmo vakio tuumaa 999 01:24:32,820 --> 01:24:38,330 Sitten putchar on juuri menossa laittaa char luimme täällä tiedostosta standardin ulos. 1000 01:24:38,330 --> 01:24:42,890 Voit mies putchar, mutta se on vain laskemisesta standardin ulos, se tulostetaan, että merkki. 1001 01:24:42,890 --> 01:24:51,600 Voisit myös vain tehdä printf ("% c", c); Sama idea. 1002 01:24:53,330 --> 01:24:56,670 Se tulee tehdä suurin osa työstä. 1003 01:24:56,670 --> 01:25:00,300 >> Viimeinen asia aiomme haluavat tehdä vain FSulje meidän tiedoston. 1004 01:25:00,300 --> 01:25:03,310 Jos et FSulje, se muistivuoto. 1005 01:25:03,310 --> 01:25:06,680 Haluamme FSulje tiedosto olemme alunperin avattu, ja mielestäni se on siinä. 1006 01:25:06,680 --> 01:25:13,810 Jos teemme, että olen jo saanut ongelmia. 1007 01:25:13,810 --> 01:25:17,260 Katsotaanpa. 1008 01:25:17,260 --> 01:25:19,960 Mitä se valittaa? 1009 01:25:19,960 --> 01:25:30,220 Odotettu INT mutta väite on tyyppiä 'struct _IO_FILE * ". 1010 01:25:36,850 --> 01:25:39,370 Näemme jos se toimii. 1011 01:25:45,210 --> 01:25:53,540 Sallittu ainoastaan ​​C99. Augh. Okei, tee hacker_typer. 1012 01:25:53,540 --> 01:25:57,760 Nyt saamme enemmän hyötyä kuvauksia. 1013 01:25:57,760 --> 01:25:59,900 Joten käytä pimeää tunniste "normal_settings". 1014 01:25:59,900 --> 01:26:04,170 En kutsu sitä normal_settings. Kutsuin sitä current_settings. 1015 01:26:04,170 --> 01:26:12,090 Joten muuttaa kaikki tämä. 1016 01:26:17,920 --> 01:26:21,710 Nyt kulkee argumentti. 1017 01:26:26,290 --> 01:26:29,500 Teen tätä 0 nyt. 1018 01:26:29,500 --> 01:26:36,720 Okei. . / Hacker_typer cp.c. 1019 01:26:36,720 --> 01:26:39,590 En myöskään tyhjentää näytön alussa. 1020 01:26:39,590 --> 01:26:42,960 Mutta voit katsoa taaksepäin viime Harjoitus nähdä miten tyhjentää näytön. 1021 01:26:42,960 --> 01:26:45,160 Se on vain tulostettaessa merkkejä 1022 01:26:45,160 --> 01:26:47,210 Vaikka tämä on sitä, mitä haluan tehdä. 1023 01:26:47,210 --> 01:26:48,900 Okei. 1024 01:26:48,900 --> 01:26:55,280 Ja miettiä, miksi tämä piti olla 0 eikä stdin, 1025 01:26:55,280 --> 01:27:00,560 joka olisi # define 0, 1026 01:27:00,560 --> 01:27:03,890 tämä valittaa, että - 1027 01:27:13,150 --> 01:27:19,360 Ennen kun sanoin että siellä on tiedosto kuvaajat, mutta sitten on myös tiedosto * 1028 01:27:19,360 --> 01:27:23,210 Tiedoston avainsana on vain yksi kokonaisluku, 1029 01:27:23,210 --> 01:27:26,970 katsoo FILE * on koko joukko tavaraa liittyy siihen. 1030 01:27:26,970 --> 01:27:30,380 Siksi meidän täytyy sanoa 0 sijaan stdin 1031 01:27:30,380 --> 01:27:37,480 on, että stdin on FILE *, joka viittaa asia, joka viittaa tiedoston avainsana 0. 1032 01:27:37,480 --> 01:27:45,070 Joten vaikka tänne kun en fopen (argv [1], Saan FILE * takaisin. 1033 01:27:45,070 --> 01:27:51,180 Mutta jossain se FILE * on asia, joka vastaa tiedoston avainsana kyseisen tiedoston. 1034 01:27:51,180 --> 01:27:57,430 Jos tarkastellaan man sivun auki, joten luulen sinun täytyy tehdä mies 3 auki - nope - 1035 01:27:57,430 --> 01:27:59,380 man 2 auki - joo. 1036 01:27:59,380 --> 01:28:06,250 Jos katsot sivun auki, auki on kuin alemman tason fopen, 1037 01:28:06,250 --> 01:28:09,350 ja se palaa tiedoston todellinen avainsana. 1038 01:28:09,350 --> 01:28:12,050 fopen ei nippu tavaraa päällä auki, 1039 01:28:12,050 --> 01:28:17,640 joka sen sijaan palauttaa vain, että tiedosto avainsana palauttaa koko tiedoston * osoitin 1040 01:28:17,640 --> 01:28:20,590 jonka sisällä on meidän pikku tiedosto avainsana. 1041 01:28:20,590 --> 01:28:25,020 Joten standardi viittaa FILE * juttu, 1042 01:28:25,020 --> 01:28:29,120 taas 0 viittaa vain tiedoston avainsana standardin itsessään. 1043 01:28:29,120 --> 01:28:32,160 >> Kysymyksiä? 1044 01:28:32,160 --> 01:28:35,930 [Nauraa] ​​puhalsi läpi. 1045 01:28:35,930 --> 01:28:39,140 Selvä. Olemme tehneet. [Nauraa] 1046 01:28:39,140 --> 01:28:42,000 >> [CS50.TV]