[Muusika mängib] DAVID J. Malan: Olgu. [Naer] Tere tulemast tagasi. See on CS50. Ja see nädala lõpuks viis. Ja siiani oleme päris palju võtnud enesestmõistetavaks, et seal olemas selle koostaja, rõkkama, et olete on tuginedes teel selle muu tööriist nimega Mark, et kuidagi võluväel teisendab lähtekoodi arvesse objekti kood, nulli ja need et teie arvuti protsessor, keskne keskseade, tegelikult aru. Aga selgub, seal on number, mis on toimub all kapuuts sisendi ja väljundi vahel. Ja ma tahaksin teha ettepaneku, et me liha et läbi veidi üksikasjalikumalt arvesse Need neli sammu, on midagi, mida nimetatakse eeltöötlust, midagi kutsutud, koostamise, mida me oleme näinud, midagi, mida nimetatakse kokkupanek ja midagi, mida nimetatakse siduda. Seega seni, mõned meie programmid, oleme olnud terav ka. Hiljuti oleme olnud mõned teravad määranud konstandid. Nii selgub, et need asjad, mis ees seisab hash sümbol või nael sümbol on pre-protsessor direktiividele. See on lihtsalt fancy viis öelda, et see on rida koodi, mis on tegelikult ümber midagi enne arvuti isegi proovida muuta oma Programm viiakse nulli ja ones. Näiteks terav sisaldab standard I / O. H, päris palju tähendab lihtsalt minema ees, ostke failide sisu stdio.h ja kleebi need seal. Nii ei nulli ja need sel hetkel veel. See on tõesti lihtsalt vahetuseks. Ja see on tehtud ajal nn eeltöötlust etapis, kui te tegelikult kulgema rõkkama või spetsiaalselt Tee enamikel juhtudel. Nii et kõik see on toimunud esimene automaatselt seni. Siis tuleb koostamise etapis. Aga oleme olnud liiga lihtsustatult koostamine. Koostamise programm tegelikult tähendab võta seda midagi C, lähtekoodi oleme olnud kirjalikult, alla et midagi, mida nimetatakse koost. Assembly on madalamal tasemel keeles, et õnneks ei saa me on palju võimalust kirjutada see semester. Aga see on madalaimal tasemel selles mõttes, et sa sõna otseses mõttes hakake liita ja lahutada ja korrutada ja koormus mälust ja mällu salvestamiseks, väga põhilised juhised, et arvuti, all kapuuts, tegelikult aru. Lõpuks kokkupanek võtab selles keeles et nullid ja need, kes me oleme kirjeldab seni. Ja tõesti lõpuks, seal on nn sidudes etapp, mida me tulen vaata vaid hetk, mis ühendab oma nulle ja need nullidega ja need teised inimesed enne olete loonud. Nii leiavad selle super lihtne programm. See oli 1. nädal. Ta lihtsalt ütles, Hello World, ekraanil. Meil oli see läbi rõkkama. Või me jooksis ta läbi teha mis kestis rõkkama. Ja väljastada ajal kui mõned nullid ja ones. Aga selgub, seal on vaheetappi. Kui ma lähen siia - oops, ei tahan teda näha veel. Kui ma lähen siia, et mu seade ja ma avada hello.c siin on see, et sama programmi. Ja see, mida ma teen oma terminal aken siin ma lähen joosta rõkkama mitte teha, mis automatiseerib kõik neli need sammud meile. Ja ma teen rõkkama-S ja siis hello.c ning seejärel sisestada. Ja ma saan vilgub kiiresti jälle, mis on hea. Ja nüüd veidi suurem aknas Ma lähen avama gedit siin. Ja ma lähen avama faili, Selgub, nimetatakse hello.s see sisaldab mis Assembly Mainisin. Ja see on, mida nimetatakse kokkupanek keel, üsna madal juhiseid, et oma Intel CPU või mis iganes see on, mis seal sees on mõistab. Ja mov on liikuda. kõne eest helistada, väga madalal tasemel funktsioon. sub on lahutamine. Nii et kui teil on konkreetne CPU sees arvutisse, mis muudab selge, võrreldes teiste protsessoriga kohta turul, on mis juhiseid selle mõistab ja sageli, kui tõhus see on, kui kiiresti see on täidesaatva mõned juhendit. Nüüd enam seda, mida saate teha Järgmine Fall CS61 Kolledžis. Aga siin me oleme, näiteks mõne tunnused, mis võib tunduda tuttav. hello.c on programmi nimi. . Teksti - seal ei ole palju huvi on olemas just, meelde tuletada, et tekst segment, sest esmaspäeval, on koht, kus on mälu oma programmis tegelikult jõuab. Nii et vähemalt ähmaselt tuttav seal. Siin on muidugi mainida meie peamine ülesanne. Kerides, need viitavad asjad nn registrite väga väike tükkideks mälu sees oma tegelik CPU. Ja kui ma keri isegi edasi, ma näen mingi kaudne mainita ASCII. Ja tõepoolest on, et string, tere, koma maailmas. Nii pikk lugu lühike, see on olnud juhtub teile, automaatselt, all kapuuts kõik see aeg. Ja mis juhtunud on tõesti kord olete sattunud rõkkama või teel Tee, et sa saad esimese, lähtekoodist, niinimetatud Assembly. Siis rõkkama toimub üleminek selle kokkupanek keele alla nulli ja ones. Ja see on see slaid, alustasime meie arutelu Week 0 on - ja siis nädal 1. Ja siis lõpuks, need nullid ja need, kombineeritakse nulli ja need nende raamatukogud oleme võtnud enesestmõistetavaks nagu Standard I / O või String raamatukogu või isegi CS50 raamatukogu. Nii, et maalida seda pilti enam visuaalselt, meil hello.c. Ja see on muidugi kasutab printf toimida öelda, tere. Koostamise etapis võetakse see alla et fail me just nägin hello.s isegi kuigi see on tavaliselt kustutatud automaatselt ära. Aga see on koost kood keset samm. Ja siis, kui me kokku assamblee keel, nii et rääkida, see on kui sa saada need nullid ja ones. Nii oleme suumitud tõhusalt täna mida me oleme võtnud ette antud, tähendab läheb lähtekoodi vastuväiteid kood. Aga lõpuks, nüüd, et sama pilt - olgem pista see üle vasakul pool. Ja pange tähele, et top on Mainisin stdio.h. See on fail, mis oleme lisanud peaaegu kõik programme oleme kirjutanud. Ja see on fail, mille sisu saada koopia kleebitud, tõhusalt atop oma kood. Aga selgub, et arvuti süsteem kuhugi, seal on arvatavasti stdio.c fail, et keegi kirjutas aastat tagasi, mis rakendab kõik funktsioonid, mis olid kuulutatud aastal stdio.h. Nüüd tegelikult on see ilmselt mitte Mac või PC või isegi CS50 seade on toores C kood. Keegi juba koostatud, ja ka . O faili objekti kood või. fail, mis viitab jagatud raamatukogu mis on olnud eelnevalt paigaldatud ja eelkompileeritud teile. Aga oletame, et on tõepoolest olemas meie arvuti stdio.c paralleelselt koos rõkkama. Sinu kood kuramuse koostatud ja kokku monteeritud. stdio.c 's kood on koostatud ja kokku pandud, nii et see kõige viimane samm, siia alla, peame kuidagi link, niiöelda oma nulle ja need koos tema nullide ja need ühte lihtne programm, mis lõppkokkuvõttes on nimetatakse lihtsalt Tere. Nii et see kõik magic see on juhtunud siiani. Ja jätkab nende protsesside enesestmõistetavaks, kuid realiseerida seal on palju mahlane üksikasju toimub all olemas. Ja see teebki oma Arvuti Intel inside eriti selge. Nii on see märkus, kui soovite liitu meiega lõunale see reede, ei lähe tavalisi koht cs50.net/rsvp, 13:15 see reede. Ja nüüd mõned teated. Nii et meil on häid uudiseid. Ja meil on halbu uudiseid. Alusta mõned head uudised siin. [Groaning] Hea küll. Noh, see on tehniliselt puhkus, nii see ei ole nii palju kingitus meile. Aga halb uudis muidugi. [Groaning] Veetsin palju aega Nende animatsioone. [Naer] Tekib läbivaatamine istungil tuleval esmaspäeval. See saab olema 05:30. Me meelde kõik need detailid e-posti teel on kursuse kodulehel vaid paar päeva aega. See filmitakse ja kättesaadavaks varsti pärast seda. Nii et kui te ei saa teha, et esmaspäev öö pesa, ärge muretsege. Sektsioonid tuleval nädalal ka keskenduda läbivaatamine viktoriini. Kui teie osa on esmaspäeval, mis on tõepoolest ülikooli puhkus, siis me endiselt vastama punktis. Kui sa lihtsalt ei saa teha, et jagu, sest sa lähed ära, see on hea. Osale pühapäev või teisipäev osa või tune-in Jasoni osa, mis on saadaval online. Niisiis, rohkem halbu uudiseid. Seega vastavalt õppekava, meil loeng järgmisel reedel. Aga hea uudis - selgelt, veetsin liiga palju aega see. [Naer] Me katkestame järgmisel reedel loenguid. Nii et on kingitus meile, et sa tõesti on kena kergendust vahel selle nädala ja kahe nädala pärast on. Seega ei ole loenguid järgmisel nädalal, lihtsalt väike väike viktoriin, mille abil peaks olema üha rohkem põnevil. Teeme nüüd tähelepanu pöörata midagi, mis on tõesti rohkem visuaalse ja põnevam ning panema mida saab olema silmapiiril vaid paar nädalat aega. Pärast esimest viktoriin, me lülitage Keskenduda meie probleem komplekti teise domeeni konkreetne probleem, mis kohtuekspertiisi või turvalisuse üldisemalt. Tegelikult traditsioon selle probleemiga komplekt on minu jaoks üks õpetamise mehe või pädevad kõndida üle campus võttes mõned fotod tuvastatav kuid mitte ilmne inimesed, kohtades või asju, siis igal aastal I kuidagi õnnestub kogemata kustutada või rikkuda digitaalmeedia kaart mis seal sees on meie kaamera. Aga pole hullu. Võin minna ja ühendage et minu arvuti. Võin teha kohtuekspertiisi pilt sellest, et rääkida, kopeerides nulli ja need maha, et mälukaart, kas oma SD-kaardi või Compact Flash kaardi või mis iganes te olete juba tuttav. Ja siis saame käsi, mis välja. Ja nii väljakutse ees, muu hulgas asju teile, saab kirjutada C kood, mis taastab terve hunnik JPEG mulle ja selgus on neid inimesi, kohti või asju. Ja me ka rääkida, et see probleem kehtestatud ja päeva tulla, umbes graafika üldisemalt. Oleme kasutanud neid, muidugi, jaoks välja murda. Aga sa oled justkui iseenesestmõistetavaks on olemas need kõrge mõisted ristküliku ja ovaali. Aga all kapuuts on pikslit. Ja teil on olnud alustada mõtled neid. Või siis p-set 4 mõtlema umbes lõhet oma tellised, kuidas kiiresti sa pall liigub üle ekraani välja murda. Seega on see mõiste dots ekraanil, mis on tulevad mängu juba. Nüüd, mida sa näed, kui see, mida saad arvutiekraanil. Kui olete kunagi vaatasin mõned hea või halb TV, koefitsiendid on nad päris palju ravida publik nagu technophobes kes tõesti ei tea, palju arvuti. Ja nii see on väga lihtne, et politsei detektiiv öelda, kas te puhastada, et minu jaoks? Või parandada, eks? Tõsta on nagu buzz sõna kõige muu kuriteoga seotud show. Ja reaalsus on see, kui te võtate väga udune pilt kahtlustatava teed midagi halba, ei saa te lihtsalt parandada seda. Sa ei saa suumida lõpmatult. Sa ei saa näha helk kellegi silma pannud, et eriti kuritegevuse, vaatamata levimus seda telekast. Ja nii koos, et lähme motiveerida, et tulemas probleem komplekt pilguheit mõned näitab, kellega võib olla tuttav. [VIDEO PLAYBACK] -OK. Nüüd lähme hea pilk teile. -Hoia seda. Käivita see tagasi. -Oota. Mine õige. -Ei. Freeze et. -Full screen. -OK. Freeze et. Pingutage üles, et on ju? -Vektor on see mees poolt tagarattal. -Zoom in siinsamas kohapeal. -Mis õige varustus, imaged on võimalik suurendada ja teritatud. -Mis see on? -See on suurendamise programmi. -Kas sa selge, et kuni kõik? -Ma ei tea. Olgem suurendada seda. -Tõsta osa-6. -I suurendanud detail ja - -Ma arvan, et seal on piisavalt tõhustada. Vabastage see, et mu ekraanil. -Tõsta peegeldus oma silmaga. Vaatame käivitada kaudu video lisaseadmega. -Edgar, sa saad parandada seda? -Oota. -Ma olen töötanud selles peegeldus. -Kellegi peegeldus. -Peegeldus. -Seal on peegeldus on mehe nägu. -Peegeldus. -Seal on peegeldus. -Suumida peegel. -Näete peegeldus. -Kas sa parema pildi siit? -Kas teil suurendada teda siin? -Kas sa parandada seda? -Kas sa parandada seda? -Kas me saame parandada seda? -Kas sa parandada seda? -Oota üks sekund, ma suurendada. -Suumida uks. -X10. -Zoom. [Naer] -Viige sisse Oota, lõpetage. -Lõpeta. -Paus. Pööramiseks 75 kraadi ümber vertikaalne palun. [Naer] -Stop ja tagasi osa umbes uks uuesti. -Sain pildi tugevdaja et saab bitmap? -Võib-olla saame kasutada Pradeep Sen meetod näha arvesse aknad. -See tarkvara on nüüdisaegse. -Ikoon väärtus on välja lülitatud. -Õige kombinatsioon algoritme. -Ta on võtnud valgustus algoritme järgmisele tasandile ja ma ei kasuta neid suurendada selle foto. -Lukusta ja suuremalt z-telg. -Tõsta. -Tõsta. -Tõsta. Külmutada ning parandada. [END VIDEO PLAYBACK] DAVID J. Malan: Nii Ülesanded 5 on mis ootab seal. Nii et me varsti paremini mõista , millal ja miks te ei ja meie ei saa suurendada sel viisil. Aga kõigepealt, lähme tagasi pöörduda meie tähelepanu mõned ehitusplokkide paneme pead suutma öelda, et lugu. Nii meenutavad, et me selle joonistas pildi Esmaspäev ja natuke eelmisel nädalal. Ja see kirjeldab paigutust asjad arvuti mälust töötab mõned programmi. Tech segment kuni top, mäletate, viitab tegeliku nulli ja need et koostada oma programm. Seal all, et mõned vormindatud või uninitialized andmed, mis tavaliselt viitab asjad konstandid või stringid või globaalsed muutujad, mis on tunnistatud ette. Seal on hunnik, kuid me tuleme tagasi, et natuke. Ja siis on stack. Palju nagu virna plaate Kohvik on see, kui mälu saab õhuline ja kihiline kui sa seda, mida programmis? Mis on virnas kasutada? Jah? Helista funktsiooni. Iga kord, kui helistada funktsioon, see on antud Kiip mälu selle kohalike muutujate või parameetrite kohta. Ja piltlikult, siis näeme, et iga järjestikuste funktsiooni nimetatakse, kui kutsub B kõnede C kõned D, nad saada kihiline peale virna. Ja igas neist viilud mälu on oma olemuselt unikaalne ulatus selle ülesande täitmiseks, mis muidugi Probleemne on, kui soovite, et käsi ühest funktsiooni teise tükk andmeid, mis sa tahad seda muteeruda või muuta. Mis siis oli meie lahendus, mis võimaldab Funktsioon esindab üks pinu muutmiseks kaadri mälu sees teise freimi? Kuidas need kaks üksteisega rääkivate? Nii teel vihjeid või aadressi, mis jällegi lihtsalt kirjeldada, kus mälu teel konkreetse hammustada number, eelkõige väärtus võib leida. Nii meenutada viimast korda liiga jätkasime lugu ja vaatasin üsna lollakas programmi. Ja see programm on lollakas mõne põhjusi, kuid kõige murettekitav üks on sest ta ei suuda kontrollida, mida? Jah, see ei vaadata sisend. Vabandust? Kui see on rohkem kui 12 tähemärki. Nii väga uhkelt, helistades memcopy, mis, nagu nimigi ütleb, on lihtsalt koopiad mälu Teise argumendiga arvesse selle esimene argument. Kolmas argument, väga uhkelt, on kontrollitakse veendumaks, et te ei kopeerida üle, antud juhul, pikkus baar, tähemärkide arv, arvesse kohtades, mis on selle array C. Aga probleem on selles, et mida kui C ise ei ole piisavalt suur, et hakkama? Sa lähed kopeerida arvu bytes et olete saanud. Aga mida sa tegelikult olla rohkem bytes kui teil on ruumi? Noh, see programm väga rumalalt lihtsalt pimesi tulu võtta mis iganes see on arvestades, tere Kenoviiva 0 on tore, kui string on lühike piisavalt, nagu viis tähemärki. Aga kui see on tegelikult 12 tähemärki või 1200 tähemärki nägime viimast korda et sa oled lihtsalt läheb täielikult kirjutatakse mälu ei kuulu teile. Ja halvim, kui te kirjutada, et punane osa on, et me kutsusime saatja aadress - see on lihtsalt, kui arvuti automaatselt teie eest, taga stseene, tucks ära 32-bitine väärtus meenutab seda, mida aadress see peaks tagasi kui suva see teine ​​funktsioon, tehakse täidesaatva. See leivaraasukese kehvasti millele ta naaseb. Kui sa kirjutada, et potentsiaalselt kui sa oled paha poiss, ei saaks potentsiaalselt üle võtma kellegi arvutis. Ja sa kindlasti crash see enamikel juhtudel. Nüüd on see probleem oli ainult süvendanud kui me hakkasime rääkima mälu juhtimine üldisemalt. Ja malloc, mälu eraldamist, on funktsioon, mida saame kasutada, et eraldada mälu, kui me ei tea ette et me vajada. Nii näiteks, kui ma lähen tagasi seadmele siin. Ja ma avama alates viimane aeg hello2.c, mäletate seda programmi siin, mis tundus natuke midagi sellist, ainult kolm rida - oma nimi, siis string nimi, vasakul, võrdub getString. Ja siis me välja trükkida, kasutaja nimi. Nii et see oli super lihtne programm. Et oleks selge, lubage mul minna ja teha tere-2. Ma lähen tegema dot kaldkriipsuga tere-2. Oma nimi - David. Enter. Tere David. Tundub, et töö OK. Aga mis tegelikult toimub all kapuuts siin? Esiteks olgem Tõmmake mõned kihid. String on lihtsalt sünonüüm oleme aru milleks? Char star. Seega teeme seda pisut kauge kuid tehniliselt õige, et see on char täht, mis tähendab, et nimi, jah, on varieeruv. Aga mis nime kauplustes on aadress char, mis tundub natuke kummaline sest ma saan tagasi string. Ma saan tagasi mitmekordne sümbolid ei char. Aga muidugi, sa pead ainult esimene char aadressi meeles pidada, kus terve rida on, sest miks? Kuidas aru saada, kus lõpuks string teades algusest? Kenoviiva null. Nii need kaks vihjeid nuputada enne algust ja lõppu iga string on, nii kaua, kui nad nõuetekohaselt moodustatud, et null terminaator et Kenoviiva null. Aga see nõuab getString. Ja selgub, et getString kõik see aeg on olnud omamoodi petnud meid. See on teinud seda tööd, et olla kindel, saada string kasutaja. Aga kui see on mälu välja tuleb? Kui me läheme tagasi pilt siin kohaldatakse määratlusega ainult hetk tagasi, et stack on kui mälu läheb, kui ülesanded on kutsutud, selle loogika, kui helistate getString, ja siis ma kirjutada D-A-V-I-D Märkida vajaduse on D-A-V-I-D Kenoviiva null salvestatud, mis põhineb lugu oleme rääkinud meile palju? Tundub olevat korstnat, eks? Kui helistate saada string saad väike tükk mälu stack. Seega on loogiline, et D-A-V-I-D Kenoviiva null on salvestatud seal pakis. Kuid oodake minut, getString tulu et string, nii et rääkida, mis tähendab, see salv kohviku võetakse ära pinu. Ja me ütlesime, viimane aeg, et kiiresti tagastab funktsioon, ja sa võtad, et salve, nii et rääkida, ära pinu mida sa saad endale umbes jäänused et mälu? Ma justkui redrew need küsimärgid sest nad tegelikult saada tundmatu väärtused. Neid võib uuesti kasutada, kui mõned Järgmise funktsiooni nimetatakse. Teisisõnu, kui me juhtumisi tuleb hoidmine - Ma joonistan kiire pilt siin virna. Kui me juhtumisi joonistus alt minu mälu segment ja me öelda et see on koht, mälu hõivatud peamine ja võib-olla arg c ja arg v ja kõike muud programmi, kui getString nimetatakse, arvatavasti getString saab tüki mälu siin. Ja siis D-A-V-I-D kuidagi jõuab seda funktsiooni. Ja ma lähen lihtsustavad. Aga oletame, et selle D-A-V-I-D Kenoviiva null. Nii et see palju baite kasutatakse raami getString. Aga niipea, kui getString naaseb, me ütles viimane kord, et see mälu üle siin kõik muutub - woops! - kõik muutub tõhusalt kustutada. Ja me ei mõtle seda praegu küsimus märgid, sest kes teab, mis toimub, et saada selle mälu. Tõepoolest, ma väga tihti kõne funktsioonid va getString. Ja niipea, kui ma kutsun mõne muu funktsiooni kui getString, võibolla mitte Selle konkreetse programmi me lihtsalt vaatas juures, kuid mõned teised, kindlasti mõned muud funktsioon võib lõpuks antakse Selle kõrval koha stack. Nii et see ei saa olla, et getString kauplustes D-A-V-I-D korstnat, sest ma tahan, kohe kaotada juurdepääsu. Aga me teame, et nad getString ainult naaseb mida? See ei ole tagasi mulle kuus tähemärki. Mis on see tõesti tagasi ei me järeldada, viimane kord? Aadress esimene. Nii kuidagi, kui sa helistasid getString, see eraldada tüki mälu string, et kasutajad tüüpi ja siis jälle aadressi ta. Ja selgub, et kui sa tahad toimida eraldada mälu selle viis ja tagasi isik, kes nimetatakse et funktsioon, aadress et tüki mälu, sa absoluutselt ei pane see korstnat põhja, sest funktsionaalselt on see lihtsalt läheb ei saanud sinu väga kiiresti, nii et saate ilmselt arvata, kui me ilmselt läheb Toss selle asemel, nn hunnik. Nii vahel allosas oma mälu on kujundus ja ülaosas oma mälu on layout on terve hunnik segmentides. Üks on korstna ja õigus Eespool on hunnik. Ja hunnik on lihtsalt erinev tüki mälu, mis ei ole kasutatavad funktsioonid kui neid kutsutakse. Seda kasutatakse pikaajalise mälu, kui tahad üks funktsioon haarata mõned mälu ja saaks riputada see kaotamata kontrolli selle üle. Nüüd võid olla kohe näha, et see ei ole tingimata täiuslik disain. Nagu oma programmi eraldatud mälu korstnat, või kui helistate rohkem ja rohkem funktsioone, või kui te eraldada mälu hunnik koos malloc välja nagu getString teeb, mis selgelt tundub olevat vältimatu probleem? Just. Sarnaselt sellele, et need nooled on üksteisele suunatud ei tõota. Ja tõepoolest, me võiksime väga kiiresti krahhi Programmi mis tahes mitmel viisil. Tegelikult ma arvan, et meil võiks olla seda teinud kogemata üks kord. Või kui mitte, teeme ära tahtlikult nüüd. Lubage mul minna ja kirjutada super kiiresti programmi nimega dontdothis.c. Ja nüüd ma lähen siin ja ei terav hulka stdio.h. Olgem kuulutada funktsiooni foo võtab ühtegi argumenti, mis on tähistatakse samuti poolt tühine. Ja ainus asi foo läheb vaja on Kõne suva, mis ilmselt ei ole targem mõte, kuid olgu nii. Ent peamine tühine. Nüüd on ainus asi, peamine läheb teha, on helistada foo samuti. Ja lihtsalt peksab, ma lähen käia siin ja öelda printf "Tere suva. " OK. Nii et kui ma ei eksi, Tee dontdothis dot kaldkriips. Ja teeme seda suurem aken - dot slash, dontdothis. Tule. Uh oh. Ilmselt saab seda teha. Kurat. OK. Oota. Oodake. Kas me - Me ei kasuta seda teha. [Ohkab] Ma tean, aga ma arvan, et me lihtsalt kustutada seda. Uh, jah. Kurat. Lahenda see Rob. Mida? See on väga lihtne. Jah, me pöördusime optimeerimise off. OK, seista aega. Nüüd ma ennast paremini. OK. Hea küll. Teeme kompileeri see - Tee sa dontdothis. Te võib-olla ümber see, et dothis.c vaid hetk. Vot nii. Aitäh. OK. Nii, et ma olin trükkimine midagi välja oli tegelikult lihtsalt aeglustab protsessi, millega me oleks nii kaugele jõudnud. OK. Phew! Mis siis tegelikult toimub? Põhjuseks on, just nagu kõrvale, on tee midagi nii panuse ja väljund kipub olema aeglasem, sest sa on kirjutada märke ekraan, see on kerida. Nii pikk lugu lühike, oli mul tegelikult juhtus nii kannatamatu, oleks meil näinud seda lõpptulemus ka. Nüüd, kui ma sain sõita print-ups, näeme seda kohe. Miks see nii on. Noh, lihtne selgitus, muidugi, on see, et suva ilmselt ei tohiks kutsudes ise. Nüüd üldiselt see on rekursioon. Ja me arvasime, paar nädalat tagasi rekursiivne on hea. Recursion on see maagiline viis väljendada ennast super tabavalt. Ja see lihtsalt toimib. Aga seal on põhijoon kõik rekursiivne programmid oleme rääkinud kohta ja vaatas seni mis oli see, et neil oli mis? Tugipunkti, mis oli mõned kõva kodeeritud Juhul, ütles mõnes olukorras ei sea suva, mis on selgelt ei ole siin. Mis siis tegelikult toimub mõttes see pilt? Noh, kui peamine nõuab suva, see saab viilu mälu. Kui foo kutsub suva, kui ta saab viil mälu. Kui foo kutsub suva, see läheb tükk. Läheb tükk. Läheb tükk. Sest suva kunagi tagasi. Me ei ole kunagi kustutamine üks neist raamid pinu. Nii et me puhub läbi hunnik, ei rääkimata, kes teab mida veel, ja me ületamata meie niinimetatud segment mälu. Viga minna killustatust vale. Seega lahendus on olemas Loomulikult ei saa seda teha. Aga suurem mõju on see, et jah, seal absoluutselt on mõned piirmäära isegi kui see ei ole täpselt määratletud, selle kohta, kuidas palju funktsioone saab helistada programm, mitu korda funktsiooni võib helistada ise. Nii et kuigi me tegime jutlustama rekursioon kui see potentsiaalselt maagiline asi Paar nädalat tagasi, et sigma funktsioon, ja kui me saada andmeid struktuuride ja CS50, näete teisi taotlused, see ei ole tingimata parim asi. Sest kui funktsioon nõuab ise, kutsub ise, isegi kui seal on alus juhul, kui sa ei tabanud, et aluspõhimõtted eest 1000 kõned või 10000 kõnede poolt et aeg, mida oleks võinud otsa toas oma nn korstna ja vajuta mõned teised segmendid mälu. Nii see ka on disaini kompromiss vahel elegants ja vahel stabiilsuses teie rakendamist. Nii et seal on veel negatiivsed või teine ​​gotcha et me oleme teinud siiani. Kui ma helistasin getString - lase mul minna tagasi tere-2. Pange tähele, et ma helistan getString, tagastava aadress. Ja me väidame täna sellele aadressile on hunnik. Ja nüüd ma olen väljatrükk string sellel aadressil. Kuid me pole kunagi kutsutud vastand getString. Meil pole kunagi olnud CALLL funktsioon nagu ungetstring, kuhu käsi tagasi et mälu. Aga ausalt öeldes me ilmselt oleks pidanud olema. Sest kui me küsime endiselt arvuti mälu teel keegi nagu getString kuid ei anna see tagasi, kindlasti et liiga on kohustatud viima probleeme, millega me otsa mälu. Ja tegelikult, saame otsida need probleeme uue tööriista, mille kasutamine on veidi segasena kirjutada. Aga lubage mul minna ja tere it up ekraanil vaid hetk. Ma lähen edasi minna ja käivitada Valgrind parameeter, mille esimene käsk line argument on nimi kõnealuse programmi tere-2. Ja kahjuks on see toodang on metsikult keeruline mingit põhjust. Nii me näeme kõik, et jama. David on märgitud minu nimi. Nii et see programm tegelikult töötab. Ja nüüd me saame selle toodangut. Nii Valgrind sarnaneb sisuga GDB. See pole siluri iseenesest. Aga see on mälu kontrollija. See on programm, mis töötab teie programmi ja ütleb teile, kui teil palutakse arvuti mälu ja kunagi andis ta tagasi, mis tähendab, et teil on mäluleke. Ja mälu lekked kipuvad olema halb. Ja sa ei kasutajate arvutid on ilmselt tundis seda, kas teil on Mac või PC. Kas olete kunagi kasutanud oma arvutit kuigi mitte rebooted mitmes päeva, või olete lihtsalt sain palju programmid töötavad, ja neetud asi aeglustab järsult pidurdada, või vähemalt see on super tüütu kasutada, sest kõike just super aeglane. Nüüd, võib olla mis tahes mitmel põhjusel. See võiks olla lõputu silmuse, viga kellegi kood, või lihtsamalt, see võib tähendada, et te kasutate rohkem mälu või üritab, kui teie arvuti tegelikult on. Ja võib-olla seal on viga mõnes programmis et hoida paludes mälu. Brauserid aastaid olnud tuntud see, paludes rohkem ja rohkem mälu kuid kunagi teisaldus tagasi. Kindlasti, kui teil on vaid piiratud mälu, sa ei saa küsida lõpmatult palju kordi mõned, et mälu. Ja mis sa näed siin, kuigi jälle Valgrind väljund on tarbetult keeruline pilk Esiteks, see on huvitav osa. Heap - kasutusel väljumist. Nii et siin on, kui palju mälu oli kasutusel hunnik juures aeg minu programm lahkus - ilmselt kuus baiti ühe ploki. Nii et ma lähen laine mu käed millise plokk on. Mõtle see on lihtsalt kamakas, rohkem tehniline sõna patakas. Aga kuus baiti - millised on kuus baiti et olid veel kasutusel? Täpselt. D-A-V-I-D Kenoviiva null, viis kirja nimi pluss null terminaator. Nii et see programm valgrind märganud, et ma küsis kuus baiti ilmselt poolt viis getString, kuid mitte kunagi andis neile tagasi. Ja tegelikult, see ei pruugi olla nii selge kui mu programm ei ole kolme rida, aga see on 300 rida. Nii saame tegelikult annab teise käsu line argument Valgrind et muuta see lobise. See on natuke tüütu meeles pidada. Aga kui mina - vaatame. Lekke - Oli see lekkida - isegi ma ei mäleta mis see on ära kasutatud. - Lekke kontroll võrdub täis. Jah, tänan. - Lekke kontroll võrdub täis. Enter. Sama programm töötab. Kirjuta David uuesti. Nüüd ma näen veidi täpsemalt. Aga alla hunnik kokkuvõte, mis on identne nelja - ah, see on omamoodi tore. Nüüd Valgrind tegelikult otsin natuke raskem minu kood. Ja ta ütleb, et ilmselt malloc real - me välja suumida. Real - me ei näe, mida liin on. Aga malloc on esimene süüdlane. Seal on blogi malloc. Olgu? OK, ei. Õigus? Ma helistasin getString. getString ilmselt nõuab malloc. Nii et mida koodirida on ilmselt süüdi selle eest, et eraldatakse see mälu? Oletame, et kes kirjutas malloc on olnud juba piisavalt kaua, et see on ei ole nende süü. Nii et see on tõenäoliselt minu. getString in cs50.c - nii et see on fail kusagil arvutis - vastavalt 286 tundub olevat süüdlane. Nüüd oletame, et CS50 olnud ümber korralik summa aega, nii et me liiga on eksimatu. Ja nii on see ilmselt ei getString et viga peitub, vaid pigem tere-2.c line 18. Võtame pilk mida see rida 18 oli. Oh. Kuidagi see liin ei pruugi lollakas, per se, kuid see on ka põhjus, taga, et mälu leke. Nii super lihtsalt, milline oleks intuitiivselt olla lahendus siin? Kui me palume mälu, ei ole kunagi olnud andes selle tagasi, ja mis tundub olevat probleem, sest aja jooksul minu arvuti võib mälu täis, võib aeglustada alla, halbu asju võib juhtuda ka, Mis on lihtne intuitiivne lahendus? Lihtsalt anna see tagasi. Kuidas vabastada, et mälu? Noh, õnneks see on üsna lihtne lihtsalt öelda vaba nimi. Ja me oleme seda varem teinud. Aga sa võid sisuliselt mõelda vaba kui vastupidine malloc. tasuta on vastupidine eraldades mälu. Nüüd lubage mul kompileeri see. Tee tere-2. Lubage mul kasutada seda uuesti. tere-2 David. Seega tundub, et töötada täpselt samamoodi. Aga kui ma lähen tagasi Valgrind ja uuesti käivitada Sama käsu minu värskelt koostatud programmi kirjutades minu nimi on enne - kena. Heap kokkuvõte - kasutusel exit - null baiti null plokke. Ja see on super kena, kõik hunnik plokid vabastati. Lekked on võimalikud. Nii tulemas, mitte Ülesanded 4, kuid Ülesanded 5 kohtuekspertiisi ja edasi, see liiga muutub Meetme õigsuse oma programm, kas teil on või ei ole mälu lekked. Aga õnneks mitte ainult võite põhjendada nende kaudu intuitiivselt, mis on väidetavalt lihtne väikesed programmid kuid raskem suuremate programmide puhul Valgrind, neile suuremate programmide puhul aitab tuvastada erilist probleemi. Aga on veel üks probleem mis võivad tekkida. Lubage mul avada see fail siin, mis on, jälle veidi lihtne näide. Kuid olgem keskenduda see programm teeb. Seda nimetatakse memory.c. Me postitada selle hiljem täna zip tänase lähtekoodi. Ja teate, et mul on funktsioon nimega f, et ei võta argumente ja tagasi midagi. Vastavalt 20, ma olen ilmselt kuulutatakse pointer int ja nimetades seda x. Ma määrates on tagasi väärtus malloc. Ja just, et oleks selge, kui palju baite olen Ma ilmselt saan tagasi malloc selles olukorras? Ilmselt 40. Kust sa selle said? Noh, kui te mäletate, et int on sageli 4 baiti, vähemalt see on aparaat, 10 korda 4 on ilmselt 40. Nii malloc tagastava aadress tüki mälu ja ladustamiseks, mis käsitleda lõppkokkuvõttes x. Seega peab olema selge, mida siis toimub? Noh, las ma vahetan tagasi meie pilt siin. Ma ei või lihtsalt juhtida alt mu arvuti mällu, lubage mul minna ja juhtida kogu ristküliku esindab kõiki minu RAM. Me ütleme, et korstnat on põhjas. Ja seal on tekst segmendis uninitialized andmed. Aga ma lihtsalt abstraktne need muud asjad ära nagu dot, dot dot. Ma lihtsalt viidata sellele nagu hunnik ülaosas. Ja siis allosas see pilt, esindada peamine, ma lähen anda see viiludeks mälu stack. F, ma annan ta viil mälu kohta virna. Nüüd sain konsulteerida oma lähtekoodi uuesti. Millised on kohalike muutujate jaoks peamine? Ilmselt mitte midagi, nii et viil on tõhusalt tühi või isegi mitte nii suur kui ma olen ära,. Aga f, mul on kohaliku muutuja, mida nimetatakse x. Nii et ma lähen edasi minna ja f tüki mälu, nimetades seda x. Ja nüüd malloc 10 korda 4, Nii malloc 40, kus see on mälu tuleb? Me ei tõmmatud pilt nagu seda enne. Aga oletame, et see on tõhus tulevad siia, et üks, kaks, kolm, neli, viis. Ja nüüd ma pean neist 40. Nii et ma lihtsalt ei dot, dot, dot soovitada et seal on isegi rohkem mälu tulevad tagasi hunnik. Nüüd sellest, mis on aadress? Valime meie meelevaldne käsitleda nagu alati - Ox123, kuigi see on ilmselt läheb olla midagi hoopis muud. See on aadress esimene bait mälu, et ma küsin malloc eest. Nii lühike, kui liin 20 hukatakse, mis on sõna otseses mõttes ladestunud x here? Ox123. Ox123. Ja Ox on ebahuvitav. See tähendab lihtsalt, siin on kuueteistkümnendsüsteemis number. Aga mis peamine on see, et mida ma poest aastal x, mis on kohaliku muutuja. Aga selle andmetüübi jällegi on aadress int. Noh, ma lähen hoida Ox123. Aga jälle, kui see on liiga keeruline asjatult, kui ma leidke tagasi, võime abstraktselt see ära üsna mõistlikult ja lihtsalt öelda, et x on kursor et patakas mälu. OK. Nüüd on küsimus käepärast on järgmine - liin 21, selgub, on lollakas. Miks? Vabandust? See ei pea - öelda, et veel kord. Noh, see ei ole tasuta. Nii et see teine ​​aga. Nii et seal on üks teine ​​aga spetsiaalselt real 21. Täpselt. See lihtne rida koodi on vaid buffer overflow, puhvri ületäitumise. Puhver tähendab lihtsalt tüki mälu. Aga et patakas mälu suurus 10, 10 täisarvud, mis tähendab, et kui me indeks, kasutades süntaktiline suhkur massiivi indeks, ruut sulgudes, on teil juurdepääs x sulg 0 x sulg 1 x, sulg dot, dot, dot. x sulg 9 on suurim ühe. Nii et kui ma teen x sulg 10, kus Ma olen tegelikult läheb mälu? Noh, kui mul on 10 int - olgem tegelikult teha kõik Nende siin. Nii et oli esimese viie. Siin on teine ​​viis ints. Nii x sulg 0 on siin. x sulg 1 on siin. x sulg 9 on siin. x sulg 10 on siin, mis tähendab, ma ütlen, vastavalt 21, arvuti panna number kus? Number 0, kus? Noh, see on 0, jah. Aga asjaolu, et selle 0 on selline juhus. See võib olla mitmeid 50, kõigi me hoolime. Aga me üritame panna see x sulg 10, mis on koht, kus see küsimärk on koostatud, mis see ei ole hea asi. See programm võib väga hästi lennuõnnetuse tagajärjel. Nüüd saab minna ja vaadata, kas see on tõepoolest see, mis juhtub. Tee mälu, sest fail nimetatakse memory.c. Lähme edasi ja joosta Programmi mälu. Nii et meil vedas, tegelikult tundub. Meil vedas. Aga vaatame, kas me nüüd joosta Valgrind. Esmapilgul minu programm võib näivad olevat täiesti õige. Aga lubage mul joosta Valgrind koos - Lekke kontroll võrdub terve mälu. Ja nüüd, kui ma saan seda - huvitav. Vigane kirjutada suurus 4 juures line 21 memory.c. Line 21 memory.c on milline? Oh, huvitav. Aga oota. Suurus 4, mis see on, viidates? Ma ainult ei üks kirjutada, aga see on suurus 4. Miks on 4? See on sellepärast, et see on keskmine, mis on jällegi neli baiti. Nii Valgrind leidnud vea, et mina, piilus minu kood, ei ole. Ja võib-olla oma TF ja millal mitte. Mis aga Valgrind kindlasti leidnud, et me teinud vea seal, isegi kuigi me vedas ja arvuti otsustas, eh, ma ei kavatse krahhi lihtsalt sellepärast, et sa puudutasid üks bait, üks int väärtuses mälu, et sa ei tegelikult ise. Noh, mida muud on lollakas siin. Aadress - see on hull otsin aadress kuueteistkümnendsüsteemis. See tähendab lihtsalt kuskil kivikangur null baiti pärast ploki suurus 40 jaotatakse. Lubage mul välja suumida siin ja vaata, kas see on natuke rohkem kasulik. Huvitav. 40 baiti on kindlasti kadunud kaotus rekord 1 1. Jällegi rohkem sõnu kui on kasulik siin. Aga mis põhineb esile rida, kus ma peaks ilmselt keskenduda oma tähelepanu veel viga? Paistab line 20 memory.c. Kui me läheme tagasi liin 20, mis on üks, mida tuvastatud varem. Ja see ei ole tingimata lollakas. Aga meil on see vastupidine mõju. Niisiis, kuidas ma parandada vähemalt üks neist vigadest? Mida ma tegema pärast rida 21? Ma võiks teha tasuta x, nii on tagasi anda, et mälu. Ja kuidas ma saan määrata see viga? Ma peaks kindlasti minema mitte kaugemale kui 0. Nii et lubage mul proovida ja uuesti käivitada. Vabandust, kindlasti minna mitte kaugemale kui 9. Tee mälu. Lubage mul uuesti, Valgrind suuremas aknas. Ja nüüd vaata. Nice. Kõik hunnik plokid vabastati. Lekked on võimalikud. Ja üles üle siin, seal ei mainita enam on kehtetu õigus. Lihtsalt saada ahne, ja olgem kas teine ​​demonstratsioon ei lähe nii nagu ette nähtud - Ma ei saada õnnelik hetk tagasi. Ja asjaolu, et see on 0 on ehk asjatult eksitav. Teeme 50, mõnevõrra meelevaldne number, siis mälu dot kaldkriipsuga mälu - ikka veab. Midagi krahh. Oletame, ma lihtsalt teha midagi tõeliselt rumal, ja ma teen 100. Lubage mul uusversioon mälu dot kaldkriipsuga mälu - vedas jälle. Kuidas 1000? ints kaugemale umbes nii, kus ma peaks olema? Tee mälu - kurat. [Naer] OK. Ärme jändama enam. Rerun mälu. Vot nii. Hea küll. Nii ilmselt teil indeks 100000 ints kaugemale, kui te oleks pidanud mälu, halbu asju juhtuda. Nii et see ei ole ilmselt raske, kiire reegel. Mul oli selline kasutades kohtuprotsessi ja viga saada seal. Aga see on, sest pikk lugu lühike, arvuti mälu on ka jagatud neisse asju nimetatakse segmentides. Ja mõnikord, arvuti tegelikult on andnud teile natuke rohkem mälu kui te küsite. Aga efektiivsus, see on lihtsalt lihtsam rohkem mälu, aga ainult sulle et sa saad selle osa. Ja kui sul veab mõnikord seega sa võiksid puudutada mälu, mis ei kuulu teile. Teil ei ole garantiid, et see, mida raha paned sinna jääb sinna, sest arvuti ikka arvab, et see ei sinu, kuid see ei ole tingimata positiivsed lüüa teine ​​segment mälu arvuti ja põhjustada viga nagu see siin. Hea küll. Küsimusi siis mälu? Hea küll. Võtame pilk siin, siis on midagi, mida me oleme võtnud vastu antud üsna pikka aega, mis on see fail nimega cs50.h. Nii et see on fail. Need on lihtsalt terve hunnik kommentaaride up top. Ja sa võisid vaatasid seda, kui sa torkasid ümber seadme. Aga selgub, et kogu aeg, kui me kasutasid stringi sünonüüm, mille abil me tunnistada et sünonüüm oli see märksõna typedef, tüübi definitsioon. Ja me põhiliselt öeldes teha string sünonüümina char star. See vahend, mille pinu loodud neid Apupyörät tuntakse string. Nüüd siin on lihtsalt prototüüp jaoks getchar. Me oleks võinud seda varem näinud, kuid see on tõesti see, mida ta teeb. getchar ei võta argumente, tagastab char. getdouble võtab ühtegi argumenti, tagastab topelt. getfloat võtab ühtegi argumenti, naaseb float, ja nii edasi. getint on siin. getlonglong on siin. Ja getString on siin. Ja ongi kõik. See lilla joon on veel eeltöötluse Direktiivi tõttu hashtag alguses ta. Hea küll. Nüüd lubage mul minna cs50.c. Ja me ei räägi liiga kaua seda. Aga teile pilguheit mis on kestnud kõik see aeg, andke minna - Teeme getchar. Nii getchar on enamasti kommentaarid. Aga tundub, et see. Nii et see on tegelik funktsioon getchar et me oleme võttes enesestmõistetavaks olemas. Ja kuigi me ei kasuta seda üks et sageli, kui üldse, on see vähemalt suhteliselt lihtne. Nii et see on väärt võtmist Kiire pilk siia. Nii getchar on lõputu silmuse, tahtlikult nii ilmselt. Seejärel kutsub - ja see on selline kena taaskasutust kood me ise kirjutas. Ta kutsub getString. Sest mida see tähendab saada char? Noh, võite samuti proovida saada terve rea teksti kasutaja ja siis lihtsalt pilk üks nende tähemärki. Vastavalt 60, siin on vähe natuke meelerahu kontrolli. Kui getString tagastatakse null, ärme minna. Midagi läks valesti. Nüüd on see pisut tüütu, kuid tavalised C. char max arvatavasti näitab, mida lihtsalt põhineb tema nimi? See on pidev. See on nagu numbriline väärtus Suurim char saab esindada koos üks hammustus, mis on ilmselt number 255, mis on suurim arv, mida esindavad kaheksa bitti, alates nullist. Nii et ma olen seda, et see funktsioon, kui Kirjutan seda koodi, vaid sellepärast, kui midagi läheb valesti getchar kuid tema eesmärk elus on naasta char, pead kuidagi suutma märku, et kasutaja, et midagi läks valesti. Me ei saa naasta null. Selgub, et null on osuti. Ja jälle getchar on tagasi char. Nii konventsiooni kui midagi läheb vale, on sul, programmeerija või Sellisel juhul mulle raamatukogu, pidin lihtsalt otsustada suvaliselt, kui midagi läheb valesti, ma lähen tagasi number 255, mis on ka tegelikult tähendab, et me ei saa, ei saa kasutaja tippida iseloomu esindajad nr 255, sest me pidime varastama kui nn valvur väärtust esindama probleem. Nüüd selgub, et märk 255 ei ole midagi, mida saab kirjutada edasi klaviatuuril, nii et see ei ole suur asi. Kasutaja ei märka, et Olen varastatud see märk. Aga kui sa kunagi näha mees lehekülge arvutisüsteemi mõned viited kõik mütsid pidevalt niimoodi, mis ütleb: juhtudel viga see pidev jõud tagasi, et kõik on mõned inimeste tegi aastat tagasi oli otsustasin tagasi see eriline väärtus ja nimetame seda pidevalt, kui midagi läheb valesti. Nüüd magic juhtub siin. Esiteks, ma kuulutab line 67 kaks märki, C1 ja C2. Ja siis vastavalt 68, seal on tegelikult koodirida see meenutab meie sõber printf, arvestades, et see ei ole protsenti Cs jutumärkides. Aga teate, mis siin toimub. sscanf tähendab string Scan - tähendab skaneerida vormindatud string, ergo sscanf. Mida see tähendab? See tähendab, et sul läheb sscanf string. Ja joon on ükskõik kasutaja tipib sisse Sul läheb sscanf stringi nagu see, mis ütleb scanf millised on sa lootes kasutaja on kirjutatud sisse Seejärel liigu-in aadressid kaks tükkideks mälu, sel juhul sest mul on kahe kohahoidjaga. Nii et ma annan selle aadress C1 ja aadress C2. Ja meenutada, et sa annad funktsioon aadress mõned muutuja, mis Mõju? Mida see funktsioon teha tulemusena anda see aadress muutuja, mitte muutuja ise? See võib muuta see, eks? Kui sul oleks keegi kaart füüsilise aadress, võivad nad minna ja teha mida iganes nad tahavad, et aadress. Sama mõte siin. Kui meil läheb sscanf, aadress kahest tükkideks mälu, isegi need tillukesed vähe tükkideks mälu, C1 ja C2, kuid me öelda, et see aadress neist, sscanf seda muuta. Nii sscanf eesmärk elus, kui me loeme man, on lugeda, mida kasutaja kirjutada, loodan, et kasutaja, kellel tipitud iseloomu ja võibolla teise märgi, ja mis iganes kasutaja trükkida, esimene märk läheb siin, teine ​​märk läheb siia. Nüüd, kui kõrvale, see, ja sa tean vaid seda alates dokumentide asjaolu, et panin tühja ruumi seal lihtsalt, et ma ei hooli, kui kasutaja tabab Space bar paari korda enne kui ta võtab iseloomu, ma lähen ignoreerida iga tühja ruumi. Nii et, ma tean dokumentatsiooni. Asjaolu, et seal on teine% c järgneb valge ruum on tegelikult tahtlik. Ma tahan, et oleks võimalik tuvastada, kas kasutaja silmamunad või ei teinud koostööd. Nii et ma loodan, et kasutaja ainult trükkida aastal üks märk, seega ma loodan, et sscanf on ainult kavatse tagasi väärtus 1, sest jällegi, kui ma lugesin dokumentatsiooni sscanf eesmärk on elu on naasta arvu muutujaid, mis olid täis kasutaja sisend. Ma möödunud kahe muutuja aadressid, C1 ja C2. Ma loodan siiski, et ainult üks neid saab surma, sest kui sscanf tagastab 2, mis eeldatavasti Mõju loogiliselt? See kasutaja ei anna mulle üks iseloomu nagu ma ütlesin talle. Nad ilmselt kirjutate vähemalt kaks märki. Nii et kui ma selle asemel ei ole teise % C, ma lihtsalt pidin ühe, mis ausalt oleks intuitiivne lähenemine, ma arvan Esmapilgul te ei kavatse olla võimeline avastama kui kasutaja on annab teile rohkem sisend kui sa tegelikult tahtsid. Nii et see on kaudne vorm vigade kontroll. Aga teate, mida ma teen siin. Kui ma olen kindel, et kasutaja andis mulle üks iseloomu, ma vaba rida, tehes vastand getString, mis omakorda kasutab malloc ja siis ma tagasi C1, iseloomu, et ma lootsin kasutaja ette ja ainult tingimusel. Nii kiire ühtesid ainult, kuid lisaküsimusi getchar? Me tuleme tagasi mõned teised. Noh, lubage mul minna ja seda teha - Oletame nüüd, lihtsalt motiveerida meie arutelu nädalas pluss aeg, seda on fail nimega structs.h. Ja veel, see on lihtsalt maitse midagi, mis meid ees ootab. Aga teate, et palju selle kohta on märkusi. Nii et lubage mul rõhutada ainult Huvitav osa nüüd. typedef - seal on sama märksõna uuesti. typedef me kasutame kuulutada string nagu erilist andmete liiki. Võite kasutada typedef luua täiesti uus andmetüübid, et ei ole olemas, kui C leiutati. Näiteks int kaasas C. char Kaasas C. topelt kaasas C. Kuid pole mõiste üliõpilane. Ja veel, et oleks päris kasulik olla võimalik kirjutada programm, mis salvestab muutuv, õpilase ID number, oma nimi ja oma maja. Teisisõnu, kolm tükki andmeid, nagu int ja string ja muu string. Mis typedef, mis on päris võimas selle ja märksõna sturct eest struktuur, sa, programmeerija 2013 saab tegelikult määrata oma andmetüübid, et ei ole olemas aastat tagasi, vaid et see sobiks teie eesmärkidel. Ja nii siin, read 13 kuni 19, me kuulutatakse uus andmetüüp, nagu int, kuid nimetades seda üliõpilane. Ja sees muutuja läheb Kolm asja - int, string, ja string. Nii et sa ei mõtle, mis on tõesti juhtus siin, kuigi see on natuke lihtsamaks täna üliõpilane on sisuliselt läheb näeb välja selline. Selle saab tüki mälu ID nimi valdkonnas, ja maja valdkonnas. Ja me saaks kasutada neid tükkideks mälu ja neid kasutada järgmiselt. Kui ma minema struct0.c, siin on suhteliselt pikk, kuid pärast muster, kood, mis kasutab seda uut nippi. Nii et esimene, las ma juhtida teie tähelepanu et huvitav osad üleval. Sharp määratleb õpilased 3, teatab pidev nimetatakse õpilased ja määratud ta omavoliliselt number 3, siis nii et mul on kolm õpilast kasutades Selle programmi nüüd. Siin on peamised. Ja teate, kuidas ma kuulutada massiivi õpilased? Noh, ma lihtsalt kasutada sama süntaks. Sõna üliõpilane on ilmselt uus. Kuid õpilane, klassi sulg õpilastele. Nii kahjuks on palju taaskasutamise mõistete siin. See on lihtsalt number. Nii et see on nagu öelda kolm. Klass on just see, mida ma tahan, helistada muutuja. Ma võiks seda nimetada õpilastele. Aga klass ei ole see klass objektorienteeritud Java liiki viisil. See on lihtsalt klassi õpilastele. Ja andmetüübi iga element selles massiivis on üliõpilane. Nii et see on natuke erinev ja ütleb midagi niimoodi, et see on lihtsalt - Ma ütlen mulle kolm õpilast ja helistada, et massiivi klassi. Hea küll. Nüüd on neli silmus. See mees on tuttav - Kerrata nullist kuni kolmel. Ja siin on uus tükk süntaks. Programm läheb küsib mind, inimese, anda talle üliõpilane ID, mis on int. Ja siin on süntaks, mille saate salvestada midagi ID väljal Asukoht klassi sulg I. Nii Selle süntaks ei ole uus. See tähendab lihtsalt, anna mulle kaheksas klassi õpilaste. Aga see sümbol on uus. Siiani oleme saa kasutada dot, vähemalt kood niimoodi. See tähendab, minge struct tuntakse õpilane ja pane midagi. Samamoodi see järgmisele reale 31, minge käia ja panna mida iganes kasutaja liigid Nime siin ja mida nad teevad maja, sama asi, edasi minna ja pane see. majas. Mida see programm lõpuks teha? Näete väike teaser seal. Lubage mul minna ja ei tee structs 0 dot kaldkriipsuga struct 0, üliõpilase ID 1, ütlevad David Mather, üliõpilane ID 2. Rob Kirkland, üliõpilaspilet 3. Lauren Leverit - ja ainus asi, mida see programm tegi, mis on lihtsalt täiesti meelevaldne, on Ma tahtsin teha midagi selle info, nüüd, et ma olen õpetas meile, kuidas kasutada structs on ma lihtsalt pidin Selle pildi loop siin. Ma Käi massiivi õpilastele. Ma kasutasin meie, ehk nüüd tuttav sõber, string võrrelda stircomp et kontroll on 8. õpilase maja võrdne Ema? Ja kui on, siis lihtsalt printida midagi omavoliliselt meeldi, jah, on küll. Aga jälle, lihtsalt annab mulle võimalusi kasutada ja taaskasutada ja taaskasutada uue dot märke. Kes hoolib, eks? Tulemas üliõpilaste programmi mõnevõrra meelevaldne, kuid selgub, et me saame teha kasulikke asju Selle näiteks järgmiselt. See on palju keerulisem struct aastal C. See sai tosin või rohkem valdkondi, mõnevõrra cryptically nimega. Aga kui sa oled kunagi kuulnud graafika failivorming nimetatakse bitmap, BMP, see Selgub, et bitmap failivorming päris palju tundub, et see. See on rumal vähe smiley nägu. See on väike pilt, mis ma olen suumitud on päris suur, nii et ma ei näe iga üksikisiku dots või pikslit. Nüüd selgub, saame esindada must täpp, ütleme, number 0. Ja valge dot number 1. Nii teisisõnu, kui sa tahad teha Naerusuu ja salvestada et pilt arvuti, siis piisab, kui hoida nulli ja need, mis näeb välja selline, kus, jälle need on valged ja nulle on mustad. Ja koos, kui sa tegelikult on mõnitama ühtesid ja nulle, pead ruudustik pikslit, ja kui te näha neile välja, siis on armas vähe smiley nägu. Nüüd bitmap failivorming, BMP, on tõhusalt, et selle all kapuuts, kuid rohkem piksleid SOT et sa võib tegelikult esindavad värvid. Aga kui teil on keerulisemad formaadid nagu BMP ja JPEG ja GIF kellega võib olla tuttav, need failid kettal on tavaliselt mitte ainult on nullid ja need, pikslit, kuid neil on mõned metaandmed samuti - meta selles mõttes, et ei ole tõesti andmeid, kuid see on kasulik omada. Nii et need väljad on siin tähendab, ja me näeme seda üksikasjalikumalt P-set 5, et enne nulli ja need, mis esindavad pikslit pilt, seal on hunnik metaandmeid pildi ja pildi laius. Ja teate ma kitkumise välja mõned meelevaldsed asjad siin - laius ja kõrgus. Bit arv ja mõned muud asjad. Nii et seal on mõned metaandmed faili. Aga mõista, kuidas failid on sätestatud välja sel viisil, saab tegelikult siis pilte töödelda, taastada pilte kettalt, resize pilte. Aga sa ei pea tingimata arendamiseks. Ma vajasin foto. Nii et ma läksin tagasi RJ siin, kes nägid ekraanil juba mõnda aega tagasi. Ja kui ma avada Keynote siin, see on mis juhtub, kui sa püüad suurendada ja suurendada RJ. Ta ei saa mingit parem tõesti. Nüüd Keynote on selline hägustab see natuke, vaid ilustada Asjaolu, et RJ ei saa eriti täiustuvad suumida Ja kui teha seda nii, vaata väljakud? Jah, saate kindlasti näha ruutu projektor. See on see, mida sa saad, kui teil suurendada. Aga mõista, kuidas meie RJ või Naerusuu ellu laseb meid tegelikult kirjutada koodi, mis manipuleerib neid asju. Ja ma mõtlesin, et ma lõpuks selle märkme juures 55 sekundi tõsta see, Julgen öelda pigem eksitav. [VIDEO PLAYBACK] -Ta valetab. Millest ma ei tea. -Mida me teame? -See on 09:15 Ray Santoya oli ATM. -Nii et küsimus on, mis ta seal 9:16? Shooting üheksa millimeetri juures midagi. Äkki nägi ta snaiper. -Või oli temaga koos töötada. -Oota. Mine tagasi üks. Mida sa näed? -Tooge oma pealpool täisekraanil. -Tema prillid. -Seal on peegeldus. -See on Neuvitas pesapalli meeskond. See on nende logo. Ja ta räägib kes on seljas, et jope. [END VIDEO PLAYBACK] DAVID J. Malan: see olema Ülesanded 5. Näeme järgmisel nädalal. MALE SPEAKER: Järgmisel CS50. [Crickets säutsumine] [Muusika mängib]