SPEAKER 1: Hej alle. Vi kommer til at komme i gang. Jeg tror, ​​at folk stadig vil at være filtrering. Men af ​​hensyn til tiden, så vi kan få jer ud af her til tiden, vi kommer til at starte. Så velkommen til CS50 Quiz 0 anmeldelse. For dem af jer, der ikke har indset endnu, du har et spørgsmål på onsdag. Woo-hoo. Hvis du ikke har startet studere endnu eller ikke har indset, at det eksisterer endnu, tidligere quizzer og alle oplysninger om din quiz er på cs50.net/quizzes. Der er nogle ret gode ting på der, tidligere quizzer fra de sidste 10 år samt oplysninger om denne quiz og emner der vil blive dækket. Så lad os komme i gang. Så jer måske husker, den første dag i klassen David havde disse lygter på. Så det væsentlige, alt, der går på under kølerhjelmen af ​​en computer er gjort i binær. Binær betyder hvad det lyder lignende, 0'er og 1-taller. Den har to værdier, kan være repræsenteret. Så ligesom i den første dag i sektion Da David tændt et lys pære til at repræsentere den, eller 1, vores computer forstår binært som 0'er og 1'er, til eller fra. Grundlæggende om Binary. Hvert sted er repræsenteret i bunden to. Så du tilføje 2 til 0 til 1 til 2 hele vejen op. At beregne, hvad din binære er at decimal, skal du blot følge denne ligning type ting. Hvis du har en 1 i nogen af ​​disse steder, du gange det med uanset basere det er i, tilføje det op, og du får decimal. Så dette er, hvordan du tæller til 5 i binær. Ligesom hvad vi laver på sidste dias, er det sådan du ville repræsenterer 1 til 5. Tilsvarende, ligesom du kan tilføje og trække i decimal eller basere 10, eller virkelig helst base på kan tilføje og trække i binær. Præcis hvad du ville forvente, når du tilføje to op, hvis det er lig med større end 1, du bærer en 1, gør det til en 0, og gøre den tilføjelse, at vejen, lige ligesom du ville forvente med regelmæssig decimal eller anden base. Fedt. Så som jeg sagde før, alt det, går under kølerhjelmen af ​​vores computer sker i 0'er og 1-taller, eller binær. Så hvordan kan vi udtrykke, for eksempel, bogstaver eller tal eller bogstaver? Og svaret på det er ASCII. ASCII er en kortlægning mellem tegn at vi normalt ville se i Engelsk sprog som A'er, BS, C'er, understregningstegn, bindestreger, og noget lignende. Og det kort, der til en ASCII værdi. En ASCII værdi er blot et tal, der kan forstås af computeren. Og ligesom du kan gøre addition og subtraktion med tal, kan du gøre dem med ASCII-værdier. Så i dette eksempel, hvad Dette vil udskrive? Ja, så bare Et rum B space C plads D. Hvor blev min mus hen? Bemærk du kan definere en int ved 65. Og når du udskriver det ud ved hjælp af procent C, vil det tolker det som et karakter og vil udskrive A. Tilsvarende kan du erklære det som en char. Og når du printe det ud ved hjælp af procent C, vil det fortolke denne som procent D. Og ligesom du kan tilføje en nummer, kan du tilføje tegn er ASCII-værdier, i dette tilfælde. Så en lille pegepind for alle. 5, som en streng, ikke faktisk lig 5. Så hvordan kan vi konvertere streng 5 til det hele tal 5? Nogen idéer? Ja. Så hvis vi har 5 som en streng, vi kan trække 0. Og det vil give os 5. Og på samme måde, hvis vi har 5 som en heltal, tilføje, at strengen 0. Og det giver os strengen 5. Fedt. Nu husker tilbage til foredrag en, hvor vi talte om algoritmer. Så hvordan kan vi faktisk ønsker en computer at gøre interessante ting? Du ved, bare at tilføje og fratrække tal og trykning ting, er ikke det spændende. Normalt vi ønsker, at vores computer til udføre en form for algoritme. Noget lidt mere kompleks end blot et simpelt regnestykke. En algoritme er blot en trinvis sæt af instruktioner til, hvordan man udfører en vis task-- Ligesom en opskrift. Du husker måske den første dag i klasse, hvor David havde os tælle et værelse af mennesker, og hvor mange mennesker var i rummet. Du kan blive brugt til at tælle én efter én. 1, 2, 3, 4. I dette tilfælde en lineær tid algoritme. Men David indført en algoritme til du at tælle personer i rummet hvor alle står op, siger du din nummer til en anden person, tilføjer, at nummer op, og en person sidder ned. Og du gentage det. Det er en type af algoritme. Vi kan analysere, hvordan en effektiv en algoritme er baseret på det køres tid. Men vi vil snakke lidt mere om det senere. Så alle algoritmer kan også være skrevet i pseudokode. Pseudokode er bare en engelsk ligesom syntaks, der anvendes til at repræsentere et programmeringssprog. For eksempel, hvis vi ønskede at spørge en bruger at gætte min favorit nummer, vi kunne have pseudokode som sådan. Få en brugere gætte. Hvis gæt er korrekt, fortælle dem de er korrekt, ellers fortælle dem de er ikke korrekt. Og pseudokode er en måde nemt repræsenterer en idé eller en algoritme. Så nu er vi måske ønsker at rent faktisk at skrive dette på det sprog, som computeren måske forståelse. Så vi kunne skrive vores pseudokode og fortolke denne i kildekoden. Hidtil skal kildekode overholde til en bestemt syntaks et programmeringssprog. Og indtil videre, i CS50, vi har brugt det meste C. Så dette kan være kildekoden til ca. Senere i kurset, du nat komme i kontakt med andre programmering sprog som PHP. Eller hvis du selv tager andre klasser, du kan gøre Java, Python, eller endda OCML. Men i vores c programsproget, er dette hvordan vi kan skrive kildekoden til pseudokoden algoritme, Jeg har lige beskrevet tidligere. Så hvordan gør din computer faktisk forstå det? Som jeg sagde før, er det kun virkelig forstår nuller og ettaller. Så hvordan gør det får fra kilden kode til noget, der kan være forstået? Tja, vi har noget kaldes en compiler. Hvis du husker tilbage i de fleste af dine psets, du havde en slags program skrevet i en prik C-fil. Og så ville du skrive make. Så hvad er at gøre det? Du kan skrive make til at oversætte din program, fordi someone-- hvem skrev din p sæt; sandsynligvis David-- skabt en make-fil. Og der fortæller at vide for at køre din compiler, kaldet klang, der vil derefter kompilere din kildekode til at gøre indsigelse kode, som er nuller og ettaller at din computer forstår. Men lidt senere, vil vi gå mere i dybden om compilere. Så husker pset 0, where-- ja, du har et spørgsmål? Publikum: [uhørligt]? SPEAKER 1: Ja. Jeg tror, ​​de faktisk skal være online. Ja. PUBLIKUM: Er det ligesom [uhørligt]? SPEAKER 1: Det er ikke. Det er på cs50.net/quizzes. Publikum: Slash quizzer, skråstreg 2013 skråstreg 0, og bare klikke sig igennem quizzer i 2013 og quiz 0, gennemgå afsnittet dias. SPEAKER 1: Ja, så hvis du fyre ønsker at træk den op og se på det på din egen computer, det er også fint. Sig det igen. Publikum: [uhørligt]. SPEAKER 1: Ja, [uhørligt] er dummy-variabel. Åh, ja? Publikum: [uhørligt]? SPEAKER 1: Nej, strejker er ikke på eksamen. Beklager, hendes spørgsmål var, var strejker på eksamen. Og det er ikke. Så pset 0, bør du fyre har alle implementeret noget ved hjælp af scratch. Og vi har lært nogle grundlæggende programmering byggeklodser ved hjælp af scratch. Så lad os tage et kig på nogle af disse byggesten at lave et program op. Først er boolsk udtryk. Boolske udtryk er dem og 0'er eller noget, der har to mulige værdier. I dette tilfælde, sandt eller falsk, til eller fra, og ja eller nej. Et eksempel på en enkel, meget enkel, program, der bruger en boolesk udtryk heroppe. Så for at boolske udtryk til være nyttigt, har vi booleske operatorer. Disse er operatører, der kan anvendes at sammenligne visse værdier. Så vi har og eller ikke lig med, mindre end eller lig med, større end eller lig med og mindre end eller større end. Men disse operatører ikke er meget nyttigt medmindre vi kan kombinere dem i forhold. Så gutter måske husker fra bunden og fra din p indstiller, at vi havde betingelser. De er væsentlige, ligesom gafler i logikken i dit program, udfører afhængigt af om en betingelse er opfyldt. Så en af ​​de betingelser, som vi havde brugt mange gange i dette kursus er den hvis, Else hvis, og Else forhold. Her er et eksempel på, hvordan du kan bruge det. Er der nogen der kender forskellen mellem bare brug, hvis udsagn alle vejen ned vers, hvis andet, hvis og ellers kombineres? Ja? Publikum: [uhørligt]. SPEAKER 1: Præcis. Så hvis jeg havde, hvis hele vejen ned dette måde, selv hvis denne betingelse afkast sandt, vil det stadig fortsætte teste næste to. Henviser til, at med en ellers-hvis en anden erklæring, hvis man returnerer true, de andre er ikke testet. Eventuelle spørgsmål om det? Fedt. Så du bruger en if-else af et andet erklæring, hvis du ved, at det kun kan være en af ​​disse sager. Så vi ved hvis x er mindre end 0, er det absolut ikke vil være større end 0. Dernæst anden byggeblok at vi har lært er sløjfer. Vi har tre typer af løkker. For loops, mens løkker, og gøre, mens sløjfer. Og generelt, når du sætter dig ned til skrive noget, er du nødt til at beslutte, hvilken af ​​de tre, du vil bruge. Så hvordan kan vi afgøre, hvilken en? Vi bruger generelt en for-løkke, hvis vi kender hvor mange gange vi ønsker at gentage gennem noget eller hvor mange gange vi ønsker at udføre en opgave. Vi bruger mens sløjfer, hvis vi har brug for nogle betingelse at være sandt at holde kørende. Og vi bruger gøre, mens meget lig stykke tid, men vi ønsker, at vores kode til at køre på mindst én gang. Så gør samtidig, hvad der er i den gør, vil altid køre mindst én gang. Ud over at det stykke tid, det må ikke køre på alle, hvis det betingelse er ikke opfyldt. Eventuelle spørgsmål med det? Så struktur af en for-løkke. Du fyre har alle set dette. Du formatere det. Du har en form for tilstand. Så for eksempel, kan vi initialisere som for jeg lig 0. i er mindre end 10. Og jeg ++. Meget enkel, som vi har gjort. For et stykke tid løkke, på samme måde, du har at have en vis form for initialisering, en slags tilstand, og en slags opdatering. Så vi kan gennemføre vores for-løkke også som en while-løkke bruger denne. Og på samme måde med en gør while-løkke, vi måske have nogle initialisering, udføre noget, opdatere den, og derefter kontrollere tilstanden. Så nu funktioner. Vi sætter det hele sammen. Vi vil måske skrive nogle form for funktion. Fælles funktion, som du måske har set allerede er vigtigste. Main er en funktion. Det har en returtype, int. Den har en funktion navn, vigtigste. Og det har argumenter, argc og argv. Så vigtigste er bare en funktion. Andre funktioner, du måske har brugt, printf-- printf er en function-- GetInt, toupper. Men disse ske at have været gennemført for os ved en slags bibliotek. Hvis du fyre huske herunder denne CS50.h biblioteket eller standard I / O-bibliotek. Ja, spørgsmål? PUBLIKUM: Er vigtigste lige iboende i C? Er det bare lidt [uhørligt]? SPEAKER 1: Spørgsmålet er hvis vigtigste er iboende i ca. Og ja, alle funktioner har en hovedfunktion. Det er slags nødvendig for computeren at vide, hvor du skal starte kører koden. PUBLIKUM: Så du ville ikke [uhørligt]? SPEAKER 1: Nej Andre spørgsmål? Fedt. Så ligesom du kan bruge en funktion der er skrevet til dig, kan du også skriv din egen funktion. Dette er en funktion, som nogen måske har skrevet til beregne volumen af q, f.eks. Der er en tilbagevenden typen her, i dette tilfælde int, vores funktion navn q og vores liste over parametre. Og bemærk, at du skal skrive data type af den parameter, du vil bruge ellers funktionen ikke vide, hvad slags parameter skal jeg acceptere. Så i dette tilfælde, vi ønsker et heltal som vores input. Så hvorfor vi måske ønsker at bruge funktioner? Først og fremmest godt for organisationen. De hjælpe med at bryde op din kode i mere organiseret bidder og gøre det lettere at læse. Forenkling. Det er godt for design. Når du læser et stykke kode og den vigtigste funktion er virkelig, virkelig lang, kan det være sværere at grund om, hvad der foregår. Så hvis du bryde det ned i funktioner, det kan være lettere at læse. Og genbruge-evne. Hvis du har en bid af kode, der bliver kaldet eller køre flere gange, i stedet for at omskrive denne kode 10 gange i din primære funktion, kan du ønsker at genbruge det. Og så hver gang du skal bruge det stykke kode, kalder funktionen. Så nu, hvis vi husker tilbage til bunden, Vi talte også om nogle begreber, hvoraf den ene er trådning. Tråden er begrebet multiple sekvenser kode udførelse på samme tid. Så tænke tilbage på dag ét, hvor David havde du fyre tælle antallet af mennesker i lokalet. Væsentlige, hvad der foregik på, er alle af jer var kører separate tråde. Og de tråde kom sammen at få en slags svar. Ligeledes i Scratch, når du har flere sprites, kan du har en kat og en hund. Og de ville være samtidigt kører deres egne scripts. Det er et eksempel på gevind. Og det andet koncept, som var indført i bunden var begivenheder. Og begivenheder er, når flere dele af din kode kommunikere med hinanden. I Scratch, var dette, når du har brugt den rundsendingskontrolnummer og Når jeg Modtag blokke. Og også i Problem Set 4, så vi en lille smule af begivenheder så godt. I gutter kunne have brugt den Gevent biblioteket. Og der var en funktion waitForClick hvor du ventede for brugeren at klikke. Og dit klik, i dette tilfælde ville være begivenheden og vente på klik er dit hændelseshandler. Og også hele køre dine psets og arbejde på din psets, du kunne have været i kontakt med nogle af disse kommandoer. Dette er, hvad du har skrevet i din terminalvindue eller hvad vindue der viser op på din g redigere til, væsentlige navigere din computer. Så for eksempel, LS lister indholdet af en mappe. Gør mappe opretter en ny mappe. CD, skift bibliotek. RM, fjerne sletter en fil eller en mappe. Og derefter fjerne mappe fjerner en mappe. Publikum: [uhørligt]? SPEAKER 1: Ja, selvfølgelig. Beklager, det spørgsmål var, hvis du vil foreslå at sætte dette på bedrager ark. Det kunne hjælpe. Hvis du har plads, kan du sætte det på. Det er også bare generelt gode nok at huske, fordi når du bruger den du måske bare ønsker at har det udenad. Det vil gøre dit liv meget lettere. Har jeg besvare dit spørgsmål? Så nu har vi talt en lille smule kort om biblioteker. Men de to vigtigste, at vi har været hjælp hidtil i kurset er standard I / O og CS50. Hvilken slags ting er inkluderet i standard I / O-bibliotek? Ja, så vidt vi har brugt printf. I CS50, har vi brugt GetInt og getString. Og strengen datatype også sker skal deklareres i denne CS50 bibliotek. Vi taler lidt mere i dybden om hvordan biblioteker fungerer, og hvordan de interagere med resten af ​​din kode. Men det er de to vigtigste, at vi være kommet i kontakt med så langt i kurset. Typer. Disse er gode til at huske hvor meget hver type er repræsenteret ved eller hvordan mange byte hver type requires-- int, 4 byte; char, 1 byte. Float er 4 byte. Hvad er en dobbelt? Publikum: [uhørligt]. SPEAKER 1: Ja, så en svømmer men dobbelt størrelse. Hvad med en lang? Publikum: [uhørligt]. SPEAKER 1: OK. Hvad er en lang? Publikum: [uhørligt]. SPEAKER 1: Ja, det dobbelte en int. Ja. Publikum: [uhørligt]. SPEAKER 1: Lang [uhørligt]. Og så en lang lang er det dobbelte. PUBLIKUM: Nej, nej. En lang er blot en int. Det afhænger af arkitekturen før [uhørligt] og int har samme størrelse. [Uhørligt]. SPEAKER 1: Så en lang og en int er de samme. Og så en lang lang er dobbelt int. Fedt. Og så, hvad der er den sidste type? Publikum: Pointer. SPEAKER 1: Ja, så vi lærte lidt om pointere. Og uanset hvad en pointer er peger til-- det kunne være en char stjerne eller en int star-- det er altid 4 bytes for en pointer. Spørgsmål om det? Ja? Publikum: [uhørligt]? SPEAKER 1: Så en lang og en int er den samme i denne CS50 apparatet. PUBLIKUM: Apparatet er helt udskiftelige. SPEAKER 1: Ja. Så en lang lang er dobbelt en int. PUBLIKUM: Dette er den 32 bit? SPEAKER 1: 32 bit, ja. PUBLIKUM: Så [uhørligt]? SPEAKER 1: Ja, hvis det ikke gør udtrykkeligt siger, du bør påtage sig en 32 bit. PUBLIKUM: Det vil sige noget som antager en arkitektur ligesom apparatet. For 64 bit, de eneste ting, forandring er længes og henvisninger. De har begge [uhørligt]. SPEAKER 1: Ja? Publikum: Spørgsmål. Så på den ene af de praksis quizzer, den beder om en usigneret int. Så hvordan ville det bestemmes fra en int [uhørligt]? SPEAKER 1: en usigneret i er også 4 byte. Men hvad er anderledes ved en underskrevet int og en unsigned int? Publikum: [uhørligt]. SPEAKER 1: Højre. Man kan repræsentere negative værdier. Men hvordan gør den det? Publikum: [uhørligt]. SPEAKER 1: Ja, det sparer 1 bit til at repræsentere tegn. Den underskrevne har én bit, repræsenterer tegn. Og usigneret bare er alle positive. Publikum: OK. Så du siger, at en dobbelt er to gange størrelsen af ​​en flyder? SPEAKER 1: Dobbelt er dobbelt på størrelse med en float, ja. Publikum: Hvordan virker en pegepind til en lang lang [uhørligt]? SPEAKER 1: Så spørgsmålet er hvordan gør markøren til en lang long-- Hvordan er det kun fire byte, når man en lang lang sine 8 byte. Så husk hvad er en pointer, det væsentlige i det basisværdi. Publikum: [uhørligt]. SPEAKER 1: Ja, så en pegepind er blot en hukommelse. Så det er ligegyldigt, hvor meget plads at pointeren peger på. Det behøver kun 4 byte til at holde styr af denne hukommelse. Andre spørgsmål? Fedt. Så det sidste, jeg har er standard output. Du skal bruge dem ofte nok, at du kan huske. Men det er, når vi bruger printf, f.eks. Og vi har disse pladsholdere, blev kaldt format koder. Så procent C char procent i for int, og vi kan også bruge procent d. Det er den samme ting. Men generelt, i CS50 vi forsøger at bruge procent i. Procent f float. Procent ld for lang lang og procent s for streng. Ligeledes har vi brugt et par af disse escape-sekvenser. For eksempel backslash n for ny linje. Dette er blot for, når du formaterer din kode til print f. Ja? Publikum: Hvad er procent d efter? SPEAKER 1: Så spørgsmålet er, hvad der er procent d efter? Procent d er for ints. Procent d og procent i er den samme. Publikum: Hvad er forskellen mellem backslash n og backslash r? SPEAKER 1: Så spørgsmålet er, hvad er Forskellen mellem slør n og modreaktion r? Jeg tror backslash R er-- PUBLIKUM: Så backslash r bare indebærer vender tilbage til begyndelsen af ​​linjen uden faktisk at gå til en ny linje. Så hvis du udskriver en backslash R og du gå tilbage til begyndelsen af ​​linjen så du udskriver flere ting, du overskriver de ting, der allerede er på [Uhørligt]. Betragtninger, n faktisk går til en ny linje og går til [uhørligt]. SPEAKER 1: Jamen, alle andre spørgsmål? Okay. Jeg har tænkt mig at aflevere det ud til Dan, som vil fortsætte. [Applaus] DAN: All righty. Så jeg vil tale om en anden bred vifte af idéer fra den klasse, der er groft repræsentant for uge to og starten af ​​uge tre starter ud med støbning, der er bare en måde at behandling af en værdi af en bestemt type, som en værdi af en anden type. Så vi kan gøre dette med tegn til int'er, flåd til int'er, og lange længes til det dobbelte. Alle disse ting kan bruges som måder til behandling af nogle numeriske værdi minus char som nogle andre numerisk værdi. Så der er nogle problemer med dette, af kursus, som kommer, når du kaster ting som float til int'er. Så det er lidt underligt. Vi har en svømmer, som er 1,31. Vi formere den ved 10.000. Og så skal vi udskrive det som en int. Hvad betyder dette output? 10.000 gange 1,31. Så 13.000, er, at gætte? Publikum: Jeg tror, ​​det er 10.000. DAN: Så jeg multiplicere det med 10.000 før jeg kaster den. Publikum: Oh. Ville der ikke være en 9 og nogle 0 tal? DAN: Du har måske nogle underlige cifre. Så lige, det er 1,3 gange 10.000. Så det er 13.000. Og denne ekstra weird-- Publikum: 13.100. DAN: 13.100. Tak, Rob. Og denne ekstra weirdness-- dette 9,9-- er simpelthen fordi denne støbning endte afrunding hvor det bør ikke have. Ja. PUBLIKUM: Støbningen sker efter noget andet? DAN: Så fordi jeg har dette på tryk, det gør denne multiplikation, før det gør denne støbning. Publikum: [uhørligt]. DAN: Jeg tror, ​​det ville kaste først, yeah, hvilket ville være 10.000. Noget andet? Fedt. Så dette er 13.099. Hvorfor sker det? Unøjagtighed. Flydere er ikke perfekte. De kan kun repræsentere tal til en vist antal betydende cifre. Så hvis vi udskrive 8 signa figner på denne float, får vi en slags grimme leder nummer. Og det er fordi 1,31 kan ikke præcist være repræsenteret ved simpel beføjelser to i maskinen. Så det ender med at tage den nærmeste gætte, der ender være lidt lav. Mening? OK. Nu tændes er en anderledes måde at gør betingede sætninger, hvor alle vi interesserer os er en enkelt variabel. Så i dette eksempel, er vi få et helt tal fra brugeren. Og så ser vi på hvad det er heltallet. Formentlig er det antal mellem én og fire. Det er, hvad vi beder om. Så du gør en switch af variabelnavnet. Så kan du oprette tilfælde af mulig værdier, det kunne være. Så tilfælde man siger det er lavt. Og så bryder du at komme ud af switch tilstand, du ikke holde ud. I næste case-- så tilfælde to og sag three-- hvis det er tilfældet to det bare falder ned til den første linje kode det opfatter som med case tre, indtil den ser en pause. Så grunden til at du får tilfælde en til kun udskrive lav er fordi jeg har denne pause her. Hvis jeg, siger, ignoreret dette break-- hvis jeg kastede denne breakaway-- det vil trykke lav, og det ville udskrive midten, og så ville det gå i stykker. Så pauser er en vigtig del af skifte betingelser og de skal være der. Eventuelle sager, der ikke udtrykkeligt nævnt håndteres af standard tilfældet i kontakten og skal kastes. PUBLIKUM: Så 1, 2, 3, og 4 vil være n? DAN: Værdier, n kan være. Ja. Ja? PUBLIKUM: Så når du har at [uhørligt]? DAN: Du ville udskrive lavt, og derefter det ville udskrive midten, og så ville det bryde. Publikum: Hvorfor skulle udskrives midten, hvis [uhørligt]? DAN: Så alt under en sag før en pause falder ind under. Så tilfælde en udskrift er nedenunder sag en som er det følgende print. Ja? Publikum: [uhørligt]? DAN: Så dette nummer er blot et særligt værdi, at denne variabel kan tage, ikke? Giver det mening? Ja. Publikum: [uhørligt]? DAN: Ja, sag to ville udskrive midten og derefter bryde. Publikum: [uhørligt]? DAN: Jeg tror nogen? Hvilke andre datatyper kan du skifte over? Publikum: Du kan skifte i forhold til eventuelle datatyper. Men det betyder kun noget over tegn og int'er og den slags, da hvis du skifter over en pegepind der ikke rigtig mening, skifte over belastninger, hvis det endda lad os du gør det, på grund af floating point i præcision, ville du ikke rigtig ønsker at gøre det alligevel. Så temmelig meget, blot int'er og tegn og den slags. DAN: Ja, det er, når du har eksplicit værdier, som du ved, jeg tror, ​​kan være at en switch er faktisk nyttigt. Godt? OK. Scope er det interval, en erklæret variabel strækker sig. Så i denne lille bid af kode, jeg har, det ville være fuld af fejl. Og årsagen er jeg erklærede denne int I inden for omfanget af denne for-løkken. Og så prøver jeg at henvise til, at Jeg uden for denne for-løkke rækkevidde. Så dybest set, kan du tænke rækkevidde som noget, du erklære med inde i et sæt krøllede parenteser kun eksisterer inden for disse krøllede parenteser. Og hvis du prøver og bruge denne variabel uden for disse krøllede parenteser, vil du får en fejl fra compileren. Ja? PUBLIKUM: Så denne ene ikke virker? DAN: Det virker ikke, ja. Strenge. String en char *. De er nøjagtig det samme. De er blot pegepinde til tegn. Og alle strenge, som du har skulle ende med omvendt skråstreg nul, hvilket er lige a c konvention. Det kaldes NULL terminator. Og NULL-- hovedstad N, hovedstaden U, kapital L, kapital jeg-- er ikke det samme som det NULL terminator. Dette er en pointer. Dette er et tegn. De er meget forskellige. Husk det. Det vil være på quizzen, sandsynligvis. Jeg har ikke set quizzen. Ja? PUBLIKUM: Så NULL er, siger, markøren? DAN: Ja. PUBLIKUM: Hvad betyder [uhørligt]? DAN: Hvis siger, er malloc kaldes, når du ikke har nok hukommelse til at få uanset størrelse, du beder om, malloc vil returnere NULL. Det er, dybest set, når en funktion er formodes at returnere en pegepind, du nødt til at tjekke mod NUL fordi NULL er en smuk god-- det er, en slags, skraldet værdi. Det er et nul så langt som pejlemærker gå. Når du kalder en funktion, der returnerer en pointer. Du vil ønsker at tjekke for at være sikker på, at denne pointer er ikke NULL fordi NULL er meget almindeligt. Det er en slags skrald afkast. Så hvis noget ikke gå til højre, bare returnere NULL i stedet. Publikum: [uhørligt]? DAN: Ja, og det er dette. Publikum: [uhørligt]? DAN: Stav det som dette. Det er NULL terminatoren. Det er små bogstaver N-U-L-L, hvis du stave det. Publikum: Og jeg gik bare tilbage og testede det. Og hvis du prøver at sætte et decimaltal værdi ind i en switch, vil det råber på dig sagde erklæring kræver udtryk af heltal type. DAN: Værsgo. Men ja, hvad var spørgsmålet igen? Publikum: [uhørligt]? DAN: Så hovedstad N, hovedstaden U, kapital L, kapital L er et virkeligt C ting. Det er NULL-pointer og vil kun behandles som sådan. Du vil ikke nogensinde forsøge og stave NULL karakter og se nogen anden måde end dette. Ja? PUBLIKUM: Så vender tilbage til char max eller noget i noterne, ville det inkarnere den samme funktion som [uhørligt]? PUBLIKUM: Så er du henviser til returnering char max fra getchar, eller uanset hvad det er? Publikum: Ja. PUBLIKUM: Ja, så den generelle betegnelse for alle disse ting er sentinel værdier. Så ligesom vender tilbage int max fra GetInt og char max fra getchar, det er formodes at være ligesom, okay, hvis disse ting vender tilbage til os, noget gik galt. For pegepinde, vi bare tilfældigvis har denne sentinel værdi, at alle enig om. Og dette er den ting du vender tilbage når tingene går galt. Så char max er hvad vi bruger at repræsentere noget ligesom NULL eller getchar. PUBLIKUM: Så hvis du tester getchar, kan du bare sætte NUL? Ville det gøre en forskel? DAN: Du kunne ikke lige tjekke NULL. Du er nødt til at kontrollere char max fordi returværdi fra funktionen er et tegn ikke en pointer. Ja? Publikum: Dette spørgsmål spørger efter strengen længde. Er der omfatter NULL karakter? DAN: Nej Og det er faktisk hvordan strenglængde kender til at stoppe, fordi det går gennem Deres vifte af tegn, indtil det ser en null-tegn. Og så er det ligesom, alle Okay, jeg er færdig. Publikum: [uhørligt] fem? DAN: Hej ville være fem. Yep. Så arrays kontinuerlig blokke af hukommelse. De har øjeblikkelig adgang ved at sige navn på den array og derefter i krøllet seler, uanset indeks, du vil gå at, de er indekseret fra nul til længden af ​​array minus 1. Og de er anmeldt af den type ting, som du opbevaring i matrix, navnet på arrayet, og derefter uanset størrelsen er af denne matrix. Så dette er en char array af længde seks, der har disse værdier. Ja? Publikum: [uhørligt]? DAN: Ja. Publikum: [uhørligt]? DAN: Hvis du har, hvad der foregår i array allerede. Så du kan specificere dette i stedet som, sige, fjeldørred, uanset navnet på din array er tomme parenteser lig krøllet afstive H komma E komma L komma L komma O komma NULL karakter og krøllet parentes. Det ville også virke som en erklæring. Publikum: [uhørligt]? DAN: Så skal du have størrelse allerede. Publikum: [uhørligt]? DAN: Ja. Alle righty. Kommandolinjeargumenter er en måde at få input fra brugeren som argumenter til main. Vigtigste tager to argumenter. Antallet af argumenter, der bliver føres langs kommandolinjen og en streng vektor eller et strengtabel af alle de argumenter. Så hvis jeg, siger, kaldes en funktion, såsom en prik ud 1 rum, 2 rum, tre, argc ville være 4. Og argv 0 ville være en prik ud. Argv1 ville være 1. argv2 ville være 2. argv3 ville være 3, i dette særlige tilfælde. Ja? Publikum: [uhørligt]? DAN: Det sidste element i array fordi array er længden argc plus en af ​​arqB, det sidste element er NULL-pointer. Det er argc plus 1. Så i tilfælde af, at jeg lige har sagt, det ville blive argv 0 er en prik ud. argv 1 er 1. argv2 er 2. argv 3 er 3. argv 4, der er en større end argc ville være NULL. Og det er NULL-pointer. Ja. Og det er fordi strengen er en char stjerne er en pointer. Så det skal være den samme type. Ja? Publikum: To spørgsmål. Så man, hvad er forskellen mellem denne og andre end én type getString i brugerens motor? Og to, gemmes i Deres seneste hukommelse? Så ligesom, getString ville være [uhørligt]? DAN: Hvor er det opbevares? Jeg ved ikke, hvor den er gemt. PUBLIKUM: Så faktisk, du ved, hvordan nogen funktion, du kalder det er argumenter gemmes i stakken? Så argc og argv er argumenter til main og de er på stakken, eller virkelig lige over, hvad du mener som starten af ​​stakken. Hvad var den anden del af spørgsmålet? PUBLIKUM: Så hvad er [uhørligt]? DAN: Ja, det er bare en anden måde for at få input fra brugeren. Denne ene er lidt mere effektiv og det er mere handy for scripts, fordi du kan bare passere argumenter til din primære funktion snarere end at skulle vente for brugere, hvis du ikke har nogen brugere. PUBLIKUM: Og ja, få strygere ville være [uhørligt]. Det ville gemme de ting, du har brug for. DAN: Ja? Publikum: [uhørligt]? DAN: Ja, argv 0 altid omfatter prik skråstreg af funktionen opkald. Ja? Publikum: [uhørligt]? DAN: Ja, hver af argumenterne er endte i null-tegn, fordi de er strenge. Publikum: [uhørligt]? DAN: Ja, argv argc er en NULL-pointer. Publikum: [uhørligt]? DAN: Oh yeah. Ja, undskyld. PUBLIKUM: Så [uhørligt]? DAN: Så spørgsmålet er, hvis du havde kommandolinje prik skråstreg en prik ud 1, 2, ville antallet af kommandolinjen argumenter være to eller ville det være tre? PUBLIKUM: Jeg tror det ikke virkelig ligegyldigt. Jeg plejer at sige, åh, du ikke passere eventuelle kommandolinjeargumenter når selvfølgelig, du kaldte funktionen. Så jeg har en tendens til vokalt udelukke funktion fra kommandolinjen argumenter, selvom det er inkluderet i argv. DAN: Men hvis det var på test-- yeah-- og også hvis du siger noget ligesom argc lig med 3, du er i sikker stående. Ja? Publikum: [uhørligt]? DAN: Jeg tror, ​​at hvis stedet for at kalde dette i argc og string argv parentes men holdt de samme typer og blot kaldes dem noget andet som en og B, ville det stadig arbejde? Og det ville stadig arbejde, du ville bare-- stedet for at bruge argc-- du ville bruge a og b. Ja? Publikum: [uhørligt]? DAN: Så spørgsmålet er getString er skal opbevares hukommelse i bunke fordi getString er char *. Den gemmer hukommelse i den bunke, fordi det Nu kalder malloc inden den faktiske implementering af getString. OK, bevæger sig på. Sikkerhed. Så for at være virkelig sikker, du stole på nogen en, og du tillader ingen adgang til nogen af dine oplysninger, hvilket er grunden alle bygger deres egne maskiner, deres egne styresystemer, alle deres programmer fra bunden, og naturligvis ikke forbindelse til andre maskiner via internettet. Så computere er usikre. De virkelig er. Vi er nødt til at stole på andre mennesker. Og tanken om at sikkerhed er, at du er forsøger at begrænse mængden af tillid til, at du har brug for. Og et af de midler du gøre det er gennem kryptering. Kryptografi er det væsentlige, vi har hemmeligheder. Nogle gange er vi nødt til at passere vores hemmeligheder sammen igennem, siger, internet eller andre ting. Og vi ønsker ikke folk at kende disse hemmeligheder. Så vi kryptere vores hemmeligheder i en måde at vi håber ingen kan regne ud. Så vi used-- gennem løbet af denne klasse-- ting som Cæsar cipher og [Uhørlig], som begge er meget, meget usikre måder at kryptere ting. De er nemme at regne ud, hvad de er, og hvad dine hemmeligheder er. Den virkelige verden bruger meget mere komplicerede kryptering ordninger. Og vi vil ikke komme ind meget mere end det. Debugging. GDB er bedst. Jeg har tænkt mig at understrege dette igen. Brug GDB hele tiden hver gang du har et problem. Kommandoer, der er nyttige i GDB, er knække, hvilket du passerer enten en linje nummer, en funktion navn, hovedsageligt hvor i din kode du ønsker at stoppe, og være i stand til at tage kontrol. Udskriv tager en variabel og udskriver hvad denne variabel er på dette punkt i din udførelse. Næste flytter din henrettelse langs et trin. Og trin trin inde i en funktion i din udførelse. Andre ting er kørt, som er, hvordan du faktisk køre din kode. Fortsæt tager alle de nødvendige skridt for at komme til næste knækpunkt. Og der er mange, mange andre. Slå dem op. De er store. Ja? Publikum: [uhørligt]? DAN: Ja, der er en debugger. Så en debugger er et program, lader dig debug dit program. Det er ikke et program, der finder fejl for dig, ville dog, at være stor. Og sidst for mig er søgning. Så de typer af søgning, som vi talte om i denne klasse er lineær søgning, der er bare, at man ser gennem hver element i søgerummet, en element ad gangen, indtil du finder det du leder efter, eller indtil du når slutningen af ​​din søgning rum, hvor punkt du siger, at du ikke kunne finde det element, som du ledte efter. Og dette finder i bedste konstant tid, der er 0 1 og i værste lineær tid, hvilket er 0 n. Binær søgning, som skal beskidte elementer. Du går til midten af ​​dine elementer, se, om det element, du leder efter er større eller mindre end bestanddelen at du er på midten. Det er det større, siger du, at bunden af din søgning plads er din aktuelle placering i midten, og du genstarter processen. Hvis det er mindre, du ser sige at det-- Ja, hvad sker der? Publikum: [uhørligt]? DAN: Ja. Enhver form for sortering, der er blevet undervist i klassen er fair spil til testen. [Latter] DAN: Og det faktum, at du ikke har haft at gøre det for et problem, sæt, det er fair spil til testen. Publikum: Kan vi gå over det, hvordan til-- DAN: Det vil blive gået over. SPEAKER 2: Selve koden for [Uhørligt] er på study.cs50.net. Så hvis du ser på praksis problemet i fletningen slags side study.cs50.net, der er koden til gennemførelse fusionere slags. Så du behøver ikke nødt til at gennemføre det selv i aften. Men sørg for at du forstår det snarere end blot huske det. Publikum: [uhørligt]? SPEAKER 2: sammenfletning slags side study.cs50.net, der er en praksis problem, hvis du klikker gennem problem, til allersidst er der en løsning, som er sammenfletningen sortere gennemførelse. Men sørg for at du forstår det snarere end blot at huske det eller kopiere det ned. Publikum: Og et fuldgyldigt problem for eksamen ville være noget lignende her er en liste. Hvad betyder denne liste se ud efter et skridt af markeringer slags eller indsættelse sortere eller hvad. Et komplet iteration af listen. Så selvom du ikke ender med at skulle kode til det, er du nødt til at forstå det nok til at vide, hvordan det går at ændre dette array. DAN: Det er det for mig. [Applaus] LUCAS: Hej alle. Mit navn er Lucas. Jeg har tænkt mig at tale om rekursion, alle den slags, som vi har lært, og en lille smule af alle markører. OK? Så først og fremmest, rekursion. Hvad betyder det at sige, at en funktion er rekursiv? Publikum: Kalder sig. LUCAS: OK, kalder sig selv, ja. Så ligesom dette billede, for eksempel. Det er som på billedet inde af et billede og så videre. Så for eksempel, kan du have-- som Dan der talte om binær søgning. En måde, hvorpå binær søgning er rekursive er det faktum, at du er forsøger at finde et nummer. Så du går til midten. Og så skal du tjekke, om tallene dér i venstre og højre. Og så hvis du finder ud af antallet er vil være på venstre side, det er det samme ting som at gøre søgningen igen, men lige på venstre side af listen. Så det er sådan det lyder ligesom det er rekursiv. Så det er derfor, du fyre har rekursive løsning for sammenfletning slags. OK, så her er et eksempel. Så lad os sige, at jeg ønsker at vælge alle tallene fra 1 til n. Jeg kan indse, at summen af ​​n nummer er n plus n minus 1 til 1. Men så, hvis jeg ser på n minus 1 plus n minus 2 plus 1, der er den samme ting som opsummering numre op til n minus 1. Så jeg kan sige summen af ​​et lige beløb lig n plus summen af ​​n minus 1. Giver det mening? Og jeg ville også have noget andet kaldet base case, som er, at summen af ​​de tal op til nul ville være nul. Så så snart jeg kommer til det antal nul, jeg ophører med at tælle. Giver det mening? Så her er et eksempel på, hvordan Jeg kan gennemføre det. Så jeg har denne funktion i nogle. Det tager et heltal n. Så her jeg først kontrollere, om n er mindre end eller lig med nul. Så hvis det er mindre end eller lig med nul, jeg returnere nul, som er vores base case. Ellers kan jeg bare returnere n plus summen af ​​tallene fra en til n minus en. Mening? OK. Så her er hvad det ser ud. Du har sum af 2 ligemænd 2 plus et beløb på 1. Og nogle af 1 er 1 plus summen af ​​0, hvilket er 0. Mening? Så hvis vi ser på stakken af ​​din program, det er hvad det ligner. Først har vi den primære funktion. Og derefter den vigtigste funktion kaldet sum 2. Og så sum 2 kommer til at sige, åh, sum 2 er lig med 2, plus summen af ​​en. Så jeg tilføje beløb på 1 til stakken. Og summen af ​​1 kommer til at kalde summen af 0, hvilket også vil blive tilføjet til stakken. Og så hver af disse dem, der er oven på en anden er nødt til at vende tilbage før de andre kan holde ud. Så for eksempel her summen af ​​0, først, vil vende tilbage 0. Og vælg derefter beløb på 1. Så summen af ​​1 kommer til at tilbage 1 til et beløb på 2. Og endelig, summen af ​​2 går at returnere 3 til main. Giver det mening? Det er virkelig vigtigt at forstå, hvordan stakken fungerer og forsøge at se, om det giver mening. OK, så sortering. Så hvorfor sortering vigtigt, først og fremmest? Hvorfor skal vi bekymre os? Anyone? Giv mig et eksempel? Ja? Publikum: [uhørligt]. LUCAS: Ja, OK. Så du kan søge mere effektivt. Det er en god måde. Så, for eksempel, har vi en masse ting, faktisk i vores liv, sorteres. F.eks ordbøger. Det er meget vigtigt at have alle ord i en slags for at vi kan få adgang til nemt. Så det er, hvad han sagde. Du kan søge mere effektivt. Tænk på, hvor svært det ville være at have en ordbog hvor ordene er i tilfældig rækkefølge. Du bliver nødt til at se på, temmelig meget, hvert eneste ord, indtil du finder den ord, du leder efter. Hvis du bruger Facebook også, når du kigger på dine venner, er du kommer til at se, at Facebook sætte dit tættere vens oven på dem at du ikke taler med så meget. Hvis du går hele vejen til bunden af din venneliste, du kommer til at se folk, at du sandsynligvis ikke engang huske, at du er venner med. Og det er fordi Facebook sorterer dine venner baseret på, hvor tæt du er på dem. Så organisere data. Også Pokemon. Så du se, at alle Pokemons har numre. Og det er som en nem måde adgang til data. Publikum: Adgang Pokemon. LUCAS: Ja. Publikum: [uhørligt]. LUCAS: Jep. OK, så udvælgelse slags. Valg slags kommer til at vælge den mindste usorteret værdi af en liste hver gang i hver iteration. Det er lidt ligesom den slags, som du gør i dit hoved, når du forsøger at sortere en liste på hånden. Dybest set, alt du skal gøre er, at du ser til det mindste antal. Du sætter den i det sorterede liste. Og så skal du kigge efter den næstmindste antal. Og så skal du holde gør der og så videre. Så valg Sorter er dybest set dig vælger, hver gang den mindste usorteret værdi. Sæt i slutningen af ​​den sorteres en del af listen. Og holde gør det. Så lad os hurtigt se, hvad dette ligner. Så her er den sorteres og usorteret liste. Så for den sorteres i listen, Det er i første omgang tom. Og så jeg har tænkt mig at vælge mindste antal her, hvilket er 2. Så jeg får nummer 2, og jeg sætter i den forreste del af listen. Og så vil jeg kigge efter den næstmindste element, som er 3. Så jeg sætte det i slutningen af sorteret liste. Og så vil jeg holde gør det. Jeg finde 4 og sætte det i slutningen. Find 5 og sætte det i slutningen. Og se på, hvordan alle disse tider, Jeg siger sætte det i slutningen er, dybest set, bytte to værdier. OK? Og så den sidste, du bare har endnu et element. Så det er allerede ordnet. OK, så indsættelse slags. Indsættelse slags du vil også have at ting at have en sorteret og en usorteret liste. Det eneste er, at hver gang der du tilføjer et element til det sorteres liste, skal du blot vælge det element, er foran usorteret liste. Og så du kommer til at finde, hvad stilling det bør være i det sorterede en del af listen. Lad os se hvad det er så dette giver mere mening. Så i første omgang, for eksempel, jeg prøver at indsætte nummer tre i sorterede del af listen. Så listen ikke har noget. Så jeg kan bare sætte tallet 3. Nu ønsker jeg at føje nummeret 5 til det sorterede del af listen. Så jeg ser på nummer 5. Jeg bemærker, at det er større end 3. Så jeg ved, at det har at være efter 3. Så jeg sætte 3 og 5. Så jeg ønsker at indsætte nummer 2. Jeg bemærker, at nummer 2 er faktisk vare så både 3 og 5. Så jeg faktisk nødt til at sætte det hele måde i begyndelsen af ​​listen. Så jeg er nødt til, slags, flytte alle de elementer i sorteret liste, så jeg kan gøre plads til nummer 2. Så vil jeg se antallet 6. Jeg kan se, at det skulle være efter 5. Så jeg sætte det der. Og endelig, jeg ser på nummer 4. Og jeg bemærker det bør være mellem 3 og 5. Og så sætter jeg det der, og skift alle de andre elementer. Mening? Bubble Sort. Så boble slags er dybest set, hvad du er kommer til at do-- vi kalder det boble sortere fordi du går gennem list-- det er faktisk bedre, hvis jeg viser bare du kan lide denne-- og du kommer til at sammenligne tilstødende numre. Og du kommer til at bytte deres positioner, hvis de ikke er i den rigtige rækkefølge. Så dybest set, hvad der foregår på ske er her, for eksempel, du har 8 og 6. Du ved, at det sorterede ordre vil faktisk være 6 og 5, højre? Så du kommer til at bytte de ordrer. Så ser jeg 8 og 4 her. Og jeg gør det samme. Jeg bytter igen. Og endelig, 2 og 8. Jeg også bytte dem. Det hedder Bubble Sortér fordi efter hver af disse gentagelser, faktisk det største antal på listen får alle vejen til enden af ​​listen. Giver det mening? Fordi det holder bytte det og flytte den til højre. OK, så dette er den anden iteration. Det ville være det samme. Jeg vil gøre en swap og derefter den sidste. Jeg, at der ikke er nogen swaps og listen er sorteret. Så i Bubble Sorter, vi dybest set holde at gå gennem listen og bytte ting, indtil jeg bemærke, at jeg ikke gjorde eventuelle swaps gør at iteration, som betyder, at listen allerede er sorteret. Mening? Lad os snakke lidt om køretid. Så tror du fyre huske Big O, Omega, og Theta? Ja? OK, hvad er Big O, først og fremmest? Publikum: [uhørligt]. LUCAS: Ja, det hedder et worst case runtime, hvilket blot betyder, at det er hvor meget du forvente, at programmet at tage til at køre. Ligesom i form af-- i denne case-- n. Antallet af elementer i liste i værste fald. Ligesom i det værst tænkelige tilfælde. Så for Bubble Sorter, for eksempel Vi har store O n firkant. Hvorfor har vi det? Hvorfor er Bubble Sorter Big O n firkant? Publikum: [uhørligt]. LUCAS: Ja, så det værste tilfælde vil være at jeg bliver nødt til at gøre n iterationer. Så hver af iterationer vil bringe det største element til enden af listen. Så det værste tilfælde er, at jeg har at gøre det ting n gange. Og for hver af de gange, jeg er nødt til at gøre n swaps, fordi jeg er nødt til at sammenligne hver to elementer. Så det er derfor, det n kvadreret fordi det er n gange n. Derefter valg Sorter er også n firkantet fordi der for hver iteration, jeg er nødt til at se på hvert enkelt element på listen. Og derefter finde den mindste, hvilket betyder, at jeg er nødt til at se gennem n elementer. Og jeg er nødt til at gøre, at n gange, fordi Jeg er nødt til at vælge alle de n elementer. En indsættelse slags er også n firkantet fordi det værst tænkelige scenarie vil være én, jeg er nødt til at indsætte n tal, right? Så jeg ved allerede, at jeg har tænkt mig at have n iterationer. Men for hver af disse numre, hvis jeg havde at se på alle tallene i det sorteret liste og sætte det hele vejen i front, vil det være n firkantet fordi det vil være n gange n igen. Mening? Hvad med omega? Publikum: [uhørligt]. LUCAS: Det er i bedste fald. Så det er ligesom i en masse gange for sortering, i bedste fald er når listen allerede er sorteret. Så du behøver ikke rigtig har at gøre noget. Bubble Sortér har den bedste case scenario af n. Har du fyre vide hvorfor? Publikum: [uhørligt]. LUCAS: Ja, hvis du holder styr på hvorvidt data ration havde nogen swaps eller ikke, ligesom hvis du har noget sat til tilfældet, hvis der var en iteration, hvis Listen er allerede sorteret, dybest set, hvad der kommer til at ske, er jeg har tænkt mig at prøv at bytte hver to tilstødende elementer. Jeg har tænkt mig at se, at der er ingen swaps. Og jeg bare tilbage med det samme. Så det betyder, at jeg bare var nødt til gå gennem listen én gang. Så det er n fordi jeg ser på n elementer. Hvorfor udvælgelse sortere n Square? Ja, selv om listen er sorteret for hver iteration af udvælgelse slags, jeg nødt til at vælge det mindste element. Så det betyder, at jeg har ud for at se på alle elementerne i usorteret liste og finde den mindste for hver iteration. Giver det mening? Og indsættelse sværd er N fordi det i tilfælde at jeg forsøger at indsætte numre og alle de tal, når jeg forsøger at indsætte dem, jeg se, at de er i den rigtige position. Jeg behøver ikke at gå tjekke alle de andre numre i usorteret liste. Så det er derfor, det vil være n. Mening? Og hvad er theta? Publikum: [uhørligt]. LUCAS: Hvad, undskyld? Sig det igen. Publikum: [uhørligt]. LUCAS: Præcis. Så du kan se, at kun udvælgelse lagret i Flet slags har thetas. Og det er fordi du kun har theta hvis både Big O og Omega er de samme. OK. Og endelig, flette art er, i logn. Og så, som Dan sagde, Flet slags er lidt ligesom på samme måde som du gør binær søgning. Så får du listen. Og du kommer til at skære i halve. Og så skal du skære dem i mindre halvdele. Og så skal du flette dem. Du fyre huske, ikke? OK, da han sagde. OK, pointere. Så hvad er en pointer? Publikum: [uhørligt]. LUCAS: En adresse. OK. Jeg ved, at David viser en flok videoer af Binky og ting, der peger hinanden. Men jeg kan lide at tænke på pegepinde som blot en adresse. Så det er en variabel, der går at lagre en adresse. Så det er bare denne særlige variabel der er fire bytes langt. Husk, at pointer til noget er altid fire byte længe for vores 32-bit maskine, så tilfældet med apparatet. Og det har bare lokationen af en variabel inde i den. OK, så der er denne hukommelse, dybest set. Så hver blok af hukommelse har faktisk en etiket, som er adressen på den slotty hukommelse. Så det betyder, at jeg kan have en pegepind, der peger på enhver af disse adresser. Så grunden til, at vi vil bruge pegepinde er hvis jeg er nødt til at huske placeringen at en bestemt variabel er en hukommelse. Og jer huske, at en af ​​dem sager var, hvis jeg har en funktion hvis jeg har faktisk vil have dig til bytte for reals, jeg faktisk nødt til at sende en pegepind. Ikke variablen. Har du fyre huske det? Forskellen between-- hvad er navnet? Opkald efter værdi og kalder ved henvisning, right? OK, ja. Så ring efter værdi. Når du bare sende en variabel til fungere du bare sende en værdi. Så du faktisk sender en kopi af den variable. Og dit program kunne ikke pleje mindre om, hvis den samme variabel faktisk gør en kopi. Og ringer ved henvisning betyder, at Jeg er faktisk at sende en kopi af det pointer til denne variabel. Så det betyder, at jeg sender den Placeringen af ​​denne variabel. Så fornemmer jeg har placeringen af variabel, når jeg kalder funktionen med pegepinde, jeg er i stand til rent faktisk at ændre de data, der var i main. Mening? Selv om markøren er en kopi, den pointer stadig har den rigtige adresse på den variabel, jeg ønsker at ændre. Mening? Så skaber pointere. Husk, markøren altid har den type, som det peger til og derefter en stjerne. Og så skal du sætte navn. Så husk, at når du har uanset stjerne, det er ligesom en pointer til at uanset variabel skrive, at du havde. Så her i stjerne, for eksempel, er det en pointer og et heltal. Og så char stjerne er en pointer char stjerne og så videre. Ja? Publikum: Hvad hvis vi har en pointer til n til stjerne på x. Jeg ved, der skaber en pointer til x. Er det også erklære x et heltal? LUCAS: OK, så når du siger n stjerne x, du er ikke at skabe en pointer til en variabel x. Du opretter en pegepind hedder x. Publikum: [uhørligt]. LUCAS: Så når jeg siger n stjerne x, jeg er sige, hey, i hukommelsen, vil jeg få en af ​​disse tre bokse. Og jeg har tænkt mig at sige, at det bliver x, hvilket er kommer til at være en pegepind. Og noget af interesse, pegepinde er, at vi siger, at de har 4 bytes for en 32-bit maskine. Og grunden til det er, fordi 4 byte er 32-bit. Og maskiner, der er 64 bits faktisk har pointere adresser som er 64 bit lange. Så det betyder bare, at størrelsen af ​​den adresser i maskinen er anderledes. Så Referer og dereferere. Der er to operatører, der jer skal huske. Den første er tegnet. Den anden er stjerne. Bliv ikke forvirret af denne stjerne og dette Star, fordi huske, at i dette tilfældet, har du n stjerne. Det er ligesom et hele sammen. Der er ingen n plads stjerne. Så det betyder, at det er den type. Husk, at når du har den variable stjerne, er du taler om den type. Når du har bare stjerne og derefter navnet på variablen, betyder det, at du dereferere markøren, som betyder, at du kigger på den pointer, at finde den adresse, det er peger på, at gå til den adresse, og kigge på, når du har der. Så jeg fortæller mine elever, at når du har stjerne, bør du tænke, at det er forkortelse af indhold. Så hvis du har en pegepind, og du gøre stjerne pointer, det er indhold af markøren. Så du gå til hvad det peger på og se på den konstante indhold. Og tegnet er den samme ting som adresse. Så hvis jeg har en variabel et-- ligesom, lad os sige, at jeg gjorde int a er lig 3-- hvis jeg ønsker at finde adressen på det variabel en hukommelse, kan jeg bare gøre Ampersand en. Så det er adressen på en. Mening? Så her er et eksempel. Dette mangler int b og int c. Så int a er lig med 3 betyder, at Jeg har tænkt mig at gå til hukommelsen. Og jeg har tænkt mig at finde en slot og sætte tallet 3 her. Og så int B svarer til 4. Jeg har tænkt mig at gøre det samme. Gå til hukommelsen og sætte et nummer 4 i en af ​​kasserne. Og int lig 5. Find en anden boks og sætte et nummer 5. Så hvad er denne linje laver ud? n stjerne pa lig tegnet en. Så først og fremmest, n stjerne pa. Hvad laver den? Publikum: [uhørligt]. LUCAS: Ja, så n stjerne pa, første, erklærer en pointer kaldet pa. Og så er det at tildele værdien af at markøren skal være adressen på en. Så Ampersand en. Så, hvis jeg gør stjerne pb, hvad er en stjerne pb? Åh, undskyld. Dette er også mangler. n stjerne pb. Jeg mener stjerne pc. Jeg er så ked af det. Det er den samme ting. Men nu er jeg god ar skabe en pegepind til b og derefter en pegepind til c. Ja? Publikum: [uhørligt]? LUCAS: Ja. Så hvis du går til hukommelse og du går til den boks, der er designeret til pa, du faktisk kommer til at se en adresse på en. OK? Ja? Publikum: [uhørligt]? LUCAS: Ja, pointer er en adresse. Glem aldrig det. Det er ligesom det vigtigste del om pointere. Der er opbevaring og adresse til nogle variabel. Noget andet? Andre spørgsmål? OK. Så Pointers og arrays. Husk, at når jeg gør int matrix 3, Dybest set, hvad jeg gør, er jeg, venlig af, erklærede i en pegepind. Så array er slags ligesom en pointer til en bestemt sted i hukommelsen, hvor jeg tildelt tre pladser til heltal. Giver det mening? Så når jeg gør int matrix 3, hvad jeg gør, dybest set, er at skabe tre slots i hukommelsen. Så jeg bare finde tre pladser i hukommelsen. Så hvis jeg gør, så en stjerne array, det dybest set betyder indholdet af array, hvilket betyder at jeg slette markøren, går jeg til det sted, som det er at pege på, og jeg sætter nummer et. Og så, hvis jeg gør stjerne matrix plus 1, det er det samme som at gøre matrix beslag én, som bare betyder, at jeg går til det sted, at det peger på. Og så plus 1 mærker mig flytte en position. Så jeg går til denne position, faktisk, og sætte nummer to. Og så, endelig, når jeg gør matrix plus 2, jeg går til, hvor arrayets peger på. Og så vil jeg flytte til hukommelse blokke. Og så sætter jeg nummer tre her. Ja? PUBLIKUM: Så stjerne array er simpelthen siger den allerførste punkt. Og du kan tilføje 1, bare fordi vi er kun virkelig refererer den første adresse. LUCAS: Ja. Hvorfor har vi for eksempel sige matrix 0, array 1, og array 2? Jeg siger, hvorfor gør du 0, 1, 2, 3 i stedet for 1, 2, 3? En af grundene er, én computer programmører foretrækker at starte tælle fra 0. To er fordi når du gør matrix 0, det er det samme som at gøre matrix plus 0, hvilket betyder, at jeg går til denne stilling, og jeg gør ikke springe nogen hukommelse blokke. Så jeg tror ikke flytte nogen hukommelse blokke. Ja? Publikum: [uhørligt]? LUCAS: Så hun spørger, hvad der er forskellen mellem at gøre dette eller laver malloc. En af forskellene er, at int matrix 3 er at skabe et array på stakken. Og når jeg gør malloc, det skaber på den bunke. Giver det mening? Så hvordan gør malloc rent faktisk arbejder? Så hvorfor skal vi overhovedet bruge malloc? Din compiler slags tal ud alle de variabler, du har erklæret. Og han skaber plads til alle af dem i stakken. Så alle dine variabler går at være et sted i stakken. Så her er de miljøvariabler. Så dybest set, plads for disse variabler i hukommelsen er afsat på kompilere tid. Så det betyder, at din computer har at kende alle disse variabler forhånd. Det behøver ikke at vide, hvad værdi du kommer til at sætte i dem. Men det er nødvendigt at vide, hvordan meget hukommelse du har brug for. Men lad os nu sige, at for eksempel, du opretter en matrix eller tage en streng, som du tager fra brugeren. Du ved ikke, hvor længe strengen vil være, for eksempel. Så du ved ikke præcis, hvor mange hukommelse blokke du tildele, ikke? Så det giver ikke rigtig mening for dig at sige sætte 100 tegn. Og hvad så, hvis brugeren skriver 150? Du kommer til at blive skruet. Så dybest set, kan du ikke være sikker på, hvordan meget hukommelse du har brug for at afsætte når du kompilere programmet. Du skal bare vide, at der på køretid. Så det er derfor du har den bunke. Så bunke vil have hukommelse at du tildele under programmets varighed kører. Så dybest set, når du gør malloc, hvad du laver er allokering af hukommelse på runtime, hvilket betyder, at du er beslutter ret i det øjeblik, du skal have denne hukommelse. Så det er når du tildele den. Giver det mening? Så husk, stakken har variabler der er oprettet på kompilere tid. Og så den bunke har variabler der er skabt som du gå med allokere for eksempel. Publikum: [uhørligt]? LUCAS: So getString er vil kalde malloc. Lad mig tale om malloc, og Jeg forklarer getString. Så malloc er det samme som allokering af hukommelse. Så det kommer til at tildele hukommelse på den bunke. Og det kommer til at returnere en pointer til hvor at hukommelsen var tildelt på. Så når du do-- her for example-- n stjerne pointer. Og så pointer lig malloc størrelse tommer gange 10. Jeg skaber en pointer. Og så er jeg tildele denne pointer til værdien af ​​markøren at allokere giver mig. Så jeg beder malloc kan du tildele plads til 10 heltal. Det er, hvad det siger. Og malloc giver mig tilbage pointer til dette sted. Mening? OK. Jeg Og getString er, dybest set, gør en ringe til malloc, så du kan tildele hukommelse under runtime. Husk altid at tjekke for null fordi allokere vil returnere null hvis det ikke kan allokere hukommelse. Lad os sige, at du beder om en latterlig mængde hukommelse. Din computer er ikke til at være stand til at afsætte så meget. Så malloc er bare at returnere nul. Så husk altid at kontrollere, om pointer, som du fik fra malloc er null eller ikke, for hvis det er, kan du være dereferere en pegepind og forårsager bivirkninger fejl. Og endelig, glem ikke din gratis hukommelse. Malloc skaber hukommelse i den bunke. Og du er nødt til at frigøre hukommelse før programmet slutter. OK, det er alt for mig. Beklager, Rob. Tak. [Applaus] LUCAS: Nogle sidste spørgsmål før Rob kommer? Nej? Ja? Publikum: Jeg kunne ikke se denne ene online. Har du uploadet det endnu? LUCAS: Jeg tror Dave er uploade det snart. DAVE: Det vil blive offentliggjort. LUCAS: Det vil være online. PUBLIKUM: Det er op. LUCAS: Det er op? OK. Ja? Publikum: [uhørligt]? LUCAS: Ja, du skal befri alle hukommelse, der er sat i bunke. Publikum: [uhørligt]? LUCAS: Ja. Enhver tid, at du har en kultur malloc, du bør have en kultur fri efter at du stopper med at bruge denne variabel. Så malloc og fri er altid sammen. Deres bedste venner. Ja. Rob? ROB: Jeg vil gå hurtigt. Og også den video vil blive sat op. Jeg har den mikrofon på. OK, så uge fem ting. Første ting vi har, er stakken. Så husk, at der er kun én stak ramme per aktiv funktion opkald. Vi vil se, at i et sekund. Og også huske, hvad der faktisk går i hver stak ramme vil være de lokale variabler af vores funktioner, de argumenter, der er gået ind i vores funktioner, sammen med et par andre ting, du ikke rigtig behøver at bekymre sig om. Så her er et eksempel program, varsel, vigtigste er printfing afkastet værdi foo 4. foo er bare at returnere Værdien af ​​bar 4 komma 6. Og bar vil sætte nogle lokale variabel n svarende til 4 gange 6. Og derefter vende tilbage n. Så lad os se på stakken hele den faktiske iteration af dette program. Så der er i bunden af ​​vores stak. Husk, at stakken vokser op. Så i bunden af ​​vores stak, vi har en stak ramme til main. Når programmet starter, vigtigste vil altid være på bunden af ​​vores stak. Og hvad der er inde i vores stakramme til main? Så selv om der ikke er nogen lokal variable til main, som jeg sagde før, vi har argc og RGV optage plads indersiden af ​​hoved stakramme. Så vigtigste er nu at gå til kalder funktionen foo. Og det betyder foo vil få sin egen stakramme. Så nu er vi inde i funktionen foo. Og hvad der skal gå i foo stak ramme? Nå, foo har et argument n. Og n er lig med 4, da det er hvad vigtigste passerer som foo argument. Så nu foo kommer til at kalde bar. Hvad er bar kommer til at have inde af sin 'stak ramme? Det har x lig med 4 y lig med seks. Det er ikke alle, at vi er nødt til i stakramme fordi bar har også en lokal variabel n. Og n vi vil sættes lig med 24. Så nu bar kommer til at vende tilbage n. Så bar vender tilbage 24 til stakrammen foo. Og fordi bar vender nu tilbage, at betyder, at vi popping stakramme til bar fra i stakken. Så al den hukommelse, der bar havde været bruger, er nu fra stakken. Nu er foo også går at returnere 24 til vigtigste. Så nu, at foo vender tilbage, hukommelsen at foo brugte i sin " Væk er også stakramme. Og nu, hoved kommer til at kalde printf. Så printf er bare en anden funktion. Når vi kalder printf, går det at være en anden stak ramme for printf funktion opkald. Hvad er det vi passerer printf? Det er, hvad der kommer til at gå på stakramme. I det mindste, vi passerer at procent Jeg Backslash n og argumentet 24. Det kunne have mere i det stakramme hvis printf sker for at være at bruge nogle lokale variable. Vi ved det ikke. Men alle, der går i printf s stak ramme. Det kommer til at udføre printf. Så printf er gjort. Det vil vende tilbage. Endelig vigtigste er gjort. Main vil vende tilbage. Og så vores program er færdig. Ja? Publikum: Ser du [uhørligt] argumenter [uhørligt] parametre? ROB: Så der er en subtil forskel mellem argumenter og parametre. Og virkelig, i fælles tale, har en tendens folk at bare blande dem op hele tiden. Men parametre er det formelle Navnet på den ting. Så argc og argv er parametre til main. Argumenter er, hvad du rent faktisk passere i som disse parametre. Så der, når jeg ringer foo på 4, 4 er det argument jeg passerer ind. Og parameteren n indersiden af foo, tager på værdien 4 siden 4. var argumentet. Publikum: [uhørligt]? ROB: n er en lokal variabel til bar. n er stadig gælder for foo men Det er en parameter til foo. Det er ikke en lokal variabel. Ja? Publikum: [uhørligt]? ROB: foo er bare ringer bar og returnering Whatever Bar afkast. Publikum: [uhørligt]? ROB: Ja, bare for at se flere stakrammer. Ja? Publikum: Hvorfor blev foo kaldet før printf? ROB: Hvorfor blev foo kaldt før printf? Så jeg kunne have, i stedet gjort noget ligesom int x lig foo 4 og printes x. Men i stedet jeg kombinerede funktion anløbe printf argument. Men bemærk, at vi kan faktisk ikke udføre opkald til printf indtil vi regne ud, hvad foo af 4 er. Så vi kommer til at vurdere dette. Og kun en gang det er gjort går at komme tilbage og evaluere denne. Ja? Publikum: Da både bar [uhørligt] værdi, hvorfor vi ikke har [uhørligt]? ROB: De helt bør være int. Det blev ikke fanget i flere omgange. Så det burde være int bar og int foo da begge de vender heltal. Void er kun, hvis de ikke kommer at returnere de faktiske værdier. Ja? Publikum: Hvis du havde en linje over tilbagevenden [uhørligt]? ROB: En linje over afkastet? Publikum: Ja. Ligesom hvis du gjorde printf og [uhørligt] ville det udskrives to gange? ROB: Så indersiden af ​​foo? Hvis vi havde en printf lige her? Publikum: Ja. ROB: Så hvis vi havde en printf ret her, ville det udskrives én gang. Da vi ringer foo en gang til højre her, så vil vi ramt printf. Så vil vi ringe til baren. Og så foo vil vende tilbage. Og det er det. Vi har kun nogensinde støder printf én gang. Ja? Publikum: [uhørligt] printf kald foo, fordi vi er først kalder printf og så vi passerer argumenterne. ROB: Så i teorien, er ikke printf ringer foo? Så nej. Bare den rækkefølge, C kommer til at udføre disse ting er, før vi kan kalde en funktion, alle de argumenter til den funktion at fuldstændigt evalueret. Så er det helt evalueret? Ja, det er bare en snor. Det er bare en værdi. Så har vi helt evaluere dette. Når dette er gjort, nu alle sine argumenter evalueres. Og nu kan vi gøre det ringe til printf. Ja? Publikum: Et spørgsmål. Hvis du har en ugyldig funktion, skal du har tilbagevenden semikolon? ROB: Du behøver ikke en tilbagevenden semikolon hvis du har en void funktion. OK. Så nu nogle bunke ting. Så bunke er, hvordan vi kommer til at beskæftige sig med dynamisk hukommelse ledelse. Og dette er direkte i modstrid med den stak, som vi ville kalde automatisk hukommelse ledelse. Så på stakken, du aldrig rigtig har at beskæftige sig med, hvordan lokale variable bliver skubbet og dukkede alle disse stakrammer og alt det der. Du behøver ikke at bekymre dig om det. Det er automatisk. Så den bunke er manuel. Og [uhørligt] kommer fra disse funktioner malloc og fri. Så her er et andet program. Alt, hvad vi gør, er mallocing et heltal. Vi gemmer det i stjerne x. Selvfølgelig, vi er nødt til at kontrollere for at se, hvis x er nul. Så vi vil bare angive, hvad x peger på til 50. Udskriv hvad x peger på, print x, og derefter frit x. Så hvordan er dette rent faktisk kommer til at se hvis vi ser på vores stak og bunke? Så vi starter igen. Bunden af ​​vores stak som før. Husk, at dig bunke direkte imod stakken? Så vi bliver nødt til det øverst på vores bunke deroppe. Så bunden af ​​vores stak, har vi vores stakramme til main. Det har plads til argc, argv, og vi nu har en lokal variabel x, som er en int stjerne. Så vi kommer til at gentage gennem dette program. Første ting vi har, er et opkald til malloc. Så vi laver et opkald til malloc. Allokere er en funktion. Det kommer til at få en stak ramme. Hvad skal vi passerer at malloc? Det kommer til at gå inde af stakken rammen. Vi passerer størrelse af n, hvilket er 4. Så der er gået til malloc. Hvad betyder malloc gøre? Det griber os nogle plads på den bunke. Så vi kommer til at gå til den bunke. Og vi kommer til at få fat i 4 byte fra bunke. Så lad os bare give det en vilkårlig adresse. 0x123 Bare foregive, at er en adresse, der er på den bunke. Så hvad er egentlig inde i det region hukommelse på adressen Ox123? Garbage. Så vi har ikke gemt noget i det. Så så vidt vi ved, er det kunne være noget. Du bør ikke antage det er nul. Det er mest sandsynligt ikke nul. Så nu malloc afkast. Og hvad gør vi, når malloc returnerer? Vi sætter hvad den returnerer. Vi sætter x lig med hvad det tilbage. Så hvad er det at vende tilbage? Det vender tilbage 0x123 da det er den adresse på blokken hukommelse, som det netop tildelt i den bunke. Så returnere 0x123 x skal nu være indstillet svarende til 0x123, som billedligt, vi ofte trække så x med et virkeligt pil peger på den pågældende blok. Men x er bare opbevaring denne adresse. Så nu er vi nødt til at tjekke hvis x er nul. Det er ikke nul. Vi forestiller os at der malloc lykkedes. Så nu stjerne X er lig 50. Så stjerne husker det betyder gå til denne adresse. Så 0x123 Vi kommer til at gå til denne adresse. Så det bringer os deroppe. Hvad gør vi på denne adresse? Vi opbevaring 50. Så efter denne linje, det er, hvad tingene kommer til at se ud. Så nu er det ikke længere skrald deroppe. Nu ved vi, at 50 er i den bestemt adresse, fordi vi indstille den til det. OK? Så nu vil vi til at udskrive f. Så først vil vi udskrive stjerne x. Så hvad er stjerne x? Igen stjerne x betyder gå til ting at x peger på. Så x er lagring 0x123 Gå til det. Vi får 50. Så udskrive f det. Og det betyder, at det kommer til at udskrive 50. Og så der returnerer. Og så har vi den anden printf. Vi er nu procent s. Hvis du ikke har set det, det er bare hvordan du udskriver en pegepind. Så vi har procent i, procent f, og alle af dem, der allerede. Så procent p, udskrive en pegepind. Så x er en pointer. Så hvis vi skal til at udskrive x selv, vi udskriver hvad er faktisk inde x, hvilket er 0x123 Så den første print f kommer til at udskrive 50. Det andet tryk f går at udskrive 0x123 Ja? PUBLIKUM: Bruger du procent x for at udskrive en pointer? ROB: Så bruger du procent x for at udskrive en pointer? Så du kan, men procent x er bare, generelt, for ligesom, hvis du har nogle heltal og du vil udskrive det som en hexadecimal. Det er bare, hvordan du gør det. Ud fra følgende betragtninger procent d ville udskrives som decimal. Der har blev vi får procent d. i er lige heltal. procent p er specifikt til pointere. Så x er en pointer. Vi ønsker at bruge procent s. Men procent x kunne arbejde. Ja? Publikum: [uhørligt]? ROB: Ja. I det mindste for dette call-- så jeg har ikke taget det her. Men disse to argumenter er nødvendigvis Indersiden af ​​stakramme sammen med eventuelle lokale variable printf sker for at være bruger. Og så det næste opkald til printf nu indersiden af ​​printf stakramme er procent p omvendt skråstreg n og uanset værdi af x er, hvilket er 0x123. Ja? Publikum: [uhørligt]? ROB: Det vil udskrive noget der ligner dette. Publikum: [uhørligt]. ROB: Så det udskriver det i adresse formularen. Det ligner en adresse. Ja? Publikum: [uhørligt]? ROB: Hvorfor er hvad? Publikum: [uhørligt]? ROB: Hvorfor er denne pointer 4 byte? Så der er en hel masse af 0'er foran dette. Så det er virkelig 0x0000000123. På en 64-bit-system, der ville være en hel masse flere nuller. Ja? Publikum: [uhørligt]. ROB: Så den første printf vil print-- Publikum: [uhørligt]. ROB: Ja, det vil udskrive hvad x peger på. Stjerne siger, hvad er det ting peger på. Grib den. Så hvad er det peger på? 50. Grib den. Det er, hvad vi kommer til at udskrive. Henviser til, at den næste, vi er bare udskriver x selv. Hvad er der inde for f? 0x123. OK. Og så, endelig, vi har fri. Hvad skal vi passerer at befri? Vi passerer x. Den tid jeg faktisk viste det i stakken rammen. Så vi passerer værdien 0x123 at befri. Så nu fri ved, okay, Jeg nødt til at gå op til den bunke og gratis at hukommelsen. Det er ikke længere bruger hvad er på adressen 0x123. Så fri kommer til at frigive at der fra den bunke. Nu er vores bunke er tom igen. Vi har ingen memory leaks. Nu gratis vil vende tilbage. Bemærk, at x er stadig 0x123. Men det er nu ikke gyldig hukommelse. Vi bør ikke længere dereference x. Ja? PUBLIKUM: Er returnere 0 overflødig? ROB: Er returen 0 overflødig? Ja. Vi har lige sat det der, fordi vi har en tilbagevenden én efter luft. Så det er ligesom, ja, lader omfatter afkastet 0. Ja? Publikum: [uhørligt]? ROB: Så efter gratis x, hvad der sker, hvis vi forsøger at dereference markøren? Det er muligt, at noget går galt. Det er muligt, at vi stadig får 50. Det er muligt, også, at denne hukommelse er nu bliver brugt til noget andet. Så det er udefineret adfærd. Og udefineret betyder noget kan ske. Ja? Publikum: [uhørligt]? ROB: Nej, så hvis du tildeler x til noget andet. Så hvis lige her sagde vi x lig malloc noget else-- malloc størrelse event-- så den oprindelige blok hukommelse ikke er frigjort. Og vi har officielt mistet det. Det er en hukommelsesfejl. Vi har mistet alle referencer denne blok af hukommelse. Så der er ingen måde, vi nogensinde kan frigøre det. OK, så derefter returnere 0 betyder gjort. Okay, så stak overløb. Hvad er meningen her? Så husk, at bunke på vej ned. Stak er på vej op. Så det var eksemplet fra forelæsningen Jeg tror, ​​hvis vigtigste er bare at kalder denne funktion foo, som vil at kalde sig rekursivt igen og igen. Så stak rammer kommer til at arbejder nøjagtig det samme. Så vi vil til at begynde med de vigtigste som bunden stakramme. Derefter vigtigste kommer til at kalde foo, som kommer til at få en stak ramme. Derefter foo kommer til at kalde foo igen, som kommer til at få anden stakramme. Og så igen, og igen, og igen, og igen, indtil i sidste ende, vi løber i bunke. Så dette er, hvordan vi får en stak overflow. Og på dette punkt, du seg fejl. Eller ville du virkelig seg fejl før dette punkt, men ja. PUBLIKUM: Er kerne dumpe samme som seg skyld? ROB: Så du se segmentering fejl kerne dumpet. Du får en kerne dump når du seg fejl. Og det er ligesom et dump af alle de indholdet af din nuværende hukommelse, så at du kan prøve og identificere hvorfor du seg afbrudt. Ja? Publikum: [uhørligt]? ROB: Så en segmentering betyder fejl der er en stak overflow. Så ikke nødvendigvis. En segmenteringsfejl betyder, at du er rørende hukommelse på en måde, du bør ikke være. Så en måde for at sker er, når du stak overflow, begynder vi rørende hukommelse på en måde, vi ikke bør være. Ja? Publikum: [uhørligt]? ROB: Så inde i en uendelig løkke. Ligesom, det er ligesom en rekursiv uendelig loop og så vi får en anden stakramme hver gang. Men lige inden for en regelmæssig uendelig mens en-- Nå, lad os ikke endda udskrive F-- gøre noget. Uanset hvad. Vi kommer ikke til at være at få anden stakramme. Vi vil bare holde looping i denne enkelt instruktion. Stakken er ikke vokser. Det er det faktum, at hver rekursive opkald giver os en stak ramme. Det er derfor, vi får en stak overflow. Ja? PUBLIKUM: Så hvis du sagde at få mens loop og derefter [uhørligt]? ROB: Så hvis inde i while-løkken der var en printf, du stadig ville ikke seg fejl. Jeg vidste bare ikke lyst til at forvirre tingene. Det ville sløjfe. Du vil få en enkelt stak Ramme til printf. Så printf ville returnere. Så ville du sløjfe igen. Du vil få en enkelt stak Ramme til printf. Det ville returnere. Enkelt stakramme. Så du ikke får denne uendelige hober sig op stakrammer. Publikum: [uhørligt]? ROB: Ja. Så denne stakoverløb sker fordi ingen af ​​disse opkald til foo vender tilbage. Så hvis vi vender tilbage, så ville vi begynder at tabe stakrammer. Og så ville vi ikke stable overløb. Og det er derfor, du har brug for en base case for dine personlige funktioner. Ja? PUBLIKUM: Er den potentielle størrelse og stak til bunke det samme for alle programmer? ROB: Groft. Er den potentielle størrelse af stakken og dyngen den samme for alle programmer? Groft. Der er en vis randomisering til hvor stakken starter og hvor bunke starter. Hvis du tilfældigvis har en hel masse globale variabler og ting, kan du tage væk fra noget plads til din bunke. På et 64-bit system, du næsten har uendelig hukommelse. Der er bare så meget. Mellem 32 bit og 64 bit, at er en betydelig forskel. Du kommer til at få en hel masse mere stable og bunke plads på en 64-bit system, fordi der er bare mere adresser, som de kan bruge. Men på et individuelt system, vil det være omtrent den samme mængde af stakken og bunke plads. Okay. Så sidste ting er kompilering. Så du bør vide denne proces. Der er fire store trin. Så det første bør man være let at huske. Præ-behandling. Det har præfikset pre i det. Så det kommer før alt andet. De ting at huske er hash. Så hash definerer og hash omfatter i hver af disse. De er alle pre-processoren direktiver. Det er de ting, at de pre-processoren tager sig af. Så hvad gør en pre-processor gøre? Det er en virkelig dum ting. Alt det er i stand til, er alle disse kopiere og klippe og indsætte operationer. Så hash omfatter standard I0 prik time. Hvad er der at gøre? Det er opsigtsvækkende standard I0 prik h fil og indsætte den i toppen hvor det siger hash indeholder standard I0 prik timer. Og enhver hash definere, at vi har set, hvad det gør? Dens kopiere den værdi, hash defineret er defineret som og indsætte som uanset hvor du bruger værdien. Så forprocessoren gør bare virkelig simple tekstbaserede operationer. Det gør ikke noget smart. Så alt andet er mere kompliceret. Så nu, at præprocessoren gjort, vi faktisk kompilere. Så hvad betyder kompilere betyde? Vi overvåger nu gå fra C-kode til samling kode. Ja? Publikum: [uhørligt]? ROB: Ja, vi fanget det. Så kompilering. Vi går fra C til montering. Så dette er et virkeligt sprogforandring. Kompilering selv betyder at gå fra højniveausprog til et lavere niveau sprog. Og C er et højniveausprog i forhold til samlingen. Hvad er samling? Dets instruktioner, der er, temmelig meget, lavet til din CPU. Men computeren stadig gør ikke forstå forsamling. Det kun forstår ettaller og nuller. Så næste skridt er at samle, som bringer os fra disse instruktioner, som din CPU forstår og faktisk oversætter dem til de ettaller og nuller. Så C til samling til binær. Men jeg har ikke en eksekverbar endnu. Så tænk på det CS50 biblioteket. Vi har givet dig med en binær for denne CS50 bibliotek, som har getString og GetInt og alt det der. Men det CS50 library-- i og for itself-- er ikke eksekverbar. Det har ikke en hovedfunktion. Det er bare en flok af binære som du kan bruge. Så forbinder er, hvordan vi samle alle disse forskellige binære filer i et virkeligt eksekverbar. En, som du kan skrive prik skråstreg en prik ud. Så dette er ligesom den fil, du skrev, - uanset dit program er-- Ceaser prik C. Men nu er det blevet udarbejdet ned til binær. Så Ceaser prik o. Og det er vores CS50 biblioteker binær. Og de bliver kombineret i en enkelt eksekverbar. Ja? Publikum: [uhørligt]? ROB: Så først omfatte husk, hash omfatte, er faktisk en pre-processoren trin. Men det er adskilt. Hvis du ikke bruger nogen funktioner, der er uden for din enkelt fil og derefter, nej, behøver du ikke at linke noget da du har alt. Når det er sagt, printf bliver bundet ind. Hvis du nogensinde bruger printf, det er noget der skal være forbundet i fordi du ikke skrive det. Og faktisk printf automatisk forbundet i. Du ved, hvordan på kommandolinjen, eller når du skriver gøre, du ser det har dash l CS50, som har link i CS50 biblioteket? Printf, og den slags, der foregår at være forbundet automatisk. Alle andre spørgsmål om noget? Publikum: [uhørligt]? ROB: Sammenkædning? Vi har en hel bunke af forskellige binære filer. Dette er den kanoniske eksempel at vi bruger, er CS50 biblioteket. Vi har samlet og givet til dig binær for denne CS50 bibliotek. Du ønsker at bruge getString i dit program. Så du gå og bruge getString. Men uden min binær kode til GetString, når du kompilere din kode ned, kan du faktisk ikke køre din program, fordi getString String er endnu ikke defineret. Det er kun, når du linker i min binær som indeholder getString der nu alle Okay, jeg kan faktisk udføre getString. Min fil er færdig. Og jeg kan køre dette. Ja? PUBLIKUM: Er koble konvertere den binære til eksekverbare? Så selvom du ikke har andre biblioteker, ville det stadig være nødvendigt at oversætte det [uhørligt]? ROB: Så en eksekverbar er stadig i binær. Det er bare at kombinere en helhed bundt af binære filer. Publikum: Tak så meget. ROB: Intet problem. Andre spørgsmål? Ellers er vi alle indstillet. Okay. Tak. [Applaus] PUBLIKUM: Tak. ROB: Ja.