JASON HIRSCHHORN: Welcome til A5, alle sammen. Vi har en spændende uge foran os, hovedsagelig fordi der er så mange nye står i dette rum. Det er vidunderligt. En masse af jer er her ved et uheld, der er endnu bedre. Så forhåbentlig vil du holde slutter sig til os. I denne uge vil vi bruge hovedparten af ​​afsnittet forberedelse til quizzen. Så ifølge vores dagsorden, vi kommer til at tale lidt om ressourcer til klassen, men også for quiz, og derefter igen, tilbringer størstedelen af ​​klassen taler om spørgsmål. Når vi er færdig besvare dit spørgsmål, eller hvis dine spørgsmål naturligt føre os til nogle kodning, jeg har problemer med eksempler fra midterms fortiden, at vi vil kode direkte i afsnittet sammen, der også opdrage nogle andre gode emner til at dække. Så det første, som vi har gået igennem for sidste par uger for at minde dig gutter, der er et væld af ressourcer til rådighed for dette kursus. Mange af dem vil være utrolig nyttigt til dig, som du fortsætter med at studere for quiz 0, fordi Det er tirsdag eftermiddag. Så alle jer har været studerer for lidt. Der er noter og kilde kode, som du bør helt sikkert tjekke ud. Se shorts. Tjek study.cs50.net. Og så, anført nedenfor, en række af andre ressourcer. Igen, quiz 0 er i morgen klokken 1. Hvis du ikke allerede har gjort det, så tjek ud Om Quiz 0 dokument på kursets hjemmeside for at finde ud af hvor du tager quizzen. Quizzen starter kl 01:10 og slutter 70 minutter senere. Så hvis du dukker op efter 01:10, er du kommer til at få, at mange færre minutter 70 for at tage quizzen. Så sørg for at du er der til tiden. Hvis du er en udvidelse studerende eller har nogle andre test overvejelser, det måske ikke være klokken 1 i morgen. Men igen, skal du kontrollere Om Quiz 0 dokumentere at sikre, at du ved, hvornår du tager quizzen. Jeg skrev 75 minutter op her. Jeg tror, ​​det er rigtigt, ikke 70 år. Den dækker alt materiale fra en uge 0 til sidste uges forelæsning på onsdag. Og igen, for denne quiz, pr der dokument, får du en to-sidet og 8 1/2 med 11 ark papir, som du får at bruge som noter under quizzen. Mange mennesker, hvis ikke de fleste mennesker, har fandt, at den mest nyttige måde at studere for quizzen er at foretage en undersøgelse ark, en en-Sider, af deres egne. Så se på tidligere dem, hvis du har set tidligere. Nå ud til venner for at se, hvad de putter på deres. Men hands-down, den bedste måde, du kan undersøgelse er at gå igennem alt og skære det ned til hvad der bør eller ikke hører hjemme på det ark papir, fordi det er bare en rigtig nyttige måde for dig at sørge du går igennem alt og have et vist kendskab til det. De fleste mennesker, finder vi, selvom de har papirarket sidder lige ved siden af ​​dem på quizzen, ikke vende til det, fordi igen, at meget proces for at gå gennem information har hjulpet dem med at lære det. Er der nogen har nogen spørgsmål om quiz 0? Har alle - Jeg har ikke tænkt mig at lave en håndsoprækning. Det gør ikke noget. Jeg skulle til at spørge, hvem begyndte at studere. Men jeg ønsker ikke at gøre dig alle ikke hæve dine hænder. Så som jeg sagde - ja, AVI, gå videre. AVI: Hvad ville være en nyttig ting at sætte på den ene-pager? STUDENT: Det er op til dig. JASON HIRSCHHORN: Du får at bruge din dømmekraft. Nyttige ting at sætte på den ene-pager, Hvis du er forvirret over det store O runtime forskellige typer af søgninger og sorterer, sætte det på der i en handy dandy diagram. Denne måde, hvis du bliver bedt om, at der på quiz, behøver du ikke at forsøge og figur den ud eller årsag gennem runtime. Du kan bare kopiere det ned. Hvis man ser på quizzer fortid, en masse tider, er der badetid spørgsmål. Så det ville være et eksempel på en god ting at sætte på din one-pager. Andre gode ting at sætte på, hvis du er forvirret over, hvordan at erklære en funktion eller hvad de forskellige dele af funktionen erklæringen er, skriver der på der, en generisk version og så måske et eksempel. Hvis du er forvirret over pegepinde, et diagram over, hvordan pointers arbejde er sandsynligvis virkelig nyttige. Hvis du er forvirret om rekursion, en prøve rekursiv funktion på der kan også vise sig at være virkelig nyttige. Betyder det give dig nogle ideer? AVI: Du er nødt til at forstå Hele kompilering proces, ligesom hvordan det hele fungerer? JASON HIRSCHHORN: Everything der er blevet dækket kunne dukke op på quizzen. Spørgsmål - men igen, vil nogle ting være vægtet tungt end andre. Nogle ting er kommet op igen og igen i klassen, i foredrag, og afsnit. Andre ting ikke har komme op så ofte. Vi har talt meget om # include og -L noget, og hvad de betyder i udarbejdelse processen. Vi har talt meget om GDB, klamre, de forskellige flag, som vi bruger, når vi kompilere noget, og hvad make15 f.eks virkelig betyder og virkelig gør. Vi har ikke taler så meget om hvert enkelt skridt i udarbejdelse processen. Vi har stadig talt om det. Så det er stadig noget, du bør være bekendt med. Men igen, vi ikke kommer til at være - ting, der kommer op oftere i klassen er mere tilbøjelige til at komme mere ofte og være mere kraftigt vægtet på quizzen. Fedt. Eventuelle andre spørgsmål om quiz 0? OK, så jeg sætte en liste over emner på tavlen. Jeg gik igennem pensum. Jeg gik gennem gennemgang sektion fra i går aftes, og de slides til at komme op med en ikke-udtømmende liste over emner at vi har dækket så langt i CS50 og ting, der kan vises på quizzen. Så jeg har ikke tænkt mig at gå igennem hver enkelt af disse. Det ville tage meget mere tid, end vi har nu. Men jeg sætter dette op her til forhåbentlig jog din hukommelse med hensyn til ting, der kan eller måske ikke være så fortrolig med dig. Og jeg ville elske at tilbringe størstedelen af sektion besvare dine spørgsmål om Disse emner, emner som er ikke omfattet her. Vi kan skrive pseudokode. Vi kan skrive rigtig kode at sikre, at du - Jeg kan besvare dit spørgsmål og hjælpe alle fundamentalt forstå en masse af disse emner, så du vil føle forberedt og behagelig at gå ind quizzen i morgen. Så læse over listen. Du forhåbentlig er kommet til sektion med nogle spørgsmål så godt. Når du er klar, hæve din hånd og vi vil komme i gang. Husk på, de spørgsmål, du har, der er ingen dumme spørgsmål. Vi har hørt, at en masse. Og de spørgsmål, du har, er jeg villig at satse, mange andre mennesker både sidder her og ser online har så godt. Så du kan kun hjælpe folk ved at stille spørgsmål. Marcus. MARCUS: Mellem stakken og bunke, der er en forudallokerede procentdel af hukommelsen, der er defineret som dette er for stakken eller til bunke? Eller hvordan fungerer det helt nøjagtigt? JASON HIRSCHHORN: Great spørgsmål. Jeg har tænkt mig at bakke spore en lille smule. Er alle - skal du være ærlig her. Jeg ved, jeg beder dig om at hæve din hånd foran dine kammerater. Men er der mennesker, der føler utilpas med stakken og bunke og vil gerne gå over at og hvad de betyder? Løft din hånd, hvis - OK. Tak. Så vi kommer til at gå over stakken og den bunke virkelig hurtigt, og derefter flytte ind besvare dit spørgsmål. Så hvis vi trækker ud af en boks til at repræsentere hukommelse på din computer, hvad er nogle ting, der går i denne boks? Main. En hovedfunktion. Hvor bliver main hen? STUDENT: [uhørligt]. JASON HIRSCHHORN: Så vi vil sætte vigtigste hernede. Hvad går i denne boks? STUDENT: De funktioner, som du kalder. JASON Hirschhorn: Funktionerne som vi kalder. Og hvor skal de hen? STUDENT: I ​​stakken. JASON HIRSCHHORN: De gå i stakken. Så vi vil kalde denne ting hernede stakken. Og op toppen, har vi den bunke. Så hukommelse er ikke en boks ligesom denne. Men det er faktisk temmelig ens. Det kommer til at være en masse kasser over og over, afhængigt af hvor stor din computer er, eller hvor stor din hukommelse er. På citat-citat slut "bunden" er stakken. Og der er flere ting der går på stakken. Og de er afhængige af de funktioner du har i din kode. Du har altid en funktion i dit kode kaldet main, så der er altid en afsnittet ned her i stak afsat til main. Disse afsnit i stakken kaldes stakrammer. Når du ringer til en anden funktion, siger main kalder en binær søgefunktion, vi sætter en anden ramme på stakken. Mere specifikt vil vi donere en luns af hukommelse på vores computer for at lagre binær søgning lokale variabler og til at køre den binære søgekoden. Så vi kalder binær søgning. I denne luns af hukommelse, vi kommer til at gemme sine lokale variable. Vi kommer til at gemme sine printf opkald. Uanset hvad der sker, at funktionen er skal oplagres lige der. Binær søgning vil udføre. Det kommer til at fuldføre udførelse. Hvad er det ord i C, der betyder at en funktion skal færdiggøre sin henrettelse? STUDENT: Retur. JASON HIRSCHHORN: Tilbage. Så når du ser en tilbagevenden erklæring, funktionen ender når den rammer det. Så binær søgning vil ramme dets tilbagevenden. Denne del af hukommelsen vil hovedsageligt frigøres. Og vigtigste vil gå tilbage til henrettelse. Så main vil holde pause, hvor var, kald binær søgning, få nogle returværdi, og fortsætte udførelse. Denne stakrammen vil gå væk. Hvis vi kalder en rekursiv funktion, som er en funktion, der kalder sig selv over og over, kunne vi få - siger vi gjorde binær søgning rekursivt. Vi kan få binær søgning versionen én, binær søgning to, binær søgning tre, binær søgning fire, binær søgning fem. Og så er denne sidste binær søgning fem vil ramme basisscenariet, og stakken rammer, vil gå tilbage og holde lukning indtil vi kommer tilbage til main. Vi kan gå over rekursion i en bit. Men alt dette er at sige, hvis du er ringer flere funktioner på et tidspunkt, der vil være flere stak rammer på stakken. Dyngen, på den anden side op her, er ikke for funktioner, ikke for lokale variabler. Det er til dynamisk allokeret variabler. Så disse er variabler, der kan være initialiseret i enten hoved-eller en funktion, vigtigste opkald. Overalt i din kode, de kan initialiseres. Og for at initialisere en dynamisk tildelt variabel. Hvilken funktion i C bruger vi? STUDENT: malloc. JASON HIRSCHHORN: malloc. Du kalder malloc. Du får en plads på hukommelse. Og at rummet hukommelse er på den bunke. Og at rummet hukommelse forbliver der, indtil du ringe gratis. Så dynamisk tildelte variabler i bunke vil eksistere, så længe du vil have dem til at eksistere, og de vil ikke gå væk, indtil du udtrykkeligt fortælle dem at gå væk. Du kan oprette dem i én funktion. Denne funktion stak rammen vil gå væk. Men denne variabel vil stadig eksistere i dyngen, indtil det er frigjort, potentielt af den funktion, der kaldes binær søgning eller hvad. Så dem bunke variabler bo der så længe du ønsker dem til at blive der. Og de får sat her. Og så den næste bliver lagt der. De holder få fyldt på, og de blive der, indtil du ringe gratis. Og væsentlige den bunke og stakken, komme til Marcus spørgsmål, vokse op mod hinanden. Og hvis de løber ind i hinanden, har du opbrugt hele hukommelsen i din computer, og dit program vil holde op fordi du ikke har nogen mere hukommelse venstre for at bruge. Mellem dem, der er potentielt andre ting. Men for omfanget af dette kursus, du behøver ikke at bekymre dig om det. Så det var svaret på dit spørgsmål. Det skal du ikke tænke på. Men det var den lange svar. Alt du behøver at vide er bunke og stakken vil - starter på bunden. Stakken gør. Den bunke er deroppe. De vil komme tættere på hinanden. Og hvis de rører, det er et problem. Du løb tør for hukommelse. Men også, i tillæg til at vide, hvor de, der er gemt i både stable og bunke. Curtis. CURTIS: Når de kolliderer, er, at en stak overflow? JASON HIRSCHHORN: Når de kolliderer, det er ikke en stak overflow. En stak overflow er et andet område at vi kan gå over, hvis du ønsker det. OK, vi vil vende tilbage til om lidt. STUDENT: Hvad er det ord, kaldet når de rammer hinanden, at stable og den bunke? JASON HIRSCHHORN: For nu, ikke bekymre dig om. Bare vide - Jeg vil besvare dette spørgsmål efter klasse. Hvis de løber ind i hinanden, du løb tør af hukommelse, fordi der er ikke mere plads der. STUDENT: Undskyld, hvad er et seg skyld? JASON HIRSCHHORN: Et segment fejl kan kaldes for - det afhænger hvorfor seg fejlen hedder. Nogle gange, din stack overflow, vil det siger seg fejl som fejlen. STUDENT: Hvad dereferere en null variabel? Er det en seg skyld? JASON HIRSCHHORN: dereferere en null pointer - OK, så hvis du har en pegepind, som du sættes lig med null, pegepinde, tilbagekaldelse, gemme hukommelse adresser som deres værdier. Og en null-pointer er hovedsagelig lagring 0, 0-th fat i denne variabel. Så 0x, 0, 0, 0, 0, et cetera. At 0-th adresse i hukommelsen, der er ikke i vores billede, der er deroppe et eller andet sted, er det forbeholdt for computeren. Vi er ikke tilladt at røre ved den. Så når dit program er fuldbyrdende, hvis noget forsøger at gå i hukommelsen adresse 0, det ved, at der er en tom værdi. Den kender intet bør være der. Så hvis du prøver og bruge noget der og behandle noget der eller forsøger at gå til denne placering, du er kommer til at få en seg fejl eller en fejl. Besvarer det dit spørgsmål? Og nu vil vi gå tilbage at stable overløb. Ting i stakken, som du fyre har set før, i - lad os tegne et tæt op af en stak ramme. Kan alle se det? Så vi har vores stack ramme. Vi gemmer et array i som en lokal variabel i denne funktion. Så siger vores udvalg har fem pletter. Alle fem af dem vil blive gemt i denne stakramme. Hvis vi begynder at skrive ud over det rammerne af dette array - så hvis vi begynder at skrive ind, lad os sige, det er 0. De er de fem indekser vores array. Hvis vi begynder at skrive i indeks 5, som vi ikke har, når vi har en vifte af størrelse 5, begynder vi at skrive ind i indeks 6, 7, 8, 9, kan vi få en Stack Overflow fejl. Generelt er det ikke - vil du sandsynligvis komme i problemer hvis du går over efter en. Men generelt vil du komme ind i de fleste problemer, hvis du går over af en masse og du gå så langt over det du skriver over afkastet adressen på funktion, som er placeret på bunden af ​​stakken rammen. Fordi, right? Du - i - undskyld. Ikke ", fordi ret." I stakrammen, har du din lokale variabler. I selve bunden af ​​stakken rammen er afsenderadressen. Det er, hvor funktionen går, når det er overstået. Og hvis du overskriver at afkastet adresse, så når denne stakrammen, når du går gennem stakken indramme og gennemførelse af hver enkelt linie, er du kommer til at gå til din nye returadresse der er skrevet der i stedet for faktiske én. Og det er, hvordan vi har set visse sikkerhedsmæssige kan ske med computere. Så stak overflow, kort sagt, er, når du overskrive del i stakken du skulle bruge, den lokale variabel, du skulle bruge, og især når du begynder at overskrive vigtige ting som returnere adresse. Og det er, hvor du får en fejl. Eller måske endda du kunne starte selv skriver ind i - sige binær søgning var lige over main. Hvis du har overskrevet en masse, du kunne skrive ind i main. Men generelt, får du en fejl før derefter, fordi computeren ved du laver noget, du ikke bør gøre. Ja. STUDENT: Hvad er forskellen mellem en stak overflow og en buffer overflow? JASON HIRSCHHORN: Buffer overflow er en mere generisk type hvad jeg lige har beskrevet. STUDENT: Så en stack overflow er en eksempel på en buffer overflow. JASON HIRSCHHORN: Præcis. Dette er en matrix, vi kan tænke på som en buffer, et rum for ting at gå i. Dette er et bufferoverløb i stakken. Vi kunne have en stakbufferoverløb. Hvis der var en buffer, hvor der ofte er en matrix bunke, og vi overskrevet disse grænser, så ville vi har et stakbufferoverløb. Og uden for rammerne af dette kursus, de er opdaget en smule anderledes. Compileren har særlig afsløring af hver. Men en buffer overflow er en mere generisk type hvad jeg beskrev, der var en stak buffer overflow. Fik at besvare dit spørgsmål? Sød. Var der andre spørgsmål i forbindelse til stakken eller bunke? Ja. STUDENT: Jeg ved, du har til frie strenge fordi de er i den bunke og du ikke ønsker at lække hukommelse. Men har du til at befri globale variabler og den slags? Eller bliver de automatisk befriet? JASON HIRSCHHORN: Godt spørgsmål. Så i CS50.H, skaber vi denne ting for du kaldte en streng. En streng er virkelig, hvad? STUDENT: Char stjerne. JASON HIRSCHHORN: En char stjerne, en pegepind til en karakter, en pointer til et array af tegn. Det er, hvad strengen er. Så vi har brug for at frigøre det, fordi getString, som vi har brugt en masse - string name lig getString - der malloc'erers for os nogle hukommelse på bunke og derefter returnerer en pointer til første tegn på, at streng, en char stjerne. Så angiveligt, hvis du ikke har været skrive gratis på nogen af ​​dine strenge at du har kaldt hidtil, har du været utætte noget hukommelse. Selvfølgelig har vi ikke talt om det, så ingen har fået i problemer for at gøre det. Men fremadrettet, ja. Når du ringer getString, er du mallocing noget plads på den bunke. Og hvis du ikke ringe gratis senere, at streng, har du en hukommelsesfejl. At besvare dit spørgsmål? Ja STUDENT: Så for at gøre det, bruger vi gratis lige før gengæld? Ligesom inden for rammerne af, jeg gætte, hvis vi siger, ligesom, int main, inden omfanget af den kode, der er inden for de krøllede parenteser, lige før - du ved, hvor du gerne plejer at lægge tilbage. Har du sætte fri, før det? JASON HIRSCHHORN: Så du kan sætte fri hvor du ønsker at sætte fri. Fordi disse er dynamisk allokeret variabler, fordi de kan bor uden for rammerne af en bestemt funktion, hvis du kalder malloc i en separat funktion, for eksempel, getString, kan du ringe gratis i main. Du behøver ikke at kalde det i den specifikke funktion hvor malloc hedder. Men du behøver at kalde det før hovedmåltiderne afkast. Og det er virkelig afhængig. Det afhænger af, hvorfor du malloced at plads i første omgang. Nogle mennesker vil kalde frigøre temmelig hurtigt. Nogle mennesker vil ikke kalde frie indtil slutningen af ​​deres program. Og de vil gå igennem og frie alt. Det afhænger af, hvorfor du kaldte malloc. STUDENT: Og hvad ville du sige hvis du kaldte brug getString? Du vil sige fri hvad? JASON HIRSCHHORN: Så syntaksen for fri er simpelthen gratis, open paren tæt paren, og navnet på markøren. Så hvis du skriver string name ligemænd getString, du sætte navn på her. Det er navnet på markøren. Og det ved at frigøre denne hukommelse. STUDENT: Så når det frigør at hukommelsen, markøren peger fortsat på dette sted i hukommelsen? Eller er markøren også tømt for den adresse, den peger på. JASON HIRSCHHORN: Vi skal prøve det. Vi bør kode,. Lad os komme tilbage, når vi kommer til kodning, og lad os kode,. Og hvis du ønsker at finde ud af svaret til det, kan du også kode, i mellemtiden. Men det er et godt spørgsmål. STUDENT: Er det muligt at gratis noget for tidligt? Så du stadig har brug for det for dit program, og du befriede at hukommelsen plads? JASON HIRSCHHORN: Ja. Det er muligt, hvis du gratis noget og så skal du bruge den igen, vil du løber ind i en fejl. Men det er på dig, fordi du befriet noget, og så kaldte det senere. Så det var en programmør fejltagelse. Men ja. Du kan skrive det. Har du flere spørgsmål om - Ja. STUDENT: Så hvis du er meningen at bare frigøre den i almindelighed før programmet slutter, betyder det, hvis Programmet slutter, og du behøver ikke slippe det, at hukommelsen er stadig fordelt? JASON HIRSCHHORN: Hvis dit program slutter og du glemmer at frigøre noget, så at hukommelsen blev tildelt hele levetiden af ​​dit program. Når dit program lukkes fuldstændigt, at hukommelsen ikke vil at blive der for evigt. Computeren er smart nok til at vide at når programmet lukker det skal slippe af med al den hukommelse, var forbundet med det pågældende program. Men der er værktøjer, du kan køre om et program til at opdage, om, hvornår den program er færdig, du har glemt for at frigøre hukommelse. Og til din næste problem sæt hvor du skal bruge malloc og bruge pegepinde, vil du køre dette programmere på dit program for at se om, når de vigtigste afkast, du havde nogle ting, der blev efterladt unfreed. Så de kommer ikke til at bo malloced evigt i din computer. Det ville være uøkonomisk, fordi meget hurtigt, computere ville løbe tør for hukommelse. Men hvis de kører indtil udgangen af ​​din programmere og de er ikke frigivet og din Programmet afsluttes, det er stadig et problem at dette værktøj vil hjælpe dig med at håndtere. STUDENT: Er det Valgrind? JASON HIRSCHHORN: Det er kaldet Valgrind. Og du vil være - STUDENT: Men vi behøver ikke at kende at for quiz, selv? Jeg mener, det blev talt om en lille smule i foredraget. JASON HIRSCHHORN: So Valgrind er navnet på dette værktøj. At vide, hvad det gør, er nok til quizzen. Men du har ikke brugt det endnu på din problem indstillet, fordi vi ikke har haft en problem sæt, der har udtrykkeligt behandlet med malloc eller du bruge malloc. Så du har ikke brugt Valgrind endnu. Men du vil bruge det før snarere end senere. STUDENT: Kan du gentage hvad Valgrind er? JASON HIRSCHHORN: Undskyld? STUDENT: Kan du gentage det formålet med Valgring er? JASON HIRSCHHORN: Valgrind er navnet - Ligesom GDB hjælper dig med debug dit program, Valgrind hjælper dig med at finde ud af, om tingene er ikke blevet løsladt når dit program lukker. Så du køre det på dit program. Og dit program færdiggøres, og det vil sige Deres program kaldet malloc dette mange tider for så mange bytes, og du kun kaldes gratis dette mange gange. Og så du forlod disse mange bytes uden at blive frigjort. Eller det vil sige, du har befriet alt. Godt arbejde. STUDENT: OK. Og det hedder Valgring? JASON HIRSCHHORN: V-A-L-G-R-I-N-D. STUDENT: Et spørgsmål om pointers. Så siger du har n stjerne x lig noget. Det svarer, uanset hvad du putter der, er, at hvad der bliver sat ind hvad x peger på, eller markøren af ​​x? JASON HIRSCHHORN: Kan du gentage spørgsmålet? Kan vi trække det, mens du siger det? STUDENT: I ​​quizzen, faktisk, det en du har sendt os, det var ligesom, char stjerne sandhed lig CS50 klipper, right? Så betyder det, at denne CS50 rocks er, hvad sandheden peger på? JASON HIRSCHHORN: Så du taler om en char stjerne i en streng, hvordan der virker? Ja. OK. Lad os trække det herovre. [SIDE SAMTALE] JASON HIRSCHHORN: Så denne variabel kommer til at være af typen char stjerne. Hvor stor er en variabel af typen char stjerne? Hvor mange bytes? STUDERENDE: fire. JASON HIRSCHHORN: Det er fire bytes. Hvor mange rettigheder er en variabel af typen int stjerne? STUDERENDE: fire. JASON HIRSCHHORN: Fire byte. Hvis det er en pegepind, så er det altid fire bytes, da pegepinde, deres værdi er en hukommelse adresse. Og hukommelse adresser på CS50 Apparatet er fire bytes lange. Så når vi kalder getString, eller når vi siger, strengNavn lig, og derefter i anførselstegn sætte en snor, vi sætter - godt, det er lidt anderledes. Vi vil gøre getString som eksempel. Eller char stjerne noget lig strengen. Beklager, giv mig et eksempel at du læser? STUDENT: char stjerne sandhed lig "CS50 rocks" i anførselstegn. JASON HIRSCHHORN: Så denne stjerne, dette vi vil kalde denne variabel x for vores generiske formål. Vi har oprettet en variabel kaldet x. Det er typen char stjerne. Det er en pointer til en række tegn. Så hernede - Så dette er, hvordan dette ville arbejde i hukommelsen. Dette ville lagre en hukommelse adresse. Det ville gemme lageradresse for det første tegn i array. Og så når du har fulgt markøren, ville du få det første tegn. Og hvis du læser dette ting som en streng, din computer er smart nok til at vide, at læse det hele indtil det bliver til en modreaktion 0. Men hvis du læser det et tegn på gangen, så du iteration gennem denne streng, så vil du bare læse en tegn ad gangen, indtil du kommer til backslash 0. Det er måske ikke besvare dit spørgsmål, selv om. STUDENT: Ja, men du ikke har malloced at rummet men for denne pegepind. JASON HIRSCHHORN: Så jeg er ikke helt sikker præcis, hvad du kigger på, fordi jeg ikke gøre denne quiz. Det skulle være et nyttigt ressource fra en anden TF. Hvis du opretter en streng på stakke eller som en lokal variabel, vil det bare være vifte af afgifter snarere end generelt en char stjerne peger på en anden streng. Men jeg ved det ikke. Det kunne være en pegepind til en anden streng på stakken samt. Ja. STUDENT: Jeg ved, at du har brug for at allokere hukommelse, hvis markøren er blive erklæret inde en anden funktion. Har du brug for at gøre det samme, hvis det er blive erklæret inde i hoved, du bruger det inde i hoved? JASON HIRSCHHORN: Så ja. Du kan erklære en pointer til enhver hukommelse adresse i hukommelsen. Det kan være lageradresse for en lokal variabel, men oftentimes, folk ikke erklære hukommelse adresser til de lokale variable, fordi de går væk, når denne funktion returnerer, som Derfor er vi generelt malloc ting. Men ja, du kunne erklære en pegepind til en anden lokal variabel. Det er bare generelt ikke gjort. Men jeg kan tage et kig på det specifik ting efter klasse. Ja. STUDENT: Jeg tror, ​​det er en slags af, hvad der bliver spurgt. Det synes mærkeligt at initialisering en pointer ikke som en adresse, men som det virker som en værdi. Det ser ud som det CS50 er, hvad der er indeni de ting der pegede på, og ikke den faktiske adresse, right? JASON HIRSCHHORN: Så det er ikke tilfældet, selv om. Det er ikke hvad der sker. Når du erklærer en char stjerne, det er en hukommelse adresse. Pointers er alle hukommelse adresser peger på noget andet. At noget andet kan være på stakken, men næsten altid er på bunke på den måde, vi vil se det brugt. Men strengNavn lig anførselstegn "GetString," vi kan se, at vi kan se gennem det og kode det. getString streng bliver ikke gemt i denne variabel, eller hvad strengen navn ikke bliver gemt i denne variabel, fordi det er ikke sådan pointere virker. Giver det mening? STUDENT: Ja. JASON HIRSCHHORN: OK. Forhåbentlig, det var ikke forvirrende for nogen. Men hvis det var, kan vi se på det igen i en smule, fordi vi faktisk kommer at kode noget, som forhåbentlig vil arbejde med strygere og hjælpe dig til at føle mere komfortabel med dem. Alle andre spørgsmål i forbindelse med disse emner eller andre emner, Jeg vil sætte op igen? Og - lige nu. Ja, Alden. ALDEN: Så det er helt uafhængige, men kan vi bare gå over virkelig hurtigt, hvad vi behøver at vide om forskellen mellem en 32 og 64-bit maskine? JASON HIRSCHHORN: Ja. Så 32 bit er, hvor mange bytes? ALDEN: Det er fire bytes. JASON HIRSCHHORN: Det er fire bytes. Og 64 bit er, hvor mange bytes? STUDENT: Otte. JASON HIRSCHHORN: Otte byte. Så igen, otte bits er én byte. Din CS50 apparatet en 32-bit maskine. Så hukommelse adresser er fire bytes lange. Der er 2 til 32 hukommelse adresser. 0 til 2 til 32 minus 1. Og jeg er ikke positivt, men det er sandsynligvis rammerne af, hvad du har brug for kender til en 32-bit maskine, at hukommelsen adresser er igen fire bytes langt, og det er det maksimale beløb, af hukommelse adresser. Også datatyper - dette kan være noget så godt det er værd at bemærke. Størrelsen af ​​en datatype afhænger den maskine, du arbejder med. Så en char, en enkelt karakter, er, hvordan mange bytes på vores CS50 apparat? Én byte. Og det er faktisk en byte som brønd på en 64-bit maskine. Og de fleste datatyper er det samme antal af bytes på begge maskiner. Men nogle datatyper vil være anderledes på begge maskiner. Så det ville være potentielt eneste, du behøver at vide. Men selv det, tror jeg, er ud over grænserne - Jeg er næsten positivt, hvis man ser tilbage på gamle quizzer, det siger, påtage sig kodning problemer, du bruger en 32-bit maskine. Men der er, til at gå sammen med, at der i hvis du er interesseret, er der datatyper, der er de samme størrelse på alle maskiner. Hvis du har set noget lignende uint32_t, måske eller måske du ikke har set det. Det er en datatype. Det siger, være 32 bit, uanset hvilken maskine det er tændt. Så når folk skriver bærbare kode, de sandsynligvis ikke vil bruge ints. De vil i stedet bruge disse andre data typer, som de ved, vil være den samme størrelse på hver enkelt maskine. Madhu. Madhu: Jeg havde et spørgsmål om udarbejdelse processen. Så hvis du skriver et program, der bruger et bibliotek ligesom CS50 eller noget gerne, at jeg ved, at biblioteket skal på et tidspunkt være kompileret og sammenkædet i. Men hvor meget af det sker i løbet af udarbejdelse af dit program? Hvilken del af dette bibliotek proces opstår, når du er kompilere dit eget program? JASON HIRSCHHORN: Så lad os gå over generelt de trin i denne proces. Du skriver din. C-fil. I din. C-fil, du # include din header biblioteker, for eksempel, cs50.h. Hvad gør det skarpe omfatte linje gøre for dit program? Akchar. AKCHAR: Det tilføjer prototyper af funktionerne fra header filer i bibliotekerne. JASON HIRSCHHORN: Præcis. Det tilføjer disse funktions prototyper til din kode. Så når din kode bliver kompileret i de tidlige stadier, oversætteren kender at disse funktioner virkelig eksisterer, og at et sted de er blevet defineret. De. H filerne omfatter ikke definitioner for disse funktioner, eller hvordan de rent faktisk arbejder. Cs50.h bare indeholder noget, der siger getString er en reel ting, kan ske. Og standardio.h siger printf er en ægte ting, der kan ske. Så din C-sprog med dette. Header fil bliver forvandlet til nogle maskinlæsbare kode, som til sidst bliver forvandlet til binær kode, 0 s og 1 s. Og det er den kode, der i sidste ende bliver henrettet. -L CS50 line - for eksempel, når du skriver Dunk - og så skal du medtage-l CS50, du skriver det i. Og du kan se, at. Når du skriver at gøre, vil du se, at line op her. Og vi vil se, at i et sekund, når vi kode eller senere, når vi kode. Men der-l CS50 linje gør noget en smule anderledes end # include cs50.h. Hvad betyder det-l CS50 linje gøre? Avi? AVI: Jeg vil gerne sige, at det forbinder biblioteket til funktionen ringe, ligesom. o filer. JASON HIRSCHHORN: Så meget tæt på, hvis ikke spot-on. The-l CS50 tager den binære fil og fusionerer det med din binære fil. Så cs50.h, er der ingen mening i at vende cs50.h fra C-sprog til binær hver eneste gang det bliver brugt. Det ville være dumt, fordi det ville spilde en masse tid. Så det er allerede blevet udarbejdet og forvandlet til en eksekverbar. Og nu er det kommer til at blive lagt sammen med din fil i slutningen. Så de 1 og 0'er går at fusionere med dine dem og 0'er i slutningen. Så nu har du faktisk har den faktiske 1 og 0'er, der definerer, hvordan getString, for eksempel virker, eller hvordan printf, for eksempel virker. Og for mere information, er der en korte compilere, der Nate giver at bør du tjekke, der går gennem disse trin. Men - Ja. STUDENT: Er de altid i o-filer. når de er i biblioteket form klar til at blive lagt sammen, forbundet - ligesom de er i den binære kode? JASON HIRSCHHORN: OK. Hvad - STUDENT: Er det altid tilfældet for bibliotekerne, når du linker dem? JASON HIRSCHHORN: Ja. Så der er. S filer, som vil være maskinkode, hvilket også vil være kryptisk for dig. Du behøver ikke at bekymre sig om dem. Men generelt, ja, de vil være i. o filer klar til at gå. STUDENT: Så når du sender til et bibliotek, behøver du kun sende den. h og. o? Du behøver ikke sende den. C eller den. Sek. JASON HIRSCHHORN: So - og det er i denne korte så godt, hvis denne information synes at komme et lidt hurtigt. Men det korte af compilere taler om det så godt. Når du sender et bibliotek, hvis du sender den. h, header fil, der funktion prototyper og 1 s og 0'er, det er alt hvad du behøver at give. Du behøver ikke at give, hvordan Funktionen virker, den. c-fil. Fordi indvindingsstedet eller pege API'er, det punkt, denne SPL, Stanford bærbare bibliotek, det er for du ikke at bekymre dig om, hvordan nye GRect virker, eller hvordan flytte værker, eller hvordan tilføjer værker. Alt du behøver at vide er, at add er en funktion, som du kan bruge, og det gør dette. Så du virkelig behøver ikke at vide, hvordan det er skrevet i C. Du skal blot vide, her er de funktioner, hvad de gøre, og her er de 1 og 0'er når du virkelig ønsker at bruge dem. Fedt. Har du flere spørgsmål om compilere eller andre emner på bordet? STUDENT: Jeg har et spørgsmål om gennemførelse af rekursive funktioner. Et spørgsmål om rekursion. Jeg havde en fornemmelse af, at ville komme op. Så lad os hurtigt gå igennem rekursion med en specifik eksempel en faktoriel funktion. Da dette er et eksempel, ofte kommer op eller bruges at illustrere rekursion. Så "4!" læses som 4 fakultet. Og hvad betyder 4 factorial betyde? Hvad betyder det så? Hvordan beregner man 4 factorial? 4 gange 3 gange 2 gange 1. Så en anden måde at skrive 4 faktoriel er at skrive dette. 4 gange 3 fakultet. Fordi 3 factorial er 3 gange 2 gange 1. Så 4 gange 3 factorial er 4 gange 3 gange 2 gange 1. Dette er grunden til fakultet er en stor kandidat til rekursion, fordi det er klart, at der er noget, sker igen og igen og igen på en mindre antal ting, indtil du når til slutningen. Når du når 1, 1 fakultet er 1.. Du kan ikke gå meget længere. 0 factorial er også defineret som 1. Så når du kommer til 1 eller 0, er du i slutningen, og du kan begynder at gå op igen. Så hvis vi ønskede at skrive en rekursiv funktion til at beregne en faktorielt, vi kommer til at skrive nogle pseudokode til nu. Før vi skriver, at pseudokode - Jeg vil give jer et par minutter at skrive pseudo-kode eller bare tænke om det - der er to ting hver rekursiv funktion behov. Hvad er de to ting? JACK: Det har at kalde sig selv. JASON HIRSCHHORN: Noah? Åh, Jack. Værsgo. JACK: Det har at kalde sig selv. JASON HIRSCHHORN: Så en rekursiv funktion kræver en rekursivt kald, en kalde til sig selv. Det er en. Og hvad er den anden ting? JACK: En base case. JASON HIRSCHHORN: En base case. En base case er, her er, når vi stopper. Så din funktion bliver kaldt. Basen sag kommer først. Du vil gerne vide, hvis du er i slutningen. Og hvis du ikke er i slutningen, du gøre din rekursivt kald. Og du går gennem denne funktion igen, tjek din base case igen. Hvis du ikke er slutningen, du laver en anden rekursivt kald, et cetera, et cetera. Det er derfor, rekursive funktioner altid brug for disse base-sager og de rekursive kald. Hvis du ikke har et rekursivt kald, det ville ikke være en rekursiv funktion. Hvis du ikke har en base case, ville du gå for evigt og der ville være nogen slutning. Og grundscenariet altid kommer først, fordi du altid vil kontrollere hvis du er i slutningen først. Så før vi gør noget pseudokode, hvorfor tager du ikke et øjeblik til at tænke over hvordan en rekursiv faktoriel funktion ville blive skrevet? Også så mange som du gør, skrivning det ud på et ark papir hvad du nødt til at gøre på quizzen i morgen. Så nok en god ide at gøre sikker på koden du skriver ned på papiret - eller du kan gøre det. Du ved, hvor de semikoloner er. Du husker syntaksen. Fordi du ikke være i stand til at have en compiler fortælle du har lavet en fejl. Også langs disse linjer, i morgen, når du har kodning problemer, hvis du er skyndte til tiden, eller hvis du er meget forvirret, hvordan du skulle skrive bestemt ting i C, det ville behoove dig at skrive pseudo-kode eller skrive kommentarer på så godt. Fordi der er en delvis kredit for en masse af spørgsmålene på quizzen. Så du kan være forhastet, eller du måske bare blive forvirret. Skrivning i kommentarer eller pseudo-kode er ofte måder, du kan få delvis kredit. Så du skal ikke efterlade noget blank på quizzen. Der er ingen sanktioner for lægge ting i. I virkeligheden, i færd med pseudo-kode eller kommentarer vil hjælpe grader regne ud, hvis du rent faktisk ved, hvad du taler om, og måske pris dig nogle delvis kredit for. Også langs disse linjer, skrive klart. Hvis vi kan ikke rigtig, hvad du skriver, Vi kommer ikke til at ringe til dig ved midnat i morgen til figur ud af, hvad du skrev. Vi vil bare tage off point. Skriv tydeligt, så vi kan høre, eller rettere, Vi kan læse, hvad du skrev. Og hvis det siger to sætninger, ikke skrive et afsnit. Følg instruktionerne. Skriv tydeligt. Og skrive i disse bemærkninger eller pseudokode for spørgsmål, der kunne tildele delvis kredit. OK, lad os gå til faktoriel. Så vi har en funktion faktorielt. Hvis jeg skulle faktisk skrive dette i C, hvad skal jeg bruge til at sætte før navnet af funktionen? Returtypen, som i denne tilfælde, vil vi give det int. Og så inde i de krøllede parenteser, er hvad der foregår inde i de krøllede parenteser for en funktion? STUDERENDE: Argument type. JASON HIRSCHHORN: Dens argumenter. Så factorial vil sandsynligvis tage et argument. Det vil formentlig kun tage ét argument. Og vi vil sige det vil tage et heltal kaldet x. Og igen, når du skriver prototypen på en funktion eller skrive den funktion i din kode, før at definere det, du skrive datatype og navnet på denne variabel for kun denne funktion. Så du kan videregive nogle tal ind i denne funktion, vil det blive omtalt som x internt. Vi har vores fakultet funktion. Vi har brug for to ting, en base case og et rekursivt kald. Hvad er grundlaget tilfældet for fakultet? Nogen der skrev det ud, og hvem der ikke har talt endnu, hvad er base tilfældet for factorial? STUDENT: Hvis n er mindre end 2, returnere 1. JASON HIRSCHHORN: Hvis n mindre end 2, returnere 1. Jeg kan godt lide det, fordi det tager sig af 0 og 1. Så vi vil gøre x <2, returnere 1. Hvis vi bliver passeret 0, hvis vi får passeret 1, denne funktion vil straks returnere 1. Hvis vi bliver passeret nogle tal større end eller lig med 2, vi kommer til at har vores rekursivt kald. Og så hvordan er det at gå på arbejde? Kan nogen andre, der har arbejdet på dette der har ikke talt endnu give mig rekursivt kald til denne funktion i pseudokode? Hvis vi bliver passeret i en række x og det er større end 2, hvad ønsker vi at gøre? Vi har også et eksempel skrevet på side, der kan give dig et hint. STUDENT: Call x gange den fakultet af x minus 1? JASON HIRSCHHORN: Præcis højre. Vi vil vende tilbage x gange fakultet af x minus 1. Og det selvom jeg skrev op, dybest set, hvad du sagde på engelsk, dette fakultet funktion vil blive kaldt igen. Det vil udføre på x minus 1. Det vil vende tilbage med nogle tal, og så det vil multiplicere disse to sammen, og denne værdi vil blive vendte tilbage til uanset kaldte dette faktordesign funktion, hvilket kan være en anden instans af denne faktoriel funktion. Så det er et eksempel på en rekursiv funktion, en meget simpel rekursiv funktion. Men de fleste af dem vil være sådan. Hvis du gerne vil have en god rekursiv udfordring for quiz, prøv kodning binær søgning rekursivt. Fordi hvis du gjorde binær søgning efter Problemet sæt tre, har du sandsynligvis gjorde det iterativt i en while-løkke. Men det kan også skrives rekursivt. Du vil få brug for at skrive din egen separat funktion, der tager nogle forskellige kommandolinje-argumenter - eller ikke kommandolinje-argumenter, hvoraf nogle forskellige bare regulære argumenter. Men du kunne skrive binær søgning rekursivt som godt. STUDENT: Så du kunne også have skrevet, i stedet for x minus 1, du kunne også have skrevet x minus minus, eller du kan have skriftlig minus minus x. Kan du lige forklare virkelig hurtigt, hvorfor de ville være forskellige ting, ligesom hvad forskellen er mellem x minus minus og minus minus x? JASON HIRSCHHORN: Nej, jeg er ikke kommer til at gå ind. Men jeg vil tale med dig om det efter klasse. x minus minus, minus minus x formindske x med 1. Men de gør det en smule anderledes. Men jeg ønsker ikke at gå ind i det. Andre spørgsmål om rekursion eller denne funktion? Det er ikke virkelig selv pseudokode. Det er dybest set koden i C Du ville skrive for dette. OK, andre spørgsmål om emner heroppe? Ja. STUDENT: Jeg har en hurtig gennemgang af floating point og præcision. JASON HIRSCHHORN: Flydende punkt og præcision. Kan nogen virkelig hurtigt give mig en gennemgang af floating point og præcision? Du havde alle til at gøre dette til din problem indstillet, så du er alle fortrolig med det. Eller måske ikke alle. Nogen? Giv mig en påbegyndt stedet. Floating point og præcision. Hvad er problemet? Ja. Victoria? VANESSA: Vanessa. JASON HIRSCHHORN: Vanessa. Undskyld. VANESSA: Der er kun et begrænset antal af tal, der kan være repræsenteret fordi du er på en, i vores tilfælde et 32-bit system. Så du slags nødt til at gøre op nogle numre. JASON HIRSCHHORN: Så det er helt rigtigt. Der er kun en vis mængde af numre, som kan være repræsenteret. Hvis du ganger to meget store tal, det kan løbe beløb af rum du har til at repræsentere et heltal. Det er derfor, vi bruger nogle gange en lang lang i stedet for en int. Det har flere rum. Der kan holde et større antal. Floating point præcision har at gøre med det, men også har at gøre med kendsgerning, at decimaltal er ikke altid repræsenteret. Undskyld. Lad mig sige dette op igen. Det decimaltal 1.0 er ikke altid repræsenteret ligesom du ville forvente, 1,000 millioner. Det er undertiden repræsenteret 1,000000001 eller 0,999999999. Det kan være endnu 89 kastes derinde et sted. Så disse decimaltal er ikke repræsenteret præcis som du ville forventer, at være repræsenteret. Så i problem sæt - var det to? - problem indstille to, hvor vi behandlet floating point tal, når vi ønskede dem til at repræsentere præcis hvad vi ønskede til at repræsentere antallet af øre, eller antallet af cents, vi ganger dem med 100. Vi afrundet dem. Og så har vi afskåret alt bag kommaet. Det var for at sikre, at de ville faktisk lige præcis hvad vi ønskede dem til lige. Fordi når du tager noget, der er en flyde og gøre det til en int, du afbrød alt til højre for kommaet. Fordi der er nogle floating point unøjagtighed, 100.000 måske repræsenteret 99,999999999. Og hvis du bare afbrød alt for at højre med det samme, er du nødt til få det forkerte nummer. Ja. STUDENT: Jeg havde et spørgsmål om støbning. Hvilken rækkefølge forekommer det i? Hvis du ville gøre float, beslag, 1 divideret med 10, gør den 1 divideret med 10, derefter få 0,1, drej derefter det i en float? JASON HIRSCHHORN: Hvis du gør flyde 1 divideret med 10 - STUDENT: Ja, og så lig - godt, det normalt ville have det samme i - Ja. Du ønsker at gøre det til en float, right? JASON HIRSCHHORN: OK, så vi kommer til at bruge til at Overgang til at regne ud, svarene på disse spørgsmål ved kodning. Fordi du sandsynligvis har en masse disse minutter spørgsmål, og en god måde at løse dem er gennem kodning. Så vi kommer til at kode dette lige nu, og så vil vi gå tilbage og kode det spørgsmål, du havde. Så den første linje - Jeg skulle ikke have skrevet det - hvad er den første ting, vi ønsker at gøre, når vi åbne en ny fil i gedit? STUDENT: Medtag. JASON HIRSCHHORN: Medtag hvad? STUDENT: CS50 bibliotek. JASON HIRSCHHORN: OK. Hvad skulle man ellers indeholde? Vi vil bare se, hvad der sker når du kaster noget til en float. Men hvad skal vi medtage, hvis vi er kommer til at skrive et C-program? STUDENT: Standard I / O. JASON HIRSCHHORN: stdio.h. Vi har faktisk ikke brug for dette program cs50.h, selv om det er altid nyttigt at medtage det. Men vi har altid brug for stdio.h. STUDENT: Ved kodning i C? JASON HIRSCHHORN: Når kodning i C. Så jeg gemme det som dette. C fil. Jeg får nogle gode syntaksfremhævning. Jeg skrev tomrum indeni main. Hvad betyder ugyldig betyde? STUDENT: Tager ikke nogen kommandolinje-argumenter. JASON Hirschhorn: bortfalder midler, i dette tilfælde har hoved ikke tage nogen kommandolinje-argumenter. I andre tilfælde betyder det, at funktionen tager ikke kommandolinje-argumenter. Eller funktionen, hvis jeg skulle skrive ugyldig main (void), der ville sige Mains ikke vender tilbage noget. Så ugyldig betyder bare ingenting. Hvad ville jeg skrive, hvis jeg skulle tage kommandolinje-argumenter? STUDENT: int bue c streng bue v. JASON HIRSCHHORN: int argc snor argv. Er det rigtigt? STUDENT: Det er char stjerne argv parentes. JASON HIRSCHHORN: Så man kan skrive snor argv bøjler eller char stjerne argv parentes, men du har brug for de kantede parenteser. Fordi argv er et array af strenge, huske. Det er ikke bare en streng. Så snor argv er, her er én streng kaldet argv. String argv parentes er, her er en vifte af strenge. Så int argc snor argv parentes ville være noget, jeg sandsynligvis ville skrive. Så du ønskede at spare i et heltal? STUDENT: Ja, heltal. Eller i en float. JASON HIRSCHHORN: I en float? Ligesom, float x er lig med 1 divideret med 10. JASON HIRSCHHORN: OK. Hvordan kan jeg udskrive en float i printf? Hvad? STUDENT:% f. JASON HIRSCHHORN:% f. Hvad er et heltal? d eller jeg. Hvad er en streng? STUDENT: s. JASON HIRSCHHORN: s. Hvordan får jeg en ny linje? STUDENT: Backslash n.. JASON HIRSCHHORN: Hvad skal jeg vende tilbage hvis hoved kører korrekt? STUDENT: 0. Behøver jeg at skrive denne linje, selv? STUDENT: Nej. OK, vi vil ikke skrive det, da. Kan alle læse det? Det ser en smule mindre. Kan alle se, eller skal Jeg gør det større? Jeg tror for kameraet, vil vi gøre det lidt større, selv om. JASON HIRSCHHORN: Hvis jeg ønsker at vende denne . C fil i en eksekverbar fil, hvad skriver jeg? STUDENT: Foretag test. JASON HIRSCHHORN: Undskyld? STUDENT: Foretag test. JASON HIRSCHHORN: Foretag test. Vi talte om denne linje tidligere. Klang. Hvad er clang? Navnet på compiler. Hvad er denne linje? STUDENT: Indstiller det op for brug af GDB. JASON Hirschhorn: Indstiller det op til brug af GDB. Denne linje, hvad er det? STUDENT: Kildekode. JASON HIRSCHHORN: Det er source fil,. c-fil. Hvad har disse to linjer gøre? Eller disse to ikke linjer. STUDENT: It navne det teste. JASON HIRSCHHORN: Så instrumentbrættet o siger, navngive det noget anderledes. Og her kalder det test. Hvis jeg ikke have det i, hvad ville det kalde denne? STUDENT: a.out. JASON HIRSCHHORN: a.out. Hvad betyder det så? STUDENT: Links math biblioteket. JASON HIRSCHHORN: Den forbinder i matematik biblioteket. Vi inkluderede ikke math biblioteket, men da der er så fælles, at de har skriftlig syge altid omfatte math biblioteket. Og ligeledes, dette inkluderer Den CS50 biblioteket. OK, så hvis vi en liste, har vi nu en eksekverbar kaldet test. For at udføre det, jeg skriver test. Jeg kan se, at min floating point, som forventet, lig 0. Betyder det - så - STUDENT: Så hvis du lægger flyde nu ligesom du kaste den som float - JASON HIRSCHHORN: Slå 1 til en svømmer? STUDENT: Nej, kaste den fulde ting - ja. Hvis du lige gjorde det, ville der gør det 0,1? JASON HIRSCHHORN: OK, så virkelig hurtigt, 1 divideret med 10, der er heltal, der spaltes. Så når du opdele heltal, de er 0, og du gemmer at 0 i en flyde, fordi skråstregen er bare heltal division. Så nu er vi dreje noget i en float. Lad os se hvad der sker. Vi klarer testen. Så nu ser vi, at der slash ikke var integer division, blev det flydende punkt division. Fordi en af ​​sine argumenter var blevet kastet til en float. Så nu er det sagde, behandle denne division, som vi har at gøre med flydende punkter, ikke med tal. Og så får vi det svar, vi forventer. Lad os se hvad der sker - oops. Hvis jeg ønskede at udskrive mere decimal spots, hvordan kunne jeg gøre det? STUDENT: Punkt dot f, eller så mange decimaler, som du ønsker. JASON HIRSCHHORN: Så jeg udskriver 10 decimaler pletter. Og vi ser nu, vi får nogle underlige ting. Og der går tilbage til dit spørgsmål om floating point unøjagtighed. Der er underlige ting gemt i her. OK, betyder det besvare dit spørgsmål? Hvad sagde du ønsker at kode hurtigt? STUDENT: Jeg ville bare se, om ikke, hvis du frigjort nogle pointer, om at markøren stadig var lagret i den adressen på hvad den havde været peger på tidligere. JASON HIRSCHHORN: OK, så lad os gøre det. Char stjerne ptr, dette skaber en variabel kaldet ptr af typen char stjerne. Hvordan skriver jeg malloc? Alden? ALDEN: Just malloc. Men så skal det være størrelse, og i dette tilfælde, tror jeg du ville pege til char. Så det ville være char. JASON HIRSCHHORN: OK, så mere generisk, Inside - lad os redigere. Inde malloc, du ønsker nummeret af bytes på den bunke. Generelt, hvad vi har set, at vi er gør er, at vi kommer til at allokere strenge, for eksempel, eller arrays af heltal. Så hvis vi ønsker 10 heltal eller 10 chars, 10 vil give os 10. Og derefter størrelse tegn ville give os, at størrelsen af ​​tegn, som i dette tilfælde er 1 byte. Vi får 10 bytes. Hvis vi skulle skrive størrelse int, der ville give os 40 byte. Så mere generisk, indersiden af ​​malloc er antallet af bytes, du ønsker. I dette tilfælde, vi får 1 byte. Hvilket virker som en underlig brug af malloc, men for vores formål giver mening. Så der er der. Vi kommer til at ringe gratis. Vi slippe af med det, og vi bruger ptr igen. Og hvad gjorde du ønsker at kontrollere? STUDENT: Jeg ville bare se, om eller der var ikke noget inde i den. JASON HIRSCHHORN: Så uanset om det pegede på noget? STUDENT: Ja, præcis, hvad enten det stadig havde en hukommelse adresse. JASON HIRSCHHORN: Så du vil at kontrollere værdien af ​​ptr? STUDENT: Ja, præcis. JASON HIRSCHHORN: Hvad skriver jeg her hvis jeg ønsker at kontrollere værdien af ​​det punkt - hvad er, Jordan sagt, værdi? Eller hvad der er gemt inde i ptr? STUDENT: En hukommelse adresse. JASON HIRSCHHORN: En hukommelse adresse. Så hvis jeg skriver netop dette, vil det give mig værdien af ​​ptr. Og hvordan kan jeg udskrive en memory-adresse? Hvad er format strengen efter en hukommelse adresse? STUDENT:% p. JASON HIRSCHHORN:% p. % S er en streng. % P for pointer. Er det rigtigt? Det er rigtigt. Så ptr lig - det stadig har noget i det. Dette er sandsynligvis en mere interessant spørgsmål. Hvad betyder denne linje gøre? STUDENT: Seg fejl. JASON HIRSCHHORN: Hvad? STUDENT: Jeg tror det seg fejl. JASON HIRSCHHORN: Hm? STUDENT: Jeg tror, ​​det vil seg fejl. JASON HIRSCHHORN: Så denne linie kode, stjerne PTR, hvad betyder stjernen betyder? STUDENT: Indhold af. JASON HIRSCHHORN: Ja. Gå for at få indholdet af. Så dette kommer til at gå til hukommelsen tage fat der, og give mig det. Jeg brugte% c lige her, fordi der er tegn gemt der. Så vi kommer til at gå til denne adresse vi lige så - eller det vil sandsynligvis være en lidt anderledes denne gang vi køre programmet. Men vi vil gå til denne adresse som vi ved eksisterer stadig og se, hvad der er. Så det ikke seg fejl. Det bare ikke give os noget. Det kunne faktisk har givet os noget, vi kan bare ikke se det. Og der går tilbage til denne idé - og vi kommer ikke til at komme for meget ind dette, fordi det er uden for omfanget af dette kursus. Men vi talte om lige her, hvis vi gik ud over grænserne for den vifte af 1, kan vi ikke komme i problemer. Nogle gange, når du bare gå ud med 1, du laver noget forkert, og du kunne komme i problemer. Men du behøver ikke altid komme i problemer. Det afhænger af, hvor meget af en dårlig ting, du gør, er du nødt til at komme i problemer. Hvilket er ikke til at sige, være sjusket med din kode. Men det vil sige, at programmet ikke vil altid holde op, selv hvis du går et eller andet sted du er ikke meningen at gå. Et godt eksempel på dette er en masse mennesker i deres problem sæt 3, som var 15, ikke kontrollere grænserne for bestyrelsen. Så du kiggede til venstre, så til den højre, så til toppen, så til bunden. Men du ikke kontrollere, om toppen var faktisk kommer til at være på tavlen. Og en masse mennesker, der gjorde det, og vendte det i deres program arbejdede perfekt, fordi hvor det bord var gemt i hukommelsen, hvis du gik en over det eller kontrolleret, at hukommelsen adresse, der var ikke noget især forfærdeligt om det, så dit program ikke var kommer til at råbe på dig. Men vi vil stadig tage off point, hvis du ikke kontrollere det, fordi du gjorde noget du ikke var formodes at gøre, og du kan have fået i problemer. Odds er, selvom du sandsynligvis ikke. Så dette er at vise, at, ja, kan vi stadig gå til det. Og vi får ikke i problemer i denne sag. Hvis vi forsøgte at gøre læse næste 100 tegn, ville vi sandsynligvis komme i problemer. Og du kan kode læse den næste 100 tegn, hvis du ønsker ved at gøre nogle slags for loop. Ja. STUDENT: Da vi blev tildelt, at plads en faktisk værdi, ville vi ikke faktisk være i stand til at se noget. Skal vi prøve det med indstilling, lig gerne c eller noget? JASON HIRSCHHORN: Great spørgsmål. Hvordan indstiller jeg at værdien - hvad linje kode skriver jeg på linje syv til at gøre, hvad du sagde? STUDENT: Stjerne PTR lig single citat c Enden enkelt tilbud. JASON HIRSCHHORN: Så det er at sætte en karakter, c, på det sted, fordi igen, at stjerne betyder gå til der. Og når de bruges på den venstre side af en opgave operatør, der er lig underskrive, vi kommer ikke til at få det værdi, så meget som fastsat denne værdi. Lad os nu se hvad der sker. Vi sætter noget der og det var der. Vi kaldte gratis. Nogle ting sikkert sket på den bunke. Så det er ikke der længere. Men igen, vi ikke får i problemer for at gå der. Jeg gør det ud i kode til at illustrere at en masse af disse spørgsmål, du har, de er virkelig interessant besvarer en masse tid. Og de er rigtig gode spørgsmål. Og du kan regne dem ud på din egen, hvis, for eksempel, vi er ikke i afsnit. Ja. STUDENT: Fordi du ikke sender markøren et tilfældigt sted, har du brug for bruge malloc? JASON HIRSCHHORN: Så det går tilbage til din oprindelige spørgsmål. [? ?] Er det bare en lokal variabel? Malloc her er ikke så overbevisende. Anvendelsen af ​​allokere her ikke der overbevisende, fordi det er bare en lokal variabel. STUDENT: Så kan du gøre char stjerne ptr lig hej? JASON HIRSCHHORN: Oh. Så vi vil nu komme tilbage til din oprindelige spørgsmål. Jeg tror, ​​du ikke var tilfreds med mit svar. OK? Ligesom det? STUDENT: Ja. Vent. JASON HIRSCHHORN: Og hvor ønsker du at udskrive? Så vi vil udskrive en streng som det? STUDENT: Interessant. JASON HIRSCHHORN: Så det siger dette argument har den type af en karakter. Så det bør være et tegn. STUDENT: bare tager den første. JASON HIRSCHHORN: Så dette er, hvad jeg sagde før. Som jeg sagde, det er ikke at opbevare streng inde variabel pointer. Det er opbevaring - STUDENT: Den første værdi af strengen. JASON HIRSCHHORN: Adressen på den første værdi af strengen. Hvis vi skulle udskrive denne, er vi får værdien inde pointer. Og vi vil se det er, ja, en hukommelse adresse. Giver det mening? Undskyld. Vent, betyder det besvare dit Spørgsmålet er dog? STUDENT: Ja. JASON HIRSCHHORN: Denne linje kode er skabe en streng, og derefter en anden variabel pointer, der peger denne streng, at array. Ja. STUDENT: Så hvis vi gik én hukommelse behandle yderligere, ville vi få den h? Er det blevet gemt som en streng? JASON HIRSCHHORN: Ligesom vi gjorde - så det er værdifuldt at gøre. Dette er point aritmetik, som du fyre har set før, og bør være forholdsvis komfortabel med. Det er beslægtet med at skrive - hvis vi skulle til at skrive denne linje kode, vi har set matrix notation før. Dette bør give os den anden værdi i dette array, h. Hvis vi gjorde dette, bør dette også give os den anden værdi i denne matrix. Fordi det kommer ikke til hukommelsen adressen på den første ting, men hukommelse adressen på ting ene over. Og så stjerne operatør dereferences at pointer. Og igen, lad os se. Vi får h igen. STUDENT: Hvad præcist gør dereference betyde? JASON HIRSCHHORN: Dereference er et fancy ord for at gå til. Gå til, og få hvad er der er at dereference en pegepind. Det er bare et smart ord for det. STUDENT: Hvis vi ønskede at udskrive hele strengen, kunne vi gøre ampersand pointer? JASON HIRSCHHORN: OK, vi er kommer til at holde pause her. Vi kommer til at ende her. Ampersand giver dig adressen på en placering, så når du gør tegnet af en variabel, det giver dig adressen hvor denne variabel er gemt. Ampersand pointer vil give dig den adresse ptr hvor PTR er i hukommelsen. Vi kommer ikke til at gå på med dette eksempel. Du kan finde ud af disse ting på egen hånd. Men igen, dette kan endda grænsende en lidt ud over, hvad du behøver at vide for anvendelsesområdet for denne midtvejsevaluering - eller denne quiz, snarere. Undskyld. Vi kommer til at bevæge sig på, fordi jeg ville gerne gøre en kodning problem før tiden er gået. Og vi kommer til at kode, hvad jeg tror er den mest overbevisende af disse eksempler atoi. Så det var et spørgsmål om en quiz to år siden. Og jeg har det på tavlen her. Folk blev bedt om quizzen - de fik lidt mere tesxt i spørgsmålet, men jeg elimineret tekst, fordi det var unødvendigt til vores formål nu. Det var blot nogle baggrundsoplysninger på hvilke atoi gjorde. Men du kender alle og er meget bekendt med atoi. Jeg foreslår du kode dette på et ark papir. Jeg foreslår også at du bruger den strategi at vi har gået over en masse i vores sektion. Først skal du sørge for at forstå hvad atoi laver. Tegn et billede eller komme med nogle mentale billede af det i dit hoved. Dernæst skrive pseudokode for dette. På quiz, hvis alle får du er pseudokode, i det mindste du sætte noget ned. Og så kort, at pseudokode på C. Hvis du har en check i dit pseudokode, ligesom kontrollere, om noget er 1, der kort på en hvis tilstand og så videre. Og endelig, at kode programmet i C. Så gå tilbage til atoi og tage fem minutter at kode dette på et ark papir, der er sandsynligvis om den mængden af ​​tid, du ville tage på en quiz til kode atoi. Fem til 15 minutter, fem til 12, fem til 10 minutter er om mængden af tid, du ville bruge på denne spørgsmål i quizzen. Så tage fem minutter nu, tak. Og hvis du har spørgsmål, hæve din hånd og jeg kommer rundt. [SIDE SAMTALER] JASON HIRSCHHORN: OK, så der var fem minutter. Det var nok om mængden af tid, du ville bruge på at der på en quiz, måske den lave ende af den tid. Vi vil opsummere i en bit. Lad os starte kodning dette. Og hvis vi ikke får hele vejen igennem, svarene på dette og dette quiz spørgsmål er til rådighed igen, Efterår 2011 er, når dette spørgsmål optrådte på quizzen. Og det var værd otte point på quizzen dengang. Otte point er på den høje ende af antal point er noget værd. De fleste spørgsmål er i intervallet med et til seks punkter. Så dette er en mere udfordrende spørgsmål, for sikker. Kan nogen få mig i gang? Generelt hvad skal vi ønsker at gøre med dette fungere atoi, logisk? Hvad ønsker vi at gøre? Så vi kommer til at skrive nogle pseudokode. STUDENT: Konverter tegn i heltal. JASON HIRSCHHORN: Konverter tegn i heltal. OK. Så hvor mange tegn er vi vil få brug for at gå igennem? STUDENT: Alle af dem. STUDENT: Alle tegn i strengen. JASON HIRSCHHORN: Alle tegn i strengen. Så hvis vi ønskede at gå igennem hver karakter i en streng, hvad der er en ting i C, vi har set, som har tilladt os til at gå igennem hver tegn i en streng? STUDERENDE: A for løkke. JASON HIRSCHHORN: A for løkke. Så vi kommer til at sløjfe gennem hvert tegn i sek. Så hvad skal vi ønsker at gøre når vi får en bestemt karakter? Sig vi får passeret en 90. Vi får 9.. Det er et tegn. Hvad ønsker vi at gøre med denne karakter 9? STUDENT: Træk det fra tegn 0? STUDENT: Tilføj 0? JASON HIRSCHHORN: Træk det fra karakter 0? STUDENT: Ja. JASON HIRSCHHORN: Hvorfor du ønsker at gøre det? STUDENT: [uhørligt] værdi. Dens int værdi. JASON HIRSCHHORN: OK, så vi tager den karakter 9, trække det fra karakter 0 for at få en faktiske tal 9. Sød. Og hvordan kan du vide, at tegn 9 minus 0 tegn er 9? Hvad diagram har du se på? STUDENT: Der er logisk ni steder mellem 9 og 0. Eller du kan se på ASCII tabellen. JASON HIRSCHHORN: ASCII tabellen. Men ja, du er korrekte samt. Så vi trækker 0. Så nu har vi heltal 9. Og hvad ønsker vi at gøre med det? Hvis vi har 90, det er den første heltal Vi har, hvad vi ønsker at gøre? STUDENT: Jeg ville sætte i en midlertidig heltal array, så gør matematik til det senere at gøre det til en ende. JASON HIRSCHHORN: OK. STUDENT: Du kan starte i slutningen af array og derefter bevæge sig fremad, så at hver gang du bevæger dig fremad, du ganger det med 10. JASON HIRSCHHORN: OK. Det lyder som en temmelig overbevisende idé. Vi kan starte i slutningen af ​​vores array, og vi kan bruge strleng. Vi kan bruge strleng her. Vi får længden af ​​vores streng. Vi starter i slutningen. Og + det første, vi bare tage det tal, og måske vi skaber som en ny heltalsvariabel op toppen, hvor vi opbevaring af alt. Så vi sløjfe gennem hver char i s fra tilbage til fronten, vi trækker 0, og så tager vi det, og afhængig af hvor det er, vi ganger det ved en effekt på 10. Fordi den første, hvad gør vi formere længst til højre karakter ved? STUDENT: 10 til 0. JASON HIRSCHHORN: 10 til 0. Hvad gør vi ganger det andet længst til højre karakter ved? STUDENT: [uhørligt]. JASON HIRSCHHORN: Hvad? STUDENT: 10 til 1. JASON HIRSCHHORN: 10 til 1. Den tredje længst karakter? STUDENT: 10 til 2. JASON HIRSCHHORN: 10 til 2. STUDENT: Undskyld, jeg ikke forstår hvad vi laver her. JASON HIRSCHHORN: OK, lad os gå tilbage, så. Så vi kommer til at få bestået i en streng. Fordi vi skriver atoi. Så vi får vedtaget i en streng. Sig vi får passeret i strengen 90. Den første ting, vi vil gøre er at sætte en ny heltalsvariabel, at vi er bare kommer til at skabe som vores nye heltal. Det er, hvad vi vil at vende tilbage i slutningen. Vi er nødt til at gå igennem alle tegn i strengen, fordi vi har bestemt at vi er nødt til at røre ved hver enkelt og derefter føje den til vores nye heltal. Men vi kan ikke bare tilføje det som et tal. Vi kan ikke bare tage 9 og add 9 til vores heltal. Det afhænger af hvad sted det er i strengen. Vi får brug for at formere sig det ved en effekt på 10. Fordi det er, hvordan basen 10 værker. Så vi kommer til at få den faktiske karakter eller den faktiske tal nummer, ved at trække karakter 0 fra karakter 9 ligesom vi gjorde med fratrække karakter kapital A fra uanset karakter, vi havde i en af disse problemer. Så vi vil faktisk få et tal fra 0 til 9 gemmes som et reelt tal, og vi vil formere den ved en effekt på 10 afhængigt om, hvor vi er i strengen. Og så vil vi tilføje den tilbage ind i vores nye heltalsvariabel. Så hvad det ville se ud ville være - vi vil trække herovre. Hvis vi bliver passeret i strengen 90 - STUDENT: [uhørligt]. JASON HIRSCHHORN: Men atoi tager en streng. Så vi kommer til at gå igennem bedriften. Vi vil blive passeret i 90. Vi går fra bagsiden til fronten. Vi tager 0. STUDENT: Undskyld. Måske er det dumt. Hvis vi får passeret i en streng, hvorfor er 90, hvad vi at få vedtaget i? Fordi 90 er et heltal. JASON HIRSCHHORN: Fordi atoi tager en snor og forvandler det til heltal repræsentation af denne streng. Men strengen 90 ikke er heltal 90 eller nummer 90. Snoren 90 er en vifte af to eller tre tegn, snarere den 9. karakter, 0 tegn, og backslash 0 tegn. Og vi skriver atoi, fordi for eksempel, når du tager kommandoen line argument, og det er gemt i argv, er det gemt som en streng. Men hvis du ønsker at behandle det som et tal, du nødt til at konvertere den til en faktiske heltal. Som vi gjorde en af ​​vores problem sæt. Som vi gjorde i en række af vores problem sæt. Alle, der tog et heltal som en kommandolinje argument. Så det er derfor vores atoi funktion tager en streng. Så igen, i vores eksempel her, er vi kommer til at tage den sidste. Vi kommer til at trække det tegn 0 fra det, fordi de tegn, 0 trækkes af tegnet 0 giver dig det faktiske antal 0, ifølge ASCII matematik, som vi gør. Fordi tegn repræsenteret anderledes end deres faktiske - den karakter en, for eksempel, små bogstaver a er 97. Det er ikke - Ups! Det er ikke hvad du ville forvente det skal være, 0, for eksempel. Så du er nødt til at trække det karakter en at få 0. Så vi kommer til at gøre det her at få det faktiske antal. Og så skal vi til at formere den ved en effekt på 10 afhængigt af hvor det er i strengen, og derefter tage det og føje det til vores sted indehaver variabel, så vi kan komme op med vores endelige ny heltal. Betyder det giver mening for alle? Så vi kommer ikke til at kode dette lige nu, fordi vi er få på kort tid. Jeg undskylder for timingen af ​​det. Men dette er hvad, forhåbentlig, ville du være i stand til at gøre på quizzen - på det mindste få dette pseudokode skrevet ud. Og så, hvis vi skulle til at skrive pseudokode, faktisk kunne vi gøre dette temmelig hurtigt. Hver linje af kommentarer, vi skrev vi her kan oversættes til omkring en linje C-kode. Erklære en ny variabel, skrivning en løkke, nogle subtraktion, nogle multiplikation, og nogle opgave. Vi vil sikkert også gerne skrive en returledning. Vi kunne også ønsker at sætte nogle kontroller her. Ja. STUDENT: Så vi kan behandle s som faktiske strengen? Fordi jeg ved, det er bare en adresse. Ligesom, hvordan ville du få længden af strengen bliver passeret? JASON HIRSCHHORN: Så hvordan gjorde længden af ​​en streng? StrLen. STUDENT: strlen, ja. Men kan du sætte s som den argument for det? JASON HIRSCHHORN: So strlen tager en char stjerne. Og det følger, at char stjerne, og det holder optælling indtil det bliver til en backslash 0. strlen var faktisk en af ​​de andre programmer, vi skulle kode. Det er en anden god en til kode. At man er en smule lettere, fordi hvis du kommer til at tænke over det konceptuelt - Jeg sagde bare det højt - strlen følger en pegepind og holder går og tælle og holde styr indtil du kommer til en omvendt skråstreg 0. STUDENT: OK, fik det. JASON HIRSCHHORN: So bedste held på quiz 0 morgen. Hvis du har spørgsmål, vil jeg være udenfor efter dette. Du er velkommen til at kontakte mig. Nå ud til din egen TF, hvis du er ikke i min afdeling, eller få min e-mail, hvis du ønsker det. Hvis du ønsker at flipper ud, og bare sende mig en e-mail, en Freakout email, vil jeg sende dig tilbage, ligesom, en smilende ansigt, eller lignende, en vittighed eller noget. Så velkommen til at gøre det så godt. Held og lykke igen, og jeg vil se dig alle næste uge.