[Musiikki soi] DAVID J. MALAN: Okei. [Naurua] Tervetuloa takaisin. Tämä on CS50. Ja tämä viikon lopussa viisi. Ja tähän asti olemme aika paljon on itsestään selvänä, että olemassa tätä kääntäjä, kalahtaa, että olet on vedonnut käsiteltävänä olevalla muuta työkalua nimeltään Make, että jotenkin maagisesti muuntaa lähdekoodin osaksi kohdekoodi, nollia ja ykkösiä siitä, että tietokoneet CPU, central käsittely-yksikkö, itse asiassa ymmärtää. Mutta näyttää siltä, ​​siellä on numero, joka on takana tapahtuu huppu tulon ja lähdön välillä. Ja haluaisin ehdottaa, että liha että vuonna hieman tarkemmin osaksi nämä neljä vaihetta, on jotain kutsutaan esikäsittelyä, jotain nimeltään compiling, mitä olemme nähneet, jotain kutsutaan kokoonpano, ja jotain kutsutaan yhdistää. Joten asti, eräillä ohjelmia, meillä on ollut terävä sisältää. Viime aikoina meillä on ollut joitakin teräviä määrittelee vakioita. Joten käy ilmi, että ne asiat, jotka edessä on hash symboli tai ruutumerkki ovat esikäsittelijänä direktiivejä. Se on vain hieno tapa sanoa se koodiriviä, joka on todella muunnetaan jotain muuta ennen tietokone edes yrittää muuntaa ohjelma nollia ja ykkösiä. Esimerkiksi terävä sisältää standardin I / O. H, aika paljon vain tarkoittaa mennä eteenpäin, nappaa tiedostojen sisällöstä stdio.h ja liittää ne oikeassa. Joten ei nollia ja ykkösiä tässä vaiheessa vielä. Se on oikeastaan ​​vain vaihdon. Ja se on tehty aikana ns esikäsittely vaiheessa, kun todella ajaa kalahtaa tai erikseen Tee useimmissa tapauksissa. Kaikki tämä on tapahtunut Ensimmäinen automaattisesti toistaiseksi. Sitten tulee Kokoamisvaihe. Mutta olemme yksinkertaistettu kokoelma. Kääntäminen ohjelma todella tarkoittaa ota se jotain C, lähdekoodi olemme kirjallisesti, alas jotain kutsutaan kokoonpanoon. Assembly kieli on alemmalla tasolla kieli, joka onneksi emme ovat paljon tilaisuus kirjoittaa tällä lukukaudella. Mutta se on alimmalla tasolla mielessä, että voit kirjaimellisesti alkaa kirjoittaa lisätä ja vähentää ja lisääntykää ja lataa muistista ja tallentaa muistiin, hyvin yksinkertainen ohjeita tietokoneen, alla huppu, todella ymmärtää. Lopuksi, kokoaminen vie että kieli on nollia ja ykkösiä, että olemme olleet kuvaavat näin pitkälle. Ja todella lopuksi, siellä on niin sanottu yhdistää vaihe, jossa jaamme katso vain hetken, jossa yhdistyvät oman nollia ja ykkösiä nollilla ja niitä muita ihmisiä ennen olet luonut. Joten pitää tätä erittäin yksinkertainen ohjelma. Se oli viikko 1. Se vain sanoi, Hello World, ruudulla. Ajoimme tätä kautta kalahtaa. Tai me juoksimme sen läpi Make joka juoksi kalahtaa. Ja tulostetaan aikaan, jossa joitakin nollia ja ykkösiä. Mutta näyttää siltä, ​​siellä on välivaihe. Jos menen tänne - oho, ei haluavat nähdä hänet vielä. Jos menen tänne minun laite ja minä avata hello.c täällä on, että sama ohjelma. Ja mitä aion tehdä minun terminaalin ikkuna täällä aion ajaa kalahtaa sijaan Make, joka automatisoi kaikki neljä nämä toimenpiteet meille. Ja aion tehdä kalahtaa-S ja sitten hello.c ja kirjoita. Ja saan vilkkuu nopeasti jälleen, mikä on hyvä. Ja nyt hieman isompi ikkuna, Aion avata gedit täällä. Ja aion avata tiedosto, kääntyy pois, kutsutaan hello.s tämän sisältää että konekielellä Aiemmin viittasin. Ja tämä on mitä kutsutaan kokoonpano kieli, melko alhainen ohjeet, että Intel CPU tai mikä se on, että on sisällä ymmärtää. Ja mov on liikkeellä. puhelu on soittamalla, erittäin alhainen toiminto. sub on vähennä. Joten kun sinulla on tietty CPU sisällä tietokoneen, mikä tekee siitä erillisiä, verrattuna muihin suorittimia markkinoilla, on mitä ohjeita se ymmärtää ja usein kuinka tehokas se on, kuinka nopeasti se on suorittamalla joitakin näitä ohjeita. Nyt lisää tästä, voit ottaa Ensi syksynä CS61 Collegessa. Mutta tässä meillä on esimerkiksi muutama tunnisteet, jotka saattavat näyttää tutulta. hello.c on ohjelman nimi. . Teksti - siellä ei ole paljon mielenkiinnosta juuri nyt muistaa, että teksti segmentti, sillä maanantaina on missä muistia ohjelma todella päätyy. Niin, että ainakin hämärästi tuttuja siellä. Tässä on tietenkin mainita meidän päätehtävä. Vierittämällä, nämä viittaavat asiat sanottu rekisterit, hyvin pieni paloina muistin sisällä todellinen CPU. Ja jos minä selaa jopa edelleen, näen jonkinlaista epäsuora maininta ASCII. Ja siellä todellakin on, että merkkijono, Hei, pilkku, maailma. Niin pitkän tarinan lyhyesti, tämä on ollut tapahtuu sinulle, automaattisesti, alla huppu koko tämän ajan. Ja mitä on tapahtunut todella kerran olet joutunut kalahtaa, tai tapa Varmista, saat ensin alkaen lähdekoodia, ns konekielellä. Sitten kalahtaa on muuntaa tämä kokoonpano kielen alas nollia ja ykkösiä. Ja tämä on dian aloitimme keskustelumme viikolla 0. - ja sitten Viikko 1. Ja lopuksi, niitä nollia ja ykkösiä yhdistetään nollia ja ykkösiä Näistä kirjastoista olemme ottaneet itsestäänselvyytenä kuten Standard I / O tai String Library tai jopa CS50 kirjasto. Joten maalata tätä kuvaa lisää visuaalisesti, meillä on hello.c. Ja se tietenkin käyttää printf toimivat sanoa, hello world. Kokoamisvaihe vie alas että tiedosto me vain näki hello.s, vaikka vaikka se on yleensä poistettu automaattisesti. Mutta se assembly keskellä vaiheessa. Ja sitten kun me koota kokoonpano kieli, niin sanotusti, silloin olet saada nämä nollia ja ykkösiä. Joten olemme zoomataan tehokkaasti tänään mitä olemme itsestään selvänä, menemistä lähdekoodia vastustaa koodi. Mutta lopuksi, nyt sama kuva - nyt pistää sen yli vasemmalla puolella. Ja huomata, että alkuun on Mainitsin stdio.h. Se kuvaa, että olemme mukana lähes kaikissa ohjelmia olemme kirjoitettu. Ja se, jonka sisällön saada kopio liitetään, tehokkaasti huipulla koodi. Mutta näyttää siltä, ​​että tietokoneen järjestelmän jonnekin, siellä on oletettavasti stdio.c tiedosto, että joku kirjoitti vuotta sitten joka toteuttaa kaikki toimintoja, jotka on ilmoitettu vuonna stdio.h. Nyt todellisuudessa se luultavasti ole Mac-tai PC-tai jopa CS50 laite on raaka-C-koodia. Joku on jo kerätty sen ja mukana . O tiedosto kohdekoodina tai. tiedosto, joka viittaa jaettu kirjasto joka on ollut esiasennettuna ja valmiiksi koottu sinulle. Mutta oletetaan, että on todellakin olemassa meidän tietokone stdio.c rinnakkain kanssa kalahtaa. Koodi on laaditaan parhaillaan ja koottu. stdio.c n koodi on käännetty ja koottu, jotta tämä viimeinen vaiheeseen, tänne, meidän on jotenkin linkki, niin sanotusti oman nollia ja ykkösiä hänen tai hänen nollia ja ykkösiä yhdeksi yksinkertainen ohjelma, joka lopulta on kutsutaan vain Hei. Niin, että kaikki taika, joka on on tapahtunut tähän mennessä. Ja edelleen ottaa nämä prosessit itsestäänselvyytenä, mutta ymmärtää siellä on paljon mehukkaita yksityiskohtia takana tapahtuu siellä. Ja tämä on mitä tekee tietokone, jossa on Intel sisällä Erityisen selvä. Joten että huomata, jos haluat liittyä meihin lounasaikaan perjantaina, et mene tavallista paikka cs50.net/rsvp, 13:15 perjantaina. Ja nyt muutaman ilmoituksia. Joten meillä on hyviä uutisia. Ja meillä on huonoja uutisia. Aloita hyviä uutisia täällä. [Huokauksen] Selvä. No, se on teknisesti loma, niin se ei ole niin paljon lahja meiltä. Mutta sitten huonot uutiset tietenkin. [Huokauksen] Vietin paljon aikaa Näiden animaatioita. [Naurua] Tulee tarkistaa istuntoon tulevana maanantaina. Se tulee olemaan 17:30. Me muistuttaa sinua kaikki nämä tiedot toteutettiin sähköpostitse kurssin verkkosivuilla vain pari päivää aikaa. Se kuvattiin ja saatavilla pian sen jälkeen. Joten jos et voi tehdä, että maanantai yö paikka, älä huoli. Kohdat tulevalla viikolla myös keskittyä arvostelu tietokilpailu. Jos jakso on maanantaina, joka on todellakin yliopisto loma, me kohtaavat edelleen jaksossa. Jos et yksinkertaisesti voi tehdä, että osaa, koska olet menossa pois, se on hieno. Osallistu sunnuntaina tai tiistaina osan tai tune-in Jasonin osa, joka on saatavilla verkossa. Joten, lisää huonoja uutisia. Joten mukaan oppimäärän, meillä on luento ensi perjantaina. Mutta hyvä uutinen - selvästi, vietin liikaa aikaa tähän. [Naurua] Me peruuttaa ensi perjantain luentoja. Niin, että on lahja meille, joten voi todella olla mukava hengähdystauko välillä tällä viikolla ja kaksi viikkoa siten. Joten ei luentoja ensi viikolla, vain pieni pieni tietokilpailu, jonka pitäisi olla saada yhä innoissaan. Joten nyt kiinnitettävä huomiota jotain, joka on todellakin enemmän visuaalista ja jännittävä ja asettaa vaiheessa mitä tulee olemaan näköpiirissä vain pari viikkoa aikaa. Kun ensimmäinen tietokilpailu, me käännä keskittyä ongelmaamme sarjaa toiseen verkkotunnuksen erityinen ongelma, että tutkintaan tai turvallisuuden paranemiseen. Itse asiassa, perinne tämän ongelman sarja on minulle yksi opetus kaveri tai viranomaiset voisivat kävellä yli kampuksella ottaen joitakin valokuvia tunnistettavissa, mutta ei selvää ihmisiä, paikkoja tai asioita, niin joka vuosi I jotenkin onnistuvat vahingossa poistaa tai lahjoa digitaalisen median kortti että on sisällä meidän kamera. Mutta no big deal. Voin mennä eteenpäin ja kytke että minun tietokone. Voin tehdä rikosteknisen kuvan siitä, niin puhua, kopioimalla nollia ja niitä pois, että muistikortti, onko sen SD-kortti tai compact flash-kortti tai mitä olet perehtynyt. Ja sitten voimme käsi pois. Ja niin haaste, muun asioita sinulle, on kirjoittaa C-koodia, joka palauttaa koko joukko JPEG minulle ja paljasti tulee niitä ihmisiä, paikkoja tai asioita. Ja me myös puhua, tähän ongelmaan asettaa ja tulevina päivinä, noin grafiikka yleisemmin. Olemme käyttäneet niitä, tietenkin, varten puhkeaa. Mutta olet tavallaan itsestäänselvyys on olemassa näihin korkean tason käsitteitä suorakulmioita ja suorakaide. Mutta alla huppu on pikseliä. Ja sinulla on ollut aloittaa ajatella niitä. Tai et p-sarja 4 on ajateltava noin kuilu teidän tiilet, miten nopeasti olet pallo liikkuu eri puolilla näytön puhkeaa. Joten on tämä käsite pisteitä näytön, joka on kuvaan jo. Nyt, mitä näet, on kuitenkin mitä saat tietokoneen näytöllä. Jos olet koskaan katsonut joitakin hyviä tai huono TV, kertoimet ovat ne melko paljon kohdella yleisöä kuin technophobes jotka eivät oikeastaan tiedä paljoakaan computing. Ja niin se on erittäin helppo poliisi etsivä sanoa, voitte puhdistaa, että minun puolestani? Tai parantaa, eikö? Paranna on kuin muotisana eniten tahansa rikollisuuteen liittyvän show. Ja tosiasia on, jos otat hyvin epäselvä kuva epäilty tekee jotain pahaa, et voi vain parantaa sitä. Et voi zoomata loputtomiin. Et voi nähdä kimaltaa jonkun silmä, joka teki, että erityisesti rikollisuuden huolimatta esiintyvyys tämän televisiossa. Ja niin on, että nyt motivoida, että tuleva ongelma asetettu vilaus joitakin osoittaa, jolla voit saattaa olla tuttu. [VIDEOTOISTOSTA] -OK. Nyt, saada hyvä katsoa sinua. -Hetkinen. Suorita sen takaisin. -Hetkinen. Mene oikealle. -On. Jäätyä, että. -Koko näyttö. -OK. Jäätyä, että. -Kiristää, että jooko? -Vector kauppaa näillä kaveri jonka takapyörä. -Zoom in täällä tällä paikalla. -Kun oikeat välineet, imaged voi suurentaa ja teroitettu. -Mikä tuo on? -Se on tehostamisohjelma. -Voitko selvittää sen kaikki? -En tiedä. Katsotaanpa parantaa sitä. -Paranna osa-6. -Olen parantaa yksityiskohtia ja - -Mielestäni on tarpeeksi parantaa. Vapauta se minun näytöllä. -Paranna heijastus hänen silmässä. -Juostaan ​​tätä kautta kuvanmuokkausteknologia. -Edgar, voit parantaa tätä? -Hetkinen. -Olen työskennellyt tämän pohdintaa. -Joku heijastus. -Reflection. -On heijastus ja miehen kasvot. -Pohdintaa. -On pohdintaa. -Lähennä peiliin. -Näet pohdintaa. -Voitko parantaa kuvan täältä? -Voitko parantaa hänet täällä? -Voitko parantaa sitä? -Voitko parantaa sitä? -Voimmeko parantaa tätä? -Voitko parantaa sitä? -Hetkinen, minä parantaa. -Lähennä oveen. -X10. -Zoom. [Naurua] -Siirrä sisään -Odota, lopeta. -Lopeta. -Taukotilaan. -Kierrä 75 astetta ympäri pystysuora kiitos. [Naurua] -Lopeta, ja takaisin osa noin ovesta. -Got kuva tehostajana joka voi bittikartta? -Ehkä voimme käyttää Pradeep Senin menetelmä kurkistaa ikkunoita. -Tämä ohjelmisto on uusinta. -Kuvake arvo on pois päältä. -Kun oikea yhdistelmä algoritmeja. -Hän on vienyt valaistus algoritmeja seuraavalle tasolle ja voin käyttää niitä parantaa tämän valokuvan. -Lock-suuremmaksi z-akselin. -Paranna. -Paranna. -Paranna. -Aineita ja parantaa. [END VIDEOTOISTOSTA] DAVID J. MALAN: Eli ongelma Set 5 on mitä on edessä siellä. Joten me pian saada parempi käsitys siitä, milloin ja miksi voit ja meidän voi parantaa tällä tavoin. Mutta ensin Palatkaamme huomiomme joitakin rakennuspalikoita hyvitämme täytyy pystyä kertomaan, että tarina. Joten muistaa, että olemme tehneet tätä kuvaa Maanantai ja hieman viime viikolla. Ja tämä kuvaa ulkoasu asioita tietokoneen muistiin, kun joidenkin ohjelman. Tech segmentin ylös, muistaa, viittaa todellinen nollia ja ykkösiä jotka muodostavat ohjelman. Ei, alla, että jotkut alustettu tai alustamatonta, joka tyypillisesti viittaa asioita, kuten vakioita tai jouset tai globaaleja muuttujia, jotka ovat etukäteen ilmoitettu. On kasaan, mutta tulemme takaisin, että vähän. Ja sitten on pino. Aivan kuten pino lokerot kahvila, tämä on, jos muisti saa kerroksittain ja kerroksellinen aina et mitä ohjelmassa? Mikä on pino käytössä? Niin? Call of toimintoa. Aina kun soittaa toiminto, se on annetaan suikale muistin sen paikallisia muuttujia tai parametreja. Ja kuvallisesti, näemme, että jokaisen peräkkäisten toiminto nimeltään, kun puhelut B puhelut C puhelut D, ne saada kerroksellinen pinoon. Ja Kuhunkin viipaletta muisti on lähinnä ainutlaatuinen soveltamisala tätä toimintoa, joka tietenkin, on ongelmallista, jos haluatte antaa alkaen toiminnosta toiseen pala tietoja, joita haluat muuttua tai muuttaa. Joten mikä oli meidän ratkaisu mahdollistaa Toiminta edustaa yksi pino runko vaihtaa muistin sisällä toisen pinokehyksen? Miten nämä kaksi puhuvat toisilleen? Joten tapa osoittimia tai osoitteita, joka taas vain kuvata missä muistia, jonka tapa tietyn purra numero, erityisesti arvo voidaan löytää. Joten muistaa viimeisen kerran liian jatkoimme tarina ja katseli melko buginen ohjelma. Ja tämä ohjelma on buginen muutaman syistä, mutta kaikkein huolestuttavaa yksi on koska se ei tarkistaa, mitä? Joo, se ei tarkista tulo. Anteeksi? Jos se on yli 12 merkkiä. Niin kovin fiksusti, soitettaessa memcopy, joka, kuten nimestä voi päätellä, vain kopioita muisti sen toinen väite sen ensimmäiseen väitteeseen. Kolmas väite, erittäin fiksusti, on tarkistettava, että et kopioida useita, tässä tapauksessa pituus bar, merkkien, otetaan kohde, joka on tämä array C. Mutta ongelma on, että mitä jos C itsessään ei ole tarpeeksi suuri käsitellä sitä? Aiot kopioida määrä tavua, että olet saanut. Mutta mitä oikeastaan ​​on enemmän tavua kuin sinulla on varaa? No, tämä ohjelma erittäin tyhmästi vain sokeasti etenee ottaa mitä se on annettu, hei kenoviiva 0 on hienoa, jos merkkijono on lyhyt tarpeeksi, kuten viisi merkkiä. Mutta jos se on itse asiassa 12 merkkiä tai 1200 merkkiä, näimme viime kerralla että olet juuri menossa täysin korvata muistin ei kuulu sinulle. Ja pahimmassa tapauksessa, jos korvaat että punainen osa on, että soitimme palata osoite - tämä on vain, jos tietokoneessa automaattisesti, sinulle takana kohtauksia, tucks pois 32-bittinen, muistuttaa sitä, mitä osoite pitääkin palaa, kun foo, tämä toinen toiminto, tehdään täytäntöönpanosta. Se leipä murunen tapaisena johon se palaa. Jos korvaat, että mahdollisesti jos olet pahis, voi voi mahdollisesti ottaa jonkun tietokone. Ja tulet varmasti kaada useimmissa tapauksissa. Nyt tämä ongelma on vain pahentunut aloimme puhua muisti hallinta yleisemmin. Ja malloc, muistin jakamista, on toiminto, että voimme käyttää osoittamaan muistista, kun emme tiedä etukäteen että ehkä joitakin. Niinpä esimerkiksi, jos menen takaisin Laitteen tässä. Ja minä avautuvat viimeisen kerran hello2.c, muistaa tästä ohjelmasta, jossa tarkasteltiin vähän jotain tällaista, vain kolme riviä - nimenne, niin merkkijonon nimi vasemmalla, vastaa getString. Ja sitten me tulostaa sen, käyttäjän nimi. Joten tämä oli erittäin yksinkertainen ohjelma. Olla selkeä, anna minun mennä eteenpäin ja tehdä hei-2. Aion tehdä piste slash hei-2. Nimenne - David. Anna. Hei David. Se tuntuu toimivan OK. Mutta mitä todella tapahtuu alla huppu täällä? Katsotaanpa ensin kuori takaisin joitakin kerroksia. String on vain synonyymi olemme tajusi mitä? Char tähden. Joten tehkäämme se hieman mystistä mutta teknisesti oikein, että tämä on char tähden, mikä tarkoittaa, että nimi, kyllä, on muuttuva. Mutta millä nimellä myymälöitä on osoite char, joka tuntuu hieman oudolta koska Saan takaisin merkkijono. Saan takaisin useita merkkiä ei merkkiä. Mutta tietenkin, sinun tarvitsee vain ensimmäinen char osoitteen muistaa missä koko jono on koska miksi? Miten selvittää missä lopussa merkkijono on tietää alusta? Kenoviiva nolla. Joten nämä kaksi vihjeitä voit selvittää ennen alussa ja lopussa tahansa merkkijono ovat, kunhan ne ovat oikein muodostettu, että null terminaattori, että kenoviiva nolla. Mutta tämä vaatii getString. Ja käy ilmi, että getString Koko tämän ajan on ollut sellainen pettää meille. Se tehnyt tätä työtä, on varma, saada merkkijonon käyttäjä. Mutta jos tuo muisti on peräisin? Jos palaamme kuvan tänne ja sovelletaan määritelmä vain hetki sitten, että pino on, jos muisti menee, kun funktiot, tämän logiikan, kun soitat getString, ja sitten kirjoitan D-A-V-I-D Anna, joissa on D-A-V-I-D backslash nolla varastoidaan, joka perustuu Tarina olemme kertoneet meille pitkälle? Tuntuisi olevan pino, eikö? Kun soitat saat merkkijono saat pieni siivu muistia pinon. Joten on aivan selvää, että D-A-V-I-D kenoviiva nolla on tallennettu siellä pinossa. Mutta hetkinen, getString palaa merkkijonon, niin sanotusti, mikä tarkoittaa se lokero kahvila otetaan pinosta. Ja me sanoimme viimeisen kerran, että heti funktio palauttaa, ja otat että tarjotin, niin sanotusti, pinosta, mitä voit olettaa noin jäänteitä että muisti? Olen tavallaan redrew niitä kysymysmerkkejä koska ne tehokkaasti tullut tuntemattomia arvoja. Ne voidaan käyttää uudelleen, kun jotkut Seuraava toiminto on nimeltään. Toisin sanoen, jos tapahtuu voidaan tallentaa - Minä piirtää nopeasti kuva tässä pinon. Jos satumme piirustus pohjaan minun muistin segmentin, ja me sanomme , että tämä on paikka muistin käytössä tärkein ja ehkä arg c ja ARG v ja mitään muuta ohjelmaa, kun getString kutsutaan, oletettavasti getString saa kimpale muisti täällä. Ja sitten D-A-V-I-D jotenkin päätyy tätä toimintoa. Ja aion pelkistettyjen. Mutta oletetaan, että sen D-A-V-I-D backslash nolla. Joten näin monta tavua käytetään runko getString. Mutta heti kun getString palaa, me sanoi viime kerralla, että tämä muisti yli täällä kaikki muuttuu - woops! - kaikki tulee tehokkaasti poistetaan. Ja voimme ajatella tätä nyt kysymys markkaa, koska kuka tietää mitä tulossa on, että muisti. Itse olen usein soittaa toiminnot muut kuin getString. Ja heti kun kutsun joitakin muita toiminto kuin getString, ehkei kyseistä ohjelmaa me vain katsoi klo mutta jotkut muut, varmasti joitakin muita toiminto saattaa päätyä annetaan tämä seuraava paikalla pino. Joten se ei voi olla, että getString myymälöissä D-A-V-I-D pinoon, koska olisin heti menetät sen. Mutta me tiedämme, he getString palauttaa vain mitä? Se ei ole paluuta minulle kuusi merkkiä. Mikä on se todella palaamassa ollut voimme päätellä, viime kerralla? Osoite ensin. Joten jotenkin, kun soitit getString, se jaetaan kimpale muisti merkkijono, joka käyttäjien tyyppi ja palaavat sitten osoite sitä. Ja käy ilmi, että kun haluat toimiakseen varata muistia tässä tavalla ja palata henkilö, joka kutsui että toiminto, osoite että kimpale muisti, sinun ehdottomasti ei voi laittaa sen pinon pohja, koska toiminnallisesti se on vain menossa tule sinun hyvin nopeasti, joten voit arvata missä olemme todennäköisesti menossa nakata sitä sen sijaan, ns pino. Joten välillä pohjaan muistin ulkoasu ja yläosassa muistin ulkoasu ovat koko joukko segmenttejä. Yksi on pino, ja oikea sen yläpuolella on kasaan. Ja kasaan on vain erilainen kimpale muisti, että ei ole käytetty toiminnot kun niitä kutsutaan. Sitä käytetään pitkän aikavälin muistia, kun haluat yhden toiminnon napata joitakin muistia ja voi roikkua sitä menettämättä sen hallintaansa. Nyt voisit ehkä heti nähdä, että tämä ei ole välttämättä täydellinen suunnittelu. Koska ohjelma varattu muisti pino, tai soitat yhä enemmän toimintoja, tai kun jakaa muisti kasaan malloc pois niin getString tekee, mitä selvästi näyttää olevan väistämätön ongelma? Oikea. Kuten se, että nämä nuolet ovat toisiaan kohti ei lupaa hyvää. Ja todellakin, voisimme hyvin nopeasti kaatua ohjelma monin tavoin. Itse olen sitä mieltä, että voisi olla tehnyt tämän vahingossa kerran. Tai jos ei, tehdään se tarkoituksella nyt. Anna minun mennä eteenpäin ja kirjoittaa erittäin nopeasti ohjelma nimeltä dontdothis.c. Ja nyt minä menen tänne ja ei terävä kuuluu stdio.h. Katsotaan julistaa toiminnon foo vie Ei perusteluja, jotka on merkitään yhtä hyvin mitätön. Ja ainoa asia foo aikoo tehdä, on Puhelun foo, joka luultavasti ei ole älykkäin idea, mutta olkoon. Ent tärkein mitätön. Nyt ainoa asia, tärkein on menossa vain soittaa foo samoin. Ja ihan vain huvin vuoksi, aion mennä eteenpäin ja sanoa printf "Hei foo. " OK. Joten jos en tee virheitä, Tee dontdothis dot slash. Ja tehkäämme se isompi ikkuna - dot slash, dontdothis. Tule. Ohoh. Ilmeisesti, voit tehdä tämän. Hitto. OK. Odota. Valmiustila. Teimme - Emme käytä sitä tehdä. [Huokaa] En tiedä, mutta mielestäni poisti sen. Uh, joo. Hitto. Ratkaise tämä Rob. Mitä? Se on hyvin yksinkertainen. Joo, käännyimme optimointi päältä. OK, stand bye. Nyt tunnen paremmin. OK. Selvä. Joten kääntää tämän - Tee sinä dontdothis. Saatat joutua nimetä tämän dothis.c vain hetken. Siellä mennään. Kiitos. OK. Niin että olin tulostus jotain oli oikeastaan ​​vain hidastaa prosessia, jonka me olisi päässeet niin pitkälle. OK. Huh huh! Joten mitä todella tapahtuu? Syynä on, aivan kuten syrjään, on tee mitään panoksina ja lähtö on yleensä hitaampaa, koska olet täytyy kirjoittaa merkkiä näyttö, se on vierittää. Niin pitkän tarinan lyhyesti, olisin oikeastaan tapahtui niin kärsimätön, meillä olisi nähnyt tätä lopputulosta samoin. Nyt sain ratsastaa print-ups, näemme sen heti. Miksi tämä tapahtuu. No, yksinkertainen selitys, tietenkin, on, että foo luultavasti ei pitäisi vaativatkin itse. Nyt yleisesti, Tämä on rekursio. Ja ajattelimme pari viikkoa sitten rekursiivinen on hyvä. Rekursio on tämä maaginen tapa ilmaista itseäsi Super ytimekkäästi. Ja se vain toimii. Mutta on keskeinen osa kaikkien rekursiivinen ohjelmia olemme puhuneet noin ja katseli toistaiseksi, mikä oli, että heillä oli mitä? Base tapauksessa, joka oli noin kovakoodattu tapauksessa, että mainittu joissakin tilanteissa älä soita foo, mikä on selvästi ei ole tässä tapauksessa. Joten mitä todella tapahtuu kannalta tätä kuvaa? No, kun tärkeimmät kutsuu foo, se saa siivu muistia. Kun foo kutsuu foo, se saa siivu muistia. Kun foo kutsuu foo, se saa siivu. Se saa siivu. Se saa siivu. Koska foo ei koskaan palaa. Emme koskaan pyyhkiminen yksi niistä kehykset pinosta. Joten olemme puhaltaneet kasaan, ei mainita ties mitä muuta, ja olemme liian pitkälle rajoja meidän ns segmentti muistia. Virhe mennä segmentointi vääriä. Joten ratkaisu on selvästikään eivät tee tätä. Mutta isompi seuraus on, että kyllä, on ehdottomasti on joitakin rajoja, vaikka se ei ole hyvin määritelty, siitä, miten monia toimintoja voit soittaa ohjelma, kuinka monta kertaa toimintoa voi kutsua itseään. Vaikka siis saarnasivat rekursio koska tämä mahdollisesti maaginen asia pari viikkoa sitten, että sigma toiminto, ja kun saamme tiedot rakenteet ja CS50, näet muita sovelluksia, se ei ole välttämättä parasta. Koska jos funktio kutsuu itseään, kutsuu itseään, vaikka ei perusta tapauksessa, jos et osu, että perusversion 1.000 puhelut tai 10000 puhelut, joita Tuolloin olet ehkä lopu kesken teidän ns pino ja osuma Joissakin muissa segmenteissä muistia. Joten sekin on suunnittelu kompromissi Elegance ja välillä luotettavuutta sinun täytäntöönpanoa. Joten on toinen haittapuoli tai toinen gotcha mitä olemme tehnyt tähän mennessä. Kun pyysin getString - anna minun mennä takaisin hei-2. Huomaa, että soitan getString, joka on palaamassa osoite. Ja me väitämme tänään, että osoite on kasaan. Ja nyt olen tulostamalla string kyseisessä osoitteessa. Mutta emme ole koskaan kutsuttu vastakohta getString. Meillä ei ole koskaan ollut CALLL toimivat kuten ungetstring, jossa käsi takaisin että muisti. Mutta suoraan sanottuna emme todennäköisesti olisi pitänyt. Sillä jos pitää kysyä tietokoneen muistin, jonka tapa joku getString mutta koskaan anna sitä takaisin, varmasti sekin on väistämättä johtaa ongelmia jolloin me muisti loppuu. Ja itse asiassa, voimme etsiä näitä ongelmia uuden työkalun, jonka käyttö on hieman arvoituksellinen kirjoittaa. Mutta anna minun mennä eteenpäin ja kastele ylös ruudulle vain hetken. Aion mennä eteenpäin ja ajaa Valgrind parametrin, jonka ensimmäinen komento argumentti on nimi kyseisen ohjelman hei-2. Ja valitettavasti se on tuotos on atrociously monimutkainen ilman hyvää syytä. Näemme kaikki, että sotku. David on ilmoitettava nimeni. Niin, että ohjelman todella käynnissä. Ja nyt saamme tämän lähdön. Joten Valgrind on samanlainen hengeltään GDB. Se ei ole debuggeri sinänsä. Mutta se muisti nappula. Se on ohjelma, joka ajaa ohjelmoida ja kertoa, jos pyydetään tietokoneen muistiin ja koskaan ojensi sen takaisin, mikä tarkoittaa, että sinulla on muisti vuotaa. Ja muistivuotoja yleensä huono. Ja sinulle on tietokoneen käyttäjiä on luultavasti tuntenut, onko sinulla Mac tai PC. Oletko koskaan käyttänyt tietokonetta aikaa ja ei käynnistetä uudelleen useissa päivää, tai olet juuri saanut paljon ohjelmia käynnissä, ja hemmetin hidastuu pysähtynyt, tai ainakin se on erittäin ärsyttävää käyttää, koska kaiken juuri erittäin hidasta. Nyt, joka voi olla monia eri syitä. Se voisi olla loputon silmukka, vian jonkun koodin, tai yksinkertaisemmin, se voi tarkoittaa, että käytät enemmän muistiin tai yrittää, kuin tietokone oikeastaan ​​on. Ja ehkä siellä on bugi jotain ohjelmaa että Kyselen muistia. Selaimet vuosia olivat tunnettuja Tämän pyydä lisää ja enemmän muistia mutta ei koskaan sen palauttamista. Varmasti, jos sinulla on vain rajallinen muistin määrä, et voi kysyä äärettömän monta kertaa joitakin että muistia. Ja niin mitä näet täällä, vaikka jälleen Valgrind tuotannosta on tarpeettoman monimutkaisia ​​vilkaista Ensimmäinen, tämä on mielenkiintoinen osa. Heap - käytössä exit. Joten tässä miten paljon muistia on käytössä kasaan aikaa minun ohjelma lähtenyt - ilmeisesti kuusi tavua yhden korttelin. Joten aion heiluttaa käsiäni mitä lohko on. Ajattele se on vain pala, enemmän tekninen sana murikka. Mutta kuusi tavua - mikä on kuusi tavua, että olivat vielä käytössä? Täsmälleen. D-A-V-I-D kenoviivan nolla, viisi kirje nimi plus null terminaattori. Joten tämä ohjelma Valgrind huomasin kysyi kuusi tavua, ilmeisesti, jonka tapa getString, mutta ei koskaan antoi heille takaisin. Ja itse asiassa tämä ei välttämättä ole niin ilmeinen, jos ohjelma ei ole kolmea linjat, mutta se on 300 riviä. Jotta voimme todella antaa toinen komento argumentti on Valgrind ja tehdä siitä monisanainen. Se on vähän ärsyttävää muistaa. Mutta jos teen - Katsotaanpa. Vuotaa - Oliko se vuotaa - vaikka en muista mitä se on pois päältä käsin. - Vuoto-check yhtä täynnä. Jep, kiitos. - Vuoto-check yhtä täynnä. Anna. Sama ohjelma on käynnissä. Kirjoittaa David uudelleen. Nyt näen hieman tarkemmin. Mutta alle kasan yhteenveto, joka on sama kuin neljä - ah, Tämä on tavallaan mukavaa. Nyt Valgrind on todella etsivät hieman vaikeampi minun koodi. Ja se sanoo että, ilmeisesti, malloc linjalla - me loitontaa. Rivillä - emme näe mitä linjaa se on. Mutta malloc on ensimmäinen syyllinen. On blogin malloc. Kaikki hyvin? OK, no. Oikea? Soitin getString. getString ilmeisesti puhelut malloc. Joten mitä rivi koodia on ilmeisesti syypää ottaa kohdennetaan tämä muisti? Oletetaan, että kuka kirjoitti malloc on ollut noin niin kauan, että se on ei ole heidän vikansa. Joten se on luultavasti minun. getString in cs50.c - niin se jonnekin tietokoneen - linjassa 286 näyttää olevan syyllinen. Nyt oletetaan, että CS50 on ollut noin kohtuullisen määrän aikaa, joten mekin olemme erehtymättömiä. Ja niin se on luultavasti ole getString että vika piilee, vaan pikemminkin hei-2.c linjan 18. Joten katsomaan mitä se linja 18 oli. Oh. Jotenkin tämä linja ei ole välttämättä viallisista, sinänsä, mutta se on syy takana muistivuoto. Joten Super yksinkertaisesti, mitä olisi intuitiivisesti olla ratkaisu tähän? Jos kysymme muisti, ei koskaan antaa sen takaisin, ja se näyttää olevan ongelma, koska ajan myötä minun tietokone saattaa muisti loppuu, saattaa hidastaa alas, pahoja asioita voi tapahtua, hyvin, mitä yksinkertainen intuitiivinen ratkaisu? Anna se takaisin. Miten vapauttaa että muistia? No, onneksi se on melko yksinkertainen vain sanoa ilmaiseksi nimi. Ja me emme ole koskaan tehnyt tätä ennen. Mutta voit olennaisesti ajatella vapaa kuin vastakohta malloc. vapaa on vastakohta muistin allokointi. Joten nyt haluan kääntää tämän. Tee hei-2. Saanen käyttää sitä uudelleen. hei-2 David. Näyttää siis siltä työskennellä täsmälleen samalla tavalla. Mutta jos menen takaisin Valgrind ja uusinnassa että sama komento minun vastikään koonnut ohjelman, kirjoittamalla minun nimi kuin ennen - kiva. Heap yhteenveto - käytössä exit - nolla tavua nolla lohkot. Ja tämä on erittäin mukava, kaikki pino lohkot vapautettiin. Ei vuotoja ovat mahdollisia. Joten tulossa, eikä Harjoitus 4, mutta Harjoitus 5, tutkintaan ja eteenpäin, tämäkin tulee mitta oikeellisuudesta oman ohjelma, onko sinulla tai ei ole muistivuotoja. Mutta onneksi ei vain voi järkeillä niiden kautta intuitiivisesti, joka on, luultavasti, helppo pieniä ohjelmia mutta vaikeampaa suurempien ohjelmien osalta Valgrind, niille suurempia ohjelmia, voi auttaa tunnistamaan erityinen ongelma. Mutta on toinenkin ongelma jotka voivat syntyä. Saanen avata tämän tiedoston täällä, joka on, jälleen, hieman yksinkertainen esimerkki. Mutta katsotaanpa keskittyä siihen, mitä tämä ohjelma ei. Tätä kutsutaan memory.c. Lähetämme tämän myöhemmin tänään zip nykypäivän lähdekoodia. Ja huomaa, että minulla on toiminto nimeltään f, jossa ei argumentteja ja palauttaa mitään. Linjassa 20, olen ilmeisesti julistamisesta osoitin int ja sen hakeminen x. Olen osoitetaan on paluu arvo malloc. Ja vain olla selvää, kuinka monta tavua am Olen luultavasti tulossa takaisin malloc tässä tilanteessa? Luultavasti 40. Mistä saat että vuodesta? No, jos muistatte, että int on usein 4 tavua, ainakin se on laite, 10 kertaa 4 on ilmeisesti 40. Joten malloc on palaamassa osoite kimpale muisti ja varastointia että käsitellä lopulta x. Joten on selvää, mitä sitten tapahtuu? No, anna minun vaihtaa takaisin meidän kuva täällä. Saanen ei vain vetää pohjaan minun tietokoneen muistiin, anna minun mennä eteenpäin ja piirtää koko suorakulmion edustaa kaikkia minun RAM. Me sanomme, että pinon on pohjassa. Ja siellä on teksti segmentin alustamatonta. Mutta olen juuri menossa abstrakti niitä muita asioita pois kuin piste, piste piste. Olen juuri menossa viitata tähän kuin kasan huipulla. Ja sitten alaosassa tämän kuvan, edustamaan tärkein, aion antaa se viipaleiksi muisti pinoon. F, aion antaa sille siivu muistia pinoon. Nyt sain kuulla minun lähdekoodi uudelleen. Mitkä ovat paikallisia muuttujia tärkein? Ilmeisesti mitään, niin että viipale on tehokkaasti tyhjä tai ei edes niin suuri koska olen laatinut sen. Mutta f, minulla on paikallinen muuttuja, jota kutsutaan x. Joten aion mennä eteenpäin ja antaa f kimpale muisti, kutsuen sitä x. Ja nyt malloc 10 kertaa 4, Joten malloc 40, jossa tuo muisti tulee? Olemme ole piirretty kuva näin ennen. Mutta Oletetaan, että se on tehokkaasti tulevat tänne, niin yksi, kaksi, kolme, neljä, viisi. Ja nyt minä tarvitsen 40 näistä. Joten minä vain tehdä piste, piste, piste ehdottaa että on vielä enemmän muistia palaamassa kasaan. Nyt mitä osoite? Valitaan meidän mielivaltainen käsitellä kuten aina - Ox123, vaikka se on luultavasti olla jotain aivan muuta. Se osoitteen ensimmäisen tavun muistin, että olen pyytänyt malloc varten. Joten lyhyt, kun linja 20 suorittaa, mikä on kirjaimellisesti tallennettu x täällä? Ox123. Ox123. Ja Ox on mielenkiinnoton. Se vain tarkoittaa tässä heksadesimaalinumero. Mutta mitä Tärkeintä on, että mitä olen myymälä ja x, joka on paikallinen muuttuja. Mutta sen tietotyyppi jälleen on osoite int. No, aion tallentaa Ox123. Mutta jälleen kerran, jos se on hieman liian monimutkainen tarpeettomasti, jos en selaa takaisin, voimme abstrakti tätä pois melko kohtuullisesti ja vain sanoa, että x on osoitin, että murikka muistia. OK. Nyt kysymys käsillä on seuraava - linja 21, se kääntyy pois, on buginen. Miksi? Anteeksi? Se ei ole - sanoa, että jälleen kerran. No, se ei ole ilmainen. Niin, että toinen vaan. Joten on olemassa yksi muu vaan nimenomaan rivillä 21. Täsmälleen. Tämä yksinkertainen riviä koodia on vain puskurin ylivuoto, puskurin ylivuoto. Puskuri tarkoittaa vain kimpale muisti. Mutta kimpale muisti on kooltaan 10, 10, kokonaisluvut, mikä tarkoittaa, että jos me indeksinä se käyttäen syntaktinen sokeri array notaatio, neliö suluissa, sinulla on mahdollisuus saada x teline 0 x teline 1 x, kiinnike piste, piste, piste. x kiinnike 9 on suurin yksi. Joten jos teen x kiinnike 10, jossa Olen oikeastaan ​​menossa muistia? No, jos minulla on 10 int - nyt todella tasapelin Näiden täällä. Tämä oli siis ensimmäinen viisi. Tässä viisi muuta ints. Joten x teline 0 on täällä. x kiinnike 1 on tässä. x kiinnike 9 on täällä. x kiinnike 10 on täällä, mikä tarkoittaa, kerron, Kohtaan 21 tietokoneen laittaa numero missä? Numero 0, jos? No, se on 0, kyllä. Mutta juuri se, että sen 0 on eräänlainen sattuma. Se voisi olla useita 50, kaikki me välitämme. Mutta yritämme laittaa se x kiinnike 10, joka on, jos tämä kysymysmerkki on laadittu, joka ei ole hyvä asia. Tämä ohjelma saattaa hyvinkin kaatua seurauksena. Nyt mennään eteenpäin ja nähdä, jos tämä on, todellakin, mitä tapahtuu. Tee muistiin, koska tiedosto kutsutaan memory.c. Mennään eteenpäin ja ajaa ohjelman muistiin. Joten meillä oli onnea, todella, miltä se näyttää. Meillä kävi tuuri. Mutta katsotaanpa nyt ajaa Valgrind. Ensi silmäyksellä, minun ohjelma saattaa näyttävät olevan täysin oikeassa. Mutta haluan ajaa Valgrind kanssa - Vuoto-check vastaa kokonaisuudessaan muistiin. Ja nyt kun käytän tätä - mielenkiintoinen. Virheellinen kirjoittaa kooltaan 4: line 21 memory.c. Line 21 memory.c on kumpi? Oh, mielenkiintoinen. Mutta hetkinen. Koko 4, mitä se viittaa? Tein vain yhden kirjoittaa, mutta se on kooltaan 4. Miksi se on 4? Se on koska se on int, joka on jälleen neljä tavua. Joten Valgrind löytyi vika, joka olen, vilkaisi minun koodi, ei. Ja ehkä sinun TF piti tai ei. Mikä Mutta Valgrind varmasti todennut, että olemme tehneet virheen siellä, vaikka vaikka meillä oli onnea, ja tietokone päätti, eh, en aio kaatua vain siksi, kosketti yhden tavun, yksi int verran muistia, jota et ole itse omista. No, mitä muuta on buginen täällä. Osoite - tämä on hullu näköinen osoite heksadesimaali. Se tarkoittaa vain sitä jossain keko nolla tavua jälkeen lohkon koko 40 on kohdistettu. Saanen loitontaa tänne ja katso jos Tämä on hieman enemmän hyötyä. Mielenkiintoista. 40 tavua menettänyt lopullisesti menetys ennätys 1 1. Jälleen enemmän sanoja kuin on hyödyksi. Mutta perustuu korostettu linjat, jos minun pitäisi varmaan keskityn huomiota vielä bugi? Näyttää linjan 20 memory.c. Joten jos menemme takaisin linja 20, joka on joka ymmärsitte. Ja se ei ole välttämättä buginen. Mutta meillä on tämä perui vaikutuksia. Joten miten voin korjata ainakin yksi niistä virheistä? Mitä voisin tehdä, kun linja 21? Voisin tehdä ilmaiseksi x, niin on antaa takaisin, että muisti. Ja miten korjata tämä virhe? Haluan ehdottomasti mennä ole kauempana kuin 0. Joten anna minun yrittää uudelleen suorittaa tämän. Anteeksi, ehdottomasti mennä ole kauempana kuin 9. Tee muistiin. Saanen uusintana Valgrind isossa ikkunassa. Ja nyt näyttää. Nice. Kaikki kasaan korttelin vapautettiin. Ei vuotoja ovat mahdollisia. Ja ylhäällä täällä, ei ole mitään mainintaa enempää kelpaa oikealle. Vain saada ahne, ja katsotaanpa onko jokin toinen esittelyn ei mene niin tarkoitettu - En onnekas hetki sitten. Ja se, että tämä on 0 on ehkä tarpeettomasti harhaanjohtava. Haluan vain tehdä 50, melko sattumanvaraisesti lukumäärä, merkki muisti dot slash muisti - silti onnekas. Mitään ei kaatuu. Taitaa vain tehdä jotain todella typerää, enkä 100. Saanen remake muistia, dot slash muisti - onnisti jälleen. Entä 1000? ints jälkeen suurin piirtein missä minun pitäisi olla? Tee muisti - hitto vieköön. [Naurua] OK. Älkäämme pelleillä enää. Uusintana muistiin. Siellä mennään. Selvä. Ilmeisesti sinulla indeksi 100000 ints pidemmälle kuin mihin olet olisi pitänyt muisti, pahoja asioita tapahtuu. Joten tämä ei tietenkään ole kova, nopea sääntö. Minulla oli sellainen käyttäen oikeudenkäyntiä ja virhe sinne. Mutta tämä johtuu siitä, pitkän tarinan lyhyesti, tietokoneen muistiin on myös jaettu näitä asioita kutsutaan segmenteillä. Ja joskus, tietokone todella on antanut sinulle hieman enemmän muistia kuin pyydät. Mutta tehokkuutta, se on vain helpompi saada lisää muistia, mutta vain kertoa että saat osan siitä. Ja jos olet onnekas joskus, siksi ehkä voi koskettaa muisti, joka ei kuulu sinulle. Sinulla ei ole takeita siitä, että mitä arvoa laitat siellä pysyy siellä, koska tietokone edelleen sitä mieltä, se ei ole sinun, mutta se ei välttämättä mene lyödä toisen segmentin muistin tietokoneen ja aiheuttaa virheellä tämä täällä. Selvä. Kaikki kysymykset sitten muisti? Selvä. Katsotaanpa katsomaan täältä, niin kello jotain olemme saaneet varten myönnetty jo jonkin aikaa, mikä on tässä tiedosto nimeltä cs50.h. Joten tämä on tiedosto. Nämä ovat vain koko joukko Huomautusten ylös. Ja olet ehkä pohtinut tätä, jos olet pisti ympäriinsä laitteen. Mutta käy ilmi, että koko ajan, kun meillä oli tapana käyttää merkkijonon synonyymi, keinoja, joilla voimme julistaa että synonyymi oli tämän Hakusanalla typedef, tyyppi määritelmä. Ja me lähinnä sanomalla, tehdä merkkijono synonyymi char tähden. , Että keinoja, joilla pino luoneet nämä apupyörät tunnetaan merkkijono. Nyt täällä on vain prototyyppi varten getchar. Olemme ehkä nähnyt sitä ennen, mutta se on todellakin mitä se tekee. getchar ei ota argumentteja, palauttaa char. getdouble ei ota argumentteja, palauttaa kaksinkertainen. getfloat vie argumentteja ei palaa kellua, ja niin edelleen. getint on täällä. getlonglong on täällä. Ja getString on täällä. Ja siinä se. Tämä violetti linja on toinen esikäsittelijään koska sillä hashtag alussa sen. Selvä. Joten nyt haluan mennä cs50.c. Ja emme puhu liian pitkään tätä. Mutta antaa sinulle Hanko mitä jatkunut koko tämän aikaa, anna minun mennä - Tehdään getchar. Joten getchar on enimmäkseen kommentteja. Mutta se näyttää tältä. Joten tämä on todellinen funktio getchar että olemme itsestään selvänä olemassa. Ja vaikka emme ole käyttää tätä että usein, jos koskaan, se on ainakin suhteellisen yksinkertainen. Joten se kannattaa ottaa vilkaista täällä. Joten getchar on loputon silmukka, tarkoituksella niin ilmeisesti. Se kutsuu sitten - ja tämä on tavallaan kiva uudelleenkäyttö koodi me itse kirjoitti. Se kehottaa getString. Koska mitä se tarkoittaa saada char? No, saatat myös yrittää saada koko linjan tekstin käyttäjän ja sitten katsokaa yksi näistä merkeistä. Linjassa 60, täällä on vähän vähän järki tarkistaa. Jos getString palasi null, älkäämme edetä. Jokin meni pieleen. Nyt tämä on hieman ärsyttävää, mutta tavanomaista C. char max luultavasti edustaa mitä vain perustuu nimensä? Se on jatkuvaa. Se on kuin numeerinen arvo Suurin char voit edustavat kanssa yksi purema, joka on luultavasti numero 255, joka on suurin numero edustaa kahdeksan bittiä, nollasta alkaen. Joten olen käyttää tätä, on tämä toiminto, kun Kirjoitan tätä koodia, vain siksi, jos jokin menee pieleen getchar mutta sen tarkoitus elämässä on palauttaa char, sinun täytyy jotenkin pystyä viestittää käyttäjälle, että jokin meni pieleen. Emme voi palata null. On käynyt ilmi, että null on osoitin. Ja vielä, getchar on palata merkkiä. Joten yleissopimuksen, jos jokin menee väärin, on sinun, ohjelmoija, tai Tässä tapauksessa minua kirjastossa, minulla oli vain päättää mielivaltaisesti, jos jokin menee pieleen, aion palata numero 255, joka on todella tarkoittaa, ettemme voi, käyttäjä voi kirjoittaa merkki edustaa numero 255, koska meillä oli varastaa sen kuten ns Sentinel arvo ovat ongelma. Nyt on käynyt ilmi, että merkki 255 ei ole jotain, voit kirjoittaa siitä näppäimistön, joten se ei ole iso juttu. Käyttäjä ei huomaa, että Olen varastanut tämän merkin. Mutta jos joskus nähdä miehen sivut tietokonejärjestelmä joitakin viittauksia kaikki korkit jatkuvasti näin, että sanoo, tapauksissa virhe tämä jatkuva voimin palautetaan, että kaikki joidenkin ihmisen teki vuotta sitten oli mielivaltaisesti päätettiin Palauta tämä erityinen arvo ja kutsuvat sitä jatkuvasti, jos jotain menee pieleen. Nyt taika tapahtuu täällä. Ensinnäkin, olen julistaa linjassa 67 kaksi merkkiä, C1 ja C2. Ja sitten linja 68, siellä on todella koodiriviä, että tuo mieleen ystävämme printf, koska se ei ole prosenttia Cs lainausmerkkeihin. Mutta huomaa, mitä täällä tapahtuu. sscanf tarkoittaa string scan - tarkoittaa skannata alustettu string, ergo sscanf. Mitä se tarkoittaa? Se tarkoittaa ohitat sscanf merkkijono. Ja linja on mitä käyttäjätyyppeihin sisään Ohitat sscanf muotomerkkijonoa kuten Tämän joka kertoo scanf mitä Oletko toivoen käyttäjä on kirjoittanut sisään Sitten siirtää-osoitteissa kahden paloina muistia, tässä tapauksessa koska minulla on kaksi paikkamerkeillä. Joten aion antaa sille osoite C1 ja osoite C2. Ja muistaa, että annat toiminto osoite joitakin muuttuja, mitä implisiittisesti? Mitä että toiminto tehdä seurauksena antaa sen osoitteen muuttuja, toisin kuin muuttuja itse? Se voi muuttaa sitä, eikö? Jos sinulla oli joku karttaa fyysistä osoite, he voivat mennä sinne ja tehdä mitä he haluavat kyseisessä osoitteessa. Sama ajatus täällä. Jos me siirtyy sscanf, osoite kahden paloina muistia, jopa näitä pieniä pikku paloina muistia, C1 ja C2, mutta kerromme sen osoitteen niistä, sscanf voi muuttaa sitä. Joten sscanf n tarkoitus elämässä, jos luemme man-sivulta, on lukea, mitä käyttäjän kirjoitettu, toivoa, että käyttäjän kirjoitetaan merkki ja ehkä toinen hahmo, ja mitä käyttäjä kirjoitetaan, ensimmäinen merkki menee täällä, toinen merkki menee täällä. Nyt, kuten syrjään, tämä, ja te vain tiedä tätä tulleella dokumentaatio, että laitoin tyhjän siellä tarkoittaa vain sitä, että en välitä, jos käyttäjä painaa välilyöntiä muutaman kertaa ennen kuin hän tekee merkki, aion sivuuttaa kaikki valkoinen tila. Niin, että tiedän asiakirjat. Se, että on olemassa toinen% c jälkeen valkoinen tila on todella tahallinen. Haluan pystyä havaitsemaan, jos käyttäjä mokasi tai eivät toimineet yhteistyössä. Minä toivon, että käyttäjä vain kirjoittaa yhden merkin, joten toivon että sscanf vain aio palata arvo 1, koska, jälleen, jos luen asiakirjat, sscanf n tarkoitus elämä on palata määrä muuttujat, jotka olivat täynnä jossa käyttäjä syöttää. Kuljin kahden muuttujan osoitteet, C1 ja C2. Toivon kuitenkin, että vain yksi ne kuolee, koska jos sscanf palaa 2, mikä oletettavasti implisiittisesti loogisesti? Että käyttäjä ei anna minulle yksi merkki kuten sanoin hänelle. He luultavasti kirjoitetun vähintään kaksi merkkiä. Joten jos en sen sijaan ei ollut toista % C, sain juuri yhden, joka suoraan sanottuna olisi selkeämpi lähestymistapa, mielestäni ensi silmäyksellä, et aio pystyä havaitsemaan jos käyttäjä on antaa sinulle enemmän tulo kuin todellisuudessa halusi. Joten tämä on implisiittinen muoto Virheen tarkistus. Mutta huomaa, mitä teen täällä. Kun olen varma, että käyttäjä antoi minulle yhden luonne, olen vapaa linja, tekee vastakohta getString, joka puolestaan käyttää malloc, ja sitten palaan C1-merkki, että toivoin Käyttäjä jos ja vain jos. Niin nopeasti vilahti vain, mutta kysyttävää getchar? Tulemme taas joidenkin toisten. No, anna minun mennä eteenpäin ja tehdä tämän - Oletetaan nyt, vain motivoida keskustelua viikossa plus aika, tämä on tiedosto nimeltä structs.h. Ja vielä, tämä on vain maku jotain, joka on edessämme. Mutta huomaa, että paljon Tämän on kommentteja. Joten haluan korostaa vain Mielenkiintoisin osa nyt. typedef - siellä on, että sama avainsana uudelleen. typedef käytämme julistaa merkkijono erityisenä tietotyyppi. Voit käyttää typedef luoda uusi tietotyypit, että ei ollut olemassa C keksittiin. Esimerkiksi int mukana C. char mukana C. kaksinkertainen mukana C. Mutta ei ole mitään käsitettä opiskelija. Ja silti se olisi aika hyvä olla osaa kirjoittaa ohjelma, joka tallentaa muuttujaan, opiskelijan henkilötunnus, nimensä, ja heidän talonsa. Toisin sanoen, kolme kappaletta tietojen, kuten int ja merkkijono ja toinen merkkijono. Kanssa typedef, mikä on melko voimakas tästä ja avainsanan sturct varten rakenne, sinä, ohjelmoija vuonna 2013, voi itse määritellä omat tietotyypit, että ei ollut olemassa vuoden sitten, mutta jotka sopivat tarkoitukseen. Ja niin täällä, linjat 13 kautta 19, olemme julistaa uuden tietotyypin, kuten int, mutta kutsuen sitä opiskelija. Ja sisällä tämä muuttuja on menossa on kolme asiaa - int, string, ja merkkijono. Joten voit ajatella mitä todella täällä on tapahtunut, vaikka tämä on hieman yksinkertaistaa tänään, Opiskelijan on lähinnä menossa näyttää tältä. Se tulee olemaan kimpale muistia tunnus, nimi alalla, ja talon kenttään. Ja pystymme käyttämään niitä paloina muistiin ja käyttää niitä seuraavasti. Jos menen struct0.c, tässä suhteellisen pitkä, mutta sen jälkeen kuvio, koodia, joka käyttää tätä uutta temppua. Joten ensin haluan kiinnittää huomiota on mielenkiintoinen osat ylös. Sharp määrittelee opiskelijat 3, vakuuttaa jatkuva kutsutaan opiskelijat ja antaa se mielivaltaisesti numero 3, vain joten minulla on kolme oppilaat käyttävät tämä ohjelma nyt. Täältä tulee Main. Ja huomaa, miten julistaa joukko opiskelijoita? No, minä vain käyttää samaa syntaksia. Sana opiskelija on tietenkin uusi. Mutta opiskelija, luokka, kiinnike opiskelijoita. Joten valitettavasti siellä on paljon käytetään uudelleen täältä. Tämä on pelkkä numero. Joten tämä on kuin sanoisi kolme. Luokka on juuri sitä mitä haluan soittaa muuttuja. Voisin kutsua sitä opiskelijoita. Mutta luokka, tämä ei ole luokan olio Java sellainen tapa. Se on vain opiskelijaryhmiä. Ja tietotyyppi jokaisen elementin että matriisi on opiskelija. Joten tämä on hieman erilainen ja sanoo jotain näin, se on vain - Sanon antaa minulle kolme opiskelijaa ja soittaa siihen array luokka. Selvä. Nyt täällä on neljä silmukka. Tämä kaveri on tuttu - iterate nollasta jopa kolmella. Ja tässä uusi pala syntaksin. Ohjelma tulee kysymään minua, ihmisen, antaa sille opiskelija ID, joka on int. Ja tässä syntaksin, jolla voit tallentaa jotain ID kenttä Sijainti luokan kiinnike I. Joten Tämä syntaksi ei ole uusi. Tämä tarkoittaa vain sitä, anna minulle kahdeksas opiskelija luokassa. Mutta tämä symboli on uusi. Tähän asti olemme voi käyttää piste, ainakin koodia tässä. Tämä tarkoittaa mennä struct tunnetaan opiskelija ja laittaa jotain siellä. Samoin tässä seuraavalle riville 31, mene eteenpäin ja laittaa mitä käyttäjä kirjoittaa nimityksen täällä ja mitä he tekevät talo, sama asia, mennä eteenpäin ja laita se. talossa. Joten mitä tämä ohjelma lopulta tehdä? Näet pieni teaser siellä. Anna minun mennä eteenpäin ja tekevät structs 0 dot slash struct 0, opiskelijan ID 1, sanovat David Mather, opiskelijakortti 2. Rob Kirkland, opiskelijakortti 3. Lauren Leverit - ja ainoa asia, että tämä ohjelma, joka on aivan täysin mielivaltaista, on Halusin tehdä jotain tämän tiedon, nyt kun olen opettanut meille, miten käyttää structs, on juuri ollut tämä ylimääräinen silmukka täällä. Olen kerrata yli joukko opiskelijoita. Käytin meidän, ehkä nyt tuttu ystävä, string vertailla, stircomp on tarkastus on 8th opiskelijan talo yhtä Mather? Ja jos on, vain tulostaa jotain mielivaltaisesti kuten, kyllä, se on. Mutta jälleen kerran, vain antaa minulle mahdollisuuksia käyttö ja uudelleenkäyttö ja uudelleen tämän uuden piste merkintätapa. Joten mitä väliä, eikö? Keksiä opiskelija-ohjelma on jossain määrin mielivaltainen, mutta käy ilmi, että voimme tehdä hyödyllisiä asioita Tämän, esimerkiksi seuraavasti. Tämä on paljon monimutkaisempi struct in C. Se sai tusinan tai enemmän, hieman arvoituksellisesti nimetty. Mutta jos olet koskaan kuullut grafiikka tiedostomuoto nimeltä bittikartta, BMP, se Osoittautuu, että bitmap tiedostomuoto melko paljon näyttää, että tämä. Se on typerä pikku Hymiö. Se on pieni kuva, että olen zoomataan on aika iso, jotta voisin nähdä jokaisen yksittäisten pisteiden tai pikseliä. Nyt on käynyt ilmi voimme edustaa musta piste, jossa vaikkapa numero 0. Ja valkoinen piste, jossa numero 1. Eli toisin sanoen, jos haluat piirtää Hymiö ja pelastamiseksi kuva tietokone, riittää tallentaa nollia ja ne, jotka näyttävät tältä, missä, uudelleen, ne ovat valkoisia ja nollat ​​ovat mustat. Ja yhdessä, jos tehokkaasti on vyötä ykkösiä ja nollia, olet verkkoon pikseliä, ja jos antaa ne pois, olet söpö pikku Hymiö. Nyt bitmap tiedostomuoto, BMP, on tehokkaasti, että alla huppu, mutta enemmän pikseleitä sot, että voi todella edustaa värejä. Mutta kun sinulla on enemmän kehittyneempiä tiedostomuotoja, kuten BMP ja JPEG-ja GIF joiden kanssa saatat tuntea ne, tiedostoja levylle tyypillisesti paitsi ovat nollia ja ykkösiä varten pikseliä, mutta heillä on joitakin metatietoja sekä - meta siinä mielessä, että ei ole oikeastaan tietoja, mutta se on hyvä olla. Joten nämä kentät tässä on mikä, ja näemme tämän tarkemmin P-sarja 5, että ennen nollia ja ykkösiä, jotka edustaa kuvan kuvapisteiden, siellä on joukko metatietoja, kuten kuvan kokoa ja kuvan leveys. Ja huomaa olen nyppiminen pois joitakin mielivaltaisia ​​asioita täällä - leveys ja korkeus. Bittilukemaan ja joitakin muita asioita. Joten on joitakin metatiedot tiedostoon. Mutta ymmärtämällä miten tiedostot asetetut pois tällä tavalla, voit itse sitten käsitellä kuvia, palauttaa kuvia levyltä, muuttaa kuvien kokoa. Mutta et voi välttämättä parantaa niitä. Tarvitsin valokuva. Menin takaisin RJ täällä, jotka näit ruudulla jo jonkin aikaa sitten. Ja jos minä avata Keynote täällä, tämä on mitä tapahtuu, jos yrität suurentaa ja parantaa RJ. Hän ei saa mitään parempaa todella. Nyt Keynote on sellainen hämärtää sitä vähän, vain kaunistella että RJ ei saa erityisen tehostetun kun zoomata sisään Ja jos teet sen tällä tavalla, katso neliöt? Joo, voit varmasti nähdä ruudut projektori. Se mitä saat, kun parantaa. Mutta ymmärtää, miten meidän RJ tai Hymiö on toteutettu antaa meille itse kirjoittaa koodia, joka manipuloi näitä asioita. Ja ajattelin lopetan, jossa 55 sekuntia parantaa se, Uskallan sanoa melko harhaanjohtava. [VIDEOTOISTOSTA] -Hän valehtelee. Mitä, en tiedä. -Mitä me tiedämme? -Että 9:15 Ray Santoya oli ATM. -Joten kysymys on, mitä hän oli tekemässä 09:16? -Ammunta yhdeksän millimetrin jotain. Ehkä hän näki ampuja. -Tai oli työskennellä hänen kanssaan. -Odota. Mene takaisin yhteen. -Mitä sinä näet? -Tuo hänen ylöspäin, koko näytön. -Hänen lasit. -On pohdintaa. -Se Neuvitas baseball-joukkue. Se on heidän logo. -Ja hän puhuu kuka on yllään että takki. [END VIDEOTOISTOSTA] DAVID J. MALAN: Tämä tulee olla Harjoitus 5. Tapaamme ensi viikolla. MALE SPEAKER: Seuraavassa CS50. [Sirkat sirkutusta] [Musiikki soi]