>> [Tónlist spila]
>> DAVID J. Malan: Allt í lagi.
>> [Hlátur]
>> Velkominn aftur.
Þetta er CS50.
Og þetta í lok viku fimm.
Og allt þar til nú, við höfum nánast verið að taka sem sjálfsögðum hlut að það
til þessa þýðanda, Clang, sem þú hefur verið skírskota með því þetta
önnur tól sem heitir Gerðu það einhvern veginn dularfullur breytir kóðann þinn
inn kóðann mótmæla, núll og sjálfur að tölvur CPU, Mið
vinnslu eining, reyndar skilur.
En það kemur í ljós að það er tala sem er fara á undir hetta í
milli inntak og úttak.
>> Og mig langar til að leggja til að við hold sem út í smá nánar í
þessum fjórum skrefum, hafa eitthvað sem heitir Pre-vinnslu, eitthvað
kallað saman, sem við höfum séð, eitthvað sem kallast samsetningu og
eitthvað sem kallast tengja.
Svo allt þar til nú, í sumum okkar forrit, höfum við haft mikil nær.
Meira undanfarið höfum við haft nokkur skörp skilgreinir fyrir fastar.
Svo kemur í ljós að þeir hlutir sem sem forskeyti kjötkássa tákn eða
pund tákn eru fyrirfram örgjörva tilskipunum.
Það er bara fínt leið til að segja það A lína af kóða sem er í raun
breytt í eitthvað annað áður en tölva reyna jafnvel að umbreyta þinn
program í núll og sjálfur.
>> Til dæmis, skarpur nær staðall I / O. Klst nánast þýðir bara að fara
undan, grípa innihald skráa stdio.h og líma þær þarna.
Svo engin núll og sjálfur á þeim tímapunkti enn.
Það er í raun bara skipta.
Og það er gert á svokölluðum fyrirfram vinnslu stigi, þegar þú
reyndar hlaupa Clang eða sérstaklega Gera í flestum tilfellum.
Svo allt þetta hefur verið að gerast Fyrsta sjálfkrafa svona langt.
>> Þá kemur samantekt skref.
En við höfum verið of einfalt samantekt.
Setja saman áætlun í raun þýðir að taka það frá eitthvað eins og C, sem
Kóðinn sem við höfum verið að skrifa, niður til eitthvað sem heitir samkoma.
Þingið tungumál er lægri tungumál sem betur fer, munum við ekki
hafa mikið tækifæri til að skrifa á þessari önn.
En það er á lægsta stigi í skilningi að þú byrjar bókstaflega að skrifa
bæta við og draga og margfalda og hlaða frá minni og vista í minni,
einfaldar leiðbeiningar sem tölvu, undir hetta,
raun skilur.
>> Loksins, samsetningu tekur það tungumál til núll og sjálfur sem við höfum verið
lýsa svona langt.
Og sannarlega loks, það er svokölluð tengja áfanga, sem við munum
sjá í aðeins augnablik, sem sameinar núll þín og sjálfur með núllum og
sjálfur öðru fólki fyrir þú hefur búið til.
>> Svo íhuga þetta frábær einfalt forrit.
Það var frá viku 1..
Það sagði bara, Halló heimur, á skjánum.
Við hljóp þetta í gegnum Clang.
Eða við hljóp það gera í gegnum sem hljóp Clang.
Og outputted á þeim tíma sem sumir núll og sjálfur.
En það kemur í ljós að það er millistig skref.
Ef ég fer yfir hér - Úps, ekki langar að sjá hann ennþá.
Ef ég fer yfir hér að tæki minn og ég opna hello.c, hér
er sama program.
Og það sem ég ætla að gera í flugstöðinni minn gluggi hér er ég ætla að
hlaupa Clang frekar en að gera, sem sjálfvirkan allar fjórar af
þeir stíga fyrir okkur.
Og ég ætla að gera clang-S og þá hello.c og svo inn.
>> Og ég fá blikkandi hvetja aftur, sem er gott.
Og nú í örlítið stærri glugga, Ég ætla að opna gedit hér.
Og ég ætla að opna skrá sem, reynist, heitir hello.s þetta
inniheldur að samsetningu tungumál Ég nefndi áðan.
Og þetta er það sem er kallað samkoma tungumál, frekar lágt
leiðbeiningar sem þinn Intel CPU eða hvað sem það er sem er inni
skilur.
Og MOV er fyrir ferðinni. símtal er í starf, mjög lágu stigi virka.
undir er fyrir frádrátt.
>> Svo þegar þú ert með ákveðna CPU inni um tölvuna þína, sem gerir það
greinilegur, á móti öðrum örgjörva á að markaði, er hvaða leiðbeiningar það
skilur og oft hversu duglegur hann er, hversu hratt það er framkvæmd sumir
þessara leiðbeininga.
Nú fyrir meira um þetta, þú getur tekið næsta haust CS61 við skólann.
En hér höfum við, til dæmis, nokkrar heiti sem gæti líta kunnuglegt.
hello.c er nafn áætlunarinnar.
>> . Texta -
það er ekki mikið af áhuga þar bara núna, muna að textinn
hluti, og með mánudagur, er þar í minni program endar í raun allt.
Svo er það að minnsta kosti óljóst þekki þar.
Hér, að sjálfsögðu, er minnst helstu starfsemi okkar.
Fletta niður, vísa þeim til hluti kallast skrár, mjög lítil klumpur af
minni inni af raunverulegu CPU þinn.
Og ef ég skruna niður jafnvel frekar sé ég einhvers konar
óbein nefna ASCII.
Og það, örugglega, er það band, halló, komma, heimur.
>> Svo langa sögu stutta, þetta hefur verið gerast fyrir þig sjálfkrafa,
undir hetta öllum þessum tíma.
Og hvað er verið að gerast er í raun einu þú hefur keyrt Clang, eða sem
Gera, þú ert að fá fyrsta, frá the uppspretta merkjamál, the
svokallaða samkoma tungumál.
Þá Clang er að breyta þessu samkoma tungumál niður núll og sjálfur.
Og þetta er glæra sem við byrjuðum umfjöllun okkar í viku 0 á -
og þá Vika 1 á.
Og loks, þá núll og sjálfur eru ásamt núll og sjálfur
frá þeim bókasöfnum sem við höfum verið að taka sjálfsögðum hlut eins og Standard I / O eða
String Library eða jafnvel The CS50 bókasafn.
>> Svo að mála þessa mynd meira sjónrænt, höfum við hello.c.
Og það, að sjálfsögðu, notar printf virka að segja, halló heimur.
Samantekt skref tekur það niður að skrá sáum bara hello.s, jafnvel
þó það er oftast eytt sjálfkrafa fyrir þig.
En það er samkoma númer í miðju skrefi.
Og svo þegar við saman söfnuð tungumál, svo að segja, það er þegar þú
fá þessir núll og sjálfur.
Þannig að við höfum aðdregna í raun í dag á það sem við höfum verið að taka sem sjálfsögðum hlut,
þýðir að fara kóðann að mótmæla kóða.
>> En loksins, nú sama mynd - skulum shove það yfir til
vinstri hönd hlið.
Og athugaðu að í toppnum Ég nefndi stdio.h.
Það er skrá sem við höfum látið í nánast allar
forrit sem við höfum skrifað.
Og það er skrá sem innihald fá afrit límt,
raun topp kóðann þinn.
En það kemur í ljós að á tölvu kerfið einhvers staðar, það er væntanlega
stdio.c skrá sem einhver skrifaði árum síðan útfærir því að allir
aðgerðir sem úrskurðaðir í stdio.h.
>> Nú í raun það er sennilega ekki á Mac eða PC eða jafnvel í
CS50 tæki er hrár C kóða.
Einhver saman þegar það og með . O skrá fyrir kóðann mótmæla eða. A
skrá, sem vísar til a hluti bókasafn sem hefur verið fyrirfram uppsett og
pre-saman fyrir þig.
En geri ráð fyrir að það örugglega til á stdio.c tölvunni okkar í samhliða
með Clang.
Númerið þitt er að safna saman og stefndi.
stdio.c 's númer er unnin og saman, þannig að þetta mjög síðast
stíga, niður hér, verðum við að einhvern veginn hlekkur, svo að segja, núll þín og sjálfur
með hans eða hennar núll og sjálfur inn í einn einföld forrit sem að lokum er
heitir bara Hello.
>> Svo er það allt í galdur sem er verið að gerast svona langt.
Og mun halda áfram að taka þessar ferli sem sjálfsögðum hlut, en ljóst
There 'a einhver fjöldi af safaríkur upplýsingar fara á undir það.
Og þetta er það sem gerir þinn tölva með Intel inni
sérstaklega greinilegur.
>> Svo á að huga, ef þú vildi eins og til tengja okkur í hádeginu á föstudaginn, ekki fara
við venjulega stað cs50.net/rsvp, 13:15 á föstudaginn.
Og nú fyrir nokkrum tilkynningar.
Þannig að við höfum einhverjar góðar fréttir.
Og við höfum slæmar fréttir.
Byrja með einhverjum góðum fréttum hér.
>> [Andvörp]
>> Allt í lagi.
Jæja, það er tæknilega a frí, svo það er ekki svo mikið að gjöf frá okkur.
En þá slæmar fréttir að sjálfsögðu.
>> [Andvörp]
>> Ég eyddi miklum tíma á þessum fjör.
>> [Hlátur]
>> Það verður að endurskoða setu þetta kemur mánudagur.
Það er að fara að vera á 5:30 PM.
Við munum minna þig á allar þessar upplýsingar með tölvupósti á námskeiðinu er
website í aðeins nokkra daga tíma.
Það verður tekið og gerðar aðgengilegar skömmu síðar.
Svo ef þú getur ekki gert það mánudagur nótt rifa, ekki hafa áhyggjur.
Dæmatímar þessa komandi viku mun einnig áherslu á endurskoðun fyrir próf.
Ef hluti er á mánudaginn, sem er örugglega háskóla frí, munum við
enn mæta í kafla.
Ef þú einfaldlega getur ekki gert það kafla vegna þess að þú ert að fara
burt, það er fínt.
Sækja sunnudagur eða þriðjudagur kafla eða lag í lið Jason er, sem er
í boði á netinu.
>> Svo, fleiri slæmar fréttir.
Svo samkvæmt kennsluáætlun, við höfum fyrirlestur næsta föstudag.
En góðar fréttir -
greinilega, eyddi ég of miklum tíma í þetta.
>> [Hlátur]
>> Við munum hætta næstu fyrirlestra föstudag.
Svo sem verður gjöf fyrir okkur, svo þú getur raunverulega hafa a ágætur frest í
milli þessa viku og tveimur vikum liðnum.
Svo enginn fyrirlestra í næstu viku, bara örlítið lítið quiz, sem þú ættir að vera
fá sífellt spenntur.
>> Svo skulum nú snúa athygli okkar að eitthvað sem er örugglega meira sjón
og meira spennandi og til að setja á svið fyrir hvað er að fara að vera á sjóndeildarhringnum
í aðeins nokkra vikna tíma.
Eftir fyrsta prófið, munum við snúa áherslu setur vandamál okkar til annars
ríki ákveðin vandamál, sem af réttar eða öryggi almennt.
>> Í staðreynd, the hefð með þetta vandamál sett er fyrir mig eitt af
kennslu náungi eða CAS að ganga yfir háskólasvæðinu taka nokkrar ljósmyndir af
að bera kennsl á en ekki augljós fólk, stöðum, eða hluti, þá á hverju ári I
einhvern veginn tekst að tilviljun eyða eða skemmt stafrænn frá miðöldum nafnspjald
sem er inni í myndavélinni okkar.
En ekki máli.
Ég get farið á undan og stinga að í tölvunni minni.
Ég get gert réttar mynd af henni, svo að tala, með því að afrita núll og
sjálfur burt af þeim minniskort, hvort Þess SD kort eða samningur glampi nafnspjald eða
hvað sem þú ert kunnug.
Og þá getum við afhenda það út.
>> Og svo áskorun framundan, ma hlutir fyrir þig, verður að skrifa
C kóða sem batna a heild búnt af JPEG fyrir mig og ljós verður
þessir menn, staðir eða hlutir.
Og við munum einnig tala, í þessu vandamáli setja og á næstu dögum koma, um
grafík almennt.
Við höfum notað þá, námskeið, fyrir að brjótast út.
En þú hefur svona tekið sem sjálfsögðum hlut þar til þessir háu hugmyndir stigi
af ferhyrninga og ovals.
En undir hetta það eru punktar.
Og þú hefur fengið að byrja hugsa um þá.
Eða þú munt fyrir p-sett 4 að hugsa um bilið milli múrsteinn þinn, hvernig
fljótt þú ert boltinn hreyfist yfir skjánum fyrir brjótast út.
Svo er þetta hugmynd af punktar á skjánum sem er
koma inn í leik þegar.
>> Nú það sem þú sérð, þó, er það sem þú færð á tölvuskjá.
Ef þú hefur einhvern tíma horft sumir góður eða slæmur TV, eru líkurnar að þeir nánast
meðhöndla áhorfendur eins technophobes sem gera í raun ekki
vita mikið um tölvumál.
Og svo er það mjög auðvelt fyrir lögreglu leynilögreglumaður að segja, getur þú
hreinsa það upp fyrir mig?
Eða auka, ekki satt?
Auka er eins suð orð í flest allir glæpir sem tengjast sýning.
Og raunin er ef þú tekur mjög þoka mynd af grunar að gera
eitthvað slæmt, getur þú ekki bara auka það.
Þú getur ekki stækkað óendanlega.
Þú getur ekki séð í Glint af er einhver auga sem framin að
einkum glæpastarfsemi, þrátt fyrir Algengi þetta á TV.
>> Og svo með að við skulum hvetja sem komandi Heimadæmi með svipinn á
sumir sýnir með hvaða þú gæti verið kunnuglegt.
>> [Vídeó spilun]
>> -OK.
Nú, við skulum fá góða líta á þig.
>> -Bíddu.
Hlaupa að baka.
>> -Bíddu.
Fara til hægri.
>> -Það.
Frysta það.
>> -Full skjár.
>> -OK.
Frysta það.
>> Herða upp á það, mun ya?
>> -Vektor í á þessi strákur með bak hjólinu.
>> -Zoom í hérna á þessum stað.
>> -Með réttum búnaði og imaged hægt að stækka og skerpti.
>> -Hvað er það?
>> -Það er aukahlutur program.
>> -Getur þú skýrt það upp allir?
>> -Ég veit það ekki.
Skulum auka það.
>> -Auka kafla A-6.
>> -Ég aukið smáatriði og -
>> -Ég held að það er nóg til að auka.
Losa það til minn skjár.
>> -Auka spegilmynd í augum hennar.
>> -Við skulum hlaupa þetta í gegnum vídeó aukahluti.
>> -Edgar, getur þú aukið þetta?
>> -Bíddu.
>> -Ég hef verið að vinna þennan íhugunar.
>> -Einhver spegilmynd.
>> -Hugleiðingar.
>> -Það er spegilmynd af andliti mannsins.
>> -The spegilmynd.
>> -Það er spegilmynd.
>> -Zoom í á spegil.
>> -Þú getur séð spegilmynd.
>> -Getur þú bæta ímynd hér?
>> -Getur þú auka hann hérna?
>> -Getur þú auka það?
>> -Getum við auka þetta?
>> -Getur þú auka það?
>> -Bíddu annað, ég auka.
>> -Zoom í á dyrnar.
>> -X10.
>> -Zoom.
>> [Hlátur]
>> -Færa inn
>> -Bíddu, stöðva.
>> -Stöðva.
>> -Hlé á henni.
>> -Snúa 75 gráður í kringum lóðrétt vinsamlegast.
>> [Hlátur]
>> -Hættu, og aftur til hluta um dyrnar aftur.
>> -Fékk Myndvinnsla sem getur punktamynd?
>> -Kannski getum við notað Pradeep Sen aðferð til að sjá inn í Windows.
>> -Þessi hugbúnaður er ástand af the list.
>> -Táknið gildi er slökkt.
>> -Með réttum samsetningu af reiknirit.
>> -Hann er tekið lýsingu reiknirit til á næsta stig og ég er að nota þær til að
auka þessa mynd.
>> -Læsa á og stækka Z-axis.
>> -Auka.
>> -Frysta og auka.
>> [END vídeó spilun]
>> DAVID J. Malan: Svo Heimadæmi 5 er það sem liggur framundan þar.
Þannig að við munum fljótlega fá betri skilning um hvenær og hvers vegna þú getur
og okkar getur ekki auka á þann hátt.
En fyrst skulum fara aftur athygli okkar að sumir af the byggja blokkir við munum
þarf að vera fær um að segja þessa sögu.
>> Svo muna að við teiknaði þessa mynd á Mánudagur og svolítið í síðustu viku.
Og þetta lýsir skipulag hlutum í minni tölvunnar þegar
keyra eitthvað forrit.
The tækni hluti upp ofan, muna, vísar við raunverulegan núll og sjálfur
að semja program.
Það er, fyrir neðan það, sumir frumstilla eða forsniðinn gögn, sem venjulega
vísar til hlutur eins fastar eða strengir eða alþjóðlegum breytur sem hafa
verið lýst fyrirfram.
Það er hrúga, en við munum koma aftur til að í a hluti.
>> Og þá er það stafla.
Mikið eins og stafla af bakka í mötuneyti, þetta er þar sem minni fær
lagskipt og lagskipt þegar þú hvað í áætluninni?
Hvað er að stafla nota fyrir?
>> Já?
>> Kalla af virka.
Hvert sinn sem þú hringja í aðgerð, það er gefið flís af minni fyrir þess
staðbundnar breytur eða breytur hennar.
Og pictorially, sjáum við að við hverja röð fall sem kallast, þegar A
símtöl B símtöl C símtöl D, þeir fá lagskipt á stafla.
Og innan hvers þeirra sneiðar af minni er í raun einstakt svigrúm
fyrir að virka, sem, að sjálfsögðu, er erfið ef þú vilt að skila
frá einum til í starfi A stykki af gögnum sem þú vilt hafa það
að mutate eða breyta.
>> Svo það var lausn okkar að gera A virka fulltrúa með einum stafla
ramma til að breyta minni inni annars stafla ramma?
Hvernig þessir tveir tala við annan?
Svo með því að ábendingum eða heimilisföng, sem, aftur, bara lýsa hvar í
minni, með því að tiltekið bíta númer, einkum
gildi er hægt að finna.
Svo muna síðasta skipti líka við áfram söguna og horfði á
nokkuð þrjótur program.
Og þetta forrit er þrjótur fyrir nokkrum ástæður, en mest áhyggjuefni einn er
því það tekst ekki að athuga hvað?
>> Já, ekki það að athuga inntak.
Því miður?
>> Ef það er meira en 12 stafir.
Svo mjög smartly, þegar starf memcopy, sem, eins og nafnið gefur til kynna, bara
eintök minnið annarri röksemdafærslu sína í fyrsta röksemdafærslu sína.
Þriðja rök, mjög smartly, er til að ganga úr skugga um að þú gerir ekki
afrita fleiri en í þessu tilfelli, lengd af bar, fjölda stafa,
inn í áfangastað, sem er á þessu array C. En vandamálið er að það
ef C sjálft er ekki nógu stór að höndla það?
Þú ert að fara að afrita fjölda bæti sem þú hefur verið gefið.
En hvað þú ert í raun meiri bæti en þú hefur pláss fyrir?
>> Jæja, þetta forrit mjög heimskulega bara blindni ágóði til að taka hvað sem það er
gefið, halló sviga 0 er mikill ef band er stutt
nóg, eins og fimm stafir.
En ef það er í raun 12 stafir eða 1200 stafir, sáum við síðasta skipti
að þú ert bara að fara að alveg skrifa minni sem
ekki tilheyrir þér.
Og versta tilfelli, ef þú skrifa að rauður hluti þar sem við kallað
aftur heimilisfang -
þetta er bara þar sem tölvan sjálfkrafa fyrir þig, á bak við
tjöldin, tucks burtu 32-bita gildi sem minnir það að hvaða netfang það ætti
aftur þegar foo, þetta önnur aðgerð, er gert framkvæmd.
Það er brauð Crumb nokkurs konar sem hann kemur aftur.
Ef þú skrifa það, hugsanlega, ef þú ert slæmur strákur, getur gat
hugsanlega að taka yfir einhver tölva.
Og þú munt örugglega hrun það í flestum tilvikum.
>> Nú er þetta vandamál var aðeins aukið Eins og við byrjuðum að tala um minni
stjórnun almennt.
Og malloc, fyrir úthlutun minni, er virka sem við getum notað til að úthluta
minni þegar við vitum ekki fyrirfram að við gætum þurft nokkrar.
Svo, til dæmis, ef ég fer aftur á tækið hér.
Og ég opna úr síðasta tíma hello2.c, muna þetta forrit hér, sem horfði
smá eitthvað eins og þetta, bara þrjár línur -
fram nafn þitt, þá String nafn, á vinstri jafngildir getstring.
Og þá erum við að prenta það út, notandans nafn.
>> Þannig að þetta var frábær einfalt forrit.
Til að vera skýr, láta mig fara á undan og gera halló-2.
Ég ætla að gera punktur rista halló-2.
Tilgreinið nafn þitt -
David.
Enter.
Halló David.
Það virðist virka OK.
En hvað er raunverulega að gerast undir hetta hér?
Fyrst skulum afhýða aftur nokkrum lögum.
Band er bara samheiti við höfum áttaði fyrir hvað?
Char stjörnu.
Svo skulum gera það svolítið meira Bogagöng en meira tæknilega rétt að þetta
er bleikju stjörnu, sem þýðir að nafn, já, er breyta.
En hvað nafn verslanir er heimilisfang A bleikju, sem finnst svolítið skrítið
því ég er að komast aftur a band.
Ég fæ aftur margar stafir ekki bleikju.
>> En auðvitað þarftu aðeins fyrsta Bleikja er netfang til muna þar sem
allt band er því hvers vegna?
Hvernig reikna þig út þar í lok band er að vita í upphafi?
The sviga núll.
Svo með þessum tveimur vísbendingum sem þú reikna út fyrir upphaf og lok
hvaða band er, svo lengi sem þeir eru rétt mynduð með því null
Terminator, sem sviga núll.
>> En þetta er starf getstring.
Og það kemur í ljós að getstring allan þennan tíma hefur verið eins konar
svindla fyrir okkur.
Það er verið að gera þetta vinnuafl, til að vera viss, fá band frá notanda.
En hvar er að minni verið að koma frá?
Ef við förum aftur til myndina hér og beita skilgreiningu á bara
stund síðan, að stafla er þar minni fer þegar aðgerðir eru kallaðir,
eftir að rökfræði, þegar þú hringir getstring, og þá er ég að slá í
D-A-V-I-D Velja, þar sem er D-A-V-I-D sviga núll geymd, miðað við
saga sem við höfum sagt okkur langt?
>> Það myndi virðast vera í stafla, ekki satt?
Þegar þú hringir fá band sem þú færð litla sneið af minni á mánudaginn.
Svo stendur það til þess að D-A-V-I-D sviga núll er geymt
þar í stafla.
En bíddu í eina mínútu, getstring ávöxtun að strengur, svo að segja, sem þýðir
það er bakki úr mötuneyti er tekin af stafla.
Og við sögðum síðasta skipti sem um leið og skilar, og þú tekur að
bakki, svo að segja, af stafla, hvað getur þú gert ráð um leifar af
að minni?
Ég redrew konar þá sem spurningarmerkjum vegna þess að þeir verða í raun
óþekkt gildi.
Þau er hægt að endurnýta þegar sumir næsta virka er kallað.
>> Með öðrum orðum, ef við gerast til að vera að geyma -
Ég teikna a fljótur mynd hér á mánudaginn.
Ef við skyldir að teikna neðst af hluti minni mínu, og við munum segja
að þetta er staðurinn af minni hertekið af helstu og kannski Arg c og
arg V og allt annað í áætluninni, þegar getstring er kallað,
væntanlega fær getstring bútur af minni hér.
Og síðan D-A-V-I-D á einhvern hátt endar í þessa aðgerð.
Og ég ætla að einfalda málin.
En við skulum gera ráð fyrir að þess D-A-V-I-D sviga núll.
Sem þetta margir bæti eru notuð í ramma fyrir getstring.
>> En um leið og getstring skilar, við sagði síðast að þetta minni á
hér verður allt - woops -
allt verður í raun þurrkast út.
Og við getum hugsað þetta núna sem um ræðir markar því hver veit
hvað er að fara að verða þess minni.
Reyndar kalla ég mjög oft virka önnur en getstring.
Og um leið og ég kalla einhver önnur virka en getstring, kannski ekki í
This sérstakur program við skoðuðum bara á en einhver annar, örugglega einhver annar
virka might endir upp tilvera gefið þetta næsta blettur í stafla.
>> Svo það getur ekki verið að getstring verslanir D-A-V-I-D á mánudaginn vegna þess að ég vildi
strax missa aðgang að henni.
En við vitum að þeir getstring skilar einungis hvað?
Það er ekki aftur til mig sex stafi.
Hvað er það aftur sannarlega gerði við ályktum síðasta skipti?
Veffang fyrstu.
Svo einhvern veginn, þegar þú kallaðir getstring, það er að úthluta klumpur af minni fyrir
strengurinn sem notendur slá og þá aftur heimilisfang það.
Og það kemur í ljós að þegar þú vilt virka til að úthluta minni í þessari
leið og aftur til þess sem kallast að virka, heimilisfang
að bútur af minni, þú algerlega getur ekki setja það í stafla á að
botn, því virkni er það bara fara að gerast ekki þitt mjög
fljótt, svo þú getur sennilega giska á hvar við erum líklega að fara að kasta því
staðinn, svokallaða hrúga.
>> Svo milli botns er minni þitt skipulag og efst er minni þitt
skipulag ert a heild búnt af hluti.
Eitt er að stafla, og hægri ofan er hrúga.
Og hrúga er bara öðruvísi klumpur af minni sem er ekki notað fyrir aðgerðir
þegar þeir eru kallaðir.
Það er notað til lengri tíma litið minni, þegar þú vilt eina aðgerð til að grípa sumir
minni og vera fær um að hanga á henni án þess að missa stjórn á henni.
>> Nú þú gætir kannski strax sjá að þetta er ekki
endilega fullkomna hönnun.
Sem forritið þitt úthlutað minni á stafla, eða eins og þú kalla meira og
fleiri aðgerðir, eða eins og þú úthluta minni á hrúga með malloc burt eins
getstring er að gera, hvað greinilega virðist vera óhjákvæmilegt vandamál?
>> Rétt.
Eins og sú staðreynd að þessar örvar vísi hvort á annað
ekki Bode vel.
Og reyndar, við gætum mjög fljótt hrun forrit í allir tala af lifnaðarhættir.
Í raun held ég að við gætum hafa gert þetta óvart einu sinni.
Eða ef ekki, við skulum gera það vísvitandi núna.
Leyfðu mér að fara á undan og skrifa frábær fljótt forrit sem heitir dontdothis.c.
Og nú fer ég í hér og gera skörp eru stdio.h.
Skulum lýsa virka foo tekur engin rök, sem er
táknað sem vel tómi.
>> Og það eina sem foo er að fara að gera er að kalla foo, sem sennilega er ekki
smartest hugmynd, en svo vera það.
Ent helstu ógilt.
Nú það eina sem helstu er að fara til að gera er að hringja foo eins vel.
Og bara fyrir ánægja, ég ætla að fara undan hér og segja printf "Halló frá
foo. "
>> OK.
Þannig að ef ég var ekki að gera einhver mistök, Gerðu dontdothis punktur rista.
Og við skulum gera það í stærri glugga -
punktur rista, dontdothis.
Koma á.
Uh oh.
Apparently, þú getur gert þetta.
Fjandinn.
OK.
Bíddu.
Standa við.
Gerði við -
Við vildum nota það með gera.
>> [Sighs]
>> Ég veit, en ég held að við bara eytt því.
Uh, já.
Fjandinn.
Leysa þetta Rob.
Hvað?
Það er mjög einfalt.
Já, sneri við hagræðingu af.
OK, standa bless.
Nú líður mér betur.
OK.
Allt í lagi.
>> Svo skulum laun þetta -
Gerðu þig dontdothis.
Þú gætir þurft að endurnefna þetta dothis.c í aðeins augnablik.
Þar við förum.
Þakka þér.
OK.
Svo sú staðreynd að ég var prentun eitthvað út var í raun bara
hægja á ferli sem við hefði náð að benda.
OK.
Phew!
>> Svo hvað er raunverulega að gerast?
Ástæðan, eins og innskot, er gera neitt í skilmálar af inntak og
framleiðsla hefur tilhneigingu til að vera hægari vegna þess að þú að skrifa stafi til
skjár, hefur það að fletta.
Svo löng saga stutt, ég hafði í raun gerðist svo óþolinmóð, myndum við hafa
séð þetta niðurstaðan eins vel.
Nú þegar ég fékk far á print-ups, við sjáum það strax.
Svo hvers vegna er þetta að gerast.
Well, the einföld skýring, að sjálfsögðu, er að foo sennilega ætti ekki
að kalla sig.
>> Nú í almennum skilmálum, þetta er endurkvæmni.
Og við héldum nokkrar vikur síðan endurkvæma er gott.
Endurkvæmni er þetta töfrandi leið tjá þig frábær succinctly.
Og það virkar bara.
En það er lykill lögun af öllum endurkvæma forrit sem við höfum talað
um og horfði á svona langt, sem var að þeir höfðu hvað?
Grunn málið, sem var einhver harður dulmáli mál sem sagt í sumum tilvikum
kalla ekki foo, sem er greinilega ekki raunin hér.
>> Svo hvað er raunverulega að gerast hvað varðar þessa mynd?
Jæja, þegar helstu kallar foo, það fær sneið af minni.
Þegar foo kallar foo, fær það sneið af minni.
Þegar foo kallar foo, fær það sneið.
Það fær sneið.
Vegna foo er aldrei aftur.
Við erum aldrei að hreinsa eina af þeim rammar úr stafla.
Þannig að við erum að blása í gegnum hrúga, ekki að nefna hver veit hvað annað, og
við erum overstepping mörk okkar svokallaða hluti af minni.
Villa fara skiptingu rangar.
>> Svo lausnin er greinilega ekki gera þetta.
En stærri vísbendingu er að, já, það algerlega er einhver takmörk,
jafnvel ef það er ekki vel skilgreind, eins og til hvernig margar aðgerðir sem þú getur hringt í
program, hvernig margir sinnum fall getur hringt sig.
Svo jafnvel þótt við gerðum prédika endurkvæmni eins og þetta hugsanlega töfrandi hlutur
Tveimur vikum fyrir Sigma virka, og þegar við að fá gögnin
mannvirki og CS50, munt þú sjá aðra umsóknir um það, það er ekki
endilega það besta.
Vegna þess að ef fall kallar sig, kallar sig, jafnvel ef það er stöð
tilfelli, ef þú ert ekki högg sem byggja mál fyrir 1.000 símtöl eða 10.000 símtöl, með
þeim tíma sem þú gætir hafa keyrt út úr herberginu á svokölluðu stakkur og högg
nokkrar aðrar hluti af minni.
Svo er það líka hönnun málamiðlun milli glæsileika og milli
robustness einkum þín framkvæmd.
>> Svo er það annar hæðir eða annar Gotcha að það sem við höfum
verið að gera svona langt.
Þegar ég kallaði getstring -
láta mig fara aftur í hello-2.
Takið eftir að ég er að hringja getstring, sem er aftur netfang.
Og við kröfu dag að tölu er frá hrúga.
Og nú er ég að prenta út band á þetta netfang.
En við höfum aldrei kallað andstæða getstring.
Við höfum aldrei þurft að calll aðgerð eins ungetstring, þar sem þú hönd baka
að minni.
En hreinskilnislega við líklega ætti að hafa verið.
Vegna þess að ef við höldum að spyrja tölvuna fyrir minni, við vegur af einhverjum eins
getstring en aldrei gefa það til baka, örugglega sem líka er skylt að leiða til
vandamál þar sem við keyra út af minni.
>> Og í raun getum við leita að þessum vandamál með nýja tól sem notkun
er svolítið dulinn að slá.
En láta mig fara á undan og skvetta upp á skjánum í aðeins augnablik.
Ég ætla að fara á undan og keyra Valgrind með breytu sem fyrsta stjórn
lína rifrildi er nafn af því að forritið halló-2.
Og því miður er það framleiðsla er atrociously
flókið fyrir neitun góður ástæða.
Þannig sjáum við allt sem óreiðu.
David er fram nafn mitt.
Svo er að áætlunin raunverulega í gangi.
Og nú erum við að fá þessa útkomu.
>> Svo er Valgrind svipuð í anda að gdb.
Það er ekki aflúsara í sjálfu sér.
En það er minni afgreiðslumaður.
Það er forrit sem mun keyra þinni forrita og segja þér ef þú spurði
tölva fyrir minni og aldrei afhent henni aftur, þar sem þýðir að þú hefur
minni leka.
Og minni lekur tilhneigingu til að vera slæmt.
Og þú er notandi tölvur hafa sennilega fannst þetta, hvort sem þú ert með
Mac eða PC.
Hefur þú einhvern tíma notað tölvuna þína fyrir meðan og ekki rebooted í nokkrum
daga, eða þú hefur bara got a einhver fjöldi af verkefni í gangi, og fjandinn hlutur
hægir að mala stans, eða að minnsta kosti það er frábær pirrandi að nota, vegna þess að
allt fékk bara frábær hægur.
>> Nú að geta verið allir tala af ástæða.
Það gæti verið óendanlega lykkju, padda í númer einhvers, eða, meira einfaldlega, það
gæti þýtt að þú ert að nota meira minni, eða að reyna að, en þinn
tölva hefur reyndar.
Og kannski er það galla í eitthvað forrit að halda að biðja um minni.
Vafra fyrir árin voru alræmd fyrir þetta, að biðja um meira og meira minni
en aldrei fötlun það aftur.
Víst, ef þú hefur aðeins endanlega magn af minni, þú getur ekki beðið
óendanlega oft fyrir sumir af þeim minni.
>> Og svo það sem þú sérð hér, jafnvel þótt aftur er framleiðsla Valgrind er
óþarflega flókið til litið á fyrst, þetta er áhugaverður hluti.
Hrúga -
í notkun á hætta.
Svo er hér hversu mikið minni var í notkun í hrúga á að
tími program minn lauk -
virðast sex bæti í einu blokk.
Þannig að ég ætla að veifa höndum mínum á hvaða blokk er.
Hugsaðu um það er bara klumpur, meira tæknilega orð fyrir klumpur.
En sex bæti -
hvað eru sex bæti sem voru enn í notkun?
>> Einmitt.
D-A-V-I-D sviga núll, fimm stafa nafn auk null Terminator.
Þannig að þetta forrit Valgrind tekið eftir að ég bað um sex bæti, virðist, með
leið getstring, en aldrei gaf þá aftur.
Og í raun er þetta kannski ekki svo augljóst ef áætlun mín er ekki þrjú
línur, en það er 300 línur.
Svo við getum í raun gefa annað skipunina lína rök að Valgrind til
gera það meira fjölorður.
Það er svolítið pirrandi að muna.
En ef ég geri -
við skulum sjá.
Leka -
Var það leka -
jafnvel ég man ekki hvað það er slökkt hendi.
>> - Leka-stöðva jafn fullur.
Já, þakka þér.
- Leka-stöðva jafn fullur.
Enter.
Sama forritið er í gangi.
Slá í Davíð aftur.
Nú sé ég aðeins meiri smáatriðum.
En undir hrúga samantekt, sem er eins fjórar - Ah,
þetta er góður af gaman.
Nú Valgrind er í raun að leita svolítið erfiðara í númerið mitt.
Og það er að segja það, greinilega, malloc á línu -
við súmma út.
Á Line -
við sjáum ekki hvað lína það er.
En malloc er fyrsta sökudólgur.
Það er blogg í malloc.
>> Allt í lagi?
OK, nei.
Ekki satt?
Ég kallaði getstring.
getstring kallar greinilega malloc.
Svo hvaða línu af kóða er virðist að kenna fyrir að hafa
úthlutað þetta minni?
Skulum gera ráð fyrir að hver skrifaði malloc hefur verið í kringum nógu lengi sem það er
ekki galli þeirra.
Svo það er sennilega mitt.
getstring í cs50.c - svo það er skrá einhvers staðar á tölvunni -
í línu 286 virðist vera sökudólgur.
Nú skulum gera ráð fyrir að cs50 hefur verið kring um viðeigandi magn af tími, svo
við erum líka infallible.
Og svo er það sennilega ekki í getstring að villan liggur, heldur á
halló-2.C línu 18.
>> Þannig að við skulum taka a líta á hvað þessi lína 18 var.
Ó.
Einhvern veginn er þetta línan ekki endilega þrjótur, í sjálfu sér, en það er ástæða
bak við þessi minni leka.
Svo frábær einfaldlega, hvað myndi innsær vera lausnin hér?
Ef við erum að biðja fyrir minni, voru aldrei að gefa það aftur, og það virðist vera
vandamál því með tímanum tölvunni minni gæti keyrt út af minni, gæti hægja
niður, slæmur hlutur gæti gerst, ja, hvað er einfalt leiðandi lausn?
Bara gefa það til baka.
>> Hvernig losa þig upp að minni?
Jæja, sem betur fer er það mjög einfalt bara segja ókeypis nafn.
Og við höfum aldrei gert þetta áður.
En þú getur í raun að hugsa um frjáls sem andstæðu malloc.
ókeypis er andstæða úthlutun minni.
Svo nú láta mig laun þetta.
Gera Hello-2.
Leyfðu mér að keyra það aftur. halló-2 David.
Svo virðist það að vinna í nákvæmlega sama hátt.
En ef ég fer aftur til Valgrind og aftur hlaupa sama stjórn á nýlega minn
saman program, vélritun í mínu nafni eins og áður -
nice.
Hrúga samantekt -
í notkun á brottför -
núll bæti í núll blokkir.
Og þetta er super nice, allt hrúga blokkir voru leystur.
Enginn leki eru mögulegar.
>> Svo koma upp, ekki með Set Vandamál 4, en með Set Vandamál 5, réttar
og áfram, þetta of mun verða mælikvarði á réttmæti þínum
program, hvort sem þú ert eða hafa ekki minni lekur.
En sem betur fer, ekki aðeins hægt að ástæðu gegnum þá innsæi, sem
er, að öllum líkindum, auðvelt fyrir lítil verkefnum en erfiðara fyrir stærri verkefnum,
Valgrind, fyrir þá stærri forrit, getur hjálpað þér að finna
einkum vandamál.
>> En það er eitt annað vandamál sem gæti komið upp.
Leyfðu mér að opna þessa skrá hér, sem er, aftur, nokkuð einfalt dæmi.
En við skulum leggja áherslu á það Þetta forrit gerir.
Þetta er kallað memory.c.
Við munum senda þetta seinna í dag í Zip af frumkóða dag.
Og eftir því að ég hef fall sem kallast F sem tekur ekki rökum og
skilar engu.
Í samræmi 20, ég er greinilega að lýsa yfir músina til að int og kallar það x.
Ég framselja er aftur Verðmæti malloc.
Og bara til að vera skýr, hversu margir bæti am Ég fá líklega aftur úr malloc
í þessu ástandi?
>> Sennilega 40.
Hvar fæ þér að frá?
Jæja, ef þú manst að int er oft 4 bæti, að minnsta kosti að það er í
tæki, 10 sinnum 4 er augljóslega 40.
Svo malloc er aftur inn veffang bútur af minni og geyma það
takast á endanum í x.
Svo að vera ljóst, hvað þá er að gerast?
Jæja, láttu mig skipta aftur að mynd okkar hér.
Leyfðu mér ekki bara draga neðst á mínum minni tölva ', láta mig fara á undan og
draga alla rétthyrningur sem táknar alla RAM minni.
>> Við munum segja að stafla er á botn.
Og það er texti hluti í að forsniðinn gögn.
En ég ætla bara að fara að ágrip þeirra annars burtu eins punktur, punktur punktur.
Ég ætla bara að fara að vísa til þessa eins og hrúga efst.
Og þá neðst á þessari mynd, til að tákna helstu, ég er að fara
að gefa það sneiðar minni á mánudaginn.
Fyrir f, ætla ég að gefa það a sneið minni á mánudaginn.
Nú, ég fékk að hafa samráð mín Kóðinn aftur.
Hvað eru staðbundnar breytur fyrir main?
Apparently ekkert, svo að sneið raun tóm eða ekki eins stór
eins og ég hef dregið hana.
En í f, ég á staðnum breytu, sem heitir x.
Þannig að ég ætla að fara á undan og gefa f bútur af minni, kalla það x.
>> Og nú malloc af 10 sinnum 4, Svo malloc 40, hvar er þessi
minni koma frá?
Við höfum ekki dregið upp mynd svona áður.
En við skulum gera ráð fyrir að það er í raun koma héðan, svo einn,
tveir, þrír, fjórir, fimm.
Og nú þarf ég 40 af þeim.
Svo ég ætla bara að gera punkt, punktur, punktur að benda að það er jafnvel meira minni
koma aftur frá hrúga.
Nú hvað er heimilisfangið?
Skulum velja handahófskennt okkar taka eins og alltaf -
Ox123, jafnvel þó að það er líklega að fara að vera eitthvað allt öðruvísi.
Það er heimilisfang fyrsta bæti í minni sem ég er að biðja malloc fyrir.
>> Svo í stuttu máli, einu sinni línu 20 keyrir, hvað er bókstaflega
geymd inni x hér?
Ox123.
Og Ox er uninteresting.
Það þýðir bara hér er sextánskur númer.
En hvað er lykillinn er það sem ég hef geymt í x, sem er staðbundin breytu.
En gögn gerð þess, aftur, er heimilisfang af int.
Jæja, ég ætla að geyma Ox123.
En aftur, ef það er aðeins of flókið óþörfu, ef ég skruna
aftur, getum við fræðilega þetta í burtu alveg sæmilega og bara segja að x er
músina til að klumpur af minni.
>> OK.
Nú er spurningin á hönd er eftirfarandi -
lína 21, það kemur í ljós, er þrjótur.
Hvers vegna?
>> Því miður?
Það þarf ekki -
segja að einu sinni enn.
Jæja, er það ekki frjáls.
Svo er það annað en.
Svo er það eitt annað en sérstaklega á línu 21.
>> Einmitt.
Þessi einfalda lína af kóða er bara biðminni flæða, biðminni umframmagn.
A biðminni þýðir bara klumpur af minni.
En þessi klumpur af minni er stærð 10, 10 heiltölur, sem þýðir að ef við
Vísitala inn í það með því að nota nokkur dæmi um setningarleg sykur af merki array, veldi
sviga, hefur þú aðgang að x krappi 0 x krappi 1 x,
krappi punktur, punktur, punktur.
x krappi 9 er stærsta einn.
Svo ef ég x krappi 10, þar Ég er reyndar að fara í minni?
>> Jæja, ef ég hef 10 int -
skulum draga í raun allt þessara hér.
Svo sem var fyrsta fimm.
Hér er önnur fimm ints.
Svo er x krappi 0 hér. x krappi 1 er hér. x krappi 9 er hér. x krappi
10 er hér, sem þýðir að ég er að segja, í samræmi 21. tölva til setja
númer þar?
Talan 0 hvar?
Jæja, það er 0, já.
En bara sú staðreynd að 0 þess er eins konar tilviljun.
Það gæti verið númer 50, fyrir allt við sama.
En við erum að reyna að setja það á x krappi 10, sem er þar sem þessi
spurningarmerki er dregin, sem er ekki gott.
Þetta forrit gæti mjög vel hrun í kjölfarið.
>> Nú, við skulum fara á undan og sjá hvort þetta er reyndar hvað gerist.
Gerðu minni, þar sem skrá er kallað memory.c.
Við skulum fara á undan og keyra the program minni.
Þannig að við fengum heppinn, reyndar virðist það.
Við fengum heppinn.
En við skulum sjá hvort við hlaupum nú Valgrind.
Við fyrstu sýn, áætlun mín gæti virðast vera fullkomlega rétt.
En láta mig hlaupa Valgrind með - Leka-stöðva jafngildir fullur á minni.
>> Og nú þegar ég keyrt þetta -
áhugavert.
Ógildur skrifa af stærð 4 á lína 21 af memory.c.
Lína 21 af memory.c er hver?
Ó, áhugavert.
En bíddu.
Stærð 4, hvað er að vísa til?
Ég bara gerði einn skrifa, en það er stærð 4..
Hvers vegna er það 4?
Það er vegna þess að það er int, sem er, aftur, fjögur bæti.
Svo Valgrind fundið galla sem ég, glancing á númerið mitt, gerði það ekki.
Og kannski TF þinn vildi eða vildi ekki.
Hvað En Valgrind fyrir víst komist að við höfum gert mistök þarna, jafnvel
þó að við fengum heppinn, og tölvan ákveðið, ha, ég er ekki að fara að hrun
bara vegna þess að þú snert eitt bæti, einn Int er virði af minni sem þú gerðir ekki
raunverulega eiga.
>> Jæja, hvað er þrjótur hér.
Heimilisfang -
þetta er brjálaður útlit netfang í sextánskur.
Það þýðir bara einhvers staðar í hrúga er núll bytes eftir blokk af stærð 40
er úthlutað.
Leyfðu mér að súmma út hér og sjá hvort þetta er svolítið meira gagni.
Áhugavert.
40 bytes eru örugglega misst í skrá tap 1 af 1.
Aftur, fleiri orð en er gagnlegt hér.
En byggt á undirstrikuð línur, hvar ætti ég að einbeita líklega minn
athygli fyrir aðra galla?
Útlit eins og a línu 20. memory.c.
>> Þannig að ef við förum aftur til línu 20, sem er eitt sem þú tilgreindir áðan.
Og það er ekki endilega þrjótur.
En við höfum þetta snúist áhrifum hennar.
Svo hvernig gera rétt ég að minnsta kosti einn af þeim mistökum?
Hvað gæti ég gert eftir línu 21?
Ég gæti gert án x, svo er að gefa til baka að minni.
Og hvernig laga ég þetta galla?
Ég ætti örugglega að fara ekki lengra en 0.
Svo láta mig reyna aftur keyra þetta.
Því miður, ákveðið að fara ekki lengra en 9.
Gerðu minni.
Leyfðu mér að endursýning Valgrind í stærri glugga.
Og nú líta.
Nice.
Allar hrúga blokkir voru leystur.
Enginn leki eru mögulegar.
Og upp yfir hér, það er ekki minnst lengur að ógilda hægri.
>> Bara til að fá gráðugur, og skulum sjá hvort annað sýning
ekki fara eins og ætlað -
Ég gerði fá heppinn fyrir augnabliki.
Og sú staðreynd að þetta er 0 er ef til vill óþarflega villandi.
Við skulum bara gera 50, nokkuð handahófskennt númer, gera minni punktur skástrik minni -
enn fá heppinn.
Ekkert er hrun.
Segjum ég bara eitthvað virkilega heimska, og ég 100.
Leyfðu mér að endurgerð minni, punktur rista minni -
fékk heppinn aftur.
Hvernig óður í 1000?
ints umfram það bil, þar sem ég ætti að vera?
Gerðu minni -
fjandinn.
>> [Hlátur]
>> OK.
Við skulum ekki skipta um lengur.
Endursýning minni.
Þar við förum.
Allt í lagi.
Svo virðist þú vísitölu 100.000 ints utan þar sem þú ættir að hafa verið í
minni, gerast slæmur hlutur.
Svo er þetta augljóslega ekki harður, fljótur reglu.
Ég var eins konar nota prufa og villa til að komast þangað.
En þetta er vegna þess, löng saga stutt, minni tölvunnar er einnig skipt
í þessum hlutum sem kallast hluti.
Og stundum, the tölva í raun hefur gefið þér smá meira minni
en þú biður um.
En fyrir skilvirkni, það er bara auðveldara að fá meira minni en aðeins segja þér
að þú ert að fá hluta af henni.
>> Og ef þú færð heppinn stundum, því þú might vera fær til snerta
minni sem ekki tilheyrir þér.
Þú hefur ekki trygging fyrir því að það gildi þú setur það mun vera þar, því
tölvan heldur enn það er ekki Kveðja, en það er ekki endilega að fara
að lemja aðra hluti af minni í tölva og valdið mistök eins
þetta hér.
Allt í lagi.
Einhverjar spurningar þá á minni?
>> Allt í lagi.
Skulum taka a líta hér, þá á eitthvað sem við höfum verið að taka fyrir
veitt fyrir alveg sumir tími, sem er í þessari skrá sem heitir cs50.h.
Þannig að þetta er skrá.
Þetta eru bara allt fullt af athugasemdir up ofan.
Og þú gætir hafa horft á þetta ef þú pota í kring á tækinu.
En það kemur í ljós að allan tímann, þegar við notuðum til að nota band sem
samheiti, leið sem við lýst sem samheiti var með þetta
leitarorð typedef, fyrir skilgreiningu tegund.
Og við erum í raun að segja, að band samheiti fyrir bleikju stjörnu.
Það leiðir sem stafla búin þessa þjálfun hjól þekktur sem
band.
>> Nú er hér bara frumgerð fyrir getchar.
Við gætum hafa séð það áður, en það er örugglega hvað það gerir. getchar
tekur engin rök, skilar bleikju.
getdouble tekur engin rök, skilar tvöfalt.
getfloat tekur ekki rökum, ávöxtun að fljóta, og svo framvegis.
GetInt er hér. getlonglong er hér.
Og getstring er hér.
Og það er það.
Þetta fjólubláa línan er annar Preprocessor tilskipun vegna þess að
hashtag í upphafi þess.
>> Allt í lagi.
Svo nú langar mig að fara í cs50.c.
Og við munum ekki tala of lengi á þetta.
En til að gefa þér innsýn í hvað er verið að fara á allt þetta
tími, láttu mig fara til -
skulum gera getchar.
Svo er getchar mestu athugasemdir.
En það lítur út eins og this.
Svo er þetta í raun virka getchar sem við höfum verið
taka sem sjálfsögðum hlut til.
Og jafnvel þó að við höfum notað þetta ekki einn sem oft, ef nokkurn tíma, það er að minnsta kosti
tiltölulega einfalt.
Svo það er þess virði að taka fljótur líta á hér.
>> Svo hefur getchar óendanlega lykkju, vísvitandi svo virðist.
Það kallar þá - og þetta er eins konar nice endurnýtingu kóða við sjálf skrifaði.
Það kallar getstring.
Vegna þess að það gerir það meina að fá bleikju?
Jæja, þú might eins og heilbrigður reyna að fá allt lína af texta frá notanda og
þá bara að líta á einn af þeim stafi.
Í samræmi 60, hér er smá hluti af andleg heilbrigði stöðva.
Ef getstring aftur null, skulum ekki halda áfram.
Eitthvað fór úrskeiðis.
>> Nú er þetta nokkuð pirrandi en venjulegur í C. bleikju max sennilega
táknar það bara byggist á heiti þess?
Það er stöðug.
Það er eins og tölugildið af Stærsta bleikju þú getur táknað með
eitt bit, sem er líklega númer 255, sem er stærsta númerið sem
tákna átta bita, byrja frá núlli.
Þannig að ég hef notað þetta, í þessari aðgerð, þegar skrifa þennan kóða, bara vegna þess að
ef eitthvað fer úrskeiðis í getchar en tilgangur þess í lífinu er að fara aftur á
bleikju, þú þarft að einhvern veginn að geta að merki til notanda sem
eitthvað fór úrskeiðis.
Við getum ekki snúið aftur null.
Það kemur í ljós að null er bendillinn.
Og aftur, getchar hefur að skila bleikju.
>> Svo venju, ef eitthvað fer rangt, er þú, sem forritari, eða í
þetta mál, með bókasafni mig, ég hafði A ákveðið bara geðþótta, ef
eitthvað fer úrskeiðis, ég ætla að til baka í númerið 255, sem er sannarlega
þýðir að við getum ekki, getur notandinn ekki að slá eðli fulltrúa af
númer 255 því við vorum að stela henni sem svokölluðu Sentinel gildi til
tákna vandamál.
Nú kemur í ljós að eðli 255 er ekki eitthvað sem þú getur slegið á
lyklaborðið, svo það er ekki máli.
Notandinn hefur ekki tekið eftir því Ég hef stolið þennan staf.
En ef þú sérð alltaf í síðum mann á tölvukerfi sumir tilvísun til
allar húfur stöðug eins og þetta sem segir, í tilvikum villu þetta fastan gæti
skilað, það er allt sumir menn gerðu árum var geðþótta ákveðið að
aftur þetta sérstaka gildi og kalla það stöðugt í tilfelli
eitthvað fer úrskeiðis.
>> Nú gerist galdur niður hér.
Fyrst, ég er að lýsa í línu 67 tveir stafir, C1 og C2.
Og þá í línu 68, það er í raun A lína af kóða sem er minnir á
vinur okkar printf, í ljósi þess að það hjartarskinn hafa prósent CS innan gæsalappa.
En taka eftir hvað er að gerast hér. sscanf þýðir band grannskoða -
þýðir skanna sniðinn band, Ergo sscanf.
Hvað þýðir það?
Það þýðir að þú fara til sscanf streng.
Og lína er hvað sem notandinn slær inn
Þú fara að sscanf sniði band eins þetta sem segir scanf hvað eru
þú vona að notandinn hefur slegið inn
Þú framhjá-í þá heimilisföng tveggja klumpur af minni, í þessu tilfelli,
vegna þess að ég hef tvær staðgengla.
Þannig að ég ætla að gefa það heimilisfang af C1 og veffang C2.
>> Og muna að þú gefur fall sem heimilisfang sumir breytu, hvað er
The vísbendingu?
Hvað er hægt að virka að gera sem afleiðing að gefa það veffang sem
breytilegt, í stað þess að breytan sig?
Það getur breytt því, ekki satt?
Ef þú hefðir einhvern korti til líkamlega heimilisfang, geta þeir fara þangað og gera
hvað sem þeir vilja á þetta netfang.
Sama hugmynd hér.
Ef við fara til sscanf, heimilisfang tveggja klumpur af minni, jafnvel þessir pínulítill
litla klumpur af minni, C1 og C2, en við segja það veffang þeirra,
sscanf getur breytt því.
>> Svo tilgangur sscanf í lífinu, ef við lesum maðurinn síðu, er að lesa það sem
notandi slegið inn, vona að notandi að þurfa slegið í karakter og kannski
annað eðli, og hvað notandinn slegið, fyrsti stafurinn fer
hér, annað eðli fer hér.
Nú, eins og innskot, þetta, og þú vildi aðeins vita þetta úr gögnum,
sú staðreynd að ég setti inn bil þar þýðir bara að ég er alveg sama þótt
notandinn smellir á bil bar nokkrar sinnum áður en hann eða hún tekur
eðli, ætla ég að hunsa allir hvítt rúm.
Svo að, ég veit af skjölin.
>> Sú staðreynd að það er annað% C eftir hvítum rúm er í raun
vísvitandi.
Ég vil vera fær um að uppgötva ef notandinn ruglaður upp eða ekki vinna.
Þannig að ég er að vonast til þess að notandinn aðeins slegið í einum staf, því ég er að vonast
að sscanf er bara að fara að skila gildi 1. vegna þess, aftur, ef ég las
skjölin, tilgangur sscanf í lífið er að fara aftur til fjölda
breytur sem voru fyllt með notandi inntak.
>> Ég fór í tveimur breytum heimilisföng, C1 og C2.
Ég vona þó, að aðeins einn af þá fær drepinn vegna þess að ef sscanf
skilar 2, hvað er væntanlega The vísbendingu rökrétt?
Að notandinn ekki bara gefa mér einn eðli eins og ég sagði honum eða henni.
Þeir slegið líklega amk tveir stafir.
Þannig að ef ég staðinn ekki hafa annað % C, ég þurfti bara einn, sem
hreinskilnislega væri meira innsæi nálgun, ég held fyrstu sýn,
þú ert ekki að fara að vera fær um að uppgötva ef notandi hefur verið að gefa þér meira
inntak en þú vildir í raun.
Svo er þetta óbeina mynd af stöðva villa.
>> En taka það sem ég geri hér.
Þegar ég er viss um að notandinn gaf mér einn eðli, losa ég línu, gera
andstæða getstring, sem aftur notar malloc, og þá er ég aftur
C1, eðli sem ég vonast til að notandi veitt og einungis veitt.
Svo fljótur glittir aðeins, en einhverjar spurningar um getchar?
Við munum koma aftur til sumir af the annar.
>> Jæja, láttu mig fara á undan og gera þetta - Segjum nú, bara til að hvetja okkar
umfjöllun í viku plús tíma, þetta er skrá sem heitir structs.h.
Og aftur, þetta er bara bragðið um eitthvað sem framundan er.
En eftir því mikið þetta er athugasemdir.
Svo láta mig benda aðeins áhugaverður hluti fyrir nú.
typedef -
það er sama leitarorð aftur.
typedef við notum til að lýsa band sem sérstakt gögn tegund.
Þú getur notað typedef að búa til vörumerki nýr gögn tegundir sem ekki eru fyrir hendi þegar
C var fundið.
Til dæmis, int koma með C. bleikju koma með C. tvöfaldur koma með C. En
það er engin hugmynd um nemanda.
Og enn væri nokkuð gagnlegt til að vera fær að skrifa forrit sem geymir
í breytu, kennitala nemandans, nafn þeirra, og hús þeirra.
Í öðrum orðum, þrjú stykki gagna, eins og við int og
band og annar strengur.
>> Með typedef, hvað er nokkuð öflugur um þetta og leitarorðið sturct fyrir
uppbyggingu, þú forritari árið 2013, geta í raun skilgreina Eiga þinn
gögn tegundir sem ekki eru fyrir hendi ár síðan en það hentar tilgangi þínum.
Og svo hér í línum 13. með 19, við erum að lýsa yfir ný gögn tegund, eins og
int, en kalla það nemandi.
Og innan þessa breytu er að fara að vera þrír hlutir - int, a band,
og streng.
Svo er hægt að hugsa um hvað er í raun gerðist hér, jafnvel þó að þetta sé
hluti af einföldun í dag, nemandi er í raun að fara
að líta svona út.
Þess að fara til vera a klumpur af minni með ID, nafn
sviði, og hús sviði.
Og við munum vera fær um að nota þá klumpur af minni og nálgast þær sem hér segir.
>> Ef ég fer inn struct0.c, hér er tiltölulega langur, en í kjölfar
mynstur, af kóða sem notar þetta nýtt bragð.
Svo fyrst, láta mig að vekja athygli þína að áhugaverðum hlutum upp ofan.
Sharp skilgreinir nemendur 3, lýsir fastann nemendur og úthlutar
það geðþótta fjölda 3, bara þannig að ég hef þrjá nemendur með
þetta forrit fyrir nú.
Hér kemur Main.
Og tilkynningu, hvernig ég staðfesti fylki nemenda?
Jæja, ég nota bara sama setningafræði.
Orðið nemandi er augljóslega ný.
En nemandi, flokkur, krappi nemendur.
>> Svo því miður er mikið endurnýta á hugtökum hér.
Þetta er bara tala.
Svo er þetta eins og að segja þrjár.
Class er bara það sem ég vil til að hringja í breytu.
Ég gæti kalla það nemendur.
En flokkur, þetta er ekki tegund í að mótmæla stilla Java konar hátt.
Það er bara flokkur nemenda.
Og gögn gerð af sérhver frumefni í því fylki er nemandi.
Þannig að þetta er svolítið öðruvísi og frá að segja eitthvað
eins og þetta, það er bara -
Ég er að segja gefa mér þrjár nemendur og kalla þessi array bekknum.
>> Allt í lagi.
Nú er hér fjögurra lykkja.
Þekki þennan gaur er - iterate frá núll á allt að þremur.
Og hér er ný stykki af setningafræði.
The program er að fara að hvetja mig, manna, að gefa það a nemandi
ID, sem er int.
Og hér er setningafræði sem þú getur geyma eitthvað í ID sviði á
Staðsetning flokki krappi I. Svo þetta setningafræði er ekki nýr.
Þetta þýðir bara að gefa mér áttundi nemandi í bekknum.
En þetta tákn er nýtt.
Hingað til höfum við getum ekki notað punkt, amk í kóða svona.
Þetta þýðir að fara á strúktúr sem kallast nemandi og setja eitthvað þar.
Á sama hátt, í þessu næstu línu, 31, fara undan og setja hvað sem notandinn slær
að nafni hér og hvað þeir gera fyrir hús, það sama, fara á undan og
setja það í. húsinu.
>> Svo hvað þýðir þetta forrit lokum gera?
Þú getur séð smá beitu þar.
Leyfðu mér að fara á undan og gera structs 0 punktur rista struct 0, ID nemandans 1,
segja David Mather, nemandi ID 2..
Rob Kirkland, nemandi ID 3..
Lauren Leverit -
og það eina sem þetta forrit gerði, sem er bara alveg handahófskennt, er
Mig langaði til að gera eitthvað við þessum gögnum, nú að ég hef kennt okkur hvernig á að
nota structs, er ég hafði bara Þessi auka lykkja hér.
Ég iterate yfir fjölda nemenda.
Ég notaði, okkar kannski nú þekki vin, band bera, stircomp til
stöðva er hús 8 nemandans jafnt Mather?
Og ef svo er, bara prenta eitthvað geðþótta eins, já, það er.
En aftur, bara að gefa mér tækifæri að nota og endurnýta og
endurnýta þetta nýja punktur tákn.
>> Svo hver blíðuhót, ekki satt?
Tilkoma upp með nemandi program er nokkuð handahófskennt, en það kemur í ljós
að við getum gert gagnlegur hlutur með þetta, til dæmis eins og hér segir.
Þetta er miklu flóknara strúktúr í C. Það er got a tylft eða fleiri sviðum,
nokkuð cryptically heitir.
En ef þú hefur einhvern tíma heyrt af grafík skráarsnið sem heitir punktamynd, BMP, það
kemur í ljós að punktamynd skrá snið laglegur lítur mikið eins og þessi það.
Það er heimskulegt lítið bros andlit.
Það er lítið mynd sem ég hef aðdregna í á nokkuð stór svo að ég gæti séð hver
einstakra punkta eða díla.
Nú snýr það út að við getum táknað með svartur punktur með, segja, að talan 0.
Og hvítt punktur með númer 1.
>> Svo í öðrum orðum, ef þú vilt að teikna Smiley andlit og vista sem mynd í
tölva, nægir það til að geyma núll og þau sem líta út eins og þetta, þar,
aftur, eru þær hvítar og núll eru svartir.
Og saman, ef þú hefur í raun A gyrða af sjálfur og núll, þú hafa a
rist punkta, og ef þú leggja þá út, þú sætur
lítið bros andlit.
Nú, punktamynd skrá snið, BMP, er raun að undir hetta,
en með fleiri punkta Sot sem þú geta í raun tákna liti.
>> En þegar þú ert með fleiri háþróaður skrá snið eins og BMP og JPEG og GIF
sem þú gætir verið kunnugt, þá skrár á diski yfirleitt ekki aðeins
hafa núll og sjálfur fyrir punkta, en þeir hafa sumir lýsigögn eins vel -
Meta í þeim skilningi sem er í raun ekki gögn en það er gott að hafa.
Svo þessir reitir hér eru að gefa til kynna, og við munum sjá þetta nánar í P-setja
5, að áður en núll og sjálfur að tákna punktar í mynd,
það er fullt af lýsigögn eins the stærð af myndinni og
breidd myndarinnar.
Og eftir ég ætla plokkun burt sumir handahófskennt hlutir hér -
breidd og hæð.
Bit telja og nokkur önnur atriði.
Svo er það einhver lýsigögn í skrá.
>> En með því að skilja hvernig skrár eru sett út á þennan hátt, getur þú í raun
þá vinna myndir, batna myndir af diski, búa ímynd.
En þú getur ekki endilega auka þau.
Ég þurfti mynd.
Svo ég fór aftur til RJ hér, sem þú sást á skjánum alveg sumir tími fyrir.
Og ef ég opna grunntónn hér, þetta er hvað gerist ef þú reynir að súmma inn og
auka RJ.
Hann er ekki að fá allir betri raun.
Nú er Keynote konar blurring það svolítið, bara til að gljái yfir
staðreynd að RJ ekki fá sérstaklega auka þegar þú zoom inn
Og ef gera það með þessum hætti, sjá ferninga?
Já, getur þú ákveðið að sjá reitirnir á skjávarpa.
>> Það er það sem þú færð þegar þú bæta.
En í því að skilja hvernig RJ okkar eða Smiley andlit er útfærð vilja láta okkur
reyndar skrifa kóða sem vinnur þetta.
Og ég hélt að ég myndi enda á þessum minnismiða, með 55 sekúndur af auka það er,
Ég þori að segja frekar villandi.
>> [Vídeó spilun]
>> -Hann er að ljúga.
Um hvað veit ég ekki.
>> -Og hvað vitum við?
>> -Það á 09:15 Ray Santoya var á hraðbanka.
>> -Svo er spurning hvað var hann að gera á 9:16?
>> -Skjóta níu millimetra á eitthvað.
Kannski hann sá leyniskytta.
>> -Eða var að vinna með honum.
>> -Bíddu.
Fara aftur um eitt.
>> -Hvað sérð þú?
>> -Koma andlit hans upp, fullur skjár.
>> -Hans gleraugu.
>> -Það er spegilmynd.
>> -Það er Neuvitas Baseball lið.
Það er merki þeirra.
>> -Og hann er að tala við hver sem er þreytandi að jakka.
>> [END vídeó spilun]
>> DAVID J. Malan: Þetta mun vera Heimadæmi 5.
Við munum sjá þig í næstu viku.
>> MALE Ræðumaður: Á næstu CS50.
>> [Crickets chirping]
>> [Tónlist spila]