[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 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. -Sustiprinti. -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. 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ą. 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. 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]