JASON Hirschhorn: Velkommen til A5, alle. Vi har en spennende uke foran oss, mest fordi det er så mange nye står overfor i dette rommet. Det er fantastisk. Mange av dere er her ved et uhell, noe som er enda bedre. Så forhåpentligvis vil du holde med oss. Denne uken skal vi bruke hoveddelen av seksjonen forberedelsene til quiz. Så per vår agenda, kommer vi til å snakke litt om ressurser for klassen, men også for quiz, og da, igjen, tilbringer mesteparten av klassen snakker om spørsmål. Når vi er ferdig å svare på spørsmål, eller hvis dine spørsmål naturligvis føre oss til noen koding, jeg har prøve problemer fra tentamen fortid som vi vil kode bor i seksjonen sammen at også få opp noen andre gode emner å dekke. Så først, som vi har gått gjennom for siste par ukene for å minne deg folkens, det er massevis av ressurser tilgjengelig for dette kurset. Mange av dem vil være utrolig nyttig til deg som du fortsetter å studere for quiz 0, fordi det er tirsdag ettermiddag. Så alle dere har vært studere for en bit. Det er forelesningsnotater og kilde kode som du bør definitivt sjekke ut. Se shorts. Sjekk ut study.cs50.net. Og så, er oppført nedenfor, et tall av andre ressurser. Igjen, quiz 0 er i morgen på en. Hvis du ikke allerede har gjort det, sjekk ut Om Quiz 0 dokument på Kursets hjemmeside til å regne ut hvor du tar quizen. Quizen starter kl 01:10 og slutter 70 minutter senere. Så hvis du møter opp etter 01:10, er du kommer til å få så mange færre minutter enn 70 for å ta testen. Så sørg for at du er der i tide. Hvis du er en forlengelse student eller har noen andre test hensyn, det kanskje ikke på en i morgen. Men igjen, sjekk Om Quiz 0 dokumentere å sørge for at du vet når du tar quizen. Jeg skrev 75 minutter opp her. Jeg tror det er riktig, ikke 70 år. Den dekker alt materialet fra en uke 0 til forrige ukes forelesning på onsdag. Og igjen, for denne quiz, per at dokument, får du en tosidig og 8 1/2 av 11 ark som du får å bruke som notater under quizen. Mange, om ikke de fleste, har fant at den mest nyttig måte å studere til prøven er å gjøre en studie ark, en ett-sider, av sine egne. Så se på tidligere seg hvis du har sett tidligere funn. Nå ut til venner for å se hva de legger på deres. Men hendene ned, den beste måten du kan studien er å gå gjennom alt og spikke det ned til hva som bør eller ikke hører hjemme på at ark papir, fordi det er bare en virkelig nyttig måte for deg å sørge for at du går gjennom alt og har noen kjennskap til det. De fleste mennesker, finner vi, selv om de har arket sitter rett ved siden av dem på quiz, ikke snu til det, fordi, igjen, som meget Prosessen med å gå gjennom den informasjonen har hjulpet dem å lære det. Er det noen som har noen spørsmål om quiz 0? Har alle - Jeg har ikke tenkt til å gjøre en håndsopprekning. Bare hyggelig. Jeg hadde tenkt å spørre hvem begynte å studere. Men jeg ønsker ikke å gjøre deg alt ikke heve hendene. Så som jeg sa - ja, Avi, gå videre. AVI: Hva ville være en nyttig ting å sette på en-personsøker? STUDENT: Det er opp til deg. JASON Hirschhorn: Du får å bruke skjønn. Nyttige ting å sette på en-personsøker, Hvis du er forvirret om den store O runtime av ulike typer søk og sorterer, sette det på det i en hendige dandy diagrammet. På den måten, hvis du blir bedt om det på quiz, trenger du ikke å prøve og figur den ut eller grunn gjennom runtime. Du kan bare kopiere det ned. Hvis du ser på spørrekonkurranser tidligere, mye ganger, er det å kjøre tidsspørsmål. Slik det ville være et eksempel på en god ting å sette på en-personsøker. Andre gode ting å sette på, hvis du er forvirret om hvordan å erklære en funksjon eller hva de forskjellige deler av funksjonen erklæringen er, skriver at på det, en generisk versjon og så kanskje et eksempel. Hvis du er forvirret om pekere, et diagram som viser hvordan pekere arbeid er sannsynligvis veldig nyttig. Hvis du er forvirret om rekursjon, en smake rekursiv funksjon på det kan også vise seg å være veldig nyttig. Betyr det gi deg noen ideer? AVI: Du må forstå Hele kompilering prosessen, som hvordan det hele fungerer? JASON Hirschhorn: Alt som har vært dekket kunne møt opp på quiz. Spørsmål - men igjen, vil noen ting være vektet tyngre enn andre. Noen ting har kommet opp igjen og igjen i klassen, i forelesning, og seksjonen. Andre ting har ikke kommer opp så ofte. Vi har snakket mye om # include og -L noe og hva de mener i kompilering prosessen. Vi har snakket mye om GDB, klamre seg, de forskjellige flagg som vi bruker når vi kompilere noe, og hva make15, for eksempel, egentlig betyr og egentlig gjør. Vi har ikke snakke så mye om hvert enkelt trinn i kompilering prosessen. Vi har fremdeles snakket om det. Så det er fortsatt noe som du bør være kjent med. Men igjen, vi kommer ikke til å være - ting som kommer opp oftere i klassen er mer sannsynlig å komme opp mer ofte og er mer tungt vektet på quiz. Cool. Eventuelle andre spørsmål om quiz 0? OK, så jeg satte en liste over emner på tavlen. Jeg gikk gjennom pensum. Jeg gikk gjennom gjennomgangen delen fra i går kveld og de lysbildene å komme opp med en ikke-uttømmende liste over emner at vi har dekket så langt i CS50 og ting som kanskje vises på quiz. Så jeg kommer ikke til å gå gjennom hver eneste en av disse. Det ville ta mye mer tid enn vi har nå. Men jeg satt dette opp her for å forhåpentligvis joggetur hukommelsen som til ting som kan eller kanskje ikke så kjent med deg. Og jeg ville elske å tilbringe mesteparten av seksjonen svarer på dine spørsmål om disse emnene, emner som er ikke dekket her. Vi kan skrive pseudo-kode. Vi kan skrive ekte kode for å sikre at du - Jeg kan svare på spørsmål og hjelpe alle fundamentalt forstå en Mange av disse temaene, slik at du vil føle deg forberedt og behagelig å gå inn quizen i morgen. Så lese over listen. Du forhåpentligvis har kommet til kapittel med noen spørsmål også. Når du er klar, rekk opp hånden og vi vil komme i gang. Husk, de spørsmålene du har, det finnes ingen dumme spørsmål. Vi har hørt at mye. Og de spørsmål du har, er jeg villig å satse, mange andre mennesker både sitter her og ser på online ha også. Så du kan bare hjelpe folk ved å stille spørsmål. Marcus. MARCUS: Mellom bunken og haugen, er det en forhåndstildelt andel av minnet som er definert som Dette er for stabelen eller haugen for? Eller hvordan fungerer det, egentlig? JASON Hirschhorn: Great spørsmål. Jeg kommer til å spore tilbake litt. Har alle - vær ærlig her. Jeg vet at jeg ber deg om å øke hånd foran dine jevnaldrende. Men er det folk som føler seg ukomfortabel med bunken og heap og ønsker å gå over det og hva de mener? Rekk opp hånden hvis - OK. Takk. Så vi kommer til å gå over bunken og haugen veldig raskt, og deretter flytte inn å svare på spørsmålet ditt. Så hvis vi trekker ut en boks til å representere minne på datamaskinen din, hva er noen ting som går i denne boksen? Main. En hovedfunksjon. Hvor går hoved gå? STUDENT: [uhørbart]. JASON Hirschhorn: Så får vi sette viktigste her nede. Hva annet går i denne boksen? STUDENT: Funksjonene som du ringer. JASON Hirschhorn: Funksjonene som vi kaller. Og hvor går de? STUDENT: I ​​bunken. JASON Hirschhorn: De gå i bunken. Så vi kommer til å kalle dette ting her nede i bunken. Og opp toppen, har vi haugen. Så minnet er ikke en boks akkurat som dette. Men det er faktisk ganske lik. Det kommer til å bli en masse bokser i løpet og over, avhengig av hvor stor din Datamaskinen er eller hvor stor din hukommelse er. På quote-unquote "bunnen" er stabelen. Og det er flere ting som går på stakken. Og de som er avhengig av hvilke funksjoner du har i koden din. Du har alltid en funksjon i din kode som kalles hoved, så det er alltid en seksjon her nede i stable viet til hoved. Disse seksjonene i bunken kalles stack rammer. Når du ringer en annen funksjon, sier hoved kaller en binær søkefunksjon, vi satt en annen ramme på stakken. Mer spesifikt skal vi donere en del av minnet på vår datamaskin til å lagre binære søk lokale variabler og kjøre den binære search-koden. Så vi kaller binære søk. I denne del av minnet, vi skal til å lagre sine lokale variabler. Vi kommer til å lagre sine printf samtaler. Uansett hva som skjer, er at funksjonen kommer til å være lagret der. Binære søk kommer til å utføre. Det kommer til å fullføre henrettelsen. Hva er ordet i C som betegner at en funksjon skal fullføre sin utførelse? STUDENT: Return. JASON Hirschhorn: Gå tilbake. Så når du ser en retur uttalelse, funksjons endene når den treffer det. Så binære søk vil treffe sin retur. Denne delen av minnet vil i hovedsak bli frigjort. Og hoved vil gå tilbake til gjennomføring. Så hoved vil ta en pause der var, samtale binære søk, få noen returverdi, og fortsette gjennomføringen. Dette stabelen rammen vil gå bort. Hvis vi kaller en rekursiv funksjon, som er en funksjon som kaller seg selv over og over, kan vi få - sier vi gjorde binære søk rekursivt. Vi kan få binære søk versjon en, binære søk to, binære søk tre, binære søk fire, binære søk fem. Og så denne siste binære søk fem vil treffe bunnen tilfellet, og stabelen rammer vil gå tilbake og holde lukking før vi kommer tilbake til hoved. Vi kan gå over rekursjon i en bit. Men alt dette er å si, hvis du er ringer flere funksjoner samtidig, Det vil være flere stack rammer på bunken. Haugen, på den annen side, opp her, er ikke for funksjoner, ikke for lokale variabler. Det er for dynamisk allokert variabler. Så disse er variabler som kan være initialisert i enten hoved-eller en Funksjon som viktigste samtalene. Hvor som helst i koden din, de kan bli initialisert. Og for å klargjøre en dynamisk tildelt variabel. Hvilken funksjon i C bruker vi? STUDENT: malloc. JASON Hirschhorn: malloc. Du kaller malloc. Du får en plass i minnet. Og den plassen minne er på haugen. Og det minneområdet som forblir der til du ringe gratis. Så dynamisk tildelte variabler i heap vil eksistere så lenge du vil ha dem til å eksistere, og de vil ikke gå bort før du eksplisitt fortelle dem til å gå unna. Du kan lage dem i én funksjon. At funksjonens stabel rammen vil gå bort. Men den variabelen vil fortsatt eksistere i haugen før den er frigjort, potensielt etter den funksjonen som kalles binære søk eller hva. Så de heap variabler bli der så lenge du vil dem til å bo der. Og de får satt her. Og så den neste blir lagt der. De får stadig fylt ut, og de bli der til du ringe gratis. Og egentlig, haugen og stakken, komme til Marcus 'spørsmål, vokser mot hverandre. Og hvis de kjører inn i hverandre, har du brukt opp alt minnet i din datamaskin, og programmet vil slutte fordi du ikke har noe mer minne igjen å bruke. Mellom dem er det potensielt andre ting. Men for omfanget av dette kurset, du trenger ikke å bekymre deg for det. Så det var svaret på spørsmålet ditt. Ikke noe å bekymre seg for. Men det var den lange svaret. Alt du trenger å vite er heap og stakk vil - en som begynner nederst. Stabelen gjør. Haugen er der oppe. De vil komme nærmere hverandre. Og hvis de berører, det er et problem. Du gikk tom for minne. Men også, i tillegg til å vite hvor de er, hvilke er lagret i både stable og heap. Curtis. CURTIS: Når de kolliderer, er at en stack overflow? JASON Hirschhorn: Når de kolliderer, det er ikke en stack overflow. En stack overflow er et annet område at vi kan gå over hvis du vil. OK, vil vi komme tilbake til det i litt. STUDENT: Hva er ordet som heter når de treffer hverandre, stable og haugen? JASON Hirschhorn: For nå, ikke bry deg om. Bare vet - Jeg vil svare på det spørsmålet etter klasse. Hvis de kjører inn i hverandre, du kjørte ut minne, fordi det er ikke mer plass der. STUDENT: Beklager, det er et segment feil? JASON Hirschhorn: Et segment feil kan kalles for - det avhenger hvorfor SEG skyld heter. Noen ganger din stack overflow, det vil sier SEG feil som feil. STUDENT: Hva om dereferencing en null variabel? Er det et segment feil? JASON Hirschhorn: dereferencing en nullpeker - OK, så hvis du har en peker som du settes lik null, pekere, husker, butikken minneadresser som sine verdier. Og en nullpeker er i hovedsak lagring 0, 0-th adressere i den variabelen. Så 0x, 0, 0, 0, 0, et cetera. At 0-th adresse i minnet som ikke i vår bilde, det er der oppe et sted, er det reservert for datamaskinen. Vi har ikke lov til å røre den. Så når programmet er å gjennomføre, hvis det er noe som prøver å gå til minne adresse 0, vet det at som er en tom verdi. Det vet ingenting skulle være der. Så hvis du prøver og bruke noe der og behandle noe sånt der eller prøver å gå til denne plasseringen, er du kommer til å få et segment feil eller en feil. Besvarer det spørsmålet ditt? Og nå skal vi gå tilbake å stable overløp. Ting i bunken, som dere har sett før, i - la oss trekke en nær opp av en stabel ramme. Alle kan se det? Så vi har vår stack ramme. Vi sparer en matrise på som en lokal variable i denne funksjonen. Så si vår matrise har fem plasser. Alle fem av disse vil bli lagret ved at stabel rammen. Hvis vi begynner å skrive utover grensene for denne matrisen - så hvis vi begynner å skrive inn, la oss si det er 0. De er de fem indekser av vår array. Hvis vi begynner å skrive inn indeks 5, som vi har ikke når vi har en matrise av størrelse 5, begynner vi å skrive inn Indeks 6, 7, 8, 9, vi kan få en Stack Flytsfeil. Vanligvis er det ikke - du vil sannsynligvis komme i trøbbel hvis du går over med én. Men generelt, vil du komme inn i mest problemer hvis du går over av mye og du går så langt over det du skriver over returadresse på at funksjon, som ligger på nederst i stabelen rammen. Fordi, ikke sant? Du - i - beklager. Ikke "fordi akkurat." I bunken ramme, har du lokale variabler. Helt nederst i stabelen rammen er returadressen. Det er der funksjonen går når det er over. Og hvis du overskriver at avkastningen adresse, så når denne bunken ramme, når du går gjennom bunken ramme og gjennomføring av hver linje, er du kommer til å gå til den nye returadresse som er skrevet der i stedet for Selve ett. Og det er slik vi har sett noen sikkerhetsbrudd kan skje med datamaskiner. Så stack overflow, kort sagt, er når du overskrive den delen i bunken du skal bruke, den lokale variabel du skal bruke, og spesielt når du begynner å overskrive viktige ting som returadresse. Og det er der du får en feilmelding. Eller kanskje du kan starte selv skrive inn - si binære søk var rett ovenfor hoved. Hvis du overskrev mye, du kunne skrive inn hoved. Men generelt, får du en feilmelding før da, fordi maskinen vet du gjør noe du ikke bør gjøre. Yeah. STUDENT: Hva er forskjellen mellom en stack overflow og en buffer overflow? JASON Hirschhorn: Buffer overflow er en mer generell type hva jeg nettopp har beskrevet. STUDENT: Så en stack overflow er en eksempel på et buffer overflow. JASON Hirschhorn: Nettopp. Dette er en matrise vi kan tenke på som en buffer, en plass for ting å gå i. Dette er en stack buffer overflow. Vi kunne ha en heap-bufferover. Hvis det var en buffer, hvor det ofte er en matrise haugen, og vi overskrev disse grensene, så vi ville har en heap-bufferover. Og utenfor rammen av dette kurset, de er oppdaget et litt annerledes. Kompilatoren har spesiell måter å oppdage hver. Men en buffer overflow er en mer generell type det jeg beskrev, som var en stack buffer overflow. Visste at spørsmålet ditt? Søt. Var det noen andre spørsmål relatert til stabelen eller haugen? Yeah. STUDENT: Jeg vet at du har til gratis strenger fordi de er i haugen og du ikke ønsker å lekke minne. Men har du å frigjøre globale variabler og sånt? Eller blir de automatisk frigjort? JASON Hirschhorn: Godt spørsmål. Så i CS50.H, oppretter vi denne tingen for du ringte en streng. En streng er egentlig hva? STUDENT: Char stjerne. JASON Hirschhorn: En røye stjerne, en peker av et tegn, en peker til en rekke tegn. Det er det strengen er. Så vi trenger å frigjøre det, fordi getstring, som vi brukte mye - string navn tilsvarer getstring - som mallocs for oss noe minne på heap og returnerer en peker til første tegnet på at string, en røye stjerne. Så tilsynelatende, hvis du ikke har vært skrive gratis på noen av dine strenger at du har kalt så langt, har du vært lekker noe minne. Selvfølgelig har vi ikke snakket om det, så ingen har fått i problemer for å gjøre det. Men fremover, ja. Når du ringer getstring, er du mallocing litt plass på haugen. Og hvis du ikke kaller fri senere på at string, har du en minnelekkasje. Som svar på spørsmålet ditt? Yeah STUDENT: Så for å gjøre det, bruker vi fri rett før retur? Som, innenfor rammen av, tror jeg hvis vi sier, liker, int main, innenfor Omfanget av den kode som er innenfor disse klammeparentes, rett før - du vet hvor du vil vanligvis satt avkastning. Har du satt fri før det? JASON Hirschhorn: Så du kan sette fri uansett hvor du ønsker å sette fri. Fordi disse er dynamisk allokert variabler, fordi de kan bor utenfor rammen av en bestemt funksjon, hvis du kaller malloc i en separat funksjon, f.eks getstring, kan du ringe gratis på hoved. Du trenger ikke å kalle det i den spesifikke funksjon hvor malloc kalles. Men du trenger ikke å kalle det før hoved avkastning. Og det virkelig an. Det kommer an på hvorfor du malloced at plass i første omgang. Noen mennesker vil kalle fri ganske raskt. Noen mennesker vil ikke kalle gratis inntil slutten av sitt program. Og de vil gå gjennom og gratis alt. Det kommer an på hvorfor du ringte malloc. STUDENT: Og hva ville du si hvis du ringte bruk getstring? Du ville si fritt hva? JASON Hirschhorn: Så syntaksen for gratis er rett og slett fri, åpen paren, nær paren, og navnet på pekeren. Så hvis du skriver String navn equals getstring, sette deg navn her inne. Det er navnet på pekeren. Og den vet å frigjøre dette minnet. STUDENT: Så når det frigjør at minnet, pekeren fremdeles forholder seg til det stedet i minnet? Eller er pekeren også tømt for adressen som den peker på. JASON Hirschhorn: Vi bør prøve det. Vi bør kode som. La oss komme tilbake når vi kommer til koding, og la oss koden som. Og hvis du ønsker å finne ut svaret til det, kan du også kode som i mellomtiden. Men det er et stort spørsmål. STUDENT: Er det mulig å gratis noe for tidlig? Slik at du fortsatt trenger det for programmet, og du frigjort som minne? JASON Hirschhorn: Ja. Det er mulig, hvis du fri noe og så bruker du den på nytt, vil du kjøre inn en feil. Men det er på deg, fordi du frigjort noe, og så kalte det senere. Så det var en programmerer feil. Men ja. Du kan skrive det. Eventuelle flere spørsmål om - Ja. STUDENT: Så hvis du skal bare frigjøre det generelt før Programmet avsluttes, betyr det at dersom program slutter og du ikke frigjøre det, at minnet er fortsatt tildelt? JASON Hirschhorn: Hvis programmet slutter og du glemmer å frigjøre noe, så at minnet ble tildelt hele levetiden på programmet. Når programmet lukkes helt, at minnet ikke kommer å bo der for alltid. Datamaskinen er smart nok til å vite at når programmet lukkes, det bør kvitte seg med alt av minnet som er forbundet med det programmet. Men, det er verktøy du kan kjøre på et program for å finne ut om, når programmet er ferdig, du glemte å frigjøre minne. Og for din neste problemet satt der du skal bruke malloc og hjelp pekere, vil du kjøre dette programmere på programmet for å se om, når hoved avkastning, hadde du noen ting som var igjen unfreed. Så de ikke skal bo malloced alltid i datamaskinen. Det ville være bortkastet, fordi svært raskt, datamaskiner ville gå tom for minne. Men hvis de løper frem til utgangen av programmere og de er ikke frigjort og din Programmet kommer ut, det er fortsatt et problem at dette verktøyet vil hjelpe deg med å håndtere. STUDENT: Er det Valgrind? JASON Hirschhorn: Det er heter Valgrind. Og du vil være - STUDENT: Men vi trenger ikke å vite at for quiz, skjønt? Jeg mener, det ble snakket om en liten bit i forelesningen. JASON Hirschhorn: Så Valgrind er navnet på verktøyet. Å vite hva den gjør er nok for quiz. Men du har ikke brukt det ennå på din Problemet satt fordi vi ikke har hatt en Oppgavesettet som uttrykkelig har behandlet med malloc eller du bruker malloc. Så du ikke har brukt Valgrind ennå. Men du vil bruke det før heller enn senere. STUDENT: Kan du gjenta hva Valgrind er? JASON Hirschhorn: Sorry? STUDENT: Kan du gjenta det hensikten med Valgring er? JASON Hirschhorn: Valgrind er navnet - som GDB hjelper deg feilsøke programmet, Valgrind hjelper deg å finne ut om ting har ikke blitt frigjort når programmet lukkes. Så du vil kjøre det på programmet. Og programmet kommer ut, og det vil si programmet heter malloc dette mange ganger for dette mange bytes, og du bare kalt frie dette mange ganger. Og så du igjen disse mange bytes uten å bli frigjort. Eller det vil si at du har frigjort alt. God jobb. STUDENT: OK. Og det heter Valgring? JASON Hirschhorn: V-A-L-G-R-I-N-D. STUDENT: Et spørsmål om pekere. Så sier du har n stjerne x er lik noe. Som er lik, uansett hva du setter der, er at det som blir satt inni hva x peker til, eller markøren på x? JASON Hirschhorn: Kan du gjenta spørsmålet? Kan vi trekke den mens du sier det? STUDENT: I ​​quizen, faktisk, den en du sendte oss, det var som, røye stjerners sannhet lik CS50 steiner, ikke sant? Så betyr det at at CS50 bergarter er hva sannheten peker på? JASON Hirschhorn: Så du snakker om en char stjerne i en streng, hvordan som fungerer? Yeah. OK. La oss trekke dette over her. [SIDE SAMTALE] JASON Hirschhorn: Så denne variabelen kommer til å være av typen char stjerne. Hvor stor er en variabel av typen char stjerne? Hvor mange bytes? STUDENTER: Fire. JASON Hirschhorn: Det er fire byte. Hvor mange rettigheter er en variabel av type int stjerne? STUDENTER: Fire. JASON Hirschhorn: Fire bytes. Hvis det er en peker, så er det alltid fire bytes, fordi pekere, deres Verdien er et minneadresse. Og minneadresser på CS50 Apparatet er fire byte. Så når vi kaller getstring, eller når vi si, lik streng, og deretter i anførselstegn sette en streng, vi setter - vel, det er litt annerledes. Vi vil gjøre getstring som eksempel. Eller røye stjerners noe lik strengen. Beklager, gi meg et eksempel at du leser? STUDENT: char stjerne sannhet lik "CS50 rocks" i anførselstegn. JASON Hirschhorn: Så denne stjernen, dette vi vil kalle denne variabelen x for vår generiske formål. Vi har opprettet en variabel kalt x. Det er typen char stjerne. Det er en peker til en serie tegn. Så her nede - Så dette er hvordan dette ville arbeide i minnet. Dette ville lagre en minneadresse. Det ville lagre minne adresse det første tegnet i rekken. Og så når du har fulgt pekeren, ville du få den første tegnet. Og hvis du leser dette ting som en streng, er datamaskinen din smart nok til å vite, lese hele greia før det blir til et tilbakeslag 0. Men hvis du leser det et tegn på en tid, slik at du gjentar gjennom denne strengen, så vil du bare lese en tegn om gangen til du kommer til backslash 0. Som kanskje ikke svare på spørsmålet, skjønt. STUDENT: Ja, men du har ikke malloced at plassen ennå for at pekeren. JASON Hirschhorn: Så jeg er ikke helt sikker nøyaktig hva du ser på, fordi jeg ikke gjorde det quiz. Det var ment å være et nyttig ressurs fra en annen TF. Hvis du oppretter en streng på stable eller som en lokal variabel, det vil bare være rekke kostnader snarere enn generelt en char stjerne peker til en annen streng. Men jeg vet ikke. Det kan være en peker til en annen streng på stabelen i tillegg. Yeah. STUDENT: Jeg vet at du trenger å allokere minne hvis pekeren er bli erklært inne av en annen funksjon. Har du behov for å gjøre det samme hvis det er blir erklært innsiden av hoved, du bruker den inne i main? JASON Hirschhorn: Så ja. Du kan erklære en peker til en hvilken som helst minneadresse i hukommelsen. Det kan være minneadressen til en lokal variabel, men ofte, folk ikke erklære minneadresser til lokale variabler fordi de går bort en gang at funksjonen returnerer, som er grunnen til at vi generelt malloc ting. Men ja, kan du erklære en peker til en annen lokal variabel. Det er bare generelt ikke gjort. Men jeg kan ta en titt på det spesifikke ting etter klassen. Yeah. STUDENT: Jeg tror dette er liksom av hva som blir spurt. Det virker rart å bli initialisering en peker ikke som en adresse, men som hva virker som en verdi. Det virker som den CS50 er hva som er inni tingen å peke til og ikke den faktiske adressen, ikke sant? JASON Hirschhorn: Så det er ikke er tilfelle, selv om. Det er ikke hva som skjer. Når du erklærer en char stjerne, det er en minneadresse. Pekere er alle minneadresser peke på noe annet. At noe annet kunne være på stabel, men nesten alltid er på heap i måten vi vil se den brukt. Men streng tilsvarer anførsels "Getstring," vi kan se det og vi kan se gjennom den og kode som. getstring strengen ikke blir lagret i den variabelen, eller hva strengen Navnet er ikke blir lagret i det variabel, ikke fordi det er hvordan pekere fungerer. Betyr det fornuftig? STUDENT: Ja. JASON Hirschhorn: OK. Forhåpentligvis, det var ikke forvirrende for noen. Men hvis det var, kan vi se på det igjen i en bit, fordi vi faktisk kommer å kode noe som vil forhåpentligvis jobbe med strykere og hjelpe deg til å føle mer komfortabel med dem. Eventuelle andre spørsmål knyttet til disse emner eller andre emner som Jeg skal sette opp igjen? Og - akkurat nå. Ja, Alden. ALDEN: Så dette er fullstendig irrelevant, men kan vi bare gå over veldig raskt hva vi trenger å vite om forskjellen mellom en 32 og 64-bits maskin? JASON Hirschhorn: Ja. Så 32 bits er hvor mange byte? ALDEN: Det er fire byte. JASON Hirschhorn: Det er fire byte. Og 64 bits er hvor mange byte? STUDENT: Åtte. JASON Hirschhorn: Åtte bytes. Så igjen, er åtte bits én byte. Din CS50 apparatet er en 32-bits maskin. Så minneadresser er fire byte. Det er 2 til 32 minneadresser. 0-2 som 32 minus en. Og jeg er ikke positivt, men det er trolig omfanget av hva du trenger for å vet for en 32-bits maskin, som minne adresser er, igjen, fire bytes lang, og det er det høyeste beløpet av minneadresser. Også datatyper - dette kan være noe som vel det er verdt å merke seg. Størrelsen av en datatype avhenger maskinen du arbeider med. Så en røye, en enkelt karakter, er hvordan mange byte på vår CS50 apparatet? En byte. Og det er faktisk en byte som vel på en 64-bits maskin. Og de fleste datatyper er det samme antall byte på begge maskinene. Men noen datatyper vil være annerledes på begge maskinene. Slik det ville være potensielt eneste du trenger å vite. Men selv det, tror jeg, er utenfor grensene - Jeg er nesten positivt, hvis du ser tilbake på gamle spørrekonkurranser, det sier, påta koding problemene du bruker en 32-bits maskin. Men det er, å gå sammen med at det i Hvis du er interessert, er det datatyper som er de samme størrelse på alle maskiner. Hvis du har sett noe lignende uint32_t, kan du eller kan ikke har sett det. Det er en datatype. Det er å si, være 32 bits uansett hvilken maskin dette er på. Så når folk skriver bærbar kode, de sannsynligvis ikke vil bruke ints. De vil i stedet bruke disse andre data typer som de vet vil være den samme størrelsen på hver enkelt maskin. Madhu. Madhu: Jeg hadde et spørsmål om kompilering prosessen. Så hvis du skriver et program som bruker et bibliotek som CS50 eller noe sånn, jeg vet at det biblioteket må, på et tidspunkt, være kompilert og linket i. Men hvor mye av det som skjer under utarbeidelsen av programmet? Hvilken del av det biblioteket prosess oppstår når du er kompilere ditt eget program? JASON Hirschhorn: Så la oss gå over generelt trinnene med denne prosessen. Du skriv din. C-fil. I ditt. C-fil, du # include din topp-biblioteker, for eksempel, cs50.h. Hva gjør det skarpt inkluderer linjen gjøre til programmet? Akchar. AKCHAR: Den legger prototyper av funksjonene fra header filer i bibliotekene. JASON Hirschhorn: Nettopp. Det legger disse funksjons prototyper til koden din. Så når koden blir kompilert i de tidlige stadier, kompilatoren vet at disse funksjonene virkelig eksisterer, og at et sted de har blitt definert. De. H-filer inkluderer ikke definisjoner for disse funksjonene eller hvordan de faktisk fungerer. Cs50.h omfatter bare noe som sier getstring er en real thing at kan skje. Og standardio.h sier printf er en ekte ting som kan skje. Så din c språk med dette. Header filen blir slått inn i noen maskinlesbar kode, som til slutt blir omgjort til binære kode, 0 og 1-ere. Og det er koden som til slutt blir henrettet. The-l CS50 linjen - for eksempel når du skriver Clang - og deretter du inkludere-l CS50, du skriver at i. Og du ser det. Når du skriver gjør, vil du se at linjen opp her. Og vi vil se det i et sekund når vi kode eller senere når vi kode. Men at-l CS50 linjen gjør noe litt annerledes enn # include cs50.h. Hva betyr det-l CS50 linjen gjøre? Avi? AVI: Jeg vil si at det knytter biblioteket til funksjonen ringe, som de. o-filer. JASON Hirschhorn: Så veldig tett, hvis ikke spot-on. The-l CS50 tar binærfilen og fusjonerer det med din binærfil. Så cs50.h, det er ingen vits i å snu cs50.h fra C-språk til binære hver eneste gang det blir brukt. Det ville være dumt, fordi det ville kaste bort en masse tid. Så det har allerede blitt utarbeidet og omgjort til en kjørbar. Og nå er det kommer til å bli slått sammen med din fil på slutten. Så de en-tallet og 0-er kommer å fusjonere med de og 0 er på slutten. Så nå vil du faktisk ha den faktiske 1-ere og 0-er som definerer hvordan getstring, for eksempel, fungerer, eller hvordan printf, for eksempel, fungerer. Og for mer informasjon, det er en korte kompilatorer som Nate gir at du bør sjekke ut som går gjennom disse trinnene. Men - Ja. STUDENT: Er de alltid i o-filer. når de er i biblioteket skjemaet, klar til å bli slått sammen, knyttet - som de er i binærkode? JASON Hirschhorn: OK. Hva - STUDENT: Er det alltid tilfelle for bibliotekene når du kobler dem? JASON Hirschhorn: Ja. Så det er. S filer, som vil være maskinkode, som også vil være kryptisk for deg. Du trenger ikke å bekymre deg om dem. Men generelt, ja, vil de være i. o-filer klar til å gå. STUDENT: Så når du leverer til bibliotek, trenger du bare sende den. h og. o? Du trenger ikke sende. C eller. S. JASON Hirschhorn: So - og det er i denne korte også, hvis denne informasjon ser ut til å være kommer en litt raskt. Men kort på kompilatorer snakker om dette også. Når du sender et bibliotek, hvis du sender den. h, topptekstfilen, de funksjonen prototyper, og ett-tallet og 0-tallet, det er alt du trenger å gi. Du trenger ikke å gi hvordan funksjonen fungerer, det. c-fil. Fordi poenget med abstraksjon, eller peke APIer, poenget på dette SPL, Stanford portable bibliotek, er det for deg å ikke bry deg om hvordan nye GRect fungerer, eller hvordan flytte verk, eller hvordan legge fungerer. Alt du trenger å vite er at add er en funksjon som du kan bruke, og det gjør dette. Så du egentlig ikke trenger å vite hvordan det er skrevet i C. Du trenger bare å vet, her er funksjonene, hva de gjøre, og her er de ett og 0 er når du virkelig ønsker å bruke dem. Cool. Eventuelle flere spørsmål om kompilatorer eller andre emner på brettet? STUDENT: Jeg har et spørsmål om implementere rekursive funksjoner. Et spørsmål om rekursjon. Jeg hadde en følelse av at ville komme opp. Så la oss gå raskt gjennom rekursjon med en spesifikk eksempel en faktoriell funksjon. Fordi dette er et eksempel på at ofte kommer opp eller brukes å illustrere rekursjon. Så "fire!" leses som fire fakultet. Og hva betyr fire fakultet mener? Hva gjør det? Hvordan kan du beregne fire fakultet? 4 ganger 3 ganger 2 ganger 1. Så en annen måte å skrive fire fakultet er å skrive dette. 4 ganger tre fakultet. Fordi tre fakultet er 3 ganger 2 ganger 1. Så fire ganger tre fakultet er 4 ganger 3 ganger 2 ganger 1. Dette er grunnen til at fakultet er en stor kandidat for rekursjon, fordi det er klart at det ikke er noe skjer om og om igjen og om igjen på en mindre antall av ting før du kommer til enden. Når du kommer til en, er en faktoriell en. Du kan ikke gå mye lenger. 0 fakultet er også definert som en. Så når du kommer til en eller 0, er du på slutten, og du kan begynne å gå opp igjen. Så hvis vi ønsket å skrive en rekursiv funksjonen til å beregne et fakultet, vi kommer til å skrive noen pseudo for det nå. Før vi skriver at pseudo - Jeg skal gi dere et par minutter å skrive pseudo-kode eller bare tenke om det - det er to ting hver rekursiv funksjon behov. Hva er de to tingene? JACK: Det har å kalle seg. JASON Hirschhorn: Noah? Oh, Jack. Gå fremover. JACK: Det har å kalle seg. JASON Hirschhorn: Så en rekursiv Funksjonen trenger en rekursiv samtale, en kaller til seg selv. Det er ett. Og hva er den andre tingen? JACK: En base case. JASON Hirschhorn: En base case. En base case er, her er når vi stopper. Så din funksjon blir kalt. Basen saken kommer først. Du ønsker å vite om du er på slutten. Og hvis du ikke er på slutten, du lage din rekursive kall. Og du går gjennom denne funksjonen igjen, Sjekk din base case igjen. Hvis du ikke er slutten, gjør du annen rekursive kall, et cetera, et cetera. Det er derfor rekursive funksjoner alltid trenger disse basis saker og de rekursive samtaler. Hvis du ikke har en rekursive kall, det ikke ville være en rekursiv funksjon. Hvis du ikke har en base case, du vil gå evig og det ville være noen slutt. Og base case alltid kommer først, fordi du vil alltid lurt å sjekke hvis du er på slutten først. Så før vi gjør noen pseudo, hvorfor trenger du ikke ta et minutt å tenke på hvordan en rekursiv faktoriell funksjon ville være skrevet? Også, så mange som du gjør, skriving det ut på et ark er hva du skal ha til gjøre på quiz i morgen. Så sannsynligvis god praksis å gjøre at koden du skriver ned på papirark - eller du kan gjøre det. Du vet hvor semikolon er. Du husker syntaksen. Fordi du ikke være i stand til å ha en kompilatoren fortelle du har gjort en feil. Også langs disse linjene, i morgen, når du har koding problemer, hvis du er rushed for tiden, eller hvis du er veldig forvirret med hensyn til hvordan du skal skrive det bestemt ting i c, det ville behoove du å skrive pseudo-kode eller skrive kommentarer i tillegg. Fordi det er delvis kreditt for en Mange av spørsmålene på quizen. Så du kan være på vei, eller du kan bare bli forvirret. Skriving i kommentarer eller pseudo-kode er ofte måter som du kan få delvis kreditt. Så ikke la noe blank på quiz. Det er ingen straff for å sette ting i. Faktisk kan sette i pseudo-kode eller kommentarer kommer til å hjelpe de grader finne ut om du faktisk vet hva du snakker om, og kanskje pris du noen delvis æren for det. Også langs disse linjene, skriv tydelig. Hvis vi kan egentlig ikke hva du skriver, vi kommer ikke til å ringe deg ved midnatt i morgen til figur ut hva du skrev. Vi kommer bare til å ta av poeng. Skriv tydelig, slik at vi kan høre, eller rettere sagt, vi kan lese hva du skrev. Og hvis det står to setninger, ikke skriv et avsnitt. Følg instruksjonene. Skriv tydelig. Og skrive inn disse kommentarene eller pseudo for spørsmål som kunne award delvis kreditt. OK, la oss gå til faktoriell. Så vi har en funksjon fakultet. Hvis jeg skulle egentlig skrive dette i C, hva trenger jeg for å sette før navnet av funksjonen? Den returtype, som i denne tilfelle, vil vi gi det int. Og så inne i klammeparentes, er hva som foregår inne i klammeparentes for en funksjon? STUDENTER: Argument type. JASON Hirschhorn: Dens argumenter. Så fakultet vil trolig ta et argument. Det vil trolig bare ta ett argument. Og vi vil si at det vil ta et heltall kalt x. Og igjen, når du skriver prototypen av en funksjon av eller skriving til funksjonen i koden din før du definerer det, du skrive datatype og navnet den variabelen for at funksjonen bare. Så du kan passere noen tall inn i dette funksjon, vil det bli referert til som x internt. Vi har vår faktoriell funksjon. Vi trenger to ting, en base case og en rekursive kall. Hva er base case for fakultet? Noen som skrev det ut og hvem har ikke snakkes ennå, hva er base case for fakultet? STUDENT: Hvis n er mindre enn 2, returnerer en. JASON Hirschhorn: Hvis n er mindre enn 2, returnere en. Jeg liker det, fordi det tar vare på 0 og 1. Så vi vil gjøre x <2, returnerer en. Hvis vi får gått 0, hvis vi får passert en, vil denne funksjonen umiddelbart returnere en. Hvis vi får gått noen nummer større enn eller lik 2, skal vi har vår rekursive kall. Og så hvordan er det å gå på jobb? Kan noen andre som jobbet på dette hvem har ikke snakket ennå gi meg rekursive kall for denne funksjonen i pseudokode? Hvis vi får gått på en rekke x og det er større enn 2, hvilken ønsker vi å gjøre? Vi har også et eksempel skrevet i side som kan gi deg et hint. STUDENT: Ring x ganger fakultetet av x minus 1? JASON Hirschhorn: Helt riktig. Vi kommer til å returnere x ganger fakultetet av x minus en. Og det, selv om jeg skrev opp, utgangspunktet, hva du sa på engelsk, dette faktoriell funksjon vil bli kalt igjen. Det vil kjøre på x minus en. Det vil komme tilbake med noen heltall, og så det vil multiplisere disse to sammen, og denne verdien vil bli returneres til hva heter denne faktoriell funksjon, som kan være en annen forekomst av dette faktoriell funksjon. Så er det et eksempel på en rekursiv funksjon, en meget enkel rekursiv funksjon. Men de fleste av dem vil være som dette. Hvis du ønsker en god rekursiv utfordre for quiz, prøv koding binære søk rekursivt. Fordi hvis du gjorde binære søk etter Problemet satt tre, har du sannsynligvis gjorde det iterativt i en while-loop. Men det kan også skrives rekursivt. Du kommer til å trenge å skrive din egen egen funksjon som tar litt ulike kommandolinje-argumenter - eller ikke kommandolinje-argumenter, noen forskjellige bare vanlige argumenter. Men du kunne skrive binære søk rekursivt også. STUDENT: Så du kunne også skrevet, i stedet for x minus en, du kunne også skrevet x minus minus, eller du kan ha skrevet minus minus x. Kan du bare forklare veldig raskt hvorfor de ville være forskjellige ting, som hva forskjellen er mellom x minus minus og minus minus x? JASON Hirschhorn: Nei, jeg er ikke kommer til å gå inn på det. Men jeg vil snakke med deg om det etter klasse. x minus minus, minus minus x decrement x etter en. Men de gjør det litt annerledes. Men jeg ønsker ikke å gå inn på det. Andre spørsmål om rekursjon eller denne funksjonen? Det er egentlig ikke engang pseudo. Det er i utgangspunktet koden i C du ville skrive for dette. OK, noen andre spørsmål om emner her oppe? Yeah. STUDENT: Jeg har en rask oversikt over flyttall og presisjon. JASON Hirschhorn: Flytende punkt og presisjon. Kan noen virkelig raskt gi meg en oversikt over flyttall og presisjon? Dere måtte gjøre dette for din oppgavesettet, slik at du er alt kjent med den. Eller kanskje ikke alle av dere. Anyone? Gi meg en gang spot. Flyttall og presisjon. Hva er problemet? Ja. Victoria? VANESSA: Vanessa. JASON Hirschhorn: Vanessa. Unnskyld. VANESSA: Det er bare et endelig antall med tall som kan representeres fordi du er på et, i vår sak, en 32-bit system. Så du må slags gjøre opp noen tall. JASON Hirschhorn: Så det er helt riktig. Det er bare en viss mengde tall som kan være representert. Hvis du multipliserer to svært store tall, det kan renne over mengden plasser du må representere et helt tall. Det er derfor noen ganger bruker vi en lang lang i stedet for en int. Det har flere områder. Som kan holde et større antall. Floating point presisjon har å gjøre med det, men også har å gjøre med faktum at desimaltall er ikke alltid representert. Unnskyld. La meg sette dette opp igjen. Desimaltallet 1.0 er ikke alltid representert som du forventer, 1,000000000. Det er noen ganger representert som 1,000000001 eller 0,999999999. Det kan bli enda 89 kastet der inne et sted. Så de desimaltall er ikke representert akkurat som du ville gjort forventer at de skal være representert. Så i oppgavesettet - var det to? - Problemet satt to, hvor vi har jobbet med flyttall, da vi ønsket dem til å representere akkurat hva vi ønsket dem for å representere, antallet av pennies, eller antall cent, vi multipliserer dem ved 100. Vi rundet dem. Og da vi kuttet ut alt bak kommaet. Det var for å sikre at de ville faktisk like nøyaktig hva vi ønsket dem til å like. Fordi når du tar noe som er en dupp og gjøre det til en int, du avskåret alt mot høyre for desimaltegnet. Fordi det er noen flyttall unøyaktighet, 100.000 kan være representert som 99,999999999. Og hvis du bare klippe av alt å riktig med en gang, du kommer til å få feil nummer. Yeah. STUDENT: Jeg hadde et spørsmål om casting. Hvilken rekkefølge forekommer det i? Hvis du vil gjøre float, braketter, en delt med 10, betyr det ikke en delt på 10, deretter får 0,1, og slå det inn en flottør? JASON Hirschhorn: Hvis du gjør flyte en delt på 10 - STUDENT: Ja, og så lik - Vel, ville det normalt har det like - Yeah. Du ønsker å gjøre det til en float, ikke sant? JASON Hirschhorn: OK, så vi kommer til å bruke det til naturlig overgang til å finne ut svar på disse spørsmålene ved koding. Fordi du vil sannsynligvis ha en mye disse minutt spørsmål, og en god måte å løse dem er gjennom koding. Så vi kommer til å kode dette akkurat nå, og da skal vi gå tilbake og kode spørsmålet du hadde. Så den første linjen - Jeg burde ikke ha skrevet det - hva er det første vi vil gjøre når vi åpne opp en ny fil i gedit? STUDENT: Inkluder. JASON Hirschhorn: Inkluder hva? STUDENT: CS50 bibliotek. JASON Hirschhorn: OK. Hva annet bør vi inkludere? Vi er bare nødt til å sjekke hva som skjer når du kaster noe til en flåte. Men hva trenger vi å inkludere hvis vi er kommer til å skrive et C-program? STUDENT: Standard I / O. JASON Hirschhorn: stdio.h. Vi har faktisk ikke trenger, for dette program, cs50.h, selv om det er alltid nyttig å inkludere det. Men vi trenger alltid trenger stdio.h. STUDENT: Når koding i C? JASON Hirschhorn: Når koding i C. Så jeg lagre det som dette. C-fil. Jeg får noen fine syntax highlighting. Jeg skrev tomrommet inni hoved. Hva ugyldig bety? STUDENT: ikke tar noen kommandolinje-argumenter. JASON Hirschhorn: Void betyr i denne fall ikke hoved ikke ta noen kommandolinje-argumenter. I andre tilfeller, betyr det at funksjonen tar ikke kommandolinje-argumenter. Eller funksjonen, hvis jeg skulle skrive ugyldig main (void), som vil si hoved sin ikke tilbake noe. Så ugyldig bare betyr ingenting. Hva skulle jeg skrive hvis jeg skulle ta kommandolinje-argumenter? STUDENT: int arc c streng arc v. JASON Hirschhorn: int argc streng argv. Er det riktig? STUDENT: Det er røye stjerne argv parentes. JASON Hirschhorn: Så du kunne skrive string argv braketter eller røye stjerne argv parentes, men du trenger brakettene. Fordi argv er en matrise strenger, huske. Det er ikke bare én streng. Så streng argv er, her er en streng som heter argv. String argv parentes er, er her en rekke strenger. Så int argc streng argv brak ville være noe som jeg ville trolig skrive. Så du ønsket å spare i et heltall? STUDENT: Ja, heltall. Eller i en flåte. JASON Hirschhorn: I en dupp? Like, float x er lik 1 delt på 10. JASON Hirschhorn: OK. Hvordan kan jeg skrive ut en dupp i printf? Hva? STUDENT:% f. JASON Hirschhorn:% f. Hva er et heltall? d eller jeg. Hva er en streng? STUDENT: s. JASON Hirschhorn: s. Hvordan får jeg en ny linje? STUDENT: Omvendt skråstrek n. JASON Hirschhorn: Hva gjør jeg tilbake hvis viktigste kjører riktig? STUDENT: 0. Trenger jeg å skrive at linje, skjønt? STUDENT: Nei. OK, vi vil ikke skrive det, da. Alle kan lese det? Det ser litt liten. Alle kan se, eller bør Jeg gjøre det større? Jeg tror for kameraet, vil vi gjøre det litt større, skjønt. JASON Hirschhorn: Hvis jeg ønsker å snu dette . C-fil inn i en kjørbar, hva skriver jeg? STUDENT: Gjør test. JASON Hirschhorn: Sorry? STUDENT: Gjør test. JASON Hirschhorn: Gjør test. Vi snakket om denne linjen tidligere. Klang. Hva er klang? Navnet på kompilatoren. Hva er denne linjen? STUDENT: Setter den opp for bruk av GDB. JASON Hirschhorn: Sett det opp for bruk av GDB. Denne linjen, hva er det? STUDENT: Kildekoden. JASON Hirschhorn: Det er kildefilen, den. c-fil. Hva har disse to linjene gjøre? Eller disse to ikke linjene. STUDENT: Det navnene det teste. JASON Hirschhorn: Så dash o sier, navnet noe annerledes. Og her du kaller det test. Hvis jeg ikke har det i, hva ville det nevne dette? STUDENT: a.out. JASON Hirschhorn: a.out. Hva gjør dette? STUDENT: Lenker regnestykket bibliotek. JASON Hirschhorn: Det knytter i regnestykket biblioteket. Vi inkluderte ikke regnestykket bibliotek, men siden det er så vanlig, de har skrevet make å alltid inkludere regnestykket bibliotek. Og på samme måte, inkluderer dette den CS50 biblioteket. OK, så hvis vi liste, har vi nå en kjørbar heter test. For å utføre det, skriver jeg test. Jeg ser at min flyttall, som forventet, er lik 0. Betyr det - så - STUDENT: Så hvis du setter flyte nå, som om du kastet det som float - JASON Hirschhorn: Cast den en til en dupp? STUDENT: Nei, kaste hele greia - ja. Hvis du nettopp gjorde det, ville som gjør det 0,1? JASON Hirschhorn: OK, så veldig raskt, 1 delt på 10, de er heltall som blir delt. Så når du dele heltall, er de 0, og du sparer på at 0 i en flyter, fordi den er skrå bare heltallsdivisjon. Så nå er vi snu noe inn i en flåte. La oss se hva som skjer. Vi vil gjøre testen. Så nå ser vi at det skråstrek var ikke heltall divisjon, ble det flytende punkt divisjon. Fordi en av sine argumenter hadde blitt kastet til en flåte. Så nå var det å si, behandle dette divisjon som vi har å gjøre med flytende poeng, ikke med heltall. Og så får vi svaret vi forventer. La oss se hva som skjer - oops. Hvis jeg ønsket å skrive ut mer desimal flekker, hvordan kunne jeg gjøre det? STUDENT: Point dot f, eller så mange desimaler som du ønsker. JASON Hirschhorn: Så jeg skriver ut 10 desimaler flekker. Og vi nå ser at vi får noen rare ting. Og det går tilbake til spørsmålet ditt om flyt imprecision. Det er rare ting lagret i her. OK, gjør at spørsmålet ditt? Hva annet hadde du ønsker å kode raskt? STUDENT: Jeg ville bare se om ikke, hvis du frigjort noen peker, om at pekeren fortsatt hadde lagret i det adressen til hva det hadde vært peker til tidligere. JASON Hirschhorn: OK, så la oss gjøre det. Char stjerners ptr, skaper dette en variabel kalt ptr av typen char stjerne. Hvordan skriver jeg malloc? Alden? ALDEN: Just malloc. Men da må det være størrelsen på, og i dette tilfellet, tror jeg du hadde peke til røye. Så det ville være røye. JASON Hirschhorn: OK, så mer generelt, Inside - la oss redigere. Inne malloc, vil du nummeret byte på haugen. Vanligvis, hva vi har sett at vi er gjør er vi kommer til malloc strenger, for eksempel, eller matriser med heltall. Så hvis vi vil ha 10 heltall, eller 10 chars, 10 vil gi oss 10. Og så størrelsen på tegn ville gi oss at størrelsen av tegn, som i dette tilfellet er en byte. Vi får 10 bytes. Hvis vi skulle skrive størrelsen på int, som ville gi oss 40 bytes. Så mer generelt, på innsiden av malloc er antall byte du ønsker. I dette tilfellet får vi en byte. Som virker som en merkelig bruk av malloc, men for vår formål er fornuftig. Så det er det. Vi kommer til å ringe gratis. Vi kvitte seg med det, og vi bruker ptr igjen. Og hva gjorde du ønsker å sjekke? STUDENT: Jeg ville bare sjekke om eller ikke var det noe på innsiden av den. JASON Hirschhorn: Så om det pekt på noe? STUDENT: Ja, akkurat, enten det fortsatt hadde en minneadresse. JASON Hirschhorn: Så du vil for å sjekke verdien av ptr? STUDENT: Ja, akkurat. JASON Hirschhorn: Hva skriver jeg her hvis jeg ønsker å sjekke verdien av point - hva er, Jordan sa, verdien? Eller det som er lagret inne i ptr? STUDENT: En minneadresse. JASON Hirschhorn: En minneadresse. Så hvis jeg skriver akkurat dette, det vil gi meg verdien av ptr. Og hvordan kan jeg skrive ut en minneadresse? Hva er formatstrengen for en minneadresse? STUDENT:% p. JASON Hirschhorn:% p. % S er en streng. % P for pekeren. Er det riktig? Det er riktig. Så ptr lik - det fortsatt har noe i det. Dette er trolig en mer interessant spørsmål. Hva gjør den linjen gjøre? STUDENT: Seg feil. JASON Hirschhorn: Hva? STUDENT: Jeg tror det SEG feil. JASON Hirschhorn: Hm? STUDENT: Jeg tror det vil Seg feil. JASON Hirschhorn: Så denne linjen av kode, stjerne ptr, hva betyr stjernen mener? STUDENT: Innhold av. JASON Hirschhorn: Yeah. Gå til å få innholdet av. Så dette kommer til å gå til minne adressere det og gi meg det. Jeg brukte% c akkurat her fordi det er tegn lagret der. Så vi kommer til å gå til den adressen vi nettopp har sett - eller det vil trolig være en litt annerledes denne gang vi kjører programmet. Men vi vil gå til denne adressen som vi vet eksisterer fortsatt og se hva som er der. Så det ikke SEG feil. Det bare ikke gi oss noe. Det kan faktisk har gitt oss noe, vi kan bare ikke se det. Og det går tilbake til denne ideen - og vi ikke kommer til å få for mye inn dette, fordi det er utenfor Omfanget av dette kurset. Men vi snakket om her, hvis vi gikk utenfor grensene av rekken av 1, kan vi ikke komme i trøbbel. Noen ganger, når du bare gå av ved en, du gjør noe galt, og du kunne komme i trøbbel. Men du trenger ikke alltid komme i trøbbel. Det avhenger av hvor mye av en dårlig ting du gjør, du kommer til å komme i trøbbel. Som ikke er å si, være slurvete med koden din. Men det er å si, vil programmet ikke alltid slutte, selv om du går et sted du har ikke lov til å gå. Et godt eksempel på det er, mye mennesker i deres problem satt tre, som var 15, ikke kontrollere grensene for styret. Så du så til venstre, så til høyre, så til toppen, så til bunnen. Men du gjorde ikke sjekke for å se om toppen var faktisk kommer til å være på brettet. Og en masse folk som gjorde det, og viste at i arbeidet sitt program perfekt, fordi der at styret var lagret i minnet, hvis du gikk en over det eller sjekket at minnet adresse, det var ikke noe spesielt fryktelig om det, så programmet var ikke kommer til å kjefte på deg. Men vi vil fortsatt ta av poeng hvis du ikke sjekke det, fordi du gjorde noe du ikke var ment å gjøre, og du kan ha fått i trøbbel. Odds er, skjønt, har du sannsynligvis ikke. Så dette er å vise at, ja, vi kan fortsatt gå til det. Og vi slipper ikke inn vanskeligheter i dette tilfelle. Hvis vi prøvde å gjøre lese neste 100 tegn, ville vi sannsynligvis komme i trøbbel. Og du kan kode lesing de neste 100 tegn hvis du ønsker ved å gjøre noen liksom for loop. Yeah. STUDENT: Siden vi ble tildelt som plass en faktisk verdi, ville vi ikke faktisk være i stand til å se noe. Skal vi prøve det med å sette at lik som C eller noe? JASON Hirschhorn: Great spørsmål. Hvordan kan jeg sette denne verdien - hva kodelinje skriver jeg på linje syv til å gjøre det du sa? STUDENT: Stjerne ptr tilsvarer singel sitat c ende enkelt tilbud. JASON Hirschhorn: Så det er å sette et tegn, c, på det stedet, fordi igjen, at stjerne betyr gå til der. Og når det brukes på venstre side av et oppdrag operatør, lik at signere, vi kommer ikke til å få det verdi så mye som satt som verdi. Nå la oss se hva som skjer. Vi satt noe der og det var der. Vi kalte gratis. Noen ting sannsynligvis skjedd på haugen. Så det er ikke der lenger. Men igjen, vi ikke får i trøbbel for å gå dit. Jeg gjør dette ut i kode for å illustrere at mange av disse spørsmål som du har, er de virkelig interessant svarer en masse tid. Og de er virkelig gode spørsmål. Og du kan regne dem ut på din egen hvis, for eksempel, vi er ikke i seksjonen. Yeah. STUDENT: Fordi du ikke sender pekeren hvor som helst, trenger du å bruke malloc? JASON Hirschhorn: Så dette går tilbake til ditt første spørsmål. [? ?] Er det bare en lokal variabel? Malloc her er ikke så overbevisende. Bruken av malloc her ikke er at bevisende fordi det er bare en lokal variabel. STUDENT: Så kan du gjøre røye stjerners ptr tilsvarer hallo? JASON Hirschhorn: Oh. Så vi kommer til å nå komme tilbake til ditt første spørsmål. Jeg tror du ikke var fornøyd med mitt svar. OK? Sånn? STUDENT: Ja. Vent. JASON Hirschhorn: Og der har du lyst til å skrive ut? Så vi vil skrive ut en streng sånn? STUDENT: Interesting. JASON Hirschhorn: Så dette sier dette argumentet har form av en karakter. Så dette bør være et tegn. STUDENT: Bare tar den første. JASON Hirschhorn: Så dette er hva jeg sa før. Som jeg sa, det er ikke å lagre strengen inni variabel pekeren. Det er lagring - STUDENT: Den første verdien av strengen. JASON Hirschhorn: Adressen til den første verdien av strengen. Hvis vi skulle skrive ut dette, er vi får verdien inne pekeren. Og vi får se det er, faktisk, en minneadresse. Betyr det fornuftig? Unnskyld. Vent, betyr det svaret ditt Spørsmålet er imidlertid? STUDENT: Ja. JASON Hirschhorn: Dette kodelinje er skape en streng og deretter en annen variable peker som peker til at strengen, denne matrisen. Yeah. STUDENT: Så hvis vi gikk ett minne ta videre, ville vi får h? Er det blitt lagret som en streng? JASON Hirschhorn: Like, vi gjorde - så dette er verdifullt å gjøre. Dette er punkt aritmetikk, som dere har sett før og bør relativt komfortabel med. Dette er beslektet med å skrive - hvis vi skulle skrive denne linjen med kode, vi har sett matrise notasjon før. Dette bør gi oss andre verdi i denne rekke, h. Hvis vi gjorde dette, bør dette også gi oss den andre verdi i denne matrisen. Fordi det kommer ikke til minne adressen til den første, men den minneadresse av tingen en over. Og deretter stjerneoperatør dereferences at pekeren. Og igjen, la oss se. Vi får h igjen. STUDENT: Hva gjør Dereference bety? JASON Hirschhorn: Dereference er et fancy ord for å gå til. Gå til det og få det som er der er å deferanseoperasjon en peker. Det er bare et fancy ord for det. STUDENT: Hvis vi ønsket å skrive ut hele streng, kunne vi gjør tegnet pekeren? JASON Hirschhorn: OK, vi er kommer til å ta en pause her. Vi kommer til å ende her. Ampersand gir deg adressen til en plassering, så når du gjør tegnet av en variabel, det gir deg adressen hvor den variabelen er lagret. Ampersand pekeren vil gi deg Adressen ptr hvor ptr er i minnet. Vi kommer ikke til å gå på med dette eksemplet. Du kan regne ut disse ting på egen hånd. Men igjen, dette kan også være på grensen en litt utover hva du trenger å vite for omfanget av denne mid-term - eller denne quizen, heller. Unnskyld. Vi kommer til å gå videre, fordi jeg ville liker å gjøre en koding problem før tiden er ute. Og vi kommer til å kode det jeg tror er det mest overbevisende av disse eksempler, atoi. Så dette var et spørsmål om en quiz for to år siden. Og jeg har det på brettet her. Folk ble spurt på quiz - de fikk litt mer tesxt i spørsmålet, men jeg eliminert tekst fordi det var unødvendig for vårt formål nå. Det var bare litt bakgrunns på hva atoi gjorde. Men du vet alle og er veldig kjent med atoi. Jeg foreslår at du kode dette på et ark. Jeg foreslår også at du bruker strategi at vi har gått over mye i vår seksjon. Først, sørg for at du forstår hva atoi gjør. Tegn et bilde eller komme opp med noen mentalt bilde av det i hodet ditt. Deretter skrive ut pseudo for dette. På quiz, hvis alt du får er pseudo, minst du sette noe ned. Og deretter kartlegge at pseudo på C. Hvis du har en sjekk i din pseudo, som sjekker om noe er en, som kart på en hvis tilstand og så videre. Og til slutt, kode programmet i C. Så gå tilbake til atoi og ta fem minutter å kode dette på et ark papir, som trolig om den hvor mye tid du vil ta på seg en quiz til kode atoi. Fem til femten minutter, fem til 12, fem til 10 minutter, er om hvor mye tid du vil bruke på dette spørsmål i quizen. Så ta fem minutter nå, takk. Og hvis du har noen spørsmål, ta opp hånden din og jeg skal komme rundt. [side samtaler] JASON Hirschhorn: OK, så det var fem minutter. Det var trolig om hvor mye tid du vil bruke på det på en quiz, kanskje den lave enden av den tiden. Vi vil oppsummering i en bit. La oss starte koding dette. Og hvis vi ikke får hele veien gjennom, svarene på dette og dette quiz spørsmål er tilgjengelige, igjen, Fall 2011 er når dette spørsmålet dukket opp på quiz. Og det var verdt åtte poeng på quiz da. Åtte poeng er på den høye enden av den antall poeng noe er verdt. De fleste spørsmålene er i størrelsesorden på 1-6 poeng. Så dette er en mer utfordrende spørsmål, for sikker. Kan noen få meg i gang? Generelt, hva skal vi å ønske å gjøre med dette fungere atoi, logisk? Hva ønsker vi å gjøre? Så vi kommer til å skrive noen pseudo. STUDENT: Konverter tegn inn heltall. JASON Hirschhorn: Konverter tegn inn heltall. OK. Så hvor mange tegn er vi kommer til å trenge å gå gjennom? STUDENT: Alle av dem. STUDENT: Alle tegnene i strengen. JASON Hirschhorn: Alle tegn i strengen. Så hvis vi ønsket å gå gjennom hver tegnet i en streng, hva er en ting i C har vi sett at har tillatt oss å gå gjennom hver tegnet i en streng? STUDENTER: En for løkke. JASON Hirschhorn: En for løkke. Så vi kommer til å sløyfe gjennom hver karakter i s. Så hva skal vi ønsker å gjøre når vi får en bestemt karakter? Si at vi får gått en 90. Vi får ni. Det er et tegn. Hva ønsker vi å gjøre med det tegnet 9? STUDENT: Trekk den fra karakter 0? STUDENT: Legg 0? JASON Hirschhorn: Trekk det fra karakter 0? STUDENT: Ja. JASON Hirschhorn: Hvorfor gjøre du ønsker å gjøre det? STUDENT: [uhørbart] verdi. Dens int verdi. JASON Hirschhorn: OK, så vi tar den karakter 9, trekker den fra karakter 0 for å få en Selve heltall 9. Søt. Og hvordan vet du det tegnet 9 minus 0 karakter er 9? Hva diagram gjorde du ser på? STUDENT: Det er logisk ni steder mellom 9 og 0. Eller du kan se på ASCII-tabellen. JASON Hirschhorn: ASCII-tabellen. Men ja, du er riktig også. Så vi trekker fra 0. Så nå har vi heltallet 9. Og hva gjør vi ønsker å gjøre med det? Hvis vi har 90, er det den første heltall vi har, hva vi ønsker å gjøre? STUDENT: Jeg hadde lagt i en midlertidig heltall array, så gjør regnestykket til det senere å gjøre det til en ende. JASON Hirschhorn: OK. STUDENT: Du kan starte i slutten av matrisen og deretter gå videre så at hver gang du beveger deg fremover, du multiplisere det med 10. JASON Hirschhorn: OK. Det høres ut som en ganske overbevisende idé. Vi kan starte i slutten av vår array, og vi kan bruke strleng. Vi kan bruke strleng i her. Vi får lengden på strengen. Vi starter på slutten. Og + den første, vi bare ta det heltall, og kanskje vi skaper som en ny heltallsvariabelen opp toppen der vi lagrer alt. Så vi sløyfe gjennom hver røye i s fra tilbake til forsiden, trekker vi 0, og Da tar det funnet, og avhengig hvor det er, vi multiplisere det av en strøm av 10 år. Fordi den første, hva gjør vi multiplisere lengst tegnet av? STUDENT: 10 til 0. JASON Hirschhorn: 10 til 0. Hva gjør vi multipliserer andre lengst tegnet av? STUDENT: [uhørbart]. JASON Hirschhorn: Hva? STUDENT: 10 til en. JASON Hirschhorn: 10 til en. Den tredje-lengst til høyre karakter? STUDENT: 10 til to. JASON Hirschhorn: 10 til to. STUDENT: Beklager, jeg forstår ikke hva vi gjør her. JASON Hirschhorn: OK, la oss gå tilbake, da. Så vi kommer til å få vedtatt i en streng. Fordi vi skriver atoi. Så vi får gått på en streng. Si at vi får bestått i strengen 90. Det første vi skal gjøre er å sette en ny heltallsvariabelen at vi er bare kommer til å skape som vår nye heltall. Det er det vi skal for å gå tilbake ved enden. Vi trenger å gå gjennom hvert tegn i strengen fordi vi har funnet ut at vi må innom hver enkelt og deretter legge det til vår nye heltall. Men vi kan ikke bare legge det som et tall. Vi kan ikke bare ta 9 og legge ni til vår heltall. Det avhenger av hvilken plass det er i strengen. Vi kommer til å trenge å formere det ved en strøm på 10. Fordi det er hvordan basen 10 verk. Så vi kommer til å få den faktiske karakter, eller selve heltall nummer, ved å trekke karakter 0 fra karakter 9 som vi gjorde med trekke tegnet kapital A fra hva karakter vi hadde i en av disse problemene. Så vi får faktisk et tall fra 0 til 9 lagret som et reelt tall, og vi vil multiplisere det med en kraft på 10 avhengig på hvor vi er i strengen. Og så kommer vi til å legge den tilbake inn i vårt nye heltall variabel. Så hva dette ville se ut ville være - vi vil trekke over her. Hvis vi får gått i strengen 90 - STUDENT: [uhørbart]. JASON Hirschhorn: Men atoi tar en streng. Så vi kommer til å gå gjennom bruket. Vi vil bli passert i 90. Vi går fra baksiden til forsiden. Vi tar 0. STUDENT: Jeg beklager. Kanskje dette er dumt. Hvis vi får gått i en streng, hvorfor er 90 hva vi er bli vedtatt i? Fordi 90 er et helt tall. JASON Hirschhorn: Fordi atoi tar en streng og gjør det til heltallet representasjon av strengen. Men strengen 90 ikke er heltallet 90 eller nummer 90. Strengen 90 er en matrise av to eller tre tegn, rettere sagt, 9 karakter, 0-tegn, og backslash 0 karakter. Og vi skriver atoi fordi, for eksempel når du tar kommandoen argumentet, og den er lagret i argv, er det lagret som en streng. Men hvis du ønsker å behandle det som et tall, du trenger for å konvertere den til en Selve heltall. Som vi gjorde en av våre oppgavesett. Som vi gjorde i en rekke av våre oppgavesett. Alle som tok et heltall som en kommandolinje argument. Så det er derfor vår atoi funksjon tar en streng. Så igjen, i vårt eksempel her, er vi kommer til å ta den siste. Vi kommer til å trekke karakteren 0 fra det, fordi tegnene 0 trekkes av karakteren 0 gir deg det faktiske tall 0, ifølge ASCII-matte som vi gjør. Fordi bokstaver er representert som annerledes enn deres faktiske - den tegn en, for eksempel, små bokstaver en er 97. Det er ikke - oops! Det er ikke hva du forventer den skal være, 0, f.eks. Så du må trekke fra tegnet en å få 0. Så vi kommer til å gjøre det her for å få den virkelige antall. Og så har vi tenkt å multiplisere det med en kraft på 10 avhengig av hvor den er i strengen, og deretter ta det og legge det til vår plass holderen variabel slik at vi kan komme opp med vår endelige ny heltall. Betyr det er fornuftig for alle? Så vi kommer til å kode dette akkurat nå, fordi vi er får liten tid. Jeg beklager timingen av det. Men dette er hva, forhåpentligvis, ville du være i stand til å gjøre på quiz - på minste, får denne pseudo skrevet ut. Og så, hvis vi skulle skrive pseudo, faktisk, vi kunne gjøre dette ganske raskt. Hver linje av kommentarene vi vi skrev her oversettes til ca en linje av C-kode. Erklærte en ny variabel, skriving en løkke, en subtraksjon, noen multiplikasjon, og noen oppdrag. Vi vil nok også være lurt å skrive en returledning. Vi kan også være lurt å sette noen kontroller i her. Yeah. STUDENT: Så kan vi behandle s som selve strengen? Fordi jeg vet at det er bare en adresse. Ut, hvordan ville du få lengden av strengen blir ført gjennom? JASON Hirschhorn: Så hvordan gjorde lengden på en streng? Strlen. STUDENT: strlen, ja. Men kan du sette s som argumentet for det? JASON Hirschhorn: Så strlen tar en char stjerne. Og det følger at røye stjerne, og det holder telling før det blir til en backslash 0. strlen var faktisk en av de andre programmer vi skulle kode. Det er en annen god en til kode. At man er litt lettere, fordi hvis du kommer til å tenke på at konseptuelt - Jeg bare sa det høyt - strlen følger en peker og holder kommer og telle og holde styr før du kommer til en backslash 0. STUDENT: OK, fikk den. JASON Hirschhorn: Så best av lykke til på quiz 0 i morgen. Hvis du har noen spørsmål, vil jeg være ute etter dette. Gjerne send meg. Nå ut til din egen TF hvis du er ikke i min seksjon, eller få min e-post hvis du ønsker det. Hvis du ønsker å frik ut og bare sende meg en e-post, en freakout e-post, vil jeg sende deg tilbake, som en smiley ansikt, eller, som, en vits eller noe. Så gjerne gjøre det også. Lykke til igjen, og jeg skal se dere alle neste uke.