>> [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ä?
>> -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.
>> -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.
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.
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]