>> [Muzikavimo]
>> Davidas J. Malan: Gerai.
>> [Juokas]
>> Sveiki sugrįžę.
Tai CS50.
Ir tai savaitės penkių pabaiga.
Ir iki šiol, mes gana daug vartojate savaime suprantamu dalyku, kad
egzistuoja šio kompiliatoriaus, žvangėti, kad jūs buvo remtis taikant šį
kitas įrankis vadinamas Padaryti, kad kažkaip stebuklingai paverčia savo kodą
į sukompiliuoti, kad nulių ir kad jūsų kompiuterių procesorius, centrinis
duomenų apdorojimo blokas, iš tikrųjų supranta.
Tačiau paaiškėja, kad tai skaičius, kuris yra vyksta po gaubtu ir
tarp įvesties ir išvesties.
>> Ir aš norėčiau pasiūlyti, kad mes kūnas kad šiek tiek išsamiau į iš
šie keturi žingsniai, turi kažką vadinama išankstinio apdorojimo, kažkas
vadinamas kompiliavimas, kurį mes matėme, kažkas vadinamas surinkimo ir
kažkas vadinamas susiejimas.
Taigi iki šiol, kai kurie iš mūsų programas, mes buvo aštrus yra.
Visai neseniai mes turėjome šiek tiek aštrus apibrėžia konstantų.
Taigi paaiškėja, kad tie dalykai, kurie priešdėliu su grotelėmis arba
svaras simbolis yra iš anksto procesorius direktyvas.
Tai tik išgalvotas būdas pasakyti tai kodo eilutę, kad tikrai
virsta kažkuo kitu prieš kompiuteris net bandyti konvertuoti jūsų
programą į nulių ir.
>> Pavyzdžiui, aštrių apima standartą I / O. H gana daug tiesiog reiškia eiti
į priekį, patraukti failų turinį stdio.h ir įklijuoti juos tiesiai ten.
Taigi nėra nulių ir tuo momentu dar.
Tai tikrai tiesiog pakeisti.
Ir tai daroma per vadinamųjų išankstinio apdorojimo etapas, kai
iš tikrųjų paleisti Zaszczękać arba konkrečiai Padaryti daugeliu atvejų.
Taigi visa tai buvo daroma Pirmasis automatiškai šiol.
>> Tada ateina rengimo žingsnis.
Bet mes jau supaprastino rinkinys.
Kaupti programą iš tikrųjų reiškia jį iš kažko panašaus C
kodo mes jau raštu, žemyn į kažką vadinama surinkimas.
Asemblerio kalba yra žemesnio lygio kalba, kuri, laimei, mes ne
turi daug proga parašyti šį semestrą.
Bet tai ne žemiausio lygio per jausmas, kad jūs tiesiog pradėkite rašyti
pridėti ir atimti ir dauginti ir apkrovos iš atminties ir įrašyti į atmintį,
labai paprastas instrukcijas, kad kompiuteris, po gaubtu,
iš tikrųjų supranta.
>> Galiausiai, montavimas užima tą kalbą į nulių ir kad mes buvo
aprašyti iki šiol.
Ir tikrai galiausiai, yra vadinamasis susiejimas etapą, kuris mes atsiųsime
matyti tik akimirką, kuris sujungia jūsų nulių ir nuliai ir
tie kiti žmonės prieš jūs sukūrėte.
>> Taigi, mano, kad tai super paprasta programa.
Jis buvo iš savaitės 1.
Jis tiesiog pasakė, Hello World, ekrane.
Įvyko tai per žvangėjimas.
Arba mes bėgo per Padaryti kuris vyko žvangėjimas.
Ir išvedamas tuo metu, kai kai nulių ir.
Tačiau paaiškėja, nėra tarpinis žingsnis.
Jeigu aš eiti per čia - Oi, nebuvo noriu jį pamatyti dar.
Jei aš einu čia mano prietaiso ir aš atverti hello.c čia
yra ta pati programa.
Ir ką aš ruošiuosi daryti mano terminalo langas čia aš ruošiuosi
paleisti Zaszczękać o ne padaryti, o automatizuoja apie visus keturis
Asmenys, atsakingi už mūsų veiksmus.
Ir aš ruošiuosi daryti Zaszczękać-S ir tada hello.c ir įveskite.
>> Ir man mirksi greitai vėl, kas yra gera.
O dabar šiek tiek daugiau lange, Aš einu atverti gedit čia.
Ir aš ruošiuosi atidaryti failą, kad, Pasirodo, yra vadinamas hello.s tai
yra ta, Asemblerio kalba Aš nurodytas anksčiau.
Ir tai yra tai, kas vadinama surinkimas kalba, gana žemo lygio
instrukcijos, kad jūsų "Intel" procesorius arba kokia ji yra, kad viduje
supranta.
Ir mov yra kelyje. pasisako už skambina, labai žemo lygio funkciją.
pietus yra atimti.
>> Taigi, kai jūs turite tam tikrą procesoriaus viduje kompiuterio, ką daro jį
skirtingos, palyginti su kitų procesorių apie rinkos, yra kurie instrukcijos tai
supranta ir dažnai, kaip efektyviai jis yra, kaip greitai jis yra vykdančiosios kai
pirmiau minėtų nurodymų.
Dabar daugiau apie tai, galite imtis Kitą rudenį CS61 koledže.
Bet čia mes turime, pavyzdžiui, mažai identifikatoriai, kuriuos gali atrodyti pažįstamas.
hello.c yra programos pavadinimas.
>> . Tekstas -
nėra daug interesų yra tik dabar, priminti, kad tekstas
segmentas, kadangi pirmadienį, yra kur atminties jūsų programa faktiškai baigiasi.
Štai bent miglotai susipažinęs ten.
Čia, žinoma, yra paminėti Mūsų pagrindinės funkcijos.
Pereikite, tai susiję su dalykų vadinami registrai, labai smulkus gabaliukus
atminties viduje jūsų faktinį procesoriaus.
Ir jei aš slinkti žemyn net Be to, matau kažkokį
netiesioginis paminėjimas ASCII.
Ir, žinoma, yra tai, kad eilutė, Sveiki, kablelis pasaulį.
>> Taigi Trumpai tariant, tai buvo vyksta už jus, automatiškai
po gaubtu visą šį laiką.
Ir tai, kas buvo daroma tikrai yra vieną kartą jūs paleisti Zaszczękać, arba pagal
Padaryti, kad jūs gaunate pirma, iš šaltinio kodą,
vadinamasis Asemblerio kalba.
Tada Zaszczękać yra konvertuoti šį surinkimas kalba iki nulių ir.
Ir tai yra skaidrių, kad mes pradėjome mūsų diskusija savaitę 0 m -
ir tada Savaitė 1 m.
Ir galiausiai, tie nuliai ir tie derinami su nulių ir
iš šių bibliotekų mes jau vartojate savaime suprantamu dalyku, kaip Standard I / O arba
Styginių biblioteka ar net CS50 biblioteka.
>> Taigi dažų šią nuotrauką daugiau vizualiai, mes turime hello.c.
Ir tai, žinoma, naudoja printf veikti sakyti, hello world.
Rengimo etapas trunka jį žemyn kad byla mes tik pamačiau hello.s, net
nors tai paprastai ištrintas automatiškai.
Bet tai surinkimas kodas viduryje žingsnio.
Ir tada, kai mes surinkti surinkimas kalba, taip sakant, kad, kai jūs
gauti tuos nulių ir.
Taigi mes Mastelis efektyviai šiandien ką mes vartojate savaime suprantamu dalyku,
tai vyksta kodą objekto kodo.
>> Bet galiausiai, kad dabar pats vaizdas - tegul įgrūsti jį į
kairėje pusėje.
Ir atkreipkite dėmesį, kad viršuje yra Minėjau stdio.h.
Tai byla, kad mes įtraukti beveik visi
programos mes raštu.
Ir tai failas, kurio turinys gauti kopiją įklijuoti,
efektyviai ant savo kodą.
Tačiau paaiškėja, kad kompiuteryje sistema kažkur, ten matyt
stdio.c failą, kad kažkas rašė metų prieš, kad įgyvendina visas
funkcijos, kurios buvo deklaruotos į stdio.h.
>> Dabar iš tikrųjų tai turbūt ne jūsų Mac arba jūsų kompiuterio ar net
CS50 prietaisas yra žalias C kodas.
Kažkas jau parengė jį ir įtraukti Õ. Failą sukompiliuoti programų tekstai arba.
failą, kuris nurodo shared library tai buvo iš anksto įdiegta ir
iš anksto surinkti už jus.
Bet tarkime, kad ten iš tikrųjų egzistuoja mūsų kompiuterio stdio.c lygiagrečiai
su žvangėjimas.
Jūsų kodas manimi buvo parengta ir surinkti.
stdio.c s kodas yra kaupiami ir surinkti, kad tai paskutinis
žingsnis, žemyn čia, mes turime kažkaip nuoroda, taip sakant, jūsų nulių ir
su jo ar jos nulių ir į vieną paprasta programa, kuri galiausiai yra
vadinamas tiesiog Sveiki.
>> Štai visa magija, kad yra buvo daroma iki šiol.
Ir toliau imsis šių procesai savaime suprantamu dalyku, bet suprasti
ten sultingas detales daug vyksta po ten.
Ir tai, ką daro jūsų kompiuteris su Intel Inside
ypač ryškūs.
>> Taigi dėl šio rašto, jei norite prisijunk prie mūsų pietų šį penktadienį, tai eiti
į įprastą vietą cs50.net/rsvp, 13:15 šį penktadienį.
O dabar keletas pranešimai.
Taigi mes turime gerų naujienų.
Ir mes turime blogų naujienų.
Pradėti gerų naujienų čia.
>> [Dejuoja]
>> Gerai.
Na, tai techniškai šventė, todėl tai ne tiek daug iš mūsų dovana.
Bet tada bloga žinia žinoma.
>> [Dejuoja]
>> Aš praleido daug laiko šių animacija.
>> [Juokas]
>> Bus apžvalga sesija ateinantį pirmadienį.
Tai bus 5:30 val.
Mes jums priminti, visų šių detalių elektroniniu paštu apie aikštyno
svetainėje vos per kelias dienas laiko pora.
Jis bus filmuojamas ir prieinami netrukus.
Taigi, jei jūs negalite padaryti, kad pirmadienis naktį lizdas, nesijaudinkite.
Profiliai ateinančiais savaitę taip pat bus sutelkti dėmesį į peržiūros dėl viktorina.
Jei jūsų skyriuje yra pirmadienį, kuris yra Iš tiesų universitetas šventė, mes
vis dar atitinka skyriuje.
Jei tiesiog negali padaryti, kad skyriuje, nes jūs ketinate
žmones, kad viskas gerai.
Dalyvauti sekmadienis arba antradienis skirsnyje arba tune-in Jasono skyriuje, kuris yra
galima rasti internete.
>> Taigi, daugiau blogų naujienų.
Taigi pagal mokymo programą, mes turime paskaitą kitą penktadienį.
Bet gera žinia -
aiškiai, aš praleido daug laiko apie tai.
>> [Juokas]
>> Anulujemy kitą penktadienį paskaitų.
Taigi, kad bus mums dovana, kad jūs tikrai gali turėti gražią atokvėpis
nuo šios savaitės ir dviejų savaičių taigi.
Taigi ne paskaitos kitą savaitę, tik maža mažai viktorina, už kurį turėtų būti
vis labiau susijaudinęs.
>> Taigi tegul dabar savo ruožtu mūsų dėmesį į kažkas, kad yra tikrai daugiau vaizdo
ir daugiau įdomių ir nustatyti etape už tai, kas bus dėl horizonto
vos per kelias savaites laiko pora.
Po pirmojo viktorinos, mes savo ruožtu sutelkti mūsų problema rinkinių kitą
Specifinė problema, kad Teismo ekspertizės ar saugumo apskritai.
>> Tiesą sakant, su šia problema tradicija rinkinys yra man vienas iš
mokymo bendradarbis ar CAS vaikščioti visoje Campus turėkite nuotraukas
identifikuojamas, bet ne akivaizdus žmonės, vietų, arba ką, tada kiekvienais metais aš
kažkaip sugeba netyčia ištrinti arba sugadinti skaitmeninį medijos kortelę
kad viduje mūsų fotoaparato.
Bet ne big deal.
Aš galiu eiti į priekį ir prijunkite kad į savo kompiuterį.
Galiu padaryti teismo įvaizdį, taigi kalbėti, kopijuojant nuliai ir
tie išjungt tos atminties kortelės, nesvarbu, ar jo SD kortelės arba Compact Flash kortelė arba
ką esate susipažinę su.
Ir tada mes galime perduoti, kad iš.
>> Ir todėl uždavinys, be kita ko, viskas jums, bus rašyti
C kodas, kuris susitraukia visa krūva JPEG man ir atskleidė bus
tie žmonės, vietos, ar dalykų.
Ir mes taip pat kalbėti, kad šios problemos nustatyti ir kelių dienų ateiti, apie
grafika apskritai.
Mes naudojome juos, žinoma, už išeiti.
Bet jūs tarsi savaime suprantamas dalykas egzistuoja tokie aukšto lygio sąvokos
iš stačiakampių ir ovalų.
Tačiau po gaubtu yra taškų.
Ir jūs turėjo pradėti galvoju apie tuos.
Ar jums p-rinkinys 4 galvoti apie tarp jūsų plytų spragą, kaip
greitai jūs kamuolys juda per ekranas išeiti.
Taigi yra tokia sąvoka taškeliai ekrane, kad yra
ateiti į žaidimą jau.
>> Dabar tai, ką matote, nors, yra tai, ką jūs gaunate kompiuterio ekrane.
Jeigu jūs kada nors stebėjo tam tikros prekės arba blogas televizija, šansai yra, jie gana daug
gydyti kaip technophobes auditoriją kas nelabai
žinoti daug apie skaičiavimas.
Ir todėl labai lengva policijos detektyvas pasakyti, jūs galite
valyti, kad už mane?
Arba padidinti, tiesa?
Didinti yra kaip Buzz žodis dauguma bet nusikalstamumu, susijusiu šou.
O realybė yra, jei jums imtis labai neryškus vaizdas įtariamasis daro
kažkas blogai, jūs negalite tik pagerintų.
Jūs negalite priartinti galo.
Jūs negalite matyti kažkieno žibėti akių padaręs, kad
ypač nusikaltimas, nepaisant paplitimas tai per televiziją.
>> Ir taip su tuo galime motyvuoti, kad Artėjantis Problema rinkinys su žvilgsnis
kai rodo, su kuria jūs gali būti susipažinę.
>> [VIDEO PLAYBACK]
>> -Gerai.
Dabar galime gauti gerą pažvelgti į jus.
>> -Laikykite jį.
Paleisti, kad atgal.
>> Palaukit.
Eiti į dešinę.
>> -Taip.
Šaldymo kad.
>> -Visas ekranas.
>> -Gerai.
Šaldymo kad.
>> Priveržkite ant, kad bus ya?
>> Vektoriaus į tą vaikiną iki galinio rato.
>> -Padidinti čia šioje vietoje.
>> -Su teise įrangą, nufotografuota gali būti išplėsta ir aštrus.
>> -Kas tai?
>> -Tai didinimo programos.
>> -Ar jums aišku, kad iki tokių yra?
>> -Aš nežinau.
Leiskite jį pagerinti.
>> -Didinti skyrių-6.
>> I sustiprino išsamiai ir -
>> -Aš manau, kad yra pakankamai padidinti.
Atleiskite jį į savo ekrane.
>> -Stiprinti savo akių atspindys.
>> -Leiskite paleisti tai per vaizdo stiprinimo.
>> -Edgaras tu gali sustiprinti tai?
>> -Laikykis.
>> -I've dirbu šį atspindys.
>> -Kažkas atspindys.
>> -Atspindys.
>> -Yra atspindys iš žmogaus veidą.
>> -Atspindys.
>> -Yra atspindys.
>> -Priartinimas ant veidrodžio.
>> -Jūs galite pamatyti atspindys.
>> -Ar jums padidinti atvaizdą iš čia?
>> -Ar jums padidinti jį čia?
>> -Ar galite jį pagerinti?
>> -Ar mes galime pagerinti tai?
>> -Ar galite jį pagerinti?
>> -Palauk sekundę, aš padidinti.
>> -Padidinkite į duris.
>> -X10.
>> -Zoom.
>> [Juokas]
>> -Move in
>> -Palauk, sustoti.
>> -Stop.
>> Pauzė jį.
>> Pasukti 75 laipsnių kampu aplink vertikalus prašom.
>> [Juokas]
>> -Stop, ir atgal į dalis prie durų dar kartą.
>> -Turite vaizdo stipriklis kad gali rastras?
>> -Gal mes galime naudoti Pradeep Sen būdas pamatyti į langus.
>> -Ši programinė įranga yra moderniausias.
>> -Ikona vertė yra išjungtas.
>> -Su teise derinys algoritmų.
>> -Jis ėmėsi apšvietimo algoritmai Kitas lygis, ir aš galiu naudoti juos
tobulinti šią nuotrauką.
>> -Lock ir padidinti z ašiai.
>> -Sustiprinti.
>> Užšaldyti ir sustiprinti.
>> [PABAIGA VIDEO PLAYBACK]
>> Davidas J. Malan: Taigi, problemą, 5 yra tai, kas laukia ten.
Taigi, mes netrukus gauti geresnį supratimą kada ir kodėl jums gali
ir mūsų negali padidinti tokiu būdu.
Bet pirmiausia, galime grįžti mūsų dėmesį kai kurių statybinių blokų mes
reikia, kad būtų galima pasakyti, kad istoriją.
>> Taigi priminti, kad mes patraukė šį paveikslėlį Pirmadienį ir šiek tiek praėjusią savaitę.
Ir tai apibūdina dalykų išdėstymą į kompiuterio atmintį
veikia kai programą.
Technologijų segmentas iki viršaus, priminti, reiškia su faktiniais nulių ir
kad kurti savo programą.
Yra, žemiau, kad kai kurie rengiami arba niezainicjowanego duomenų, kurie paprastai
nurodo tokius dalykus kaip konstantų arba stygos ar globalūs kintamieji, kurie
buvo paskelbta iš anksto.
Yra krūva, bet mes ateis atgal į, kad šiek tiek.
>> Ir tada ten kamino.
Panašiai kaip dėklų krūvą kavinė, tai yra, kai atminties gauna
sluoksniuota ir sluoksniuota, kai jūs ką daryti programoje?
Kas yra kamino naudoti?
>> Taip?
>> Call of funkcija.
Bet kuriuo metu galite skambinti funkcija, tai skiriamas rakštis atminties ITS
vietos kintamieji arba jo parametrai.
Ir pavaizduotomis piktogramo, matome, kad vieni paskesnė funkcija šaukiamas, kai to
ragina B skambučiai C ragina D, jie gauti sluoksniuotos ant kamino.
Ir kiekvienoje iš šių skiltelės atmintis yra iš esmės unikalus apimtis
šiai funkcijai, kuri, žinoma, yra problemiška, jei norite perduoti
iš vienos funkcijos į kitą gabalas duomenų, kuriuos norite jį
mutuoti arba pakeisti.
>> Taigi, kas buvo mūsų sprendimas, leidžianti Funkcija atstovauja po vieną krūvą
rėmo pakeisti atminties viduje kitos kamino tarpą?
Kaip šių dviejų kalbėti vienas su kitu?
Taigi, kaip rodykles arba adresus, kuris, vėlgi, tik aprašyti kur
atmintis, taikant konkrečios įkandimo skaičius, ypač
vertė gali būti nustatyta.
Taigi prisiminti paskutinį kartą per tęsėme istorija ir pažvelgė
gana Buggy programa.
Ir ši programa yra Buggy už kelių priežasčių, tačiau labiausiai neramina vienas
nes ji nesugeba patikrinti, kas?
>> Taip, jis nesugeba patikrinti įvestį.
Atsiprašome?
>> Jei tai ilgesnis nei 12 simbolių.
Taigi labai dailiai, kai skambinama memcopy, kurios, kaip rodo pavadinimas, tiesiog
kopijos atmintį Antru argumentu į pirmąjį argumentą.
Trečiasis argumentas, labai dailiai, yra tikrinama siekiant įsitikinti, kad jums nereikia
kopijuoti daugiau nei šiuo atveju, ilgis Baro, simbolių skaičius,
į paskirties vietą, kuri yra to masyvas C. Bet problema yra ta, kad tai, ką
jei C, tai nėra pakankamai didelis, dirbti, kad?
Jūs ketinate kopijuoti skaičių baitų, kad jūs buvote pateikta.
Bet ką iš tikrųjų turi daugiau baitų nei turite galimybių?
>> Na, ši programa labai kvailai tik aklai pajamos imtis bet tai
suteikta, labas Backslash 0 yra puiku, jei eilutė yra trumpas
pakankamai, pavyzdžiui, penkių simbolių.
Bet jei tai tikrai 12 ženklų arba 1200 simbolių, mes matėme paskutinį kartą
kad jūs tik ketina visiškai perrašyti atminties, kuri
nepriklauso jums.
Ir blogiausiu atveju, jei jūs įrašysite, kad raudona dalis ten, kad mes vadinami
atgalinis adresas -
tai tik ten, kur kompiuteris automatiškai už jus, už
scenos, Fałdowanie toli 32 bitų vertė, kad primena tai, ką ji turėtų adresas
grįžti kai foo tai kitas funkcijas, daroma vykdant.
Tai duonos trupiniai dvasia į kurią jis grįžta.
Jei perrašyti, kad potencialiai jei esate blogas vaikinas, galite galėtų
potencialiai perimti kažkieno kompiuterio.
Ir jūs tikrai avarijos ją daugeliu atvejų.
>> Dabar ši problema buvo tik pablogino kaip mes pradėjome kalbėti apie atminties
valdymo apskritai.
Ir malloc, atminties paskirstymą, yra funkcija, kad mes galime naudoti skirti
atmintis, kai mes nežinome iš anksto kad mums gali prireikti šiek tiek.
Taigi, pavyzdžiui, jei aš einu atgal į prietaisą čia.
Ir aš atverti nuo paskutinio laiko hello2.c, prisiminti šią programą čia, kuris atrodė
šiek tiek kažką panašaus į tai, tik trys linijos -
nurodyti savo vardą, tada Styginių pavadinimas, kairėje lygus getstring.
Ir tada mes jį atspausdinti, vartotojo vardas.
>> Taigi, tai buvo super paprasta programa.
Kad būtų aišku, leiskite man eiti į priekį ir padaryti hello-2.
Aš ruošiuosi daryti dot velniop hello-2.
Nurodykite savo vardą -
Davidas.
Įveskite.
Sveiki Davidas.
Atrodo, kad darbas Gerai.
Bet kas iš tikrųjų vyksta po gaubtu čia?
Pirma tegul žievelės atgal tam tikri sluoksniai.
Styginių yra tik sinonimas mes supratau, už ką?
Char žvaigždė.
Taigi galime padaryti šiek tiek daugiau paslaptingų bet daugiau techniškai teisinga, kad šis
yra char žvaigždė, tai reiškia, kad vardas, taip, yra nevienoda.
Bet kas pavadinimas parduotuvių adresas simbolis, kuris jaučiasi šiek tiek keista
nes aš gaunu atgal eilutę.
Gaunu atgal kelis apdegina ne Char.
>> Bet, žinoma, jums reikia tik pirmą kartą char adresas prisiminti, kur
Visa eilutė, nes kodėl?
Kaip jums išsiaiškinti, kur galas eilutė žinant pradžią?
Backslash nuliui.
Taigi su šių dviejų įkalčiais jums išsiaiškinti, Prieš pradžioje ir pabaigoje
bet kokia eilutė yra tol, kol jie tinkamai sudaryta su ta null
terminatorius, kad Backslash nuliui.
>> Bet tai skambina getstring.
Ir it turns out, kad getstring visą šį laiką buvo natūra
oszukiwanie mums.
Tai darė šį darbą, būti tikri, gauti iš vartotojo eilutę.
Bet kur tai, kad atmintis buvo iš?
Jei mes einame atgal į paveikslėlį čia ir taikyti šį apibrėžimą tik iš
prieš akimirką, kad kamino kur atminties eina, kai funkcijos yra vadinamas,
ta logika, kai skambinate getstring, ir tada aš tipo
D-V-I-D "Enter", kur D-V-aš-D Backslash nulis saugomi, remiantis
istorija mes papasakojo toli?
>> Atrodytų būti kamino, tiesa?
Kai Jūs skambinate gauti eilutę gausite mažai gabalas atmintį kamino.
Taigi, ji stovi prie priežasties, kad D--V-aš-D Backslash nulis saugomos
ten kamino.
Bet palauk, getstring grąžą kad seka, taip sakant, o tai reiškia,
tai dėklas nuo kavinėje yra nurašomas kamino.
Ir mes sakėme paskutinį kartą, kad kuo greičiau funkcija grąžina, o jūs imtis, kad
dėklas, taip sakant, nuo kamino, ką galite manyti apie liekanas
kad atmintis?
Aš tarsi redrew juos kaip klaustukais nes jie veiksmingai tapti
Nežinoma vertės.
Jie gali būti pakartotinai naudojamas, kai kai kurie Kitas funkcija yra vadinama.
>> Kitaip tariant, jei mes atsitikti reikia saugoti -
Aš atkreipti greitai paveikslėlį čia iš kamino.
Jei atsitiktų būti piešimo dugną mano atminties segmento, ir mes pasakysime
kad tai yra atminties vieta užima pagrindinio ir gal arg C ir
ARG prieš ir visa kita programoje, kai getstring vadinamas,
matyt getstring gauna atminties riekė čia.
Ir tada D-V-aš-D kažkaip baigiasi šią funkciją.
Ir aš ruošiuosi per daug supaprastinti.
Bet tarkime, kad jos D-V-aš-D Backslash nuliui.
Taigi tai daug baitai yra naudojami už getstring rėmas.
>> Bet kaip tik getstring grąžos, mes sakė paskutinį kartą, kad ši atmintis per
čia visa tai tampa - woops! -
visa tai tampa efektyviai ištrinti.
Ir mes galime galvoti apie tai dabar, kaip klausimą ženklai, nes kas žino,
kas taps tos atminties.
Iš tiesų, aš labai dažnai skambinti funkcijas išskyrus getstring.
Ir kuo greičiau aš vadinu kai kurie kiti funkcija nei getstring, gal ne
tai pirma programa, kurią mes tik pažvelgė ne, bet kai kurie kiti, be abejo, kai kurie kiti
funkcija gali baigtis būtų suteikta tai kitą vietoje kamino.
>> Taigi negali būti, kad getstring parduotuvės D-V-aš-D ant kamino, nes aš norėčiau
iš karto prarasti prieigą prie jo.
Bet mes žinome, jie getstring tik tuos, ką?
Tai ne grįžtant į man šešis simbolius.
Kas ji tikrai vėl buvo galime daryti išvadą, paskutinį kartą?
Iš pirmųjų adresą.
Taigi kažkaip, kai jūs vadinamas getstring, tai skiriant atminties riekė už
eilutė, vartotojų tipas ir tada grįžti adresas juo.
Ir paaiškėja, kad, kai norite veikti paskirstyti atmintį šį
būdas ir sugrįžimo į asmenį, kuris vadinamas kad funkcija, adresas
kad atminties riekė, jūs visiškai negali įdėti jį į steką ne
apačioje, nes funkciškai tai tik ketina netapo tavo labai
greitai, todėl jums greičiausiai gali atspėti, kur mes tikriausiai bus išmesti jį
vietoj to, vadinamasis krūva.
>> Taigi tarp jūsų atminties dugne išdėstymas ir iš jūsų atminties ųjų viršų
išdėstymas yra visa krūva segmentuose.
Vienas iš jų yra kamino, ir iš karto virš jo yra krūvos.
Ir krūva yra tik skirtingi riekė atminties tai nėra naudojamas funkcijas
kai jie vadinami.
Ji naudojama ilgalaikę atmintį, kai norite viena funkcija patraukti kai
atminties ir galima pakabinti ant jo neprarandant kontroliuoti jį.
>> Dabar jūs galbūt galėtų iš karto matyti, kad tai nėra
nebūtinai puikus dizainas.
Kaip jūsų programa skirta atmintį kaminą, arba kaip jūs vadinate daugiau ir
daugiau funkcijų, arba kaip jums skirti atmintis su malloc krūvos ne kaip
getstring daro, ką aiškiai atrodo neišvengiama problema?
>> Teisė.
Kaip ir tai, kad šios rodyklės nukreipti vienas į kitą
nėra Bode gerai.
Ir iš tiesų, mes galime labai greitai katastrofos bet būdais programa.
Tiesą sakant, manau, kad mes galime turėti tai padarė netyčia vieną kartą.
Arba, jei ne, tegul tai padaryti sąmoningai dabar.
Leiskite man eiti į priekį ir rašyti super greitai programa, vadinama dontdothis.c.
O dabar aš eisiu čia ir neturi aštrių apima stdio.h.
Leiskite pareikšti funkcija rūšys užima jokių argumentų, kurie yra
žymimas kaip gerai negaliojančiu.
>> Ir vienintelis dalykas, rūšys ketina padaryti, tai skambutis rūšys, kuris tikriausiai nėra
protingiausias mintis, bet tegul bus taip.
Ent pagrindinis negalioja.
Dabar vienintelis dalykas, pagrindinis vyksta padaryti, tai paskambinti foo taip pat.
Ir tik prasideda, aš ruošiuosi eiti į priekį čia ir pasakyti, printf "Labas iš
foo ".
>> Gerai.
Taigi, jei aš nepadarė jokių klaidų, Padaryti dontdothis dot velniop.
Ir tegul tai padaryti lange didesnius -
taškas velniop, dontdothis.
Nagi.
Uh oh.
Matyt, jūs galite tai padaryti.
Damn it.
Gerai.
Palaukite.
Budėjimo.
Ar mes -
Mes tikrai ją naudoti Padaryti.
>> [Atsidūsta]
>> Žinau, bet aš manau, kad mes tiesiog ištrynė tą.
Uh, taip.
Damn it.
Išspręskite šią Rob.
Kas?
Tai labai paprasta.
Taip, mes kreipėmės optimizavimas išjungtas.
Gerai, stovėti bye.
Dabar jaučiuosi geriau.
Gerai.
>> Taigi leiskite perkompiliuoti tai -
Padaryti jums dontdothis.
Jums gali tekti pervadinti tai dothis.c vos akimirką.
Čia mes eiti.
Ačiū.
Gerai.
Taigi faktas, kad buvau spausdinimo kažkas iš tikrųjų buvo tiesiog
lėtina procesą, kurį mes būtų pasiektas tame taške.
Gerai.
Na ir na!
>> Taigi, kas iš tikrųjų vyksta?
Paaiškinimas, kaip panaikinti, yra ką nors, kalbant apie sąnaudų ir
produkcija turi tendenciją būti lėtesnis, nes jūs turite rašyti simbolius
ekranas, Ji turi slinkti.
Taigi Trumpai tariant, aš iš tikrųjų turėjo atsitiko taip, nekantrus, mes turėtume
mačiau tai galutinis rezultatas taip pat.
Dabar, kad aš važiuoti į spausdinimo įmonėms, matome iš karto.
Taigi, kodėl tai vyksta.
Na, paprastas paaiškinimas, žinoma, yra tai, kad rūšys tikriausiai neturėtų
būti pasivadinusi.
>> Dabar bendrais bruožais, tai yra rekursija.
Ir mes manome, kad porą savaičių prieš rekursywny yra gera.
Rekursija tai magiškas būdas išreikšti save itin trumpai.
Ir ji tiesiog veikia.
Bet yra pagrindinis bruožas visiems Rekurentiniai programos Mes kalbėjome
apie ir pažvelgė į iki šiol, o buvo tai, kad jie turėjo ką?
Bazinį scenarijų, kuris buvo šiek tiek sunku kodavimo atveju tai sakė, kai kuriais atvejais
nekeičia foo, kuri yra aiškiai ne šiuo atveju.
>> Taigi, kas iš tikrųjų vyksta kalbant apie šią nuotrauką?
Na, kai pagrindinis ragina foo ji gauna iš atminties gabaliuką.
Kai foo foo ragina, jis gauna atminties gabalas.
Kai foo foo ragina, jis gauna gabaliuką.
Ji gauna gabaliuką.
Kadangi Foo niekada nepasikartotų.
Mes niekada ištrinti vieną iš šių kadrų iš kamino.
Taigi mes pučia per krūvą, o ne paminėti, kuris žino, ką dar, ir
mes nenusižengiant mūsų ribų vadinamųjų segmentas atminties.
Klaida eiti segmentacija neteisinga.
>> Taigi sprendimas yra aiškiai ne tai.
Tačiau didesnė reiškia, kad, taip, ten tikrai yra tam tikra riba,
net jei tai nėra aiškiai apibrėžta, apie tai, kaip daug funkcijų, galite skambinti
programa, kiek kartų funkcija gali skambinti pati.
Taigi, nors mes padarėme skelbti rekursija nes tai potencialiai stebuklinga dalykas
porą savaičių prieš "Sigma funkcija, ir kai mes gauti duomenis
struktūros ir CS50, pamatysite kita paraiškos, ji ne
nebūtinai geriausias dalykas.
Nes jei funkcija save vadina, save vadina, net jei ten bazė
atveju, jei jūs neturite pasiektų šį bazinį scenarijų už 1000 skambučius ar 10000 skambučius, pagal
kad laikas jums gali tekti paleisti iš kambario savo vadinamąjį kamino ir paspauskite
kai kurie kiti segmentai atminties.
Taigi ji taip pat yra dizaino kompromisą tarp elegancijos ir tarp
tvirtumas jūsų pirma įgyvendinimas.
>> Taigi yra dar vienas trūkumas arba dar kabliuko, kad tai, ką mes
darė iki šiol.
Kai aš pašaukiau getstring -
leiskite man grįžti į hello-2.
Atkreipkite dėmesį, kad aš skambinti getstring, kuris grįžta adresą.
Ir mes teigia, kad šiandien adresas iš krūvos.
Ir dabar aš spausdinti seka šiuo adresu.
Bet mes niekada vadinamas priešais getstring.
Mes niekada turėjo calll funkciją kaip ungetstring, kur ranka atgal
kad atmintis.
Bet tiesą sakant, mes tikriausiai turėjo būti.
Nes jei mes nuolat klausia kompiuterį už atmintį, kurią kaip kažkas panašaus
getstring bet niekada duoti atgal, tikrai tai irgi sukels
problemų, kai mes paleisti iš atminties.
>> Ir iš tiesų, mes galime ieškoti šių problemų su nauja priemonė, kurios naudojimas
yra šiek tiek paslaptingas tipo.
Bet leiskite man eiti į priekį ir splash jį ant vos akimirką ekrane.
Aš ruošiuosi eiti į priekį ir paleisti Comment parametru, kurio pirmasis įsakymas
linija argumentas vardas tos programos hello-2.
Ir, deja, tai produkcija yra atrociously
sudėtinga, be rimtos priežasties.
Taigi matome, visa tai netvarka.
Dovydas yra nurodyti savo pavadinimą.
Štai programa iš tikrųjų veikia.
Ir dabar mes gauti šią produkciją.
>> Taigi Valgrind yra panašus dvasia su GDB.
Tai nėra savaime Debugger.
Bet tai atmintis tikrintuvas.
Tai programa, kuri bus paleisti programą ir pasakys, jei jūs prašėte
kompiuteris atmintyje ir niekada perdavė jį atgal, taip tai reiškia, kad jūs turite
Atminties nutekėjimas.
Ir Atminties nutekėjimas linkę būti blogai.
Ir jums yra kompiuterių naudotojai turi tikriausiai manė, kad tai, ar turite
Mac arba PC.
Ar jūs kada nors naudoti savo kompiuterį o ir nėra paleistas keliose
dienų, arba jūs ką tik gavo daug programos veikia ir velniškai dalykas
lėtina šlifavimo sustabdyti arba bent jau tai super erzina naudoti, nes
viskas ką tik gavo super lėtai.
>> Dabar, kad gali būti bet priežasčių.
Tai gali būti begalinis ciklas, kirminas kažkieno kodas, arba, tiesiog, tai
gali reikšti, kad jūs naudojate daugiau atminties, arba bando, nei jūsų
kompiuteris iš tikrųjų yra.
O gal ten kai programos klaida kad nuolat prašo atmintyje.
Naršyklės metų buvo žinomi dėl tai, prašydami daugiau ir daugiau atminties
bet niekada perduodant jį atgal.
Žinoma, jei turite tik baigtinių atminties kiekis, jūs negalite paklausti
galo daug kartų kai tos atminties.
>> Ir taip, ką matote čia, nors vėl Valgrind išvestis yra
pernelyg sudėtinga žvilgtelėti į pirma, tai yra įdomiausia dalis.
Heap -
naudojamas ne išeiti.
Taigi čia kiek atmintis naudojami krūvos ne
laikas mano programa išėjo -
matyt šešių baitų vieno bloko.
Taigi, aš ruošiuosi pakylės savo rankas kokia blokas.
Pagalvokite apie tai tik gabalas, daugiau techninė žodis riekė.
Tačiau šešių baitų -
kas yra šešių baitų buvo vis dar naudojami?
>> Būtent.
D-V-aš-D Backslash nulis, penkių laišką Vardas plius null terminatorius.
Taigi ši programa Valgrind pastebėjau, kad aš paprašė šešių baitų, matyt, pagal
būdas getstring, bet niekada davė jiems atgal.
Ir iš tiesų, tai gali būti ne taip akivaizdus, ​​jei mano programa nėra trijų
linijos, bet tai 300 linijos.
Taigi, mes galime iš tikrųjų duoti kita komanda linija argumentas Comment į
kad jis taptų išsami.
Tai šiek tiek erzina, kad prisiminti.
Bet jei aš tai padaryti -
pažiūrėkime.
Nuotėkio -
Ji buvo ištekėti -
net nepamenu kas tai yra ne ranka.
>> - Nuotėkio tikrinimas lygus pilna.
Taip, ačiū.
- Nuotėkio tikrinimas lygus pilna.
Įveskite.
Tas programa veikia.
Įveskite Dovydo dar kartą.
Dabar matau tiek išsamiau.
Bet žemiau krūvos santrauka, kuri sutampa su keturių - Ah,
tai tipo gražus.
Dabar Valgrind iš tikrųjų ieškote tiek sunkiau savo kodą.
Ir tai suprantama, kad, matyt, malloc eilutėje -
mes nutolinti.
Tuo linija -
mes nematote, ką linija yra.
Bet malloc yra pirmoji kaltininkas.
Yra ir malloc dienoraštis.
>> Viskas gerai?
Gerai, Nr.
Teisė?
Aš pašaukiau getstring.
getstring matyt ragina malloc.
Taigi, kas eilutėje kodas yra akivaizdžiai kaltas už tai,
skiriamos šios atminties?
Tarkime, kad tas, kas rašė malloc gyvuoja pakankamai ilgai, kad tai
ne jų kaltė.
Taigi, tai tikriausiai mano.
getstring į cs50.c - todėl tai failą kažkur kompiuteryje -
atitinka 286 Atrodo, kad kaltininkas.
Dabar įsivaizduokime, kad CS50 buvo maždaug už padoraus dydžio laiką, todėl
mes taip pat yra neklystantis.
Ir todėl tikriausiai ne getstring kad triktį yra, bet veikiau
hello-2.c eilutė 18.
>> Taigi galime pažvelgti kas tai eilutė 18 buvo.
Oh.
Kažkodėl ši eilutė nebūtinai Buggy per se, tačiau tai priežastis
už tos Atminties nutekėjimas.
Taigi super tiesiog, ką intuityviai būti sprendimas čia?
Jei mes prašome atminties, niekada nebuvo suteikiant jai atgal, ir kad, atrodo,
problema, nes laikui bėgant mano kompiuterio gali pritrūkti atminties, gali sulėtėti
žemyn, blogi dalykai gali įvykti, gerai, kas paprastas intuityvus sprendimas?
Tiesiog suteikti jai atgal.
>> Kaip jūs atlaisvinti atminties, kad?
Na, laimei, tai gana paprasta tiesiog pasakyti nemokamą pavadinimą.
Ir mes niekada tai padarė anksčiau.
Bet jūs galite iš esmės galvoti apie nemokamai kaip malloc priešingai.
nemokamai yra priešinga paskirstymo atminties.
Taigi dabar leiskite man perkompiliuoti tai.
Padaryti hello-2.
Leiskite man paleisti jį dar kartą. hello-2 Dovydas.
Taigi, atrodo, kad dirbti lygiai taip pat.
Bet jei aš einu atgal į Comment ir iš naujo paleisti tą pačią komandą mano naujai
parengta programa, spausdinimo mano vardu, kaip ir anksčiau -
nice.
Heap santrauka -
naudojimo at Exit -
nulis baitų nulinės blokų.
Ir tai yra super gražus, visi krūvos blokai buvo išlaisvinti.
Nėra nuotėkis.
>> Taigi artėja, o ne problemą, 4, bet problemą, 5 dalimi, ekspertizės
ir toliau, tai taip pat taps priemonė savo teisingumą
programa, ar turite ar neturite Atminties nutekėjimas.
Bet, laimei, ne tik jūs galite pagrįsti per juos intuityviai, kuris
yra, be abejo, lengva mažas programas bet sunkiau didesnių programų atveju
Comment, tiems didesnių programų atveju gali padėti jums nustatyti
pirma problema.
>> Tačiau yra dar viena problema kad gali kilti.
Leiskite man atverti šį failą čia, o tai, vėl šiek tiek paprastas pavyzdys.
Bet tegul sutelkti dėmesį į ką ši programa veikia.
Tai vadinama memory.c.
Mes rašyti tai vėliau šiandien pašto šiandienos kodą.
Ir pastebėsite, kad turiu funkcija vadinama f, kad nesiima jokių argumentų ir
grįžta nieko.
Atsižvelgiant į 20, aš, matyt, skelbiantis rodyklė int ir pavadino jį x.
Aš priskiriant yra grąža vertė malloc.
Ir tiesiog, kad būtų aišku, kiek baitų am Aš tikriausiai gauti atgal iš malloc
šioje situacijoje?
>> Tikriausiai 40.
Kur jūs gaunate, kad nuo?
Na, jei prisiminti, kad int dažnai 4 baitai, bent jau ji yra
prietaisas, 10 kartų 4 akivaizdžiai 40.
Taigi malloc yra grįžimas adresą atminties riekė ir saugoti, kad
spręsti galiausiai x.
Taigi turi būti aišku, ką tada vyksta?
Na, leiskite man pereiti atgal mūsų nuotrauką čia.
Leiskite man ne tik atkreipti mano apačioje kompiuterio atminties, leiskite man eiti į priekį ir
parengti visą stačiakampį tai visi mano RAM.
>> Mes sakome, kad kamino yra ant dugno.
Ir ten teksto segmentas kad niezainicjowanego duomenys.
Bet aš tik ketina abstraktus tiems kitų dalykų toli kaip taškas, taškas taškas.
Aš tik ketina kreiptis į šį kaip viršuje krūvą.
Ir tada šią nuotrauką apačioje atstovauti pagrindinis, aš ruošiuosi
suteikti jai skiltelės atmintį ant kamino.
Dėl f, aš suteikti jai gabaliuką atminties į steką.
Dabar, aš konsultuotis MY kodą dar kartą.
Kas yra vietos kintamieji pagrindinis?
Matyt nieko, kad gabalas yra efektyviai tuščias arba net kaip didelis
kaip aš jį parengti.
Bet f, turiu vietos kintamąjį, kuris yra vadinamas x.
Taigi, aš ruošiuosi eiti į priekį ir suteikti f atminties riekė, vadindami jį x.
>> Ir dabar malloc 10 kartų 4 Taigi malloc 40, Kur, kad
atminties ateina?
Mes neišdarinėtos paveikslėlį kaip anksčiau.
Bet tarkime, kad jis efektyviai tiekiamos iš čia, todėl vienas,
du, trys, keturi, penki.
Ir dabar man reikia 40 iš jų.
Taigi, aš tiesiog padaryti dot, dot, dot pasiūlyti kad ten net daugiau atminties
grįžta iš krūvos.
Dabar kas adresas?
Leiskite pasirinkti mūsų savavališkai spręsti kaip visada -
Ox123, nors tai tikriausiai vyksta būti kažkas visiškai kitoks.
Štai pirmojo baito adresas atminties, kad aš prašau malloc už.
>> Taigi, trumpai tariant, vieną kartą 20 eilutėje vykdo, kas yra tiesiog
saugomi viduje x čia?
Ox123.
Ir Jautis neįdomu.
Tai tiesiog reiškia čia šešioliktainis skaičius.
Bet kas svarbiausia yra tai, ką aš parduotuvėje in x, kuris yra vietos kintamąjį.
Bet jo duomenų tipas, vėlgi, yra iš int adresą.
Na, aš ruošiuosi laikyti Ox123.
Bet vėl, jei tai šiek tiek per daug sudėtinga be reikalo, jei aš slinkti
atgal, mes galime abstraktus tai toli gana pagrįstai ir tiesiog pasakyti, kad x yra
rodyklė į tą atminties riekė.
>> Gerai.
Dabar po ranka klausimas yra taip -
linija 21, it turns out, yra klaidų.
Kodėl?
>> Atsiprašome?
Ji neturi -
pasakyti, kad dar kartą.
Na, ji nėra nemokama.
Štai antra bet.
Taigi vienas kitą, bet konkrečiai at line 21.
>> Būtent.
Šis paprastas eilutėje kodas yra tik buferio, buferio.
Buferis tiesiog reiškia atminties riekė.
Bet atminties riekė yra dydžio 10, 10 sveikieji skaičiai, tai reiškia, jei mes
rodyklė į jį naudojant sintaksės cukraus Masyvo žymėjimą, kvadratas
skliausteliuose, jūs turite prieigą prie x laikiklis 0 x laikiklis 1 x
laikiklis taškas, taškas, taškas.
x laikiklis 9 yra didžiausias.
Taigi, jei aš x laikiklis 10, kur Aš iš tiesų vyksta atminties?
>> Na, jei aš turiu 10 int -
tegul faktiškai visus patrauksiu Šių čia.
Taigi, tai buvo pirmas penki.
Štai Kitos penkios ints.
Taigi x laikiklis 0 yra čia. x laikiklis 1 čia. x laikiklis 9 yra čia. x laikiklis
10 yra čia, o tai reiškia, aš sakau, atitinka 21, kompiuteris įdėti
skaičius, kur?
Skaičius 0, kur?
Na, tai 0, taip.
Bet tik tai, kad jo 0 rūšies sutapimas.
Tai gali būti skaičius 50, visiems mums rūpi.
Bet mes stengiamės įdėti jį x laikiklis 10, kur yra šis
klaustukas išdarinėtos, kuris nėra geras dalykas.
Ši programa gali labai gerai katastrofos, kaip rezultatas.
>> Dabar galime eiti į priekį ir pamatyti, jei tai yra, tiesą sakant, kas atsitiks.
Padaryti atmintį, kadangi byla vadinamas memory.c.
Eikime į priekį ir paleisti programos atminties.
Taigi, mes pasisekė, iš tikrųjų, atrodo.
Mes pasisekė.
Bet pažiūrėkime, jei mes dabar paleisti Valgrind.
Iš pirmo žvilgsnio, mano programa galėtų atrodo puikiai teisinga.
Bet leiskite man paleisti Comment su - Nuotėkio tikrinimas lygus pilnas atminties.
>> Ir dabar, kai aš paleisti šį -
įdomu.
Neteisingas rašyti dydžio 4 d iš memory.c 21 eilutę.
Iš memory.c 21 eilutė, kuris iš jų?
O, įdomu.
Bet palaukit.
Dydis 4, kas tai omenyje?
Aš tik padarė vieną rašyti, bet tai dydžio 4.
Kodėl tai 4?
Tai, nes jis int, kuris irgi yra keturi baitai.
Taigi Comment Radau klaidą, kad aš, žvelgdamas į mano kodas, to nepadarė.
O gal jūsų TF būtų ar nebūtų.
Kas Tačiau Comment tikrai nustatyta, kad mes padarė klaidą ten, net
nors mes pasisekė ir kompiuteris nusprendė, eh, aš nesiruošia į avariją
tik todėl, kad palietė vieną baitą, vienas Int verta atminties, kad tu ne
iš tikrųjų patys.
>> Na, ką dar Buggy čia.
Adresas -
tai kvailai ieško adresas šešioliktainis.
Tai tiesiog reiškia, kažkur krūvos yra nulis baitų po 40 dydžio bloko
skiriama.
Leiskite nutolinti čia ir pamatyti, jei tai yra šiek tiek daugiau naudinga.
Įdomu.
40 baitai tikrai neteko nuostolių įrašo 1 iš 1.
Vėlgi, daugiau žodžių, nei yra naudinga čia.
Tačiau remiantis paryškinti linijas, kur turėčiau tikriausiai sutelkti savo
dėmesys kitam klaidą?
Atrodo, 20 eilutėje iš memory.c.
>> Taigi, jei mes einame atgal į 20 eilutėje, tai vienas, kad jums nustatyta anksčiau.
Ir tai nebūtinai Buggy.
Bet mes tai pasikeitė jos poveikį.
Taigi, kaip man ištaisyti bent vienas iš tų klaidų?
Ką galėčiau daryti, kai atitinka 21?
Galėčiau padaryti be x, todėl yra duoti atgal, kad atmintį.
Ir kaip aš galiu išspręsti šią klaidą?
Aš tikrai turėtų eiti ne toliau kaip 0.
Taigi leiskite man pabandyti ir iš naujo paleisti.
Atsiprašome, tikrai eiti ne toliau kaip 9.
Padaryti atmintį.
Leiskite pakartotas Comment daugiau lange.
Ir dabar atrodo.
Nice.
Visi krūvos blokai buvo išlaisvinti.
Nėra nuotėkis.
Ir virš čia nėra paminėti bet koks neteisingas teisę daugiau.
>> Tiesiog gauti gobšus, ir tegul pamatyti, jei vienas pavyzdys
neviršijama pagal paskirtį -
Aš gauti pasisekė prieš akimirką.
Ir tai, kad tai 0 yra galbūt be reikalo klaidinantis.
Tegul tik tai 50, šiek tiek savavališkas skaičius, kad atminties dot velniop atmintį -
vis dar galite gauti pasisekė.
Nieko kritimo.
Tarkime, aš tiesiog padaryti kažką tikrai kvaila, ir aš 100.
Leiskite man perdaryti atminties, taškas velniop atmintis -
pasisekė dar kartą.
Kaip apie 1000?
ints už jos ribų, maždaug, kur aš turėtų būti?
Padaryti atmintį -
damn it.
>> [Juokas]
>> Gerai.
Tegul ne pažaisti nebėra.
Pakartotinas atmintį.
Čia mes eiti.
Gerai.
Taigi, matyt, jūs indekso 100000 Ints nei kur turėjo būti
atmintis, blogų dalykų atsitikti.
Taigi tai, žinoma, nėra sunku, greitai taisyklė.
Buvau rūšies naudojant bandymus ir klaidų ten patekti.
Bet taip yra todėl, ilga istorija trumpa, jūsų kompiuterio atminties taip pat skirstomi
į šiuos dalykus vadinama segmentų.
Ir kartais, kompiuteris faktiškai davė jums šiek tiek daugiau atminties
kaip jūs paprašykite.
Tačiau veiksmingumo, tai tik lengviau gauti daugiau atminties, bet tik pasakyti,
kad jūs gaunate jo dalį.
>> Ir jei jūs gauti pasisekė kartais, Todėl, jums gali būti suteikta galimybė prisiliesti
atminties, kuri nepriklauso jums.
Jūs neturite garantijos, kad tai, kas vertė jūs įdėti ten liks ten, nes
kompiuteris vis dar mano, kad tai ne tavo, bet tai nebūtinai vyksta
, kad pasiektų kitą atminties segmentą kompiuteris ir sukelti klaidą, pavyzdžiui,
tai vienas čia.
Gerai.
Turite klausimų tada atmintis?
>> Gerai.
Leiskite pažvelgti čia, tada, bent ką mes jau vartojate
suteikta gana ilgą laiką, kuris yra šio failo pavadinimą cs50.h.
Taigi tai yra byla.
Tai yra tiesiog visa krūva KOMENTARŲ iki viršaus.
Ir tu gali pažvelgė į tai, jei jūs baksnodavo aplink prietaisą.
Tačiau paaiškėja, kad visą laiką, kai mes jį naudoti eilutę kaip
sinonimas, priemonės, kuriomis mes paskelbėme kad sinonimas buvo su tai
raktažodis Typedef, tipo apibrėžimą.
Ir mes iš esmės sakydamas, kad string už char žvaigždė sinonimas.
Tai priemonės, kuriomis kamino sukūrė šias mokymo ratus žinomas kaip
eilutę.
>> Dabar čia tik prototipas už getchar.
Mes galime mačiau jį anksčiau, bet tai Iš tiesų, ką ji daro. getchar
nesiima jokių argumentų, gražina Char.
getdouble nesiima jokių argumentų, grąžina dvigubai.
getfloat trunka jokių argumentų, grąžą plūdė, ir kt.
getint yra čia. getlonglong yra čia.
Ir getstring yra čia.
Štai ir viskas.
Ši raudonos linijos yra dar Preprocessor direktyva dėl
hashtag ne jo pradžioje.
>> Gerai.
Taigi dabar leiskite man eiti į cs50.c.
Ir mes kalbame ne per ilgai apie tai.
Bet duoti jums tai, kas žvilgsnis jau vyksta visa tai
laikas, leiskite man eiti -
darykime getchar.
Taigi getchar dažniausiai komentarai.
Bet atrodo, kad tai.
Taigi tai yra tikroji funkcija getchar, kad mes jau
Pripažindami egzistuoja.
Ir nors mes ne naudoti šį vieną kad dažnai, jei kada nors, tai bent
gana paprasta.
Taigi, tai verta Žvilgsnis čia.
>> Taigi getchar turi begalinį ciklą, sąmoningai taip akivaizdžiai.
Tada jis prašo - ir tai yra rūšies gražus pakartotinis kodo mes patys parašė.
Ji ragina getstring.
Nes tai, ką daro reiškia gauti char?
Na, galite taip pat pabandyti gauti visa teksto eilutė iš vartotojo ir
tada tiesiog pažvelgti į vieną Šių simbolių.
Atsižvelgiant į 60, čia yra šiek tiek tiek normalumas patikrinti.
Jei getstring grįžo NULL, tegul ne tęsti.
Kažkas nutiko.
>> Dabar tai šiek tiek erzina, bet Įprastinių in C. char max tikriausiai
parodo, ką tik remiantis jo pavadinimo?
Tai pastovus.
Tai kaip skaitinė vertė Didžiausias char galite reprezentuojate
viena Užkandote, kuris yra tikriausiai skaičius 255, kuris yra didžiausias skaičius, kurį
sudaro aštuonis bitus, pradedant nuo nulio.
Taigi, aš naudoti šią, šią funkciją, kai rašau šį kodą tik todėl, kad
jei kas nors negerai, bet getchar jo gyvenimo tikslas yra grįžti
char, jums reikia kažkaip sugebėti parodyti vartotojui, kad
kažkas negerai.
Mes negalime grįžti null.
Pasirodo, kad niekinis yra žymeklis.
Ir vėl getchar turi grįžti Char.
>> Taigi konvencija, jei kas nors negerai, tai jūs, programuotojas, arba
šiuo atveju, man su biblioteka, turėjau tiesiog nuspręsti savavališkai, jei
kažkas negerai, aš ruošiuosi grįžti skaičių 255, kuris yra tikrai
reiškia, kad mes negalime, vartotojas negali įvesti simbolis atstovauja
skaičius 255, nes mes turėjome pavogti kaip vadinamųjų sarginio vertę
yra problema.
Dabar paaiškėja, kad personažas 255 nėra kažkas, galite įvesti į
klaviatūra, todėl ne big deal.
Vartotojas neturi pastebėti, kad Aš pavogtas šį simbolį.
Bet jei jūs kada nors pamatyti žmoguje puslapių kompiuterinė sistema kai nuoroda į
visi pastovus, kaip tai kepurės, kad sako, tais atvejais, kai klaidos ši konstanta gali
būti grąžinami, kad viskas kai žmogaus padarė metų buvo savavališkai nusprendė
grąžinti šį ypatingą vertę ir tai vadinu atveju nuolatinis
kažkas negerai.
>> Dabar magija atsitiks čia.
Pirma, aš skelbiantis atitinka 67 du simboliai, C1 ir C2.
Ir tada atitinka 68, ten tikrai kodo eilutę tai primena
mūsų draugas printf turint omenyje, kad tikrai turi procentų Cs kabučių.
Tačiau pastebėti, kas vyksta čia. sscanf reiškia eilutės skenavimas -
reiškia nuskaityti suformatuotas eilutę, vadinasi sscanf.
Ką tai reiškia?
Tai reiškia, kad pereiti į sscanf eilutę.
Ir linija yra kas vartotojas įveda in
Jūs pereiti į sscanf formatas eilutę kaip tai, kad pasakoja scanf kas yra
Jūs tikisi vartotojas įvedėte in
Tada praeiti-tai yra du adresai gabaliukus atminties, šiuo atveju,
nes turiu du vietos rezervavimo ženklus.
Taigi, aš norėčiau duoti jai adresą C1 ir C2 adresą.
>> Ir prisiminti, kad jūs suteikiate yra funkcija adresas tikrą kintamąjį, kas
potekstė?
Kas tai gali padaryti funkcija kaip rezultatas iš suteikdama jai adresą
kintamasis, o ne kintamasis pati?
Tai galite pakeisti jį, tiesa?
Jei jums teko ką nors žemėlapį, kad fizinis adresas, jie gali eiti ten ir daryti
ką jie nori šiuo adresu.
Pati idėja čia.
Jei mes pereiti į sscanf, dviejų adresas gabaliukus atminties, net šių mažų
mažai gabaliukus atminties, C1 ir C2, bet mes pasakyti jai apie juos adresą,
sscanf galite pakeisti jį.
>> Taigi sscanf gyvenimo tikslas, jei mes skaitome vyras puslapis yra perskaityti, ką
vartotojas turi įvesti, tikiuosi, kad vartotojas, turintis įvedėte simbolį, o gal
kitas personažas ir koks vartotojas parašomas pirmas simbolis eina
čia Antroji raidė eina čia.
Dabar, kaip ir žemę, tai ir jums, tik žinau, tai iš dokumentų,
Tai, kad aš įdėti tuščią vietą ten tiesiog reiškia, kad man nerūpi, jei
naudotojas paspaus tarpo kelias kartus, kol jis arba ji mano
pobūdis, aš ignoruoti bet tarpas.
Taigi, kad aš žinau, iš dokumentai.
>> Faktas, kad yra antra% C po tarpais iš tikrųjų
sąmoningas.
Noriu, kad būtų galima nustatyti, ar vartotojo įsukus arba nebendradarbiavo.
Taigi, aš tikiuosi, kad vartotojas tik atspausdinti vienoje pobūdžio, todėl aš tikiuosi,
kad sscanf yra tik ketina grįžti vertė 1, nes vėl, jei aš perskaičiau
dokumentus, sscanf tikslas į gyvenimas yra grįžti į skaičius
kintamieji, kurie buvo užpildyti su naudotojo įvesties.
>> Aš išlaikė dviejų kintamųjų adresai, C1 ir C2.
Aš tikiuosi, nors, kad tik vienas iš jie žūsta, nes jei sscanf
grąžina 2, kas turbūt POVEIKIS logiškai?
Kad vartotojas nebuvo tik duok man vieną simbolis, kaip aš pasakiau jam ar jai.
Jie tikriausiai įvedėte ne mažiausiai du simboliai.
Taigi, jei aš vietoj neturėjo antra % C, aš tiesiog turėjo vieną, kuris
atvirai būtų paprastesnis požiūris, manau, iš pirmo žvilgsnio,
jūs nesiruošia galėtų aptikti jei vartotojas buvo suteikti jums daugiau
įėjimas nei jūs iš tikrųjų norėjo.
Taigi tai yra numanomas forma Klaidų tikrinimo.
>> Tačiau pastebėti tai, ką darau čia.
Kai aš tikiu, kad vartotojo davė man vieną simbolis, aš išlaisvinti liniją, daro
iš getstring atvirkščiai, o tai savo ruožtu naudoja malloc, ir tada aš grįžti
C1 pobūdžio, kad aš tikėjosi vartotojas nepateikė ir tik jei.
Taigi greitai prabėgomis tik, bet bet kokie getchar klausimų?
Mes grįžti prie kai kurių kitų.
>> Na, leiskite man eiti į priekį ir tai padaryti - Tarkime dabar, tiesiog motyvuoti mūsų
diskusija per savaitę plius laiko, tai yra failas, vadinamas structs.h.
Ir vėl, tai tik skonio kažką, kad laukia.
Tačiau atkreipkite dėmesį, kad daug tai yra komentarai.
Taigi leiskite man pabrėžti tik Įdomu dabar.
Typedef -
ten tas pats raktažodis dar kartą.
Typedef mes naudojame paskelbti eilutę kaip speciali duomenų tipo.
Galite naudoti Typedef sukurti visiškai naujas duomenų tipai, kurių nebuvo, kai
C buvo išrastas.
Pavyzdžiui, int ateina su C. char ateina su C. dukart ateina su C. Tačiau
nėra jokių studento sąvoka.
Ir dar būtų labai naudinga turėti galima parašyti programą, kuri saugo
į kintamąjį, studento ID numerį, savo vardą, pavardę ir savo namuose.
Kitaip tariant, trijų dalių duomenis, kaip int ir
styginių ir kitą eilutę.
>> Su Typedef, kas gana galingas apie tai ir raktažodžių sturct už
struktūra, tu, 2013 m programuotojas, iš tikrųjų galite nustatyti savo
duomenų tipai, kurių nebuvo metų prieš bet tiktų jūsų tikslams.
Ir taip čia, per 13 iš 19 eilučių, mes skelbiantis naują duomenų tipą, pavyzdžiui,
int, bet vadiname tai studentas.
Ir viduje šio kintamojo ketina Trys dalykai - int, string,
ir eilutę.
Taigi, jūs galite galvoti apie tai, kas tikrai čia nutiko, nors tai
tiek paprastėja, šiandien, studentas yra iš esmės vyksta
atrodyti tai.
Jos bus riekė atminties su ID, pavadinimas
lauko ir namo laukas.
Ir mes galėsime naudoti tuos gabaliukus atminties ir pasiekite juos taip.
>> Jei aš einu į struct0.c, čia yra gana ilgai, bet po
modelis, kodo, kad naudoja šią naują triuką.
Taigi, pirma, leiskite man atkreipti jūsų dėmesį į įdomiausių dalių iki viršaus.
Sharp apibrėžia studentams 3 deklaruoja, nuolat vadinami studentai ir įgaliotiniai
tai savavališkai skaičius 3, tiesiog taip, aš turiu tris studentus, naudojant
tai dabar programa.
Čia ateina Maino.
Ir pastebėkite, kaip man deklaruoti Studentų masyvas?
Na, aš tiesiog naudokite tokią pačią sintaksę.
Žodis studentas yra akivaizdžiai nauji.
Tačiau studentų, klasės, laikiklis studentams.
>> Taigi, deja, yra daug pakartotinio naudojimo terminų čia.
Tai tik skaičius.
Taigi tai tarsi sakydamas tris.
Klasė yra tai, ką noriu skambinti kintamąjį.
Galėčiau jį vadiname studentams.
Bet klasės, tai nėra į klasę Objektinis Java rūšies būdas.
Tai tik mokinių klasė.
Ir duomenų tipas kiekvieno elemento masyvo, yra studentas.
Taigi tai yra šiek tiek kitoks ir nuo sakydamas kažką
kaip šis, tai tik -
Aš sakau man tris studentus ir skambinti, kad masyvo klasę.
>> Gerai.
Dabar čia yra keturi linijos.
Šis vaikinas žino - Iterate nuo nulio iki trijų.
Ir štai naujasis kūrinys sintaksė.
Programa vyksta greitai man, žmonių, suteikti jam studento
ID numeris, kuris yra int.
Ir štai sintaksė, su kuria jūs galite laikyti kažką ID srityje ne
vieta klasė laikiklis I. Taigi šį sintaksė nėra nauja.
Tai tiesiog reiškia, kad man aštunta studentas klasėje.
Tačiau šis simbolis yra nauja.
Iki šiol, mes negali naudojamas taškas, bent jau kodas, kaip šis.
Tai reiškia eiti į struct žinomas kaip studentas ir įdėti kažką ten.
Be to, šioje kitą eilutę, 31, eiti į priekį ir įdėti ką vartotojas įveda
, pavadinimas čia ir ką jie daro namas, tas pats, eiti į priekį ir
įdėti ją. namuose.
>> Taigi, ką ši programa galiausiai daryti?
Jūs galite pamatyti tiek erzina ten.
Leiskite man eiti į priekį ir padarysiu structs 0 taškas velniop konstrukto 0, studento ID 1,
sako David Mather, studentas ID 2.
Robas Kirkland, studento pažymėjimas 3.
Lauren Leverit -
ir vienintelis dalykas, ši programa padarė, kuris yra tik visiškai savavališkas, yra
Norėjau kažką daryti su šiais duomenimis, dabar, kad aš mokė mus, kaip
naudoti structs, tai aš tiesiog turėjo ši papildoma kilpa čia.
Aš pakartoti per studentų masyvo.
Aš savo, galbūt dabar pažįstamas draugas, styginių lyginti, stircomp į
patikrinimas yra 8th studento namai lygios Mather?
Ir jei taip, tiesiog atsispausdinti kažką savavališkai patinka, taip, ji yra.
Bet vėl, kad suteikėte man galimybę naudoti ir pakartotinai naudoti ir
pakartotinai naudoti šią naują dot žymėjimą.
>> Taigi, who cares, tiesa?
Netrukus su studento programos šiek tiek savavališkas, bet it turns out
kad mes galime padaryti naudingų dalykų su tai, pavyzdžiui, kaip nurodyta toliau.
Tai daug sudėtingesnis konstrukto į C. Jis gavo keliolika ar daugiau sričių,
šiek tiek cryptically pavadintas.
Bet jei jūs kada nors girdėjote apie grafika failo formatas vadinamas rastras, BMP, jis
Pasirodo, kad Bitmap formatas gana daug atrodo, kad tai.
Tai kvailas mažai smiley veido.
Tai mažas vaizdas, kad aš Mastelis dėl gana didelis, kad galėčiau matyti vienas
atskirų taškų ar taškų.
Dabar paaiškėja, mes galime atstovauti juodas taškas, tarkim, skaičių 0.
Ir baltas taškas su skaičiumi 1.
>> Taigi, kitaip tariant, jei jūs norite atkreipti Smiley veido ir išsaugoti tą įvaizdį
kompiuteris, pakanka laikyti nulių ir tie, kurie atrodo taip, kur
vėl tie balti ir nuliai yra juoda.
Ir kartu, jei jums efektyviai turi prisisekite ir nulių, turite
tinklelį taškų, ir jei jums nustatyti juos, jūs turite mielas
mažai smiley veido.
Dabar Bitmap formatas, BMP yra efektyviai, kad po gaubtu,
bet su daugiau taškų Sot, kad jūs iš tikrųjų gali atstovauti spalvų.
>> Bet kai turite daugiau sudėtingas failų formatus, pavyzdžiui, BMP ir JPEG ir GIF
su kuria jūs galite būti susipažinę tie, failus diske paprastai yra ne tik
turi nulių ir už taškų, tačiau jie turi tam tikrų metaduomenų, taip pat -
meta ta prasme, kad yra tikrai ne duomenų, tačiau tai naudinga turėti.
Taigi šie laukai čia yra numatantys, ir mes matome tai išsamiau P-rinkinys
5, kad prieš nuliai ir tie, kurie atstovauti vaizde taškų,
ten metaduomenų krūva kaip koks paveikslo dydis ir
plotis vaizdą.
Ir pastebėsite, aš skynimas ne kai savavališkai dalykų čia -
plotis ir aukštis.
Truputi skaičius ir kai kurių kitų dalykų.
Taigi, čia yra keletas iš failo metaduomenis.
>> Bet suprasti, kaip failai yra nustatyta atlikti šiuo būdu, jūs iš tikrųjų galite
tada manipuliuoti vaizdus, ​​atkurti vaizdus iš disko, keisti dydį vaizdus.
Bet jūs galite nebūtinai padidinti juos.
Man reikia nuotrauką.
Taigi, aš grįžau į RJ čia kas matėte ekrane gana seniai.
Ir jei aš atverti Keynote čia, tai kas atsitiks, jei jūs bandote padidinti ir
padidinti RJ.
Jis nėra gauti bet geriau tikrai.
Dabar Keynote "yra natūra nyksta tai šiek tiek, tik Koloryzować
Faktas, kad RJ negauna ypač sustiprintas, kai jūs priartinti
Ir jei tai padaryti tokiu būdu, pamatyti kvadratų?
Taip, galite tikrai pamatyti esančias projektorius kvadratų.
>> Štai ką jūs gaunate, kai jums padidinti.
Bet suprasti, kaip mūsų RJ arba Smiley veido įgyvendinti leis mums
iš tikrųjų rašyti kodą, kuris manipuliuoja šie dalykai.
Ir aš maniau aš baigiasi šią pastabą, su 55 sekundžių sustiprinti tai,
Drįstu, tarkim, o klaidinantis.
>> [VIDEO PLAYBACK]
>> -Jis meluoja.
Apie ką, aš nežinau.
>> -Taigi, ką mes žinome?
>> -Tai 9:15 Ray Santoya buvo ATM.
>> -Taigi, klausimas yra tai, ką buvo jis daro 9:16?
>> Fotografavimas devynių milimetrų bent kažką.
Gal jis pamatė snaiperis.
>> -Arba dirbo su juo.
>> Palauk.
Grįžti atgal vieną.
>> -Ką tu matai?
>> -Suderinti savo veidą aukštyn, per visą ekraną.
>> -Jo akiniai.
>> -Yra atspindys.
>> -Tai Neuvitas beisbolo komandos.
Štai jų logotipas.
>> -Ir jis kalbėti kas yra dėvėti, kad striukė.
>> [PABAIGA VIDEO PLAYBACK]
>> Davidas J. Malan: Tai bus būti problemą, 5.
We will see you kitą savaitę.
>> VYRŲ GARSIAKALBIS: Kitame CS50.
>> [Svirplių čiulbėjimo]
>> [Muzikavimo]