[Powered by Google Translate] [6 skirsnis] [patogiau] [Rob Bowden] [Harvardo universiteto] [Tai CS50.] [CS50.TV] Mes galime galvą į mūsų skyriuje klausimų. Aš siunčiau URL erdvėje prieš. Klausimus skyriuje pradžia pasakyti matyt, aš nesu visiškai unsick yra labai paprastas klausimas tik tai, kas Valgrind? Ką Valgrind daryti? Kiekvienas nori pasakyti, ką Valgrind? [Studentų] Patikrinimai Atminties nutekėjimas. Taip, Valgrind bendras atminties tikrintuvas. , Galų gale, jis jums pasakys, jei turite Atminties nutekėjimas, , tai daugiausia, ką mes naudojame jį, nes jei norite padaryti problemą, arba, jei norite gauti didelis valdyboje, ką jums reikia turėti jokių Atminties nutekėjimas, ir jei turite Atminties nutekėjimas, kad jūs negalite rasti, Taip pat reikia nepamiršti, kad kai atidarote failą ir jei ne uždaryti, tai atminties nutekėjimas. Daug žmonių ieško kai mazge, kad jie ne išlaisvina kai iš tiesų jie nebuvo uždaryti žodyną labai pirmą žingsnį. Ji taip pat sako jums, jei turite kokių nors neteisingas skaito ar rašo tai reiškia, jei jūs bandote ir nustatyti vertę , kad ne krūvos pabaigoje ir tai neatsitinka seg kaltės bet Valgrind sugauti jį, kaip jūs iš tikrųjų neturėtų būti raštu yra, ir todėl jums tikrai turėtų neturėti bet iš tų, arba. Kaip jūs naudojate Valgrind? Kaip jūs naudojate Valgrind? Tai yra bendras klausimas rūšies paleiskite jį ir pažvelgti produkcijos. Produkcija yra didžioji daug kartų. Yra taip pat įdomus klaidų, kur, jei turite šiek tiek siaubingai blogai vyksta kilpa, tada ji bus galiausiai pasakyti ", būdas per daug klaidų. Aš ruošiuosi sustabdyti skaičiavimo dabar. " Tai iš esmės yra tekstinė produkcija, jūs turite išanalizuoti. , Galų gale, jis jums pasakys, jokių Atminties nutekėjimas, kad jūs turite, kaip daugelis blokai, kurie gali būti naudinga, nes jei tai vieno kvartalo unfreed, tada ji paprastai būtų lengviau rasti nei 1.000 blokai unfreed. 1000 blokai unfreed tikriausiai reiškia, kad jūs ne išlaisvina Jūsų susiję sąrašai tinkamai ar kažką. Tai Valgrind. Dabar mes turime skyrių klausimų, , kurie jums nereikia atsisiųsti. Jūs galite spustelėti ant mano vardo ir traukti juos erdvėje. Dabar paspauskite ant manęs. Peržiūra 1 bus kamino, kurį mes darote pirmiausia. 2 redakcija bus eilėje, ir 3 redakcija bus atskirai susijęs sąrašas. Pradedant nuo mūsų kamino. Kaip ji sako, čia, kamino yra vienas iš pagrindinių, pagrindinės duomenų struktūros kompiuterių. Labai prototipu pavyzdys padėklai ir valgomajame kamino. Tai iš esmės, kai jūs diegiamos į kamino, kažkas vyksta pasakyti: "O, kaip padėklai kamino." Jūs sukrauti dėklus. Tada, kai jūs einate į traukite dėklą, , kad manimi vis ištrauktas pirmasis dėklas yra paskutinis, kuris buvo įtrauktas į kamino. Kamino taip pat, kaip ji sako, čia- mes turime atminties segmentą vadinamas kamino. Ir kodėl jis vadinamas kamino? Nes kaip kamino duomenų struktūros, verčia ir pasirodo ant kamino kamino rėmus, kur kamino rėmai yra kaip konkrečiu kvietimo funkcijos. Ir kaip kamino, jūs visada turite grąžinti skambinimo funkcijos prieš galite kibti į mažesnes kamino kadrų iš naujo. Jūs negalite turėti pagrindinį skambučių foo skambučio baras ir baras grįžti į Pagrindinis tiesiogiai. Jis visada turiu teisingą krūvą stumti ir Popping. Abi operacijos, kaip sakiau, yra push ir pop. Tai yra universalūs terminai. Turėtumėte žinoti, push ir pop kaminai, nesvarbu koks. Mes pamatysime, eiles rūšies skiriasi. Jis nėra iš tikrųjų yra universalus terminas, bet push ir pop yra universalus kaminai. Push yra tiesiog įdėti į steką. Pop kilimo kamino. Ir mes matome čia mes turime Typedef struct kamino, todėl mes turime char ** eilutes. Negalima nusigąsti bet **. Tai va, galų gale yra eilučių masyvas ar patarimų masyvas simbolių, kur rodykles į simbolių linkę būti stygos. Ji neturi būti stygos, bet čia jie ketina būti stygos. Mes turime eilučių masyvą. Mes turime dydį, kuris atstovauja, kiek elementai šiuo metu yra kamino, ir tada mes turime gebėjimus, kurie yra kiek elementai gali būti ant kamino. Galią reikėtų pradėti, kaip kažkas, didesnis nei 1, bet dydis ketina pradėti nuo 0. Dabar, iš esmės yra trys būdai, galite galvoti apie kamino. Na, yra tikriausiai daugiau, bet yra du pagrindiniai būdai galima įgyvendinti naudojant masyvą, arba galite ją įgyvendinti naudojant susietą sąrašą. Susietos sąrašai rūšies trivialus, kad kaminai. Tai labai lengva padaryti kamino susietų sąrašus, todėl čia mes ketiname padaryti kamino naudojant masyvų, ir tada naudojant masyvų, yra du būdai, galite galvoti apie tai. Anksčiau, kai aš sakiau, mes turime kamino pajėgumus, todėl gali tilpti ant kamino elementas. Vienas iš būdų tai gali įvykti, kai paspausite 10 elementus, tada jūs baigsite. Galbūt žinote, kad yra viršutinė riba 10 dalykų pasaulyje kad jūs niekada negali turėti daugiau kaip 10 dalykų apie savo kamino, tokiu atveju jūs galite turėti savo kamino dydžio viršutinė riba. Arba galite turėti savo kamino būti neribotą, tačiau, jei jūs darote masyvą, tai reiškia, kad kiekvieną kartą, kai paspausite 10 elementų, tada jūs ketinate turi išaugti iki 20 elementų, ir, kai paspausite 20 elementus, jūs ketinate turi augti savo 30 elementų arba 40 elementų masyvas. Jūs ketinate reikia didinti pajėgumus, o tai, ką mes ketiname daryti čia. Kiekvieną kartą, mes pasiekiame maksimalų dydį mūsų kamino, kai mes stumti kažką kita, mes ketiname reikia didinti pajėgumus. Čia mes turime stumti deklaruoti kaip Bool paspaudimu (char * str). Char * g yra eilutė, kad mes stumti ant kamino, ir bool tiesiog sako, ar mums pavyko ar nepavyko. Kaip mes galime žlugti? Kas yra vienintelė aplinkybė, kad galite galvoti apie kur mes būtume reikia grįžti klaidinga? Taip. [Studentų] Jei ji yra pilna ir mes naudojame apribotas įgyvendinimą. Taip, taip, kaip mes nustatyti Jis atsakė jei ji yra pilna ir mes naudojame apriboti įgyvendinimą. Tada mes būtinai grįžkite klaidinga. Kuo greičiau mes nukentėjo 10 dalykų masyve, mes negali tilpti 11, todėl mums gražins false. Ką daryti, jei jis yra neaiškus? Taip. Jei jūs negalite išplėsti dėl kokios nors priežasties masyvo. Taip, kad atmintis yra ribotas išteklius, ir, galiausiai, jei mes nuolat stumia daiktus ant kamino vėl ir vėl, mes ketiname išbandyti ir skirti didesnį masyvo, kad tilptų didesnės talpos, ir malloc ar kokia mes naudojame ketina gražins false. Na, malloc grąžina NULL. Atminkite, kad kiekvieną kartą jūs kada nors skambinti malloc, jums turėtų būti patikrinti, ar jis grąžina NULL ar kitur kad yra teisingumas atskaita. Kadangi mes norime turėti neribotos kamino, Vienintelis atvejis, mes ketiname grįžti klaidinga, jei mes bandome padidinti pajėgumus ir malloc arba bet False. Tada pop nesiima jokių argumentų, ir ji grąžina eilutę, kuri yra ant kamino viršuje. Nepriklausomai nuo neseniai buvo stumiama ant kamino, ką pop grįžta, ir ji taip pat pašalina jį iš kamino. Ir pastebėjo, kad ji grąžina NULL, jei nėra nieko, kas kamino. Tai visada įmanoma, kad lapų krūva yra tuščias. "Java", jei esate pripratę, kad arba kitomis kalbomis, bando, kad pop iš tuščio kaminą gali sukelti išimtį, ar kažką. Tačiau C, null tipo daug atvejų, kaip mes sprendžiame šias problemas. Grįžęs null, yra tai, kaip mes ketiname reiškia, kad kamino buvo tuščias. Mes pateikiame kodą, kuris bus išbandyti Jūsų žetonų funkcionalumą, įgyvendinti stumti ir pop. Tai nebus daug kodo. Aš iš tiesų tai, kol mes tai padaryti, užuomina, patarimas- jei jūs dar nematėte, malloc yra ne tik funkcija , kad suteikiama atmintį krūvą už jus. Yra šeimos ALLOC funkcijų. Pirmasis malloc, kuriuos esate pripratę. Tada ten calloc, kuris daro tą patį, ką malloc tačiau ji bus nulio viską už jus. Jeigu jūs kada nors norėjo nustatyti viską null po mallocing kažką jums turėtų būti tik naudojamas calloc į pirmąją vietą, o ne raštu kilpos nulio visą atminties blokas. Realloc kaip malloc ir turi daug ypatingais atvejais, bet iš esmės tai realloc nėra ji užima žymeklį, kad jau buvo skirta. Realloc yra funkcija, norite, kad atkreipti dėmesį į čia. Ji mano, kad jau grįžo iš malloc rodyklę. Tarkime, jūs reikalauti iš malloc žymiklį 10 baitų. Vėliau jūs suprasite, jūs norėjote 20 baitų, todėl jūs vadinate realloc tą rodyklė su 20 baitų, ir realloc bus automatiškai nukopijuoti per viską už jus. Jei tiesiog vadinamas malloc vėl, kaip aš turiu 10 baitų bloką. Dabar turiu 20 baitų bloką, , todėl, jei aš malloc 20 baitų, tada aš turiu rankiniu būdu nukopijuoti per 10 pirmas dalykas, baitus į antrąjį dalyką, ir tada pirmas dalykas. Realloc atliks už jus. Pranešimas parašas bus negaliojantis * kuris yra tik grąžinti žymiklį į atminties bloką, tada void * ptr. Jūs galite galvoti Lytinis * kaip bendrinis rodyklė. Apskritai, jūs niekada susidoroti su void *, bet malloc grąžinti void *, ir tada ji tiesiog naudojamas kaip tai tikrai bus char *. Ankstesnis void *, kad buvo grąžintos malloc dabar vyksta, turi būti perduota realloc ir tada dydis yra naujas baitų skaičius, kuriuos norite skirti, kad jūsų naujas pajėgumas. Aš duosiu jums keletą minučių, ir tai padaryti mūsų erdvės. Pradėti su redakcijos 1. Aš sustabdyti tave po to, kai, tikiuosi, apie pakankamai laiko įgyvendinti stumti, ir tada aš duosiu jums kitą pertraukos pop. Bet tai tikrai nėra, kad daug kodas ne visi. Labiausiai kodas yra tikriausiai plėsti dalykų, plėsti pajėgumus. Gerai, jokio spaudimo, turi būti visiškai padaryta, bet kaip ilgai, kaip jūs manote, kaip jūs teisingu keliu, tai gerai. Ar kas nors turi bet kokį kodą, jie jaučiasi patogiai su manimi traukdami? Taip, aš noriu, bet Ar kas nors turite kodą, galiu atsigriebti? Gerai, jūs galite pradėti, jį išsaugoti, kokia ji yra? Aš visada pamiršti šį žingsnį. Gerai, stumti, norite paaiškinti savo kodą? [Studentų] Visų pirma, aš padidino dydį. Manau, gal man reikia, kad vistiek, aš padidino dydį, ir aš pamatyti, jei jis mažiau nei pajėgumų. Ir jei tai mažiau nei pajėgumų, galiu pridėti į masyvą, kad mes jau turime. Ir jei ne, Aš padauginsiu pajėgumus 2, ir aš perskirstyti stygos masyvo kažką su didesnių pajėgumų dydį. Ir tada, jei ir tai nepadeda, sakau vartotoją ir gražins false, ir, jei viskas gerai, tada aš įdėti eilutę į naują vietą. [Rob B.] Taip pat pastebėsite, kad mes naudojamas gražią Bitinis operatorių čia padauginti iš 2. Atminkite, kad kairysis SHIFT visada bus padaugintas iš 2. Teisė Shift padalinti iš 2, tol, kol jūs žinote, kad tai reiškia, padalinti iš 2, kaip sveikasis skaičius, padalytas iš 2. Tai gali trumpinti 1 čia arba ten. Tačiau perėjimas paliko 1 visada bus padaugintas iš 2, nebent jūs perpildymo skaitinę ribas, ir tada ji nebus. Pusė komentaras. Man patinka, do-tai nesiruošia keisti kodavimo kokiu nors būdu, bet man patinka daryti kažką panašaus į tai. Ji iš tikrųjų vyksta, kad jis šiek tiek ilgesnis. Gal tai ir nėra tobulas, rodo, kad tai, bet man patinka ją išskaidyti į šių trinkelės gerai, jei tai, jei atsitinka, tada aš ruošiuosi ką nors padaryti, ir tada funkcija atliekama. Man nereikia tada pereikite visą kelią žemyn mano akys funkcijos pamatyti, kas atsitiks po else. Tai, jei tai, jei atsitinka, tada aš tiesiog grįžti. Ji taip pat turi gražią viską, išskyrus tai papildoma nauda dabar pasislinks kairėn vieną kartą. Aš nebereikia į jei jūs kada nors šalia juokingai ilgas eilutes, tada tie 4 baitai gali padėti, ir taip pat daugiau į kairę, kad kažkas yra, mažiau priblokšti jūs manote, jei patiko-gerai, turiu prisiminti Aš šiuo metu while cikle viduje kitas viduje už linijos. Bet jūs galite padaryti šią deklaraciją iš karto, aš tipo kaip. Tai visiškai nebūtina ir nėra jokiu būdu tikimasi. [Studentų] dydis - Gedimams būklės? Čia nepavyks sąlyga mums nepavyko realloc, taip taip. Atkreipkite dėmesį, kaip Gedimams sąlyga, matyt, vėliau, nebent mes free stuff, mes visada vyksta, kad žlugtų nesvarbu, kiek kartų mes bando stumti kažką. Jei mes nuolat stumia, mes nuolat pokyčio dydį, nors mes nieko nedėti ant kamino. Paprastai mes neturime prieaugio dydį iki po to, kai sėkmingai padėkite jį ant kamino. Mes norėtume tai padaryti, pasakyti, ar čia ir čia. Ir tada vietoj sakydamas s.size ≤ pajėgumus, tai mažiau nei pajėgumų, tik todėl, kad mes persikėlė, kur viskas buvo. Ir atminkite, kad vienintelė vieta, kad mes galbūt gražins false yra čia, kur realloc grįžo null, ir, jei atsitiktų prisiminti standartinė paklaida, gal galite apsvarstyti šį atvejį, kai norite spausdinti standartinė paklaida, tiek fprintf stderr, o ne tik spausdinimo tiesiogiai iš standartinės. Vėl, kad lūkesčiai, bet jei tai klaida, įveskite printf, tada jūs galbūt norėsite, kad ji spausdinti standartinė paklaida, o ne standartinio out. Kiekvienas turi nieko kito, į kuriuos reikėtų atkreipti dėmesį? Taip. [Studentų] Ar jūs einate per [negirdimo]? [Rob B.] Taip, faktinis binariness apie tai, ar tai, ką ji yra? [Studentų] Taigi jūs padauginkite jį iš 2? [Rob B.] Taip, iš esmės. Dvejetainiu žemės, mes visada turime skaitmenų rinkinys. Perėjimas Tai paliko 1 esmės įterpia jį čia dešinėje pusėje. Grįžti į, tiesiog prisiminti, kad viską, dvejetainis 2 galia, todėl tai yra 2 su 0, tai 2 į 1, tai 2 su 2. Įrašant 0 iki dešinėje pusėje dabar, mes tiesiog perkelti viską, per. Kas anksčiau buvo su 0 2 2 į 1, 2 į 2. Dešinėje pusėje, kad mes įterpiamas yra visada lygi 0, kuri turi prasmę. Jeigu jūs kada nors padauginti skaičių iš 2, jis nesiruošia baigti keista, 2 0 Talpinti turėtų būti 0, ir tai, ką I pusm perspėjo apie prieš tai, jei atsitiktų pereiti už bitų sveikasis skaičius, 1 dalis ketina baigti vyksta ne. Tai tik nerimauti, jei atsitiktų būti susijusios su tikrai dideliems pajėgumams. Bet tuo momentu, tada jūs susiduriame su milijardų dalykų masyvo, kuris gali tilpti į atmintį vistiek. Dabar mes galime gauti pop, kuri yra net lengviau. Tai galite padaryti patinka, jei atsitiktų pop visa krūva, ir dabar jūs pusę galingumo, vėl. Jūs galite realloc trauktis atminties kiekį turite, tačiau jūs neturite jaudintis dėl to, kad tik realloc atveju bus auganti atminties, niekada mažėja atmintį, ketina padaryti pop super lengva. Dabar eilės, kurie ketinate būti kaip kaminai, bet tam, kad jūs imtis ko yra atstatomas. Prototipinę pavyzdys eilėje yra linija, todėl aš manau, jei buvo anglų kalba, aš gi būtų galėjęs pasakyti prototipinę eilėje pavyzdys yra eilė. Taigi, kaip, jei esate pirmasis asmuo, linijos, linijos jūs tikitės būti pirmasis asmuo iš linijos. Jei esate paskutinis žmogus linijos, jūs ketinate būti paskutinis žmogus aptarnauja. Mes vadiname, kad FIFO modelį, o kamino LIFO modelis. Tie žodžiai yra gana universalus. , Pavyzdžiui, vamzdžiai ir skirtingai masyvai, eilės paprastai neturi leisti prieigą prie viduryje. Čia, kamino, mes turime push ir pop. Čia mes atsitiktų, kad pakvietė juos į eilę ir dequeue. Aš taip pat girdėjau, juos vadinamas kaitą ir unshift. Aš girdėjau, žmonės sako, push ir pop taip pat taikomos eilėse. Aš girdėjau, įterpti, pašalinti, stumti ir pop, jei tu kalbi apie kaminai, esate stumti ir Popping. Jei jūs kalbate apie eiles, galite pasirinkti žodžius, kuriuos norite naudoti įdėti ir išimti, ir nėra sutarimo, ką ji turėtų būti vadinama. Bet čia mes turime į eilę ir dequeue. Dabar struct atrodo beveik identiškas struct kamino. Bet mes turime sekti galvos. Manau, kad tai sako žemai čia, bet kodėl mes turime galvą? Prototipai, yra iš esmės identiškas stumti ir pop. Jūs galite galvoti apie tai, kaip stumti ir pop. Vienintelis skirtumas yra pop grįžta vietoj iš paskutiniųjų, tai grąžina. 2, 1, 3, 4, ar kažką. Ir štai pradžia. Mūsų eilėje yra visiškai pilnas, todėl jame yra keturi elementai. Mūsų eilėje galas yra 2, ir dabar mes einame įterpti ką nors kita. , Kai norime įterpti tą kažką kitą, ką mes padarėme, kamino versija mes praplėtėme mūsų atminties blokas. Kas yra su šia problema? [Studentų] Jūs perkeliate 2. Ką aš sakiau, apie eilės galą, tai nėra prasmės, kad mes pradėti nuo 1, tai mes norime dequeue 1, tada dequeue 3, kaip dequeue 4, tada dequeue 2, tada dequeue šį vieną. Mes negalime naudoti realloc dabar arba bent jau, turite naudoti realloc kitaip. Bet jūs tikriausiai turėtų ne tik naudotis realloc. Jūs ketinate turėti rankiniu būdu nukopijuoti savo atmintį. Yra dvi funkcijos kopijuoti atmintį. Yra memcopy ir memmove. Aš šiuo metu skaitau vyras puslapių ir pamatyti kuris iš jų jūs ketinate norite naudoti. Gerai, memcopy, skirtumas yra kad memcopy ir memmove, rankenos bylą teisingai kur jūs kopijuoti į regioną, kuris atsitinka uždengti regioną jūs kopijuoti. Memcopy netvarko. Memmove. Jūs galite galvoti apie AS-problemos tarkim noriu nukopijuoti šį vaikiną, šis vaikinas per šių keturių. , Galų gale, kas masyvas turėtų atrodyti po to, kai kopija 2, 1, 2, 1, 3, 4, ir tada kai pabaigoje stuff. Bet tai priklauso ta tvarka, kuria mes iš tikrųjų kopijuoti, nes, jei mes negalime atsižvelgti į tai, kad šis regionas mes kopijavimo į sutampa mes Kopijuojant iš, tada mes galime daryti, kaip pradžioje čia, kopijuoti norime eiti į vietą, 2, tada perkelkite savo rodykles į priekį. Dabar mes ketiname būti čia ir čia, ir dabar mes norime kopijuoti tai vėl šis vaikinas vaikinas ir perkelti savo rodykles į priekį. Ką mes ketiname baigti gauti yra 2, 1, 2, 1, 2, 1 vietoj tinkamu 2, 1, 2, 1, 3, 4, nes 2, 1 svarbesnis nei originalus 3, 4. Memmove rankenos, kad teisingai. Šiuo atveju, iš esmės tiesiog visada naudokite memmove , nes ji elgiasi teisingai. Ji paprastai neatlieka, bet dar blogiau. Idėja yra, o ne pradėti nuo pradžių, ir tokiu būdu kopijavimo kaip mes čia ką tik padarė, ji prasideda nuo pabaigos ir kopijuoja, ir tuo atveju, jūs niekada negali turėti problemą. No performance prarasti. Visada naudokite memmove. Niekada nerimauti memcopy. Ir tai, kai jūs ketinate turi atskirai memmove dalis apvyniotas aplink savo eilės. Jokių rūpesčių, jei ne visiškai padaryta. Tai sunkiau, nei Stack, stumti, ir pop. Kas nors turite kodą, mes galime dirbti su? Net jei visiškai neišsamūs? [Studentų] Taip, tai visiškai neišsami, nors. Visiškai neišsamūs yra gerai tol, kol mes galite išsaugoti naujo? Aš pamiršti, kad kiekvieną kartą. Gerai, ignoravimas, kas atsitinka, kai mes turime dydį dalykų. Visiškai ignoruoti keisti. Paaiškinkite šį kodą. Aš patikrinti pirmiausia, jei dydis yra mažesnis nei kopijos, visų pirma ir tada po to, įterpti I galva + formato, ir aš įsitikinkite, kad antklodės aplink masyvo talpa, ir aš įterpti naują eilutę toje pozicijoje. Tada aš padidinti dydžio ir return true. [Rob B] Tai tikrai vienas iš tais atvejais, kai jūs ketinate nori būti naudojant mod. Bet koks atveju natūra, kai jūs turite vyniojimo aplink, jei manote, vyniojimo aplink, nedelsiant mintis turėtų būti mod. Kaip greitai optimizavimo /, kad jūsų kodas vieną eilutę trumpesnis, jūs pastebėsite, kad linijos iš karto po šį vieną yra tik dydis + +, todėl jūs sujungti, kad į šią eilutę, dydis + +. Dabar žemyn čia, turime bylą jei mes neturime pakankamai atminties, todėl mes padidinti mūsų galimybes 2. Manau, galima su ta pačia problema čia, bet mes galime ignoruoti jį dabar, kur, jei nepavyko padidinti savo pajėgumus, tada jūs ketinate norite sumažinti savo pajėgumą 2 vėl. Kitas trumpos pastabos yra tik kaip jūs galite padaryti + =, taip pat galite padaryti << = Beveik viską galima eiti prieš lygus, + =, | =, & =, << = Char * nauja yra mūsų naujas atminties blokas. O, kaip čia. Ką žmonės galvoja apie mūsų naują atminties bloko tipo? [Studentų] Tai turėtų būti char **. Mintys atgal į mūsų struct čia, stygos yra tai, ką mes perskirstyti. Mes darome visą naują dinamišką saugojimo eilės elementų. Ką mes ketiname būti paskirti savo stygos yra tai, ką mes mallocing dabar, ir toks naujas bus char **. Tai bus eilučių masyvas. Tada, kas yra iš tikrųjų, pagal kurias mes ketiname grįžti klaidinga? [Studentų] turėtume daryti char *? [Rob B.] Taip, geras skambutis. [Studentų] Kas tai buvo? [Rob B] Mes norėjome padaryti dydį char *, nes mes nebe- tai iš tiesų būtų labai didelė problema, nes sizeof (char) būtų 1. Sizeof char * bus 4, todėl daug kartų, kai jūs susiduriame su int jūs linkę išeiti su juo, nes dydis int ir dydžio int * 32-bitų sistemos bus tas pats. Bet čia, sizeof (char) ir sizeof (char *) dabar bus tas pats. Kokia yra situacija, kai mes gražins false? Studentų] Nauja yra tuščias. Taip, jei naujas, yra nulis, gražins false, ir aš ruošiuosi mesti čia [Studentų] [nesigirdi] [Rob B] Taip, tai yra gerai. Jūs galite arba daryti 2 kartus pajėgumų arba pajėgumų perkėlimas 1 ir tik tada nustatyti, kad jis čia ar kokia. Mes tai padaryti, kaip mes tikėjomės. Talpa >> = 1. Ir jūs niekada nereikės nerimauti apie prarasti 1 vietą nes jums paliko atitraukiama 1, 1 vieta būtinai yra 0, tiek teisę perkeliant į 1, jūs vis dar ketinate būti bauda. [Studentų] Ar jums reikia padaryti, kad prieš grįžimą? [Rob B] Taip, tai daro absoliučiai jokios prasmės. Tarkime, mes ketiname baigti grįžtant true iki galo. Taip, kaip mes ketiname daryti šias memmoves, mes turime būti atsargūs su tuo, kaip mes juos. Ar kas nors turi kokių nors pasiūlymų, kaip galėtume padaryti juos? Štai mūsų pradžia. Neišvengiamai, mes norime vėl pradėti iš pradžių ir kopijuoti dalykų iš ten, 1, 3, 4, 2. How do you do? Pirma, aš turiu ieškoti žinyno puslapyje memmove vėl. Memmove argumentų, kad visada yra svarbus. Mes norime, kad mūsų tikslą, šaltinis, antra, dydis 3.. Yra daug funkcijų, kurios Grįžtamieji šaltinį ir paskirties. Paskirtis, šaltinis yra linkęs būti nuoseklūs šiek tiek. Perkelti, kokia ji grįžta? Jis grąžina rodyklę į paskirties vietą, dėl kokios nors priežasties jūs galbūt norėsite, kad. Galiu įsivaizduoti jį perskaityti, bet mes norime pereiti į mūsų tikslą. Kas yra mūsų tikslas bus? [Studentų] Naujas. [Rob B] Taip, ir kur mes kopijuojant iš? Pirmas dalykas, kurį kopijuojate tai 1, 3, 4. Kas yra-tai 1, 3, 4. Kas yra šio straipsnio 1 adresas? Kas yra adresas, kad 1? [Studentų] [nesigirdi] [Rob B.] Pagrindinis + pirmojo elemento adresas. Kaip mes pirmą masyvo elementą? [Studentų] eilėje. [Rob B] Taip, q.strings. Atminkite, čia, mūsų galva 1. Darn. Aš tiesiog manau, kad tai stebuklingai- Čia, mūsų galva 1. Aš ruošiuosi pakeisti savo spalvą. Ir čia yra stygos. Tai, mes galime arba parašyti, kaip mes padarėme per čia su galvutėmis + q.strings. Daugybė žmonių taip pat parašyti ir q.strings [vadovas]. Tai tikrai nėra mažiau efektyvus. Jūs galite galvoti apie tai, kaip jūs dereferencing jį ir tada gauti adresą, bet kompiliatorius jį išversti, ką mes turėjome anksčiau vistiek, q.strings + galvos. Bet kokiu atveju, jūs norite galvoti apie tai. Ir kiek baitų mes norime kopijuoti? [Studentų] Talpa - galva. Talpa - vadovas. Ir tada jūs visada galėtų surašyti pavyzdį išsiaiškinti, ar tai tiesa. [Studentų] Reikia padalinti iš 2, tada. Taip, todėl aš manau, mes galime naudoti dydžio. Mes vis dar turime dydis- dydis, turime dydis lygus 4. Mūsų dydis yra 4. Mūsų galva 1. Mes norime nukopijuoti šiuos 3 elementus. Štai normalumas patikrinti, kad dydis - galva teisingai 3. Ir grįžta čia, kaip mes minėta anksčiau, jei mes pajėgumus, tada ir mes padalinti iš 2 , nes mes jau išaugo savo gebėjimus, todėl vietoj, mes ketiname naudoti dydžio. Kuri kopijuoja ta dalis. Dabar, mes turime nukopijuoti kitą dalį, tą dalį, kuri yra į kairę nuo pradžios. , Kad ketina memmove padėtį, į tai, ką? [Studentų] Plius dydis - vadovas. Taip, kad mes jau nukopijuoti dydžio - galvos baitų, ir taip, kur mes norime kopijuoti likusių bytes naujo ir tada dydis minus gerai, Skaičius baitų, mes jau nukopijuotas. Ir tada kur mes kopijuojant iš? [Studentų] Q.strings [0]. [Rob B] Taip, q.strings. Mes galime daryti ir q.strings [0]. Tai yra kur kas mažiau paplitęs, nei šis. Jei jis tiesiog bus 0, tada jūs linkę pamatyti, q.strings. Štai kur mes kopijuojant iš. Kiek baitų mes nepaliko kopijuoti? >> [Studentų] 10. Į dešinę. [Studentų] Ar mes turime daugintis 5 - 10 kartų dydis baitais arba kažkas? Taip, kad tai yra kur kas tiksliai yra kopijavimo? [Studentų] [nesigirdi] Kas yra dalykas, mes kopijavimo tipas? [Studentų] [nesigirdi] Taip, kad char * s, kad mes kopijuoti, mes nežinome, kur jie yra tiekiamos iš. Na, kur jie rodo, kaip stygos, mes galų gale stumti ant eilėje arba enqueuing ant eilėje. Kai kurie iš, neįsivaizduoju. Mes tiesiog reikia sekti char * s patys. Mes nenorime kopijuoti dydis - galvos baitų. Mes norime kopijuoti dydis - galvos char * s, todėl mes ketiname padauginti sizeof (char *). Tas pats žemyn čia, galva * sizeof (char *). [Studentų] Kas apie [nesigirdi? Tai čia? [Studentų] Ne, žemiau, kad dydis - vadovas. [Rob B.] Tai čia? Rodyklė aritmetika. Kaip rodyklė aritmetinis ketina dirbti automatiškai padaugins iš dydžio, tipo, kad mes susiduriame su. Tiesiog patinka čia, nauja + (dydis - vadovas) yra tiksliai ekvivalentiški & naujame [DYDIS - vadovas] kol mes tikimės, kad dirbti teisingai, nes jei mes susiduriame su int masyvas, tada mes ne indeksą int arba, jei tai jo dydis yra 5 ir norite 4. elementą, tada mes indeksas į int masyvas [4]. Jūs NeraŠykiTe [4] * int dydis. Kad tvarko automatiškai, ir Šiuo atveju yra tiesiog ekvivalentas, todėl laikiklis sintaksė yra tik ketina būti konvertuojamos į tai, kaip greitai, kaip jūs sudaryti. Tai yra kažkas, jūs turite būti atsargūs, kad kai jūs pridedate dydis - vadovas norite pridėti ne vieną baitą. Jūs įtraukiate vieną char *, kuri gali būti viena baitų ar kas. Kiti klausimai? Gerai, dequeue bus lengviau. Aš duosiu jums vieną minutę įgyvendinti. O, ir aš manau, tai ta pati situacija, kai ką į eilę atveju, jei mes enqueuing null, gal mes norime ją apdoroti, o gal mes ne. Mes ne padaryti jį dar kartą čia, bet tas pats kaip mūsų kamino atveju. Jei mes į eilę null, mes norime į ją nekreipti dėmesio. Kiekvienas turi tam tikrą kodą, galiu atsigriebti? [Studentų] Aš tiesiog dequeue. 2 versija yra tai, kad gerai. Jūs norite paaiškinti? [Studentų] Pirma, jūs įsitikinkite, kad kažkas eilėje ir kad dydis 1. Ką jums reikia padaryti, ir tada grįšite galvą ir tada pereiti galvos iki 1. Gerai, kad yra kampas, mes turime apsvarstyti. Taip. [Studentų] Jei jūsų galva yra paskutinis elementas, tada jūs nenorite, kad galva atkreipti dėmesį ne masyvo. Taip, kad kuo greičiau galvos hitai mūsų masyvo pabaigos, , kai mes dequeue, mūsų pagrindinė turėtų būti modded atgal į 0. Deja, mes negalime padaryti, kad vienu žingsniu. Manau, taip, kaip aš tikriausiai išspręsti, tai yra tai bus char *, ką mes grįžti, kokia jūsų nori būti kintamojo vardas. Tai mes norime mūsų gebėjimą galvutės mod ir tada grįžti pamerkti. Daug žmonių čia jie gali padaryti -ty jūs matote žmones daryti, jei galva yra didesnis nei pajėgumų, galvą, - gebėjimus. Ir tai tik apie tai, ką mod yra. Vadovas mod = pajėgumas yra daug švaresnis vyniojimo aplink nei tuo atveju, jei galva didesnis nei pajėgumų galvos - pajėgumų. Turite klausimų? Gerai, paskutinis dalykas, mes palikome mūsų susieta sąrašas. Jums gali būti naudojami kai kurie susijęs sąrašą elgesio, jei tu susijęs sąrašus savo maišos lenteles, jei tu maišos lentelę. Aš primygtinai rekomenduojame tai maišos lentelę. Jūs galbūt jau padaryti trie bet stengiasi yra sunkiau. Teoriškai, jie asimptotiškai geriau. Bet tiesiog pažvelgti didelis valdybos, ir bando niekada padaryti geriau, ir jie užima daugiau atminties. Viskas apie bando, galų gale buvo blogiau už daugiau darbo. Tai, ką Davidas Malan sprendimas visada yra Jis visuomet pranešimų savo trie sprendimas, ir pažiūrėkime, kur šiuo metu yra. Kas jis pagal David J? # 18, todėl tai nėra baisiai blogai, ir tai bus vienas iš geriausių bando galite galvoti apie arba vienas iš geriausių bando iš trie. Ar ne tai jo originalus sprendimas? I feel like trie sprendimai linkę būti labiau šioje RAM naudojimą asortimentą. Eik į pačiame viršuje, ir RAM naudojimas yra vienaženkliai skaičiai. Eiti žemyn link dugno, ir tada jūs pradėtumėte matyti bando kur jūs gaunate visiškai masyvi RAM naudojimas, ir bando yra sunkiau. Ne tik verta, bet mokymosi patirtį, jei tu vieną. Paskutinis dalykas yra Susietos sąrašas ir šie trys dalykai, kaminai, eilės, ir siejami sąrašai, bet kokia būsima dalykas, kad jūs kada nors padaryti, kompiuterių mokslo laikys, turite supažindinti su šių dalykų. Jie tiesiog tokie svarbūs, kad viskas. Susijęs sąrašus, ir čia mes atskirai susijęs sąrašas bus mūsų įgyvendinimą. Ką atskirai susijęs, o ne dvigubai susijęs? Taip. [Studentų] Jis tik nurodo į kitą rodyklė, o ne į rodykles, kaip ir prieš ir po to, kai vienas. Taip, kad vaizdo formatas, ką aš tiesiog padaryti? Turiu du dalykus. Turiu vaizdas ir vaizdas. Vaizdo formatas, mūsų pavieniui susiję sąrašai neišvengiamai, mes turime kažkokį rodyklė į mūsų sąraše galvos, o tada per mūsų sąraše, mes tiesiog turi patarimų, o gal tai rodo null. Tai bus jūsų tipiškų brėžinys pavieniui susijęs sąrašą. Dvigubai susijęs sąrašas, galite eiti atgal. Jei aš jums bet kurį sąraše esantį mazgas, tada jums gali nebūti gauti bet kuris kitas mazgas sąraše, jei tai yra dvigubai susijęs sąrašas. Bet jei aš jums trečią sąrašo mazgas ir atskirai susijęs sąrašas, jokiu būdu, jūs kada nors patekti į pirmos ir antros mazgų. Ir ten naudą ir nenaudingus, ir vienas akivaizdus išgėrėte daugiau dydžio, ir jūs turite sekti, kur šie dalykai dabar yra nukreipta. Bet mes tik rūpi atskirai susijęs. Keletas dalykų, mes ketiname įgyvendinti. Typedef struct mazgas, int i: struct mazgas * next; mazgas. Turi būti sudegintos į savo protus kad Typedef. Quiz 1 turėtų būti suteikti susietą sąrašą mazgas Typedef ir jums turėtų būti suteikta galimybė nedelsiant rašinėti, kad nustatytų net galvoti apie tai. Manau, pora klausimų, kodėl mes turime Struct čia? Kodėl mes negalime pasakyti mazgas *? [Studentų] [nesigirdi] Taip. Vienintelis dalykas, kuris apibrėžia kaip dalykas mazgas Typedef pati. Tačiau, kaip šiuo metu, kai mes rūšies sintaksės per šį struct mazgo apibrėžimą, mes ne baigtas mūsų Typedef dar, nes Typedef nebaigė, mazgas neegzistuoja. Bet Struct mazgas, ir šis mazgas čia, tai taip pat gali būti vadinamas ką nors kita. Tai galėtų būti vadinama n. Tai galėtų būti susiję sąrašas mazgas. Buvo galima vadinti nieko. Bet tai Struct mazgas turi būti vadinamas tą patį kaip šis struct mazgas. Ką jūs vadinate, tai taip pat turi būti čia, ir kad taip pat atsako antrasis punktas klausimą kuris yra, kodėl daug kartų, kai jūs matote, structs structs ir tikrų tipų, pamatysite anoniminius structs, kur jūs tiesiog pamatyti Typedef struct, įgyvendinimas struct, Žodynas, ar whatever. Kodėl čia mums reikia pasakyti mazgas? Kodėl negali būti anoniminis struct? Tai beveik tas pats atsakymas. [Studentų] Jums reikia kreiptis į jį per struct. Taip, per struct, jums reikia kreiptis į struct pati. Jei jūs neduosite struct pavadinimą, jei tai anoniminis struct, jūs negalite kreiptis į jį. Ir paskutinis, bet ne mažiau kaip jie turėtų būti šiek tiek paprastas, ir jie turėtų padėti jums suprasti, jei rašote tai žemyn , kad jūs darote kažką blogo, jei šie dalykai rūšių neturi prasmės. Paskutinis, bet ne mažiau, kodėl tai turi būti Struct mazgas *? Kodėl negali jis tiesiog Struct mazgas toliau? [Studentų] Rodyklė į kitą struct. Kad neišvengiamai, ko norime. Kodėl ji galėjo niekada nebus Struct mazgas šalia? Kodėl ji turi būti Struct mazgas * šalia? Taip. [Studentų] Tai kaip begalinis ciklas. Taip. [Studentų] tai visi į vieną. Taip, tiesiog galvoti apie tai, kaip mes darysime dydžio ar kažką. Iš struct dydis iš esmės yra + arba - tam tikros pagal modelį čia arba ten. Tai iš esmės bus iš struct dalykų dydžių suma. Tai čia, nieko nekeisdami, dydis bus lengva. Struct mazgo dydis bus dydis + dydis kitą. Dydis i bus 4. Kito dydis bus 4. Struct mazgo dydis bus 8. Jei mes neturime *, galvoju, sizeof tada sizeof (i) bus 4. Struct mazgo dydis toliau bus dydis i + dydis struct mazgo kitą + Dydis + dydis struct mazgo kitą. Tai būtų begalinė rekursija mazgų. Tai kodėl taip yra, kaip viskas turi būti. Vėlgi, tikrai įsiminti, kad arba bent suprasti, kad tai pakankamai, kad jums gali būti suteikta galimybė prieţastis, ką ji turėtų atrodyti. Tai, ką mes ketiname norite įdiegti. Jei ilgis sąrašo jums gali apgauti ir nuolat aplink pasaulio ilgis ar kažką, bet mes neketiname daryti, kad. Mes ketiname pasikliauti sąrašo ilgį. Mes jau yra, kad iš esmės kaip paieškos, todėl mes turime susietą sveikųjų skaičių sąrašą, norėdami pamatyti, jei sveikasis skaičius yra į susietą sąrašą. Dėti vyksta įterpti sąrašo pradžioje. Papildyti ketina įtraukti pabaigoje. Insert_sorted vyksta įterpti į išrūšiuotų sąrašo poziciją. Insert_sorted rūšies reiškia, kad jūs niekada nesinaudojo Dėti arba pridėti blogų būdų. Insert_sorted kai jūs įgyvendinant insert_sorted tarkim, mes turime susijęs sąrašą. Tai, ką jis šiuo metu atrodo, 2, 4, 5. Norite įterpti 3, taip ilgai, kaip sąrašas pati yra jau surūšiuoti, tai lengva rasti, kur 3 priklauso. Aš pradėti 2. Gerai, 3 yra didesnis nei 2, todėl aš noriu nesustoti. Oh, 4 yra per didelis, kad aš žinau, 3 ketina eiti nuo 2 iki 4, ir aš turiu nustatyti nurodymus ir visi, kad kita. Bet jei mes ne griežtai naudoti insert_sorted patinka tegul tiesiog pasakyti, kad aš pridėkite iki keliu ženklas 6, tada mano susieta sąrašas taps. Jis dabar neturi jokios prasmės, todėl už insert_sorted, galite tiesiog manyti, kad šis sąrašas būtų rūšiuojamos, nors veikla yra , kurie gali sukelti, kad ji negali būti rūšiuojamos, ir viskas. Rasti naudinga įterpti, kad jie yra pagrindiniai dalykai, kuriuos jūs ketinate turi įgyvendinti. Dabar, skirkite šiek tiek ilgio ir yra, ir tas turėtų būti gana greitai. Artėja uždarymo laiko, todėl kiekvienas turi nieko ilgio arba jame yra? Jie bus beveik identiškas. [Studentų] ilgis. Pažiūrėkime, peržiūrą. Gerai. Jūs norite paaiškinti? [Studentų] aš tiesiog sukurti rodyklę mazgas, inicijuoti ir pirmąjį, kuris mūsų pasaulio kintamasis, ir tada aš patikrinti, pamatyti, jei ji yra niekinis, todėl aš ne gauti seg kaltės ir grįžti 0, jei tai toks atvejis. Priešingu atveju, aš linijos per, sekti per sveikojo skaičiaus kiek kartų aš pasiekiami kitą sąrašo elementą ir tuo pačiu prieaugio operacijos, taip pat pasiekti, kad faktinis elementas, ir tada aš nuolat atlikti patikrinimus, siekdama įsitikinti, jei tai null, ir, jei jis niekinis, tada ji nutraukia ir tiesiog grąžina aš atvertas elementų skaičių. [Rob B.] Ar kas nors turite komentarus dėl nieko? Tai atrodo bauda teisingumas išmintinga. [Studentų] Nemanau, kad jums reikia mazgas == null. Taip, kad jei mazgas == null return 0. Bet jei mazgas == null tada tai-oh, tai tokia teisingumo klausimas. Tai buvo tiesiog jūs grįžti i, bet tai nėra komplekte dabar. Jums tiesiog reikia int i, kad i = 0. Bet jei mazgas yra niekinis, tada aš vis dar bus 0, ir mes ketiname grįžti 0, todėl šiuo atveju yra identiška. Kitas dažnas dalykas yra išlaikyti deklaraciją mazgo viduje už linijos. Galima sakyti-oh, ne. Galime laikyti, nes tai. Aš tikriausiai įdėti int i = 0 čia, tada mazgas * node = čia. Ir tai, turbūt, kaip atsikratyti tai dabar. Tai turbūt, kaip aš parašiau. Jūs taip pat galėtų žiūri į jį, kaip šis. Ši kilpa struktūros čia turėtų būti beveik lygiai taip pat natūralu kaip int i = 0 i yra mažiau nei ilgio masyvas i + +. Jei tai, kaip jūs keistumėte per masyvo, tai, kaip galite pakartoti per susietą sąrašą. Tai turėtų būti savaime suprantamu dalyku tam tikru momentu. Turint tai omenyje, tai bus beveik tas pats. Jūs ketinate norite pakartoti per susietą sąrašą. Jei mazgas Aš neįsivaizduoju, kas vertė yra vadinamas. Mazgas i. Jei tuo mazgas vertė = i return true, ir viskas. Atkreipkite dėmesį, kad vienintelis būdas, kuriuo mes kada nors gražins false jei mes pakartoti per visą susijęs sąrašą ir niekada negali grįžti tiesa, todėl tai, ką šis daro. Kaip šalutinis dėmesį, mes tikriausiai nebus gauti įtraukti arba pridėkite iki keliu ženklas. Greitai paskutinė pastaba. Jei matote statinį raktinį žodį, todėl tarkim statinio int kiekis = 0, tada mes tai skaičius + +, galite iš esmės galvoti apie tai, kaip pasaulinį kintamąjį, net jei aš ką tik pasakė, tai yra ne tai, kaip mes ketiname įgyvendinti ilgis. Darau tai čia, ir tada suskaičiuoti + +. Bet kokiu būdu mes galime įvesti į mūsų susietą sąrašą, mes incrementing mūsų skaičius mazgas. Šis punktas yra, ką reiškia statinio raktažodį. Jei aš tiesiog turėjo int count = 0, kad būtų reguliariai senas pasaulio kintamasis. Kas yra static int kiekis reiškia, kad tai yra pasaulio kintamasis šiam failui. Neįmanoma kitą failą, patinka galvoti apie pset 5, jei jūs pradėjote. Turite tiek speller.c, ir turite dictionary.c, ir jei jūs tiesiog paskelbti pasaulio dalykas, tada nieko speller.c gali būti prieinama dictionary.c ir atvirkščiai. Visuotiniai kintamieji yra prieinama bet kokio c failas, bet statiniai kintamieji yra prieinama tik iš failo viduje, viduje rašybos tikrintuvą arba viduje dictionary.c, tai yra natūra, kaip aš norėčiau paskelbti mano kintamasis mano masyvo dydis ar mano žodžių žodyne dydis. Kadangi aš neturiu norite paskelbti pasaulinį kintamąjį, kad kiekvienas turi teisę susipažinti su Aš tikrai rūpi tik savo paties tikslams. Šis geras dalykas apie tai, taip pat visa vardas susidūrimo stuff. Jei kitą failą bando naudoti pasaulinį kintamąjį, pavadintą skaičius, viskas vyks labai, labai negerai, todėl tai gražiai išlaiko dalykų saugus, ir tik jūs galite jį pasiekti, ir niekas kitas gali, ir jei kas nors pareiškia globalinę kintamasis vadinamas skaičius, tada jis netrukdys jūsų statinis kintamasis vadinamas skaičius. Štai ką statinis yra. Jis yra failas pasaulio kintamasis. Klausimai dėl nieko? Visas rinkinys. Bye. [CS50.TV]