[TÓNLIST spila] [Vídeó spilun] -Hann Er að ljúga. -Um hvað? -Ég veit það ekki. -Svo Hvað vitum við? -Það Á 9:15, Ray Santoya var í hraðbanka. -Já. Svo spurningin er, hvað var hann að gera á 9:16? -Shooting Á 9 millimetra á eitthvað. Kannski sá hann leyniskytta. -Eða Var að vinna með honum. -Wait. Fara aftur eitt. -Hvað sérðu? -Bring Andlit sitt fullur skjár. -His Gleraugu. -Það Er spegilmynd. -Það Er Nuevitas baseball liðið. Það er merki þeirra. -Og Hann er að tala við hver er þreytandi að jakka. [END spilun] DAVID Malan: Allt í lagi. Þetta er CS50 og þetta er aðeins meira af [inaudible] sem þú ert fór að fikta við Heimadæmi fjórir. Í dag erum við að byrja að líta aðeins meira djúpt á þessum hlutum sem kallast ábendingum, sem jafnvel þó að það er nokkuð yfirnáttúrulegt efni, það kemur í ljós að það er að fara að vera með hvaða hætti við getur byrjað að byggja og samsetningu miklu flóknari forrit. En við gerðum það á síðasta miðvikudag með því að sumir claymation fyrsta. Svo þetta, muna, er Binky og við notuðum hann að taka a líta á forrit sem var í raun ekki að gera neitt áhugavert, en það gerði sýna nokkur vandamál. Svo til að byrja í dag, hvers vegna eigum við ekki að ganga hratt í gegnum nokkrar af þessum skrefum, reyna að distill í skilmálum Human nákvæmlega hvað er að gerast hér og hvers vegna þetta er slæmt, og þá fara og í raun að byrja að byggja eitthvað með þessari tækni? Svo þetta voru fyrstu tvær línur í þessari áætlun og í skilmálum leikmaður er, hvað eru þessar tvær línur að gera? Einhver sem er nokkuð þægilegt með hvað er lýst á skjánum? Hvað eru þessar tvær línur að gera? Það er ekki allt sem frábrugðin viku eitt, en það er einhver nýr sérstakt tákn. Já? Þangað aftur. Áhorfendur: Lýsa ábendingum? DAVID Malan: Segðu þetta aftur Áhorfendur: Lýsa ábendingum? DAVID Malan: lýsa yfir ábendingum og skulum betrumbæta það svolítið meira. Áhorfendur: [inaudible] vistfangi x og þá er Y. DAVID Malan: Og þá takast. Svo sérstaklega hvað við erum að gera er að við erum að lýsa yfir tvær breytur. Þessar breytur, þó, eru að fara að vera af gerðinni int stjörnu, sem nánar tiltekið þeir eru að fara að geyma veffang int, hver um sig, x og y. Nú eru allir gildi? Eru einhverjar raunveruleg heimilisföng í þetta tvær breytur á þessum tímapunkti? Nei Það er bara svo-kallað sorp gildi. Ef þú ert ekki í raun framselja a breyta, hvað var í vinnsluminni áður er að fara að fylla með núllum og sjálfur bæði af þeim breytum. En við gerum ekki enn vita hvað þeir eru og það er að fara að vera lykillinn að hvers vegna Binky missti höfuðið í síðustu viku. Þannig að þetta var claymation holdgun þetta þar sem þú ert bara tvær breytur, litlu hringlaga stykki af leir, sem getur geymt breytur, en eins og sem vafið upp örvarnar benda, þeir eru í raun ekki benda til einhvers staðar þekkt sem slík. Já síðan fengum við þessa línu, og þetta var nýr í síðustu viku, malloc fyrir minni úthlutun, sem er bara fínt leið að segja stýrikerfi, Linux eða Mac OS eða Windows, hey, gefa mér minni, og það eina sem þú þarft að segja stýrikerfi er það þegar að spyrja hana fyrir minni. Það er ekki að fara að kæra hvað þú ert að fara að gera við það, en þú þarft að segja rekstri kerfi sem með því að malloc. Já? Áhorfendur: Hversu mikið? DAVID Malan: Hversu mikið? Hversu mikið í bætum, og svo, þetta, aftur, tilgerðalegra dæmi, er bara að segja, gefa mér stærð int. Nú, stærð int er fjögur bæti eða 32 bita. Svo er þetta bara leið segja, hey, stýrikerfi, gefa mér fjögur bæti af minni sem ég get notað til ráðstöfunar minn, og sérstaklega, hvað þýðir malloc aftur með tilliti að því klumpur af fjórum bæti? Áhorfendur: Heimilisfang? DAVID Malan: The netfang. The tölu þess klumpur af fjórum bæti. Nákvæmlega. Og svo er það það sem er vistað á endanum í x og það er hvers vegna við gerum ekki raunverulega sama hvað fjölda sem netfang er, hvort sem það er OX1 eða OX2 eða einhver dulinn sextánskur netfang. Við sama bara á myndrænan sem að breyta x er nú bendir til þess klumpur af minni. Svo örin táknar músina, eða Nánar, þá er minni heimilisfang. En aftur, við gerum ekki venjulega sama hvað þessir raunverulegur tölur eru. Nú, þessi lína segir hvað í skilmálum leikmaður er? Star x fær 42 semíkommu. Hvað þýðir þetta? Viltu fara? Ekki klóra ekki háls þinn. Áhorfendur: The póstfang x er á 42. DAVID Malan: The póstfang x er 42. Ekki alveg. Svo nálægt, en ekki alveg, vegna þess að það er stjarnan sem er forskeytið þetta x. Þannig að við þurfum að fínstilla smá. Já? Áhorfendur: Verðmæti að bendillinn x er bendir til er 42. DAVID Malan: OK. Gildið sem bendillinn x er bendir til, við skulum segja, skal vera 42, eða setja annan hátt, á stjörnuna x segir, fara í hvaða heimilisfang er í x, hvort sem það er 1 Oxford Street eða 33 Oxford Street eða OX1 eða ox33, hvað sem tölustafir netfang er, stjörnu x er dereferencing x. Svo fara á þetta netfang og þá setja fjölda 42 þar. Svo sem myndi vera jafngildir leið til að segja það. Svo er það allt í lagi og þá við myndum tákna mynd þannig þar sem við höfum bætt við 42 til þess klumpur af fjórum bæti á the réttur-hönd hlið, en þessi lína var þar sem hlutirnir fóru skakkur og höfuð Binky er laust burt á þessum tímapunkti, vegna slæmir hlutir gerast þegar þú dereference sorp gildi eða þú dereference ógild ábendingum, og ég segi ógild vegna þess að á þessum tímapunkti í Sagan, sem er inni í y? Hvað er verðmæti y byggt á undanförnum skrefum? Já? Hvað er þetta? Áhorfendur: An netfang. DAVID Malan: An netfang. Það ætti að vera heimilisfang en ég hef frumstilla hana? Þannig að ég hef ekki enn. Svo hvað er þekkt fyrir að vera þarna? Það er bara nokkrar sorp gildi. Það gæti verið eitthvað netfang frá núll til 2 milljarðar ef þú ert með tvær gigs af RAM, núll til að 4 milljarða ef þú hefur fékk fjóra gígabæta vinnsluminni. Það er einhver sorp gildi, en vandamálið er að stýrikerfi, ef það hefur ekki gefið þér sem klumpur af minni sérstaklega að þú ert að reyna að fara til, það er almennt að fara að valda hvað við höfum séð sem skiptingu kenna. Svo í raun, einhver ykkar sem hafa barist á vandamál á skrifstofutíma eða vandamál sem er meira almennt við að reyna að reikna út a skiptingu kenna, sem yfirleitt þýðir þú ert að snerta hluti af minni sem þú ættir ekki að vera. Þú ert að snerta minni sem stýrikerfi hefur ekki leyfa þér að snerta, hvort sem það er með því að fara of langt í array þinn eða að byrja núna hvort það er vegna þess að þú ert að snerta minni sem bara er einhver sorp gildi. Þannig stjörnu x hér er konar óskilgreindu hegðun. Þú ættir aldrei að gera það vegna þess skjön eru, the program er bara að fara að hrun, vegna þess að þú ert að segja, fara á þetta netfang og þú hefur ekki hugmynd um hvar sem netfang í raun er. Svo að stýrikerfið er líklegt að fara að hrun program vegna og örugglega, það er hvað gerðist þarna að Binky. Svo að lokum, Binky fastur þetta vandamál með þetta. Svo þessi forrit sjálft var gölluð. En ef þú svona sækja fram og framkvæma þessa línu í staðinn, Y jafngildir x þýðir bara hvað netfang er x, einnig setja það í y. Og svo á myndrænan, höfum við fulltrúa þetta með tveimur örvum frá x og frá y bendir á sama stað. Svo merkingu, x er jafnt að y vegna þess að báðir þeir erum að geyma sama heimilisfang, Ergo bendir á 42, og nú, þegar þú segir stjörnuna Y, fara á heimilisfang í y, þetta er áhugaverð aukaverkun. Svo heimilisfang í y er sama og heimilisfang í x. Þannig að ef þú segir að fara að heimilisfangi í y og breyta gildi til 13, hverjir aðrir fyrir áhrifum? X er lið D, svo að segja, ættu að hafa áhrif eins og heilbrigður. Og reyndar, hvernig Nick dró atkvæði í claymation var einmitt það. Jafnvel þó að við fylgjum músina Y, endaði við upp á sama stað, og svo ef við vorum að prenta út x eða pointee Y er, þá myndum við sjá verðmæti 13. Nú segi ég pointee að vera í samræmi við vídeó. Forritari, að mínum þekkingu, aldrei segja orðið pointee, það sem er bent á, en samkvæmni með the vídeó, átta það er allt sem var þýddi í þeirri stöðu. Svo einhverjar spurningar um claymation eða ábendingum eða malloc bara ennþá? Nei? Allt í lagi. Svo án frekari ado, við skulum taka a líta á þar sem þessi hefur í raun verið notað í nokkurn tíma. Þannig að við höfum haft þetta CS50 bókasafn sem fékk allar þessar aðgerðir. Við höfum notað GetInt mikið, GetString, sennilega GetLongLong fyrr í pset minn einn eða svo, en hvað er í raun verið að fara á? Jæja, við skulum taka a fljótur líta undir hetta á forrit sem hvetur þess vegna sem við gefum þér CS50 bókasafn, og reyndar eins og á síðasta viku, við byrjuðum að taka þá þjálfun hjól burt. Þannig að þetta er nú flokkaður af Postmortem hvað hefur verið í gangi inni CS50 bókasafn, jafnvel þótt við nú mun byrja að flytja í burtu frá honum fyrir flest forrit. Svo er þetta forrit sem heitir scanf 0. Það er frábær stutt. Það hefur bara þessar línur, en það kynnir virka heitir scanf að við erum í raun að fara að sjá í stund inni í CS50 bókasafn, að vísu í örlítið mismunandi hátt. Þannig að þetta forrit á línu 16 er að lýsa breytilega x. Svo gefa mér fjögur bæti fyrir int. Það er verið að segja notandi, Fjöldi vinsamlegast, og þá þetta er áhugavert lína sem reyndar bindur saman í síðustu viku og þetta. Scanf, og þá eftir það tekur snið band, bara eins printf, % i þýðir int, og þá tekur það Önnur rökin sem lítur svolítið angurvær. Það er merkið x, og að muna, við sáum aðeins í þetta sinn í síðustu viku. Hvað þýðir merkið x tákna? Hvað þýðir merkið gera í C? Já? Áhorfendur: The póstfang. DAVID Malan: The póstfang. Svo er það hið gagnstæða stjörnunnar rekstraraðila, en stjarnan rekstraraðila segir, fara í þetta netfang, að merkið rekstraraðila segir, reikna út netfang þessarar breytu, og svo er þetta lykillinn, því Tilgangur Scanf í lífinu er að skanna notanda inntak frá lyklaborðinu, eftir hvað hann eða hún tegundir, og þá lesa inntak sem notanda í breytu, en við sá á síðustu tveimur vikum að það skipti fall sem við reyndi áreynslulaust að innleiða var bara brotinn. Muna að við skipti virka, ef við lýst bara A og B sem ints, við vissum tekist að skipta um tvær breytur inni í skipti Rétt eins og með mjólk og OJ, en um leið og skipti aftur, hvað var niðurstaðan varðar að x og y, upprunalega gildi? Ekkert. Já. Ekkert gerðist þann tíma, vegna þess að skiptasamninga breyta aðeins sínum staðbundin afrit, sem er að segja, allir í þetta sinn, þegar við höfum verið farið í málflutningi að virka, við erum bara komið afrit af þessum rifrildum. Þú getur gert við það hvað sem þú vilt með þeim, en þeir eru að fara að hafa ekki áhrif á upprunaleg gildi. Svo er þetta erfitt ef þú vil hafa virka eins Scanf í lífinu, en tilgangur hennar er að skanna inntak notanda frá lyklaborðinu og þá fylla í eyðurnar, svo að tala, það er, gefa breytu að X gildi, vegna þess að ef ég væri bara fara á X Scanf, ef þú telur rökfræði síðasta viku, scanf getur gert hvað sem það vill með afrit af x, en það gæti ekki varanlega breyta x nema við gefum Scanf fjársjóð kort, svo að segja, þar sem x markar blettur, þar við fara í heimilisfang x þannig að scanf getur farið þangað og í raun breyting verðmæti x. Og svo reyndar allt sem þetta forrit gerir ef ég geri scanf 0, í heimildarmanni mínum 5m skrá, gera scanf 0, punktur rista scanf, fjöldi vinsamlegast 50, takk fyrir 50. Svo það er ekki allt sem áhugavert, en hvað er örugglega að gerast er að um leið og ég kalla Scanf hér, gildi x er varanlega breytt. Nú, þetta virðist ágætur og gott, og í raun, það virðist eins og við gerum ekki raunverulega þörf CS50 bókasafn yfirleitt lengur. Til dæmis, við skulum hlaupa þetta einu sinni enn hér. Leyfðu mér að opna það fyrir a second. Prófum númer skaltu og í stað þess að segja 50 eins og áður, við skulum bara segja nei. OK, það er svolítið skrýtið. OK. Og bara nokkrar bull hér. Svo það virðist ekki höndla rangra aðstæður. Þannig að við þurfum að óverulega byrja bæta nokkrum error-stöðva til að tryggja að notandinn hefur slegið í raunverulegum fjölda eins og 50, því virðist skrifa orð er ekki greind eins erfið, en það líklega ætti að vera. Við skulum líta á þessa útgáfu nú er það tilraun mín til að reimplement GetString. Ef scanf hefur allt þetta virkni innbyggður í, hvers vegna höfum við verið að fór að fikta við þetta þjálfun hjól eins GetString? Jæja, hér er kannski mitt eigið einföld útgáfa af GetString þar fyrir viku síðan, gæti ég hef sagt, gefa mér band og kalla það biðminni. Í dag ætla ég að byrja bara segja bleikju stjörnu, sem muna, það er bara samheiti. Það lítur scarier en það er nákvæmlega það sama. Svo gefa mér breytilega heitir biðminni það er að fara að geyma band, segja notandi band takk, og þá, bara eins og áður, við skulum reyna að taka lán þessa lexíu scanf % s í þetta sinn og þá fara í biðminni. Nú, fljótur geðheilbrigði athuga. Hvers vegna er ég ekki að segja merkið biðminni þennan tíma? Álykta frá fyrra dæmi. Áhorfendur: Char stjarna er bendi. DAVID Malan: Einmitt, því að þessu sinni, bleikju stjarna er þegar bendillinn, heimilisfang, með því að skilgreina sem star vera þar. Og ef scanf ráð netfang, það nægir bara að fara í biðminni. Ég þarf ekki að segja merkið biðminni. Fyrir forvitinn, þú gætir gera eitthvað eins og this. Það myndi hafa mismunandi merkingu. Það myndi gefa þér bendi til músina, sem er í raun gilt hlutur í C, en fyrir nú, við skulum halda það einfalt og halda sögu stöðug. Ég ætla bara að fara að fara í biðminni og það er rétt. Vandamálið er þó að þetta. Leyfðu mér að fara á undan og keyra þetta program eftir að setja saman það. Gera scanf 1. Fjandinn það, þýðanda míns smitandi villa mína. Gefðu mér eina sekúndu. Clang. Skulum segja Scanf-1.c. OK. Það sem við förum. Ég þarf það. CS50 ID hefur ýmis stillingar sem verja þig gegn sjálfum sér. Ég þurfti að slökkva á þeim með því að gangi clang handvirkt í þetta sinn. Svo string vinsamlegast. Ég ætla að fara á undan og sláðu í uppáhalds Hello my world. OK, null. Það er ekki það sem ég slóst. Svo það er til marks um eitthvað vera rangt. Leyfðu mér að fara á undan og sláðu í mjög langan streng. Takk fyrir null og ég veit ekki ef ég ætla að vera fær um að hrun það. Við skulum reyna smá afrit líma og sjá hvort þetta hjálpar. Bara líma mikið af þessu. Það er örugglega stærri band en venjulega. Við skulum bara virkilega skrifa það. Nei Fari það. Stjórn fannst ekki. Svo er það óskyld. Það er vegna þess að ég límt slæmar stafir, en þetta kemur í ljós er ekki að fara að vinna. Við skulum reyna þetta einu sinni enn, því það er meira gaman ef við hrun í raun það. Skulum slá þetta og nú er ég að fara að afrita mjög langan streng og nú skulum sjá hvort við geta hrun þetta. Eftir ég sleppt rými og nýjar línur og semikommum og allt angurvær stafir. Sláðu. Og nú net er bara að vera hægur. Ég hélt niður Command-V of lengi, greinilega. Fari það! Stjórn fannst ekki. OK. Jæja, málið er þó eftirfarandi. Svo hvað er í raun að fara á þessari yfirlýsingu af bleikju stjörnu biðminni á línu 16? Svo hvað er ég að fá þegar ég lýsa yfir músina? Það eina sem ég fæ er fjögurra bæti gildi heitir biðminni, en hvað er inni í henni í augnablikinu? Það er bara nokkrar sorp gildi. Vegna hvenær þú lýsa breytu í C, er það bara sumir sorp gildi, og við erum farin að Ferð á þessum veruleika. Nú, þegar ég segi scanf, fara á þetta netfang og setja hvað sem notandinn slær inn. Ef notandinn slær í halló heimurinn, vel, hvar á ég að setja það? Jafnalausnin er sorp gildi. Svo er það svona eins og ör sem er að benda hver veit hvar. Kannski það er að benda hérna í minni mínu. Og svo þegar notandi gerðir í Halló heimur, forritið reynir að setja string Halló heimur sviga 0 í þeirri klumpur af minni. En með miklum líkum, en greinilega ekki 100% líkur, tölvan er að fara að þá hrun forritið vegna þess að þetta er ekki minni ég ætti að vera heimilt að snerta. Svo í stuttu máli, þetta forrit er gölluð í nákvæmlega þeirri ástæðu. Ég er í grundvallaratriðum ekki gera það? Hvaða skref hef ég sleppt, rétt eins við sleppt með fyrsta Binky er td? Já? Áhorfendur: Minni úthlutun? DAVID Malan: Minni úthlutun. Ég hef reyndar ekki úthlutað allir minni strengsins. Þannig að við getum lagað þetta í nokkra vegu. Einn, getum við halda það einfalt og í raun, nú þú ert að fara að byrja að sjá blurring af línunum á milli hvað fylki er, hvað band er, hvað bleikju stjörnu er, hvað fylki af chars er. Hér er annað dæmi sem felur í sér strengi og fyrirvara allt sem ég hef gert á línu 16 er, í stað þess að segja sem biðminni er að fara til vera a bleikju stjarna, bendi á klumpur af minni, Ég ætla að mjög stanslaust gefa mig vera stuðpúði fyrir 16 stafi, og í raun, ef þú ert kunnuglegur með hugtakinu höggdeyfir, líklega úr heimi vídeó, þar sem vídeó er höggdeyfir, höggdeyfir, höggdeyfir. Jæja, hvað er tengingin hér? Jæja, Inni YouTube og inni í vídeó leikmaður almennt er fylki sem er stærri en 16. Það gæti verið fjölbreytta stærð einum megabæti, kannski 10 megabæti, og í því fylki er vafrann þinn sækja a heild búnt af bætum, a heild búnt af megabæta vídeó og vídeó leikmaður, YouTube er eða hver er, byrjar lesa bæti úr því fylki, og hvenær þú sérð Bæta höggdeyfir, höggdeyfir, sem þýðir að leikmaður hefur fengið til loka þessi fylking. The net er svo hægur að það hefur ekki fylla array með fleiri bæti og þannig að þú ert út af bitum til að sýna fyrir notandann. Svo er biðminni líklegur tíma hér í að það er bara fylki, klumpur af minni. Og þetta mun laga það vegna þess að það kemur í ljós að þú getur meðhöndla fylki eins og þeir eru heimilisföng, jafnvel þótt biðminni er bara tákn, það er röð af stöfum, dúa, það er gagnlegt fyrir mig, forritari, þú geta fara framhjá nafn sitt í kring eins og það væri músina, eins og það voru heimilisfang klumpur minni fyrir 16 stafir. Svo það er að segja, ég get framhjá sem scanf einmitt þessi orð og svo nú, ef ég geri þetta forrit, gera scanf 2, punktur rista scanf 2, og slá inn halló heimur, Sláðu, að time-- Hmm, hvað gerðist? String vinsamlegast. Hvað gerði ég rangt? Halló heimur, biðminni. Halló heimur. Ah, ég veit hvað það er að gera. OK. Svo það er að lesa upp þar til fyrsta pláss. Svo skulum svindla fyrir réttlátur a augnablik og segi ég vildi bara að slá eitthvað mjög lengi eins og þetta er langur setning það er einn, tveir, þrír, fjórir, fimm, sex, sjö, átta, níu, 10, 11, 12, 13, 14, 15, 16. OK. Það er örugglega löng setning. Svo er þessi setning lengur en 16 stafir og svo þegar ég ýta á Enter, hvað er að fara að gerast? Vel, í þessu tilfelli þess saga, ég hafði lýst biðminni að í raun að vera array með 16 stafir tilbúinn til að fara. Svo einn, tveir, þrír, fjórir, fimm, sex, sjö, átta, níu, 10, 11, 12, 13, 14, 15, 16. Svo 16 stafir, og nú, þegar ég lesa í eitthvað eins og þetta er langur setning, hvað er að fara að gerast er sem ég ætla að lesa í þetta er langur S-E-N-T-E-N-C-E, setningu. Svo er þetta vísvitandi a slæmur hlutur sem ég halda að skrifa út fyrir Mörk array minn, út fyrir mörk biðminni minn. Ég gæti fengið heppinn og forritið mun halda áfram að keyra og ekki sama, en almennt séð, þetta mun örugglega hrun program minn, og það er padda í minn kóða stund ég stíga út fyrir mörk af því fylki, vegna þess að ég veit ekki hvort það er endilega að fara að hrun eða ef ég ætla bara að fara að fá heppinn. Svo er þetta erfið vegna þess að í þetta mál, það virðist virka og við skulum freista örlög hér, jafnvel þótt IDE virðist þola töluvert of-- Það sem við förum. Loksins. Þannig að ég er sú eina sem getur séð þetta. Svo ég hafði bara einhver fjöldi af gaman vélritun út mjög lengi raunverulegum setningu að það fór vissulega 16 bytes, vegna þess að ég slóst í þessu brjálaða langa multi-lína setningu, og þá taka eftir hvað gerðist. The program reyndi að prenta það og þá fékk skiptingu kenna og skiptingu galla er þegar eitthvað eins og þetta gerist og stýrikerfi segir nei, get ekki snerta þessi minni. Við erum að fara að drepa forritið öllu leyti. Svo virðist þetta erfið. Ég hef bætt á dagskrá að félag að minnsta kosti hafa sumir minni, en þetta virðist að takmarka virka GetString til að fá strengir af einhverjum endanlegum lengd 16. Svo ef þú vilt styðja lengur setningar en 16 stafir, hvað gerir þú? Jæja, getur þú aukið Stærð þessa biðminni til 32 eða sem virðist konar stutt. Hvers vegna eigum við ekki að gera bara það 1000 en ýta aftur. Hvað er svar innsæi á bara forðast þetta vandamál með því að gera biðminni minn stærri, eins og 1000 stafir? Með því að innleiða getstring þessa leið. Hvað er gott eða slæmt hér? Já? Áhorfendur: Ef þér bindið upp mikið pláss og þú notar það ekki, þá getur þú ekki endurúthluta þessi pláss. DAVID Malan: Algjörlega. Það er sóun að því leyti eins og ef þú ert ekki raunverulega þörf 900 af þeim bæti og enn þú ert að biðja um 1000 í alls engu að síður, þú ert bara að neyta meira minni á tölvu notandans en þú þarft að, og eftir allt, sumir af þú hefur nú þegar komið í lífinu að þegar þú ert gangi fullt af forritum og þeir eru að borða upp fullt af minni, þetta getur í raun haft áhrif á árangur og reynslu notandans á tölvunni. Svo er það eins konar latur lausn, fyrir víst, og öfugt, það er ekki bara sóun, hvað vandamálið enn, jafnvel ef ég geri biðminni minn 1000? Já? Áhorfendur: The band er lengd 1001. DAVID Malan: Einmitt. Ef strengurinn er lengd 1001, þú hafa nákvæmlega sama vandamál, og með því að rök mín, myndi ég bara þá gera það 2000, en þú veist ekki í fara hversu stór hún ætti að vera, og enn, ég er að safna saman áætlun mína fyrir að láta fólk nota og sækja það. Svo er þetta nákvæmlega eins konar efni sem CS50 bókasafn reynir til að hjálpa okkur með og við munum aðeins litið á sumir af undirliggjandi framkvæmd hér, en þetta er CS50 punktur C. Þetta er skrá sem hefur verið á CS50 IDE allar þessar vikur sem þú hefur verið að nota. Það er pre-saman og þú hefur verið að nota það sjálfkrafa eðli þess að hafa þjóta L CS50 fána með clang, en ef ég skruna niður í gegnum allar þessar aðgerðir, hér er GetString, og bara til að gefa þér bragð af hvað er að gerast, við skulum taka a fljótur líta á hlutfallslegt flókið. Það er ekki frábær langur virka, en við gerðum ekki þurfa að hugsa allt erfitt um hvernig á að fara um að fá strengi. Svo er hér biðminni minn og ég virðist frumstilla hana á núll. Þetta, auðvitað, er sama og bleikju stjarna, en ég ákvað í framkvæmd CS50 bókasafn að ef við erum að fara að vera alveg dynamic, Ég veit ekki fyrirfram hversu stór af a band notendur eru að fara til að vilja fá. Þannig að ég ætla að byrja með bara tómt streng og ég ætla að byggja upp eins mikið minni og ég þarf að passa notanda band og ef ég hef ekki nóg, ég ætla að spyrja stýrikerfi fyrir meira minni. Ég ætla að færa band þeirra í stærri klumpur af minni og ég ætla að gefa út eða losa í nægilega stór klumpur af minni og við erum bara að fara til að gera þetta iteratively. Svo fljótlega litið, hér er bara breyta sem ég ætla að halda utan af getu biðminni minn. Hversu margir bytes get ég passa? Hér er breytilegt n með sem ég ætla að halda utan um hversu margir bæti eru í raun í biðminni eða sem notandinn hefur slegið. Ef þú hefur ekki séð þetta áður, þér getur tilgreint að breyta eins og int er óundirritaður, sem eins og nafnið gefur til kynna, þýðir að það er ekki neikvæð, og hvers vegna vildi Ég vil alltaf að standa tilgreina sem int er ekki bara int, en það er óundirritaður INT? Það er a non-neikvæð Int. Hvað þýðir [inaudible] meina? Áhorfendur: Það er lýsa upphæð minni sem hægt er að [inaudible]. DAVID Malan: Já. Þannig að ef ég segi óundirritaður, þetta er í raun gefa þér einn bita af auka minni og það virðist eins konar kjánalegt, en ef þig hafa einn hluti af viðbótar minni, sem þýðir að þú hefur tvisvar eins og margir gildi er hægt að tákna, vegna þess að það getur verið 0 eða 1. Svo við vanræksla, int má bil neikvæð 2 milljarðar alla leið allt að jákvæðu 2 milljarða króna. Þeir eru stór svið, en það er samt eins konar eyðslusamur ef þér þykir vænt aðeins um stærðir, sem bara innsæi ætti að vera non-neikvæðar eða jákvæð eða 0, og þá, hvers vegna þú ert að sóa 2 milljarða Möguleg gildi fyrir neikvæðum tölum ef þú ert aldrei að fara að nota þá? Svo með því að segja óundirritaður, nú int minn getur vera á milli 0 og um 4 milljarða. Svo er hér bara int C ástæðum við munum ekki fá inn bara núna eins og hvers vegna það er int í stað af bleikju, en hér er GIST það er að fara á, og sumir yðar gæti verið að nota, til dæmis, á fgetc virka jafnvel í pset fjórum eða síðar, við munum sjá það aftur í Heimadæmi fimm, fgetc er gott því eins og nafnið konar, eins konar arcanely kynna, það er aðgerð sem fær staf og svo, hvað er í grundvallaratriðum öðruvísi um hvað við erum að gera í GetString er að við erum ekki að nota scanf á sama hátt. Við erum bara að creeping meðfram skref-fyrir-skref yfir hvað notandinn hefur slegið inn, vegna þess að við getum alltaf úthluta einn bleikju, og svo við getum alltaf örugglega líta á eitt char í einu, og galdur byrjar að gerast hér. Ég ætla að fletta niður til um miðja þessa aðgerð bara til að kynna stuttlega þessa aðgerð. Líkt það er malloc virka, það er a realloc virka þar realloc gerir þér kleift að endurúthluta klumpur af minni og gera það stærri eða minni. Svo löng saga stutt og með bylgja af hendi minni í dag, veit að það GetString er að gera er það er tegund af dularfullur vaxandi eða minnkandi biðminni sem notandi gerðir í band hans eða hennar. Svo ef notandinn slær inn stutt band, þetta númer Aðeins úthlutar nóg minni til að passa band. Ef notandinn heldur slá eins og ég gerði það aftur og aftur og aftur, vel, ef biðminni er upphaflega þetta stór og the program áttar, að Bíddu, ég er út af plássi, það er að fara að tvöfalda stærð á stuðpúðanum og þá tvöfalda biðminni og kóða sem gerir tvöföldun, ef við lítum á það hér, það er bara þetta snjall einn-Ferja. Þú getur ekki hafa séð þessa setningafræði áður, en ef þú segir stjörnu jafngildir, þetta er það sama og segja getu sinnum 2. Svo það heldur bara tvöföldun getu biðminni og þá segja realloc að gefa sjálft að miklu meira minni. Nú, eins og til hliðar, það eru aðrar aðgerðir í hér að við munum ekki líta inn öllum smáatriðum annað en að sýna í GetInt, við notum GetString í GetInt. Við athugum að það er ekki null, sem muna, er sérstakt gildi að þýðir eitthvað fór úrskeiðis. Við erum út af minni. Betri athuga það. Og við aftur með varðstaki gildi. En ég ætla að fresta að athugasemdir sem til hvers vegna og þá erum við að nota þessa frænda Scanf kallaði sscanf og það kemur í ljós sem sscanf eða string scanf, gerir þér kleift að taka a líta á the lína sem notandinn hefur slegið í og ​​láta þig greina það í raun og það sem ég er að gera hér er ég að segja sscanf, greina hvað notandinn hefur slegið í og ​​ganga úr skugga% i, það er heiltala í það, og við munum ekki komast í dag nákvæmlega hvers vegna það er líka a% c hér, en að í hnotskurn gerir okkur að uppgötva ef notandinn hefur slegið í eitthvað svikinn eftir fjölda. Svo ástæðan að GetInt og GetString segja þér að reyna aftur, reyna aftur, reyna aftur er vegna alls að kóða við höfum skrifað, Það er góður af að horfa á inntak notandans í því að tryggja það er alveg tölustafir eða það er í raun fljótandi lið gildi eða þess háttar, eftir því hvaða gildi virka þú ert að nota. Whew. OK. Það var munnfylli en punkturinn hér er að ástæða við höfðum þessir þjálfun hjól á er vegna þess að á lægsta stigi, það er bara svo margt sem getur farið úrskeiðis sem við vildum að preemptively höndla þessir hlutir vissulega í Elstu vikur í bekknum, en nú með pset fjórum og pset fimm og utan munt þú sjá að það er enn við þú heldur að þú ert færari að leysa þær tegundir af vandamálum sjálfur. Einhverjar spurningar um GetString eða GetInt? Já? Áhorfendur: Hvers vegna vildi þú tvöfaldur getu biðminni frekar en bara auka það eftir nákvæma upphæð? DAVID Malan: Góð spurning. Hvers vegna ættum við tvöfalda afkastagetu á stuðpúðanum öfugt bara auka það af sumum föstu gildi? Það var hönnun ákvörðun. Við ákváðum bara að vegna þess að það hefur tilhneigingu til að vera a lítill dýr tími-vitur til að spyrja stýrikerfi fyrir minni, við gerðum ekki langar að enda hafa komist aðstæður fyrir stór strengi sem við vorum að biðja OS aftur og aftur og aftur og aftur í hlé fyrir minni. Þannig að við ákváðum bara nokkuð geðþótta en við vonum sæmilega, að, þú veist hvað, við skulum reyna að fá á undan okkur og bara halda tvöföldun það svo að við að draga úr magn af sinnum við verðum að hringja malloc eða realloc, en alls dómur hringja í fjarveru vita hvað notendur might vilja til að slá inn. Báða vegu gæti verið áreiðanlegur. Að öllum líkindum gott. Svo skulum taka a líta á a par annarra aukaverkana af minni, hlutir sem getur farið úrskeiðis og tól sem þú getur nota til að ná þessar tegundir af mistökum. Það kemur í ljós þið öll, jafnvel þó check50 hefur ekki sagt þér eins mikið, hafa verið að skrifa þrjótur númer frá viku eitt, jafnvel þótt allar check50 próf eru liðin, og jafnvel ef þú og TF þitt eru frábær fullviss að númerið þitt virkar eins og ætlað. Númerið þitt hefur verið gallaðir eða gölluð í því allir þér, með því að nota CS50 bókasafn, hafa verið að leka minni. Þú hefur verið að spyrja stýrikerfi fyrir minni í flestum forritum þú hefur skrifað, en þú hefur aldrei gefið það til baka. Þú hefur kallað GetString og GetInt og GetFloat, en með GetString, hefur þú aldrei kallað unGetString eða gefa String Back eða þess háttar, en við höfum séð sem GetString er tekið frá minni með því að malloc eða þetta virka realloc, sem er bara mjög svipuð í anda, og enn höfum við verið spyrja stýrikerfi fyrir minni og minni aftur og aftur en aldrei gefa það aftur. Nú, eins og innskot, kemur í ljós að þegar forrit hættir, allt minni er sjálfkrafa leystur. Svo það er ekki verið gríðarstór samningur. Það er ekki að fara að brjóta IDE eða hægur hlutur dúnn, En þegar forrit gera almennt leka minni og þeir eru að keyra í langan tíma. Ef þú hefur einhvern tíma séð heimskur Little fjara boltinn í Mac OS eða stundaglas á Windows þar sem það er góður af hægja niður eða hugsa eða hugsa eða bara virkilega byrjar að hægja á skrið, það mjög hugsanlega gæti verið afleiðing af minni leka. Forritarar sem skrifaði hugbúnaður sem þú ert að nota spyrja stýrikerfi fyrir minni á nokkurra mínútna fresti, á klukkutíma fresti. En ef þú ert að keyra á hugbúnaður, jafnvel ef það er haldið í lágmarki í tölvunni klukkustundum eða dögum saman, þú gætir verið að spyrja fyrir fleiri og fleiri minni og aldrei að nota það og svo númerið þitt gæti verið, eða forrit gætu verið leka minni, og ef þú byrjar að leka minni, það er minna minni að öðrum verkefnum, og áhrifin eru að hægja allt niður. Nú, þetta er við langt einn af flestum grimmilegur forrit þú verður að hafa tækifæri að keyra í CS50 því leyti sem framleiðsla þess er enn meira dulspekilegur en Clang eða gera eða einhverju stjórn lína forrit sem við höfum keyrt áður en sem betur fer, embed in í framleiðslu sinni er einhver frábær gagnlegar ábendingar sem verður að vera gagnlegt annaðhvort fyrir pset fjórum eða örugglega pset fimm. Svo er Valgrind tól sem hægt er að nota til að líta fyrir minni leka í kerfinu þínu. Það er tiltölulega einfalt að keyra. Þú keyrir Valgrind og þá, jafnvel þó það er lítið fjölorður, þjóta þjóta leka athuga jafngildir fullu, og þá punktur rista og nafn program. Svo Valgrind mun þá keyra forritið þitt og á mjög lok program gangi áður en það hættir og gefur þér annað hvetja, það er að fara að greina þinn program á meðan það er verið að keyra og segja að þú hafir þú leka allir minni og enn betra, fórstu snerta minni sem ekki tilheyra yður? Það getur ekki skilið allt, en það er nokkuð góður á smitandi flesta hluti. Svo er hér dæmi um hafa keyrt minn þetta forrit, hafa keyrt Valgrind, á forrit sem heitir minni, og ég ætla að varpa ljósi á línur sem eru lokum áhugavert fyrir okkur. Svo er jafnvel meira truflun það sem ég hef eytt úr glæru. En við skulum bara sjá hvað þetta program er fær um að segja okkur. Það er fær um að segja okkur það eins ógilda skrifa stærð 4. Með öðrum orðum, ef þú snertir minni, sérstaklega 4 bytes af minni að þú ættir ekki að hafa, Valgrind get sagt þér það. Ógildur skrifa af stærð 4. Þú snert fjögur bæti að þú ættir ekki að hafa. Hvar fékkstu það? Þetta er fegurð. Minni punktur c lína 21 er þar sem þú ruglaður upp og það er hvers vegna það er gagnlegt. Líkt gdb, getur það hjálpað benda þér á the raunverulegur villa. Nú, þetta er aðeins meira fjölorður, ef ekki ruglingslegt. 40 bæti í 1 blokkir eru örugglega glataður í tap skrá 1 af 1. Hvað þýðir það? Jæja, það þýðir bara að þú baðst um 40 bytes og þú aldrei fékk hana. Þú kallaðir malloc eða þú kallaðir GetString og stýrikerfi gaf þér 40 bytes, en þú aldrei leystur eða út að minni, og til að vera sanngjarn, höfum við aldrei sýna þú hvernig á að gefa aftur minni. Skrúfjárn út það er frábær einföld aðgerð kallað frjáls. Tekur einn rök, málið þú vilt að losa eða gefa til baka, en 40 bytes, virðist, í þessari áætlun hafa rofnað á línu 20 minni punktur c. Svo skulum sjá þetta forrit. Það er frábær gagnslaus. Það sýnir aðeins þetta tiltekna villa. Svo skulum taka a líta. Hér er aðal og helstu, fyrirvarar, símtöl fall sem heitir f og þá skilar. Svo ekki allt sem áhugavert. Hvað þýðir F gera? Tilkynning ég ekki nenna með frumgerð. Mig langaði til að halda kóðann haldið í lágmarki. Svo ég setti f ofan main og það er fínt, vissulega, fyrir stuttu forrit eins og þetta. Svo, f ekki aftur neitt og gerir ekki taka neitt, en það er að gera þetta. Það segir, eins í Binky dæmis bendi heitir x sem er að fara að geyma veffang int. Svo er að vinstri-hönd hlið. Á ensku, hvað er Hægra megin að gera? Einhver? Hvað er þetta að gera fyrir okkur? Já? Áhorfendur: [inaudible] sinnum á stærð við int sem er 10 sinnum að [inaudible] DAVID Malan: Gott og láta mig draga. Svo úthluta nóg pláss fyrir 10 heiltölur eða 10, hvað er á stærð við int, það er fjórum bæti þannig 10 sinnum 4 er 40, þannig að hægra megin sem ég hef auðkenndum er að gefa mér 40 bæti og geyma veffang fyrstu bæti í x. Og nú loks, og hér er þar þetta forrit er þrjótur, það er athugavert við línu 21 byggist á þeirri rökfræði? Hvað er athugavert við línu 21? Já? Áhorfendur: Þú getur ekki Vísitala inn x [inaudible]. DAVID Malan: Já. Ég ætti ekki vísitölu í x eins og þessi. Svo setningafræðilega, það er allt í lagi. Hvað er gott er, mikið eins og þú getur meðhöndla nafn fylki eins og það sé bendi, álíka hægt að meðhöndla bendi eins og það sé fylki, og svo ég get setningafræðilega , x krappi, segja x krappi eitthvað sem ég en 10 er erfið. Hvers vegna? Áhorfendur: Vegna þess að það er ekki inni. DAVID Malan: Það er ekki inni að klumpur af minni. Hvað er stærsta gildi sem ég ætti að setja í þá hornklofum? 9, 0 til 9. Vegna núll flokkun. Svo 0 til 9 væri fínt. Bracket 10 er ekki gott og en muna þó, í hvert skipti Ég virðist reyna að gera CS50 IDE hrun með því að slá í svikinn gildi, það er ekki alltaf að vinna, og örugglega, þú oft heppinn bara vegna þess að stýrikerfi er ekki eftir því að þú alltaf svo lítið fara nokkrum klumpur af minni, því þú gist í tæknilega hluti þinn, en meira um það í stýrikerfi bekknum, og svo eitthvað eins og þetta gæti mjög auðveldlega farið undetected. Program er aldrei að fara að hrun stöðugt en kannski einu sinni í stutta stund. Og svo skulum reyna Valgrind á þessu, og hér er þar sem við munum fá óvart af framleiðslu augnablik. Svo gera minni Valgrind leka stöðva jafngildir fullri punktur rista minni. Og hér er ástæðan ég lofa þetta myndi gagntaka. Hér er það sem Valgrind, hér er það forritari, nokkrum árum ago- ákvað að það væri góð hugmynd fyrir að framleiðsla að líta út. Svo skulum vit á þessu. Svo alla leið á vinstri hönd hlið fyrir neitun góður ástæða er ferlið ID áætlunarinnar hlaupum bara, einstaka auðkenni í áætluninni sem við hljóp bara. Við eytt að frá renna, en það er sumir gagnlegar upplýsingar hér. Við skulum fletta upp á mjög toppur. Hér er þar sem við byrjuðum. Svo það er ekki allt sem mikið framleiðsla. Hér er það ógilt skrifa af stærð 4 á línu 21. Jæja, hvað var lína 21? Line 21 var nákvæmlega þetta og það er vit í að ég er í gilt skrifa 4 bæti því ég er reyna að setja þetta heiltala, sem gæti verið hvað sem er, það gerist bara að vera núll, en ég er að reyna að setja það á stað sem ekki tilheyra mér. Þar að auki, niður hér, 40 bæti í einu blokkir eru örugglega glataður í skrá 1. Það er vegna þess að þegar ég kalla malloc hér, aldrei ég reyndar að losa minni. Og hvernig getum við lagað þetta? Leyfðu mér að fara á undan og vera svolítið öruggari og gera 9 þar og láta mig hér ókeypis x. Þetta er nýtt hlutverk í dag. Ef ég endursýning nú gera minni punktur rista, skulum hlaupa Valgrind á það aftur, hámarka gluggann minn og ýta á Enter. Nú, það er gott. Þeir grafa fagnaðarerindið í öllum þessum framleiðsla. Allt hrúga blokkir voru frjáls. Við munum koma aftur til hvað hrúga er, en engar leka eru mögulegar. Svo er þetta bara annað tól fyrir verkfærasett þinn sem þú getur byrjað að finna nú villur eins og þessi. En við skulum sjá hvað meira getur farið úrskeiðis hér. Skulum umskipti nú að reyndar að leysa vandamál. Sem innskot, ef þetta mun létta a smá rugl eða spennu, þetta er nú fyndið. Já. Það er nokkuð gott. Vegna ábendingum heimilisföng og netföng eru yfirleitt með því að venju skrifað með sextánskur. Ha, ha, þetta er fyndið núna. Einhvern veginn, þannig að við skulum nú reyndar leysa vandamál. Þetta hefur verið frábær, frábær lágmark-láréttur flötur svona langt, og við getum í raun gert gagnlegt hluti með þessum lágu stigi upplýsingar. Þannig að við kynntum nokkrar vikur síðan hugmyndin um fylki. An array var gott því það er erfitt að hreinsa upp númerið okkar vegna þess að ef við vildum skrifa program með mörgum nemendum eða fleiri nöfn og hús og dorms og framhaldsskólar og allt það, við gætum geymt allt meira hreinlegur inni fylki. En leggja einn ókostur af fjölda svona langt. Jafnvel ef þú hefur ekki orðið það sjálfur í forriti, bara dragast, hvað er slæmt um fjölda, kannski? Ég heyri sumir muldur. Áhorfendur: Það er erfitt Til að breyta stærð. DAVID Malan: Það er erfitt Til að breyta stærð. Þú getur ekki breytt stærð af fjölda, í raun, í sjálfu í C. Hægt er að úthluta öðru fylki, færa allt frá gamla í nýju og nú hafa smá auka pláss, en það er ekki eins og a tungumál eins og Java eða Python eða allir tala af öðrum tungumál sem sum ykkar gætir verið kunnugt hvar þú getur bara haldið að bæta hlutum Auglýsingin nauseam til loka fylki. Þegar þú ert með fjölbreytta stærð 6, sem er stærð hennar, og svo mikið eins og the hugmynd fyrr having a buffer með ákveðinni stærð, þú þarft að giska út af the hlið hvaða stærð þú vilt það til að vera? Ef þú giska of stór, þú ert að sóa pláss. Ef þú giska of lítill, þú er ekki hægt að geyma þessi gögn, að minnsta kosti án mikið meiri vinnu. Svo í dag, þökk sé ábendingum, við getum byrja sauma saman eiga siðvenja okkar gögn uppbygging, og í Staðreyndin, hér er eitthvað sem lítur svolítið meira dulinn við fyrstu sýn, en þetta er það sem við munum kalla tengdur lista, og nafn einskonar þess samantekt það. Það er listi yfir númer, eða í þetta mál, lista af tölum, en það gæti verið listi yfir neinu, en það er tengt saman með því að örvum, og bara taka giska með hvað tækni við erum að fara að vera fær um að sauma saman, tegund af eins popp með þráð, tengdur listi ferhyrninga hér? Tölur þess? Hvað er undirliggjandi tungumál eiginleiki? Áhorfendur: A bendi. DAVID Malan: A bendi. Svo að hver af þessum örvum hér táknar bendi eða bara netfang. Svo í öðrum orðum, ef ég vil til að geyma lista yfir númer, Ég get ekki bara geyma það ef ég vil getu til að vaxa og skreppa gögn uppbygging mín í fylki. Þannig að ég þarf að hafa smá meira fágun, en eftir því að þetta mynd konar bendir að ef þú átt bara smá þræði tengja allt saman, sennilega er ekki það erfitt að gera pláss á milli tveggja af þeim rétthyrninga eða tveir af þeim hnúta, eins og við munum byrja kalla þá, setja í nýjan hnút, og þá með nokkrum nýjum þræði, bara skurður þrjú hnúta saman, sá fyrsti, það síðasta, og sá að þú sett bara inn í miðju. Og örugglega tengda listanum, ólíkt fylki, er síbreytilegt. Getur það að vaxa og það getur skreppa og þú þarft ekki að vita eða sjá fyrirfram hvernig mikið af gögnum sem þú ert að fara að vera að geyma, en það kemur í ljós að við verðum að vera svolítið varkár um hvernig á að framkvæma þetta. Svo fyrst skulum íhuga hvernig við innleiða einn af þessum litlu rétthyrninga. Það er auðvelt að hrinda í framkvæmd int. Þú segir bara int n og síðan þú færð 4 bæti fyrir int, en hvernig fæ ég int, kalla það n, og þá bendi, við skulum kalla það næsta. Við gætum hringt þessir það eitthvað sem við viljum en ég þarf sérsniðin gögn uppbygging. Já? Áhorfendur: Merkið [inaudible]. DAVID Malan: Svo merkið við munum nota til að fá veffang hnút hugsanlega. En við þurfum annan eiginleiki C, til þess að gefa mér getu til að búa Þessi siður rétthyrningur, þessi siður breyta ef þú vilt, í minni. Áhorfendur: A struct. DAVID Malan: A struct. Muna frá síðustu viku, kynnti við struct, þetta tiltölulega einfalt leitarorð sem leyfir okkur að gera hlutina eins og þetta. C er ekki kominn með gögn uppbygging kallast nemanda. Það kemur með int og fljóta og bleikja og svo, en það þýðir ekki að koma með nemanda, en við getum búið til nemandi gögn tegund, nemandi uppbyggingu, með þessa setningafræði hér. Og þú munt sjá þetta aftur og aftur. Svo ekki hafa áhyggjur óður í minnið leitarorð, en leitarorðið sem er mikilvægt er bara staðreynd að við sögðum struct og þá erum við kallað það nemandi og inni námsmanns var nafn og hús eða dorm eða þess háttar. Og svo nú í dag, við skulum leggja þetta. Ég hef bætt við nokkrum orðum, en ef ég vil að framkvæma þetta rétthyrningur sem er fékk bæði int og a músina, þú veist hvað, ég er að fara að lýsa yfir strúktúr heitir hnút. Ég er líka, inni af því, að fara að segja að hnút, þetta rétthyrningur, hefur int og við munum kalla það n og það hefur næstu músina. Og þetta er svolítið fjölorður, en ef þér finnst um það, örvarnar sem voru í myndinni í smá stund síðan eru um hvaða gögn tegund? Þar sem hver þeirra örvum er að benda á hvaða tegund af gögn uppbygging? Það er ekki að benda bara til int í sjálfu sér. Það er að benda á að í heild rétthyrnd hlutur og að rétthyrnd hlutur, við sögðum, er kallað hnút. Og svo þurfum við að endurkvæmt skilgreina þetta eins að hnút, eigum við að segja, mun innihalda int kallast n og bendi heitir næsta og tegund af gögn uppbygging sem að bendillinn stig er greinilega að fara að vera struct hnút. Svo er þetta óþægilega fjölorður og bara til að vera smámunasamur, ástæðan fyrir því að við getum ekki bara segja þetta, sem hreinskilnislega lítur mikið meira læsileg, er vegna þess að muna að C lesið það toppur til botn, vinstri til hægri. Það er ekki fyrr en við fáum semíkommu að leitarorðið hnút staðar í raun. Svo ef við viljum hafa þessa tegund af cyclical tilvísun innan við gögn uppbyggingu, verðum við að gera þetta, þar sem við segjum strúktúr hnút efst, sem gefur okkur lengri leið að lýsa þessu hlutur, þá inni við segjum strúktúr hnút, og þá á mjög síðustu línu við segjum, allt í lagi, C, við the vegur, bara hringja þetta allt fjandinn hlutur hnút og hætta nota leitarorð strúktúr öllu leyti. Svo er þetta bara svona a nokkur dæmi um setningarleg bragð að lokum leyfir okkur að búa eitthvað sem lítur út nákvæmlega eins og þetta. Þannig að ef við gerum ráð fyrir að við getum framkvæma þetta í C, Hvernig eigum við að raun byrja að fara yfir þetta? Jæja, í raun, allt sem við þurfum að gera er að iterate frá vinstri til hægri og bara konar setja hnúta eða eyða hnúður eða leita að hlutum þar sem við viljum, en til að gera þetta, við skulum fara á undan og gera það svolítið meira alvöru vegna þess að þetta hefur verið frábær lágmark-láréttur flötur svona langt. Myndi einhver bókstaflega eins og að vera fyrstur? OK. Komdu upp. Hvað heitir þú? DAVID: David. DAVID Malan: David. Gaman að hitta þig. Ég líka. Allt í lagi. Og við þurfum númer 9. Ekki eins góð og fyrsta, kannski. OK, númer 9. A númer 17, takk. Leyfðu mér að fara aftur aðeins lengra. Númer 22, takk, og hvernig væri lengra aftur ef ég get séð hvaða hendur með öllum ljós eða engin. Einhver er verið bauðst þarna. Viltu koma upp? Framhandlegg er valdi að fara upp. OK, 17. 22. 26 er að koma niður. Myndi einhver annar eins og að forcefully-- Komdu upp. Raunveruleg sjálfboðaliði. Svo mjög fljótt, ef þú krakkar gætu raða sjálfir líkar bara hnútar á skjánum. Þakka þér fyrir. Og þú munt vera 26. Allt í lagi og fljótur kynning. Þannig að ég er David og þú ert líka? DAVID: David. DAVID Malan: Og þú ert? Jake: Jake. Sue: Sue. ALEX: Alex. RAPHAEL: Raphael. TAYLOR: Taylor. DAVID Malan: Taylor. Excellent. Svo þetta eru sjálfboðaliðar okkar fyrir í dag og fara á undan og skipta smá þannig, og bara fara á undan og halda halda tölur eins og þú ert eða þinn Fyrsta merki og nota vinstri höndina, fara á undan og bara framkvæma þessar örvar, bara þannig að vinstri hönd þín er bókstaflega benda á hvað þú ættir að benda á, og gefa þér nokkrar herbergið svo að getum við sjónrænt séð handleggina raun benda, og þú getur bara benda konar á jörðu er í lagi. Svo hér höfum við tengda lista yfir einn, tveir, þrír, fjórir, fimm hnútar í upphafi, og taka við höfum þetta sérstaka bendillinn í upphafi sem er lykill vegna þess að við verðum að halda utan af öllu lengd listanum einhvern veginn. Þessir krakkar, jafnvel þótt þeir séu vinstri til hægri, aftur til baka í minni, þeir geta í raun verið hvar í minni tölvunnar. Svo þessir krakkar gætu verið standa hvar sem er á sviðinu og það er allt í lagi, svo lengi sem þeir eru í raun og veru að benda á annan, en að halda hreint og einfalt, við munum bara draga þá vinstri til hægri eins og þetta, en það gæti verið miklu eyður á milli þessara hnúður. Nú, ef ég vil í raun og veru að setja nokkrar nýtt gildi, við skulum fara á undan og gera þetta. Við höfum tækifæri núna að velja aðra hnút. Segja skulum byrja burt með mallocing 55. Myndi einhver á móti því að malloc? OK, komdu upp. Hvað heitir þú? RAINBOW: Rainbow. DAVID Malan: Rainbow? Allt í lagi. Malloc Rainbow. Komdu upp. Svo nú verðum við að spyrja okkur algorithmically þar sem við getum sett 55. Svo okkur öll vita, augljóslega, þar sem hún líklega tilheyrir ef við erum að reyna að halda þessu flokkaður og ef þú krakkar gætu tekið einn stíga til baka þannig að við falla ekki burt stigi, sem myndi vera frábært. Svo í raun, Rainbow, byrja hérna með mér, vegna þess að við sem í tölvunni núna getur aðeins að sjá eina breytu í einu. Þannig að ef þetta er fyrsta hnút. Takið hann er ekki hnút, hann er bara músina, og það er hvers vegna hann er vakin á að vera aðeins á stærð við músina, ekki einn af þeim fullur rétthyrninga. Þannig að við erum að fara að athuga hvort á endurtekning er 55 minna en 9? Nei Er 55 minna en 17? Nei Minna en 22? Minna en 26? Minna en 34? Og svo nú, augljóslega Rainbow tilheyrir í lokin. Svo til að vera skýr, og það var nafn þitt, Taylor? TAYLOR: Taylor. DAVID Malan: Svo meðal Taylor vinstri hönd og hendur Rainbow er hér, Hvers hönd þarf að benda á hvað í Til að setja inn 55 í þennan lista? Hvað þurfum við að gera? Já? Áhorfendur: hönd Taylors þarf að benda vinstri. DAVID Malan: Einmitt. Svo setja hnút í lok listanum er frekar einfalt því Taylor bara Benda verður, í stað þess að í jörðina eða við munum kalla það null, null er tegund af fjarveru á músina eða sérstakt núll músina, þú ert að fara að benda með vinstri hönd á Rainbow og þá Rainbow, þar ætti vinstri hönd benda líklega? Niður. Það er ekki gott ef hönd hennar er tegund að benda á hér eða svoleiðis eitthvað sem leið. Sem myndi teljast sorp gildi, en ef hún bendir til sumir þekkt gildi, munum við kalla það núll eða null, það er allt í lagi vegna þess að við höfum tíma í þetta og við vitum að listi er nú lokið. Svo er það annað tiltölulega einfalt mál? Gætum við malloc 5? Komdu upp. Hvað heitir þú? TIFFANY: Tiffany. DAVID Malan: Fyrirgefðu? TIFFANY: Tiffany. DAVID Malan: Tiffany. Allt í lagi. Tiffany hefur verið malloced með gildi 5. Komdu upp. This einn er tiltölulega auðvelt líka, en við skulum íhuga röð aðgerða nú. Það var frekar auðvelt við Taylor í lokin. Fjöldi 5 er að sjálfsögðu minna en 9, og svo höfum við Davíð, höfum við Tiffany, og hvað var nafnið þitt? Jake: Jake. DAVID Malan: Jake. Tiffany, Jake, og David. Hvers hönd skal uppfæra fyrst? Hvað viltu gera hér? There er a par mögulegar leiðir, en það er einnig einn eða fleiri röng leiðir. Áhorfendur: Byrja með lengst til vinstri. DAVID Malan: Byrja með lengst til vinstri. Hver er lengst til vinstri hér þá? Áhorfendur: First. DAVID Malan: OK. Svo byrja með fyrst og hvar þú langar að uppfæra hendur Davíðs til að vera? Áhorfendur: Undir 5. DAVID Malan: OK. Svo David, benda á fimm eða Tiffany hér og nú? Áhorfendur: Tiffany bendir til 9? DAVID Malan: Perfect, nema Binky er yfirmaður bara svona datt af, ekki satt? Vegna þess að það er rangt með þessi mynd bókstaflega? Áhorfendur: Ekkert bendir. DAVID Malan: Ekkert er benda til Jake núna. Við höfum bókstaflega munaðarlaus 9 og 17, og við höfum bókstaflega leki allan minni, vegna þess að með uppfæra hönd Davíðs fyrst, það er fínn svo miklu leyti sem það er rétt benda á Holtinu núna, en ef enginn hafði framsýni til að benda á Jake, þá höfum við misst heild á þeim lista. Svo skulum losa. Svo það var gott að ferð yfir en við skulum leiðrétta núna. Hvað ættum við að gera fyrst í stað? Já? Áhorfendur: Tiffany að benda á 9? DAVID Malan: Ég get ekki fá að nærri þér. Hver ætti að benda á 9? Áhorfendur: Tiffany. DAVID Malan: Allt í lagi. Svo Tiffany ætti fyrst benda á 9. Svo Tiffany ætti að taka á eins verðmæti Davíð, sem virðist óþarfi um stund, en það er allt í lagi því nú, annað skref, getum við að uppfæra hönd Davíðs að benda á Holtinu, og þá ef Við bara hreinum það upp eins og þetta er góður af vor-eins, nú það er rétt innsetning. Svo frábært. Svo nú erum við næstum þar. Við skulum setja eina final gildi eins verðmæti 20. Ef við gætum malloc lokatilraun sjálfboðaliða? Komdu upp. Svo er þetta aðeins meira erfiður. En í raun, kóðinn við erum skrifa, að vísu munnlega, er bara eins og að hafa fullt af ef aðstæður nú, ekki satt? Við höfðum ástand stöðva ef það tilheyrir í lok, kannski í upphafi. Við þurfum einhvers konar lykkju til finna blettur í miðjunni. Svo skulum gera það með hvað er nafnið þitt? ERIC: Eric. DAVID Malan: Eric? Eric. Gaman að hitta þig. Þannig að við höfum 20. Minna en fimm? Nei Minna en níu? Nei Minna en 17? Nei OK. Hann tilheyrir hér og nöfn eru aftur? Sue: Sue. DAVID Malan: Sue. ALEX: Alex. DAVID Malan: Sue, Alex, og? ERIC: Eric. DAVID Malan: Eric. Hvers hendur þarf til að fá uppfærða fyrst? Áhorfendur: Eric. OK. Svo Eric er að benda á hvar? Á 22.. Good. Og nú er það næst? Sue getur þá benda á Eric og nú, ef ykkur bara gera nokkurt svigrúm, sem er fínn sjónrænt, nú höfum við gert innsetningu. Svo skulum nú íhuga spurningu en þakka þér svo mikið fyrir sjálfboðaliða okkar. Mjög vel gert. Þú getur haldið þeim, ef þú vilt. Og við höfum yndislega skilnaði gjöf ef þú vilt hvert eins og til að taka streitu boltanum. Leyfðu mér að fara bara þetta niður. Svo er það takeaway þetta? Þetta virðist vera ótrúlega að því marki sem við höfum nú kynnt aðra möguleika en array sem er ekki svo bundinn til fjölda einhverjum fasta stærð. Þeir geta vaxið mjög virk. En mikið eins og við höfum séð í vikum framhjá, fáum við aldrei neitt fyrir frjáls, eins vafalaust er það málamiðlun hér. Svo með kosti af tengdur lista, er þetta kraft? Þessi hæfileiki til að vaxa og hreinskilnislega, við hefðum getað gert Eyða og við gætum skreppa eftir þörfum. Hvaða verð erum við að borga? Tvisvar eins mikið pláss, fyrst af öllu. Ef þú horfir á myndina, ekki lengur ég geyma lista yfir heiltölur. Ég er að geyma lista yfir heiltölur auk ábendingum. Þannig að ég ætla að tvöfalda pláss. Nú, kannski er það ekki svo stór samningur 4 bytes, 8 bytes, en það gæti vissulega bæta upp fyrir stóra gagnagrunna. Hvað er annað hæðir? Já? Áhorfendur: Við verðum að fara yfir þá einn-fyrir-einn. DAVID Malan: Já. Við verðum að fara yfir þá einn-fyrir-einn. Þú veist hvað, við gáfum upp þetta frábær þægilegt eiginleiki hornklofi merki, meira rétt þekktur sem Random Access, þar sem við getum bara hoppa til manns frumefni en nú ef ég hefði enn sjálfboðaliðar mínum hér, ef ég vildi finna númer 22, ég get ekki bara hoppa til krappi eitthvað eitthvað. Ég verð að líta yfir listann mikið eins og að leita dæmin línulega, að finna númerið 22. Þannig að við virðast hafa greitt verð þar. En við getum samt leysa önnur vandamál. Í raun, láta mig kynna bara nokkra myndefni. Svo ef þú hefur verið niður Mather er matsal nýlega, þú munt muna að þeirra stafla af stæði eins og þetta, við láni þetta frá Annenberg áður bekknum. Þannig að þetta stafla af stæði, þó, er fulltrúi í raun af tölvunarfræði gögn uppbygging. Það er gögn uppbygging í tölvunarfræði þekktur sem stafla sem mjög fallega lánar sig til nákvæmlega þetta sjón. Þannig að ef öllum þessum stæði er ekki bakki en eins mörgum og ég vildi að geyma tölur, ég gæti sett einn niður hér, og ég gæti sett annað hérna, og halda áfram stöflun tölur hvor ofan á öðrum, og því sem er hugsanlega gagnlegt um þetta er að það er óbeint af þessum gögnum uppbyggingu? Sem tala get ég draga út Fyrsta hentugast? The nýlega einn setja á það. Svo er þetta það sem við myndum kalla í tölvunarfræði a LIFO gögn uppbygging. Endast í, fyrst út. Og við munum sjá áður en langt hvers vegna sem gæti verið gagnlegt en nú, bara íhuga eign. Og það er góður af heimskur ef þú heldur um hvernig matsalur gerir það. Í hvert skipti sem þeir hreinsa stæði og setja ferskasta sjálfur ofan, þú gætir hafa a áður hreint en á endanum mjög óhrein og rykugum bakki á mjög neðst ef þú aldrei fá til the botn af því stafla, vegna þess að þú bara halda að setja nýja og hreinn sjálfur ofan á það. Það sama gæti gerst í matvörubúð líka. Ef þú ert með skjáinn mál af mjólk og í hvert skipti CVS eða sá fær meiri mjólk, þú shove bara mjólkur þú ert nú þegar að baki og þú setur nýjar upp að framan, þú ert að fara að hafa sumir laglegur viðbjóðslegur mjólk í lok gögn uppbygging, vegna þess að það er alltaf neðst eða equivalently er það alltaf á bak. En það er önnur leið til að hugsa um undirbúa gögn og til dæmis, þetta. Ef þú ert einn af þeim sem finnst til að stilla upp fyrir utan Apple verslanir þegar ný vara kemur út, þú ert líklega ekki með stafla gögn uppbygging vegna þess að þú myndi einangra allir aðrir sem er að undirbúa að kaupa nokkrar nýjar leikfang. Frekar, þú ert líklega að nota hvers konar gögn uppbygging eða hvers konar kerfi í hinum raunverulega heimi? Vonandi er það lína, eða meira rétt eða meira British-eins, biðröð. Og það kemur í ljós biðröð er einnig gögn uppbygging í tölvunarfræði, en biðröð hefur mjög öðruvísi eign. Það er ekki LIFO. Endast í, fyrst út. Guð forði. Það er í staðinn FIFO. Fyrst inn fyrst út. Og það er gott fyrir sanngirni sakir vissulega þegar þú ert að undirbúa upp frábær snemma í morgun. Ef þú færð það fyrst, þú vilt fá út fyrst eins og heilbrigður. Og svo öll þessi gögn mannvirki, biðraðir og stafla og bunches annarra, kemur í ljós þér getur hugsað þetta eins og bara fylki. Þetta er fylki, kannski föst stærð 4, en það væri vera góður af gaman ef við gætum bara stafli stæði nánast óendanlega mikill ef við hafa að margir stæði eða númer. Svo kannski að við viljum nota tengda lista hér, en málamiðlun er að fara að vera hugsanlega að við þurfum meira minni, tekur smá meiri tíma en við takmarka ekki hæð stafla, líkt Mather er skjánum að ræða getur takmarkað stærð af stafla, og svo þetta eru hönnun ákvarðanir eða möguleikar í boði fyrir okkur á endanum. Svo með þessi gögn mannvirki, við höfum byrjað sjá nýjar efri mörk hugsanlega á því sem áður var frábær fljótur og þar sem við munum fara burt í dag og þar við munum vonast til að fá að er á miðvikudag, við munum byrja að líta á gögn uppbygging sem leyfir okkur að leita gegnum gögn í log lokatíma aftur. Og við sáum að muna, í viku núll og einn með tvöfaldur leit eða skipta og sigra. Það er að koma til baka og enn betra, Gral fyrir þetta miðvikudag verður að koma upp með gagnagrind sem keyrir sannarlega eða fræðilega föstu tíma, þar það skiptir ekki máli hversu margir milljónir eða milljarða hlutur við höfum í gögn uppbygging, það mun taka okkur stöðugt tíma, kannski eitt skref eða tvö skref eða 10 skref, en stöðug tölur skrefum til að leita í gegnum þessi gögn uppbygging. Að örugglega verður Gral en meira um það á miðvikudag. Sjáumst þá. [TÓNLIST spila]