[Speel van musiek] David J. MALAN: Alle reg. [Gelag] Welkom terug. Dit is CS50. En dit sal die einde van die vyfde week. En tot nou toe, ons het pretty much is die neem as vanselfsprekend aanvaar dat daar bestaan ​​die samesteller, klang, dat jy nog is beroep deur middel van hierdie ander hulpmiddel genaamd Maak dat een of ander manier Nou, vat jou bron-kode in voorwerp-kode, die nulle en ene dat jou rekenaar CPU, sentrale verwerking van eenheid, verstaan ​​eintlik. Maar dit blyk daar is 'n getal wat is gaan op onder die enjinkap in tussen inset en uitset. En ek wil graag dat ons vlees voorstel wat in 'n bietjie meer detail in hierdie vier stappe, het iets genoem pre-verwerking, iets genoem opstel, wat ons gesien het, iets genoem vervaardiging, en iets wat die naam verbind. So tot nou toe, in 'n paar van ons programme, het ons het skerp sluit. Meer onlangs het ons het 'n paar skerp definieer vir konstantes. So dit blyk dat die dinge wat is voorafgegaan met die hash simbool of die pond simbool is pre-verwerker riglyne. Dit is net 'n fancy manier om te sê dit is 'n reël van die kode wat eintlik omskep in iets anders voor die rekenaar eens probeer om te sit jou program in nulle en ene. Byvoorbeeld, skerp sluit standaard I / O. H, pretty much beteken net gaan voorlê, gryp die inhoud van die lêers stdio.h en plak dit reg daar. Sodat daar geen nulle en ene op daardie stadium nog nie. Dit is regtig net 'n vervanging. En dit is gedoen tydens die sogenaamde pre-verwerking stadium, wanneer jy eintlik loop klang of spesifiek Maak in die meeste gevalle. So dit het alles gebeur eerste outomaties tot dusver. Dan kom die samestelling stap. Maar ons het al oorvereenvoudig samestelling. Samestelling van 'n program beteken regtig te neem dit van iets soos C, die bron-kode wat ons het is skryf, af om iets genoem die gemeente. Vergadering taal is 'n laer vlak taal wat, gelukkig, ons sal nie meebring veel te skryf hierdie semester. Maar dit is op die laagste vlak in die sin dat jy letterlik begin skryf optel en aftrek en vermeerder en laai uit die geheue en red geheue, die baie basiese instruksies wat 'n rekenaar, onder die enjinkap, eintlik verstaan. Laastens, vervaardiging neem dat taal om die nulle en ene wat ons het is beskryf wat tot dusver. En werklik laastens is daar die sogenaamde skakel fase, wat ons sien in net 'n oomblik, wat kombineer jou nulle en kinders met nulle en mense ander mense voor jy geskep het. So beskou hierdie super eenvoudige program. Dit was van Week 1. Dit het net gesê, Hello World, op die skerm. Ons het dit deur klang. Of ons het dit deur Maak wat hardloop klang. En outputted in die tyd waar 'n paar nulle en ene. Maar dit blyk daar is ' 'n intermediêre stap. As ek gaan hier - oops, het nie wil hom nog sien. As ek gaan hier aan my toestel en ek oopmaak hello.c, hier is dat dieselfde program. En wat gaan ek doen in my terminale venster hier is ek gaan hardloop klang eerder as om, wat automatiseert al vier daardie stappe vir ons. En ek gaan klang-S te doen en dan hello.c en dan betree. En ek kry 'n flikkerende vinnige weer, wat goed is. En nou in 'n effens groter venster Ek gaan om oop te maak gedit in hier. En ek gaan om oop te maak 'n lêer wat, blyk, word genoem hello.s hierdie bevat dat die vergadering taal Ek verwys na vroeër. En dit is wat genoem vergadering taal, redelik lae vlak instruksies wat jou Intel CPU of wat dit ookal is wat is binne verstaan. En mov is vir skuif. oproep is vir bel, 'n baie lae vlak funksioneer. sub is vir aftrek. So wanneer jy 'n bepaalde CPU binne van jou rekenaar, wat maak dit duidelike, teenoor ander CPUs op die mark, is wat instruksies dit verstaan ​​en dikwels hoe doeltreffend dit is, hoe vinnig dit is ten uitvoering van 'n van die instruksies. Nou vir meer inligting oor hierdie, kan jy volgende val CS61 by die kollege. Maar hier het ons, byvoorbeeld, 'n paar eienskappe wat dalk bekend lyk. hello.c is die naam van die program. . Teks - daar is nie veel van belang is daar nou net, onthou dat die teks segment, soos op Maandag, is waar in geheue jou program eindig eintlik up. So dit is ten minste vaagweg vertroud is daar. Hier, natuurlik, is 'n melding van ons belangrikste funksie. Blaai af, dit verwys na dinge sogenaamde registers, baie klein stukkies geheue binnekant van jou werklike CPU. En as ek blaai af selfs verder, sien ek 'n soort indirekte melding gemaak van ASCII. En daar, inderdaad, is dat die snaar, hallo, komma, wêreld. So lang storie kort, dit was gebeur vir jou, outomaties, onder die enjinkap al hierdie tyd. En wat gebeur is werklik een keer jy hardloop klang, of by wyse van Maak, jy eers kry, van die bron-kode, die sogenaamde saamsteltaal. Dan klang is die omskakeling van hierdie vergadering taal af na nulle en ene. En dit is die skyfie wat ons begin het ons bespreking in Week 0 op - en dan Week 1 op. En dan uiteindelik, die nulle en ene gekombineer met die nulle en ene van dié biblioteke het ons neem vanselfsprekend aanvaar soos Standard I / O of die String Library of selfs die CS50 biblioteek. So hierdie foto om meer te verf visueel, ons het hello.c. En, natuurlik, maak gebruik van die printf funksioneer om te sê, hallo wêreld. Die samestelling stap neem om dit af te dat lêer sien ons net hello.s, selfs al is dit tipies geskrap outomaties vir jou. Maar dit is die vergadering kode in die middel stap. En dan wanneer ons het die vergadering taal, so te sê, dit is wanneer jy kry die nulle en ene. So het ons ingezoomd effektief vandag op wat ons het is die neem as vanselfsprekend aanvaar, beteken gaan bron-kode kode te beswaar. Maar laastens, nou dat dieselfde prentjie - Kom ons stoot dit oor te die linkerkant. En daarop te let dat in die top is daar Ek het genoem stdio.h. Dit is 'n lêer wat ons het ingesluit in byna al die programme wat ons geskryf het. En dit is die lêer waarvan die inhoud kry kopie geplak, effektief bo jou kode. Maar dit blyk dat, op 'n rekenaar stelsel iewers, daar is vermoedelik 'n stdio.c lêer wat iemand geskryf jaar gelede dat implemente al die funksies wat verklaar in stdio.h. Nou in werklikheid is dit waarskynlik nie op jou Mac of jou rekenaar of selfs in die CS50 toestel is 'n rou C-kode. Iemand wat reeds opgestel en dit sluit O lêer vir voorwerp kode. Of. 'N lêer, wat verwys na 'n gedeelde biblioteek wat al vooraf geïnstalleer en vooraf opgestel vir jou. Maar veronderstel dat daar wel bestaan op ons rekenaar stdio.c in parallel met klang. Jou kode is opgestel en vergader. stdio.c se kode word saamgestel en vergader, sodat hierdie heel laaste stap, hier, ons het een of ander manier skakel, so te sê, jou nulle en ene met sy of haar nulle en kinders in 'n eenvoudige program wat uiteindelik is genoem net Hello. So dit is al die magic wat gebeur het tot dusver. En sal voortgaan om dit te neem prosesse as vanselfsprekend aanvaar nie, maar besef daar is 'n baie sappige besonderhede gaan op onder daar. En dit is wat maak jou rekenaar met 'n Intel binne veral onderskei. So op daardie noot, as jy wil saam met ons vir middagete hierdie Vrydag, doen gaan na die gewone plek cs50.net/rsvp, 13:15 die Vrydag. En nou 'n paar aankondigings. So het ons 'n paar goeie nuus. En ons het 'n paar slegte nuus. Begin met 'n paar goeie nuus hier. [Kreun] Alle regte. Wel, dit is tegnies 'n vakansie, so dit is nie soseer 'n geskenk van ons. Maar dan moet die slegte nuus van die kursus. [Kreun] Ek spandeer baie tyd op hierdie animasie. [Gelag] Daar sal 'n hersiening sessie eerskomende Maandag. Dit gaan wees by 05:30. Ons sal julle herinner aan al hierdie besonderhede via e-pos op die kursus se webwerf in net 'n paar dae tyd. Dit sal verfilm word en beskikbaar gestel word kort daarna. So as jy nie kan maak dat Maandag nag slot, moenie bekommerd wees nie. Artikels hierdie komende week sal ook fokus op hersiening vir die toets. As jou artikel is op Maandag, wat inderdaad universiteit vakansie is, sal ons steeds aan in afdeling. As jy kan eenvoudig nie maak dat die artikel, want jy gaan weg, dit is goed. 'N Sondag of Dinsdag artikel of tune-in Jason se artikel, wat aanlyn beskikbaar. So, meer slegte nuus. So volgens die leerplan, ons lesing volgende Vrydag. Maar die goeie nuus - duidelik, ek spandeer te veel tyd op hierdie. [Gelag] Ons sal kanselleer volgende Vrydag se lesings. So wat sal 'n geskenk vir ons gemaak, sodat jy kan nie regtig 'n lekker blaaskans in tussen hierdie week en twee weke vandaar. Sodat daar geen lesings volgende week, net 'n klein bietjie toets, waarvoor jy moet wees raak al hoe meer opgewonde. So laat ons nou ons aandag te iets wat inderdaad meer visuele en meer opwindend en die verhoog op te stel vir wat gaan wees op die horison in net 'n paar weke. Na die eerste quiz, sal ons draai die fokus van ons probleem stelle na 'n ander domein spesifieke probleem, wat van forensiese of sekuriteit meer algemeen. Trouens, die tradisie met hierdie probleem stel is vir my een van die onderrig mede-of geoktrooieerde rekenmeesters te loop oor kampus te neem 'n paar foto's van geïdentifiseer, maar nie voor die hand liggend mense, plekke of dinge, dan is elke jaar het ek een of ander manier daarin slaag om per ongeluk verwyder of handel dryf met die digitale media kaart dit is binne-in ons kamera. Maar nie 'n groot deal. Ek kan voort te gaan en prop wat in my rekenaar. Ek kan 'n forensiese beeld van dit maak, sodat om te praat, deur die kopiëring van die nulle en mense af van die geheue kaart, of Dit is 'n SD kaart of kompakte flits kaart of alles wat jy vertroud is met. En dan kan ons hand wat uit. En so is die uitdaging wat voorlê, onder andere dinge vir jou sal wees om te skryf C-kode wat herstel 'n hele klomp van die JPEG vir my en geopenbaar sal wees daardie mense, plekke of dinge. En ons sal ook praat, in hierdie probleem stel en in die dae wat kom, oor grafiese meer algemeen. Ons het dit gebruik het, 'n kursus, vir uitbreek. Maar jy het soort van as vanselfsprekend aanvaar bestaan ​​daar op hoë vlak idees van reghoeke en ovale. Maar onder die enjinkap daar is pixels. En jy het om te begin dink oor daardie. Of jy sal p-stel vir 4 het om te dink oor die gaping tussen jul bakstene, hoe vinnig jy bal beweeg oor die skerm vir breek uit. So daar is hierdie idee van die kolle op jou skerm wat in die spel kom reeds. Nou wat jy sien, al is, is wat jy op 'n rekenaar skerm. As jy al ooit gesien hoe 'n paar goeie of slegte TV, is die kans wat hulle pretty much behandel die gehoor soos technophobes wat nie werklik weet nie veel oor die rekenaar. En so is dit baie maklik vir die polisie speurder te sê, kan jy skoon te maak wat vir my? Of te verbeter, reg? Verbeter, is soos die buzz woord in die meeste 'n misdaad verwante show. En die werklikheid is as jy 'n baie vaag prentjie van 'n verdagte te doen iets wat sleg is, kan jy nie net verbeter dit. Jy kan nie vergroot oneindig. Jy kan nie sien in die skynsel van iemand se oog wat gepleeg wat besondere misdaad, ten spyte van die voorkoms van hierdie op TV. En so met die laat motiveer dat komende probleem gestel met 'n blik op 'n paar shows waarmee jy dalk bekend wees. [Video speel] -OK. Nou, laat ons 'n goeie blik op wat jy kry. -Hou dit. Hardloop dit terug. -Wag 'n minuut. Gaan regs. -Daar. Vries dit. -Full screen. -OK. Vries dit. Span-up op daardie, sal ya? Vector-in op die man deur die agterwiel. -Zoom in reg hier op hierdie plek. -Met die regte toerusting, die ver-beeld kan word uitgebrei en verskerp. -Wat is dit? -Dit is 'n verbetering program. -Kan jy duidelik dat tot enige? -Ek weet nie. Kom ons verbeter dit. Verbeter-afdeling A-6. -Ek versterk die detail en - -Ek dink nie daar is genoeg om te verbeter. Stel dit aan my skerm. -Verbeter die weerspieëling in haar oë. -Laat ons dit deur die loop video verbetering. -Edgar, kan jy dié? Hang op. -I've is besig om op hierdie weergawe. -Iemand se nadenke. -Besinning. -Daar is 'n weerspieëling van die man se gesig. -Die nadenke. -Daar is 'n weerspieëling. -Zoom in op die spieël. -Jy kan sien 'n weerspieëling. -Kan jy die verbetering van die beeld van hier af? -Kan jy verbeter hom reg hier? -Kan jy verbeter dit? -Kan jy verbeter dit? -Kan ons verbeter dit? -Kan jy verbeter dit? -Hou op 'n tweede, sal ek verbeter. -Zoom in op die deur. -X10. -Zoom. [Gelag] -Skuif in -Wag, stop. -Stop. -Stop dit. -Draai 'n 75 grade rondom die vertikale asseblief. [Gelag] -Stop, en terug na die deel oor die deur weer. -Het jy 'n beeld verbete wat kan bitmap? -Miskien kan ons gebruik maak van die Pradeep Sen metode om te sien in die vensters. -Hierdie sagteware is toestand van die kuns. -Die ikoon waarde is af. -Met die regte kombinasie van algoritmes. -Hy is geneem verligting algoritmes te die volgende vlak en ek kan gebruik om hulle te verbeter die foto. -Slot op en vergroot die z-as. -Verhoog. -Verhoog. -Verhoog. -Vries en te verbeter. [Einde video-vertoning] David J. MALAN: So Probleem Stel 5 is wat voorlê daar. So ons sal binnekort 'n beter begrip van wanneer en waarom jy nie kan en ons kan nie verbeter op dié manier. Maar eers, laat ons teruggaan ons aandag om 'n paar van die boustene ons sal moet in staat wees om daardie storie te vertel. So onthou dat ons het hierdie foto op Maandag en 'n bietjie verlede week. En dit beskryf die uitleg van die dinge wat in jou rekenaar se geheue n programme te hardloop. Die tegnologie segment tot bo, onthou, verwys om die werklike nulle en ene waaruit jou program. Daar is, onder wat, sommige geïnisialiseer of ongedaan data, wat tipies verwys na dinge soos konstantes of snare of globale veranderlikes wat verklaar is in advance. Daar is die hoop klippe, maar ons sal kom Terug na wat in 'n bietjie. En dan is daar die stapel. Baie soos 'n stapel van die bak in die kafeteria, dit is waar die geheue kry lae en lae wanneer jy doen wat in 'n program? Wat is die stapel gebruik vir? Ja? Call of funksie. Enige tyd wat jy noem 'n funksie is, is dit gegee om stukkie van die geheue vir sy plaaslike veranderlikes of sy parameters. En picturaal, sien ons dat met elke opeenvolgende funksie geroep het, het 'n oproepe B oproepe C oproepe D, hulle kry lae op die stapel. En in elkeen van die snye geheue is in wese 'n unieke omvang vir daardie funksie, wat, natuurlik, is problematies as jy wil aan die hand van die een funksie na 'n ander 'n stuk van die data wat jy wil dit om te muteer of verander. So wat ons oplossing te staat te stel 'N funksie wat deur een hopie raam die geheue binne te verander van 'n ander stapel raam? Hoe doen die twee met mekaar te praat? So deur middel van wysers of adresse, wat, weer, net beskryf waar in geheue, by wyse van 'n spesifieke byt nommer, die betrokke waarde gevind kan word. So onthou laaste tyd ook ons ​​voortgegaan die storie en kyk na 'n redelik karretjie program. En hierdie program is karretjie vir 'n paar redes, maar die mees kommerwekkende een is omdat dit nie wat om te kyk? Ja, dit versuim om die insette te gaan. Jammer? As dit is meer as 12 karakters. So baie slim, wanneer ek bel memcopy, wat, soos die naam aandui, net afskrifte geheue van sy tweede argument in sy eerste argument. Die derde argument, baie slim, is nagegaan word om seker te maak dat jy nie kopieer meer as, in hierdie geval, die lengte van die bar, die aantal karakters, in die bestemming, wat hierdie verskeidenheid C. Maar die probleem is dat dit wat As C sigself is nie groot genoeg te hanteer nie? Jy gaan die aantal te kopieer grepe wat jy aan ons gegee is. Maar wat jy eintlik meer grepe as jy ruimte vir? Wel, hierdie program baie besondig net blindelings voort om te doen wat dit gegee, hallo agteroorskuisstreep 0 is 'n groot as string is kort genoeg is nie, soos vyf karakters. Maar as dit is eintlik 12 karakters of 1200 karakters, sien ons laaste keer dat jy net gaan om heeltemal vervang die geheue wat behoort nie aan jou. En die ergste geval, as jy oor skryf dat rooi gedeelte is daar dat ons bekend as die terug adres - dit is net waar die rekenaar outomaties vir jou, agter die tonele, opnaaisels weg van 'n 32-bit waarde wat herinner om dit te watter adres moet dit terug te keer wanneer cat, hierdie ander funksie, gedoen word uitgevoer. Dit is 'n brood krummel van spesies waarna dit terug. As jy oor skryf dat, potensieel, as jy die slegte man, kan kon potensieel oorneem iemand se rekenaar. En jy sal beslis crash dit in die meeste gevalle. Nou die probleem is net vererger as ons begin praat oor die geheue bestuur meer algemeen. En malloc, vir die toekenning van geheue, is 'n funksie wat ons kan gebruik om te wys geheue wanneer ons nie weet vooraf sodat ons kan 'n paar. So, byvoorbeeld, as ek gaan terug na die toestel hier. En ek oop vanaf laaste keer hello2.c, onthou hierdie program hier, wat gelyk 'n bietjie iets soos hierdie, net drie lyne - meld u naam, dan string naam, aan die linkerkant, is gelyk aan getstring. En dan is ons druk dit uit, die gebruiker se naam. So dit was 'n super eenvoudige program. Om duidelik te wees, laat my gaan voort en maak hallo-2. Ek gaan dot streep hallo-2 te doen. Stel jou naam - David. Betree. Hallo David. Dit lyk OK werk. Maar wat regtig aangaan onder kap hier? Eerste laat se skil terug 'n paar lae. String is net 'n sinoniem ons het besef vir wat? Kar ster. So kom ons maak dit 'n bietjie meer arcane maar meer tegnies korrek is dat hierdie is 'n kar ster, wat beteken dat naam, ja, 'n veranderlike is. Maar watter naam winkels is die adres van 'n kar, wat voel 'n bietjie vreemd want ek kry terug 'n string. Ek is terug om verskeie karakters nie 'n kar. Maar natuurlik, jy moet net die eerste kar se adres om te onthou waar die hele string is omdat hoekom? Hoe vind jy uit waar die einde van die string is om te weet die begin? Agteroorskuisstreep nul. So met dié twee leidrade jy uitvind voor die begin en die einde van enige string is, so lank as wat hulle is behoorlik gevorm met daardie null Terminator, wat agteroorskuisstreep nul. Maar dit is 'n beroep getstring. En dit blyk dat getstring al hierdie tyd was soort kullery vir ons. Dit is om dit te doen arbeid, om seker te wees, om 'n string van die gebruiker. Maar waar is dat die geheue is afkomstig van? As ons terug gaan na die prentjie hier en die toepassing van die definisie van net 'n oomblik gelede, dat die stapel is waar geheue gaan wanneer funksies word, deur daardie logika, wanneer jy bel getstring, en dan het ek tik in D-'n-V-ek-D Voer, waar is D-A-V-ek-D agteroorskuisstreep nul gestoor word, gebaseer op die storie ons het vertel ons ver? Dit sou blyk te wees in die stapel, reg? Wanneer jy 'n beroep kry jy 'n string klein deel van die geheue op die stapel. So is dit vanselfsprekend dat die D-A-V-ek-D agteroorskuisstreep nul gestoor daar in die stapel. Maar wag 'n minuut, getstring opbrengste dat die snaar, om so te praat, wat beteken dit is skinkbord uit die kafeteria is geneem uit die stapel. En ons het laaste keer dat so gou as 'n funksie gee, en jy neem wat skinkbord, om so te praat, uit die stapel, wat kan jy aanvaar oor die oorblyfsels van dat die geheue? Ek soort van redrew hulle as vraagtekens omdat hulle effektief geword onbekende waardes. Hulle kan weer gebruik word wanneer 'n volgende funksie geroep word. Met ander woorde, as ons gebeur word stoor - Ek sal trek 'n vinnige foto hier van die stapel. As ons gebeur word die tekens van die onderkant van my geheue segment, en ons sal sê dat hierdie is die plek van die geheue beset deur die hoof en miskien arg c en arg v en enigiets anders in die program, wanneer getstring genoem word, vermoedelik getstring kry 'n stuk van die geheue hier. En dan is D-A-V-ek-D of ander manier eindig in hierdie funksie. En ek gaan oversimplify. Maar laat ons aanvaar dat die D-A-V-ek-D agteroorskuisstreep nul. So hierdie baie grepe word gebruik in die raam vir getstring. Maar so gou as getstring opbrengste, het ons het gesê die afgelope tyd dat hierdie geheue oor hier al word - Woeps! - al word effektief uitgewis. En ons kan dink van hierdie nou as vraag punte, want wie weet wat gaan word van die geheue. Inderdaad, ek het baie dikwels bel funksies anders as getstring. En so gou as ek noem 'n paar ander funksie as getstring, miskien nie in hierdie spesifieke program ons nou net gekyk op maar 'n paar ander, sekerlik 'n paar ander funksie kan beland gegee hierdie volgende plek in die stapel. So kan dit nie wees dat getstring winkels D-'n-V-ek-D op die stapel, want ek sou onmiddellik verloor toegang tot dit. Maar ons weet dat hulle getstring net terug wat? Dit is nie terug te keer na my ses karakters. Wat is dit werklik terugkeer het ons aflei laaste tyd? Die adres van die eerste. So een of ander manier, wanneer jy geroep getstring, dit is die toekenning van 'n stuk van die geheue vir die tou wat die gebruikers tipe en dan weer terug adres van dit. En dit blyk dat wanneer jy wil funksioneer geheue in hierdie toe te ken pad en terug te keer na die persoon wat genoem daardie funksie, die adres van wat deel van die geheue, het jy absoluut kan dit nie in die stapel op die bodem, want dit is net funksioneel gaan raak nie joune baie vinnig, sodat jy kan seker raai waar ons is waarskynlik gaan om dit te gooi In plaas daarvan, die sogenaamde hoop. So tussen die onderkant van jou geheue se uitleg en die top van jou geheue se uitleg is 'n hele klomp van die segmente. Een daarvan is die stapel, en reg bogenoemde is dit die hoop. En hoop is net 'n ander deel van geheue wat nie gebruik word vir funksies wanneer hulle geroep. Dit is gebruik vir 'n langer termyn geheue, wanneer jy wil 'n funksie om te gryp geheue en in staat wees om op te hang dit sonder om beheer te verloor oor dit. Nou kan jy dalk onmiddellik sien dat dit nie noodwendig 'n perfekte ontwerp. As jou program toegeken geheue op die stapel te plaas, of as jy 'n beroep meer en meer funksies, of as jy ken geheue op die hoop met 'malloc af as getstring doen, wat duidelik lyk onvermydelik probleem te wees nie? Reg. Soos die feit dat hierdie pyle is op mekaar gerig voorspel niks goeds nie. En inderdaad, kan baie vinnig ons crash 'n program in 'n aantal maniere. Trouens, ek dink dat ons dalk 'n gedoen het per ongeluk 'n keer. Of indien nie, kom ons doen dit doelbewus nou. Laat my gaan voort en skryf super vinnig 'n program genaamd dontdothis.c. En nou gaan ek hier en nie skerp sluit stdio.h. Kom ons verklaar funksie cat neem geen argumente, wat aangedui, asook deur nietig. En die enigste ding cat gaan doen, is om oproep cat, wat waarskynlik nie die slimste idee nie, maar laat dit so wees. Ent belangrikste leemte. Nou is die enigste ding hoof gaan te doen is bel cat as well. En net vir die skop, ek gaan om te gaan voor hier en printf sê: "Hallo uit cat. " OK. So as ek het nie enige foute, Maak dontdothis dot streep. En kom ons doen dit in 'n groter venster - dot streep, dontdothis. Kom op. Uh Oh. Blykbaar het, kan jy dit doen. Damn dit. OK. Wag. Staan. Het ons - Ons het dit gebruik om met maak nie. [Sug] Ek weet nie, maar ek dink ons net verwyder dit. Uh, ja. Damn dit. Los hierdie Rob. Wat? Dit is baie eenvoudig. Ja, ons het optimalisering af. OK, staan ​​bye. Nou voel ek beter. OK. Alle regte. So laat se heropstel hierdie - Maak jou dontdothis. Jy kan hê om dit te verander na dothis.c in net 'n oomblik. Daar gaan ons. Dankie. OK. So die feit dat ek die druk iets uit was eintlik net stadiger die proses waardeur ons sou daardie punt bereik. OK. Sjoe! So, wat is eintlik gaan aan? Die rede is daar, net soos 'n eenkant, is om iets te doen in terme van insette en uitset is geneig om stadiger wees, want jy het karakters te skryf aan die skerm, dit het om te blaai. So lang storie kort, het ek eintlik gebeur so ongeduldig, sou ons gesien dat hierdie eindresultaat as well. Nou dat ek rit van die druk-ups, sien ons dit dadelik. So is die rede waarom dit gebeur. Wel, die eenvoudige verduideliking, natuurlik, is dat cat waarskynlik nie word roeping self. Nou in die algemeen, dit is rekursie. En ons het gedink 'n paar weke gelede rekursiewe is goed. Rekursie is hierdie magiese manier om jouself super saaklik. En dit werk net. Maar daar is 'n belangrike kenmerk van al die rekursiewe programme wat ons het gepraat oor en kyk na tot dusver, wat was dat hulle het wat? 'N basis geval, dit was 'n harde gekodeerde geval wat gesê het in sommige gevalle noem dit nie cat, wat duidelik nie die geval hier. So wat werklik gebeur in terme van hierdie foto? Wel, as hoof roep cat, is dit kry 'n stuk van die geheue. Wanneer cat cat noem, raak dit 'n sny van die geheue. Wanneer cat cat noem, raak dit 'n sny. Dit kry 'n stuk. Dit kry 'n stuk. Omdat cat is nooit terugkeer. Ons het nooit die skoonmaak van een van daardie rame van die stapel. So ons waai deur die hoop, nie te noem, wie weet wat anders, en ons is te ver van die grense van ons sogenaamde segment van die geheue. Fout gaan segmentering vals. So die oplossing is daar duidelik moenie dit doen nie. Maar die groter implikasie is dat, ja, daar is absoluut 'n beperking, selfs al is dit nie goed gedefinieer nie, oor hoe baie funksies wat jy kan bel in 'n program, hoeveel keer 'n funksie kan noem homself. So selfs al het ons het verkondig rekursie as dit moontlik magiese ding wat 'n n paar weke gelede vir die Sigma funksie, en wanneer ons die data strukture en CS50, sien jy ander aansoeke vir dit, dit is nie noodwendig die beste ding. Want as 'n funksie oproepe self, oproepe self, selfs al is daar 'n basis geval, as jy nie getref dat die basis geval vir 1000 bel of 10,000 oproepe, deur daardie tyd wat jy kan hardloop het uit die kamer op jou sogenaamde stapel en druk 'n ander segmente van die geheue. So is dit ook 'n ontwerp trade-off tussen elegansie en tussen welstand van jou spesifieke implementering. So daar is nog 'n nadeel of 'n ander Gotcha wat ons het doen tot dusver. Toe ek genoem getstring - laat my gaan terug in die hallo-2. Let daarop dat ek getstring is roep, wat die terugkeer van 'n adres. En ons eis vandag dat adres is van die wal. En nou is ek druk uit die string by daardie adres. Maar ons het nog nooit bekend as die teenoorgestelde van getstring. Ons het nog nooit 'n funksie soos om calll ungetstring, waar jy hand terug dat die geheue. Maar eerlik ons ​​waarskynlik moes gewees het. Want as ons bly vra die rekenaar vir die geheue, by wyse van iemand soos getstring maar nooit gee dit terug, sekerlik Dit is ook gebind te lei tot probleme waardeur ons hardloop uit van die geheue. En in werklikheid, kan ons kyk vir hierdie probleme met die nuwe instrument waarvan die gebruik is 'n bietjie kripties te tik. Maar laat my gaan voort en spat dit op op die skerm in net 'n oomblik. Ek gaan om voort te gaan en uit te voer Valgrind met parameter wie se eerste opdrag lyn argument is die naam van die program hallo-2. En ongelukkig is dit produksie is afgrijselijk kompleks vir geen goeie rede. So sien ons almal dat die gemors. David is stel my naam. So wat is die program eintlik loop. En nou kry ons dit uitvoer. So Valgrind is soortgelyk in die gees te GDB. Dit is nie 'n debugger per se. Maar dit is 'n geheue checker. Dit is 'n program wat sal loop jou -program en vertel jou as jy gevra om 'n rekenaar geheue en nooit ingehandig terug, en daardeur wat beteken dat jy 'n geheugenlek. En geheue lekkasies is geneig om te sleg wees. En jy is die gebruikers van rekenaars waarskynlik gevoel, of jy het 'n Mac of 'n rekenaar. Het jy al ooit gebruik word om jou rekenaar vir terwyl en nie weer begin in verskeie dae, of jy het net 'n baie programme hardloop, en die damn ding vertraag tot stilstand, of ten minste dit is super irriterende te gebruik, want alles net super stadig. Nou wat kan 'n aantal redes wees. Dit kan 'n oneindige lus, 'n fout in wees iemand se kode, of, meer eenvoudig, dit kan beteken dat jy meer jy gebruik geheue, of probeer om, as jou rekenaar het eintlik. En miskien is daar 'n fout in 'n program wat bly vra vir die geheue. Browsers vir die jaar was berug vir hierdie, vra vir meer en meer geheue maar nooit oorhandig dit terug. Seker, as jy net 'n beperkte hoeveelheid geheue, kan jy nie vra nie oneindig baie keer vir sommige van die geheue. En so wat jy hier sien, selfs al weer Valgrind se produksie is onnodig kompleks is om te blik op Eerstens, dit is die interessante deel. Hoop - in gebruik by die uitgang. So hier is hoeveel geheue was in gebruik in die hoop op die tyd my program afgesluit - blykbaar ses grepe in een blok. So ek gaan my hande te waai na wat 'n blok is. Dink dit is net 'n stuk, 'n meer tegniese woord vir stuk. Maar ses grepe - Wat is die ses grepe was steeds in gebruik? Presies. D-'n-V-ek-D agteroorskuisstreep nul, vyf brief naam plus die nul terminator. So hierdie program opgemerk Valgrind dat ek gevra om vir ses grepe, blykbaar deur manier van getstring, maar nooit het hulle terug. En in waarheid te sê, kan dit nie so wees voor die hand liggend as my program is nie drie lyne, maar dit is 300 lyne. Sodat ons kan eintlik gee 'n ander opdrag lyn argument te Valgrind te maak dit meer verbose. Dit is 'n bietjie irriterend om te onthou. Maar as ek doen - Kom ons kyk. Lek - Was dit lek - selfs ek kan nie onthou wat dit is af hand. - Lek-tjek gelyk vol. Yep, dankie. - Lek-tjek gelyk vol. Betree. Dieselfde program word uitgevoer. Tik in Dawid weer. Nou sien ek 'n bietjie meer detail. Maar onder die hoop opsomming, wat identies is aan vier - ah, hierdie is 'n soort van lekker. Nou Valgrind is eintlik op soek na 'n bietjie harder in my kode. En dit is te sê dat, blykbaar, malloc by lyn - ons uit te zoem. Op die lyn - ons nie sien nie watter lyn dit is. Maar malloc is die eerste skuldige. Daar is 'n blog in malloc. Alle reg? OK, no. Reg? Ek het getstring. getstring noem blykbaar malloc. So, wat reël van die kode is blykbaar by die skuld vir die feit dat toegeken die geheue? Kom ons neem aan dat elkeen wat geskryf het malloc het lank genoeg dat dit nie hulle skuld nie. So is dit waarskynlik myn. getstring in cs50.c - so dit is 'n lêer iewers op die rekenaar - in lyn 286 lyk na die skuldige is. Nou kom ons aanvaar dat cs50 is om vir ordentlike bedrag van die tyd, so ons ook onfeilbaar. En so is dit waarskynlik nie in getstring dat die fout lê nie, maar eerder in hallo-2.c lyn 18. So kom ons neem 'n blik op wat daardie lyn 18 was. Oh. Een of ander manier hierdie lyn is nie noodwendig karretjie, per se, maar dit is die rede agter dat die geheue lek. So super eenvoudig, wat sal intuïtief die oplossing hier? As ons vra vir die geheue, was nog nooit gee dit terug, en wat blyk te wees om 'n probleem, want met verloop van tyd my rekenaar sou loop uit geheue, dalk stadiger af, kan slegte dinge gebeur, goed, wat is die eenvoudige intuïtief oplossing? Net gee dit terug. Hoe vry is jy nie 'dat die geheue? Wel, gelukkig is dit eenvoudig om net te sê free naam. En ons het nog nooit gedoen het nie. Maar jy kan in wese dink vry as die teenoorgestelde van malloc. vry is die teenoorgestelde van toekenning van die geheue. So nou laat my heropstel hierdie. Maak hallo-2. Laat my loop dit weer. hallo-2 Dawid. So dit blyk te werk in presies dieselfde manier. Maar as ek terug te gaan na Valgrind en weer uit te voer dieselfde opdrag op my nuut saamgestel program, tik in my naam as voor - Nice. Hoop opsomming - in gebruik by die uitgang - nul grepe in nul blokke. En dit is super lekker, al hoop blokke vrygelaat is. Geen lekkasies is moontlik. So kom, nie met die probleem Stel 4, maar met die probleem Stel 5, die forensiese en verder, dit sal ook 'n maatstaf van die korrektheid van jou program, ongeag of jy ' of het nie die geheue lekkasies. Maar gelukkig is, kan jy nie net redeneer deur hulle intuïtief, wat is, waarskynlik, maklik vir klein programme maar moeiliker vir groter programme, Valgrind, vir diegene wat groter programme, kan help om te identifiseer die spesifieke probleem. Maar daar is een ander probleem wat mag ontstaan. Laat my oopmaak hierdie lêer hier, wat is, weer, 'n ietwat eenvoudige voorbeeld. Maar laat ons fokus op dit wat hierdie program doen. Dit is die sogenaamde memory.c. Ons sal dit later vandag plaas in die rits van vandag se bron-kode. En sien dat Ek het 'n funksie genoem f wat neem geen argumente en terugkeer nie. In lyn 20, ek glo waarby 'n wyser na 'n int en noem dit x. Ek is die toeken is die terugkeer waarde van malloc. En net om duidelik te wees, hoeveel grepe am Ek het waarskynlik om terug van malloc in hierdie situasie? Waarskynlik 40. Waar kry jy dit uit? Wel, as jy onthou dat 'n int dikwels 4 grepe, ten minste is dit in die toestel, 10 keer 4 is natuurlik 40. So malloc terugkeer 'n adres van 'n stuk van die geheue en berging wat spreek uiteindelik in x. So duidelik te wees, wat dan gebeur? Wel, laat my terug skakel aan ons prentjie hier. Laat my net nie trek die onderkant van my rekenaar se geheue, laat my gaan voort en trek die hele reghoek wat verteenwoordig al van my geheue. Ons sal sê dat die stapel is op die onderkant. En daar is 'n teks segment in die ongedaan data. Maar ek is net gaan om abstrakte diegene ander dinge weg as dot, dot dot. Ek gaan net om te verwys na hierdie as die hoop op die top. En dan aan die onderkant van hierdie foto, hoof te verteenwoordig, ek gaan om te gee dit 'n snye geheue op die stapel. Vir f, ek gaan om te gee dit 'n sny van die geheue op die stapel. Nou, ek het my te raadpleeg source code weer. Wat is die plaaslike veranderlikes vir die hoof? Blykbaar niks, sodat sny is effektief leeg, of selfs nie so 'n groot as ek getrek het. Maar in f, ek het 'n plaaslike veranderlike, wat genoem word x. So ek gaan om voort te gaan en f gee 'n stuk van die geheue, noem dit x. En nou malloc van 10 keer 4, So malloc 40, waar is dat geheue vandaan? Ons het nie getrek 'n foto soos hierdie voor. Maar laat ons veronderstel dat dit effektief is kom van hier, so een nie, twee, drie, vier, vyf. En ek moet nou 40 van hierdie. So ek sal net doen dot, dot, dot te stel dat daar selfs meer geheue kom terug van die wal. Nou wat is die adres? Kom ons kies om ons arbitrêre spreek soos altyd - Ox123, selfs al is dit waarskynlik gaan om iets heeltemal anders. Dit is die adres van die eerste byte in geheue wat ek vra malloc vir. Dus, in kort, een keer line 20 voer, wat letterlik gestoor binnekant van x hier? Ox123. Ox123. En die bees is oninteressant. Dit beteken net hier is 'n heksadesimale getal. Maar wat is die belangrikste is dat wat ek store in x, wat is 'n plaaslike veranderlike. Maar sy data tipe, weer, is 'n adres van 'n int. Wel, ek gaan Ox123 te stoor. Maar weereens, as dit is 'n bietjie te ingewikkeld onnodig, as ek blaai terug, kan ons abstrakte hierdie weg baie redelik en net sê dat x 'n wyser na daardie deel van die geheue. OK. Nou is die vraag aan die hand is die volgende - lyn 21, dit blyk, is karretjie. Hoekom? Jammer? Dit hoef nie - sê dat een keer meer. Wel, dit beteken nie vry nie. So dit is die tweede maar. So is daar 'n ander, maar spesifiek op lyn 21. Presies. Hierdie eenvoudige reël van die kode is net 'n buffer oorloop, 'n Bufferschrijding. 'N buffer beteken net 'n stuk van die geheue. Maar dit deel van die geheue van grootte 10, 10 heelgetalle, wat beteken dat as ons indeks in dit met behulp van die sintaktiese suiker van verskeidenheid notering, die vierkant tussen hakies, jy het toegang tot x bracket 0 x bracket 1 x, bracket dot, dot, dot. x bracket 9 is die grootste een. So as ek doen x bracket 10, waar Ek het eintlik gaan in die geheue? Wel, as ek het 10 int - Kom ons eintlik trek al van hierdie hier. So dit was die eerste vyf. Hier is die ander vyf ints. So x bracket 0 is hier. x bracket 1 is hier. x bracket 9 is hier. x bracket 10 hier is, wat beteken dat ek sê, in lyn 21, die rekenaar om die te sit nommer waar? Die getal 0 waar? Wel, dit is 0, ja. Maar net die feit dat sy 0 is 'n soort van 'n toeval. Dit kan die nommer 50, vir al wat ons omgee. Maar ons probeer om dit te sit op x bracket 10, en dit is waar hierdie vraagteken getrek word, wat is nie 'n goeie ding. Hierdie program kan baie goed crash as 'n resultaat. Nou, laat ons gaan voort en sien of dit is inderdaad wat gebeur. Maak geheue, aangesien die lêer genoem memory.c. Kom ons gaan voort en hardloop die program geheue. So het ons gelukkig is, eintlik, dit lyk. Ons het gelukkig nie. Maar laat ons kyk of ons nou Valgrind hardloop. Met die eerste oogopslag, my program mag blyk te wees heeltemal korrek. Maar laat my hardloop Valgrind met die - Lek-tjek gelyk volle op geheue. En nou as ek loop hierdie - interessant. Ongeldig skryf van grootte 4 by lyn 21 van memory.c. Line 21 van memory.c is watter een? O, interessant. Maar wag. Grootte 4, wat is dit verwys na? Ek het een skryf, maar dit is van die grootte 4. Hoekom is dit 4? Dit is omdat dit is 'n int, wat is, weer, vier grepe. So Valgrind gevind 'n fout dat ek, skrams by my kode, gedoen het nie. En miskien is jou TF wil of nie. Wat egter Valgrind vir seker bevind dat ons het 'n fout gemaak is daar, selfs al het ons gelukkig is, en die rekenaar besluit, eh, ek gaan nie te crash net omdat jy aangeraak een greep, een int se waarde van die geheue wat jy nie gedoen het eintlik eie. Wel, wat anders is karretjie hier. Adres - dit is 'n gek na adres in heksadesimaal. Dit beteken net iewers in die hoop is nul grepe na 'n blok van grootte 40 toegeken word. Laat my uitzoem hier en kyk of dit is 'n bietjie meer nuttig. Interessant. 40 grepe is beslis verlore in verlies rekord 1 van 1. Weereens, meer as woorde is nuttig hier. Maar wat gebaseer is op die gemerkte lyne, waar ek moet waarskynlik fokus my aandag vir 'n ander fout? Lyk soos 'n lyn 20 van memory.c. So as ons gaan terug na lyn 20, dit is die een wat jy vroeër geïdentifiseer. En is dit nie noodwendig karretjie. Maar ons het hierdie omgekeer sy effekte. So hoe kan ek ten minste korrek een van daardie foute? Wat kan ek doen na reël 21? Ek kon doen nie vry van x, is so terug te gee dat die geheue. En hoe kan ek dit regmaak fout? Ek moet beslis gaan nie verder as 0. So laat ek probeer om weer uit te voer nie. Jammer, beslis gaan nie verder as 9. Maak geheue. Laat my tik Valgrind in 'n groter venster. En nou kyk. Nice. Alle hoop blokke vrygelaat is. Geen lekkasies is moontlik. En bo hier, is daar geen melding meer van die ongeldig reg. Net om te kry gulsig, en laat sien as nog 'n demonstrasie gaan nie soos dit bedoel - Ek het kry gelukkig 'n oomblik gelede. En die feit dat dit 0 is miskien onnodig misleidend. Laat ons net 50, 'n ietwat arbitrêre nommer, maak geheue dot streep geheue - kry nog steeds gelukkig. Niks is gekraak. Seker maar net iets doen regtig dwase, en ek doen 100. Laat my remake geheue, dot streep geheue - het gelukkig weer. Hoe oor 1000? ints verder, min of meer, waar ek moet wees? Maak geheue - damn dit. [Gelag] OK. Laat ons nie gemors rond nie. Tik geheue. Daar gaan ons. Alle regte. So glo jy indeks 100,000 ints buite waar jy moes gewees het in geheue, slegte dinge gebeur. So dit is natuurlik nie 'n harde, vinnige reël. Ek was soort van die gebruik van verhoor en fout om daar te kom. Maar dit is omdat, 'n lang storie kort te maak, jou rekenaar se geheue is ook verdeel in hierdie dinge genoem segmente. En soms, die rekenaar eintlik het jy 'n bietjie meer geheue as jy vra. Maar vir doeltreffendheid, dit is net makliker om te meer geheue, maar net vertel dat jy kry 'n gedeelte daarvan. En as jy gelukkig is soms, dus, kan jy in staat wees om aan te raak geheue wat nie aan jou behoort nie. Jy het geen waarborg dat die waarde wat jy sit daar sal daar bly, want die rekenaar dink nog steeds dit is nie joune is, maar dit is nie noodwendig gaan 'n ander segment van die geheue te slaan in die rekenaar en veroorsaak 'n fout soos hierdie een hier. Alle regte. Enige vrae en dan op die geheue? Alle regte. Kom ons neem 'n blik hier, dan, op iets wat ons het is om vir toegestaan ​​vir 'n geruime tyd, wat is in hierdie lêer genaamd cs50.h. So, dit is 'n lêer. Dit is net 'n hele klomp van die kommentaar op top. En jy kan daar uitgesien het na hierdie as jy steek rond op die toestel. Maar dit blyk dat al die tyd, wanneer ons gebruik string te gebruik as 'n sinoniem, die manier waarop ons verklaar wat sinoniem is met hierdie navraag typedef, vir tipe definisie. En ons is in wese sê, maak string 'n sinoniem vir kar ster. Dat die wyse waarop die stapel geskep om hierdie opleiding wiele bekend as die string. Nou hier is net 'n prototipe vir getChar. Ons kan gesien het dit voor, maar dit is inderdaad wat dit doen. getChar neem geen argumente, gee 'n kar. getdouble neem geen argumente, gee 'n dubbel. getfloat neem geen argumente, opgawes 'n vlot, en so meer. getint is hier. getlonglong is in hier. En getstring is hier. En dit is dit. Dit pers lyn is 'n ander preprocessor richtlijn as gevolg van die hashtag aan die begin van dit. Alle regte. So nou laat my gaan in cs50.c. En ons sal nie te lank praat oor hierdie. Maar om te gee jou 'n kykie van wat is aan die gang al hierdie tyd, laat my gaan - Kom ons doen getChar. So getChar is meestal kommentaar. Maar dit lyk soos hierdie. So dit is die werklike funksie getChar dat ons het al neem as vanselfsprekend aanvaar nie bestaan ​​nie. En selfs al het ons nie gebruik het hierdie een wat dikwels, indien ooit, is dit ten minste relatief eenvoudig. So dit is die moeite werd om 'n vinnige blik op hier. So getChar het 'n oneindige lus, doelbewus so blykbaar. Dit roep dan - en dit is 'n soort van 'n mooi hergebruik van kode ons onsself geskryf het. Dit is dan getstring. Omdat wat dit doen nie beteken dat 'n kar te kry? Wel, kan net so goed jy probeer om 'n te kry hele lyn van teks van die gebruiker en dan net kyk na een van die karakters. In lyn 60, hier is 'n bietjie bietjie van 'n gesonde verstand tjek. As getstring teruggekeer null, laat ons nie voort te gaan. Iets wat verkeerd geloop het. En dit is 'n bietjie irriterend, maar konvensionele in C. kar Max waarskynlik verteenwoordig wat net gebaseer op sy naam? Dit is 'n konstante. Dit is soos die numeriese waarde van die grootste kar wat jy kan te stel met een byt, wat waarskynlik die aantal 255, wat is die grootste getal wat jy verteenwoordig agt stukkies, vanaf nul. Daarom het ek dit gebruik, in hierdie funksie, wanneer skryf van hierdie kode, net omdat as iets verkeerd gaan in getChar maar sy doel in die lewe is 'n terugkeer kar, moet jy een of ander manier in staat wees om om aan te dui aan die gebruiker wat iets wat verkeerd geloop het. Ons kan nie terugkeer null. Dit blyk dat die nul is 'n muis. En weer, getChar het 'n kar om terug te keer. So het die konvensie, as iets verkeerd is, is jou, die programmeerder, of in hierdie geval, my met die biblioteek, het ek 'n regverdige arbitrêr besluit, indien iets verkeerd gaan, gaan ek terug te keer die getal 255, wat is werklik beteken dat ons nie kan nie, die gebruiker kan tik nie die karakter verteenwoordig deur die getal 255 want ons het 'n steel dit as 'n sogenaamde brandwag waarde verteenwoordig 'n probleem. Nou blyk dit dat die karakter 255 is nie iets wat jy kan tik op u sleutelbord, so dit is nie 'n groot deal. Die gebruiker het nie kennis dat Ek het gesteel hierdie karakter. Maar as jy al ooit sien in man bladsye op 'n rekenaarstelsel n verwysing na 'n hoofletters konstant soos hierdie wat sê: in gevalle van dwaling hierdie konstante krag teruggestuur word, dit is al 'n paar mense gedoen het jaar gelede was arbitrêr besluit om te terugkeer hierdie spesiale waarde en noem dit 'n konstante in die geval iets verkeerd gaan. Nou is die magic gebeur hier. Eerstens, ek verklaar in lyn 67 twee karakters, C1 en C2. En dan in lyn 68, daar is eintlik 'n reël van die kode wat herinner aan ons vriend printf, gegee dat dit hoef persent Cs in aanhalingstekens. Maar let op wat hier gebeur. sscanf beteken string scan - beteken scan 'n formaat string, ergo sscanf. Wat beteken dit? Dit beteken dat jy verby 'n string te sscanf. En die lyn is wat die gebruiker in Jy slaag in 'n formaat string soos om sscanf dit wat vertel Wikipediabespreking wat jy hoop om die gebruiker getik in Jy dan slaag-in die adresse van twee stukke van die geheue, in hierdie geval, want ek het twee plekhouers. So ek gaan om te gee dit die adres van C1 en die adres van C2. En onthou dat jy 'n funksie van die adres van sommige veranderlike, wat is Die implikasie? Wat kan daardie funksie te doen as 'n gevolg gee dit die adres van 'n veranderlike, in teenstelling met die veranderlike self? Dit kan verander nie, reg? As jy het iemand 'n kaart na 'n fisiese adres, kan hulle daar te gaan en te doen wat hulle wil by daardie adres. Dieselfde idee hier. As ons slaag om sscanf, die adres van die twee stukke van die geheue, selfs hierdie klein bietjie stukke van die geheue, C1 en C2, maar ons vertel dit die adres van hulle, sscanf kan dit verander. So sscanf se doel in die lewe, as ons lees die man-bladsy is om te lees wat die gebruiker getik in, hoop vir die gebruiker met getik in 'n karakter en miskien 'n ander karakter, en wat die gebruiker getik, die eerste karakter gaan Hier is die tweede karakter gaan hier. Nou, as 'n eenkant, dit, en jy sal weet net dit van die dokumentasie, die feit dat ek 'n leë ruimte is daar beteken net dat ek gee nie om as die gebruiker treffers van die spasie balk om 'n paar keer voor hy of sy neem 'n karakter, ek gaan om te ignoreer enige wit ruimte. Dus, ek weet uit die dokumentasie. Die feit dat daar 'n tweede% c gevolg deur wit spasie is eintlik doelbewuste. Ek wil in staat wees om op te spoor indien die gebruiker verfrommeld of nie saam te werk. So ek hoop dat die gebruiker getik in een karakter, dus ek hoop dat sscanf gaan net die terugkeer waarde 1, want, weer, as ek lees die dokumentasie, sscanf se doel die lewe is om terug te keer na die aantal veranderlikes wat gevul met toevoer van die gebruiker. Ek geslaag het in twee veranderlikes adresse, C1 en C2. Ek hoop egter dat slegs een van hulle kry vermoor, want as sscanf opbrengste 2, wat is vermoedelik Die implikasie logies? Dat die gebruiker het nie net gee my 'n karakter soos ek vir hom of haar. Hulle het waarskynlik getik minste twee karakters. So as ek plaas nie die tweede % C, ek het net een gehad het, wat eerlik sou wees meer intuïtief benadering, ek dink 'n eerste oogopslag, jy gaan nie in staat wees om op te spoor As die gebruiker is gee jou meer insette as wat jy eintlik wou hê. So, dit is 'n implisiete vorm foutkontroles. Maar let op wat ek hier doen. Sodra ek is seker dat die gebruiker het my een karakter, Ek bevry die lyn, doen die teenoorgestelde van getstring, wat op sy beurt gebruik malloc, en dan sal ek terugkeer C1, die karakter wat ek hoop die gebruiker verskaf en slegs verskaf. So 'n vinnige bijhorend alleen nie, maar enige vrae oor getChar? Ons sal terug te kom na 'n paar van die ander. Wel, laat ek gaan voort en dit doen - veronderstel nou, net om te motiveer ons bespreking in 'n week plus tyd, hierdie is 'n lêer genaamd structs.h. En weereens, dit is net 'n voorsmakie van iets wat voorlê. Maar let op dat 'n baie van hierdie is kommentaar. So laat my beklemtoon slegs die interessante deel vir nou. typedef - daar is dat dieselfde navraag weer. typedef ons gebruik string te verklaar as 'n spesiale data tipe. Jy kan gebruik om typedef splinternuwe te skep data tipes wat nie bestaan ​​het toe C is uitgevind. Byvoorbeeld, int kom met C. kar kom met C. dubbel kom met C. Maar daar is geen idee van 'n student. En tog sou dit baie handig wees om te wees staat om 'n program wat winkels te skryf in 'n veranderlike, 'n student se ID nommer, hul naam, en hul huis. Met ander woorde, drie stukke van data, soos 'n int en 'n string en 'n ander string. Met typedef, wat is redelik kragtige oor hierdie en die navraag sturct vir struktuur, julle, die programmeerder in 2013, eintlik kan definieer jou eie die data tipes wat nie jaar bestaan gelede, maar wat pas by jou doeleindes. En so hier, in reëls 13 tot 19, ons is waarby 'n nuwe tipe data, soos 'n int, maar noem dit student. En binnekant van hierdie veranderlike gaan Drie is dit - 'n int, 'n string, en 'n string. So jy kan dink wat werklik hier gebeur het, selfs al is dit 'n bietjie van 'n vereenvoudiging vir vandag, 'n student is in wese gaan om te lyk soos hierdie. Sy gaan 'n stuk van wees geheue met 'n ID, 'n naam veld, en 'n huis gebied. En ons sal in staat wees om die stukke te gebruik geheue en toegang tot hulle soos volg. As ek gaan in struct0.c, hier is 'n relatief lank, maar ná 'n patroon, van die kode wat gebruik hierdie nuwe truuk. So, laat my trek jou aandag na die interessante dele tot bo-op. Skerp definieer studente 3, verklaar 'n konstante genoem studente en ken dit arbitrêr die nommer 3, net so ek het drie studente met hierdie program vir nou. Hier kom Main. En kennis, hoe kan ek verklaar 'n verskeidenheid van studente? Wel, ek het net gebruik dieselfde sintaks. Die woord student is natuurlik 'n nuwe. Maar student, klas, bracket studente. So ongelukkig is daar is 'n baie van hergebruik van terme hier. Dit is net 'n nommer. So dit is soos om te sê drie. Klas is net wat ek wil die veranderlike te bel. Ek kon dit noem studente. Maar klas, is dit nie 'n klas in 'n objekgeoriënteerde Java soort manier. Dit is net 'n klas van studente. En die data tipe van elke element in die skikking is student. So, dit is 'n bietjie anders en uit om iets te sê soos hierdie, dit is net - Ek sê gee my drie studente en noem dat die verskeidenheid klas. Alle regte. Nou hier is 'n vier-lus. Hierdie man se bekende - iteraat van nul op tot drie. En hier is die nuwe stuk van sintaksis. Die program gaan my gevra, die mens, om te gee dit 'n student ID, wat 'n int. En hier is die sintaksis wat jy kan stoor iets in die ID-veld by plek klas bracket I. So hierdie kode is nie nuut nie. Dit beteken net gee my die agtste student in die klas. Maar dit is 'n nuwe simbool. Tot nou toe het ons kan nie gebruik dot, ten minste in die kode soos hierdie. Dit beteken gaan na die struct bekend as 'n student en sit iets daar. Net so, in die volgende lyn, 31, gaan voort te sit en wat die gebruiker tik vir 'n naam hier en wat hulle doen vir 'n huis, dieselfde ding, gaan voort en sit dit in. huis. So, wat beteken hierdie program uiteindelik doen? Jy kan sien 'n bietjie teaser daar. Laat my gaan voort en maak nie structs 0 dot streep struct 0, student se ID 1, sê David Mather, student ID 2. Rob Kirkland, student ID 3. Lauren Leverit - en die enigste ding wat hierdie program het, Dit is net heeltemal arbitrêre, is Ek wou iets te doen met die data, nou dat ek het geleer hoe om te gebruik structs, is ek moes net Hierdie ekstra lus hier. Ek Itereer oor die skikking van die studente. Ek gebruik word om ons, miskien nou reeds bekende vriend, string vergelyk, stircomp te tjek is 8 student se huis gelyk aan Mather? En indien wel, net druk iets arbitrêr hou, ja, dit is nie. Maar weereens, net gee my geleenthede te gebruik en hergebruik en onthou hierdie nuwe dot notasie. So wat omgee, reg? Kom met 'n student program is ietwat arbitrêr nie, maar dit blyk uit wat ons kan doen nuttige dinge met hierdie, byvoorbeeld soos volg. Dit is 'n baie meer ingewikkeld struct in C. Dit het 'n dosyn of meer velde, ietwat kripties vernoem. Maar as jy al ooit gehoor van 'n grafiese lêer formaat genoem bitmap, BMP, is dit blyk dat die bitmap lêer formaat mooi lyk baie soos dat hierdie. Dit is 'n dom bietjie Smiley gesig. Dit is 'n klein beeld wat ek het ingezoomd op redelik groot, sodat ek kon sien elke van die individuele kolle of pixels. Nou, dit blyk ons ​​kan verteenwoordig 'n swart dot met, sê, die nommer 0. En 'n wit kol met die nommer 1. So met ander woorde, as jy wil 'n te trek Smiley gesig en red die beeld in 'n rekenaar, is dit voldoende om nulle te slaan en Diegene wat lyk soos hierdie, waar, weer, dié is wit en nulle is swart. En saam, as jy effektief 'n gord van ene en nulle, jy het 'n rooster van pixels, en as jy gaan lê hulle uit, jy het 'n oulike bietjie Smiley gesig. Nou, bitmap lêer formaat, BMP, is effektief dat onder die enjinkap, maar met meer pixels skielik dat jy kan eintlik verteenwoordig kleure. Maar wanneer jy meer gesofistikeerde lêer formate soos BMP en JPEG en GIF waarmee jy dalk vertroud wees, diegene lêers op die skyf tipies nie net het nulle en ene vir die pixels, maar hulle het 'n paar metadata so goed - meta in die sin dat dit nie regtig data, maar dit is handig te hê. So hierdie velde hier impliseer, en ons sal sien dit in meer detail in P-set 5, wat voor die nulle en kinders wat verteenwoordig die pixels in 'n beeld, daar is 'n klomp van die metadata soos die grootte van die beeld en die breedte van die beeld. En sien ek pluk af 'n paar arbitrêre dinge hier - breedte en hoogte. Bietjie tel en 'n paar ander dinge. So daar is 'n paar metadata in 'n lêer. Maar deur te verstaan ​​hoe lêers word gelê op hierdie manier, kan jy eintlik dan manipuleer beelde, herstel beelde van die skyf, die grootte van beelde. Maar jy kan nie noodwendig versterk hulle. Ek nodig het 'n foto. So het ek terug na RJ hier, wat jy gesien het, op die skerm 'n geruime tyd gelede. En as ek oopmaak Keynote hier, is dit wat gebeur as jy probeer om te vergroot en verbeter RJ. Hy is nie om 'n beter regtig. Nou Keynote is 'n soort van vervaag dit 'n bietjie, net om te glans oor die feit dat RJ nie veral kry verbeterde wanneer jy zoom in En as dit op hierdie manier, sien die blokkies? Ja, jy kan beslis sien die vierkante op 'n projektor. Dit is wat jy kry wanneer jy verbeter. Maar in die begrip van hoe ons RJ of die Smiley gesig is geïmplementeer sal laat ons eintlik skryf kode wat manipuleer hierdie dinge. En ek het gedink ek wil eindig op hierdie noot, met 55 sekondes van 'n verhoog wat is, Ek waag, sê eerder misleidend. [Video speel] -Hy lieg. Oor wat, ek weet nie. -So, wat weet ons? -Dit op 09:15 Ray Santoya was by die OTM. -So die vraag is wat Hy is besig om 09:16? -Skiet van die nege millimeter na iets. Miskien het hy gesien hoe die sniper. -Of was saam met hom. -Wag nie. Gaan terug een. -Wat sien jy? Bring-sy gesig, vol skerm. -Sy bril. -Daar is 'n weerspieëling. -Dit is die Neuvitas bofbal span. Dit is hul logo. -En hy praat met elkeen se dra dat die baadjie. [Einde video-vertoning] David J. MALAN: Dit sal wees Probleem Stel 5. Ons sal jou volgende week sien. Man Spreker: By die volgende CS50. [KRIEKE tjirp] [Speel van musiek]