[Muzikos grojimo] [Vaizdo įrašų atkūrimas] -Jis Meluoja. -Apie ką? -Nežinau. -Taigi, Ką mes žinome? Išmokėtą sumą 9:15 Ray Santoya buvo bankomato. -Yeah. Taigi kyla klausimas, ką buvo jis daro ne 9:16? -Shooting Į 9 milimetrą į kažką. Gal jis pamatė snaiperis. OR buvo dirbti su juo. -Wait. Grįžti vienas. -Ką tu matai? -Bring Veidą iki visą ekraną. -His Akinius. -Yra Šiek atspindys. -Tai Aisiais Nuevitas beisbolo komandos. Štai jų logotipas. -O Jis kalbėti kas dėvi tą striukę. [PABAIGA PLAYBACK] DAVID Malan: Visos dešinę. Tai CS50 ir tai yra šiek tiek daugiau iš [nesigirdi], su kuria jūs esate žymėjimą su problema nustatyti keturi. Šiandien mes pradedame atrodyti šiek tiek daugiau giliai į šiuos dalykus, vadinamų patarimų, kuri nors tai gana paslaptinga tema, paaiškėja, kad ji vyksta būti priemonės, kuriomis mes gali pradėti statyti ir montavimas daug sudėtingas programas. Bet mes tai padarėme praėjusiais trečiadienį būdu kai Claymation pirmą. Taigi, tai, prisiminti, yra Binky ir mes jį naudoti pažvelgti į programą atrodo, kad ne tikrai nieko daryti įdomu, bet ji atskleidžia keletą problemų. Taigi, norint pradėti šiandien, kodėl ne mes vaikščioti greitai per šiuos veiksmus nedaug, pabandykite atlikti distiliavimą į žmogaus terminuose tiksliai, kas vyksta čia ir kodėl tai yra blogai, ir tada pereiti ir iš tikrųjų pradėti statyti kažką su šia technika? Taigi tai buvo pirmas dvi linijos šią programą ir profanas sąlygomis, kas yra Šios dvi eilutės daro? Kažkas, kas yra pagrįstai patogu su tuo, kas deklaruojama ant ekrano? Kas yra šių dviejų linijų darai? Tai dar ne viskas, kad skiriasi nuo savaitę vieną, bet yra keletas naujų ypatingą simbolis. Taip? Atgal ten. Auditorija: skelbiu patarimų? DAVID Malan: Pasakykite naujo? Auditorija: skelbiu patarimų? DAVID Malan: deklaruojantys patarimų ir tegul ištobulinti šiek tiek daugiau. Auditorija: [nesigirdi] adresas x ir tada m. DAVID Malan: Ir tada spręsti. Taigi būtent tai, ką mes darome yra mes deklaruojant du kintamuosius. Šie kintamieji, nors vyksta būti tipo int žvaigždė, kurią konkrečiau reiškia jie ketina saugoti iš int adresas atitinkamai, x ir y. Dabar yra kokių nors reikšmės? Ar yra kokių nors faktiniai adresai šiose du kintamieji Šiuo metu? Ne. Tai tiesiog vadinamosios šiukšlių vertybes. Jei ne iš tikrųjų priskirti kintamasis, kokia buvo RAM anksčiau ketina užpildyti nuliais ir tie abu iš šių kintamųjų. Bet mes dar nežinome ką jie ir tai bus raktas, kodėl Binky prarado savo galvą praėjusią savaitę. Taigi tai buvo Claymation inkarnacija tai kuriuo turite tik du kintamuosius, mažai apskrito vienetų molis, kuriame galima laikyti kintamuosius, bet kaip įpakuotas iki rodyklės rodo, jie nėra faktiškai nukreipta į bet žinoma per se. Taigi mes turėjome šią eilutę, ir tai buvo nauja praėjusią savaitę, malloc atminties paskirstymą, kuris yra tik išgalvotas būdas pasakoja operacinę sistemą, "Linux" arba "Mac OS arba Windows, ei, duok man šiek tiek atminties, ir visi jūs turite pasakyti operacinė sistema yra tai, ką kai klausia jį atmintyje. Jis nesiruošia rūpintis, ką jūs ketinate daryti su juo, bet jums reikia pasakyti operacinę Sistema ką būdu malloc. Taip? Auditorija: Kiek? DAVID Malan: Kiek? Kiek bitais, ir taip, šis, vėl, puoselėja pavyzdžiui, yra tiesiog pasakyti, duoti man int dydį. Dabar, iš int dydis yra keturi baitai arba 32 bitai. Taigi tai yra tiesiog būdas sakydamas, ei, operacinė sistema, duok man keturis baitųatminties kad aš galiu naudoti mano žinioje, ir konkrečiai, ką malloc grąžinimo atžvilgiu į tą keturių baitų riekė? AUDITORIJA: Adresas? DAVID Malan: adresas. Šio keturių baitų riekė adresą. Būtent. Ir taip, kad tai, kas saugoma galiausiai X ir tai, kodėl mes darome tikrai ne rūpintis, ką šis skaičius adresas, ar tai OX1 arba OX2 arba kai paslaptingas šešioliktainis adresą. Mes tiesiog rūpintis pavaizduotomis piktogramo- kad, kad kintamasis x yra dabar nukreipta į tą atminties riekė. Taigi rodyklė reiškia žymeklį, arba Konkrečiau, atminties adresas. Bet vėl, mes neturime paprastai rūpi kas tie tikrieji adresai. Dabar, ši eilutė sako kas profanas sąlygomis? Zodiako x gauna 42 kabliataškį. Ką tai reiškia? Nori eiti? Negalima subraižyti savo kaklą. Auditorija: X adresas yra 42. DAVID Malan: X adresas yra 42. Nevisai. Taip arti, bet ne visai, nes ten žvaigždė, kad manimi priešdėlį šį x. Taigi mums reikia keisti truputį. Taip? Auditorija: vertė, kad rodyklė x yra nukreipta į tai 42. DAVID Malan: Gerai. Vertė, kad žymiklis x nukreipta į, tarkim, turi būti 42, Kitaip tariant, žvaigždė x sako, eikite į kokios adresą yra x, ar tai 1 Oxford Gatvė arba 33 Oxford Street arba OX1 arba ox33, nepriklausomai nuo kad skaitmeninis adresas yra žvaigždutė x yra x dereferencing. Taigi eiti į tą adresą ir tada įdėti skaičių 42 ten. Taigi, kad būtų lygiavertis būdas pasakyti, kad. Taigi, kad viskas gerai ir tada mes atstovaujame paveikslėlį taip, kur mes pridėjome 42 tą keturių riekė Baitų dešinėje pusėje, bet Ši linija buvo kur viskas nuėjo kreivai ir Binky galva popped nuo šiuo metu, nes blogi dalykai atsitiks, kai Jūs dereference šiukšlių vertybių ar jūs dereference negalioja patarimų ir sakau negalioja nes šiuo taškas istorija, kas yra viduje y? Kokia y vertė, pagrįsta apie pastaruosius keletą žingsnių? Taip? Kas tai? Auditorija: adresą. DAVID Malan: adresą. Tai turi būti adresas bet aš inicializuoti tai? Taigi turiu dar ne. Taigi, kas yra žinoma, kad būti ten? Tai tik keletas šiukšlių vertę. Tai gali būti bet koks adresas nuo nulio iki 2 mlrd jei turite du koncertai RAM, arba nuo nulio iki 4 mlrd jei jūs gavo keturis GB RAM. Tai kai šiukšlių vertė, bet problema yra kad operacinę sistemą, jei ji nėra jums duota kad atminties riekė specialiai kad jūs bandote eiti, tai paprastai vyksta sukelti ką mes matėme, kaip segmentavimo kaltės. Taigi iš tiesų, nors iš jūsų, kurie turi kovojo ne problemas darbo valandomis ar problemų, kad daugiau paprastai su bando išsiaiškinti, segmentacijos kaltė, kad paprastai reiškia jūs neliesti segmento atminties, kad jums neturėtų būti. Jūs neliesti atmintį, operacinė sistema turi ne leido jums liesti, ar tai eidami per toli jūsų masyvo ar dabar pradeda, ar tai reiškia, kad jūs neliesti atmintis, tiesiog kai šiukšlių vertę. Tai darydama star x čia rūšiuoti neapibrėžto elgesį. Jūs niekada neturėtų daryti, nes prieštarauja yra, programa tiesiog vyksta į avariją, nes jūs sakote, eiti šiuo adresu ir jūs neturite idėjos, kur kad adresas tikrųjų yra. Taigi, operacinė sistema yra tikėtina, vyksta į avariją savo programą kaip rezultatas Ir iš tiesų, tai kas atsitiko ten Binky. Taigi galiausiai Binky fiksuoto Ši problema su tai. Taigi šios programos pats buvo klaidingas. Bet jei jūs tarsi išsiveržia į priekį ir vietoj vykdyti šią eilutę, Y lygus x tiesiog reiškia, kokia adresas yra: x, taip pat įdėti jį į y. Ir taip su pavaizduotomis piktogramo-, mes atstovavo tai su dviem rodyklėmis nuo x ir y nukreipta nuo į tą pačią vietą. Taigi semantiškai, x yra lygi Y nes abu iš tų, yra tas pats saugoti Adresas, ERGO nukreipta ne 42, Ir dabar, kai jūs sakote žvaigždę Y, eikite adresu Y, tai turi įdomų šalutinį poveikį. Taigi Y adresas yra Tas pats kaip X adresą. Taigi, jei jūs sakote, eikite adresu į y ir pakeisti reikšmę iki 13, kas dar veikia? X D punkto, taip sakant, turėtų būti paveiktas, taip pat. Ir iš tiesų, kaip Nikas atkreipė šią nuotrauką į Claymation buvo būtent tai. Nors mes sekti rodyklę y, mes galų gale toje pačioje vietoje, ir todėl, jei mes buvome spausdinti iš x arba Y anketa pointee, tada mes norėtume pamatyti 13 vertę. Dabar sakau pointee būti suderinamas su video. Programuotojai, mano žinios, niekada iš tikrųjų tark žodį pointee, ta, kuri yra smailu ne, tačiau siekiant nuoseklumo, su vaizdo, reikia suprasti, tai visa, kas buvo reiškė tokioje situacijoje. Todėl bet koks klausimai Claymation ar patarimų ar malloc tik dar? Nėra? Gerai. Taigi be papildomų ADO, leiskite pažvelgti ne, jei tai yra iš tikrųjų buvo naudojamas tam tikrą laiką. Taigi, mes jau šį CS50 biblioteką kad gavo visus šių funkcijų. Mes naudojamas GetInt daug, GetString, tikriausiai GetLongLong anksčiau mano PSet vienas ar taip, bet kas iš tikrųjų vyksta? Na, tegul priimti greitai pažvelgti po metu programos gaubtu, kad įkvepia, kodėl mes suteikiame Jums CS50 biblioteka, o iš tikrųjų kaip ir praėjusią savaitę, mes pradėjome vartoti tiems, mokymo ratams. Taigi tai dabar rūšiuojami iš Atidarius ką vyksta jau viduje CS50 bibliotekoje, nors mes dabar pradės judėti nuo jo daugumai programas. Taigi, tai yra programa, vadinama scanf 0. Tai itin trumpas. Jis tiesiog turi šias eilutes, tačiau ji pristato funkcija vadinama scanf kad mes iš tikrųjų ketiname pamatyti viduje iš CS50 bibliotekoje momentas, nors šiek tiek kitokia forma. Taigi ši programa internete 16 yra paskelbti kintamąjį x. Taigi man keturis baitų int. Tai buvo pasakoti vartotoją, Taškų prašome, tada tai yra įdomus linija, kuri iš tikrųjų susieja praėjusią savaitę ir šis. Scanf, tada pastebėsite, jis trunka formato eilutę, kaip printf, % i tai int, ir tada ji užima Antrasis argumentas, kuris atrodo šiek tiek funky. Tai Ampersand x, ir prisiminti, mes tik pamačiau šį kartą praeitą savaitę. Ką Ampersand x atstovauti? Ką daryti Ampersand C? Taip? Auditorija: Iš adresą. DAVID Malan: Iš adresą. Taigi, tai priešinga Star operatoriaus, o žvaigždė operatorius sako, eikite į tai adresas, Ampersand operatorius sako, išsiaiškinti adresas šį kintamąjį, ir todėl tai yra raktas, nes scanf gyvenimo tikslas yra nuskaityti vartotojo anketa įvesties iš klaviatūros, priklausomai ką jis ar ji tipų ir tada skaityti, kad vartotojas indėlį į kintamąjį, bet mes mačiau per pastarąsias dvi savaites kad apsikeitimo funkcija, kad mes bandė pastangų įgyvendinti buvo tiesiog neveikia. Prisiminkite, kad su apsikeitimo funkcija, jei mes tiesiog pareiškė, A ir B int, mes sėkmingai apsikeitimo du kintamieji viduje apsikeitimo tiesiog patinka su pienu ir OL, bet kaip tik apsikeitimo grįžo, kas buvo su pagarba rezultatas X ir Y pradines reikšmes? Nieko. Taip. Nieko atsitiko, kad laiko, nes apsikeitimo pakeisti tik savo vietos kopijas, kuris yra pasakyti, visi šį kartą, kai mes buvo einančios į argumentus funkcijoms, mes tik artimųjų kopijas šių argumentų. Tai galite padaryti su tuo ką nori su jais, bet jie ketina turėti ne Poveikis pradines reikšmes. Taigi tai yra problemiška, jei jums norite turėti panašaus scanf funkciją gyvenime, kurio tikslas yra nuskaityti naudotojo įvesties iš klaviatūros ir tada užpildykite tuščius laukus, taip kalbėti, tai yra, mėgti x kintamasis vertės, nes jei aš būčiau tiesiog praeiti X scanf, jei manote, kad praėjusių logika savaitę, scanf gali daryti ką nori su x kopiją, tačiau jis gali ne nuolat keisti x nebent mes suteikiame scanf lobių žemėlapį, taip sakant, kur x žymi vietą, kur mes pereiname į X adresą, kad scanf gali ten ir iš tikrųjų pokytis X vertė. Ir taip iš tiesų, visi kad ši programa veikia jei aš scanf 0, mano šaltinis 5m katalogas, padaryti scanf 0, dot velniop scanf skaičius Prašome 50, ačiū už 50. Taigi, tai ne visi, kad įdomus, Bet kas iš tiesų vyksta yra tai, kad kuo greičiau aš vadinu scanf čia X vertę yra nuolat keičiami. Dabar tai atrodo gražus ir geras, ir iš tikrųjų, tai Atrodo mes tikrai nereikia CS50 biblioteka išvis nebėra. Pavyzdžiui, tegul eina tai dar kartą čia. Leiskite man vėl jį sekundę. Pabandykime numerį prašome ir Užuot pasakęs 50, kaip anksčiau, tegul tiesiog pasakyti "ne". Gerai, kad yra šiek tiek keista. GERAI. Ir tik kai nesąmonė čia. Taigi, atrodo, kad nėra prie tvarkyti klaidingus situacijas. Taigi mums reikia minimaliai pradžią pridedant keletą Klaidų tikrinimas įsitikinti, kad vartotojas turi įvedėte faktinė skaičius kaip 50, nes matyt rašybos žodžiai nebuvo atpažintas kaip problemiškas, bet tai tikriausiai turėtų būti. Pažvelkime šioje versijoje dabar tai mano bandymas reimplement GetString. Jei scanf turi visa tai funkcionalumas pastatytas, Kodėl mes buvo žymėjimą su jų mokymo ratai kaip GetString? Na, čia turbūt mano paties paprasta versija GetString kuriuo prieš savaitę, aš galėjo sakė, duok man eilutę ir ją vadina buferio. Šiandien aš ruošiuosi pradėti tik sakydamas char žvaigždė, kuris, prisiminti, tai tik sinonimai. Jis atrodo baisiau, bet tai lygiai toks pats dalykas. Taigi man kintama pavadino buferį kad ketina laikyti eilutę, pasakyti vartotojo eilutę prašome, ir tada, kaip ir anksčiau, pabandykime skolintis šią pamoką scanf % s šį kartą ir tada pereiti į buferį. Dabar, greitai normalumas patikrinti. Kodėl aš nesakau Ženklas buferio šį kartą? Daro išvadą, ankstesniame pavyzdyje. Auditorija: Char žvaigždė yra žymeklis. DAVID Malan: Būtent, nes šiuo metu, char žvaigždė yra jau žymeklis, adresą, pagal apibrėžimą tos žvaigždės yra ten. Ir jei scanf tikisi adresą, pakanka tiesiog pereiti į buferį. Man nereikia sakyti Ampersand buferį. Dėl smalsu, galite padaryti kažką panašaus į tai. Būtų turi skirtingą prasmę. Tai duos jums žymiklį į žymeklis, kuris yra faktiškai galiojantis dalykas C, tačiau dabar tegul keep it simple ir išlaikyti istoriją nuoseklūs. Aš tik ketina pereiti į buferio ir tai teisinga. Problema, nors tai. Leiskite man eiti į priekį ir paleisti šį programa, ją sudarant. Padaryti scanf 1. Velnias tai, mano kompiliatorius s gaudyti mano klaida. Duok man vieną sekundę. Klingsėti. Tarkime scanf-1.c. GERAI. Čia mes eiti. Man reikia to. CS50 ID turi įvairių Sąrankos parametrai kad apsaugoti jus nuo savęs. Man reikia išjungti tuos, kuriuos veikia klingsėti rankiniu šį kartą. Taigi styginių prašom. Aš ruošiuosi eiti į priekį ir įveskite mano mėgstamiausia hello world. Gerai, null. Tai ne tai, ką aš įvedėte. Taigi tai rodo, kažkas yra negerai. Leiskite man eiti į priekį ir įveskite į tikrai ilgą eilutę. Ačiū už niekinis ir aš nežinau jei aš ruošiuosi būti suteikta galimybė į avariją ją. Pabandykime šiek kopiją įklijuokite ir pamatyti, jei tai padeda. Tiesiog įklijuokite šį daug. Tai tikrai didesnis styginių nei įprasta. Leiskite tiesiog tikrai parašyti. Ne. Velnias. Komanda nerastas. Taigi, kad nesusiję. Tai todėl, kad aš įterptas blogų ženklų, bet tai paaiškėja, nesiruošia dirbti. Pabandykime tai dar kartą, nes tai smagiau, jei mes iš tikrųjų katastrofos ją. Leiskite tipo tai ir dabar, aš ruošiatės kopijuoti tikrai ilgą eilutę o dabar pažiūrėkime, jei mes gali strigti šį dalyką. Atkreipkite dėmesį, aš praleisti erdves, naujų linijų ir kabliataškiai ir visi funky simbolių. Įveskite. Ir dabar tinklas tiesiog lėtai. Laikiau nuspaudę Command-V per ilgas, aiškiai. Velnias! Komanda nerastas. GERAI. Na, taškas yra Vis dėlto taip. Taigi, kas iš tikrųjų vyksta nuo šios deklaracijos nuo char žvaigždutėmis buferio on line 16? Taigi, ką aš gaunu kai aš pareiškiu rodyklę? Viskas, ką aš gaunu yra keturių baitų vertė vadinamas buferis, bet kas viduje ji šiuo metu? Tai tik keletas šiukšlių vertę. Kadangi bet kuriuo metu galite paskelbti kintamąjį C, tai tik keletas šiukšlių vertė, ir mes pradedame Kelionės per šį realybės. Dabar, kai aš sakau scanf, eiti šiuo adresu ir įdėti bet kokiomis vartotojas įveda į. Jei vartotojas tipų Sveiki pasaulis, gerai, kur man jį? Buferis yra šiukšlių vertė. Taigi, kad lyg strėlė kad manimi nukreipta kas žino kur. Gal tai nukreipta čia mano atmintyje. Ir todėl, kai vartotojas tipai hello world, programa bando įdėti styginių hello world Backslash 0 toje atminties riekë. Bet su didele tikimybe, bet aiškiai ne 100% tikimybė, kompiuteris ketina tada katastrofos programa, nes tai nėra Aš atmintis turėtų būti leidžiama liesti. Taigi, trumpai tariant, ši programa yra trūkumų būtent dėl ​​šios priežasties. Aš iš esmės ne tai, ką? Kokių žingsnių aš praleisti, kaip mes praleisti su Binky pirmojo pavyzdžiui? Taip? Auditorija: Atminties paskirstymas? DAVID Malan: Atminties paskirstymas. Aš ne iš tikrųjų skiriama bet atminties už tą eilutę. Taigi, mes galime išspręsti šią problemą įvairiais būdais pora. Vienas iš jų, galime laikyti jį paprasta ir iš tiesų, dabar jūs esate ketina pradėti pamatyti išsiliejimo iš tarp to, ką linijų masyvas yra, kas seka yra, ką char žvaigždė, ką iš simbolių masyvas yra. Štai Antrasis pavyzdys įtraukiant styginiams ir įspėjimo viskas, ką aš padariau on-line 16 yra, vietoj to, suprantama kad buferis bus char žvaigždė, rodyklė į atminties riekė, Aš ruošiuosi labai aktyviai duoti aš už 16 simbolių buferis, ir iš tiesų, jei esate susipažinę su laikotarpiu buferinė, tikriausiai iš video pasaulyje, kai vaizdo įrašas yra buferinė, buferinė, buferinė. Na, koks ryšys čia? Na, Viduje YouTube ir viduje vaizdo grotuvai paprastai yra masyvas tai didesnis nei 16. Tai gali būti dydžio vieno masyvo megabaitą, o gal 10 megabaitų, ir į tą masyvą daro savo naršyklę atsisiųsti visa krūva baitų, visa krūva megabaitų vaizdo ir vaizdo grotuvas, "YouTube" ar kas yra, prasideda skaityti baitų iš šio masyvo, ir bet kuriuo metu matote Žodis buferinė, buferinė, tai reiškia, kad žaidėjas turi įgytas iki tos masyvo pabaigos. Tinklas yra toks lėtas, kad ji turi ne pripildyti masyvo su daugiau baitų ir taip jūs iš bitai rodyti vartotojui. Taigi buferis yra apt terminas čia, kad tai tik masyvas, iš atminties riekė. Ir tai ją išspręsti nes ji Pasirodo, kad jūs galite gydyti masyvus kaip nors jie yra adresai, nors buferis yra tik simbolis, tai seka simbolių, buferis, tai naudinga man, programuotojas, galite pereiti savo vardą aplink taip, tarsi tai būtų žymeklis, kaip nors ji buvo iš riekė adresas atminties 16 simbolių. Taigi, kad pasakyti, galiu perduoti scanf tiksliai šis žodis ir taip dabar, jei aš darau šią programą, padaryti scanf 2, dot velniop scanf 2, ir įveskite hello world, Įveskite, kad LAIKĄ_ Hmm, kas atsitiko? Styginių prašom. Ką man daryti negerai? Hello world, buferio. Sveikas Pasauli. Ak, aš žinau, ką tai daro. GERAI. Todėl skaityti daugiau iki pirmosios vietos. Taigi leiskite apgauti tik už momentą ir pasakyti, kad aš tik norėjau tipo kažką tikrai ilgai, kaip tai yra ilgas sakinys tai vienas, du, tris, keturis, penkis, šešių, septynių, aštuonių, devynių, 10, 11, 12, 13, 14, 15, 16. GERAI. Tai išties ilgas sakinys. Taigi šis sakinys yra ilgesnis nei 16 simbolių ir todėl, kai aš paspauskite Enter kas nutiks? Na, šiuo atveju iš istorija, aš pareiškė buferis kad iš tikrųjų yra masyvas 16 simbolių pasiruošę eiti. Taigi, vienas, du, tris, keturis, penkis, šeši, septynių, aštuonių, devynių, 10, 11, 12, 13, 14, 15, 16. Taigi 16 simbolių, o dabar, kai aš skaityti kažką panašaus tai ilgas sakinys, kas nutiks yra kad aš ruošiuosi skaityti tai ilgas S-E-N-t-E-N-C-E, sakinys. Taigi tai yra sąmoningai blogas dalykas, kad aš laikyti raštu už ribos mano masyvas, už mano buferio ribų. Galėčiau gauti pasisekė ir programa bus nuolat veikia, o ne rūpintis, bet apskritai, tai bus iš tiesų katastrofos mano programa, ir tai yra klaida mano kodą momentą aš žingsnis už ribų tos masyvas, nes aš nežinau, jei tai nebūtinai vyksta į avariją arba, jei aš tik ketina gauti pasisekė. Taigi tai yra problemiškas, nes Šiuo atveju, tai atrodo, kad dirbti ir tegul Patiria likimą čia, nors IDE atrodo toleruoti gana didelis of-- Čia mes eiti. Galiausiai. Taigi, aš tik viena, kad galima pamatyti tai. Taigi aš tiesiog turėjo įdomus rašyti daug iš tikrai ilgą faktinio frazės kad ji tikrai viršijo 16 baitų, nes aš įvedėte šio crazy ilgą multi-line Frazė, tada pastebėsite, kas atsitiko. Programa bandė spausdinant ir tada gavo segmentavimo kaltės ir segmentavimo gedimai yra tada, kai kažkas panašaus į tai atsitinka ir operacinė sistema sako Ne, negali liesti, kad atmintį. Mes ketiname nužudyti apskritai programa. Taigi, tai, atrodo problematiškas. Aš pagerino programą, pagal kurią bent jau šiek tiek atminties, bet tai atrodytų apriboti funkcija GetString kad gauti įsipareigojimų kai kurių baigtinio ilgio 16. Taigi, jei norite paremti ilgiau sakiniai kaip 16 simbolių, Ka tu darai? Na, galite padidinti dydis buferio iki 32 arba kad atrodo rūšies trumpas. Kodėl mes tiesiog padaryti tai 1000, bet stumti atgal. Koks atsakymas intuityviai iš tik išvengti šios problemos, darant mano buferio didesnis, kaip ir 1000 simbolių? Įgyvendinant GetString šį būdą. Kas gerai ar blogai čia? Taip? Auditorija: Jei įpareigoti iki daug erdvės ir jums nereikia naudoti jį, galite ne perskirstyti tą erdvę. DAVID Malan: Absoliučiai. Tai išlaidavimas, kiek, jei ne iš tikrųjų reikia 900 šių baitų Ir dar jūs prašydama 1000 iš viso vistiek, jūs tik vartoja daugiau atmintis vartotojo kompiuteryje, nei jums reikia, ir po to, kai visi, kai kurie iš Jūs jau susidūrė gyvenime, kad, kai esate veikia daug programų ir jie valgo daug atminties, Tai iš tiesų gali įtakoti rezultatus ir vartotojas patirtis ant kompiuterio. Taigi, kad tipo tingus sprendimas, tikrai, ir atvirkščiai, tai ne tik išlaidavimas, kokia problema vis dar išlieka, net jei aš padaryti, kad mano buferis 1000? Taip? Auditorija: Styga ilgis 1001. DAVID Malan: Būtent. Jei jūsų eilutė ilgis 1001, Jūs turite tą patį problemą, ir mano argumentas, aš norėčiau tik tada padaryti jį 2000, bet jūs neturite žinoti iš anksto, kaip didelis jis turėtų būti, ir dar, aš turiu surinkti mano programa Prieš leisdami žmonėms naudoti ir parsisiųsti tai. Taigi tai yra būtent natūra Daiktai kad CS50 biblioteka bando padėti mums, ir mes tik žvilgsnis į kai kuriuos pagrindinės įgyvendinimo čia, bet tai yra CS50 taškas C. Tai yra failas, kad buvo ant CS50 IDE Visos šios savaites, kad jūs jau naudojate. Tai iš anksto parengta ir jūs buvo naudojant jį automatiškai pagal pobūdį turintys brūkšnys L CS50 vėliava klingsėti, bet jei aš slinkite žemyn per visus šios funkcijos, čia GetString, ir tiesiog suteikti jums skonis, kas vyksta, Paimkime greitai pažvelgti į santykinis sudėtingumas. Tai ne super ilgai funkcija, tačiau mes ne turi galvoti visi sunkiai apie kaip eiti apie tai, kaip stygos. Taigi čia mano buferio ir aš matyt inicijuoti jį null. Tai, žinoma, yra tas pats, kaip char žvaigždė, bet aš nusprendė Įgyvendinant CS50 biblioteką kad jei mes ketiname būti visiškai dinamiškas, Aš nežinau, iš anksto, kaip didelis ir string vartotojai ketinate norite gauti. Taigi, aš ruošiuosi pradėti tik su tuščiu eilutę ir aš ruošiuosi kurti kiek atminties, kaip man reikia, kad tilptų vartotojo eilutę ir jei aš neturiu pakankamai, aš ruošiuosi paprašyti operacinę sistemą daugiau atminties. Aš ruošiuosi perkelti savo eilutę į didesnį riekė atminties ir aš ruošiuosi išleisti arba atlaisvinti nepakankamai didelė riekė atminties ir mes tik ketina tai padaryti keletą kartų. Taigi greitas žvilgsnis, čia tiesiog kintamasis , su kuriuo aš ruošiuosi sekti iš savo buferio talpos. Kiek baitų galiu tinka? Štai kintamasis n su kurį aš ruošiuosi laikyti kelio nuo to, kiek baitų yra iš tikrųjų buferis, arba kad vartotojas atspausdintos. Jei nemačiau prieš tai, jums gali nurodyti, kad, kaip int kintamasis yra nepasirašytas, kuris, kaip rodo pavadinimas, reiškia, kad jis ne neigiamas, ir kodėl Aš kada nori vargintis nurodant kad int yra ne tik int, bet tai nepasirašytas int? Tai ne neigiamas int. Ką [nesigirdi] reiškia? AUDITORIJA: tai aprašant sumą atminties, kuri gali būti [nebegirdėtumėte]. DAVID Malan: Taip. Taigi, jei aš sakau, nepasirašytas, iš tikrųjų tai yra suteikiant Jums vieną tiek papildomo atminties ir atrodo, rūšies kvailas, bet jei jūs turi vieną tiek papildomos atminties, kad reiškia, kad turite dvigubai daugiau vertės galite atstovauti nes gali būti 0 arba 1. Taigi pagal nutylėjimą, int gali būti maždaug neigiamas 2 mlrd visą kelią iki teigiamo 2 mlrd. Tai yra didelis asortimentas, tačiau tai dar kokios išlaidavimas Jei rūpi tik dydžiai, kurie tiesiog intuityviai turėtų būti ne neigiamas arba teigiamas arba 0, gerai tada, kodėl jūs eikvoti 2 mlrd Galimos reikšmės neigiamų skaičių jei jūs niekada juos naudoti? Taigi, sakydamas, nepasirašytas, dabar mano int gali būti tarp 0 ir maždaug 4 mlrd. Taigi čia tik int C priežasčių mes ne gauti į tik dabar taip kodėl tai int vietoj iš medžio anglies, bet čia yra tai, ką ketina Svarbiausios įjungtas ir kai kurie iš jūsų gali būti naudojant, pavyzdžiui, fgetc funkcija net PSet keturių arba vėliau, matysime ją vėl problemos nustatyti penki, fgetc yra gražus, nes kaip pavadinimas rūšies, rūšiuoti arcanely rodo, tai funkcija, kuri gauna simbolį ir taip, kas iš esmės skiriasi apie tai, ką mes darome, yra GetString yra mes ne naudojant scanf tuo pačiu būdu,. Mes tiesiog šliaužti palei žingsnis po žingsnio per kokia vartotojas įvedėte, nes mes visada galime skirti vieną char, todėl visada galime saugiai atrodo vienu char vienu metu, ir magija pradeda atsitikti čia. Aš ruošiuosi slinkite žemyn viduryje šios funkcijos tik trumpai pristatyti šią funkciją. Panašiai kaip ten malloc funkcija, yra realloc funkcija, kur realloc leidžia jums perskirstyti iš atminties riekė ir kad ji didesnė arba mažesnė. Taigi ilga istorija trumpa ir iš mano rankos banga šiandien, žinau, kad tai, ką GetString daro tai tarsi apie stebuklingai auga arba mažėja buferį kaip vartotojas tipai jo eilutę. Taigi, jei vartotojas įveda trumpas eilutė, šis kodas tik skiria pakankamai atminties, kad tilptų eilutę. Jei vartotojas išlaiko rašyti kaip aš tai padariau vėl ir vėl ir vėl, gerai, jei buferis s pradžių tai didelis ir programa supranta, kad palauk, aš iš vietos, jis ketina padvigubinti buferinio dydis ir tada dvigubai buferio dydį ir kodas, kuris veikia padvigubinti, jei pažvelgsime į tai čia, tai tiesiog tai protingas vieno įdėklas. Jūs galite ne pastebėjau šį sintaksė anksčiau, bet jei tu sakai žvaigždė lygu, tai tas pats, kaip sakydamas pajėgumo kartus 2. Taigi jis tiesiog išlaiko dvigubai buferinio talpa ir tada pasakoja realloc duoti Pati, kad daug daugiau atminties. Dabar, kaip panaikinti, kad yra kitas funkcijas čia kad mes ne žiūrėti į bet išsamiai išskyrus parodyti GetInt, mes naudojame GetString į GetInt. Mes tikriname, jog tai ne niekinis, kuris, prisiminti, yra speciali reikšmė, reiškia kažkas negerai. Mes iš atminties. Geriau patikrinti, kad. Ir mes grąžinti sarginio vertę. Bet aš atidėti į kaip į komentarus kodėl tada mes naudojame šią scanf pusbrolis vadinamas sscanf ir paaiškėja, kad sscanf arba styginių scanf, leidžia jums pažvelgti linijos atrodo, kad vartotojas įvedėte ir jums analizuoti iš esmės, ir ką aš daro čia aš sakau sscanf, analizuoti nepriklausomai vartotojas turi įvestas ir įsitikinkite% i, yra sveikasis skaičius, į jį, ir mes nebus patekti į šiandien tiksliai, kodėl ten taip pat A% c čia, bet trumpai tariant leidžia mus aptikti, jei vartotojas atspausdintos kažkuo netikru po skaičiaus. Taigi dėl to, kad GetInt ir GetString lieps pakartoti, pakartoti, bandykite dar kartą yra todėl, kad visi kad mus kodas parašiau, tai tipo Pažvelgus į vartotojo įvestį norint įsitikinti, ar tai visiškai skaitmeninė ar tai tikrasis slankiojo taškų vertė ar panašiai, Priklausomai nuo to, vertę funkcionuoti jūs naudojate. FIU. GERAI. Tai buvo kąsnis bet esmė čia yra kad priežastis, kodėl mes turėjome šių mokymo ratai yra todėl, kad žemiausiu lygiu, Yra tik tiek daug dalykų, kad gali suklysti, kad mes norėjome į Preemptively rankena tie dalykai tikrai gali Ankstyviausi savaites klasės, bet dabar su PSet keturių ir penkių PSet ir už matysite, kad tai daugiau pas Jūs taip pat esate pajėgesnės išspręsti šias problemas rūšių patys. Bet kokie GetString ar GetInt klausimų? Taip? Auditorija: Kodėl jūs dvigubai buferinio talpa o ne tik didinti tai pagal tikslią sumą? DAVID Malan: Geras klausimas. Kodėl mes dvigubai pajėgumus buferio, o ne tiesiog jį didinti kai kurios pastovios vertės? Tai buvo dizaino sprendimas a. Mes tiesiog nusprendė, kad, nes jis linkęs būti šiek tiek brangesnis laiko protinga paklausti operacinė sistema atminties, mes ne norite baigti patekti į už didelių stygos situacija kad mes klausia vėl ir vėl OS ir vėl ir vėl greitai vieną atminties. Taigi mes tiesiog nusprendė, šiek tiek savavališkai, bet mes tikimės, kad pagrįstai, kad, žinote, ką, tegul bandyti gauti prieš save ir tiesiog laikyti jį taip, kad dvigubai mes sumažinti kartų kiekį mes turime skambinti malloc arba realloc, tačiau bendras sprendimas skambinti žinant nėra ką vartotojai gali norėti įvesti. Abu būdai gali būti ginčytina. Tikriausiai gerai. Taigi leiskite pažvelgti pora kitų šalutinių poveikių, atminties, dalykų, kurie gali suklysti ir priemonės, kurias galite naudoti sugauti šių klaidų rūšių. Pasirodo, visi jūs, nors check50 nepasakė jums, kiek, buvo raštu Buggy kodas nes savaitę vieną, net jei visi check50 testai praėjo, ir net jei jūs ir jūsų TF yra super įsitikinę, kad Jūsų kodas veikia kaip numatyta. Jūsų kodas buvo Buggy arba ydingas tuo, kad jus visus, naudodami CS50 biblioteką, buvo nesandarus atmintį. Jūs buvote klausia operacinės sistemos už atminties dauguma programų parašiau, bet jūs niekada iš tikrųjų atidavė jį atgal. Jūs vadinamas GetString ir GetInt ir GetFloat, bet su GetString, jūs niekada vadinamas unGetString arba suteikti Styginių Atgal ar pan, bet mes matėme kad GetString daro paskirstyti atmintį būdu malloc ar tai funkcija realloc, kuri yra tik labai panaši dvasia, ir dar, mes buvome klausia operacinę sistemą atmintis ir atminties vėl ir vėl bet niekada duoti atgal. Dabar, kaip panaikinti, ji Pasirodo, kad kai programa uždaroma, visi atmintyje automatiškai išlaisvinti. Taigi tai nebuvo didžiulis spręsti. Jis nesiruošia pertrauka IDE arba lėtai dalykų žemyn, Bet kai programos padaryti paprastai ištekėti atminties ir jie veikia ilgą laiką. Jeigu jūs kada nors matė kvailas Little paplūdimio kamuolys Mac OS arba smėlio laikrodis Windows, kur jis rūšies lėtėja ar galvoju ar mąstymas arba tiesiog tikrai prasideda sulėtės iki nuskaitymo, tai labai galėtų būti iš atminties nutekėjimas rezultatas. Programuotojai rašę programinė įranga, jūs naudojate paprašyti operacinės sistemos atminties kas kelias minutes, kas valandą. Bet jei naudojatės programine įranga, net jei tai sumažintas kompiuteryje valandų ar dienų pabaigos, Jums gali būti užduoti daugiau ir daugiau atmintis ir niekada iš tikrųjų jį naudoti ir kad jūsų kodas gali būti arba programos gali būti nesandarus atmintį, o jeigu pradėsite ištekėti atmintį, ten mažiau atminties kitoms programoms, ir poveikis yra lėtai viską žemyn. Dabar, tai yra toli viena žvėriškiausius programos Jūs turėsite galimybes paleisti CS50 tiek nes jo produkcija yra dar ezoterinių nei Zaszczękać s arba padaryti arba kurios nors komandą line programos mes paleisti anksčiau, bet Laimei, įdėta į savo produkcijos yra keletas patarimų, kurie itin naudinga bus naudinga arba dėl PSet keturių ar tikrai PSet penki. Taigi Valgrind yra įrankis kuris gali būti naudojamas ieškoti atminties nutekėjimas į savo programą. Tai gana paprasta paleisti. Jūs paleisti Valgrind ir tada, net nors tai šiek tiek daugiažodis, brūkšnys brūkšnys nuotėkio patikrinimas lygus pilnas, tada dot velniop ir jūsų programos pavadinimas. Taigi Valgrind bus paleisti programą ir pačioje pabaigoje jūsų programos veikia prieš jį meta ir suteikia jums kitą eilutę, jis ketina analizuoti savo programa, o tai jau veikia ir pasakyti tu ištekėti bet atmintis ir dar geriau, tu paliesti atmintį, nebuvo priklauso jums? Ji negali sugauti viską, bet tai gana gerai traukiantis daugelį dalykų. Taigi čia rasite mano Pabėgęs pavyzdys Ši programa, Pabėgęs Valgrind, dėl programos, vadinamos atminties, ir aš ruošiuosi išryškinti linijas, kurios yra galiausiai įdomūs mums. Taigi ten net daugiau ramiai kad aš išbraukta iš skaidrę. Bet tegul tik pamatyti, kas tai Programa yra pajėgi mums. Tai gali mums dalykus kaip negaliojantis rašyti dydžio 4 d. Kitaip tariant, jei jūs liečiate atmintį, ypač į jo 4 baitų atminties kad jums neturėtų būti, Valgrind galiu pasakyti, kad. Neteisingas Parašyti dydžio 4 d. Jūs palietė keturi baitai kad jums neturėtų būti. Kur tu tai padaryti? Tai yra grožis. Atminties taškas c linija 21 yra ten, kur įsukus ir tai, kodėl tai naudinga. Panašiai kaip GDB, ji gali padėti Jus atkreipti faktine klaida. Dabar tai vienas šiek tiek daugiau daugiažodis, jei ne paini. 40 baitų 1 blokus yra tikrai prarado nuostolių įrašo 1 iš 1. Ką tai reiškia? Na, tai tiesiog reiškia, kad jūs paprašė 40 baitų, ir jūs niekada atgal. Jūs vadinamas malloc ar jūs vadinamas GetString ir operacinė sistema davė jums 40 baitų, tačiau jūs niekada išlaisvino arba išleistas tą atmintį, ir būtų teisinga, mes niekada rodo jums, kaip duoti atgal atmintį. Pasirodo, ten super paprasta funkcija vadinama nemokama. Mano vienas argumentas, dalykas norite nemokamai arba duoti atgal, bet 40 baitų, matyt, Šioje programoje buvo prarasta eilutėje 20 atminties dot C. Taigi pažiūrėkime šią programą. Tai itin nenaudingas. Tai tik parodo, Tai ypač klaida. Taigi leiskite pažvelgti. Čia yra pagrindiniai ir svarbiausi, pranešimo, skambučiai funkcija vadinama F ir tada vėl. Taigi ne visi, kad įdomus. Ką f daryti? Atkreipkite dėmesį, aš ne nerimauti su prototipu. Norėjau išlaikyti kodą kuo mažesnis. Taigi aš įdėti f aukščiau pagrindinis ir tai gerai, žinoma, trumpiems programų, kaip šis. Taigi f negrąžina nieko ir nėra nesiima nieko, tačiau ji tai padaryti. Jis pareiškia, panašiai kaip į Binky pavyzdžiui, rodyklė vadinamas x, vyksta saugoti į int adresą. Štai kairėje pusėje. Anglų kalba, kas yra dešinioji pusė daro? Kiekvienas? Kas tai daro už mus? Taip? Auditorija: [nesigirdi] kartus daugiau int dydis kuris yra 10 kartų, kad [nesigirdi] DAVID Malan: Geras ir leiskite man apibendrinti. Taigi skirti pakankamai vietos 10 sveikieji skaičiai arba 10, kas iš int dydis, tai keturi baitai, todėl 10 kartų 4 yra 40, taip, kad dešinėje pusėje, kad aš Pažymėtas yra duoti man 40 baitų ir saugoti pirmojo baito adresą į x. Ir dabar pagaliau ir čia, kur Ši programa yra Buggy, kas negerai su linija 21, remiantis šia logika? Kas negerai su linija 21? Taip? Auditorija: Jūs negalite rodiklis į X [nesigirdi]. DAVID Malan: Taip. Aš ne rodiklis į x patinka. Taigi sintaksiškai, kad viskas OK. Kas yra graži, panašiai kaip jums gali gydyti masyvo vardą taip, tarsi tai rodyklė, panašiai galite gydyti žymeklį kaip nors tai masyvas, todėl galiu sintaksiškai sako x laikiklis kažką x laikiklis i bet 10 yra problemiškas. Kodėl? Auditorija: Nes tai ne viduje. DAVID Malan: Tai ne viduje, kad atminties riekė. Kas yra didžiausia vertė turėčiau būti išleisti tose laužtiniuose skliaustuose? 9, 0 iki 9. Dėl nulinio indeksavimo. Taigi 0 iki 9 būtų gerai. Laikiklis 10 nėra gera ir bet, prisiminti, nors kiekvieną kartą Man atrodo, kad pabandyti padaryti CS50 IDE Crash įvesdami fiktyviais vertybių, ji ne visada bendradarbiauti, Ir iš tiesų, dažnai gauti pasisekė tik todėl, kad operacinė sistema nėra pastebėsite, kad jūs vis tiek šiek tiek praeiti šiek tiek riekė atminties, nes liko per techniškai Jūsų segmentas, tačiau daugiau apie tai į operacinių sistemų klasės, ir taip kažkas panašaus į tai gali labai lengvai neatskleistos. Jūsų programa manimi niekada į avariją nuosekliai, bet gal kai kurį laiką. Ir taip pabandykime Valgrind apie tai, ir čia kur mes gauti užvaldo iki išėjimo trumpam. Todėl įsitikinkite, atminties Valgrind nuotėkio patikrinimas lygus visą dot velniop atmintį. Ir štai kodėl aš pažadu tai sukrėsti. Štai ką Valgrind, štai ką programuotojas, keletą metų ago- nusprendžiau, kad būtų gera idėja už produkcijos atrodyti. Taigi leiskite prasmės tai. Taigi, visi ant kairiosios rankos būdas pusė be priežasties yra procesas ID programos mes tiesiog paleisti, unikalų identifikatorių programai, mes tiesiog pritrūko. Mes panaikinome, kad nuo skaidrių, tačiau yra naudingos informacijos čia. Leiskite slinkite iki pat viršaus. Štai kur mes pradėjome. Taigi, tai ne visi, kad daug produkcijos. Štai, kad negalioja rašymo 4 dydis on line 21. Na, kas buvo linija 21? 21 linija buvo tiksliai tai ir prasminga kad aš tinkamai formoje raštu 4 baitų, nes aš bando įdėti šią sveikasis skaičius, kuris gali būti bet kas, tai tiesiog atsitinka būti nulis, bet aš bandau įdėti ją iš vietos, kuris nepriklauso man. Be to, čia apačioje, 40 baitų vienas blokai yra tikrai prarado įrašo 1 d. Tai todėl, kad kai aš skambinti malloc čia, aš niekada iš tikrųjų laisvos atminties. Taigi, kaip mes galime išspręsti šią problemą? Leiskite man eiti į priekį ir būti šiek tiek saugiau ir daryti 9 ten ir leiskite man čia nemokamai x. Tai yra naujas funkcija šiandien. Jei aš dabar pakartotas padaryti atminties dot velniop, Bėkim Valgrind jį dar kartą, padidinti mano langą ir paspauskite "Enter". Dabar, tai gerai. Jie palaidoti gerą naujieną visose šio išėjimo. Visi Heap blokai buvo nemokamai. Mes grįžti į ką krūvą yra, bet nėra nuotėkio yra įmanoma. Taigi tai yra tik dar vienas įrankis jūsų įrankių rinkinys su kuria jūs galite pradėti Rasti dabar klaidų, pavyzdžiui, kad. Bet pažiūrėkime, ką daugiau gali suklysti čia. Leiskite pereiti dabar iš tikrųjų išspręsti problemą. Kaip panaikinti, jei tai bus atleisti šiek tiek supainioti ar įtampos, tai dabar juokinga. Taip. Tai gana gerai. Kadangi rodyklės yra adresai ir adresai paprastai pagal susitarimą parašyta šešioliktainėje. Cha, cha, tai juokinga dabar. Šiaip ar taip, tad dabar iš tikrųjų išspręsti problemą. Tai buvo super, Super žemo lygio iki šiol, ir mes iš tikrųjų galime padaryti naudinga ką su šių žemo lygio detalių. Taigi, mes pristatė keletą savaičių prieš iš masyvo sąvoka. Masyvas buvo gražus, nes sunku išvalyti mūsų kodą nes jei mes norėjome parašyti Programa su keliais studentais arba kelis pavadinimus ir namų bendrabučiuose ir kolegijų ir visa tai, galėtume laikyti viskas daugiau švariai viduje masyvą. Bet siūlyti Viena neigiama masyvo šiol. Net jei jūs nepatyrė patys programoje, tiesiog instinktyviai, kas yra blogas dalykas apie masyvą, galbūt? Girdžiu kai ūžia. Auditorija: Sunku pakeisti dydį. DAVID Malan: Sunku pakeisti dydį. Jūs negalite keisti dydį masyvo, iš tiesų, per se, C Galite skirti kitą masyvą, perkelti viską iš senojo į naują, o dabar turėti tam tikrą papildomą erdvę, bet tai nepatinka kalba kaip Java ar Python arba bet kitas numeris kalbos, su kuriomis kai kurie iš jūsų gali būti susipažinę kur jus gali tiesiog laikyti pridedant dalykų znudzenia į masyvą pabaigoje. Kai jūs turite iš masyvo dydis 6, tai yra jos dydis, ir tiek daug, kaip idėja anksčiau turintys tam tikro dydžio buferį, jūs turite atspėti iš vartų kokio dydžio norite, kad ji būtų? Jei atspėti per didelis, jūs eikvoti vietos. Jei galite atspėti, per mažas, jums gali ne aukštesnėje, kad duomenys, bent be daug darbo. Taigi, šiandien, dėka patarimų, mes galime pradėti susiuvimo kartu savo užsakymą duomenų struktūros ir Faktas, čia yra kažkas kad atrodo šiek tiek daugiau paslaptingas iš pirmo žvilgsnio, bet tai, ką mes vadiname susijęs sąrašas, o jo vardas rūšies apibendrina tai. Tai iš numerių sąrašas, arba Šiuo atveju, skaičių, sąrašas bet tai gali būti nieko sąrašas, tačiau tai tarpusavyje susiję būdu rodyklėmis, ir tik spėti su tuo, ką technika mes ketiname turėti dygsnio kartu, tarsi pūsti su sriegiu, susijusiantrosios sąrašai stačiakampiai čia? Jos numerius? Koks pagrindinis kalbos funkcija? Auditorija: Rodyklė. DAVID Malan: Rodyklė. Taigi, kiekvienas iš šių rodyklėmis čia reiškia rodyklė ar tiesiog adresą. Taigi, kitaip tariant, jei aš noriu saugoti numerių sąrašą, Aš negaliu tiesiog laikyti jį, jei noriu gebėjimas augti ir trauktis mano duomenų struktūra masyve. Taigi man reikia turėti šiek tiek pažangiau, bet pastebėsite, kad tai nuotrauka rūšies rodo kad jei jūs ką tik gavo mažai temas jungiantis viską kartu, tikriausiai ne tai, kad sunku padaryti vietos tarp du iš šių stačiakampių arba du iš šių mazgų, nes mes pradėsime vadindamas juos, įdėti naują mazgo, ir tada su kai naują temą, tiesiog griovys tris mazgus kartu, pirmasis, paskutinis, ir vienas, kad jūs tiesiog įkištas į vidurį. Ir iš tiesų susiję sąrašas skirtingai masyvo, yra dinamiškas. Jis gali augti, ir ji gali trauktis, ir jūs neturite turite žinoti, ar rūpintis iš anksto how daug duomenų, jūs ketinate būti saugoti, tačiau ji Pasirodo, turime būti šiek tiek atsargūs, apie tai, kaip įgyvendinti tai. Taigi, pirmiausia aptarkime, kaip mes įgyvendinti vienas iš šių mažai stačiakampių. Tai lengva įgyvendinti int. Jūs tiesiog pasakyti int n ir tada jūs gaunate 4 baitų int, bet kaip man gauti int, vadina jį n ir tada žymeklis, tegul jį vadina toliau. Mes galime skambinti šių viskas ką mes norime bet man reikia pasirinktinį duomenų struktūrą. Taip? Auditorija: Ženklas [nesigirdi]. DAVID Malan: Taigi Ampersand mes naudojame gauti iš mazgo adresą potencialiai. Bet mes turime kitą bruožas C, kad suteikti man galimybę sukurti Šis paprotys stačiakampis, šis paprotys kintamasis, jei bus, atmintyje. AUDITORIJA: a konstrukto. DAVID Malan: a konstrukto. Prisiminkite, iš praeitą savaitę, mes pristatėme konstrukto, tai gana paprasta raktažodžių kuri leidžia mums padaryti tokius dalykus. C neatėjo su duomenų struktūra vadinama studentas. Jis ateina su int ir float ir char ir pavyzdžiui, bet jis nėra ateis su studentas, bet mes galime sukurti studentas duomenų tipą, studentas struktūra, su šiuo sintaksę čia. Ir jūs pamatysite tai vėl ir vėl. Taigi nesijaudinkite įsiminti žodžius, bet raktinis žodis, svarbu yra tik faktas, kad mes sakėme konstrukto ir tada mes pavadino jį studentas ir viduje studento buvo pavadinimas ir namo arba akademika arba panašiai. Ir todėl dabar ir šiandien, tegul pasiūlo tai. Aš pridėjo kelis žodžius, bet jei aš noriu įgyvendinti šį stačiakampį, kad yra gavo tiek int ir A žymeklis, jūs žinote, ką aš ketina paskelbti konstrukto vadinamas mazgas. Aš taip pat, viduje ji, ketina pasakyti kad mazgas, tai stačiakampis, yra int ir mes jį vadiname n ir jis turi kitą žymeklį. Ir tai yra šiek tiek daugiažodis, bet jei jūs manote apie tai, rodykles, kurios buvo paveikslėlyje prieš momentas yra tai, kokie duomenys tipą? Kur kiekvienas iš tų strėlių yra nukreipta kokio tipo duomenų struktūrą? Tai ne nukreipta tik į per se tarpt. Tai nukreipta į Visa stačiakampio dalykas ir kad stačiakampio dalykas, sakėme, yra vadinamas mazgas. Ir todėl mes natūra turi rekursyviai apibrėžti tai toks kad mazgas, tarkim, bus pateikta int vadinamas n ir rodyklė vadinamas šalia ir tipo duomenų struktūrą, į kurią kad žymiklis taškai, matyt, bus konstrukto mazgas. Taigi tai yra annoyingly daugiažodis ir tiesiog būti pedantiškas, priežastis, kodėl mes negalime tiesiog pasakyti tai, kuris atvirai atrodo daug labiau skaitoma, yra todėl, kad priminti, kad C skaityti viskas iš viršaus į apačią, iš kairės į dešinę. Tai ne, kol mes gauti kabliataškį kad raktažodis mazgas iš tikrųjų egzistuoja. Taigi, jei norime, kad šis rūšiuoti cikliška nuoroda viduje duomenų struktūra, turime tai padaryti, kur mes sakome struct mazgas viršuje, kuris suteikia mums ilgesnį kelią aprašyti tai dalykas, tada viduje sakome struct mazgas, ir tada, per paskutinę linija mes sakome, gerai, C, beje, tiesiog paskambinkite visą šį nusispjauti dalykas mazgas ir sustabdyti naudojant raktažodžių konstrukto apskritai. Taigi tai yra tiesiog tarsi sintaksinis Pavyko, kad galiausiai leidžia mums sukurti kažkas, kad atrodo lygiai taip, kaip šis. Taigi, jei mes manome, dabar mes galime įgyvendinti šį dalyką C, Kaip mes iš tikrųjų pradėti važiuojantiems tai? Na, tiesą sakant, visi mes turime padaryti, tai pakartoti iš kairės į dešinę ir tik rūšies įdėkite mazgų arba ištrinti mazgai arba ieškokite dalykų, kur mes norime, bet tai padaryti, eikime į priekį ir padaryti viskas šiek tiek daugiau nekilnojamojo nes tai buvo super žemo lygio iki šiol. Ar kas nors tiesiog patinka būti pirmas? GERAI. Nagi iki. Koks tavo vardas? David: Davidas. DAVID Malan: Davidas. Malonu susipažinti. Aš irgi. Gerai. Ir mes turime skaičių "9". Ne taip gerai, kaip pirmą kartą, galbūt. Gerai, numeris 9. Skaičius 17, prašom. Leiskite man grįžti šiek tiek toliau. Numeris 22, prašome ir kaip apie toliau atgal jei matau, bet rankas su visais šviesos ar ne. Kažkas yra savanoriškai teisę ten. Ar norite sugalvoti? Jūsų dilbio yra prievarta einame. Gerai, 17. 22. 26 yra leistis. Ar kas nors patinka forcefully-- Nagi iki. Faktinė savanoris. Taigi, labai greitai, jei vaikinai gali organizuoti patys tiesiog patinka ant ekrano mazgų. Ačiū. Ir jums bus 26. Visos teisės ir greitas pristatymas. Taigi, aš Dovydas ir jūs taip pat? David: Davidas. DAVID Malan: Ir jūs esate? JAKE: Jake. SUE: teistis. Alex: Alex. RAPHAEL: Rafaelis. TAYLOR: Taylor. DAVID Malan: Taylor. Puikus. Taigi tai yra mūsų savanoriai Šiandien ir eiti į priekį ir perkelti šiek tiek, kad taip, ir tiesiog eiti į priekį ir išlaikyti turintis savo numerius, jūs esate arba jūsų Pirmasis ženklas ir naudojant savo kairę ranką, eiti į priekį ir tik įgyvendinti Šios rodyklės, tik taip, kad jūsų kairė ranka yra tiesiog nukreipta į ką reikėtų atkreipti ne, ir suteikti sau šiek tiek, kad kambarys mes galime vizualiai pamatyti savo ginklus iš tikrųjų rodomasis, ir jūs galite tiesiog nurodyti Rūšiuoti ne žemės yra gerai. Taigi čia mes turime susietą sąrašą vieną, du, tris, keturis, penkis mazgai pradžių, ir pastebėsite, mes turime tai ypatinga rodyklė pradžioje kas manimi raktas, nes mes turime sekti visos ilgis sąrašą kažkaip. Šie vaikinai, nors jie paliko į dešinę, atgal atgal į atmintį, jie iš tikrųjų gali būti bet kur Į kompiuterio atmintį. Taigi šie vaikinai gali būti stovi bet kur ant stadijoje ir tai gerai, tol, kol jie tikrųjų nukreipta į vienas nuo kito, bet kad viskas švarus ir paprastas, mes tiesiog atkreipti juos kairės į dešinę, kaip tai, bet ten gali būti masyvūs spragos tarp tų mazgų. Dabar, jei aš noriu, kad iš tikrųjų įterpti keletą nauja vertė, eikime į priekį ir tai padaryti. Turime galimybę dabar pasirinkti kitą mazgą. Pasakykite, pradėkime ne su mallocing 55. Ar kas nors protas yra malloc? Gerai, nagi iki. Koks tavo vardas? VAIVORYKŠTĖ: Rainbow. DAVID Malan: Rainbow? Gerai. Malloc vaivorykštė. Nagi iki. Taigi dabar mes turime savęs paklausti, algoritmiškai, kur mes galime įdėti 55. Taigi, visi iš mūsų žino, Akivaizdu, kur ji tikriausiai priklauso, jei mes bandome išlaikyti šią rūšiuojami ir jei jus vaikinai gali užtrukti vieną žingsnis atgal, kad mes neturime nukristi etapas, kad būtų puiku. Taigi iš tikrųjų Rainbow, pradėti iš naujo čia su manimi, nes mes, kaip kompiuteryje gali dabar matyti tik vieną kintamąjį vienu metu. Taigi, jei tai yra pirmasis mazgas. Atkreipkite dėmesį, kad jis nėra mazgas, jis tiesiog rodyklė, ir tai, kodėl jis sudarytas, kad būtų tik rodykle dydis, o ne vienas iš tų visiškai stačiakampių. Taigi mes ketiname patikrinti kiekvieną iteracijos yra 55 mažiau nei 9? Ne. Ar 55 mažiau nei 17? Ne. Mažiau nei 22? Mažiau nei 26? Mažiau nei 34? Ir todėl dabar, žinoma, Vaivorykštinis priklauso pabaigoje. Taigi, kad būtų aišku, ir kas buvo jūsų vardas Taylor? TAYLOR: Taylor. DAVID Malan: Taigi tarp Taylor kairė ranka ir Rainbow rankos čia, kurio ranką reikia atkreipti ne ką siekiant įterpti 55 į šį sąrašą? Ką turime daryti? Taip? Auditorija: Taylor ranka reikia atkreipti į kairę. DAVID Malan: Būtent. Taigi įterpiant mazgas į sąrašo pabaigoje yra gana paprasta, nes Taylor tik turi į tašką, kuris vietoj žemės ar mes jį vadiname niekinis, niekinis yra tarsi nesant iš rodyklę arba speciali nulis žymeklis, esate ketina atkreipti jūsų kairėje rankų Rainbow ir tada vaivorykštė, Kur reikia kaire ranka tikriausiai taškas? Žemyn. Tai nėra gerai, jei jos ranka yra tarsi nukreipta ne čia arba tarsi bet kurlink. Kad būtų laikomas šiukšlių vertė, bet jei ji atkreipia dėmesį į kai žinoma vertė, mes vadina jį nulinis arba niekinis, kad viskas OK nes mes turime į šį terminą ir mes žinome, sąrašas dabar yra baigtas. Taigi, kas kita gana paprastas atvejis? Gal mes malloc 5? Nagi iki. Koks tavo vardas? TIFFANY: Tiffany. DAVID Malan: Aš atsiprašau? TIFFANY: Tiffany. DAVID Malan: Tiffany. Gerai. Tiffany buvo malloced su verte 5. Nagi iki. Tai vienas gana lengva per daug, bet aptarkime Užsakyti operacijų metu. Tai buvo gana lengva su Taylor pabaigoje. Numeris 5 yra žinoma mažiau nei 9, ir todėl mes turime Dovydą, turime Tiffany, ir kas buvo tavo vardas? JAKE: Jake. DAVID Malan: Jake. Tiffany, Jake, o Davidas. Kieno ranka turėtų būti atnaujintas pirmas? Ką norite daryti čia? Yra pora galimų būdų, tačiau ten taip pat viena ar daugiau neteisingų būdų. Auditorija: Pradėti su kairiausias. DAVID Malan: Pradėti su kairiausias. Kas kairiausias čia tada? Auditorija: Pirma. DAVID Malan: Gerai. Taigi pradėti pirmas ir kur tu norite atnaujinti Dovydo rankas, kad būtų? Auditorija: Link 5. DAVID Malan: Gerai. Dovydas punktas penkių arba Tiffany čia ir dabar? Auditorija: Tiffany atkreipia dėmesį į 9? DAVID Malan: Puikiai, išskyrus Binky s galva tiesiog rūšies nukrito, tiesa? Nes tai, kas yra negerai su Ši nuotrauka pažodžiui? Auditorija: Nieko nukreipta. DAVID Malan: Nieko nukreipta į Jake dabar. Mes tiesiog našlaičiais 9 ir 17, ir mes tiesiog nutekėjo visą šį atminties, nes iki atnaujinti Dovydo ranką pirma, tai gerai, kiek tai teisingai nukreipta į Tiffany dabar bet jei niekas turėjo Prognozavimo atkreipti ne Jake, tada mes pamečiau visuma šio sąrašo. Taigi leiskite atšaukti. Taigi, tai buvo geras dalykas kelionę per bet tegul ištaisyti dabar. Ką turėtume daryti pirmiausia vietoj? Taip? Auditorija: Tiffany turėtų būti nukreiptas į 9? DAVID Malan: aš negaliu gauti, kad šalia jūsų. Kas turėtų būti nukreiptas į 9? Auditorija: Tiffany. DAVID Malan: Visos dešinę. Taigi Tiffany pirmiausia turėtų taško, esančio 9. Taigi Tiffany turėtų imtis tapačiu vertės Dovydui, kuris, atrodo, nereikalingas akimirką, bet tai gerai, nes dabar antra žingsnis, mes galime atnaujinti Dovydo ranka atkreipti Tiffany, ir tada, jei Mes tiesiog rūšies švarus things up taip, tarsi tai rūšies pavasario-kaip, Dabar tai teisingas įterpimas. Taigi puikus. Taigi dabar mes beveik ten. Leiskite įdėkite vieną galutinį vertė kaip vertės 20. Jei galėtume malloc vieną galutinį savanoriu? Nagi iki. Taigi tai viena yra šiek tiek daugiau sudėtinga. Bet iš tikrųjų, kodas mes raštu, nors žodžiu, yra kaip turintys krūva informacija, jei sąlygos dabar, tiesa? Mes turėjome būklę tikrinti, ar jis priklauso pabaigoje, o gal pradžioje. Mes turime tam tikrą kilpą natūra rasti viduryje vietoje. Taigi padarykime, kad su tuo, kas yra tavo vardas? ERIC: Erikas. DAVID Malan: Erikas? Erikas. Malonu susipažinti. Taigi, mes turime 20. Mažiau nei penkias? Ne. Mažiau nei devynios? Ne. Mažiau nei 17? Ne. GERAI. Jis priklauso čia ir jūsų vardai vėl esame? SUE: teistis. DAVID Malan: teistis. Alex: Alex. DAVID Malan: teistis, Aleksas, ir? ERIC: Erikas. DAVID Malan: Erikas. Kieno rankas reikia norint atnaujinti pirmiausia? Auditorija: Erikas. GERAI. Taigi Eric turėtų atkreipti ne kur? Šiuo 22. Geras. Ir dabar kas toliau? Teistis tada gali atkreipti Eric Ir dabar, jei jus vaikinai tiesiog padaryti šiek tiek kambarį, kuris yra gerai vizualiai, o dabar mes padarėme įtraukimui. Taigi leiskite dabar mano klausimą, bet Thank you so much už mūsų savanoriams. Labai gerai padaryta. Galite išsaugoti tuos, jei jums patinka. Ir mes turime gražių atsisveikinimo dovaną, jeigu kiekvienas norėtumėte imtis streso kamuolio. Leiskite perduoti šią žemyn. Taigi, kas yra tai Takeaway? Tai gali būti nuostabi tiek, kiek turime dabar pristatė alternatyvą į masyvo, kuris yra ne taip apsiriboja prie kai kurių fiksuoto dydžio masyvo. Jie gali augti dinamiškai. Tačiau daug, kaip mes matėme savaites praeitis, mes niekada nieko nemokamai, kaip tikrai ten kompromisas čia. Taigi su susieto nelyginant sąrašas, tai dinamiškumas? Šis gebėjimas augti ir atvirai, mes galėjo padaryti ištrinti ir mes galime trauktis, kiek reikia. Kokią kainą mes mokėti? Dvigubai daugiau erdvės, visų pirma. Jei pažvelgti į paveikslėlį, nebėra aš saugoti sveikųjų skaičių, sąrašą. Aš saugodami sąrašą sveikieji skaičiai plius patarimų. Taigi, aš dvigubai erdvės dydį. Dabar, gal tai nėra tokia baisi 4 baitai, 8 baitai, bet jis tikrai galėtų pridėti iki didelių duomenų rinkinių. Kas kita neigiama? Taip? Auditorija: Turime feed juos vieną po kito. DAVID Malan: Taip. Mes turime išanalizuoti juos vieną po kito. Jūs žinote, ką mes metė Tai super patogi funkcija kvadratinių laikikliu notacija daugiau tinkamai žinomas kaip laisvą prieigą, kur mes galime tiesiog šokinėti atskiram elemento bet dabar, jei aš vis dar turėjo Mano savanoriai čia, jei aš norėjau rasti numeris 22, aš negaliu tiesiog peršokti į laikiklis kažkas kažką. Turiu atrodo per sąrašą, daug kaip mūsų ieškojimų pavyzdžių tiesiškai, rasti numeris 22. Taigi mes, atrodo, kad ji sumokėjo kainą ten. Bet mes vis dėlto gali išspręsti kitas problemas. Tiesą sakant, leiskite man pristatyti tik su vizualizacijomis pora. Taigi, jei jūs buvote iki Mather valgomajame neseniai, jums priminti, kad jų kaminai padėklai, kaip šis, mes pasiskolino iš jų Annenberg prieš klasę. Taigi šis padėklai kamino, nors, atvaizduoja iš tikrųjų iš kompiuterių mokslo duomenų struktūros. Yra duomenų struktūra kompiuterių mokslo žinomas kaip kamino, kuris labai gražiai skolina pati tiksliai tai vizualiai. Taigi, jei kiekviena iš šių padėklai yra ne dėklas bet kaip skaičių ir aš norėjau saugoti numerius, aš gali įdėti vieną žemyn čia ir galėčiau įdėti kitą žemyn čia ir toliau krauti numerius ant vienas kito, ir kas potencialiai naudinga apie tai yra tai, kad koks POVEIKIS Šio duomenų struktūros? Kuris numeris galiu ištraukti Pirmasis Patogiausia? Patys neseniai vienas įdėti ten. Taigi tai yra tai, ką mes vadiname į kompiuteris mokslui LIFO duomenų struktūra. Paskutinis in, first out. Ir mes pamatysime prieš ilgas, kodėl kuri gali būti naudinga, bet dabar, tiesiog mano turtą. Ir tai tipo kvaila, jei jūs manote apie tai, kaip valgykla daro. Kiekvieną kartą, kai jie švarūs padėklai ir įdėti šviežių tuos ant viršaus, Jūs galite turėti anksčiau švarus bet galiausiai labai purvinas ir dulkėtas dėklas pačioje apačioje Jei niekada iš tikrųjų patekti į apačioje, kad kamino, nes jums tiesiog išlaikyti išleisti naujas ir švarios tie ant jo. Tas pats gali atsitikti prekybos centre taip pat. Jei turite vitrinos pieno ir kiekvieną kartą CVS ar tas, kas gauna daugiau pieno, jūs tiesiog įgrūsti pieneliu Jūs jau turite nugaros ir sudėsite naujus priekyje, jūs ketinate turėti keletas gana bjaurus pieno ties duomenų struktūros pabaigoje, nes jis visada apačioje arba analogiškai tai visada gale. Tačiau yra ir kitas būdas galvoti apie rikiuojasi duomenis ir, pavyzdžiui, šis. Jei esate vienas iš tų žmonių, kurie sako, kad patinka išsirikiuoti už Apple parduotuvėse kai naujas produktas yra , jūs tikriausiai nenaudojate dėklo duomenis struktūra, nes jus būtų atstumti ir visi kiti, kas yra rikiuojasi įsigyti tam tikrą naują žaislą. Atvirkščiai, jūs tikriausiai naudojate kokios duomenų struktūros ar kokios sistemos realiame pasaulyje? Tikimės, kad tai linija, ar daugiau tinkamai arba daugiau britų pavyzdžiui, eilėje. Ir it turns out eilėje taip pat yra duomenų struktūra kompiuterių mokslo, bet eilėje yra labai skiriasi nuosavybė. Tai ne LIFO. Paskutinis in, first out. Neduok Dieve. Tai ne FIFO. First in, first out. Ir tai yra geras dalykas už teisingumo "labui tikrai, kai jūs pamušalas iki super anksti ryte. Jei ten Pirma, jūs norite išeiti pirmas, taip pat. Ir taip visų šių duomenų struktūros, eilės ir kaminai ir kekių kitiems, paaiškėja, jums gali galvoti apie tai, kaip tik masyvą. Tai yra masyvas, gal fiksuoto dydžio 4, bet tai reikia būti natūra malonu, jei galėtume tiesiog krūva padėklai beveik be galo aukštas, jei mes turi, kad daugelis padėklai arba numerius. Tai gal mes norime naudoti susietą sąrašą čia bet kompromisas bus potencialiai kad mums reikia daugiau atminties, užtrunka šiek tiek daugiau laiko, bet mes nereikia apriboti kamino aukštis, panašiai kaip Mather anketa vitrinos gali apriboti dydį rietuvės, ir taip tai yra dizaino sprendimai ar variantų mums galiausiai. Taigi su šiais duomenimis struktūros, mes pradėjome matau nauja viršutinė kainos ribas potencialiai apie tai, kas anksčiau buvo super greitai, ir kur mes paliksime ne šiandien, ir kai mes tikimės gauti yra trečiadienį, mes pradėti pažvelgti į duomenų struktūra, kuri leidžia mums ieškoti per duomenimis Prisijungti pabaigos laiką dar kartą. Ir mes matėme, kad prisimenate, nulinės savaitę ir vienas su dvejetainiu paieškos ar takoskyros ir valdyk. Jis grįžta ir dar geriau, Gralis šiam trečiadienį bus sugalvoti duomenų struktūra, kuri veikia tikrai arba teoriškai pastovus laikas, kuriuo nesvarbu, kiek milijonus ar milijardus dalykų turime duomenų struktūros, ji bus imtis mums pastovų laiką, o gal vienas žingsnis arba du žingsniai arba 10 žingsnių, bet nuolatiniai numeriai žingsnių ieškoti per tą duomenų struktūros. Tai iš tiesų bus Gralis bet daugiau apie tai trečiadienį. Žiūrėti ya tada. [Muzikos grojimo]