[Muzika] [VIDEO rishikim] -Ai Po gënjen. -Rreth Çfarë? -Une nuk e di. -Pra, Çfarë njohim ne? -Kjo Në 9:15, Ray Santoya ishte në ATM. -Yeah. Pra, pyetja është, çfarë ishte ai bën në 9:16? -Shooting Milimetër 9 në diçka. Ndoshta ai e pa snajper. -OR Ishte duke punuar me të. -Wait. Kthehu mbrapa një. -Cfare shikon? -Të Sjellë fytyrën e tij në ekran të plotë. Syzet -His. -Nuk Është një reflektim. -Kjo Është ekipi Nuevitas baseball. Kjo është logo e tyre. -Dhe Ai është duke folur për kushdo që ka veshur atë xhaketë. [END rishikim] DAVID Malan: Të gjithë të drejtë. Kjo është CS50 dhe kjo është pak më e [e padëgjueshme] me të cilën ju jeni dabbling me problemin e ngritur katër. Sot ne fillojmë të shikojmë pak më shumë thellësisht në këto gjëra quajtur pointers, e cila edhe pse është e një temë mjaft misterioze, rezulton se ajo do të jetë mjeti me të cilin ne mund të fillojë ndërtimin dhe montimin programe shumë më të sofistikuara. Por ne e bëmë atë të mërkurën e kaluar me anë të një claymation parë. Pra kjo, kujtojnë, është Binky dhe kemi përdorur atë për të marrë një sy në një program që nuk ka të vërtetë të bëjë asgjë interesante, por ajo e bëri të zbulojë disa probleme. Pra, për të filluar sot, pse nuk ecim shpejt nëpër disa nga këto hapa, të përpiqet të gjej në aspektin njerëzor e saktësisht se çfarë po ndodh këtu dhe pse kjo është e keqe, dhe pastaj të kalojnë në dhe në fakt të fillojë ndërtimin e diçka me këtë teknikë? Pra, këto ishin të parët dy linja në këtë program dhe në kushtet e laik, çfarë janë duke bërë këto dy linja? Dikush që është në mënyrë të arsyeshme të rehatshme me atë që deklaroi në ekran? Çfarë janë këto dy rreshta duke bërë? Kjo nuk është e gjitha që ndryshme nga njëra jave, por ka disa simboli i ri i veçantë. Po? Atje. Audienca: Deklarimi pointers? DAVID Malan: Thuaj përsëri? Audienca: Deklarimi pointers? DAVID Malan: pointers Deklarimi dhe le të përsosin atë një pak më shumë. Audienca: [padëgjueshme] Adresa x dhe pastaj y. DAVID Malan: Dhe pastaj adresuar. Pra, në mënyrë të veçantë ajo që ne jemi duke bërë po ne jemi deklaruar dy variabla. Këto variabla, megjithatë, janë duke shkuar të jetë i int yllit tipit, e cila më konkretisht do të thotë ata janë duke shkuar për të ruajtur adresa e një int, përkatësisht, x dhe y. Tani a ka ndonjë vlera? A ka ndonjë adresat aktuale në këto dy variabla në këtë moment në kohë? Jo. Është vetëm e ashtuquajtura vlerat e plehrave. Nëse ju nuk mund të vërtetë të caktojë një ndryshueshme, çdo gjë që ishte në RAM më parë do të mbush me zero dhe ato të dy prej këtyre variablave. Por ne ende nuk e dimë atë që ata janë dhe kjo është do të jetë kyç se pse Binky humbur kokën e tij javën e kaluar. Pra, ky ishte claymation mishërimi i kësaj ku ju keni vetëm dy variablave, pak copa rrethore prej argjile, që mund të ruajë variabla, por si shigjetat përfundoi lart sugjerojnë, ata nuk janë në fakt duke për të njohur kudo në vetvete. Pra, atëherë kemi pasur këtë linjë, dhe kjo ishte e re javën e kaluar, malloc për kujtesën ndarja, e cila është vetëm një mënyrë e sofistikuar e thënë të sistemit operativ, Linux ose Mac OS ose Windows, hej, jepni disa kujtesës, dhe të gjithë ju duhet të tregoni sistemi operativ është ajo që kur kërkon atë për kujtesën. Kjo nuk do të kujdesen se çfarë ju jeni do të bëjë me të, por ju keni nevojë për të të treguar operative Sistemi atë me anë të malloc. Po? Audienca: Sa? DAVID Malan: Sa? Sa në bytes, dhe kështu, kjo, përsëri, një shembull i ndërtuar, është vetëm duke thënë: më jep madhësinë e një int. Tani, madhësia e një int është katër bytes ose 32 bit. Pra, kjo është vetëm një mënyrë për të duke thënë, hej, sistemit operativ, jepni katër byte memorje që unë mund të përdorni në dispozicion tim, dhe konkretisht, çfarë Kthimi malloc me respekt në atë copë të katër bytes? Audienca: Adresa? DAVID Malan: Adresa. Adresa e asaj copë e katër bytes. Pikërisht. Dhe kështu kjo është ajo që është ruajtur në fund të fundit në x dhe kjo është arsyeja pse ne nuk të vërtetë kujdes se çfarë numri i që adresa është, nëse kjo është OX1 ose OX2 apo disa adresa fshehtë heksadecimal. Ne vetëm kujdesemi në pikturë se kjo variabël x është tani duke treguar në atë copë e kujtesës. Pra, shigjeta përfaqëson një tregues, ose më konkretisht, një adresë e kujtesës. Por përsëri, ne nuk e kujdesit në mënyrë tipike çfarë ato adresat aktuale janë. Tani, kjo linjë thotë çfarë në kushtet e laik? Star x merr 42 pikëpresje. Ç'do të thotë kjo? Ju doni të shkoni? Mos heq qafën tuaj. Audienca: Adresa e x është në 42. DAVID Malan: Adresa e x është në 42. Jo mjaft. Pra të ngushtë, por jo fare, sepse nuk ka ylli që është prefixing këtë x. Pra, ne kemi nevojë për të shkulje pak. Po? Audienca: Vlera që akrep x është duke treguar për është 42. DAVID Malan: OK. Vlera se tregues x është duke treguar për, le të themi, do të jetë 42, ose thënë ndryshe, yllin x thotë, shkoni në çfarëdo adresë është në x, nëse kjo është 1 Oxford Rrugë ose 33 Oxford Street ose OX1 apo ox33, çfarëdo që adresa numerike është, Ylli x është dereferencing e x. Pra shkoni në atë adresë dhe pastaj numrin 42 atje. Kështu që do të ishte një mënyrë ekuivalente e thënë se. Pra, kjo është e gjitha në rregull dhe pastaj ne do të përfaqësojë foto si më poshtë ku kemi shtuar 42 në atë copë prej katër bytes në anën e djathtë, por Kjo linjë ishte vendi ku gjërat shkuan keq dhe kreu Binky-së popped jashtë në këtë pikë, sepse gjëra të këqija ndodhin kur ju dereference vlerat e plehrave ose ju dereference pavlefshëm pointers, dhe unë them të pavlefshme sepse në këtë pikë në Historia, ajo që është brenda y? Cila është vlera ey bazuar në hapat e fundit pak? Po? Cfare eshte kjo? Audienca: Një adresë. DAVID Malan: Një adresë. Ajo duhet të jetë një adresë por kam nisur atë? Kështu që unë nuk kam ende. Pra, çfarë është e njohur të jetë në atje? Është vetëm disa vlera mbeturina. Ajo mund të jetë çdo adresë nga zero deri 2 miliard në qoftë se ju keni dy koncerte e RAM, ose zero për 4 miliardë në qoftë se ju keni mori katër gigabajt të RAM. Kjo është disa vlera mbeturina, por problemi është që sistemit operativ, në qoftë se ai nuk ju ka dhënë se copë e kujtesës në mënyrë specifike se ju jeni duke u përpjekur për të shkuar në, ajo në përgjithësi do të shkaktojë çfarë ne kemi parë si një defekt segmentimit. Pra, në fakt, asnjë prej jush që kanë luftuan në probleme në orarit të punës apo në problemet që është më shumë përgjithësisht me duke u përpjekur të kuptoj se një faji segmentimit, që në përgjithësi do të thotë ju jeni duke prekur një segment të kujtim që ju nuk duhet të jetë. Ju jeni duke prekur kujtesën se sistemi operativ nuk ka lejuar ju për të prekur, nëse kjo është duke shkuar shumë larg në grup tuaj ose duke filluar nga tani, nëse kjo është për shkak se ju jeni prekur kujtesës që vetëm disa vlera e mbeturinave. Pra, duke bërë yll x këtu është lloj i sjelljes papërcaktuar. Ju kurrë nuk duhet të bëjë atë, sepse mosmarrëveshje po, programi i vetëm do të rrëzuar, sepse ju jeni duke thënë, shkoni në këtë adresë dhe ju nuk keni ide se ku që adresa të vërtetë është. Pra sistemi operativ është e mundshme duke shkuar për të rrëzuar programin tuaj si rezultat dhe në të vërtetë, kjo është çfarë ka ndodhur atje për Binky. Pra në fund të fundit, Binky fikse ky problem me këtë. Kështu që programi vetë ishte me të meta. Por në qoftë se ju lloj i të ecur përpara dhe ekzekutuar këtë linjë në vend të kësaj, y barabartë x vetëm do të thotë çfarëdo Adresa është një X, gjithashtu e vënë atë në y. Dhe kështu në pikturë, ne kemi përfaqësuar ky me dy shigjeta nga x dhe y nga duke treguar në të njëjtin vend. Pra semantike, x është i barabartë për y sepse të dy nga ata janë ruajtjen e njëjtë adresa, ergo treguar në 42, dhe tani, kur ju thoni yll y, shkoni në adresën në y, kjo ka një efekt anësor interesant. Pra, adresa në y është njëjta gjë si adresën në x. Pra, nëse ju thoni shkoni në adresën e në y dhe ndryshojë vlerën në 13, kush tjetër është prekur? X, pika D, kështu që të flasin, duhet të preken si edhe. Dhe me të vërtetë, si Nick tërhoqi këtë foto në claymation ishte pikërisht ajo. Edhe pse ne të ndjekë kursorin y, ne përfundoi në të njëjtin vend, dhe kështu që në qoftë se ne kemi qenë të shtypur nga x ose y pointee së, atëherë ne do të shohim vlerën e 13. Tani, unë them pointee të jetë në përputhje me video. Programuesit, tim njohuri, në fakt nuk thonë fjalën pointee, ajo që është vënë në në, por për qëndrueshmëri me video, të kuptojnë kjo është e gjitha kjo ishte do të thoshte në këtë situatë. Pra, çdo pyetje për claymation ose pointers ose malloc vetëm ende? Nuk ka? Në rregull. Pra, pa më tej ado, le të marrin një vështrim në ku kjo ka aktualisht janë përdorur për disa kohë. Pra, ne kemi pasur këtë bibliotekë CS50 që e mori të gjitha këto funksione. Ne kemi përdorur GetInt shumë, getString, ndoshta GetLongLong më parë në pset time një apo më shumë, por çfarë është qenë në fakt po ndodh? E pra, le të marrin një vështrim të shpejtë nën kapuç në një program që frymëzon arsyeja pse ne ju CS50 jap bibliotekë, dhe në të vërtetë si e javës së kaluar, kemi filluar të marrë ato rrota trajnimit jashtë. Pra, kjo është renditur tani e një postmortem të asaj që ka qenë duke shkuar në brenda bibliotekës CS50, edhe pse ne tani do të fillojnë të lëvizin larg nga ajo për shumicën e programeve. Pra, ky është një program i quajtur scanf 0. Është super të shkurtër. Ajo vetëm ka këto rreshta, por ajo paraqet një funksion të quajtur scanf se ne jemi të vërtetë do të shohim në një moment brenda bibliotekës CS50, megjithëse në një formë pak të ndryshme. Pra ky program on line 16 është deklaruar një x ndryshueshme. Pra, më jepni katër bytes për një int. Ajo është thënë përdorues, numrin lutem, dhe pastaj kjo është një linjë interesante që në fakt lidh së bashku javën e kaluar dhe kjo. Scanf, dhe pastaj të vini re ajo merr një string format, ashtu si printf, % i thotë një int, dhe pastaj ajo merr një Argumenti i dytë i cili duket pak shokuar. Është simbol x, dhe të kujtojnë, ne pamë vetëm këtë javë një herë e kaluar. Çfarë bën simbol x përfaqëson? Çfarë do të bëni në simbol C? Po? Audienca: Adresa e. DAVID Malan: Adresa e. Pra, kjo është e kundërta e operatorit yll, ndërsa operatori Ylli thotë, të shkojnë në kjo adresë, operatori simbol thotë, kuptoj se Adresa e kësaj variable, dhe kështu që kjo është kyç, sepse Qëllimi scanf në jetën është për të scan përdorues-së të dhëna nga tastiera, në varësi të çfarëdo që ai apo ajo lloje, dhe pastaj lexoni të dhëna që përdoruesi të në një ndryshore, por ne pashë në dy javëve të fundit se se funksioni shkëmbim që ne përpoq effortlessly të zbatojë ishte thyer vetëm. Kujtojnë se me funksionin swap, në qoftë se ne vetëm i deklaruar A dhe B, si ints, ne e bëmë me sukses bie në ujdi dy variabla brenda e shkëmbim ashtu si me qumësht dhe FZ, por sa më shpejt që swap kthye, çfarë ishte rezultati me respekt për x dhe y, vlerat origjinale? Asgjë. Po. Asgjë nuk ka ndodhur atë kohë, sepse këmbime të ndryshojë vetëm kopjet e saj lokale, që do të thotë, të gjithë këtë herë, sa herë që ne kemi qenë duke kaluar në argumente me funksionet, ne jemi vetëm duke kaluar kopje të këtyre argumenteve. Ju mund të bëni me atë çdo gjë që ju doni me to, por ata do të kenë asnjë efekt në vlerat origjinale. Pra, kjo është problematike nëse ju dëshironi që të ketë një funksion si scanf në jetë, qëllimi i të cilit është që të hetoj input e përdoruesit nga tastiera dhe pastaj plotësoni në bosh, në mënyrë që të flasin, që është, të japë një ndryshore si x një vlerë, sepse në qoftë se unë ishin për të vetëm të kalojë në x scanf, në qoftë se ju e konsideroni logjikën e fundit javë, scanf mund të bëjë çfarëdo që dëshiron me një kopje të x, por kjo nuk mund të ndryshojë përgjithmonë x nëse ne japim scanf një hartë e thesarit, kështu që të flasin, ku x shënon vend, ku ne të kalojë në adresën e x në mënyrë që scanf mund të shkojnë atje dhe në fakt ndryshimi vlera e x. Dhe kështu me të vërtetë, të gjithë se ky program bën në qoftë se unë bëj scanf 0, në burimin tim Lista 5m, bëjnë scanf 0, dot çaj scanf, numri i ju lutem 50, faleminderit për 50. Pra, kjo nuk është e gjitha se interesante, Por ajo që është me të vërtetë ndodh është se sa më shpejt që unë e quaj scanf këtu, vlerën e x është duke u ndryshuar përgjithmonë. Tani, kjo duket e bukur dhe mirë, dhe në fakt, ajo Duket sikur ne nuk duhet të vërtetë biblioteka CS50 fare më. Për shembull, le të drejtuar kjo edhe një herë këtu. Më lejoni të rihap atë për një të dytë. Le të provoni një numër të lutem dhe në vend të thënë 50 si më parë, le të them vetëm jo. OK, kjo është pak i çuditshëm. NE RREGULL. Dhe vetëm disa pakuptimta këtu. Pra, kjo nuk duket të merren me situata të gabuara. Pra, ne kemi nevojë për minimalisht fillimin duke shtuar disa error-checking për të siguruar që përdoruesi ka shtypur në një numër aktual si 50, sepse me sa duket shtypur fjalët nuk është zbuluar si problematike, por ai ndoshta duhet të jetë. Le të shikojmë në këtë version tani që është përpjekja ime për Rikrijimin getString. Nëse scanf ka e gjithë kjo funksionalitetin e ndërtuar në, pse kemi qenë dabbling me këto rrota trajnimit si getString? E pra, këtu është ndoshta mi Versioni i thjeshtë i getString ku një javë më parë, unë mund të ketë thënë: më jepni një varg dhe e quajti atë tampon. Sot, unë jam duke shkuar për të filluar vetëm duke thënë yll char, e cila, risjell, kjo është vetëm sinonim. Ajo duket e frikshme, por kjo është saktë të njëjtën gjë. Pra, më jepni një ndryshore të quajtur tampon që do të ruajtur një varg, them string përdoruesit, ju lutem, dhe pastaj, ashtu si më parë, le të përpiqemi për të marrë hua këtë mësim scanf % s këtë herë dhe pastaj të kalojë në tampon. Tani, një kontroll i shpejtë mendje e shëndoshë. Pse nuk jam unë duke thënë simbol tampon këtë kohë? Konkludoj nga shembullin e mëparshëm. Audienca: Char yll është një akrep. DAVID Malan: Pikërisht, sepse këtë herë, char yll është tashmë një tregues, një adresë, sipas definicionit të atij ylli qenë atje. Dhe në qoftë se scanf pret një adresë, mjafton vetëm për të kaluar në tampon. Unë nuk kam nevojë të them ampersand buffer. Për kurioz, ju mund të të bëjë diçka si kjo. Ajo do të kishte kuptim të ndryshëm. Kjo do t'ju japë një akrep tek nje tregues i cili është në të vërtetë, një gjë e vlefshme në C, por për tani, le të mbajtur atë të thjeshtë dhe për të mbajtur historinë qëndrueshme. Unë jam vetëm duke shkuar për të kaluar në tampon dhe kjo është e saktë. Problemi edhe pse është kjo. Më lejoni të shkoj përpara dhe të drejtuar këtë Programi pas përpilimit atë. Bëni scanf 1. Damn ajo, përpilues tim infektues gabimin tim. Më jepni një të dytë. Tingëllimë. Le të thonë se scanf-1.c. NE RREGULL. Atje shkojmë. Unë kam nevojë për atë. ID CS50 ka të ndryshme konfigurimi që të ju mbrojnë kundër vetes. Unë e nevojshme për të çaktivizuar ato nga drejtimin tingëllimë manualisht këtë kohë. Pra ju lutem string. Unë jam duke shkuar për të shkuar përpara dhe shkruani në favorite botën time përshëndetje. OK, null. Kjo nuk është ajo që unë shtypur. Pra, kjo është tregues i diçka të gabuar. Më lejoni të shkoj përpara dhe të shtypni në një varg të vërtetë të gjatë. Faleminderit për null dhe unë nuk e di në qoftë se unë jam do të jetë në gjendje për të rrëzuar atë. Le të provoni një kopje të vogël paste dhe të shohim nëse kjo ndihmon. Vetëm ngjitur një shumë prej kësaj. Kjo është padyshim një e madhe string se zakonisht. Le të vetëm të vërtetë të shkruajnë atë. Jo. Mallkuar atë. Urdhëroj nuk u gjet. Pra, kjo është pa lidhje. Kjo për shkak se unë ngjit disa karaktere të këqija, por kjo rezulton se nuk do të punojë. Le të provoni këtë një herë më shumë, sepse kjo është më shumë argëtim në qoftë se ne fakt rrëzimit atë. Le të shkruani këtë dhe tani, unë jam do të kopjoni një varg të vërtetë të gjatë dhe tani le të shohim nëse ne mund të rrëzimit këtë gjë. Njoftim i lënë jashtë hapësirave dhe Linjat e reja dhe pikpresje dhe të gjitha personazhet shokuar. Enter. Dhe tani rrjeti është vetëm duke i ngadalshëm. I mbajtur poshtë Command-V kohë të gjatë, në mënyrë të qartë. Mallkuar atë! Urdhëroj nuk u gjet. NE RREGULL. E pra, pikë është megjithatë në vijim. Pra, çfarë është në të vërtetë ndodh më me këtë deklaratë i char yll tampon on line 16? Pra, çfarë jam unë duke marrë kur unë deklaroj një akrep? Të gjitha unë jam marrë është një vlerë katër bajt quajtur tampon, por ajo që është brenda saj momentin? Është vetëm disa vlera mbeturina. Sepse çdo kohë që ju të deklarojë një ndryshore në C, kjo është vetëm disa vlera mbeturina, dhe ne jemi duke filluar për të udhëtim mbi këtë realitet. Tani, kur unë them scanf, shkoni në këtë adresë dhe të vënë çfarëdo lloje përdorues në. Nëse llojet e përdoruesve në përshëndetje bota, mirë, ku mund ta vënë atë? Buffer është një vlerë e mbeturinave. Pra, kjo është lloj i si një shigjetë që është duke treguar kush e di se ku. Ndoshta kjo është vënë të drejtë këtu në kujtesën time. Dhe kështu kur përdoruesi lloje në botë Hello, programi përpiqet për të vënë string Hello World backslash 0 në atë copë e kujtesës. Por me probabilitet të lartë, por në mënyrë të qartë nuk 100% probabilitet, kompjuteri do të pas rrëzimit programi sepse kjo nuk është e kujtim unë duhet të lejohet të prek. Pra me pak fjalë, ky program është i meta pikërisht për këtë arsye. Unë jam në thelb nuk bëjnë atë? Çfarë hapash kam harruar, ashtu si ne hequr me shembullin e parë Binky-së? Po? Audienca: Alokimi Memory? DAVID Malan: kujtese. Unë nuk e kanë ndarë faktikisht ndonjë kujtim për atë varg. Pra, ne mund të rregullojmë këtë në disa mënyra. Dikush, ne mund të mbani atë të thjeshtë dhe në fakt, tani ju jeni do të fillojnë të shohim një blurring e linjave mes asaj një grup është, çfarë është një varg është, çfarë Ylli char është, ajo që një grup i karaktere është. Ja një shembull i dytë përfshirë vargjet dhe njoftimin të gjitha unë kam bërë në linjë 16 është, në vend të thënë që tampon do të jetë një char yll, një tregues për një copë e kujtesës, Unë jam duke shkuar për të dhënë shumë në mënyrë proaktive veten një tampon për 16 karaktere, dhe në fakt, në qoftë se ju jeni të njohur me buffering afat, ndoshta nga bota e videos, ku një video është buffering, buffering, buffering. E pra, çfarë është lidhja këtu? E pra, Brenda YouTube dhe brenda lojtarët video në përgjithësi është një koleksion kjo është më e madhe se 16. Ajo mund të jetë një grup i një madhësie megabyte, ndoshta 10 megabajt, dhe në atë grup bën shfletuesin tuaj shkarkoni një bandë e tërë e bytes, një bandë e tërë e megabajt të Video, dhe lojtar video të, YouTube-së apo kushdo që është, fillon lexuar bytes nga ai grup, dhe çdo herë që të shihni Fjala buffering, buffering, që do të thotë ky lojtar ka marrë në fund të asaj vektorit. Rrjeti është aq i ngadalshëm që ajo nuk ka rimbushet array me më shumë bytes dhe kështu ju jeni jashtë bit për të shfaqur për përdoruesit. Pra tampon është një term i prirur këtu në atë kjo është vetëm një grup, një copë e kujtesës. Dhe kjo do të rregullohet sepse kjo rezulton që ju mund të trajtoni vargjeve sikur ata janë adresat, edhe pse tampon është vetëm një simbol, kjo është një sekuenca e karaktereve, tampon, kjo është e dobishme për mua, programues, ju mund të kalojë emrin e saj rreth sikur të ishte një akrep, sikur ajo ishin adresa e një copë e kujtesës për 16 gërma. Pra, kjo është për të thënë, unë mund të kalojë scanf pikërisht këtë fjalë dhe kështu që tani, në qoftë se unë bëj këtë program, bëjnë scanf 2, dot Slash scanf 2, dhe shkruani në përshëndetje botë, Shkruani, se time-- Hmm, çfarë ndodhi? String ju lutem. Çfarë të bëj gabim? Tungjatjeta botë, tampon. Përshendetje Botë. Ah, unë e di se çfarë është bërë. NE RREGULL. Kështu që është e lexuar deri deri në hapësirën e parë. Pra, le të mashtrojnë për vetëm një moment dhe thonë se unë vetëm të kërkuar për të tipit diçka me të vërtetë e gjatë si kjo është një fjali e gjatë kjo është një, dy, tre, katër, pesë, gjashtë, shtatë, tetë, nëntë, 10, 11, 12, 13, 14, 15, 16. NE RREGULL. Kjo është me të vërtetë një dënim të gjatë. Pra, kjo fjali është më shumë se 16 karaktere dhe kështu që kur unë hit Enter, çfarë do të ndodhë? E pra, në këtë rast e tampon histori, unë kam shpallur që në fakt qenë një grup me 16 chars gati për të shkuar. Pra, një, dy, tre, katër, pesë, gjashtë, shtatë, tetë, nëntë, 10, 11, 12, 13, 14, 15, 16. Pra 16 karaktere, dhe tani, kur unë lexuar në diçka si kjo është një kohë të gjatë dënim, çfarë do të ndodhë është që unë jam duke shkuar për të lexuar në këtë është një i gjatë S-E-N-T-E-N-C-E, fjalia. Pra, kjo është qëllimisht një gjë e keqe që kam mbani shkrim përtej Kufijtë e array tim, përtej kufijve të tampon sime. Unë mund të merrni me fat dhe programi do të mbajë mbi drejtimin dhe nuk e kujdesit, por në përgjithësi, kjo në të vërtetë do të rrëzimit programin tim, dhe kjo është një bug në tim kodin moment unë hap përtej kufijve e atij grup, sepse unë nuk e di nëse kjo është domosdoshmërisht do të rrëzuar ose në qoftë se unë jam vetëm do të merrni me fat. Pra, kjo është problematike për shkak se në këtë rast, kjo nuk duket për të punuar dhe le të provokoj fatin këtu, edhe pse IDE duket të tolerojë mjaft of-- Atje shkojmë. Së fundi. Kështu që unë jam i vetmi që mund të shihni këtë. Kështu që unë vetëm e kishte një shumë të shtypni fun nga një frazë të vërtet të gjatë aktual se ajo tejkaluar sigurisht 16 bytes, sepse unë shtypur në këtë çmendur gjatë multi-line fraza, dhe pastaj të vini re çfarë ka ndodhur. Programi u përpoq botimit të saj dhe pastaj mori një defekt segmentimit dhe gabimet segmentimit është kur diçka si kjo ndodh dhe të sistemit operativ thotë Jo, nuk mund ta prekë atë kujtesës. Ne jemi duke shkuar për të vrarë programi krejt. Pra, kjo duket problematike. Unë e kam përmirësuar programin ku të paktën të ketë disa kujtesës, por kjo do të duket të kufizojë getString funksioni për të marrë vargjet e ndonjë gjatësi të fundme 16. Pra, nëse ju doni të mbështetur më shumë fjali se 16 karaktere, cfare po ben? E pra, ju mund të rrisë madhësia e këtij tampon në 32 ose që duket lloj i shkurtër. Pse nuk vetëm të bëjë ajo 1000 por zbyth. Cila është përgjigja intuitive e vetëm duke shmangur këtë problem duke e bërë tampon ime më e madhe, si 1000 karaktere? Me implementimin e getString në këtë mënyrë. Çfarë është e mirë apo e keqe këtu? Po? Audienca: Në qoftë se ju lidhin një shumë i hapësirës dhe ju nuk e përdorni atë, atëherë ju nuk mund të rialokuar atë hapësirë. DAVID Malan: Absolutisht. Është kota aq sa në qoftë se ju nuk e bëni në fakt duhet 900 e atyre bytes por ju jeni duke kërkuar për 1,000 në total gjithsesi, ju jeni vetëm të konsumojnë më shumë memorie në kompjuterin e përdoruesit se sa ju duhet për të, dhe në fund të fundit, disa prej të ju keni hasur tashmë në jetën që kur ju jeni drejtimin e shumë programeve dhe ata janë të hahet deri shumë kujtesës, kjo në fakt mund të ndikojë në performancën e dhe përvoja e përdoruesit në kompjuter. Pra, kjo është lloj i një zgjidhje dembel, me siguri, dhe anasjelltas, kjo nuk është vetëm të kota, çfarë problemi ende mbetet, edhe në qoftë se unë bëj tampon tim 1000? Po? Audienca: Vargu është gjatësia 1,001. DAVID Malan: Pikërisht. Nëse string juaj është gjatësia e 1001, ju keni të njëjtin problem e saktë, dhe me argumentin tim, unë do të vetëm pastaj e bëjnë atë të vitit 2000, por ju nuk e dini në të avancuar se sa e madhe ajo duhet të jetë, dhe ende, unë duhet të hartojnë programin tim para se të lënë njerëzit e përdorin dhe shkarko ajo. Pra, kjo është pikërisht lloji i gjëra që përpiqet bibliotekës CS50 për të na ndihmuar me dhe ne do shikim vetëm në disa zbatimit themelor këtu, por kjo është CS50 dot C. Kjo është skedari që ka qenë në CS50 IDE të gjitha këto javë që ju keni qenë duke përdorur. Është e para-hartuar dhe ju keni qenë duke e përdorur atë automatikisht nga natyra e duke pasur dash L CS50 flamurin me tingëllim, por në qoftë se unë lëvizni poshtë nëpër të gjitha këto funksione, këtu është getString, dhe vetëm për të ju jap një shije të asaj që po ndodh, le të marrin një vështrim të shpejtë kompleksiteti relative. Kjo nuk është një super të gjatë funksion, por ne nuk e bëmë duhet të mendoj se të gjithë e vështirë për se si të shkojë në lidhje me marrjen e strings. Kështu që këtu është tampon im dhe unë me sa duket nisja atë të null. Kjo, sigurisht, është njëjta gjë si yll char, por kam vendosur në zbatimin e bibliotekës CS50 se në qoftë se ne jemi duke shkuar për të jetë plotësisht dinamik, Unë nuk e di paraprakisht se si e madhe e një përdoruesit string do të dëshironi të merrni. Kështu që unë jam duke shkuar për të filluar me vetëm një varg të zbrazët dhe unë jam duke shkuar për të ndërtuar sa më shumë e kujtesës si unë duhet të përshtaten string përdoruesit dhe në qoftë se unë nuk kam të mjaftueshme, unë jam duke shkuar për të pyetur sistemi operativ për më shumë memorie. Unë jam duke shkuar për të lëvizur varg e tyre në një copë të madhe të kujtesës dhe unë jam duke shkuar për lirimin ose të liruar copë pamjaftueshme e madhe e kujtesës dhe ne jemi vetëm do për të bërë këtë iteratively. Pra, një shikim të shpejtë, këtu është vetëm një variabël me të cilën unë jam duke shkuar për të mbajtur nën e kapacitetit të tampon sime. Sa bytes mund të përshtatet? Këtu është një variabël me n që unë jam duke shkuar për të mbajtur gjurmët e sa bytes janë në të vërtetë në tampon ose që përdoruesi ka shtypur. Nëse ju nuk e keni parë këtë më parë, ju mund të specifikoni se një variabël si një int është panënshkruar, e cila siç sugjeron emri, do të thotë se është jo-negativ, dhe pse do të Unë ndonjëherë dua të shqetësojë specifikon se një int nuk është vetëm një int, por kjo është një int panënshkruar? Kjo është një int jo-negativ. Çfarë [e padëgjueshme] do të thotë? Audienca: Është përshkruar një sasi e kujtesës që mund të jetë [e padëgjueshme]. DAVID Malan: Po. Pra, nëse unë them unsigned, kjo është në fakt duke ju dhënë një grimë e kujtesës shtesë dhe kjo duket lloj i trashë, por në qoftë se ju kanë një grimë e kujtesës shtesë, që do të thotë që ju keni dy herë më shumë Vlerat ju mund të përfaqësojnë, sepse ajo mund të jetë një 0, ose një 1. Pra by default, një int mund të jetë afërsisht negativ 2 miliard gjithë rrugës deri në 2 miliardë pozitiv. Këto janë vargjet e madhe, por është ende lloj i të kota në qoftë se ju intereson vetëm për madhësive, të cilat vetëm intuitive duhet të jetë jo-negativ ose pozitiv ose 0, edhe atëherë, pse jeni të humbur 2 miliardë Vlerat e mundshme për numrat negativë në qoftë se ju nuk jeni do të përdorin ato? Pra, duke thënë panënshkruar, tani int ime mund të të jetë në mes të 0 dhe afërsisht 4 miliardë. Kështu që këtu është vetëm një int C për arsye të ne nuk do të marrë në vetëm tani si pse kjo është një int vend e një char, por këtu është Thelbi i asaj që po ndodh në, dhe disa nga ju mund të jetë duke përdorur, për shembull, Funksioni fgetc edhe në pset katër ose pas kësaj, ne do të shohim atë përsëri në problemin vendosur pesë, fgetc është e bukur sepse si emri lloj, lloj arcanely sugjeron, kjo është një funksion që merr një karakter dhe kështu, çfarë është krejtësisht të ndryshme për atë që ne jemi duke bërë në getString është që ne nuk jeni duke përdorur scanf në të njëjtën mënyrë. Ne jemi vetëm zvarrit përgjatë Hap-pas-hapi mbi çfarëdo përdoruesi ka shtypur në, sepse ne gjithmonë mund të caktojë një char, dhe kështu që ne mund gjithmonë të sigurtë shikoni në një char në një kohë, dhe magji fillon të ndodhë këtu. Unë do të lëvizni poshtë për të mes të këtij funksioni vetëm të prezantoj shkurtimisht këtë funksion. Ashtu si ka një funksion malloc, ka një funksion risigurimi ku risigurimi ju lejon të rialokuar një copë e kujtesës dhe të bëjë atë të mëdha apo të vogla. Histori kaq të gjatë të shkurtër dhe me një valë e dorës sime për sot, e di se çfarë getString është duke bërë është kjo është lloj i magjike në rritje ose ngushtim tampon si përdorues Llojet e në vargun e tij ose të saj. Pra, nëse llojet e përdoruesit një string i shkurtër, ky kod vetëm ndan të mjaftueshme kujtim të përshtaten string. Nëse shfrytëzuesi mban typing si unë e bëri atë përsëri dhe përsëri dhe përsëri, mirë, në qoftë se tampon fillimisht ky i madh dhe programi realizon, në prit një minutë, unë jam jashtë hapësirës, ajo do të dyfishohet madhësia e tampon dhe pastaj të dyfishojë madhësinë e tampon dhe kodi që bën dyfishimin, nëse ne shikojmë në atë këtu, është vetëm kjo zgjuar një astar. Ju nuk mund të keni parë këtë sintaksë më parë, por në qoftë se ju thoni yll të barabartë, kjo është e njëjta gjë si duke thënë herë kapacitetin e 2. Pra, vetëm ajo mban dyfishuar kapaciteti i tampon dhe pastaj duke u thënë risigurimi për të dhënë vetë se kujtesa shumë më tepër. Tani, si një mënjanë, atje janë funksione të tjera në këtu që ne nuk do të shikojmë në çdo detaj përveç për të treguar në GetInt, ne përdorim getString në GetInt. Ne kontrolloni se kjo nuk është null, e cila, kujtojnë, është vlera e veçantë që do të thotë diçka shkoi keq. Ne jemi jashtë kujtesës. Më mirë kontrolloni për atë. Dhe ne të kthehen një vlerë sentinel. Por unë do të shtyjë për komentet si për të pse dhe pastaj ne e përdorim këtë kushëririn e scanf quajtur sscanf dhe kjo rezulton që scanf sscanf, ose varg, ju lejon të marrin një vështrim në vijën që përdoruesi ka shtypur në dhe të ju lejojnë analizuar atë në thelb dhe atë që unë jam duke bërë këtu është Unë jam i thënë sscanf, analizuar çfarëdo përdoruesi ka shtypur në dhe sigurohuni% i, nuk është një numër i plotë në të, dhe ne nuk do merrni në, sot pikërisht pse ka edhe një% c këtu, por që me pak fjalë lejon na për të zbuluar nëse përdoruesi ka shtypur në diçka fals pas numrit. Pra, arsyeja që GetInt dhe getString ju them për të rigjykuar, rigjykuar, rigjykuar është për shkak të gjithë që kodi kemi shkruar, Kjo është lloj i kërkuar në input të përdoruesit në duke u siguruar se është plotësisht numerike ose kjo është një Floating aktual Vlera pikë ose të ngjashme, në varësi të asaj vlere funksionojë ju jeni duke përdorur. Uf. NE RREGULL. Kjo ishte një kafshatë por çështja këtu është se arsyeja kemi pasur këto rrota trajnimit në është për shkak se në nivelin më të ulët, nuk është vetëm kaq shumë gjëra që mund të shkojnë keq që ne të kërkuar për preemptively trajtuar këto gjëra sigurisht në javë hershme e klasës, por tani me pset katër dhe pesë pset dhe përtej do të shihni se ajo është më shumë tek ju por edhe ju jeni më të aftë e zgjidhjen e këtyre llojet e problemeve veten. Çdo pyetje mbi getString ose GetInt? Po? Audienca: Pse do të dyfishtë kapaciteti i tampon në vend se vetëm duke rritur ai nga shuma e saktë? DAVID Malan: Pyetje e mirë. Pse do të dyfishojë kapacitetin e tampon krahasim për të vetëm të rritur atë nga disa vlera konstante? Ishte një vendim i projektit. Ne thjesht vendosi se për shkak se ajo tenton të të jetë pak e shtrenjtë kohë-mençur për të kërkuar sistemi operativ për kujtesën, ne nuk e bëri duan të përfundojnë duke marrë në një situatë për vargjet e mëdha se ne ishim duke i kërkuar OS përsëri dhe përsëri dhe përsëri dhe përsëri në suksesion të shpejtë për kujtesën. Pra, ne vetëm vendosëm, disi në mënyrë arbitrare, por ne shpresojmë në mënyrë të arsyeshme, se, ju e dini se çfarë, le të përpiqen për të marrë përpara veten dhe vetëm i mbajnë dyfishuar atë në mënyrë që ne minimizuar shumën e herë ne kemi për të thirrur malloc ose risigurimi, por një gjykim i përgjithshëm thirrur në mungesë të njohjes atë që përdoruesit mund të dëshironi të shkruani. Dy mënyra mund të jetë e diskutueshme. Ndoshta mirë. Pra, le të marrin një vështrim në një çift e efekteve të tjera anësore të kujtesës, gjëra që mund të shkojnë keq dhe mjetet që ju mund të përdorin për të kapur këto lloje të gabimeve. Ajo rezulton se të gjithë ju, edhe pse check50 nuk ka thënë të sa më shumë, kam qenë i shkruar buggy Kodi që nga java e parë, edhe në qoftë se të gjitha testet janë check50 kaluar, dhe madje edhe në qoftë se ju dhe TF tuaj janë super të bindur se Kodi juaj punon si qëllim. Kodi juaj ka qenë buggy ose të meta në të gjithë ju që, në përdorimin e bibliotekës CS50, janë rrjedh kujtesën. Ju keni qenë duke kërkuar e sistemit operativ për kujtesën, në shumicën e programeve ju keni shkruar, por ju keni kurrë dhënë në të vërtetë atë. Ju keni quajtur getString dhe GetInt dhe GetFloat, por me getString, ju keni kurrë nuk e quajti unGetString ose jep String Prapa apo si, por ne kemi parë që getString bën të siguroj kujtesë me anë të malloc ose kjo risigurimi funksion, e cila është vetëm shumë të ngjashme në frymë, dhe akoma, ne kemi qenë duke i kërkuar e sistemit operativ për kujtesës dhe kujtesës përsëri dhe përsëri por kurrë duke i dhënë atë. Tani, si një mënjanë, rezulton se kur një program shpërblej, të gjithë e kujtesës është liruar automatikisht. Pra, kjo nuk ka qenë një marrëveshje e madhe. Kjo nuk do të thyejnë IDE apo gjëra të ngadalësojnë, por kur programet bëjë përgjithësisht rrjedhje kujtesës dhe ata po xhironi për një kohë të gjatë. Nëse ju keni parë ndonjëherë budalla Pak topi plazhi në Mac OS ose hourglass në Windows ku kjo është lloj i ngadalësuar apo të menduarit apo të të menduarit ose vetëm të vërtetë fillon për të ngadalësuar në një zvarritje, ajo shumë ndoshta mund të jetë rezultat i një rrjedhje kujtesës. Programuesit të cilët shkruan software ju jeni duke përdorur pyesni sistemit operativ për kujtesën çdo disa minuta, çdo orë. Por nëse ju xhironi software, edhe nëse është minimizohet në kompjuterin tuaj për orë ose ditë në fund, ju mund të jetë i pyetur për më shumë dhe më shumë kujtesës dhe në fakt nuk e përdorur atë dhe kështu kodin tuaj mund të jetë, ose Programet mund të rrjedh kujtesës, dhe në qoftë se ju filloni për rrjedhje kujtesës, ka pak kujtesë për programe të tjera, dhe efekti është për të ngadalësojnë gjithçka poshtë. Tani, kjo është larg nga një prej programet më të egra ju do të keni mundësi për të kandiduar në CS50 aq si prodhimin e saj është edhe më e fshehtë se tingëllimë-së ose të bëjë ose ndonjë e komandës Programet e linjës ne kemi drejtuar më parë, por fatmirësisht, ngulitur në prodhimin e saj është disa këshilla super të dobishme që do të jetë e dobishme ose për pset katër ose sigurisht pset pesë. Pra interfaqe e Valgrind është një mjet që mund të përdoret për të parë për rrjedhjet e kujtesës në programin tuaj. Është relativisht e thjeshtë për të kandiduar. Ju drejtuar interfaqe e Valgrind dhe pastaj, madje edhe edhe pse kjo është një fjalëshumë pak, dash kontrolloni dash rrjedhje barabartë të plotë, dhe pastaj dot pakësojë dhe emri i programit tuaj. Pra interfaqe e Valgrind atëherë do të drejtuar programin tuaj dhe në fund të programit tuaj drejtimin para se të shpërblej dhe ju jep një tjetër të shpejtë, ajo do të analizohet tuaj Programi ndërsa ajo është duke dhe tregoni ju keni rrjedhje çdo kujtim dhe më mirë akoma, nuk ju prek kujtesën se nuk i takojnë për ju? Ajo nuk mund të arrijë gjithçka, por kjo është mjaft të mirë në kapjen gjërat më të. Kështu që këtu është një shembull i tim që ka drejtuar ky program, duke pasur Shprehje drejtuar, në një program të quajtur kujtesës, dhe unë jam duke shkuar për të nxjerrë në pah linjat që janë në fund të fundit me interes për ne. Pra, ka edhe më shumë distractions që unë e kam fshirë nga rrëshqitje. Por le të shohim vetëm atë që kjo Programi është i aftë për të na thënë. Është i aftë për të na thënë gjëra si shkruani pavlefshme të madhësisë 4. Me fjalë të tjera, në qoftë se ju prek kujtesën, konkretisht 4 byte memorje që ju nuk duhet të ketë, interfaqe e Valgrind mund t'ju them se. Shkruaj Invalid i madhësisë 4. Ju prekur katër bytes që ju nuk duhet të ketë. Ku e keni bërë këtë? Kjo është bukuria. Memory dot c linja 21 është ajo ku ju dehur dhe kjo është arsyeja pse ajo është e dobishme. Shumë si GDB, ajo mund të ndihmojë ju pikë në gabim aktuale. Tani, kjo është pak më shumë fjalëshumë, nëse jo konfuze. 40 bytes në 1 blloqe janë patjetër humbur në humbje rekord 1 e 1. Cfare do te thote ajo? E pra, kjo thjesht do të thotë që ju kërkohet për 40 bytes dhe ju kurrë nuk ia dha atë. Ju quajtur malloc ose i quajtur GetString dhe të sistemit operativ ju 40 bytes, por ju dha kurrë liruar ose lëshuar atë kujtesës, dhe të jenë të ndershëm, ne kurrë nuk kam treguar se si të kthej kujtesën. Rezulton se ka një super Funksioni i thjeshtë i quajtur të lirë. Merr një argument, gjë ju doni të lirë apo të japë përsëri, por 40 bytes, me sa duket, në këtë program kanë qenë të humbur në linjë 20 e kujtesës dot c. Pra, le të shohim këtë program. Është super padobishme. Ajo vetëm tregon ky gabim veçanti. Pra, le të marrin një vështrim. Këtu është kryesore dhe kryesore, njoftim, thirrjet një funksion i quajtur f dhe pastaj kthimit. Pra, jo të gjithë atë interesante. Çfarë do të f bëj? Njoftim unë nuk e mërzit me një prototip. Unë të kërkuar për të mbajtur kodin si minimale të jetë e mundur. Kështu që unë vë f lart kryesor dhe kjo është në rregull, sigurisht, për programet e shkurtër si kjo. Pra, f nuk ka kthim asgjë dhe bën nuk merr asgjë, por ajo e bën këtë. Ai deklaron, ashtu si në shembullin Binky, një tregues i quajtur X që po ndodh për të ruajtur adresën e një int. Pra, kjo është anën e majtë. Në anglisht, çfarë është drejtë-hand side duke bërë? Çdokush? Ç'është kjo bën për ne? Po? Audienca: [padëgjueshme] herë më e madhe e një int e cila është 10 herë më se [e padëgjueshme] DAVID Malan: Mirë dhe më lejoni të përmbledh. Pra ndajë hapësirë ​​të mjaftueshme për 10 integers ose 10, çfarë është madhësia e një int, është katër bytes, kështu 10 herë 4 është 40, në mënyrë që të djathtë anën që unë e kam e theksuar është më jepni 40 bytes dhe të ruajtur adresën e byte parë në x. Dhe tani së fundi, dhe këtu është ku ky program është buggy, çfarë është gabuar me linjë 21 bazuar në atë logjikë? Çfarë është e gabuar me linjë 21? Po? Audienca: Ju nuk mund të Indeksi në x [e padëgjueshme]. DAVID Malan: Po. Unë nuk duhet indeksi në x si kjo. Pra sintaksore, kjo është në rregull. Çfarë është e bukur është, ashtu si ti mund të trajtojnë emrin e një grup sikur kjo është një tregues, në mënyrë të ngjashme mund të trajtoj një tregues sikur është një grup, dhe kështu që unë mund të sintaksore thonë x kllapa diçka, x kllapa unë, por 10 është problematike. Përse? Audienca: Për shkak se ajo nuk është brenda. DAVID Malan: Kjo nuk është brenda asaj copë e kujtesës. Cila është vlera më e madhe unë duhet të të vënë në këto kllapa katrore? 9, 0 deri 9. Për shkak të zero indeksimit. Pra, 0 deri 9 do të jetë mirë. Kllapa 10 nuk është e mirë dhe por, kujtojnë edhe pse, çdo herë I duket të përpiqet të bëjë CS50 IDE përplasje nga shtypja në vlerat fals, ajo nuk ka gjithmonë të bashkëpunojnë, dhe në të vërtetë, ju shpesh merrni me fat vetëm për shkak se sistemit operativ nuk ka vini re se ju ndonjëherë në mënyrë pak kalojnë disa copë e kujtesës, sepse keni qëndruar brenda teknikisht segment tuaj, por më shumë se në një klasë sistemeve operative, dhe kështu diçka si kjo shumë lehtë mund të shkojnë pa u vënë re. Programi juaj është kurrë do të rrëzuar vazhdimisht por ndoshta një herë në pak kohë. Dhe kështu le të përpiqemi Shprehje për këtë, dhe këtu është ku ne do të merrni zhytur nga prodhimi çast. Pra, ti kujtesës kontroll interfaqe e Valgrind rrjedhje është e barabartë e plotë e kujtesës dot slash. Dhe këtu është arsyeja pse unë premtoj kjo do të trullos. Ja se çfarë interfaqe e Valgrind, këtu është ajo që një programues, disa vite ago- vendosi se do të ishte një ide e mirë për prodhimi të duken si. Pra, le të bëjë ndjenjën e kësaj. Pra, të gjithë rrugën në të dorës së majtë anë për asnjë arsye të mirë është ID Procesi i programit ne vetëm të drejtuar, të identifikues unik për programin ne vetëm u. Ne fshihet se nga rrëshqitje, por ka disa informata të dobishme në këtu. Le të shkoni deri në krye. Ja ku kemi filluar. Pra, kjo nuk është e gjitha e prodhimit se shumë. Ja se shkruaj pavlefshme i madhësisë 4 në linjë 21. E pra, çfarë ishte linja 21? Linja 21 ishte pikërisht kjo dhe kjo ka kuptim se unë jam në plotfuqishmërinë shkruar 4 bytes, sepse unë jam i duke u përpjekur për të vënë këtë numër i plotë, e cila mund të jetë çdo gjë, ajo vetëm ndodh që të jetë zero, por unë jam duke u përpjekur për ta vënë atë në një vend që nuk i përket mua. Për më tepër, poshtë këtu, 40 bytes në një Blloqet janë të humbur përfundimisht në procesverbal 1. Kjo për shkak se, kur unë e quaj malloc këtu, unë kurrë nuk të vërtetë e lirë e kujtesës. Pra, si mund ta fix this? Më lejoni të shkoj përpara dhe të jetë pak më të sigurt dhe të bëjë 9 atje dhe më lejoni këtu falas X. Ky është funksioni i ri për sot. Nëse unë tani përsëritje të kujtesës dot plagë, le të kandidojë interfaqe e Valgrind mbi atë përsëri, maksimizuar dritaren time dhe hit Enter. Tani, kjo është e mirë. Ata varrosin lajmin e mirë në të gjithë këtë prodhim. Të gjitha blloqet grumbullosh ishin të lira. Ne do të kthehen në atë tog është, por nuk ka rrjedhjet janë të mundshme. Pra, kjo është vetëm një tjetër mjet për kit tuaj mjet me të cilat ju mund të filloni për të gjetur tani gabime si kjo. Por le të shohim se çfarë më shumë mund të shkojnë keq këtu. Le të tranzicionit tani për në fakt zgjidhjen e një problemi. Si një mënjanë, në qoftë se kjo do të lehtësojë një pak e konfuzionit ose tensioni, kjo tani është qesharake. Po. Kjo është shumë e mirë. Sepse pointers janë adresat dhe adresat janë përgjithësisht nga konventa shkruar me heksadecimal. Ha, ha, kjo është qesharake tani. Gjithsesi, kështu që le të tani në fakt të zgjidhur një problem. Kjo ka qenë super, super-nivelit të ulët deri më tani, dhe ne fakt mund të bëjmë dobishme gjëra me këto detaje të nivelit të ulët. Pra, ne kemi prezantuar disa javë më parë nocioni i një grup. Një grup ishte e bukur sepse është e vështirë për të pastruar kodin tonë sepse në qoftë se ne të kërkuar për të shkruar një program me studentë të shumta ose emra të shumta dhe shtëpitë dhe dorms dhe kolegjet dhe të gjithë që, ne mund të ruajë gjithçka më shumë pastër brenda një grup. Por të propozojë një dobësitë nga një grup deri më tani. Edhe nëse ju nuk keni vuajtur vetë në një program, vetëm instinktivisht, ajo është një gjë e keqe në lidhje me një grup, ndoshta? Kam dëgjuar disa murmurimat. Audienca: Është e vështirë për të ndryshuar madhësinë. DAVID Malan: Është e vështirë për të ndryshuar madhësinë. Ju nuk mund të ndryshoni madhësinë e një grup, në fakt, në vetvete në C. Ju mund të caktojë një tjetër rrjet, lëvizin çdo gjë nga e vjetër në e re, dhe tani të ketë një hapësirë ​​shtesë, por kjo nuk është si një gjuha si Java ose Python ose ndonjë numër tjetër i gjuhë me të cilën disa prej jush mund të jetë njohur ku ju vetëm mund të mbani duke shtuar gjëra të Shpallja nauseam në fund të një grup. Kur ju keni një rrjet të Madhësia e 6, që është madhësia e tij, dhe aq shumë si ide më parë të paturit e një tampon të një madhësie të caktuar, ju duhet të mendoj nga porta çfarë madhësie nuk ju duan që ajo të jetë? Në qoftë se ju me mend shumë i madh, ju jeni të humbur hapësirë. Në qoftë se ju me mend shumë të vogla, të nuk mund të ruajë që të dhënat paktën pa shumë punë. Sot kështu, falë pointers, ne mund të filloni qepur së bashku vet me porosi tonë strukturat e të dhënave, dhe në fakt, këtu është diçka që duket pak më shumë i fshehtë në shikim të parë, por kjo është ajo që ne do të thërrasë një i lidhur lista, dhe lloji i saj emri i përmbledh ajo. Kjo është një listë të numrave, ose në ky rast, një listë të numrave, por ajo mund të jetë një listë e asgjë, por ajo është e lidhur së bashku me anë të shigjetave, dhe vetëm të marrë me mend me çfarë teknikë do të shkojmë të jetë në gjendje për të thur së bashku, lloj si kokoshka me një fije, një i lidhur listat rectangles këtu? Numrat e saj? Çfarë është tipar gjuha themelore? Audienca: Një akrep. DAVID Malan: Një akrep. Pra, secili prej këtyre shigjetave këtu përfaqëson një tregues apo vetëm një adresë. Pra, me fjalë të tjera, në qoftë se unë dua për të ruajtur një listë të numrave, Unë nuk mund të ruajë atë në qoftë se unë dua aftësia për të rritet dhe tkurret Struktura e mia të dhëna në një rrjet. Kështu që unë duhet të ketë pak më sofistikimi, por vini re se kjo Foto lloj i sugjeron se në qoftë se ju keni marrë vetëm temat pak lidh çdo gjë së bashku, ndoshta nuk është se e vështirë për të bërë hapësirë në mes të dy prej këtyre rectangles ose dy nga këto nyje, ndërsa ne do të fillojmë duke i quajtur ato, të vënë në një nyje të re, dhe pastaj me disa fije të re, vetëm hendek tre nyje së bashku, e para, e fundit, dhe një që keni futur vetëm në mes. Dhe me të vërtetë një listë e lidhur, ndryshe nga një grup, është dinamik. Ajo mund të rritet dhe kjo mund të tkurret dhe ju nuk e bëni duhet të dinë ose kujdesur paraprakisht se shumë të dhëna ju jeni do të jetë ruajtjen, por ajo rezulton ne duhet të jetë pak kujdesshëm në lidhje me se si për të zbatuar këtë. Pra, së pari le të shqyrtojmë se si ne zbatimin e një nga këto rectangles pak. Është e lehtë për të zbatuar një int. Ju vetëm të them int n dhe pastaj ju merrni 4 bytes për një int, por si mund ta merrni një int, e quajti atë n, dhe pastaj një akrep, le ta quajmë atë të ardhshëm. Ne mund të telefononi këto gjëra çdo gjë që ne duam por kam nevojë për një strukturë të dhënave doganore. Po? Audienca: Ampersand [e padëgjueshme]. DAVID Malan: Pra, simbol ne do të përdorim për marrë adresën e një nyje potencialisht. Por ne kemi nevojë për një tjetër tipar i C në mënyrë të më japë mundësinë për të krijuar kjo drejtkëndësh zakon, kjo porosi variabël në qoftë se ju do të, në kujtesë. Audienca: Një struct. DAVID Malan: Një struct. Kujtojnë nga java e fundit, ne kemi prezantuar struct, kjo fjalen relativisht e thjeshtë që ju lejon të bëjmë gjëra të tilla si kjo. C nuk ka ardhur me një të dhëna Struktura e quajtur studenti. Ajo vjen me int dhe noton dhe char dhe të tilla, por ajo nuk ka ardhur me student, por ne mund të krijojë një lloj të dhënave të studentëve, një strukturë nxënës, me këtë sintaksë këtu. Dhe ju do të shihni këtë përsëri dhe përsëri. Pra, mos u bëni merak për memorizimin fjalë kyçe, por fjalen që është e rëndësishme është vetëm fakti që kemi thënë struct dhe pastaj kemi quajtur atë nxënës dhe brenda i studentit ishte një emër dhe një shtëpi ose një fjetore apo si. Dhe kështu që tani sot, le të propozojë këtë. Unë kam shtuar disa fjalë, por në qoftë se unë dua për të zbatuar këtë drejtkëndësh që është mori edhe një int dhe një akrep, ju e dini se çfarë, unë jam duke shkuar për të deklaruar një e strukturës të quajtur nyje. Unë jam gjithashtu, në brendësi të saj, do të thonë se një nyje, kjo drejtkëndësh, ka një int dhe ne do të thërrasë atë n dhe ajo ka një tregues tjetër. Dhe kjo është pak fjalëshumë, por në qoftë se ju mendoni rreth saj, shigjetat që ishin në foto një moment më parë janë të çfarë lloji të dhënave? Ku secili prej këtyre shigjetave është treguar për çfarë lloji i strukturës së të dhënave? Kjo nuk është vetëm për të vënë në një int në vetvete. Është treguar të Gjithë gjë drejtkëndëshe dhe kjo gjë drejtkëndëshe, thamë, është quajtur një nyje. Dhe kështu që ne lloj i duhet të Recursively përcaktojnë këtë tilla se një nyje, ne do të thotë: do të përmbajë një int quajtur n dhe një tregues të quajtur tjetër dhe lloji i strukturës së të dhënave për të cilat se pikat Pointer është me sa duket do të jetë nyje struct. Pra, kjo është annoyingly fjalëshumë dhe vetëm të jetë pedant, arsyeja pse ne nuk mund të them vetëm këtë, që sinqerisht duket shumë më i lexueshëm, është sepse kujtojnë se C lexuar gjëra lart poshtë, majta në të djathtë. Kjo nuk është deri sa të kemi të pikëpresje se nyja fjalen fakt ekziston. Pra, nëse ne duam të kemi këtë lloj të referencë ciklike brenda e të dhënave Struktura, ne duhet të bëjmë këtë, ku themi nyje struct në krye, e cila na jep një mënyrë më të gjatë të përshkruar këtë gjë, atëherë brenda themi nyje struct, dhe pastaj në vijën e fundit themi, të gjithë të drejtë, C, nga rruga, vetëm thirrje gjithë këtë mallkim Gjëja një nyje dhe të ndaluar duke përdorur struct fjalen krejt. Pra, kjo është vetëm lloj i një sintaktik mashtrim që në fund të fundit na lejon të krijojë diçka që duket tamam si kjo. Pra, nëse ne supozojmë tani ne mund të zbatojë këtë gjë në C, Si nuk kemi në fakt filloni traversing këtë? E pra, në fakt, të gjithë ne duhet të bëni është iterate nga e majta në të djathtë dhe vetëm lloj i futur nyjet apo fshij nyje ose kërko për gjëra kudo që duam, por për të bërë këtë, le të shkojnë përpara dhe të bëjë gjërat pak më e vërtetë, sepse kjo ka qenë super-nivelit të ulët deri tani. A do dikush të vërtetë donte të jetë i pari? NE RREGULL. Eja up. Si e ke emrin? DAVID: David. DAVID Malan: David. Gëzohem që u njohëm. Me too. Në rregull. Dhe ne kemi nevojë për një numër 9. Nuk është aq i mirë sa i pari, ndoshta. OK, numri 9. Një numër 17, ju lutem. Më lejoni të kthehem pak më larg. Numri 22, ju lutem, dhe si në lidhje më larg prapa në qoftë se unë mund të shoh ndonjë duart me të gjitha dritë të apo jo. Dikush është duke u vullnetarë të drejtë atje. A doni për të dalë? Parakrah juaj me forcë duke shkuar deri. OK, 17. 22. 26 po vjen poshtë. A do dikush tjetër të doja të forcefully-- Eja lart. Një vullnetar aktual. Pra shumë shpejt, në qoftë se ju djema mund të organizojmë veten ashtu si nyjet në ekran. Faleminderit. Dhe ju do të jetë 26. Të gjitha Paraqitjet e drejtë dhe të shpejtë. Kështu që unë jam Davidi dhe ju jeni gjithashtu? DAVID: David. DAVID Malan: Dhe ju jeni? JAKE: Jake. SUE: Sue. Alex: Alex. RAPHAEL: Raphael. TAYLOR: Taylor. DAVID Malan: Taylor. Shkëlqyer. Pra, këto janë vullnetarë tona për sot dhe të shkojnë përpara dhe zhvendosje një mënyrë që pak, dhe thjesht shkoni përpara dhe për të mbajtur mbajnë numrat tuaj si ju jeni apo tuaj Shenja e parë dhe duke përdorur dorën tuaj të majtë, të shkojnë përpara dhe vetëm të zbatojë këto shigjeta, vetëm në mënyrë që dora jote e majtë është fjalë për fjalë duke treguar në çdo gjë që ju duhet të pikë në, dhe t'i japë vetes disa dhoma në mënyrë që ne mund të shohim me sy armëve tuaj në fakt duke treguar, dhe ju vetëm mund të tregojnë lloj e në tokë është e mirë. Pra, këtu ne kemi një listë e lidhur e një, dy, tre, katër, pesë nyjet në fillim, dhe vini re ne kemi këtë të veçantë tregues në fillim i cili është kyç, sepse ne duhet të mbajnë gjurmët e gjithë listës gjatësi disi. Këta njerëz, edhe pse ata janë lënë në të djathtë, për të kthyer prapa në kujtesë, ata në fakt mund të jetë diku në kujtesën e kompjuterit. Pra, këta njerëz mund të jenë qëndruar kudo në skenë dhe kjo është në rregull, për aq kohë sa ata janë në fakt duke njëri me tjetrin, por për të mbajtur gjërat pastër dhe të thjeshtë, ne do të vetëm të tërheqë ata majta në të djathtë si këtë, por nuk mund të ketë boshllëqe masive në mes të këtyre nyjeve. Tani, në qoftë se unë dua që në fakt të futur disa Vlera e re, le të shkojnë përpara dhe të bëjë këtë. Ne kemi një mundësi tani për të zgjedhur një tjetër nyje. Thuaj le të nisem me mallocing 55. Dikush do të ngurrojë të malloc? OK, eja lart. Si e ke emrin? RAINBOW: Rainbow. DAVID Malan: Rainbow? Në rregull. Malloc Rainbow. Eja up. Deri tani ne duhet të pyesim veten algoritmikisht ku ne mund të vënë 55. Pra, të gjithë ne e dimë, natyrisht, ku ajo ndoshta takon në qoftë se ne jemi duke u përpjekur për të mbajtur këtë të renditura dhe në qoftë se ju djema mund të merrni një hap prapa kështu që ne nuk bie faza, që do të jetë i madh. Pra, në fakt, Rainbow, fillojnë të gjatë këtu me mua, sepse ne si kompjuter tani mund shohin vetëm një variabël në një kohë. Pra, nëse kjo është nyja e parë. Vini re se ai nuk është një nyje, ai është vetëm një tregues, dhe kjo është arsyeja pse ai është tërhequr në jetë vetëm madhësia e një akrep, nuk një nga ato rectangles të plota. Pra, ne jemi duke shkuar për të kontrolluar në çdo përsëritje është 55 më pak se 9? Jo. Është 55 më pak se 17? Jo. Më pak se 22? Më pak se 26? Më pak se 34? Dhe kështu tani, natyrisht Ylber takon në fund. Pra, të jetë i qartë, dhe çfarë ishte emri yt, Taylor? TAYLOR: Taylor. DAVID Malan: Pra, në mes të Taylor-së dorën e majtë dhe duart ylber këtu, dorën e të cilit ka nevojë për pikë në çfarë në urdhërojnë për të futur 55 në këtë listë? Çfarë duhet të bëjmë? Po? Audienca: dora Taylor ka nevojë për pikë të majtë. DAVID Malan: Pikërisht. Pra futur një nyje në fund të lista është shumë e thjeshtë, sepse Taylor vetëm duhet të theksoj, në vend të në terren ose ne do të thërrasë atë null, null është lloj i mungesës i një tregues apo një të veçantë zero akrep, ju jeni do të vinte me të majtë tuaj dorë në Rainbow dhe pastaj Rainbow, ku duhet të majtë tuaj dorë ndoshta pikë? Poshtë. Kjo nuk është e mirë në qoftë se dora e saj është lloj e vënë off këtu ose ndonjë lloj cila mënyrë. Kjo do të konsiderohet një vlerë të mbeturinave, por në qoftë se ajo vë në disa vlera të njohura, ne do të e quajti atë zero apo null, kjo është në rregull sepse ne kemi një mandat në këtë dhe ne e dimë lista tani është kompletuar. Pra, çfarë është një tjetër Rasti relativisht e thjeshtë? Mund të kemi malloc 5? Eja up. Si e ke emrin? TIFFANY: Tiffany. DAVID Malan: Unë jam i keq? TIFFANY: Tiffany. DAVID Malan: Tiffany. Në rregull. Tiffany është malloced me vlerën e 5. Eja up. Kjo është relativisht e lehtë shumë, por le të konsiderojmë rendit të operacioneve tani. Ajo ishte shumë e lehtë me Taylor në fund. Numri 5 është sigurisht më pak se 9, dhe kështu që ne kemi Davidit, ne kemi Tiffany, dhe çfarë ishte emri juaj? JAKE: Jake. DAVID Malan: Jake. Tiffany, Jake, dhe David. Dora e të cilit duhet të përditësohet së pari? Çfarë bëni ju doni të bëni këtu? Ka mënyra të mundshme një çift, por ka edhe një ose mënyra më të gabuar. Audienca: Filloni me pari nga e majta. DAVID Malan: Filloni me pari nga e majta. Kush është këtu pari nga e majta, atëherë? Audienca: Së pari. DAVID Malan: OK. Pra, fillojë me të parë dhe ku do të doni për të rinovuar duart e Davidit të jetë? Audienca: Drejt 5. DAVID Malan: OK. Kështu Davidi, pikë në pesë ose Tiffany këtu, dhe tani? Audienca: Tiffany vë në 9? DAVID Malan: Perfect, përveç Binky-së kreu vetëm lloj i ra off, e drejtë? Sepse çfarë është e gabuar me kjo foto fjalë për fjalë? Audienca: Asgjë nuk është treguar. DAVID Malan: Asgjë nuk është e duke treguar për Jake tani. Ne kemi jetimë fjalë për fjalë 9 dhe 17, dhe ne kemi fjalë për fjalë rrjedhur gjithë këtë kujtim, sepse nga përditësimin Davidin së pari, kjo është gjobë për aq sa është e saktë duke vënë në Tiffany tani, por në qoftë se askush nuk e kishte largpamësi për pikë në Jake, atëherë ne kemi humbur tërësia e atë listë. Pra, le të prish. Pra, kjo ishte një gjë e mirë për të udhëtim mbi por le të korrigjuar tani. Çfarë duhet të bëjmë për herë të parë në vend? Po? Audienca: Tiffany duhet pikë në 9? DAVID Malan: Unë nuk mund të merrni se afër teje. Kush duhet pikë në 9? Audienca: Tiffany. DAVID Malan: Të gjithë të drejtë. Pra, Tiffany duhet pika e parë në 9. Pra, Tiffany duhet të marrë në një vlerë të njëjtë Davidit, e cila duket tepërt për një moment, por kjo është në rregull, sepse tani, i dyti hap, ne mund update dorën e Davidit për pikë në Tiffany, dhe pastaj nëse Ne vetëm lloj të pastër gjërat sikur kjo është lloj i pranverës-si, tani që është një futje saktë. Në mënyrë të shkëlqyer. Pra, tani ne jemi pothuajse atje. Le të futur një finale vlera si vlera 20. Nëse ne mund të malloc një vullnetar të fundit? Eja up. Pra, kjo është pak më e ndërlikuar. Por me të vërtetë, kodi ne jemi shkrim, megjithëse me gojë, është vetëm si të paturit e një bandë e nëse kushtet tani, apo jo? Ne patëm një kusht kontrolluar nëse ajo i takon në fund, ndoshta fillimi. Ne kemi nevojë për një lloj lak për gjeni vend në mes. Pra, le të bëjë kjo me atë që është emri juaj? ERIC: Eric. DAVID Malan: Eric? Eric. Gëzohem që u njohëm. Pra, ne kemi 20. Më pak se pesë? Jo. Më pak se nëntë? Jo. Më pak se 17? Jo. NE RREGULL. Ai i përket këtu dhe emrat tuaj janë përsëri? SUE: Sue. DAVID Malan: Sue. Alex: Alex. DAVID Malan: Sue, Alex, dhe? ERIC: Eric. DAVID Malan: Eric. Duhet të merrni përditësuar pari duart e së cilës? Audienca: Eric. NE RREGULL. Pra, Eric-së duhet të theksoj se ku? Në 22. Të mirë. Dhe tani çfarë e ardhshme? Sue atëherë mund të nxjerr në Eric dhe tani, në qoftë se ju djema vetëm bëjnë disa dhoma, e cila është gjobë vizualisht, tani ne kemi bërë futjen. Pra, le të tani e konsiderojnë një pyetje, por thank you so much për vullnetarët tanë. Bërë shumë mirë. Ju mund të mbani ato, në qoftë se ju pëlqen. Dhe ne kemi një dhuratë të bukur lamtumire nëse ju do të çdo të doja të marrë një top stresit. Më lejoni vetëm të kalojë këtë poshtë. Pra, çfarë është kryefjala e kësaj? Kjo duket të jetë e mahnitshme për aq sa kemi tani futur një alternativë për një grup që nuk është e kufizuar kështu në një grup të disa madhësinë e caktuar. Ata mund të rriten në mënyrë dinamike. Por, ashtu si kemi parë në javët e e kaluara, nuk kemi marrë ndonjë gjë për të lira, si siguri ka një tregti-off këtu. Pra, me një kokë e një i lidhur Lista është kjo dinamizmi? Kjo aftësi për të rriten dhe sinqerisht, ne mund të kemi bërë fshini dhe ne mund të tkurret si të nevojshme. Çfarë çmimi jemi duke paguar? Dy herë më shumë hapësirë, para së gjithash. Nëse ju shikoni në foto, nuk është më jam ruajtjen e një listë të integers. Unë jam ruajtjen e një listë të integers plus pointers. Kështu që unë jam duke dyfishuar sasinë e hapësirës. Tani, ndoshta kjo nuk është e tillë një punë e madhe 4 bytes, 8 bytes, por ajo me siguri mund të shtoni up për dhënave grupe të mëdha. Çfarë është një tjetër downside? Po? Audienca: Ne duhet të kaloj ato një-nga-një. DAVID Malan: Po. Ne duhet të kaloj nëpër ato një-nga-një. Ti e di atë, që hoqi dorë këtë super tipar i përshtatshëm i kllapa katrore simbol, më duhet i njohur si qasje të rastit, ku ne vetëm mund të kërcejnë një element individual por tani, nëse unë ende kishte vullnetarët e mia këtu, nëse kam kërkuar për të gjetur numër 22, unë nuk mund të hidhen në kllapa diçka diçka. Unë duhet të shikoni mbi listë, shumë si shembujt tanë kërkim linear, për të gjetur numrin 22. Kështu që ne duket se kanë paguar një çmim atje. Por ne mund megjithatë zgjidhjen e problemeve të tjera. Në fakt, më lejoni të prezantoj vetëm disa visuals. Pra, nëse ju keni qenë deri në Dining Hall Mather-së kohët e fundit, ju do të kujtojnë se tyre oxhaqet e tabaka si kjo, ne huazuar këto nga Annenberg para klasës. Pra, kjo rafte e tabaka, edhe pse, është përfaqësues në fakt e një strukture të dhënave shkenca kompjuterike. Nuk është një strukturë e të dhënave në shkenca kompjuterike i njohur si një pirg që shumë të bukur jep veten për të pikërisht kjo vizuale. Kështu që nëse secili prej këtyre sirtarë nuk është tabaka por si një numër dhe kam kërkuar për të ruajtur numrat, unë mund të vënë një poshtë këtu, dhe unë mund të vënë një tjetër poshtë këtu, dhe vazhdojnë stacking numrat në krye të njëri-tjetrit, dhe çfarë është potencialisht të dobishme në lidhje me këtë është se çfarë është implikimi e kësaj strukture të dhënave? Numri i të cilëve mund të tërhiqet nga për herë të parë më e përshtatshme? Fjalët më të fundit ai vuri në atje. Pra, kjo është ajo që ne do të thërrasë në shkenca kompjuterike një strukturë të dhënave LIFO. Zgjasë në, nga e para. Dhe ne do të shohim para se të gjatë pse që mund të jenë të dobishme, por tani për tani, vetëm e konsiderojnë pronën. Dhe kjo është lloj i trashë në qoftë se ju mendoni se për mënyrën se si sallë ngrënie e bën këtë. Sa herë që ata tabaka të pastër dhe vënë ato freshest në krye, ju mund të ketë një të pastër më parë por në fund shumë të pista dhe me pluhur tabaka në fund shumë në qoftë se ju në fakt nuk të marrë në fund të atij rafte, sepse ju vetëm mbani vënë re dhe ato të pastra në krye të saj. E njëjta gjë mund të ndodhë në një supermarket shumë. Në qoftë se ju keni një rast ekran e qumështit dhe çdo herë CVS ose kushdo që merr më shumë qumësht, ju vetëm të fus milks ju tashmë keni në pjesën e pasme dhe ju vënë ato të reja që në fillim, ju jeni do të ketë disa mjaft e keqe qumeshti në fund të strukturës së të dhënave, sepse ajo është gjithmonë në fund apo ekuivalente është gjithmonë në pjesën e prapme. Por ka një mënyrë tjetër për të menduar për rreshtuar dhënat dhe për shembull, kjo. Nëse ju jeni një nga ata njerëz që i pëlqen të vijë deri jashtë dyqaneve Apple kur një produkt i ri vjen jashtë, ju jeni me siguri jo duke përdorur një të dhënave rafte Struktura sepse ty do të armiqësohet me të gjithë të tjerët që është rreshtuar për të blerë disa lodër të re. Përkundrazi, ju jeni me siguri duke përdorur çfarë lloj strukture të dhënave ose çfarë lloj sistemi në botën reale? Shpresojmë se kjo është një vijë, ose më shumë siç duhet ose më shumë britanike-si, një radhë. Dhe kjo rezulton një radhë është edhe një Struktura e të dhënave në shkenca kompjuterike, por një radhë ka një shumë të pronë të ndryshme. Kjo nuk është LIFO. Zgjasë në, nga e para. Zoti na ruajt. Është vend FIFO. Së pari në, nga e para. Dhe kjo është një gjë e mirë për hir të ndershmërisë " sigurisht kur ju jeni rreshtim up super herët në mëngjes. Nëse ju merrni atje të parë, ju doni të merrni nga e para si. Dhe kështu të gjitha këto të dhëna strukturat, radhët e gjata dhe oxhaqet dhe bunches e të tjerëve, rezulton nga ju mund të mendojnë për këtë si vetëm një grup. Ky është një grup, ndoshta një madhësi fikse 4, por ajo do të të jetë lloj i mirë në qoftë se ne mund vetëm grumbull tabaka pothuajse pafundësisht i gjatë, nëse ne kanë që tabaka shumë ose numra. Pra, ndoshta ne duam të përdorni një listë e lidhur këtu, por tregti-off do të jetë potencialisht se ne kemi nevojë për më shumë memorie, merr pak më shumë kohë, por ne nuk e kufizojnë lartësinë e rafte, shumë si rast Mather ekranit mund të kufizojë madhësinë e rafte, dhe kështu që këto janë vendime të projektimit ose opsione në dispozicion për ne fund të fundit. Pra, me këto të dhëna strukturave, ne kemi filluar shohim kufijtë e sipërm të reja potencialisht në atë që ishte më parë super të shpejtë dhe ku ne do të largohet off sot dhe ku ne do të shpresojmë për të marrë në është të mërkurën, ne do të filloni të shikoni në një të dhënave strukturë që lejon të hetojmë përmes të dhënave në log kohë në fund përsëri. Dhe ne pamë se, kujtojnë, në javën zero dhe një me kërkimin binar apo ndarjes dhe të pushtuar. Ajo vjen mbrapa dhe më mirë akoma, Grail shenjtë për këtë të mërkurën do të jetë për të dalë me Struktura e të dhënave që shkon me të vërtetë ose teorikisht në kohë konstante, ku kjo nuk ka rëndësi se sa shumë miliona apo miliarda gjërave ne kemi në strukturën e të dhënave, ajo do të të na marrë kohë të vazhdueshme, ndoshta një hap ose dy hapa, ose 10 hapa, por numrat e vazhdueshme të hapave për të kërkuar përmes kësaj strukture të dhënave. Kjo me të vërtetë do të jetë Grail shenjtë por më shumë se të mërkurën. Shih ya pastaj. [Muzika]