[Powered by Google Translate] [§ 6] [Ďalšia Komfortné] [Rob Bowden] [Harvard University] [To je CS50.] [CS50.TV] Môžeme zamieriť do našej sekcie otázok. Poslal som adresu URL pre priestor pred. Začiatok úseku otázok povedať: zrejme nie som úplne unsick-je veľmi jednoduchá otázka toho len to, čo je Valgrind? Čo valgrind robiť? Každý, kto chce hovoriť, čo valgrind robí? [Študent] Kontrola memory leaks. Jo, valgrind je všeobecný pamäte checker. To, na konci, vám povie, ak máte nejaké úniky pamäte, čo je väčšinou to, čo sme používať ho pre, pretože ak chcete dobre v probléme sade alebo ak chcete dostať na veľkú tabuľu, musíte mať žiadne úniky pamäte vôbec, a v prípade, že máte pretečeniu pamäte, že nemôžete nájsť, Tiež majte na pamäti, že vždy keď otvoríte súbor a ak nechcete zavrieť, to je k pretečeniu pamäte. Mnoho ľudí, ktorí hľadajú nejakú uzol že nie ste uvoľnenie keď v skutočnosti, že neuzavrela slovník hneď v prvom kroku. Tiež vám povie, či máte nejaké neplatné číta alebo píše, čo znamená, že ak sa pokúsite a nastavte hodnotu že je za koniec haldy a nie je náhodou seg poruchy ale valgrind ju chytí, ako by ste mali byť skutočne písať tam, a preto by ste rozhodne nemali mať žiadne z nich jeden. Ako použiť Valgrind? Ako použiť Valgrind? Je to všeobecná otázka na druh spustiť a pozrieť sa na výstupe. Výstup je zaplavený mnohokrát. K dispozícii je tiež zábavné chyby, kde, ak máte nejaké hrozne zlú vec deje v slučke, potom to bude nakoniec hovoriť, "Way príliš veľa chýb. Chystám sa prestať počítať teraz. " Je to prakticky textová výstup, ktorý budete musieť analyzovať. Na konci, bude to vám žiadne úniky pamäti, že máte, koľko blokov, ktoré môžu byť užitočné, pretože ak je to jeden blok unfreed, potom je to zvyčajne ľahšie nájsť ako 1000 blokov unfreed. 1000 bloky unfreed pravdepodobne znamená, že nie ste uvoľnenie prepojené zoznamy zodpovedajúcim spôsobom, alebo tak niečo. To je Valgrind. Teraz máme našu sekciu otázok, ktoré nemusíte sťahovať. Môžete kliknúť na moje meno a vytiahnite ich do priestoru. Teraz kliknite na mne. Revízia 1 bude zásobník, ktorý robíme ako prvý. Revízia 2 bude front, a Revízia 3 bude jednotlivo prepojený zoznam. Rozjazd s našou zásobníka. Ako sa hovorí, že tu, zásobník je jedným z najzákladnejších, Základné dátové štruktúry informatiky. Veľmi Typický príklad je zásobník zásobníkov v jedálni. Je to v podstate vždy, keď sa zavádza do zásobníka, niekto povedať, "Oh, ako hromada zásobníkov." Môžete stohovať zásobníky sa. Potom, keď idete na vytiahnuť zásobník, prvý zásobník, ktorý je dostať vytiahol je posledný, ktorý bol uvedený na stack. Stack i-ako to hovorí tu- máme segmente pamäti s názvom stack. A prečo sa tomu hovorí stack? Vzhľadom k tomu, ako zásobníka dátové štruktúry, to tlačí a objaví zásobníka rámčeky na zásobníku, kde stack rámy sú ako zvláštne volanie funkcie. A ako hromada, budete mať vždy vrátiť z volanie funkcie skôr, ako môžete dostať dole do nižších zásobníka snímok znova. Nemôžete mať hlavné hovoru foo blokovania hovorov a bar vrátite do hlavného priamo. Je to vždy dodržať správny zásobník tlačí a praskanie. Tieto dve operácie, ako som povedal, sú tlak a pop. Tí sú univerzálne pojmy. Mali by ste vedieť, push a pop z hľadiska komíny bez ohľadu na to, čo. Uvidíme fronty sú trochu odlišné. To nie je naozaj univerzálny termín, ale tlak a pop sú univerzálne pre komíny. Push len dať na stack. Pop je zložiť zásobníka. A tu vidíme máme typedef struct stoh, takže máme char ** reťazca. Nenechajte sa bojí žiadnymi **. To bude skončiť pole reťazcov alebo pole ukazovateľov na znaky, kde ukazovatele na znaky bývajú reťazca. Nemusí to byť reťazce, ale tu, oni budú mať reťazca. Máme pole reťazcov. Máme veľkosť, ktorá predstavuje, koľko prvky sú v súčasnej dobe na fronte, a potom máme kapacitu, čo je, koľko prvkov môže byť na zásobníku. Kapacita by mala začať ako niečo väčšia ako 1, ale veľkosť bude začať ako 0. Teraz, tam sú v podstate tri rôzne spôsoby, ako môžete myslieť zásobníka. No, tam sú pravdepodobne viac, ale dva hlavné spôsoby sú môžete implementovať pomocou poľa, alebo môžete implementovať pomocou spojovaceho zoznamu. Prepojené zoznamy sú trochu triviálne, aby sa stohy z Je veľmi jednoduché, aby sa stoh pomocou prepojených zoznamov, takže tu, budeme robiť hromadu pomocou matice, a potom pomocou polí, je tu tiež dva spôsoby, ako si môžete myslieť o tom. Predtým, keď som povedal, máme kapacitu zásobníka, takže sa zmestí prvok na zásobníku. Jediný spôsob, že by sa mohlo stať, je, akonáhle hit 10 prvkov, potom ste urobil. Možno viete, že tam je horná hranica 10 vecí na svete že už nikdy nebudete musieť viac než 10 vecí, na vášho stacku, V takom prípade môžete mať hornú hranicu na veľkosti vášho stacku. Alebo môžete mať svoj stack byť nespútaný, ale ak robíte poľa, to znamená, že zakaždým trafíte 10 prvkov, potom budete musieť rast na 20 prvkov, a keď trafíte 20 prvkov, budete musieť pestovať svoje pole na 30 prvkov alebo 40 prvkov. Budeš musieť zvýšiť kapacitu, čo je to, čo budeme robiť. Zakaždým sme dosiahli maximálnej veľkosti nášho stacku, keď sme sa tlačiť niečo iné na, budeme musieť zvýšiť kapacitu. Tu sme tlačiť vyhlásené za bool push (char * str). Char * str je reťazec, ktorý sme tlačí do fronty, a bool len hovorí, či sa nám to podarilo, alebo nepodarilo. Ako môžeme zlyhať? Čo je to iba okolnosť, že si môžete myslieť kde by sme potrebovali vrátiť false? Jo. [Študent] Ak je to plné a my sme s použitím skákal implementácie. Jo, tak ako definujeme-on odpovedal ak je to plné a my sme s použitím ohraničená implementácie. Potom budeme určite vráti false. Akonáhle sme narazili 10 vecí v poli, môžeme nevojde 11, tak sme sa vrátiť false. Čo keď to je neobmedzený? Jo. Ak nemôžete rozbaliť pole z nejakého dôvodu. Jo, takže pamäť je obmedzený zdroj, a nakoniec, ak budeme tlačiť veci do fronty znova a znova, budeme sa snažiť a prideliť väčšie pole, aby sa zmestili väčšia kapacita, a malloc alebo čo sme pomocou sa bude vracať false. No, bude malloc vráti null. Pamätajte si, že zakaždým ste niekedy volať malloc, mali by ste byť kontrola, či je vracia null, inak že je správnosť odpočet. Pretože chceme mať neobmedzenú stack, jediný prípad, budeme sa vracať false, je keď sa budeme snažiť zvýšenie kapacity a malloc alebo čokoľvek vráti false. Potom pop neakceptuje žiadne argumenty, a vráti reťazec, ktorý je na vrchole zásobníka. Či už to bolo naposledy tlačil do fronty je to, čo pop sa vracia, a tiež ju odstráni zo zásobníka. A všimnite si, že sa vráti hodnotu null, ak nie je nič na stacku. Je vždy možné, že zásobník je prázdny. V Jave, ak ste zvyknutí na to, alebo iných jazykov, snaží sa pop z prázdneho zásobníka môže spôsobiť výnimku alebo tak niečo. Ale v C, null je tak trochu z mnohých prípadov, ako vybavujeme tieto problémy. Vracať null je, ako budeme znamenať, že zásobník je prázdny. Pripravili sme kód, ktorý bude testovať svoj stack funkčnosť, vykonávať tlačiť a pop. To nebude veľa kódu. Budem-vlastne, ako to urobíme, náznak, náznak- ak ste ho ešte nevideli, malloc nie je jediná funkcia, , Ktoré prideľuje pamäť na halde pre vás. Existuje rodina Alloc funkcií. Prvá z nich je malloc, ktorý ste zvyknutí. Potom je tu calloc, ktorý robí to isté ako malloc, ale to bude nulu všetko za vás. Ak ste niekedy chceli nastaviť všetko na nulu po mallocing niečo mali by ste sa práve používa calloc v prvom rade miesto písania pre sláčiky na nulu sa na celý blok pamäte. Realloc je ako malloc a má veľa zvláštnych prípadoch, ale v podstate to, čo robí, je realloc to trvá ukazovateľ, ktorý už bola pridelená. Realloc je funkcia, ktorú chcete platiť pozornosť tu. Trvá to ukazovateľ, ktorý už vrátil z malloc. Povedzme, že ste požiadať malloc ukazovateľ na 10 bajtov. Neskôr si uvedomíte, že ste chceli 20 bajtov, takže volať realloc na tomto ukazovateli s 20 bajtov, a realloc automaticky skopírovať všetko, čo pre vás. Ak ste práve volal malloc znovu, ako by som mal blok 10 bajtov. Teraz potrebujem blok 20 bytov, takže keď som malloc 20 bajtov, potom musím ručne skopírovať cez 10 bajtov z prvých vecí, do druhej veci a potom bez prvá vec. Realloc sa bude zaoberať, že pre vás. Všimnite si, že podpis bude void *, ktorý je len vracia ukazovateľ na blok pamäte, potom void * ptr. Môžete si myslieť void * ako všeobecný ukazovateľ. Všeobecne platí, že nikdy riešiť void *, ale malloc vracia void *, a potom je to len použiť ako to vlastne bude char *. Predchádzajúci void *, ktorý bol vrátený malloc teraz bude odovzdaný realloc, a potom sa veľkosť je nový počet bajtov, ktoré chcete priradiť, takže vaša nová kapacita. Dám vám pár minút, a to v našom priestore. Začnite s revízia 1. Zastavím ťa po snáď o dosť času vykonať Push, a potom ti dám ďalšie prestávku robiť pop. Ale to naozaj nie je toľko kód vôbec. Najviac kód je pravdepodobne rozširuje veci, rozšírenie kapacity. Dobre, žiadny tlak, aby sa úplne hotový, ale tak dlho, ako sa cítite, ako že ste na správnej ceste, to je dobrý. Má niekto nejaký kód sa cíti dobre s mojím vytiahnutí? Jo, budem, ale má niekto nejaké kód, ktorý som si vytiahnuť hore? Dobre, môžete začať, uložiť ju, nech je to čokoľvek? Vždy zabudnem, že krok. Dobre, pri pohľade na tlak, chceš vysvetliť svoj kód? [Študent] Po prvé, som zväčšil veľkosť. Myslím, že by som snáď mala mať, že-rovnako, som zväčšil veľkosť, a ja či to je menej než kapacita. A ak je to menej, ako je kapacita, pridám do poľa, že už máme. A ak to nie je, som vynásobte kapacitu 2, a ja prerozdeliť reťazca pole, aby niečo s väčšou kapacitou veľkosti teraz. A potom, ak sa to nepodarí, poviem užívateľa a vráti false, a ak to bude v poriadku, potom som dal reťazec v novom mieste. [Rob B.] Tiež si všimnite, že sme použili pekný bitovú operátor tu vynásobiť 2. Nezabudnite, posun doľava sa vždycky sa vynásobí 2. Právo posun je rozdelený 2 tak dlho, ako si spomeniete, že to znamená, vydeľte 2 ako v celej číslo deleno 2. To by mohlo skrátiť na 1 tu alebo tam. Ale posun doľava o 1 je vždy potrebné vynásobiť 2, ak pretečeniu hranice integer, a potom to nebude. Strana komentár. Rád robím-to nebude meniť kódovanie akýmkoľvek spôsobom, ale ja by som niečo také robiť. Je to vlastne bude robiť to mierne dlhšia. Možno to nie je dokonalé prípad to ukázať, ale ja by som segmente do týchto blokov- v poriadku, pokiaľ túto možnosť, ak sa stane, a potom budem robiť niečo, a potom sa vykonáva funkcie. Nepotrebujem, aby potom prejdite oči celú cestu dole funkciu vidieť, čo sa stane po ostatnému. Je to v prípade, že ak sa stane, a potom som sa vrátiť. To tiež má pekný výhodu všetkého, nad tento rámec je teraz posunula ešte raz doľava. Ja už treba, ak ste niekedy v blízkosti smiešne dlhý vedenie, potom tie 4 bytov môžu pomôcť, a tiež viac vľavo je niečo, menej ohromený sa cítili, keby chceli, v poriadku, musím si pamätať Som v súčasnej dobe v cykle while vnútri z iného vnútri slučky for. Kdekoľvek si môžete urobiť toto daňové priznanie okamžite, som nieco ako. Je úplne dobrovoľné a nie je v žiadnom prípade očakávať. [Študent] Mal by byť veľkosť - v nepodarí stave? Fail podmienka je tu sa nám nepodarilo realloc, takže áno. Všimnite si, ako v nezhodu stave, pravdepodobne, ak sme voľní veci neskôr, budeme vždy zlyhanie bez ohľadu na to, koľkokrát sa snažíme tlačiť niečo. Ak budeme neustále tlačí, držíme increment veľkosti, aj keď sme sa, že uvedenie nič do zásobníka. Zvyčajne nemáme zvýšite veľkosť až potom, čo sme úspešne ju na zásobníku. Urobili by sme to, povedzme, buď tu a tu. A potom miesto toho povedal s.size ≤ kapacitu, je to menej, než kapacita, len preto, že sme sa presťahovali, kde bolo všetko. A pamätajte, jediné miesto, ktoré by sme mohli prípadne vrátiť false je tu, kde realloc vrátil null, a ak ste náhodou na pamäti štandardnej chyby, Možno by ste mohli zvážiť tento prípad, kedy chcete vytlačiť štandardné chybu, tak fprintf stderr, nie len tlačiť priamo na štandardný výstup. Opäť, to nie je očakávania, ale ak je to chyba, zadajte printf, potom budete chcieť, aby sa vytlačilo na štandardný chybový miesto štandardný výstup. Každý, kto má niečo iného všimnúť? Áno. [Študent] Môžeš ísť cez [nepočuteľnú]? [Rob B.] Áno, skutočná binariness to, alebo len to, čo to je? [Študent] Takže vynásobte ju 2? [Rob B.] Jo, v podstate. V binárnom krajine, vždy máme sadu číslic. Presun tento ľavej do 1 podstate vloží ho sem na pravej strane. Späť na toto, len pripomenutie, že všetko v binárnej je sila 2, tak to predstavuje 2 na 0, to 2 na 1, to 2 na 2. Vložením 0 na pravej strane hneď, len sme posun všetko preč. Čo sa vtedy 2 k 0 je teraz 2 k 1, sú 2 na 2. Na pravej strane, ktoré sme vložený je nutne bude 0, ktorý dáva zmysel. Ak ste niekedy násobiť číslo 2, nebude to skončiť nepárny, tak 2 k 0 mieste by mala byť 0, a to je to, čo som napoly varoval predtým, je, ak to náhodou posunúť za počet bitov v celé číslo, potom 1 skončí až bude preč. To je jediná starosť, ak sa stalo, že sa rokovania s naozaj veľkými kapacitami. Ale v tomto bode, potom máte čo do činenia s radom miliárd vecí, ktoré sa nemusia vojsť do pamäti rovnako. Teraz sa dostaneme k popu, ktorý je ešte jednoduchšie. Dalo by sa to urobiť ako, ak ste náhodou pop veľa, a teraz si na polovičnú kapacitu znova. Dalo by sa realloc zmenšiť množstvo pamäte máte, ale nemusíte sa báť, že, takže jediný realloc prípad bude rastúce pamäte, nikdy zmenšuje pamäť, ktorá sa chystá urobiť pop super ľahké. Teraz fronty, ktoré sa chystáte byť ako komíny, ale poradie, ktoré budete mať veci sa obráti. Typický príklad frontu je linka, takže myslím, že ak ste boli English, by som povedal, typický príklad frontu je fronta. Tak ako čiary, ak ste prvý človek v súlade, môžete očakávať byť prvá osoba z rady. Ak ste ten posledný človek v súlade, sa bude posledný, kto opraviť. Hovoríme, že FIFO vzorec, vzhľadom k tomu, zásobník bol LIFO vzorec. Tieto slová sú veľmi univerzálne. Rovnako ako zásobníky a na rozdiel od polí, fronty zvyčajne neumožňujú prístup k prvkom v strede. Tu, zásobník, máme tlak a pop. Tu sme náhodou volali im Zaradí a dequeue. Tiež som počul len posun a unshift. Počul som ľudí hovoriť tlak a pop sa vzťahujú aj na front. Počul som vložiť, odstrániť, tak tlačiť a pop, keď hovoríte o komíny, sa tlačí a objavovať. Ak hovoríte o front, môžete vybrať slová, ktoré chcete použiť pre vloženie a vybratie, a tam je žiadny konsenzus o tom, čo by malo byť nazývaný. Ale tu máme Zaradí a dequeue. Teraz struct vyzerá takmer zhodný s zásobníka struct. Ale musíme sledovať hlavy. Myslím, že to hovorí tu, ale prečo potrebujeme hlavu? Prototypy sú v podstate totožné s tlačiť a pop. Môžete si ju predstaviť ako push a pop. Rozdiel je iba v pop sa vracia-miesto posledného, ​​to sa vracia prvý. 2, 1, 3, 4, alebo niečo. A tu je začiatok. Naša fronta je úplne plná, takže to štyri elementy v ňom. Koniec našej frontu je v súčasnej dobe 2, a teraz ideme vložiť niečo iné. Keď chceme vložiť, aby niečo iné, čo sme urobili pre zásobníka verzii je, že sme rozšírili našu blok pamäte. V čom je problém s tým? [Študent] Presuniete 2. Čo som hovoril o konci fronty, to nedáva zmysel, že začneme na 1, potom chceme Dequeue 1, potom Dequeue 3, potom Dequeue 4, potom Dequeue 2, potom dequeue túto. Nemôžeme použiť realloc teraz, alebo prinajmenšom, budete musieť použiť realloc iným spôsobom. Ale pravdepodobne by nemal používať realloc. Budete musieť ručne skopírovať svoju pamäť. Existujú dve funkcie pre kopírovanie pamäte. Je tu memcopy a memmove. Ja som v súčasnej dobe čítania manuálové stránky vidieť, ktorý z nich budete chcieť použiť. Dobre, memcopy, rozdiel je že memcopy a memmove, jeden sa stará o veci správne kam kopírovanie do oblasti, ktorá sa stane prekrývať oblasť kopírujete z Memcopy nespracováva ju. Memmove robí. Môžete myslieť na problém ako- povedzme, že chcem kopírovať toho chlapa, títo štyria s tymto chlapom cez. Na konci, čo Pole by malo vyzerať Po kopírovanie je 2, 1, 2, 1, 3, 4, a potom niektoré veci na konci. To je však závisí na poradí, v ktorom sa vlastne kopírovať, pretože ak sa neberú do úvahy skutočnosť, že región sme kopírovanie do prekrýva ten sme kopírovanie, potom by sme mohli urobiť ako začiatok tu, skopírujte 2 do miesta chceme ísť, potom sa presunúť naše ukazovatele vpred. Teraz budeme mať tu a tu, a teraz chceme kopírovať tento chlap nad tymto chlapíkom a presunúť naše ukazovatele vpred. Čo budeme nakoniec dostať je 2, 1, 2, 1, 2, 1 miesto zodpovedajúce 2, 1, 2, 1, 3, 4, pretože 2, 1 prehlasovali pôvodné 3, 4. Memmove úchytky, ktoré správne. V tomto prípade, v podstate len vždy memmove pretože spracováva správne. To zvyčajne nevykonáva žiadne horšie. Myšlienka je miesto od začiatku a kopírovanie týmto spôsobom ako sme práve urobili tu, začína od konca, a kopíruje, a v tomto prípade, môžete mať nikdy problém. Neexistuje žiadny výkon stratená. Vždy používajte memmove. Nikdy starosti memcopy. A to je miesto, kde budete musieť zvlášť memmove zabalené-okolo časť vašej fronte. Žiadne starosti, ak nie je úplne hotový. To je ťažšie, ako zásobník, tlačenie, a pop. Každý, kto má akýkoľvek kód, ktorý sme mohli pracovať s? Aj keď úplne neúplné? [Študent] Jo, je to úplne neúplné, hoci. Úplne neúplný je v poriadku, tak dlho, ako budeme-môžete uložiť revíziu? Zabudol som, že každý jednotlivý čas. Dobre, ignoruje, čo sa stane, keď potrebujeme zmeniť veľkosť veci. Úplne ignorovať Resize. Vysvetlite tento kód. Som kontrolu v prvom rade v prípade, že je veľkosť menšia ako kópie prvom rade a potom po tom, mám vložiť-beriem hlavu + veľkosť, a môžem uistiť, že sa zalomia okolo kapacita poľa, a mám vložiť nový reťazec na tejto pozícii. Potom som zväčšiť veľkosť a vráti true. [Rob B.] To je určite jeden z tých prípadov, kedy budete chcieť používať mod. Akékoľvek prípade, kedy ste si obal okolo, ak si myslíte, že obal okolo, bezprostrednej myšlienka by mala byť mod. Ako rýchly optimalizácia / váš kód jeden riadok kratší, Všimnite si, že riadok bezprostredne po tohoto je len veľkosť + +, takže je zlúčiť, aby do tohto riadku, veľkosť + +. Teraz tu máme prípad kde nemáme dostatok pamäte, takže sme sa zvýšiť naše kapacity 2. Myslím, že by ste mohli mať rovnaký problém tu, ale môžeme ignorovať to teraz, kde, ak sa vám nepodarilo zvýšiť svoju schopnosť, potom budete chcieť znížiť kapacitu 2 znovu. Ďalšia krátka poznámka je, rovnako ako vy môžete urobiť + =, môžete tiež urobiť << =. Takmer všetko môže ísť pred rovná, + =, | =, & =, << =. Char * new je náš nový blok pamäte. Oh, tu. Čo si ľudia myslia o typu nášho nového bloku pamäte? [Študent] To by malo byť char **. Myslenie späť k nášmu struct sem, Reťazca je to, čo sme prerozdelenie. Robíme celú novú dynamické úložisko pre prvky vo fronte. Čo budeme sa zaraďovania na zoznam reťazcov je to, čo sme mallocing teraz, a tak nové bude char **. Je to bude pole reťazcov. Tak čo je to v prípade, ktorý sa budeme vracať false? [Študent] Mali by sme robiť char *? [Rob B.] Áno, dobrý nápad. [Študent] Čo to bolo? [Rob B.] Chceli sme urobiť veľkosť char *, pretože sme už- To by v skutočnosti bolo veľmi veľký problém, pretože sizeof (char) bude 1. Sizeof char * bude 4, takže veľa krát, keď máte čo do činenia s ints, máte tendenciu sa dostať preč s ním, pretože veľkosť int a veľkosti int * na 32-bitovom systéme sa bude to isté. Ale tu, sizeof (char) a sizeof (char *) sú teraz bude to isté. Čo je okolnosť, kedy sa vrátime false? [Študent] Nové je null. Jo, keď nový je null, vraciame false, a ja idem hodiť tu- [Študent] [nepočuteľné] [Rob B.] Jo, to je v poriadku. Dalo by sa buď urobiť 2 krát kapacity alebo kapacity shift 1 a potom len nastaviť to sem, alebo čo. Urobíme to, ako sme to. Kapacita >> = 1. A už nikdy musieť obávať, že 1 je miesto pretože si odišiel posunuté o 1, takže sa 1 miesto je nutne 0, tak správne radenie o 1, ste stále bude v poriadku. [Študent] Potrebujete si urobiť pred návratom? [Rob B.] Áno, to je absolútne žiadny zmysel. Teraz predpokladajme, že budeme nakoniec vracia hodnotu true do konca. Spôsob, akým budeme robiť tieto memmoves, musíme byť opatrní s tým, ako robíme. Má niekto nejaké návrhy na to, ako robíme? Tu je náš štart. Je samozrejmé, chceme od začiatku znovu a kopírovanie vecí v odtiaľ, 1, 3, 4, 2. Ako to robíte, že? Po prvé, musím sa pozrieť na manuálové stránke pre memmove znova. Memmove, poradie argumentov je vždy dôležité. Chceme, aby naše ciele prvý, zdroj druhý, veľkosť tretí. Existuje mnoho funkcií, ktoré zvrátia zdroj a cieľ. Destinácia, zdroj býva konzistentné trochu. Move, čo je to vracia? Vracia ukazovateľ na miesto určenia, z akéhokoľvek dôvodu budete chcieť, že. Som si obrázok prečítať, ale chceme presťahovať do nášho cieľa. Čo je naším cieľom bude? [Študent] Nové. [Rob B.] Áno, a kde sme kopírovanie? Prvá vec, ktorú kopírujete, je to 1, 3, 4. Čo je-to 1, 3, 4. Aká je adresa tohto 1? Aká je adresa tohto 1? [Študent] [nepočuteľné] [Rob B.] Head + adresa prvého prvku. Ako sa dostať na prvý prvok v poli? [Študent] Queue. [Rob B.] Áno, q.strings. Pamätajte si, že tu, naša hlava je 1. Látat to. Len si myslím, že je to ako mávnutím čarovného prútika, Tu, naša hlava je 1. Chystám sa zmeniť môj farbu taky. A tu je reťazca. To, môžeme buď napísať to rovnako ako my tu s hlavami + q.strings. Mnoho ľudí tiež zapisovať a q.strings [hlava]. To nie je naozaj nič menej efektívny. Môžete si myslieť, že to, ako ste sa dereferencing ju a potom sa dostať na adresu, ale kompilátor bude prekladať, čo sme mali predtým tak, q.strings + hlava. Či tak alebo onak si chcete myslieť na to. A koľko bytov si chceme kopírovať? [Študent] Kapacita - hlava. Kapacita - hlava. A potom môžete vždy zapísať príklad zistiť, či je to pravda. [Študent] Je potrebné rozdeliť do 2 potom. Jo, takže myslím, že by sme mohli použiť veľkosť. Stále máme veľkosť je- pomocou veľkosti, musíme veľkosť rovnakú ako 4. Naša veľkosť je 4. Naša hlava je 1. Chceme skopírovať tieto 3 prvky. To je príčetnosť skontrolujte, či veľkosť - hlava je správne 3. A prichádza sem, ako sme povedali skôr, ak sme použili kapacitu, potom by sme museli deliť 2 preto, že sme už stalo našej schopnosti, a tak namiesto toho, budeme používať veľkosť. Že kópií, ktoré porcie. Teraz musíme skopírovať druhú časť, je časť, ktorá je naľavo od začiatku. To bude memmove do akej pozícii? [Študent] Plus veľkosť - hlava. Áno, tak sme už skopírované vo veľkosti - hlava bajtov, a tak tam, kde chceme skopírovať zostávajúce bajtov je nový a potom veľkosť mínus rovnako, počet bajtov sme už skopírované a A potom, kde sme kopírovanie? [Študent] Q.strings [0]. [Rob B.] Áno, q.strings. Môžeme buď urobiť a q.strings [0]. To je výrazne menej časté ako toto. Ak to len bude 0, potom budete tendenciu vidieť q.strings. To je miesto, kde sme kopírovanie. Koľko bytov nám zostáva skopírovať? >> [Študent] 10. Právo. [Študent] Ešte musíme vynásobiť 5 - 10 krát väčšia ako veľkosť bajtov alebo tak niečo? Jo, tak to je miesto, kde-čo presne sa kopírovanie? [Študent] [nepočuteľné] Aký je typ vecí sme kopírovanie? [Študent] [nepočuteľné] Jo, takže char * s, že sme kopírovanie, nevieme, kde tie sú zasielané z No, kde to ukázal, ako struny, skončíme to tlačil do fronty alebo enqueuing do fronty. Ak tie sú posielané z, nemáme potuchy. Potrebujeme len sledovať char * s sami. Nechceme kopírovať veľkosti - hlava bytov. Chceme kopírovať veľkosti - hlava char * s, takže budeme násobiť tým sizeof (char *). Rovnaká sem, hlava * sizeof (char *). [Študent] Čo [nepočuteľné]? Toto právo tu? [Študent] Nie, pod tým je veľkosť - hlava. [Rob B.] Toto právo tu? Ukazovateľ aritmetika. Ako ukazovateľ aritmetický bude fungovať, je automaticky násobí podľa veľkosti typu, že máme čo do činenia s Rovnako ako tu, nový + (veľkosť - hlava) je presne ekvivalentné a nové [veľkosť - hlava] kým očakávame, že sa pracovať správne, pretože ak máme čo do činenia s int pole, potom nemáme index int- alebo či je to z veľkosti 5 a chcete 4. prvok, potom sme index do int array [4]. Tie nerob-[4] * veľkosť int. , Ktorý spracováva automaticky, a tento prípad Je doslova ekvivalentné, takže držiak syntaxe je len tak byť premenený na to čo najskôr skompilovať. To je niečo, čo musíte byť opatrní, aby Pri pridávaní veľkosť - hlava Pridávate nie jeden bajt. Ste pridaním jedného char *, čo môže byť jeden bytov alebo čokoľvek. Ďalšie otázky? Dobre, Dequeue bude jednoduchšie. Dám vám chvíľku realizovať. Oh, a myslím, že to je rovnaká situácia, kedy čo enqueue prípade, ak budeme enqueuing null, Možno chceme zvládnuť, možno nemáme. Budeme to robiť znova tu, ale rovnako ako naše zásobníka prípade. Ak budeme Zaradí null, mohli by sme chcieť ignorovať. Každý, kto má nejaký kód, ktorý som si vytiahnuť hore? [Študent] Mám len Dequeue. Verzia 2 je, že-v poriadku. Ak chcete vysvetliť? [Študent] Po prvé, musíte sa uistite, že je niečo, čo vo fronte a že veľkosť klesá o 1. Musíte to urobiť, a potom sa vrátite hlavu a potom presunúť hlavu 1. Dobre, tak tam je rohová prípad, musíme vziať do úvahy. Jo. [Študent] Ak je vaša hlava je na posledný prvok, potom nechcete hlava bodu mimo poľa. Jo, takže akonáhle hlava narazí na koniec nášho poľa, keď sme dequeue, by naša hlava sa Modded späť na 0. Bohužiaľ, nemôžeme to, že v jednom kroku. Myslím, že tak, ako som si asi stanoviť, že je to bude char *, čo sa vraciame, bez ohľadu na vaše meno premennej chce byť. Potom chceme mod hlavu o našej schopnosti a potom sa vrátiť peru. Veľa ľudí tu by sa mohli do- To je prípad-Budeš vidieť ľudí robiť, keď sa hlava je väčšia ako kapacita, to hlavou - kapacita. A to je práve pracuje okolo toho, čo mod je. Vedúci mod = kapacita je oveľa čistejšie z obalu okolo, ako chcete hlava väčšia ako kapacita hlavou - kapacita. Otázky? Dobre, posledná vec, ktorú sme si nechali je náš prepojený zoznam. Tie by mohli byť použité na niektoré prepojené zozname správanie, ak ste súvisí zoznamy vo vašich hash tabuľkách, ak ste hash tabuľky. Vrelo odporúčam robiť hash tabuľky. Možno ste už urobili trie, ale pokusy sú ťažšie. Teoreticky, sú asymptoticky lepší. Ale stačí sa pozrieť na veľkú tabuľu, a snaží sa nikdy robiť lepšie, a zaberajú viac pamäte. Všetko o snaží skončí bytia horšie pre ďalšiu prácu. Je to to, čo David Malan riešením je vždy Je vždy príspevkov jeho trie roztoku, a pozrieme sa, kde v súčasnej dobe je. Čo bolo, že v rámci, David J? Je to # 18, tak, že to nie je príliš zlý, a že to bude jeden z najlepších snaží si môžete myslieť alebo jeden z najlepších snaží o trie. Je to dokonca ani jeho originálne riešenie? Mám pocit, že trie riešenia majú tendenciu byť viac v tomto rozsahu použitia RAM. Choďte dole až na samý vrchol, a RAM využitie je v jednotlivých číslic. Choďte dolu ku dnu, a potom začnete vidieť pokúsi kde dostanete úplne masívne pamäte RAM, a pokusy sú ťažšie. Nie úplne stojí za to, ale vzdelávacie skúsenosti, ak ste jeden. Posledná vec, ktorú je náš prepojený zoznam, a tieto tri veci, komíny, fronty, a prepojené zoznamy, budúcu vec, ktorú kedy urobil v informatike Predpokladajme, že ste oboznámení s týmito vecami. Sú to len natoľko zásadné pre všetko. Súvisí zoznamy, a tu sme single spájať zoznam sa bude naše realizácie. Čo jednotlivo spojené znamená v porovnaní s dvojnásobne spojené? Áno. [Študent] To len ukazuje na ďalšie ukazovatele, skôr než na ukazovatele, ako ten predchádzajúci je aj ten, za ňou. Jo, tak v formáte obrazu, čo som to urobil? Mám dve veci. Mám obraz a obraz. V obrazu formátu, naše jednotlivo prepojené zoznamy, nevyhnutne, máme nejaký ukazovateľ na hlavu nášho zoznamu, a potom v našom zozname, budeme musieť ukazovatele, a možno tento bodov na hodnotu null. Je to niečo ako tvoj typický výkres single prepojeného zoznamu. Dvojnásobne spájať zoznam, môžete ísť späť. Keby som vám žiadny uzol v zozname, môžete nutne dostať do iné uzol v zozname, pokiaľ sa jedná o dvojnásobne spájať zoznam. Ale keď som vám tretí uzol v zozname a je to jednotlivo prepojený zoznam, žiadny spôsob, ako ste niekedy dostane do prvej a druhej uzlov. A je tu výhody a detriments, a jeden zrejmý je vám zaberú viac veľkosti, a vy budete musieť sledovať, kde sa tieto veci smerujú teraz. Ale my sme len o single spojené. Pár vecí budeme musieť realizovať. Your typedef struct node, int i: struct node * next; uzol. To typedef by mala byť vypálená do vašej mysle. Quiz 1 by mal byť rád dať typedef prepojeného zoznamu uzla, a vy by ste mali byť schopní okamžite čmárať, že sa bez premýšľania o tom. Myslím, že pár otázok, prečo potrebujeme struct sem? Prečo nemôže povedať uzla *? [Študent] [nepočuteľné] Jo. Jediná vec, ktorá definuje uzol ako vec je typedef sám. Ale ako tohto bodu, keď sme trochu rozobrať pomocou tejto definície struct uzol, sme neskončili našej typedef doteraz, takže od tej doby typedef nebolo dokončené, uzol neexistuje. Ale struct uzol sa, a tento uzol vo tu, to by mohlo tiež byť nazývané niečo iné. To by mohlo byť nazývaný n Mohlo by to byť nazývaný previazaný zoznam uzla. Mohlo by to byť len niečo. Ale to struct node potrebuje byť nazývaný to isté ako tento struct uzol. Čo hovoríte to má aj byť tu, a aby tiež odpovedá na druhý bod na otázky čo je dôvod, prečo, mnohokrát, keď vidíte structs a typedefs z structs, uvidíte anonymný structs, kde budete len vidieť typedef struct, vykonávanie struct, slovník, alebo čokoľvek iného. Prečo tu sa musíme povedať uzol? Prečo to nemôže byť anonymný struct? Je to skoro rovnaká odpoveď. [Študent] Musíte sa na ňu odvolávať v rámci struct. Jo, v struct, musíte sa odkazovať na struct sám. Ak nedáte struct meno, ak je to anonymný struct, nemôžete na neho odkazujú. A v neposlednom rade, by toto všetko malo byť trochu priamočiare, a oni by vám mali pomôcť si uvedomiť, ak píšete to ustanovuje že robíte niečo zle, ak tieto druhy vecí nedávajú zmysel. V neposlednom rade, prečo to musí byť struct uzol *? Prečo to nemôže byť len struct uzol ďalej? [Študent] Ukazovateľ na ďalšie struct. To nevyhnutne to, čo chceme. Prečo by sa to nikdy nestane struct uzol ďalej? Prečo to musí byť struct node * next? Jo. [Študent] Je to ako nekonečnej slučke. Jo. [Študent] bol by to stále v jednom. Jo, len si na to, ako by sme to veľkosť alebo tak niečo. Veľkosť struct je v podstate + alebo - niektorí vzor tu alebo tam. Je to v podstate bude súčet veľkostí jednotlivých vecí v struct. To tu bez toho, aby sa čokoľvek zmenilo, jeho veľkosť je bude ľahké. Veľkosť struct uzol bude veľkosť i + veľkosti vedľa. Veľkosť aj bude 4. Veľkosť budúceho roka sa bude 4. Veľkosť struct uzol bude 8. Ak nemáme súbory *, myslel sizeof, potom sizeof (i) bude 4. Veľkosť struct uzol vedľa bude veľkosť i + veľkosť struct uzol ďalšie + Veľkosť i + veľkosti struct uzol ďalšie. Bolo by nekonečná rekurzia uzlov. Z tohto dôvodu je to, ako veci majú. Opäť, rozhodne zapamätať, že, alebo aspoň pochopiť natoľko, že je možné byť schopný Dôvodom tým, čo by to malo vyzerať. Veci budeme chcieť realizovať. Ak dĺžka zoznamu- môžete podvádzať a udržať okolo globálne dĺžka alebo tak niečo, ale my nebudeme robiť, že. Budeme počítať dĺžku zoznamu. Máme obsahuje, tak, že je v podstate ako vyhľadávanie, takže máme prepojený zoznam celých čísel zistiť, či to číslo je v pripojenom zozname. Prepend bude vloženie na začiatku zoznamu. Append bude vkladať na konci. Insert_sorted bude vložiť do triedeného pozíciu v zozname. Insert_sorted druh predpokladá, že ste nikdy nepoužívali predradený alebo pripojený v zlých cestách. Insert_sorted keď ste vykonávania insert_sorted- Povedzme, že máme prepojený zoznam. To je to, čo v súčasnej dobe vyzerá, 2, 4, 5. Chcem vložiť 3, tak dlho, ako zoznam sám už je zoradený, je ľahké zistiť, kde 3 patrí. Začínam na 2. Dobre, 3 je väčší ako 2, takže chcem ísť ďalej. Oh, 4 je príliš veľký, takže viem, že 3 je ísť medzi 2 a 4, a ja musím opraviť ukazovatele a všetko to okolo. Ale ak by sme nemali striktne používať insert_sorted, Páči povedzme, že som predradiť 6, potom môj prepojený zoznam sa stane toto. To teraz nemá zmysel, tak pre insert_sorted, môžete len predpokladať, že zoznam je zoradený, aj keď operácia existujú ktoré môžu spôsobiť, že nebyť zoradená, a to je to. Nájsť užitočné vložka-tak to sú hlavné veci, ktoré budete musieť vykonať. Pre túto chvíľu, sa chvíľu robiť dĺžku a obsahuje, a tie by mala byť relatívne rýchlo. Blíži zatvárací čas, takže niekto niečo pre dĺžku alebo obsahuje? Chystajú sa byť takmer totožné. [Študent] Dĺžka. Poďme sa pozrieť, revízie. Dobre. Ak chcete vysvetliť? [Študent] Práve som vytvoriť ukazovateľ uzol a inicializovať ju ako prvý, čo je naše globálne premenné, a potom som skontrolovať, či je to null a tak som sa nedostal seg chybu a vrátiť 0, ak to tak je. Inak som priechodná, sledovanie v rámci celej číslo koľkokrát som vstúpil na ďalší prvok zoznamu a v rovnakom operácie inkrementom tiež prístup, že skutočný prvok, a potom som neustále, aby skontrolovať, či je to null, a ak je to null, potom preruší a len vracia počet prvkov som prístupné. [Rob B.] Má niekto nejaké pripomienky na čokoľvek? To vyzerá dobre správnosť múdry. [Študent] Ja si nemyslím, že je potrebné uzol == null. Jo, takže ak uzol == null return 0. Ale ak uzol == null potom-oh, je správnosť problém. Bolo to len vraciate aj, ale to nie je v pôsobnosti teraz. Potrebujete k tomu len int i, takže i = 0. Ale ak uzol je null, potom som sa ešte bude 0, a budeme sa vrátiť 0, takže tento prípad je totožný. Ďalším spoločným vec je mať k dispozícii vyhlásenie uzla vnútri slučky for. Dalo by sa povedať, oh, no. Poďme držať to ako toto. Asi by som dal int i = 0 tu, potom uzol * node = prvé tu. A to je asi, ako-ako sa zbaviť teraz. Toto je pravdepodobne, ako by som napísal. Dalo by sa tiež, pri pohľade na neho takhle. To je pre slučky štruktúry tu by mala byť takmer rovnako prirodzené pre vás ako pre int i = 0 i je menšia ako dĺžka poľa i + +. Ak to, ako sa určiť iteráciou cez pole, to je to, ako ste iterácii prepojeného zoznamu. To by malo byť druhou prirodzenosťou, v určitom okamihu. S tým na mysli, to bude takmer to isté. Budeš chcieť iteráciu prepojenú zoznam. Ak uzol-Nemám poňatia, čo hodnota sa nazýva. Uzla i Ak je hodnota v tomto uzle = i vrátiť true, a to je všetko. Všimnite si, že jediný spôsob, ako sa niekedy vráti false ak je nám určiť iteráciou cez celý prepojeného zoznamu a nikdy vrátiť true, tak to je to, čo to robí. Ako vedľajší poznámku, budeme pravdepodobne nebude mať pripojiť alebo predradiť. Rýchle posledná poznámka. Ak vidíte kľúčového slova static, takže povedzme static int count = 0, a urobíme počet + +, môžete v podstate si ju predstaviť ako globálne premenné, aj keď som práve povedal, to nie je, ako budeme realizovať dĺžku. Robím to tu, a potom počítať + +. Každý spôsob, ako môžeme zadať uzol do našej prepojeného zoznamu sme navýšením naše počet. Bod je to, čo statické kľúčové slovo znamená. Ak som mal int count = 0, že by normálne stará globálne premenná. Čo static int count znamená, že sa jedná o globálnu premennú tohto súboru. Je nemožné, aby nejaký iný súbor, Páči myslieť PSet 5, ak ste začali. Máte obaja speller.c, a máte dictionary.c, a ak ste práve deklarovať vec globálne, potom nič speller.c možno pristupovať dictionary.c a naopak. Globálne premenné sú prístupné akékoľvek. Oddiel C, ale statické premenné sú prístupné iba v rámci samotného súboru, tak vnútri spell checker alebo vnútri dictionary.c, toto je o tom, ako by som deklarovať svoju premennú pre veľkosť môjho poľa alebo veľkosť môjho počtu slov v slovníku. Vzhľadom k tomu, nechcem deklarovať globálne premenné, že niekto má prístup k, Naozaj len o to pre svoje vlastné účely. Dobrú vec, o to je tiež celé meno kolízie veci. Ak nejaký iný súbor sa pokúsi použiť globálnu premennú s názvom znakov, veci idú veľmi, veľmi zlé, tak to pekne drží veci bezpečné, a len vy môžete pristupovať, a nikto iný nemôže, a ak niekto iný deklaruje globálnu premennú s názvom počítať, potom to nebude v rozpore s vašou statické premenné s názvom znakov. To je to, čo statické je. Je súbor globálne premenná. Otázky týkajúce sa niečo? All set. Bye. [CS50.TV]