JASON Hirsch: Welkom, almal, tot Week 6. Ek is bly om julle almal te sien lewend en goed nadat Quiz 0, want ek weet dat was 'n bietjie rof. Maar gelukkig, julle almal het ongelooflik goed. En so dit is wonderlik. As jy in my artikel, het ek die meeste gegee julle terug jou vasvrae reeds. 'N Paar van julle, ek ontmoet na die klas. En as jy 'n verlenging student en jy nie jou toets terug ontvang het nog, jou TF is waarskynlik besig om dit en gradering, en sal dit terug te kry binnekort na jou toe. So my verlenging studente wat kyk nou - hopelik lewe - Ek sal jou vasvrae kry kort as well. Ons agenda vir vandag is soos volg. Eerste, ons gaan om te gaan oor 'n paar hulpbronne wat CS50 aan u verskaf het. Ons gaan om te gaan oor Quiz 0 volgende, en Ek sal enige vrae beantwoord enigiemand het oor spesifieke probleme. En dan, sal ons gaan oor lêer I / O en probleem stel 5. Diegene laaste twee onderwerpe sal neem die grootste deel van artikel vandag. Ek het hierdie lys elke week as 'n herinnering aan julle almal, maar van die kern artikel, ons het net 90 minute - ons nie in staat is om alles te dek wat ek sou graag te dek vir julle. Maar ons het 'n ton van die hulpbronne vir julle op te trek as wat jy kry om te weet die materiaal en werk deur jou probleem sit. 'N herinnering dat ek aanlyn 'n teks boks, die opstel van jou te vul as jy enige terugvoer vir my, beide positief en konstruktiewe, oor artikel. Dit URL is geleë reg hier. So asseblief, neem 'n oomblik as jy enige terugvoer, hetsy tydens afdeling of na, of na jy kyk na die video aanlyn, gee my jou terugvoer. Ek waardeer enige en alle van hulle. Daarom het ek met klein gesprekke met 'n baie van my studente deur die week - as ek die hand terug vasvrae, praat oor die Natuurlik, om te sien hoe jy doen. En een tema oor kom en oor om te praat oor - in besonder - probleem sit. En ek het vasgevang wat tema op die raad nou. In wese is, is daar 'n verskil tussen die draai in iets wat korrek en iets gedoen wat goed gedoen het. Die meeste mense is besig met fantastiese in terme van korrektheid - 5's of 4's op al psets. Die meeste mense kry diegene al die tyd. Maar, net omdat jy dit gedoen het iets reg, beteken nie jy het iets gedoen as elegant, of doeltreffend, of so skoon as wat jy kon dit gedoen het. En dit is wat die ontwerp - en tot 'n mindere mate, styl - byle is vir. So ek stoot julle almal en ander TFS is besig om julle, om nie net sy beurt in dinge wat reg is, maar draai in die dinge wat goed gekodeer is. Doen nie onnodig vir loops, nie herbereken veranderlikes as jy hoef te doen. Byvoorbeeld, terug te kyk na die probleem gestel 4, wanneer die plasing van die bakstene op die skerm, elke ry - elke baksteen in 'n gegewe ry het dieselfde y-koördinaat - dieselfde hoogte koördineer. Sodat y-koördinaat het nie nodig om word bereken in die binneland geneste For lus dat jy waarskynlik gebruik diegene bakstene te plaas op die skerm. Dit moet net elke bereken tyd wat jy aangeskakel 'n ry, of verskuif 'n ry. So sê as daar 10 stene in 'n ry, kan elke baksteen dieselfde het y-koördinaat en y-koördinaat kan net bereken word eens en vir almal. Dit hoef nie te bereken 10 keer nie, en dat die berekening behoefte om te gebeur in die werklike funksie oproep - die nuwe gracked funksie oproep. So as dit was 'n bietjie verwarrend vir jy meer generies, dinge wat hoef nie elke keer te gebeur jy gaan deur 'n VIR lus moet nie binne-in die FOR-lus, en moet nie gebeur elke keer as jy gaan deur die FOR-lus. Nog 'n goeie ontwerp voorbeeld het ons gesien in Week 3 vir 15, kan jy hou spoor van die zero. So wanneer jy inisialiseer die raad, het jy red - in 'n globale veranderlike, miskien - die x en y-koördinaat van die zero. En dan wanneer jy - in jou skuif funksie, wanneer jy ' 'n suksesvolle beweeg, moet jy werk om die ligging van die zero. Dit sou red jy uit wat te doen het geneste For loops om te kyk deur die boord elke keer in jou skuif funksie en vind die nul, of vind die teël, en dan kyk wat is langs dit. In plaas daarvan, het jy die plek van die nul, kan jy kyk net bo, onder, en aan die links en regs van dit, te vind die teël wat jy soek. Dus, in terme van die programme wat ons is skryf, hulle is nooit groot genoeg dat sommige van hierdie ontwerp besluite te neem werklik gaan belemmer jou program, of maak dit hardloop stadiger, of miskien selfs loop uit die geheue. Maar ons is nog steeds besig om julle te skryf as elegante en doeltreffende kode as moontlik. So as jy nie beland skryf dinge wat 'n aansienlik groter omvang, sal hulle met 'n goeie geskryf word ontwerp in Benewens die feit dat die korrekte. So 'n aantal van julle het gebring dat uit. Dit is iets wat ons soek - iets wat ons gaan om voort te gaan stoot julle op. As jy ooit enige vrae oor die ontwerp van jou program, voel vry uit te reik na my, en ek is bly om te loop deur jou program saam met jou, en wys 'n paar van die ontwerp besluite wat jy gemaak het, en gee jou 'n paar voorstelle oor hoe om te maak, selfs beter ontwerp besluite te neem. So ons gaan om aan te beweeg te praat oor Quiz 0. Voordat ons dit doen, doen niemand enige vrae oor wat Ek het so ver gedek? [Geritsel GERAAS] JASON Hirsch: Sewe sekondes. OK. Kom ons praat oor Quiz 0 vir 'n bietjie. Die meeste van julle het julle Quiz 0 se rug. As jy dit nie doen nie, hopelik onthou jy dit 'n bietjie. Maar as jy Quiz 0, dan is jy geneem ook toegang tot die PDF aanlyn in die monster oplossings. Het enige iemand enige vrae voor Ons spring in die week se materiaal oor 'n spesifieke probleem op Quiz 0 - waarom die antwoord is wat dit is? Is enigiemand verward oor enigiets? Selfs as jy het die probleem reg, maar wil net my om dit te verduidelik 'n bietjie meer, ek is gelukkig om dit nou te doen. So ek het jou gevra om ouens te voorbereid met 'n paar gedagtes oor Quiz 0. So wat wil om ons te kry begin met 'n vraag of kommentaar oor Quiz 0? [VRAESTEL geritsel] JASON Hirsch: Nie almal het perfek. So weet ek [lag] Daar het 'n paar vrae te wees oor Quiz 0. OK. Ja. Ompica. OMPICA: nommer 10. JASON Hirsch: nommer 10. Watter een was nommer 10? OMPICA: Die - JASON Hirsch: Ek haven't - OMPICA: Die insluit - JASON Hirsch: Nommer 10 was agt i - skryf agt tot ek? OMPICA: Ja. JASON Hirsch: OK. So 'n vraag wat jy kan hê gevra het, was ek Prescient? Die antwoord is ja. In artikel voor die toets, het ek gevra julle albei Sterling om die kode en agt tot i. Beide van hulle gebeur verskyn op die quiz. So hopelik, jy betaal aandag aan dit. En as jy het, dan sou jy waarskynlik goed gedoen op die twee. Maar agt tot i, het ons nie eintlik kode dit in die klas, maar dit was, weer, gevra oor die quiz. So 'n paar dinge te neem daarop toe kodering agt tot i. Die eerste ding wat, volgens die vraag, was wat jy nodig het om te kyk of die string was gelyk aan nul. 'N Paar mense het probeer om later op te gaan aan die program as s bracket ek was - so 'n spesifieke karakter in daardie string - was gelyk aan nul. Maar onthou, dat null is in wese - dit is goed om te dink aan nul as 'n nul pointer - 'n verwysing na zero - iewers in die geheue waar jy kan nooit toegang te verkry. So as daar iets is gelyk aan nul, jy weet dat dit nie geïnisialiseer is, of daar is niks. So is 'n kar ster, s bracket ek is 'n kar. So maak dit sin is te vergelyk met nul is, maar nie s bracket i te null. Maar weer - so dit was die eerste ding wat dat jy veronderstel is om te doen - check om seker te maak dat jy eintlik 'n ware string. Volgende, moet jy wou om deur te gaan elke karakter in die string. En so dit sou wees soos 'n s bracket Ek, byvoorbeeld, as ek jou Iterator. En neem dat die karakter, en kry sy werklike waarde. Jy het dit gestoor as 'n kar nie, maar die ASCII waarde vir nul - zero as 'n karakter - is nie eintlik die heelgetal nul. Dit is 'n ander nommer wat jy kan kyk in die ASCII-tabel. So 'n manier om te stel vir die - waarskynlik die beste manier is om vir dat - is trek uit dit die karakter waarde - nul as 'n karakter. So minus enkele aanhaling, nul, 'n ander enkele aanhaling. Dit sal doen wat jy getal as 'n kar, en kry dit gelyk aan die nommer as 'n werklike heelgetal. En dit is baie soortgelyk aan die benadering 'n klomp mense het in die probleem stel 2, met die keiser en Viginere - diegene getalle, wanneer jy was roterende hulle. So nadat jy dit as 'n aantal van nul tot nege, dan - afhangende van waar dit gaan in die uiteindelike nommer - wat jy nodig het om dit te vermeerder deur 'n krag van 10. Sommige mense het van die terug na die voor, en hulle het vermeerder die individu getal deur 'n mag van 10. Sommige mense verskuif vanaf die voor na agter - en so het die hoogste nommers bestel eerste - en wil red, wat in 'n globale teller-veranderlike. En dan elke keer deur die OM lus, vermeerder wat reuse globale werk veranderlike met 10, te maak ruimte vir die volgende kar. So dit was 'n bietjie verwarrend sonder my is dit op die bord skryf. Maar die monster oplossing is beskikbaar vir jou. Maar dit was die groot dinge Ons is op soek na. Ook 'n tjek om seker te maak dat elke individuele karakter was inderdaad 'n karakter tussen nul en nege, en nie 'n ander karakter, soos 'n A, byvoorbeeld. Dit was die dinge wat ons is op soek na in die vraag. Maak dit jou vraag? OMPICA: Ja. JASON Hirsch: OK. Is daar enige ander vrae oor Quiz 0? Wat van die opstel? Almal saam te stel reg? No Daar was 'n - [Lag] Enige vrae oor die samestelling proses? Sjoe. [VRAESTEL geritsel] JASON Hirsch: Ja. Michael. MICHAEL: Is getal 7 - ewekansige? JASON Hirsch: Nommer 7. Nommer 7 is 'n ewekansige heelgetal. Uitstekend. So jy kry 'n heelgetal n en 'n heelgetal b, en jy wil 'n ewekansige heelgetal tussen a en b. Ons kan eintlik skryf hierdie een op die raad, want hierdie een was een lyn van kode - een manier om dit te doen. So ons gegee drand as 'n funksie wat ons kan gebruik. En wat beteken drand - die veronderstelling dat dit is al gekeurde - wat beteken drand terugkeer? MICHAEL: 'n float tussen 0,0 en 1,0. JASON Hirsch: 'n nommer - ja. 'N getal tussen 0 en 1. En so het ons B en 'n. En dan moet ons ons ewekansige getal tussen 0 en 1 aan ons gegee deur drand. Sommige mense probeer b te sit, of b minus 'n, of iets in daardie hakies. Dit sou beteken dat hulle argumente aan hierdie funksie. drand nie enige argumente te neem - soos getString doen geen argumente neem. So dit is net oop paren, naby hakie - en dat, self, is die funksie oproep. En wat gee jou 'n aantal tussen 0 en 1. Natuurlik, ons het 'n hele reeks dat getalle kan wees in Sê, as b is 10 en 'n 5 is, het ons regtig wil 'n getal met 'n reeks van 5. So die volgende ding wat ons moet doen is om vermenigvuldig dit met die reeks b minus a. So die veronderstelling dat is vermenigvuldig. En dit sal ons 'n aantal binne 'n gegewe reeks. En dat spesifieke reeks synde die verskil tussen b minus a. En uiteindelik, dit sal net gee dit uit - sê die reeks tussen B minus 'n 5 is, wat sal ons 'n gee getal van 0 tot 5. Maar as 'n is in werklikheid 5, moet ons n hupstoot te gee Hierdie reeks tot waar dit eintlik veronderstel is om te wees, deur die toevoeging van 'n. So wat kry die logika reg. En dan, sou jy 'n ander vraag? MICHAEL: No Ek voel net regtig stom nou. [Lag] JASON Hirsch: No Moenie voel regtig dom. 'N Aantal mense het gesukkel met hierdie vraag. En dan, die ander vraag is, drand, jy sê, gee jou 'n float - gee 'n float. Maar hierdie funksie eintlik gevra vir 'n heelgetal te terugbesorg word. Jy hoef nie hierdie uitdruklik gooi tot 'n heelgetal, want hierdie bedrywighede sal dit as al 'n verrassing dryf - as 'n drywende punt nommer. Soos hierdie sal - selfs al is dit 'n heelgetal is, word dit korrek vermenigvuldig. Al die vermenigvuldiging sal werk. Jy hoef nie om dit hier te gooi. In werklikheid is, moet jy nie gooi dit. Dit sou - As jy wil 'n aantal gooi dit is tussen 0 en 1 - 'n ewekansige getal, 'n drywende punt - dan sal dit nie net 0 of 1 wees, so jy verloor al van daardie presisie. Maar aan die einde, wanneer jy terugkeer, dit outomaties kry terug gestuur as 'n heelgetal. So jy hoef nie te doen nie wat beslissende jouself. So dit was die antwoord op daardie vraag, nommer 7. Enige ander vrae oor Quiz 0? Ja, Annie. ANNIE: Wanneer gebruik ons ​​rekursiewe - Wanneer gebruik ons ​​iteratiewe sirkelroetes? JASON Hirsch: Wanneer gebruik jy rekursiewe - sodat meer algemeen, die voor-en nadele van rekursie teenoor 'n iteratiewe benadering. Kan iemand bied 'n pro of 'n con? Asseblief? Kan iemand nie. Wie kan 'n pro of 'n con bied? [VRAESTEL geritsel] Student 1: Rekursiewe minder Kodering - minder tik? JASON Hirsch: So oor die algemeen, rekursie veral 'n funksie - of 'n algoritme soos merge soort - wat homself verleen 'n rekursiewe benadering - dalk meer eenvoudig rekursief kode. En net meer sin maak om dit te rekursief doen nie. So wat sou wees om 'n pro te rekursie. Ander? Ja? STUDENT 2: Con te rekursie - Dit maak gebruik van meer geheue. JASON Hirsch: So presies reg. 'N rekursiewe funksie sal hou te voeg stapel rame na die stapel. So as jy wat op 'n baie getalle, en het dit te noem funksioneer 'n baie, dan sal jy beslis neem meer geheue, terwyl 'n iteratiewe benadering sal slegs die een het stapel raam op die stapel, want dit alles gebeur binne een funksie. Enige ander voor-en nadele? Ja. STUDENT 3: Voor vir rekursie. Jy hoef nie te bepaal in bevorder hoeveel keer die kode moes herhaal word. Jy kan 'n voorafbepaalde aantal het tye wat jy hoef te Itereer, dan rekursie is beter, want dit neem dat die resultaat. JASON Hirsch: Ek dink dit is waar. Maar ek dink in beide gevalle jy sou nooit - sou jy waarskynlik 'n paar toevoer van die gebruiker. Of om hierdie funksie sal 'n paar insette het wat sal bepaal hoeveel keer dit moet loop. So oor die algemeen, sal jy nie hard-kode - selfs in 'n iteratiewe benadering - hoe baie keer dat lus moet uitgevoer word. Het jy 'n ander jy was dink oor, Annie? OK. So dit is waarskynlik die twee - die grootste pro en die grootste be na 'n rekursiewe versus 'n iteratiewe benadering. OK. Enigiets anders op Quiz 0? Kom ons beweeg aan. File I / O. Daar is 'n wonderlike kort Hierdie week op lêer I / O wat hopelik jy het gesien hoe verskeie tye en bewonder. Baie van die werk gegaan het in daardie, en ek het hoor dit is intens nuttig. Ek het ook die skakel op hierdie skuif, in die geval wat jy het nie 'n kans om dit te sien 10 keer. So, gaan ons kortliks gaan oor die groot stappe tot die opening en werk met lêers, en dan gaan ons duik in 'n kodering probleem voor die ondersoek van die probleem stel. So weer, ek gaan om dit te sit op die skerm, maar ek gaan om te praat vir net 'n minuut oor wat ons is doen hier met die lêer I/O-- wat beteken dit? Dit beteken dat ons kan skep ons programme, en dan het ons programme uitgang, en nie 'n impak op gemaak het die wêreld buite ons program. Maar toe ons begin werk met lêers - beide lees in en skep hulle - ons kan 'n effek hê op die wêreld buite ons program. Net soos as Microsoft Word nie in staat was enige Word-dokumente te maak, dan keer Microsoft Word ophou, al jou werk sou gegaan word, en dit sou werklik nutteloos. Ons uiteindelik wil nie in staat wees om te skryf programme wat kan beïnvloed die wêreld rondom hulle, beide deur in komplekse insette - in terme van lêers en via lêers, en ook die skep van 'n interessante en dwingende uitgange - in terme van verskillende vorme van lêers. So dit is hoekom ons is besig om te leer hoe om te werk met lêers. Meer spesifiek, wat ons doen is as volg. Dit is baie eenvoudig. Daar is slegs 'n paar van die stappe, en hulle hier op hierdie kode gelys. So ons gaan deur te gaan hierdie kode reël vir reël. Eerstens, jy sien uitgelig - wanneer jy werk met 'n lêer, ongeag van die tipe lêer dit is, jy nodig het om dit oop te maak. En dit is met 'n oproep om fopen - reg hier. Jy sluit die naam van die lêer. As die lêer is nie in jou gids, of die gids waar die program woon, dan moet jy ook in te sluit 'n pad na die plek waar die lêer is. Ons gaan om te aanvaar dat hierdie lêer genaamd "text.txt" - 'n eenvoudige teks dokument - is in die dieselfde gids as hierdie program is. So dis 'n ander ding in te hou gedagte - dat as jy 'n lêer oop te maak iewers anders, wat jy eintlik nodig het sy plek in te sluit. Tweedens, kan jy 'n argument slaag om fopen, en dit is wat jy wil doen, met die dossier. Daar is drie hoof argumente wat jy gaan om te slaag om fopen. Wie kan my die drie? Wie kan my een van hulle? Ja. STUDENT 4: Die lêer naam? JASON Hirsch: Jammer. Drie belangrikste argumente wat jy kan slaag as die tweede argument te fopen. Jy is reg - die lêer se naam is die eerste argument. Maar die tweede argument te fopen is gewoonlik drie stringe, en - ja. Aleja. Aleja: A vir aanlas. JASON Hirsch: A, as jy wil voeg 'n lêer wat reeds bestaan. STUDENT 5: R om te lees. JASON Hirsch: R, as jy wil om te lees van 'n lêer. STUDENT 6: W vir skryf. JASON Hirsch: en W, as jy wil 'n lêer te skryf. So in hierdie geval, ons skryf die lêer, sodat ons 'n w. Jy dit oopmaak, moet jy ook om te red wat lêer iewers, en dit is met die kode aan die linkerkant van die opdrag operateur - Ek is die skep van 'n verwysing na 'n lêer genoem word, in hierdie geval, lêer. Ons gaan nie te bekommer wat hierdie hoofletters FILE ding is. Voldoende om te sê, dit is 'n lang stroom van nulle en ene. En dit is hoe ons gaan bedryf het en dit verstaan. Die volgende ding wat ons nodig het om te doen nie - en dit is ongelooflik belangrik - - wanneer jy 'n lêer oop te maak Trouens, wanneer jy malloc noem, want dit Byvoorbeeld, en kry 'n paar geheue en probeer en stoor dit in 'n wyser, het jy altyd wil om te kyk om seker te maak dat funksie het nie weer null. So in hierdie geval, is ons om toe te maak seker te maak dat ons eintlik het die korrek lêer, en daar was geen fout in ons program. Volgende, wanneer ons nagegaan om seker te maak dat ons 'n werkende lêer, kan ons skryf, of lees, of voeg by die lêer. In hierdie geval, is ek net te druk een lyn na hierdie lêer. Hoe weet ek dit? Wel, ek is met behulp van hierdie funksie genoem fprintf. Al die funksies wat jy sal gebruik word om toe te skryf aan, of die lees van, of manipuleer van lêers sal soortgelyk wees funksies wat jy nog nooit gesien nie, maar begin met die letter F, staan ​​vir die lêer. En fprintf, in teenstelling met ons gewone druk inligting, neem 'n ekstra argument, en dit is die lêer waar jy wil hierdie lyn te druk. Ek niks nie hoef te die reg van ohai. Ek het nie die derde nie argument te printf - of die tweede argument te printf, die Derde argument te fprintf, want ek het geen plekhouers hier. Ek is nie insluitend enige veranderlikes. Maar weereens, fprintf en al hierdie lêer funksies wat werk met lêers is oor die algemeen gaan om die lêer te moet waarop hulle werk. Ten slotte, die laaste belangrike ding om te doen, is om die lêer te sluit, net soos met - wanneer ons malloc iets, ons wil om iets te bevry, sodat ons 'n geheue lek - ons wil ons lêer te sluit. Indien hierdie program afgesluit sonder sluitingsdatum die lêer, is die kans niks sou gaan verkeerd is, veral as dit was 'n klein lêer. Maar dit is beslis 'n goeie kodering styl en oefen om altyd sluit jou lêer wanneer jy klaar is om dit te gebruik. So dit is die basiese beginsels van die lêer I / O. Jy het waarskynlik gesien wat voor of gekyk het dit in daardie fantastiese kort. Het enige iemand enige vrae het, voordat ons gaan in 'n praktyk kodering probleme, sowat lêer I / O of die stappe Ek het net gegaan oor? [TIK klanke] JASON Hirsch: Het jy het 'n vraag, Avi? AVI: No JASON Hirsch: OK. Ek gaan 'n ander om te wag sewe sekondes. [Lag] Dit is 'n baie goeie punt. Julle het net nie hou nie om vrae te vra. Dit is fyn. OK. So ons eerste oefening probleem is, ons is gaan die funksie van te dupliseer 'n command line instrument wat jy waarskynlik gebruik voor - kopie - die kopie hulpmiddel. As jy tik CP en dan beweeg dit twee argumente in jou terminale, kan jy kopieer 'n lêer. En dit is wat ons gaan om nou te skryf. So weer, af te lees van hierdie skuif, ek wil jy 'n program wat neem om te skryf twee en slegs twee opdrag-lyn argumente - 'n bron lêer en 'n bestemming lêer - en afskrifte van die inhoud van die bron lêer na die bestemming lêer een greep op 'n tyd. So dit is 'n baie om te vra. Weereens, 'n goeie benadering tot hierdie is om te nie reguit na die C-kode, maar breek dit af in 'n paar van die stappe. Eerstens, dink oor die logika - presies wat ek vra om te doen - en verstaan ​​al die stappe vir hierdie probleem. Nie in C nie, net in 'n paar pseudokode, of selfs 'n geestelike model van wat gaan aan. Volgende, wanneer jy die pseudokode af, uit te vind hoe die pseudokode kaarte op gereedskap en dinge wat ons het geleer om te gebruik in C. En uiteindelik, wanneer jy alles wat saam, dan kan jy die probleem kode. Neem 5 tot 10 minute tot werk op hierdie probleem. Ek sal die instruksies sit terug in 'n tweede. En dan gaan ons oor te gaan die pseudokode, en die kode leef dit as 'n groep. As jy enige vrae het terwyl jy werk op hierdie, voel vry om in te samel jou hand, en ek sal kom rondom en hulle antwoord. STUDENT 7: Kan ek krap 'n stukkie papier? JASON Hirsch: Wat gaan aan? [TIK klanke] JASON Hirsch: OK. Kom ons gaan oor die pseudokode eerste en dan sal ek gee jou 'n paar minute te voltooi kodering. Wie wil om te begin my af met die eerste reël van die pseudokode vir hierdie funksie? STUDENT 8: Maak seker dat jy twee lêers is gegee. JASON Hirsch: OK. En as ons nie? STUDENT 8: Ek sou terugkeer 0. JASON Hirsch: Moet ons terugkeer 0? STUDENT 8: Terug a - uitwissing. Jammer. JASON Hirsch: Ja. Waarskynlik nie 0. Omdat 0 beteken dat alles goed was. OK. So dit is die eerste reël van pseudokode. Wie het die tweede lyn van pseudokode? STUDENT 9: Open beide die lêers? JASON Hirsch: Maak beide lêers. OK? STUDENT 10: Toets om te sien As die lêer is NULL? JASON Hirsch: Gaan maak seker nie, is NULL. As 'n eenkant - streep 0 - is dat NULL? STUDENT 11: No JASON Hirsch: Dit is nie NULL. Dit is bekend as die NULL Terminator. Dit is eintlik gespel met net een l. So nagaan iets teen dat - dit is eintlik 'n karakter - so nagaan iets teen wat nie dieselfde as om te kyk of dit gelyk NULL. En sommige mense - op hul vasvrae en hulle probleem stelle - het die twee van daardie verwar. Maar die twee van hulle is in werklikheid anders. Een eindig 'n string - een is 'n verwysing na 0. STUDENT 12: Hoekom sou jy nie gaan om te maak seker dat die lêers is nie NULL voordat jy dit oopmaak? JASON Hirsch: So oop red iets in die lêer. En as jy terug gaan hier - sodat hierdie lyn - fopen - sal 'n adres en stoor jou die adres in die lêer as dit werk. As dit nie werk nie, is dit sal slaan NULL - STUDENT 12: Oh. OK. Het jy. JASON Hirsch: In lêer. So kan jy nie kyk vir NULL voordat jy dit oopgemaak het. NULL beteken iets gedoen het nie korrek te werk. OK. So check om seker te maak is ook nie? Of is? Wat dink ons? Ons gaan met dit. STUDENT 13: Is. JASON Hirsch: Is? Dit is ook nie? STUDENT 13: Is. JASON Hirsch: OK. Ons lyk sommige te hê konsensus oor wat. Nóg is leeg. OK, volgende lyn van pseudokode. Wie het nog nie 'n lyn aan my gegee het nie? Ons sal wag vir jou. Ja. STUDENT 14: Jy moet lees vanaf die eerste lêer? JASON Hirsch: OK. STUDENT 14: Of ons gebruik fscanf of iets soos dat die eerste lêer? JASON Hirsch: So wil ons lees van die eerste lêer en - Kom ons stel dit reg hier. Lees van die bron lêer. En dan, wat doen ons na ons lees van die bron lêer? Iemand anders? Student 15: Skryf in die bestemming lêer? JASON Hirsch: Ons skryf aan die bestemming lêer, en - OK. Wat anders is ons ontbreek? Iemand anders wat nie aan my gegee 'n reël van die kode nie - van pseudokode. Ja. STUDENT 16: Miskien kan jy altyd kyk of daar is iets te lees, soos die volgende lyn? Dit is soos die volgende lyn, sien of dit bestaan. [Elektroniese geluid] JASON Hirsch: Oeps. Dit is my joernaal sagteware. Ja? STUDENT 16: Ja. JASON Hirsch: So gee dit vir my nog een keer. STUDENT 16: Kyk of daar nog 'n volgende lyn van die bron lêer te lees. JASON Hirsch: OK. So ons is nie lees lyne - gelees grepe hier - maar jy is reg. Ons wil om te lees en skryf tot daar is nie meer grepe. OK. En so moet dit regtig ingekeep word 'n bietjie, want hulle is onder daar. Reg? Totdat ons uit grepe, gaan ons lees van die bron lêer en skryf na die bestemming lêer. En dan, wat is die laaste lyn van pseudokode? Iemand wat nie gegee vir my nog iets. STUDENT 17: Maak die lêers? JASON Hirsch: Presies. Maak die lêers. So daar is ons pseudokode. Ek gaan die pseudokode te sit in gedit, en in 'n paar minute het ons sal dit saam kode. OK. Kom ons begin as 'n groep. Nishant, ek het my nuwe lêer. Ek het net hierdie oopgemaak. Untitled Document 1. Wat is die eerste ding wat ek moet doen? Nishant: Sluit biblioteke? JASON Hirsch: OK. Wat biblioteke? Nishant: Stdio.h, stdlib.h, ek glo? JASON Hirsch: OK. Wat is stdlib vir? Nishant: ek het vergeet. JASON Hirsch: OK. So sluit Streek Leuven B.. Wat moet ek doen, selfs voor Ek begin kodering? Nishant: Skryf 'n kop? JASON Hirsch: Hoe kry ek dit ingekleur? [INTERPOSING Voices] Nishant: Hoe kry jy dit ingekleur? JASON Hirsch: Hoe kleur ek kodering? Nishant: Ek weet nie. Oh. Red. JASON Hirsch: red. Ja. Ek moet dit stoor as 'n. C. So stoor dit op die lessenaar as cp.c. Soet. En as ek wil vol styl te kry punte, wat moet ek sluit by die top? Nishant: Jy kan jou naam, die naam skryf van die program, en die doel van die program, asook? JASON Hirsch: Lyk goed. Uitstekend. So jy het ons begin af perfek. # Sluit - Ons sal ook skryf - OK. So ek dink ek al ingestel om te gaan. Wie het die eerste reël van die kode vir my - of die eerste reëls van die kode wat dit sal neem ons eerste om te voldoen aan kommentaar in pseudokode? Jy. STUDENT 18: Indien dit nie int argc, en dan kar * bevat SPASIES? JASON Hirsch: Ek dink jy is reg. Kom ons verander dit hoof, oop hakie na int, int argc, komma, char * bevat SPASIES? Soos wat? STUDENT 18: hakies. JASON Hirsch: hakies. Open bracket, naby bracket, naby ouer. Perfect. Nou kan ek neem opdrag-lyn argumente. OK. Verseker ons gegee twee lêers. Jy kan my gee wat as goed. STUDENT 18: As argc - hierdie een is nie gelyk aan 3. JASON Hirsch: As oop hakie argc nie gelyk 3? STUDENT 18: Ja, jy terugkeer 1 of enigiets. JASON Hirsch: Jammer. STUDENT 18: Terug 1 of enigiets. JASON Hirsch: Terug 1. OK? Groot. Maak beide lêers. Wie kan my help beide lêers oop te maak? Wie het nie kode aan my gegee het nie? Kurt? KURT: So hoofletters F-ek-L-E ster bron. JASON Hirsch: Ek gaan om uit te neem van die vokale. Dit is cool. Dit is soos Tumblr. STUDENT 18: Equals fopen - JASON Hirsch: Equals fopen? STUDENT 18: Open paren, bevat SPASIES, oop bracket. JASON Hirsch: wag. Jammer. Open hakie. OK. STUDENT 18: Ja. Bevat SPASIES sub 1. JASON Hirsch: Sub 1? STUDENT 18: Ja. Bevat SPASIES oop bracket 1 - ja. En dan komma, en dan oop dubbel quote, r, dubbel quote, naby paren, kommapunt. JASON Hirsch: Sweet. En wat van die ander een? STUDENT 18: baie soortgelyk, maar in plaas daarvan van S-R-C, sou jy dit noem D-S-T. JASON Hirsch: Oo! Ek hou daarvan. STUDENT 18: Just D-S-T. Ja. En dan bevat SPASIES, oop bracket, 2. Ja. En dan w plaas van r. Ja. JASON Hirsch: Groot. Volgende paar lyne. Ook, as iemand het om dinge te voeg lyne wat ons gedoen het, voel vry om te voeg dié sowel. Maak seker dat nie een is leeg. Wie kan my gee die kode wat ek nodig het om te oortuig dat lyn van pseudokode? Archer. ARCHER: As src gelyk gelykes NULL of dst gelyk gelykes NULL, dan moet jy terugkeer - JASON Hirsch: Wat? ARCHER: Terug 2? JASON Hirsch: Terug 2. So as oop hakie src gelyk gelyk NULL, of - wat dit ook al thing's - pyp? Pyp? Ons sal noem dit die pyp. Pyp, pyp, dst gelyk gelykes NULL, terug 2. OK? Totdat ons uit grepe - Ons soort van oorgeslaan oor hierdie stap uit die pseudokode deel te gaan om hier te. Maar totdat ons uit grepe - Wat beteken dit klink soos? Watter tipe C-struktuur - maar ek gebruik nie die woord struktuur, want ons gaan om te begin met wat in ander gevalle - maar C instrument klink soos? STUDENT 19: 'n lus. JASON Hirsch: 'n lus. Klink soos 'n lus. So wat kan gee my die eerste reël van die lus-kode reg hier? Jy kan ook kies watter soort lus wat jy wil, as jy my hierdie lyn van kode. Daar is drie soorte. Jy kry om te kies. Ek stel voor een van daardie. Avi. Watter een wil jy hê? AVI: VIR. JASON Hirsch: VIR. AVI: Int ek gelyk is aan nul. JASON Hirsch: OK. AVI: Hierdie deel ek is nie seker oor. Maar ek is minder as die grootte ster bron? Ek is nie seker van dat. JASON Hirsch: OK. AVI: Omdat jy die grootte van 'n lêer, reg? JASON Hirsch: So dit sal waarskynlik nie gee ons die grootte van die werklike lêer in grepe. So wat anders kan ons doen? Wat is 'n ander tipe lus? Of moet ons vashou aan die FOR-lus? STUDENT 20: Kan jy 'n WHILE-lus? En dan, wat jy wil doen, is om you'd - want ons het 'n kar * vir die lêer. So as ons hou net die verhoog wat totdat ons wil die NULL karakter op vind die einde van dit? Of nee, is dit nie hoe lêers te werk? JASON Hirsch: sodat ons kan hou verhoog van die kar * totdat ons die NULL - STUDENT 20: In wese gaan hou karakter deur karakter totdat ons getref die einde van die lêer. JASON Hirsch: Ja. So dit is wat ons wil doen. Ons wil lees, karakter te hou deur karakter, totdat ons kry om te die einde van die lêer. STUDENT 20: Ja. Vind - Wat is die einde of stopteken aan die einde van 'n teks lêer. JASON Hirsch: OK. So wanneer ons by die einde van die lêer - hoe weet ons ons het bereik die einde van 'n lêer? As ek vra - so laat ons stap terug. Wat is 'n funksie? Kom ons gaan na hierdie lyn hier. Lees van die bron lêer. Wie kan my dat die lyn van die kode? STUDENT 21: Fscanf? JASON Hirsch: Fscanf. OK. Wat as ek wil om te lees, baie spesifiek, een greep? STUDENT 21: Ek weet nie. JASON Hirsch: OK. Selfs makliker as fscanf - wat is 'n - Ek wil om te lees van 'n bron lêer? Lees vanaf 'n bron lêer. Wat is 'n funksie - ja. STUDENT 22: Dit is fread? JASON Hirsch: Fread. Ek dink laat ons vashou met dat 'n mens vir nou. Watter soort argumente nie fread neem? STUDENT 22: Waarskynlik die lêer tipe, en dan plek in die lêer? JASON Hirsch: Wat kan ek tik hier om uit te vind watter soort van argumente fread neem? MEERVOUDIGE STUDENTE: Man fread. JASON Hirsch: Man fread en fwrite. Lyk asof hulle uithang saam. So fread neem hoeveel argumente? STUDENT 23: Vier. JASON Hirsch: Dit neem vier argumente. Dit neem 'n wyser, 'n grote, en dat ding, wat is vreemd, en 'n paar lêer. OK? Ons lees oor dit hier. "Die funksie fread lees n memb elemente van data, elke grootte grepe lank, uit die stroom daarop deur stroom, berging van hulle by die plek gegee deur wyser. " So vier argumente. Hoekom moet ek nie net kopieer dit, en plak dit hier. OK. So wat kan begin vul hierdie argumente vir my? Avi. AVI: Neem uit die afgrond. Sit net src. Neem uit wyser en die sterre. Sit src. Dan - JASON Hirsch: So ek gaan om te stop jy daar, want dit is nie korrek nie. Jy is reg met src nie, maar waar moet src gaan? [INTERPOSING Voices] JASON Hirsch: Daar moet gaan hier verby. Dit is die SRC - ons src is 'n tipe. Kom ons kyk hier. Dit vra vir 'n tipe lêer * Ons eintlik sien hulle soos dit. So, dit is te vra vir 'n argument van tik lêer * genoem stroom wat src. OK? Wat grootte van dinge doen, ons wil om te lees? Ek het julle dit in die beskrywing van die probleem. STUDENT 24: Een byte op 'n tyd. JASON Hirsch: Een byte. Hoe groot is 'n greep? Sy grootte is in grepe, so wat kan ek net daar? STUDENT 25: One. JASON Hirsch: Een. Right. Sy grootte is in eenheid byte, so 1 is 1 byte. Hoeveel wil ek lees op 'n tyd. STUDENT 26: Een? JASON Hirsch: Een ding. Ek wil een ding van grootte te lees 1, een happie op 'n slag. En waar kan ek dit, as ek dit lees? STUDENT 27: bestemming? JASON Hirsch: So ek kan nie dit reguit in die bestemming. STUDENT 28: Jy gaan sit dit in 'n derde wyser? STUDENT 27: na die bestemming. JASON Hirsch: OK. Ja. STUDENT 29: Jy kan iets verklaar optree as 'n tydelike stoor vroeër. JASON Hirsch: OK. Gee my dat. STUDENT 29: Nog 'n lêer wyser, miskien? JASON Hirsch: OK. So dit is nietig ster - dit is 'n soort leemte ster, sodat dit nie 'n lêer wyser te wees. En as ek lees een greep, waar sou 'n goeie plek wees een greep op te slaan? STUDENT 29: 'n skikking? JASON Hirsch: 'n skikking. OK. En wat anders is iets wat net een greep grootte? STUDENT 30: 'n kar *? STUDENT 29: Ja. JASON Hirsch: 'n kar * is nie een byte. STUDENT 29: 'n kar. JASON Hirsch: 'n kar is een byte. Reg? So kom ons noem hierdie buffer is 'n generiese naam wat gebruik word vir hierdie dinge te stoor iets tydelik. So ek 'n buffer. Reg? Maar dit neem nie 'n leemte *. So miskien is jy reg, dat dit behoort 'n buffer van grootte 0 wees. So dit slaan een - reg. Omdat hierdie reg hier - char buffer is 'n karakter nie, maar dit neem 'n leemte * - 'n wyser. So ek dit kan doen en nou buffer is 'n muis. Wat anders kon ek doen? STUDENT 31: Sit 'n ster langs teken. JASON Hirsch: ek kon het dit geskape char *. OK. Wat is 'n ander ding wat ek kan doen? Of laat ons gaan met hierdie een. Char * buffer, so wat ek sit hier? STUDENT 31: buffer. JASON Hirsch: buffer. Buffer is 'n verwysing na 'n kar. En in daardie plek, ons sit een greep van iets wat ons gelees het. Ja. Avi. AVI: Net 'n vinnige vraag. Wil jy buffer te malloc? JASON Hirsch: Wie kan die vraag beantwoord? STUDENT 32: Wel, beteken dit nie regtig punt na iets nou, so - JASON Hirsch: Maar doen ons wil om dit te malloc? STUDENT 32: As jy om dit te doen wat manier, dink ek, ja, want jy moet 'n plek om dit te wys. JASON Hirsch: Het ons het om dit te malloc? STUDENT 33: As jy gaan om te gebruik dit buite die lus. JASON Hirsch: Gaan ons gebruik dit buite die lus? STUDENT 34: Ja. STUDENT 35: Wag. Wil ons dit te verklaar in die lus om verder? JASON Hirsch: So ek dink ons ​​het sommige pseudo WHILE-lus hier dat ons probeer om uit te vind wat ons het nie na gekry nie. Ons het dit nie nodig om malloc. Ons is aktief in die belangrikste, dit gaan slegs om binne hierdie lus gebruik word. Dit hoef nie te bestaan buite hierdie. So dit kan 'n plaaslike veranderlike. Jy het 'n verwysing na 'n plaaslike veranderlike. STUDENT 36: Maar dit is nie wys na iets. JASON Hirsch: Nee, dit is nie geïnisialiseer tot niks. Maar ons is nie van plan om dit te gebruik ook. Ons gaan om iets in dit die eerste keer dat ons dit gebruik. So dit lyk OK. Sodat ons nie nodig het om malloc nie hier nie. En ek dink dit is OK as is. OK. Ons het die fread lyn. Kom ons doen die volgende reël. As ons wil 'n lêer te skryf, wat 'n goeie funksie te gebruik om dit te doen? STUDENT 37: Fwrite? STUDENT 38: fprintf? JASON Hirsch: fprintf is een. Wat is 'n ander een? STUDENT 39: Fwrite. JASON Hirsch: Fwrite. En vir ons doeleindes, fwrite, wat ons hier sien, is waarskynlik 'n beter keuse. Dit neem vier argumente as well. Nishant, kan jy gee my die argumente? Nishant: Die eerste een gaan net buffer te wees. JASON Hirsch: OK. Nishant: Die tweede een se net gaan om te wees 1. Derde een gaan wees 1. En die vierde een gaan dst te wees. JASON Hirsch: Het enige iemand het enige vrae oor die lyn? Dit lyk goed. OK. So nou lyk dit soos die een ding wat ons is missing - eintlik, laat skryf hierdie laaste reël. Maak die lêers. Wie kan voltooi ons op skrif hierdie laaste twee lyne? Ja. Jammer, wat is jou naam? LUCY: Lucy. JASON Hirsch: Lucy. LUCY: Fclose src en dan fclose bestemming. JASON Hirsch: Fclose, oop paren, SRC, naby paren, kommapunt. En fclose - ja? LUCY: Open hakies, dst en dan kommapunt. JASON Hirsch: Groot. En wat moet ek aan die einde? LUCY: Terug 0. JASON Hirsch: Terug 0. Moet ek? Net 'n vraag. Het ons terugkeer 0 in te sluit? MEERVOUDIGE STUDENTE: No JASON Hirsch: No Main doen dit outomaties As jy aan die einde. Maar ek dink dit is lekker om te sluit dit uitdruklik. Veral wanneer ons terugkeer ander dinge in die hele program. OK. Dit is wat ons mis - TERWYL wat? Wie kan dink van 'n paar - het 'n sekere sin van die dinge wat kon daar in te gaan? Selfs al is dit net in 'n paar pseudokode soos taal? Wat is ons regtig - wat wil ons gaan totdat? Ja, Lucy. LUCY: Die einde van die lêer. JASON Hirsch: Die einde van die lêer. So, wat beteken dat jy nie teen die einde van die lêer? LUCY: Sodra jy bereik die einde van die lêer, stop. JASON Hirsch: OK. So wanneer ons aan die einde van die lêer. Hoe weet ons wanneer ons bereik die einde van die lêer? STUDENT 40: Ek dink buffer sal ingestel word na NULL. STUDENT 41: Buffer verklaar binne die lus. JASON Hirsch: So jy dink buffer sal ingestel word na NULL. Hoekom sal buffer word ingestel om te NULL? STUDENT 40: Want as jy fread, jy probeer om te sit niks in buffer. JASON Hirsch: OK. So jy dink fread - wanneer ons die einde van die bereik het lêer, wat fread gaan doen? Ek dink dit is die vraag ons het om uit te vind. Wat beteken fread doen? Is dit sit NULL in buffer, of beteken dit iets anders doen? Hoe kan ons uitvind wat dit beteken? STUDENT 42: Man. JASON Hirsch: Man. So laat ons kyk hier. Terug waarde. Op die sukses, fread en fwrite die standaard van die aantal items lees of geskryf. Hierdie getal is gelyk aan die aantal grepe oorgedra net vir grootte is 1. Indien 'n fout begaan, of die einde van die lêer is bereik, die terugkeer waarde is 'n kort item telling of 0. So vir ons doeleindes, indien fread uithoeke die einde van die lêer, en lees uit die einde van die lêer, is daar niks meer om te lees, wat gaan dit om terug te keer? STUDENT 43: Zero? JASON Hirsch: Wat? STUDENT 43: Zero? JASON Hirsch: Zero. Dit gaan om terug te keer nul. So weet ons dat fread, wanneer ons bereik die einde van die lêer, gaan om terug te keer nul. Hoe kan ons wat tot ons voordeel? AVI: Jy kan 'n veranderlike buite verklaar van die lus genoem tjek. As tjek gelyk aan - vir nou - een. JASON Hirsch: OK. AVI: En dan kan jy sit 'n INDIEN verklaring regs na fread sê as fread gelyk aan nul - no. JASON Hirsch: Wie kan help Avi uit? AVI: Wat is die waarde teruggestuur deur fread? JASON Hirsch: Ons het net gegaan oor dat. AVI: Hoe doen jy dit voor? JASON Hirsch: So is dit terug - laat kyk hier - dit gee 'n size_t, wat in wese 'n heelgetal. So dit gee 'n heelgetal. En in ons geval, dit sal terug 1 of 0 - 1 As dit een ding lees - een greep, en 0 as ons aan die einde gekom. So as fread - ja? STUDENT 45: Kan jy nie net die volle fread (buffer, 1, 1, src) in die terwyl loop? JASON Hirsch: So jy stel om dit te doen in daar? [INTERPOSING Voices] JASON Hirsch: Hou op. So ons is ontslae van daardie. So jy stel om fread in daar? Wat moet ons ook beweeg As jy wil om dit te doen? STUDENT 45: Die buffer buite. JASON Hirsch: Ons moet ook hierdie skuif hier. STUDENT 45: Maar doen dit voortdurend beweeg dit vorentoe? [INTERPOSING Voices] JASON Hirsch: OK. So dit is wat Okshar voorgestel. Ons maak ons ​​buffer. Ons TERWYL fread, dan fwrite ons. Gedagtes oor hierdie? STUDENT 46: My vraag is net, sou dit eintlik die opdrag fread voer? JASON Hirsch: Groot vraag. Wanneer jy sit 'n funksie oproep binnekant van 'n toestand is, beteken dit funksie oproep voer? Ons het voorbeelde van hierdie gesien het nie. Reg? STUDENT 46: OK. Ja. Sodat dit nie uit te voer. JASON Hirsch: Ons het dinge gesien soos dit voor, waar ons 'n funksie oproep binnekant van 'n toestand. Maak daardie funksie oproep voer? Ja. So die antwoord is ja. Hierdie funksie oproep sal voer. Maar weereens, is dit wat ons wil hê? Wat is een manier waarop ons kan vind uit te vind of dit is wat ons wil hê? MEERVOUDIGE STUDENTE: Doen dit? JASON Hirsch: Ons kan dit loop. Maar voor ons dit doen, ons kon ook redeneer deur middel van hierdie. Indien - sê ons het 'n greep in ons dien, ons sal kry om hier, ons sal kry om hierdie kode. Dit sal loop. fread sal een byte terugkeer en stoor dit in die buffer. En dit sal evalueer tot 1, reg, nadat hy terug 1. Dus, terwyl 1. Dit beteken nie dat die kode binne-in Die while lus sal voer? STUDENT 47: Ja. Dit is waar. JASON Hirsch: Ja. 1 is waar. Dit is nie 0. So die kode binnekant hier sal voer. So ons sal skryf nie. Ons sal terug te skuif na hierdie weereens. Nou het ons - ons is aan die einde van ons lêer. Ons lees van die einde van ons leer, want ons het net een byte in dit. Fread terug 0, winkels iets in buffer. Ek eerlik weet nie wat dit slaan in buffer. Ons kan seker kyk om te sien wat hy doen nie. Dat ek eerlik weet nie. Ons weet nie, wie wat omgee dit slaan in buffer? Maar dit beteken terugkeer 0. En sal Terwyl 0 voer? TERWYL 0 sal uitvoer nie. So dan sal ons hier te beweeg. So laat ons 'n opsteek van hande of hierdie is die kode wat ons moet loop, of as ons moet veranderinge eerste doen. So as jy dink - jy het om te stem. As jy dink ons ​​moet hierdie kode hardloop soos dit is, kan jy jou hand. OK. Daar is een - jy het 'n vraag, kommer? Ja. STUDENT 48: Nadat ons beweeg buffer buitekant van die lus, doen ons het om dit te malloc? JASON Hirsch: Groot vraag. Nadat ons beweeg buffer buite die lus, het ons dit te malloc? Dit is 'n omvang vraag. As ons inisialiseer buffer buite van hierdie lus, sal dit bestaan binnekant van die loop? MEERVOUDIGE STUDENTE: Ja. JASON Hirsch: Ja. Die omvang dek binnekant van die loop, en, regtig, enigiets onder dit binne van hierdie kode, insluitend die dinge in hier. Sodat ons nie nodig het om dit te malloc. Dit is 'n plaaslike veranderlike, en die omvang sluit nog steeds die lus. STUDENT 49: Het ons nodig om dit te bevry? JASON Hirsch: Het ons moet vry buffer? STUDENT 49: Ja, as ons dit nie doen nie malloc. JASON Hirsch: Het ons moet vry buffer? Ons doen nie. Weereens, dit is 'n plaaslike veranderlike, sodat ons nie nodig het om dit te bevry. OK. Kom ons kyk wat gebeur. So is dit geïnitialiseerd. Dit was wat iets wat Marcus voorgestelde vroeër. So het ons dat die fout, veranderlike buffer is geïnitialiseerd wanneer hier gebruik. Hoe kan ons dit regmaak? STUDENT 50: malloc dit? STUDENT 51: Equals NULL? STUDENT 52: Sê buffer gelyk NULL. JASON Hirsch: OK. Lyk goed. Ons het dit nou. Kom ons skep iets kopiëring te probeer. So het ons ons teks lêer. Hoe kan ons hierdie program? Ja. STUDENT 53: Jy kan dot doen streep CP, test.txt. En dan kan jy 'n ander lêer naam wat dit sal stoor in. JASON Hirsch: OK. Ons sal noem dit out.txt. Cool? Seg skuld. Gedagtes oor die seg skuld? Dit is 'n groot. Hoe kan ons uitvind waar die seg skuld is? Wat? STUDENT 54: GDB. JASON Hirsch: GDB. Ons loop gdb deur te skryf gdb dot streep die naam van ons program. Geen command line argumente daar. Ons gaan 'n stel breekpunt te Hoofstraat. As ek wil gdb te begin, wat moet ek doen? STUDENT 55: R. JASON Hirsch: R. En wat dan? STUDENT 55: Die argumente? JASON Hirsch: Toe het die opdrag-lyn argumente. Kom ons loop deur. N is net om my lyn deur die lyn. Ek gaan om te gaan tot Ek kry my seg skuld. Daar is my seg skuld. Dit lyk soos fread veroorsaak my seg skuld. Ek weet fread veroorsaak my seg skuld, want dit was die lyn wat ons net uitgevoer word. En die enigste ding wat was gebeur in die lyn - twee dinge gebeur. Fread gaan, en dan was ons doen 'n paar TERWYL nagaan. Ek is bereid om te wed dat die TERWYL kontrole is nie veroorsaak dat my seg skuld. Heel waarskynlik, fread was veroorsaak dat my seg skuld. Ek sien ook iets hier, memcopy. Geheue kopie. Klink soos die verskuiwing van die geheue van een plek na die ander. Klink soos iets wat sou gebeur in fread, miskien 'n paar geheue beweeg van hier tot hier. Kom ons gaan deur dit weer. Hoe begin ek dit oor en voer dit weer? Ja. STUDENT 56: Het jy nodig het om te sit 'n ampersand voor buffer? JASON Hirsch: So-teken, voordat buffer sal die adres van my buffer, wat 'n kar *. Kom ons loop deur middel van hierdie een keer. Hoe kan ek loop deur dit een keer? STUDENT 57: Kan jy net Tik weer hardloop? JASON Hirsch: tik net loop weer. So ons gaan nie voer hierdie lyn. So buffer is 'n leë wyser. Korrek? Dit dui op - laat ons sien. As ons ons - trek 'n vinnige foto van hierdie. Kan almal te sien of Ek skryf oor hier? So in die stapel te plaas, het ons 'n plaaslike veranderlike en dit genoem buffer, en dit is 'n verwysing na 'n kar. Wat adres is hierdie kar op? STUDENT 58: 0x0. JASON Hirsch: Right. Dit is wat dit is. In hier, binne buffer, gestoor 0x0. Dit is wat ons het - die opstel van ons het op die oomblik. So hierdie lyn, fread, sit iets van die bron waar? In hierdie boks of die boks? Watter boks? Links box-of die regterkant box? Hierdie reg boks. Dit volg op die muis, en sit dit in hier. Wanneer ons probeer kontak geheue plek 0, Wat kry ons? 'N segmentering skuld. Dit is die fout wat ons het op die oomblik. Ja. STUDENT 59: Moenie jy star buffer te sit? Of nee? Vir fread? JASON Hirsch: So fread neem 'n wyser. So dit gaan in buffer. En dan sal dit de-verwysing dit iewers binne fread. Maar weereens, sien ons, neem dit 'n wyser. Ons het dit nie nodig om te slaag ster buffer. Dit sou aanstuur dit alles hier is. En dit sal waarskynlik gee ons 'n fout omdat ons de-verwysing nie. Reg? Wanneer ons die verwysing van hierdie wyser, wanneer ons probeer om hierdie plek om toegang te verkry, ons kry 'n fout - ons segmentering skuld. So - Oeps. Ons gaan om op te hou uit gdb. Ons lyn - ons probleem - is reg hier op hierdie lyn. En dit is 'n probleem, want van hierdie lyn. Hoe kan ons 'n boks wat toeganklik is in fread. Reg? Ons moet 'n boks dit is een te skep byte groot, die grootte van 'n kar. Maar ons moet daardie boks om toeganklik te wees Wanneer hierdie funksie voer. So waar - ja. Enige idees? STUDENT 60: Net dit as enige ewekansige karakter. Doen net kar buffer gelykes die karakter. En dan, wanneer jy daar buffer - JASON Hirsch: wag. Kar buffer? Sodat daar geen sterre? STUDENT 60: Ja. Neem uit die sterre. Gelyk aan 'n ewekansige karakter. JASON Hirsch: OK. So gee my 'n. STUDENT 60: Soos 'n of iets. En dan wanneer jy 'n buffer daar, jy gebruik om 'n - STUDENT 61: Star? O nee, die ampersand. STUDENT 60: Gebruik die ampersand. JASON Hirsch: OK. En wat van in fwrite? STUDENT 60: Gebruik die ampersand weer. JASON Hirsch: Alle reg. So jou idee is, het ons 'n kar en sit iets in dit, en dan skryf dat kar. STUDENT 60: Ja. JASON Hirsch: Wat dink mense nie? STUDENT 62: Dit is ingewikkelde. JASON Hirsch: OK. Kom ons teken dit uit. So hierdie tyd, ek gaan om dit te maak in rooi op die stapel hier, en dan het ons sal hê - ooh! Jammer. So hierdie tyd het ons het iets genoem buffer, en dit is op die stapel. Korrek? En ons spaar in dit 'n aanvanklik. Dan het ons ons oproep om fread. Wat fread nie is wat dit neem om 'n greep uit ons lêer en plaas dit iewers. Dit sit dit in alles wat die ding is wat verwys na. Wel, voordat ons hierdie adres - 0x0. Nou wat adres het ons? STUDENT 63: Wat adres buffer is. JASON Hirsch: Wat adres buffer is. Dit is waarskynlik gaan om te wees iets soos dit. Waarskynlik gaan om te begin met 'n b en 'n Vrou, en dan het ses ander hexadecimalen. Maak nie saak nie. Sommige adres. En ons is verby daardie adres in En ons gaan ons een te sit byte ding by daardie adres. So ons gaan ons een te sit byte ding binne-in hier. En dan gaan ons uit te skryf Wat is ooit binne-in hier. Het enige iemand enige vrae oor wat? Wie dink hierdie kode sal werk? Lig jou hand as jy dink hierdie kode sal werk. Jy het 'n standpunt in te neem. En wat dink hierdie kode sal nie werk nie? Lig jou hand. Almal anders moet wees die verhoging van hul hand. OK. Michael, waar staan ​​jy? Michael: Ek kan nie besluit. Soort in die middel. JASON Hirsch: Jy is in die middel. Kies een. Michael: Ek sal geloof en sê dit sal werk. JASON Hirsch: OK. Jy sal geloof het en sê dit werk? Wat het gebeur? [INTERPOSING Voices] JASON Hirsch: Nee seg skuld. Hoe kan ons kyk om te sien of twee dinge gelyk? Twee lêers gelyk. STUDENT 64: verskil. JASON Hirsch: verskil. Verskil tjeks vir die verskille tussen twee lêers, en as dit terug niks, hulle is identies. En as ons oopmaak, kry ons ons lêer. So dit was die korrekte oplossing. Kom ons kyk terug by dit nog een keer. Ons het eintlik nie eens nodig het om dit te begin. Dit sou moontlik 'n bietjie skoner as jy nie sit iets ewekansige daar. Die punt is, wat jy nodig het om te skep 'n ruimte om iets uit te stoor fread en iets te neem uit fwrite. En dat die ding moes óf 'n plaaslike veranderlike op die stapel - jy kon malloc'd het 'n ruimte. So het ons eintlik kan hê geskryf malloc hier, en wat sou gewerk het. En dan sou ons gewees het berging ons dinge iewers op die hoop. Maar dit is eintlik, waarskynlik, die mees elegante oplossing. Net skep 'n ruimte op die stapel hierdie dinge te gaan. Ek sou twee ander kommentaar. As jy weer te neem aan hierdie en Dan kry aangeteken op hierdie, my kommentaar sou soos volg wees. Hierdie 1 is hier, vir my, kyk soos magic nommers. Dit 1, in terme van fread, sin maak. Dit is die aantal van die dinge wat lees of skryf nie. Maar hierdie een hier moet waarskynlik iets anders wees. So, wat is 'n oplossing? STUDENT 65: Grootte van byte. JASON Hirsch: Soos wat? STUDENT 65: Grootte van kar. JASON Hirsch: Grootte van kar. Ja, byte is nie 'n tipe. So grootte van char werk. Ons kan hê, aan die bokant van ons kode, # gedefinieer nie. Genoem iets BYTE en dit is regtig 'n kar. Eintlik, selfs 'n beter benadering kan dit gewees het - uint. Enigiemand wat weet wat dit is? Jammer. Ek het dit agteruit. Wag, nee. Watter manier gaan dit? Enigiemand wat weet wat dit is? Ja. STUDENT 67: veronderstel om te help standaardiseer oor stelsels dinge wat het - soos unsigned heelgetalle wat 8 grepe? JASON Hirsch: Dis presies reg. Op verskillende masjiene, die grootte van 'n kar - gewoonlik nie 'n kar. Karakters is gewoonlik een byte. Maar die grootte van ander data tipes is verskillende groottes op 'n 32-bit masjien teenoor 'n 64-bit masjien. 'N uint8_t is altyd 8 stukkies - altyd een greep. En ek nodig het om te sluit wat standaard int kop lêer. So nou, dit sou waarskynlik gewees die beste manier om hierdie kode te skryf. So ek ontslae raak van die magic nommers. En ek het ook 'n meer logiese tik vir buffer. Dit is nie net 'n kar, dit is 'n greep, en dit is wat ons verwag om dit te wees. En hier, ons het eintlik 'n bietjie meer robuuste. Ons is nie noem dit 'n kar, wat - miskien, wie weet - kan 'n ander grootte op verskillende masjiene. Ons is eintlik sê dit is presies een greep, altyd, maak nie saak wat. En as ons kyk hier, maak ons ​​CP. Uh-oh. Wat het gebeur? STUDENT 68: Dit kan aangeskakel word. JASON Hirsch: Wat? STUDENT 69: Is dit? STUDENT 70: Jy het nie dit as 'n tipe definieer. STUDENT 71: Maar dit moet word gedefinieer in die standaard. STUDENT 72: Wat gaan aan? STUDENT 73: Indien definieer wees hoofletters? JASON Hirsch: So dit is nie # definieer. Eintlik, in hierdie geval, is ek gaan gebruik typedef. Omdat ons gebruik dit as 'n tipe in een plek. So in hierdie geval, het ons eintlik wil typedef soos ons 'n nuwe soort druk byte, en dit is, in wese, hierdie. Dit is 'n bietjie anders as # definieer. En nou, ons kode werk perfek. So, weer, # definieer neem iets, vervang dit oral met die ander ding. Dit is net 'n makro - snelskrif om ontslae te raak van die magie nommers. Maar in hierdie geval, want ons is gebruik dit as 'n tipe - reg hier - ten einde vir dit om te werk, moet ons te typedef net byte is. En ons is die definisie van dit hier. Dit is nie 'n struct, dit is eintlik net 'n ongetekende heelgetal. Dit is een byte lank. Hierdie kode sal aanlyn beskikbaar wees, en julle almal moet dit op die oomblik het. So ons het - volmaak - 13 minute oor te gaan oor die probleem stel 5. Ek wil saam met copy.c om te loop, en dan sal ons praat kortliks oor die ander dele van die probleem stel. So laat my trek copy.c. En die cool ding is, ons het eintlik reeds geskryf 'n baie van hierdie kode. Die kode wat ons letterlik geskryf het net het uit hier toe ek op my eie skryf. Maar dit is copy.c, vorm die grondslag vir die eerste twee dele van die probleem wat vir whodunit.c, wat wat jy nodig het om te skryf, en resize.c. Recover.c, wat is die derde en finale deel van die probleem stel, is nie gebaseer af van hierdie lêer. Jy gaan nodig om die lêer te skryf, ons gee jou 'n sjabloon vir daardie dien, maar dit het niks te doen met copy.c. Maar omdat copy.c is die grondslag vir die eerste twee dele, ons gaan nou deur dit te loop, so jy hoef 'n goeie sin van wat dit doen. En die kommentaar gee 'n paar van dit weg. Ons het reeds geskryf sommige van hierdie. Eerste, ons seker maak kry ons drie argumente. Volgende, ons onthou die lêer se naam. So het ons hierdie stap oorgeslaan toe ons gekodeerde ons ding - Toe ons CP. Maar hier, hulle maak dit 'n bietjie skoner. Hulle is die nagaan om seker te maak beide lêers is goed, in Benewens die opening van hulle. Ons het al hierdie kode nou net, so ek is gaan nie op hierdie kode te woon. Volgende is 'n paar dinge wat spesifiek vir die tipes lêers wat ons gebruik, wat is bitmap lêers. Bitmap lêers het 'n paar metadata verband hou met hulle. So het die eerste paar grepe vertel oor die lêer. Hulle is nie die kleure van die pixel in die beeld. Hulle vertel oor die lêer. En as jy deur die probleem stel te lees, jy sal baie meer inligting oor Op watter tipe metadata strukture ingesluit met bitmaps. Maar dit is die rede waarom ons hierdie eerste stel - hierdie kode hier. Ons lees van die metadata - twee stukke van metadata - die lêer kop-en die info kop. En ons is die beheer van sekere dele daarvan te maak seker dit is 'n ware bitmap lêer voordat u voortgaan. En weer, dit is besonderhede wat ons nie nodig het om te gaan in die nou. As jy deur die probleem stel te lees, jy sal verstaan ​​hierdie. Lang storie kort, word dit net sê, dit is 'n bitmap-lêer, en bevestig dat. Volgende, ons diegene skryf die uit-lêer. Ons sien dat hier. Ons skryf aan die uit wyser. Volgende, ons bepaling van padding. So weer, soos met besondere 'n bitmap-lêer, 'n paar lyne sluit padding aan die einde. En as jy deur die probleem stel te lees, nie meer omtrent padding sal leer. Dit is die formule padding te vind. Belangrik om te onthou - wanneer jy die grootte van 'n bitmap verander lêer, die padding veranderinge. Wanneer jy die grootte van 'n verandering lêer, die padding veranderinge. Dit is nooit gaan wees groter as 3 - dit sal wees 0 tot 3, ingesluit. Maar wanneer jy die grootte van verandering iets, die padding veranderinge. As ek net een pixel in die ry, het ek moet drie grepe van padding, want Elke ry het veelvoude van vier te wees grepe lank in 'n bitmap lêer. Maar as ek verdubbel dit, om te gaan van die een pixel twee pixel, wat elk, kom ons sê, is 'n greep, dan moet ek twee grepe van padding te maak wat gelyk aan vier. So wanneer ek verander die grootte van iets, Ek moet die bedrag te verander van padding wat ek het. Is wat sin maak vir almal? Volgende, ons Itereer oor elke ry, of deur middel van al die rye. En dan Itereer ons deur elke kolom in elke ry. Ons is die behandeling van hierdie bitmap soos 'n rooster, soos ons behandel die raad in 15. Soos ons behandel die stene toe ons gedruk het op die skerm. 'N rooster van rye en kolomme. Dan - ons het dit gesien. Ons is eintlik net gekodeer hierdie. Ons het 'n paar tydelike stoor. Ons lees daar, en dan ons skryf dit uit. Dit is presies wat ons nou net gedoen het. Volgende, want ek het elke lyn eindig in sommige padding, ons spring oor wat padding - die ou padding. En dan voeg ons dit terug. In hierdie geval, ons skep presies dieselfde lêer. Ons is net die kopiëring van dit. So hierdie lyn is 'n soort van dom. Ons kon letterlik net sit die padding in Maar as jy die grootte van die lêer verander, wil jy nog hierdie lyn? So as ons verander die grootte van 'n lêer, ons nog steeds wil om oor te slaan oor die ou padding? STUDENT 74: Ja. JASON Hirsch: So ons doen. Omdat hierdie, weer, handel met die bron lêer. Ons gee nie om oor die padding van die bron lêer. Ons wil om te gaan na die volgende reël. Maar ons het nie net terug te sit die ou bedrag van padding. Ons moet terug te sit die nuwe bedrag van padding. So wanneer ons die grootte van 'n is besig om lêer, ons nog steeds wil om bo-oor die padding in die ou lêer - wat ons is in die lees van. Maar wat ons skryf te, ons gaan nodig terug te sit 'n paar verskillende aantal padding wat Ons het vasgestel. Ja. STUDENT 75: Die einde van die twee lyne nie saak nie, reg? Omdat jy die hantering van verskillende lêers. JASON Hirsch: Presies. Die einde van hierdie twee lyne maak nie saak. Ons skryf hierdie lyn. Dit is hier vir die lêer Ons skryf. Dit is belangrik, so ons kry die korrekte bedrag van padding. Dit het te doen met die lêer. Ons wil slaan reg oor die padding. Ons wil nie te lees - As ons 'n greep te lees op 'n tyd, het ons gee nie om nie oor daardie padding grepe. Ons wil om te skuif na die volgende lyn. Ten slotte, net soos Lucy het vir ons, Ons sluit die lêers en terugkeer 0. So dit is copy.c. En ons eintlik geskryf het - ons het die meeste van artikel skryf, in wese. Jy het dit. So ek hoop jy het 'n goeie sin van wat aangaan in hier. Die groot verskil, eerlik, is net Die eerste deel wat handel oor eienaardighede en gedrag van bitmap lêers. So ek het as my volgende skuif, wat moet ons doen? Wel, laat ons dink oor detective verhaal. En vir iemand wat lees die probleem gestel, wat doen ons nodig het om te doen in detective verhaal? Eenvoudig. Aleja. Aleja: Kan jy neem uit die deel van elke pixel wat rooi dui. En dan - soort? JASON Hirsch: OK. So neem uit die deel van elke pixel dat die rooi dui. Dit is naby, maar nie alles nie. STUDENT 76: Wel, daar is ' verskillende maniere om dit te doen. JASON Hirsch: OK. Gee my 'n manier. STUDENT 76: Neem uit al die rooi, en dan beklemtoon die blou en groen. JASON Hirsch: OK. So gegee beide hierdie wyses - dit klink asof ons gee dit 'n pixel is, is dit het 'n rooi, blou, en groen vlak. Ons wil hê dat die relatiewe vlakke van te verander die rooi, blou, en groen, afhangende op die pixel. Waar in hierdie kode moet ons verander die relatiewe rooi, blou, en groen vlakke van 'n gegewe pixel. Nadat ons dit lees - voordat ons skryf dit? Gee my die lyn nommer. MEERVOUDIGE STUDENTE: 83. JASON Hirsch: 83. So hier. Vir detective verhaal, die kode wat jy nodig het om te skryf, al gaan reg daar. En dit is die enigste kode wat jy nodig het om te skryf. Omdat, soos ons gehoor het, dat al wat jy nodig het om te doen, is om te verander hierdie relatiewe blou, rooi en groen vlakke van elke pixel. Jy het dit gelees, en nou is jy gaan dit uit te skryf. Hoe kry ek - as ek hierdie ding genoem trippel, reg hier, en dit is van tik RGBTRIPLE - Wel, as ons kyk in bmp.h, Wat is RGBTRIPLE? STUDENT 77: Dit is 'n struct. JASON Hirsch: RGBTRIPLE is 'n struct. Ons sien dat reg hier. En so, as ek wou toegang, sê, die rooi vlak van die struct, hoe kan ek toegang tot die rooi vlak van hierdie struct? [KLAS Gerugte] STUDENT 78: RGBTRIPLE.rgbtred? JASON Hirsch: Is dit korrek? STUDENT 79: Dit moet trippel wees dot, in plaas van RGBTRIPLE dot? JASON Hirsch: Drie. Drie is die plaaslike veranderlike, so hier, is daar geen aanduidings hier. Dus het ons net gebruik om die dot-notasie. Dit gee my die vlak van die rooi. As ek wil om dit te verander, ek het net soos dit gelyk na iets anders. So weer, hierdie lyn van die kode toegang hierdie veranderlike in hierdie struct, en ons kan dit stel om iets nuuts. So vir detective verhaal, weer, dit is, In wese is wat ons nodig het om te doen. Baie eenvoudig. Net verander 'n relatiewe vlakke, en dit is waar dat-kode gaan. Grootte, aan die ander kant, is 'n bietjie moeiliker. In werklikheid, die grootte is waarskynlik die moeilijkste deel van die probleem stel. Ons het drie minute om te gaan oor dit. Maar weereens, ons het reeds 'n skrywe die meeste van hierdie kode, sodat ons behoort redelik bekend is. Wat is 'n paar dinge wat ons wil doen in grootte, as jy oor lees die probleem gestel? As jy hulle vir my, ons kan praat oor hulle. Wat is 'n paar dinge wat ons wil doen? STUDENT 80: Vertikaal - so jy hoef te horisontaal grootte daarvan, maar vertikaal grootte dit so goed? JASON Hirsch: So as ons kry 'n pixel, en ons wil dit om te verander deur 'n faktor van twee, is dit nou nodig om te wees verklein horisontaal en verklein vertikaal. Is wat sin maak? Ja. So dit is waarskynlik die grootste uitdaging. En ons sal praat oor wat in 'n sek. Ja. STUDENT 81: Die manier waarop ek gedink dit is wat jy nodig het druk dit uit - JASON Hirsch: wag. Moet ons nie vertel wat jy gedoen het. Ons gaan om te praat in logika. STUDENT 81: OK. Wat was die vraag? JASON Hirsch: Jy moet net opgewek jou hand. Daar was geen sprake. Laat my bied nie. Laat my dit kortliks bespreek net. So het ons 'n pixel, ons wil herhaal dit, beide horisontaal en vertikaal. So ideaal wat ons hier doen, is om ons lees in ons pixel, skryf ons dit Maar baie van die tye. Maar dan moet ons ons truuk hier, want dan wil ons oor te slaan na die volgende lyn en skryf dit op die begin van die volgende lyn. So as ons wil albei te herhaal horisontaal en vertikaal, wat 'n goeie manier om dit te doen - 'n goeie maar om dit te doen? Sodat ons nie nodig het om voortdurend te soek rondom ons lêer van die dinge te plaas. Daardie vraag kan nie ' sin gemaak nie, maar ek dink 'n beantwoord dit sal help. STUDENT 82: Skep 'n skikking? JASON Hirsch: So kom ons dink van elke lêer as 'n ry. Kom ons dink in terme van rye. As ons ons eerste ry van ons klein foto, kan ons die ry maak in 'n groot ry van 'n groot prentjie, en dan herhaal die ry egter Baie keer is dit nodig om te herhaal word, eerder as om pixel deur pixel, wat kry verwarrend wanneer die hantering van lêers. Want as ons gehad het - Ek hardloop uit die ruimte. As dit is ons lêer, en ons het daardie 'n pixel is daar, en ons wil om dit te sit net daar, het ons nog 'n paar dinge het dat die behoefte aan meer daar wanneer ons gaan skryf en die skep van nuwe lêer - ons leer dit is twee keer so groot. Maar dit is werklik moeilik om met die lêer funksies te slaan om na die nuwe reëls soos wat, en dan terug te gaan hier en dinge in daar. Dit is byna onmoontlik om iets te doen soos wat, as dit sin maak. So as ons dink in terme van rye, kan ons neem ons ry, en dan sit dit - herhaal rye vertikaal. En dit is hoe ons omgaan met die grootte vertikaal eerder as horisontaal. Dit was soort van 'n vinnige en 'n bietjie verwarrend. Ongelukkig het ons tyd is. Ek sal buite staan ​​vir dié van julle hier wat vrae oor die het probleem stel, insluitend herstel. So laat verdaag vir nou. En weer, as jy enige vrae het, ons kan buite gesels.