>> [MUSIC Playing]
>> DAVID J. MALAN: Okay.
>> [Latter]
>> Velkommen tilbage.
Dette er CS50.
Og dette i slutningen af ​​uge fem.
Og indtil nu, vi har temmelig meget taget for givet, at der
eksisterer denne compiler, Clang, at du har været påberåber ved hjælp af dette
andet værktøj kaldet Make at anden magisk konverterer din kildekode
i objektkode, de nuller og ettaller at din computer CPU, central
behandlingsenhed, faktisk forstår.
Men det viser sig at der er et tal, der er foregår under hætten i
mellem input og output.
>> Og jeg vil gerne foreslå, at vi kød det ud i en lidt mere detaljeret ind
disse fire trin, har noget, der hedder forbehandling, noget
kaldes kompilering, som vi har set, noget, der hedder samling, og
noget, der hedder sammenkædning.
Så indtil nu, i nogle af vores programmer, vi har haft skarpe omfatter.
For nylig har vi haft nogle skarpe definerer for konstanter.
Så det viser sig, at de ting, der er præfikset med hash symbol eller
pund symbolet er pre-processoren direktiver.
Det er bare en fancy måde at sige det er en linje kode, der er faktisk
omdannes til noget andet før computer, selv forsøger at konvertere din
program i nuller og ettaller.
>> For eksempel omfatter skarpe standard I / O. H, temmelig meget betyder blot gå
forude, tag fat i indholdet af filer stdio.h og indsætte dem lige der.
Altså ingen nuller og ettaller på det tidspunkt endnu.
Det er egentlig bare en udskiftning.
Og der er gjort under den såkaldte forbehandling scene, når du
faktisk køre Clang eller specifikt Gør i de fleste tilfælde.
Så alt dette har været tilfældet først automatisk hidtil.
>> Så kommer udarbejdelse skridt.
Men vi har været lemfældig kompilering.
Oversættelse af en program egentlig vil sige at tage det fra noget som C, er
kildekode vi har været at skrive, ned til noget, der hedder forsamling.
Assembler er et lavere niveau sprog, heldigvis, vil vi ikke
har meget lejlighed til at skrive dette semester.
Men det er på det laveste niveau i forstand, at du bogstaveligt talt begynde at skrive
tilføje og trække og formere sig og indlæse fra hukommelsen og gemme til hukommelsen,
meget grundlæggende instruktioner, som en computer, under hætten,
faktisk forstår.
>> Endelig, montage finder, at sproget til nuller og ettaller, som vi har været
beskriver hidtil.
Og virkelig endelig er der den såkaldte forbinder fase, som vi vil
se på bare et øjeblik, som kombinerer dine nuller og ettaller med nuller og
dem andre mennesker før du har oprettet.
>> Så overveje denne super simple program.
Det var fra uge 1.
Det sagde bare, Hello World, på skærmen.
Vi løb dette gennem Clang.
Eller vi kørte det igennem Make der løb Clang.
Og udsendes på det tidspunkt, hvor nogle nuller og ettaller.
Men det viser sig at der er et mellemtrin.
Hvis jeg går herovre - UPS, ikke ønsker at se ham endnu.
Hvis jeg går over her til min apparat og jeg åbner op hello.c, her
er det samme program.
Og hvad jeg har tænkt mig at gøre i mit terminal Vinduet her jeg har tænkt mig at
køre Clang snarere end Make, som automatiserer alle fire
disse skridt for os.
Og jeg har tænkt mig at gøre clang-S og derefter hello.c og derefter indtaste.
>> Og jeg får en blinkende prompt igen, hvilket er godt.
Og nu i et lidt større vindue, Jeg har tænkt mig at åbne op gedit her.
Og jeg har tænkt mig at åbne en fil, der, viser sig, kaldes hello.s dette
indeholder dette assembler Jeg nævnte tidligere.
Og dette er, hvad der kaldes forsamling sprog, forholdsvis lavt niveau
instruktioner, din Intel CPU eller hvad det er, der er inde
forstår.
Og mov er træk. opkaldet er til ringer, et meget lavt niveau funktion.
sub er subtrahere.
>> Så når du har en særlig CPU inde på din computer, der gør, hvad det
særskilte versus andre CPU'er på marked, som er instruktioner, den
forstår og ofte hvor effektivt det er, hvor hurtigt det er på fuldbyrdelsesstatens nogle
af disse instruktioner.
Nu til mere om dette, kan du tage næste Fall CS61 på college.
Men her har vi for eksempel et par identifikatorer, der kan virke bekendt.
hello.c er navnet på programmet.
>> . Tekst -
der er ikke meget af interesse der lige nu, minde om, at teksten
segment, som mandag, hvor er i hukommelse dit program faktisk ender.
Så det er i hvert fald vagt velkendt der.
Her er naturligvis en omtale af vores vigtigste funktion.
Rulle ned, disse refererer til ting såkaldte registre, meget små bidder af
hukommelse inde i din faktiske CPU.
Og hvis jeg ruller ned endnu videre, ser jeg en slags
indirekte omtale af ASCII.
Og der, ja, er denne streng, hej, komma, verden.
>> Så lang historie kort, har dette været sker for dig, automatisk,
under hætten al den tid.
Og hvad der er sket er virkelig gang du har kørt Clang, eller i form af
Gør, du får først, fra kildekoden, den
såkaldte assembler.
Derefter Clang er at konvertere denne forsamling sproget ned til nuller og ettaller.
Og det er det dias, vi startede vores diskussion i uge 0 på -
og derefter Uge 1 på.
Og så endelig, de nuller og ettaller kombineres med nuller og ettaller
fra de biblioteker, vi har taget for givet som Standard I / O eller
String Bibliotek eller endda Den CS50 biblioteket.
>> Så for at skabe dette billede mere visuelt har vi hello.c.
Og det, selvfølgelig, bruger printf fungere til at sige, hej verden.
Opgørelsen skridt tager det ned til pågældende fil vi lige så hello.s, selv
selv om det typisk er slettet automatisk for dig.
Men det er samling kode i midten trin.
Og når vi samler forsamlingen sprog, så at sige, det er når du
få disse nuller og ettaller.
Så vi har zoomet ind effektivt i dag hvad vi har taget for givet,
betyder at gå kildekode at gøre indsigelse kode.
>> Men endelig nu, at samme billede - Lad os skubbe den over til
venstre side.
Og bemærk, at der i toppen er der Jeg nævnte stdio.h.
Det er en fil, som vi har inkluderet i næsten alle
programmer, som vi har skrevet.
Og det er den fil, hvis indhold få kopi klistret,
effektivt oven på din kode.
Men det viser sig, at, på en computer Systemet eller andet sted, er der formentlig en
stdio.c fil, nogen skrev år siden, implementerer alle de
funktioner, der blev erklæret i stdio.h.
>> Nu i virkeligheden er det nok ikke på din Mac eller din PC eller endda i
CS50 apparat er en rå C-kode.
Nogen allerede kompileret den og omfattede . O fil til objektkode eller. En
fil, som refererer til en delt bibliotek der er blevet præ-installeret og
prækompilerede for dig.
Men formoder, at der faktisk eksisterer på vores computer stdio.c parallelt
med Clang.
Din kode der bliver kompileret og samlet.
stdio.c 's kode bliver kompileret og samles, således at dette allersidste
trin, hernede har vi en eller anden måde link, så at sige, dine nuller og ettaller
med hans eller hendes nuller og ettaller i én simpelt program, der i sidste ende er
kaldes bare Hello.
>> Så det er alt den magi, der er er sket hidtil.
Og vil fortsætte med at tage dem processer for givet, men indse
Der er en masse saftige detaljer foregår nedenunder der.
Og det er hvad der gør din computer med Intel indeni
særligt tydelig.
>> Så på dette notat, at hvis du gerne vil slutte sig til os til frokost denne fredag, gøre gå
til det sædvanlige cs50.net/rsvp, 13:15 denne fredag.
Og nu et par annonceringer.
Så vi har nogle gode nyheder.
Og vi har nogle dårlige nyheder.
Start med nogle gode nyheder her.
>> [Stønnende]
>> Ok.
Tja, det er teknisk set en ferie, så det er ikke så meget en gave fra os.
Men så dårlige nyheder selvfølgelig.
>> [Stønnende]
>> Jeg brugte en masse tid på disse animationer.
>> [Latter]
>> Der vil være en gennemgang session det kommende mandag.
Det kommer til at være på 5:30.
Vi vil minde dig om alle disse detaljer via e-mail på kursets
hjemmeside på bare et par dage tid.
Det filmes og gøres tilgængelige kort tid derefter.
Så hvis du ikke kan gøre at mandag nat slot, så fortvivl ikke.
Sektioner i den kommende uge også vil fokus på review for quizzen.
Hvis din afdeling er på mandag, som er faktisk universitet ferie, vil vi
stadig mødes i sektionen.
Hvis du kan simpelthen ikke gøre det afsnit, fordi du går
væk, det er fint.
Deltag en søndag eller tirsdag sektion eller tune-in til Jasons sektion, der er
tilgængelige online.
>> Så flere dårlige nyheder.
Så ifølge pensum, vi har foredrag næste fredag.
Men de gode nyheder -
klart, jeg brugte for meget tid på dette.
>> [Latter]
>> Vi vil aflyse næste fredagens foredrag.
Så det vil være en gave for os, så du virkelig kan have en nice pusterum i
mellem denne uge og to uger senere.
Så ingen forelæsninger i næste uge, bare en lille lille quiz, hvor du skal være
bliver mere og mere ophidset.
>> Så lad os nu vende vores opmærksomhed mod noget, der er faktisk mere visuel
og mere spændende og til at sætte scenen for, hvad der kommer til at være i horisonten
på bare et par uger tid.
Efter den første quiz, vil vi vende fokus på vores problem sæt til en anden
domænespecifikke problem, nemlig retsvidenskab eller sikkerhed mere generelt.
>> Faktisk tradition med dette problem sæt er for mig en af ​​de
undervisning kollega eller CA'er at gå på tværs campus tage nogle fotografier af
identificerbare, men ikke indlysende mennesker, steder, eller ting, så hvert år I
en eller anden måde formår at komme til at slette eller ødelægge det digitale mediekort
der er inde i vores kamera.
Men nogen big deal.
Jeg kan gå videre og sætte der ind i min computer.
Jeg kan lave en retsmedicinsk billede af det, så til at tale, ved at kopiere nuller og
dem ud af det hukommelseskort, uanset dens et SD-kort eller compact flash-kort eller
uanset hvad du er fortrolig med.
Og så kan vi uddele det ud.
>> Og så udfordringen forude, blandt andet ting for dig, vil være at skrive
C-kode, der genvinder en hel masse JPEG for mig og afslørede vil være
de mennesker, steder eller ting.
Og vi vil også tale på dette problem indstille og i de kommende dage, om
grafik mere generelt.
Vi har brugt dem, et kursus, for bryde ud.
Men du har slags tages for givet der eksisterer disse høje niveau begreber
af rektangler og ovaler.
Men under hætten der er pixels.
Og du har haft til at starte tænker om dem.
Eller vil du for p-sæt 4 nødt til at tænke om kløften mellem dine mursten, hvordan
hurtigt du bolden bevæger sig hen over skærmbilledet til bryde ud.
Så der er denne forestilling om det prikker på skærmen, der er
kommer i spil allerede.
>> Nu, hvad du ser, er imidlertid, hvad du får på en computerskærm.
Hvis du nogensinde har set nogle gode eller dårlig TV, odds er de temmelig meget
behandle publikum som technophobes der ikke rigtig
ved meget om computing.
Og så det er meget nemt for politiet detektiv til at sige, du kan
rent, at op til mig?
Eller forbedre, right?
Øge er ligesom modeord i de fleste helst forbrydelse relateret show.
Og virkeligheden er, hvis du tager et meget sløret billede af en mistænkt gøre
noget dårligt, kan du ikke bare forbedre det.
Du kan ikke zoome ind uendeligt.
Du kan ikke se i glimt af nogens eye, der har begået, at
særlig forbrydelse, trods forekomsten af ​​dette på TV.
>> Og så med det lad os motivere, at kommende problem sæt med et glimt
nogle shows, som du kan være bekendt.
>> [VIDEO AFSPIL]
>> -OK.
Lad os nu få et godt kig på dig.
>> -Hold den.
Kør den tilbage.
>> -Vent lidt.
Gå til højre.
>> -Der.
Frys det.
>> -Fuld skærm.
>> -OK.
Frys det.
>> -Stram op på det, vil ya?
>> -Vector ind på den fyr af baghjulet.
>> -Zoom i lige her på dette sted.
>> -Med det rigtige udstyr, filmede kan forstørres og slibes.
>> -Hvad er det?
>> -Det er en forbedring program.
>> -Kan du klare det op nogen?
>> -Jeg ved det ikke.
Lad os styrke det.
>> -Øge afsnit A-6.
>> -I forbedret detaljer og -
>> -Jeg tror, ​​der er nok til at forbedre.
Slip det til min skærm.
>> -Øge refleksion i hendes øje.
>> -Lad os køre dette gennem video ekstraudstyr.
>> -Edgar, kan du forbedre det?
>> -Vent.
>> -Jeg har arbejdet på denne refleksion.
>> -Nogen refleksion.
>> -Reflection.
>> -Der er en refleksion af mandens ansigt.
>> -The refleksion.
>> -Der er en refleksion.
>> -Zoom ind på spejlet.
>> -Du kan se en refleksion.
>> -Kan du forbedre billedet herfra?
>> -Kan du forbedre ham lige her?
>> -Kan du forbedre det?
>> -Kan vi forbedre dette?
>> -Kan du forbedre det?
>> -Hold på et sekund, jeg forbedre.
>> -Zoom ind på døren.
>> -X10.
>> -Zoom.
>> [Latter]
>> -Flyt i.
>> -Vent, stop.
>> -Stop.
>> -Pause det.
>> -Rotere et 75 grader rundt den lodrette venligst.
>> [Latter]
>> -Stop, og tilbage til den del om døren igen.
>> -Fik et billede forstærker der kan bitmap?
>> -Måske kan vi bruge Pradeep Sen metode til at se ind i vinduerne.
>> -Denne software er state of the art.
>> -Ikonet værdien er slukket.
>> -Med den rette kombination af algoritmer.
>> -Han har taget belysning algoritmer til det næste niveau, og jeg kan bruge dem til at
forbedre dette fotografi.
>> -Lock til og udvide z-aksen.
>> -Enhance.
>> -Frys og forbedre.
>> [END VIDEOAFSPILNING]
>> DAVID J. MALAN: So Problem Set 5 er det, der ligger forude der.
Så vi vil snart få en bedre forståelse af, hvornår og hvorfor du kan
og vores kan ikke forbedre på den måde.
Men først, lad os vende vores opmærksomhed til nogle af de byggesten, vi
skal være i stand til at fortælle den historie.
>> Så minde om, at vi tegnede det billede på Mandag og en lille smule i sidste uge.
Og det beskriver layoutet af ting i computerens hukommelse, når
kører nogle program.
Den tech segment op toppen, tilbagekaldelse, refererer til de faktiske nuller og ettaller
der komponere dit program.
Der er, under det, nogle initialiseret eller startværdi data, der typisk
refererer til ting som konstanter eller strenge eller globale variabler, der har
blevet erklæret i forvejen.
Der er den bunke, men vi vil komme tilbage til om lidt.
>> Og så er der i stakken.
Meget gerne en stak af bakker i cafeteria, det er her hukommelsen bliver
lagdelt og lagdelte når du gør det, der i et program?
Hvad er stakken brug for?
>> Ja?
>> Kald af funktion.
Hver gang du kalde en funktion, er det gives til splint af hukommelse til sin
lokale variable eller dets parametre.
Og billedligt, ser vi, at med hvert successiv funktion kaldes, når A
opkald B opkald C opkald D, de bliver lagdelt på stakken.
Og inden for hver af disse skiver hukommelse er hovedsagelig en unik anvendelsesområde
for denne funktion, hvilket naturligvis er problematisk, hvis du ønsker at aflevere
fra én funktion til en anden A stykke af data, som du ønsker det
at mutere eller ændre.
>> Så hvad var vores løsning til at gøre det muligt En funktion repræsenteret ved en stabel
rammen til at ændre hukommelsen indeni af en anden stakramme?
Hvordan de to talk til hinanden?
Så ved hjælp af pegepinde eller adresser, , som igen blot beskrive, hvor i
hukommelse, ved hjælp af en specifik bid nummer, den særlige
værdi kan findes.
Så huske sidste gang vi også fortsat historien og kiggede på et
temmelig buggy program.
Og dette program er buggy for et par årsager, men den mest bekymrende ene er
fordi den ikke kontrollere, hvad?
>> Ja, det undlader at kontrollere input.
Undskyld?
>> Hvis det er mere end 12 tegn.
Så meget fornuftigt, når du ringer memcopy, der, som navnet antyder, kun
kopier hukommelse fra sit andet argument i sin første argument.
Det tredje argument, meget fornuftigt, er kontrolleres for at sikre, at du ikke
kopiere mere end i dette tilfælde, længden af bar, antal tegn
i den destination, er denne matrix C. Men problemet er, at hvad
hvis C ikke selv er stor nok til at håndtere det?
Du kommer til at kopiere det antal bytes, som du har fået.
Men hvad gør du faktisk har mere bytes, end du har plads til?
>> Nå, dette program er meget tåbeligt bare blindt provenuet til at tage, hvad det er
givet, hej backslash 0 er fantastisk, hvis strengen er kort
nok, ligesom fem tegn.
Men hvis det er faktisk 12 tegn eller 1.200 tegn, så vi sidste gang
at du bare vil helt overskrive hukommelsen at
ikke tilhører dig.
Og værste fald, hvis du overskrive red portion der, vi kaldte
returadresse -
dette er blot, hvor computeren automatisk, for dig, bag
scener, putter væk en 32-bit værdi, Det minder til hvilken adresse bør det
vende tilbage når foo denne anden funktion, sker udførelse.
Det er en brødkrumme af sorterer hvortil den vender tilbage.
Hvis du overskriver det potentielt hvis du er den dårlige fyr, kan kunne
potentielt overtage andens computer.
Og du vil helt sikkert nedbrud det i de fleste tilfælde.
>> Nu er dette problem blev kun forværret da vi begyndte at tale om hukommelsen
ledelse mere generelt.
Og malloc, for hukommelse tildeling, er en funktionen, som vi kan bruge til at tildele
hukommelse, når vi ikke kender i forvejen at vi måske har brug for nogle.
Så, for eksempel, hvis jeg går tilbage til apparatet her.
Og jeg åbner op fra sidste gang hello2.c, genkalde dette program her, som så
lidt noget som dette, kun tre linjer -
oplyse dit navn, så string navn, til venstre, er lig getString.
Og så skal vi printe det ud, brugerens navn.
>> Så det var en super simpelt program.
For at være klar, så lad mig gå videre og gøre goddag-2.
Jeg har tænkt mig at gøre dot slash hej-2.
Oplyse dit navn -
David.
Enter.
Hej David.
Det synes at arbejde OK.
Men hvad der virkelig foregår under hood her?
Først lad os skrælle nogle lag.
String er blot et synonym vi har realiseret for hvad?
Char stjerne.
Så lad os gøre det lidt mere mystisk men mere teknisk korrekt, at dette
er en char stjerne, hvilket betyder, at navn, ja, er en variabel.
Men hvad navn butikker er adressen på en char, som føles lidt mærkeligt
fordi jeg får tilbage en streng.
Jeg får tilbage multiple chars ikke en char.
>> Men selvfølgelig, behøver du kun den første char adresse at huske, hvor de
Hele streng er fordi hvorfor?
Hvordan du regne ud, hvor enden af snoren kende starten?
Den backslash nul.
Så med disse to spor du regne ud før begyndelsen og slutningen af
enhver streng er, så længe de er korrekt dannet med denne null
terminator, at backslash nul.
>> Men det kalder getString.
Og det viser sig, at getString al denne tid har været slags
snyd for os.
Det har gjort dette arbejde, at være sikker, få en streng fra brugeren.
Men hvor er, at hukommelsen blevet kommer fra?
Hvis vi går tilbage til billedet her og anvende definitionen fra blot en
øjeblik siden, at stakken er hvor hukommelsen går, når funktioner kaldes,
af denne logik, når du kalder getString og så vil jeg skrive i
D-A-V-I-D Indtast, hvor er D-A-V-I-D backslash nul oplagres, baseret på
historie, vi har fortalt os videre?
>> Det synes at være i stakken, right?
Når du ringer får streng, du får en lille bid af hukommelse på stakken.
Så det er indlysende, at D-A-V-I-D backslash nul lagres
der i stakken.
Men vent et øjeblik, getString afkast denne streng, så at sige, hvilket betyder
det er bakke fra cafeteria tages fra stakken.
Og vi sagde sidste gang, at så snart en funktionen returnerer, og du tager det
bakke, så at sige, fra stakken, hvad kan du gå ud om resterne af
at hukommelsen?
Jeg slags redrew dem som spørgsmålstegn fordi de reelt blive
ukendte værdier.
De kan genbruges, når nogle næste funktion kaldes.
>> Med andre ord, hvis vi tilfældigvis at lagre -
Jeg vil tegne et hurtigt billede her i stakken.
Hvis vi tilfældigvis trække bunden af min hukommelse segment, og vi vil sige
at dette er stedet for hukommelse besat af main og måske arg c og
arg v og alt andet i programmet, når getString kaldes,
formentlig getString får en luns af hukommelse her.
Og derefter D-A-V-I-D måde ender i denne funktion.
Og jeg har tænkt mig at forsimpler.
Men lad os antage, at dens D-A-V-I-D backslash nul.
Så så mange bytes anvendes i rammen for getString.
>> Men så snart getString afkast, vi sagde sidste gang, at denne hukommelse i løbet af
Her bliver alt - woops! -
alt bliver effektivt slettet.
Og vi kan tænke på dette nu som spørgsmål varemærker, fordi der kender
hvad der kommer til at blive i denne hukommelse.
Ja, jeg er meget ofte kalder funktioner andre end getString.
Og så snart jeg kalder nogle andre funktion end getString, måske ikke i
dette program, vi kiggede lige på men nogle andre, sikkert nogle andre
Funktionen kan ende med at blive givet denne næste stedet i stakken.
>> Så det kan ikke være, at getString butikker D-A-V-I-D på stakken, fordi jeg ville
straks mister adgangen til det.
Men vi ved, at de getString returnerer kun hvad?
Det er ikke at vende tilbage til mig seks tegn.
Hvad det virkelig tilbage gjorde vi konkludere sidste gang?
Adressen på den første.
Så en eller anden måde, da du ringede getString, det er at afsætte en luns af hukommelse til
strengen at brugerne type og derefter returnere adresse på det.
Og det viser sig, at når du ønsker at funktion til at allokere hukommelse i denne
måde og vende tilbage til den person, der kaldte denne funktion, adressen på
at bid af hukommelse, du absolut kan ikke sætte det i stakken på
bund, fordi funktionelt er det bare vil ikke blive din meget
hurtigt, så du kan sikkert gætte, hvor vi sandsynligvis kommer til at kaste det
stedet, den såkaldte bunke.
>> Så mellem bunden af ​​din hukommelse er layout og toppen af ​​din hukommelse er
layout er en hel bunke af segmenter.
Ene er stakken, og højre ovenfor er den bunke.
Og bunke er bare en anden luns af hukommelse, der er ikke brugt til funktioner
når de er kaldt.
Det bruges til på længere sigt hukommelse, når du vil have en funktion til at få fat
hukommelse og være i stand til at hænge på til det uden at miste kontrol over det.
>> Nu kunne man måske umiddelbart se, at dette ikke er
nødvendigvis en perfekt design.
Da dit program allokeret hukommelse på stakken, eller som du kalder mere og
flere funktioner, eller som du tildeler hukommelse på den bunke med malloc ud som
getString gør, hvad der tydeligvis synes at være uundgåelig problem?
>> Right.
Ligesom det faktum, at disse pile peger mod hinanden
lover ikke godt.
Og faktisk kunne vi meget hurtigt ned et program i en række forskellige måder.
Faktisk tror jeg, vi kunne have gjort dette uheld gang.
Eller hvis ikke, så lad os gøre det bevidst nu.
Lad mig gå videre og skrive super hurtigt et program kaldet dontdothis.c.
Og nu vil jeg gå her og behøver skarpe omfatter stdio.h.
Lad os erklære funktionen foo tager ingen argumenter, som er
betegnet som godt ved ugyldig.
>> Og det eneste foo kommer til at gøre, er opkald foo, hvilket formentlig ikke er det
smarteste idé, men så må det være.
Ent main ugyldig.
Nu er det eneste hoved går at gøre, er at ringe foo så godt.
Og bare for sjov, jeg kommer til at gå forude her og sige printf "Hello fra
foo ".
>> OK.
Så hvis jeg ikke gøre nogen fejl, Gør dontdothis dot skråstreg.
Og lad os gøre det i en større vindue -
dot skråstreg, dontdothis.
Kom.
Uh oh.
Tilsyneladende, kan du gøre dette.
Fandens.
OK.
Vent.
Standby.
Har vi -
Vi brugte det med Make.
>> [Suk]
>> Jeg ved, men jeg tror, ​​vi lige har slettet det.
Uh, ja.
Fandens.
Løs dette Rob.
Hvad?
Det er meget simpelt.
Ja, vi vendte optimering slukket.
OK, står bye.
Nu føler jeg mig bedre.
OK.
Ok.
>> Så lad os recompile dette -
Gør dig dontdothis.
Du har måske at omdøbe det til dothis.c på bare et øjeblik.
Der går vi.
Tak.
OK.
Så det faktum, at jeg var ved at udskrive ud af noget var faktisk lige
bremse den proces, hvor vi ville have nået dette punkt.
OK.
Pyha!
>> Så hvad der rent faktisk foregår?
Årsagen til at der, lige som en sidebemærkning, er gør noget i form af input og
output tendens til at være langsommere, fordi du nødt til at skrive tegn til
skærmen, Den har for at rulle.
Så lang historie kort, havde jeg faktisk skete så utålmodig, ville vi have
set dette slutresultatet så godt.
Nu, hvor jeg fik tur af print-ups, vi ser det med det samme.
Så hvorfor er dette sker.
Nå, den enkle forklaring, naturligvis, er, at foo burde nok ikke
ringer selv.
>> Nu i generelle vendinger, dette er rekursion.
Og vi troede, et par uger siden rekursive er god.
Rekursion er denne magiske måde udtrykke dig super kortfattet.
Og det virker bare.
Men der er et centralt element i alle de rekursive programmer, vi har talt
om og kiggede på hidtil, hvilket var, at de havde hvad?
En base case, som var nogle hårde kodet tilfælde sagt i nogle situationer
ikke kalder foo, hvilket er klart ikke tilfældet her.
>> Så hvad der virkelig sker i form af billedet?
Nå, når main kalder foo, det får et stykke af hukommelse.
Når foo kalder foo, får det et udsnit af hukommelse.
Når foo kalder foo, det bliver en skive.
Det får et stykke.
Fordi foo aldrig vender tilbage.
Vi aldrig sletning en af ​​dem frames fra stakken.
Så vi blæser gennem den bunke, ikke at nævne, hvem ved hvad ellers, og
vi overskride grænserne for vores såkaldte segment af hukommelse.
Fejl gå segmentering falsk.
>> Så den løsning, der er klart ikke gøre dette.
Men jo større implikation er, at ja, der absolut er en vis grænse,
selvom det ikke er veldefineret, til, hvordan mange funktioner, du kan ringe i en
programmet, hvor mange gange en funktion kan kalde sig selv.
Så selvom vi prædikede rekursion da dette potentielt magiske ting en
par uger siden for sigma funktion, og når vi får data
strukturer og CS50, vil du se andre applikationer til den, er det ikke
nødvendigvis det bedste.
For hvis en funktion kalder sig selv, kalder sig, selv om der er en base
tilfælde, hvis du ikke rammer, at basisscenariet for 1.000 opkald eller 10.000 opkald ved
den tid du måske har kørt ud af rummet på dit såkaldte stak og hit
nogle andre segmenter af hukommelse.
Så det er også et design trade-off mellem elegance og mellem
robusthed din særlige gennemførelse.
>> Så der er en anden ulempe eller anden Gotcha til, hvad vi har
gjort hidtil.
Når jeg kaldte getString -
lad mig gå tilbage til goddag-2.
Bemærk, at jeg ringer getString, der vender tilbage en adresse.
Og vi hævder i dag, at adressen er fra den bunke.
Og nu er jeg udskrive string på den adresse.
Men vi har aldrig kaldt modsatte af getString.
Vi har aldrig haft til at calll en funktion som ungetstring, hvor du afleverer tilbage
denne hukommelse.
Men helt ærligt vi sandsynligvis burde have været.
For hvis vi holde beder computeren for hukommelse, måde ved en person som
getString men aldrig give det tilbage, helt sikkert det er også forpligtet til at føre til
problemer, hvor vi løber tør for hukommelse.
>> Og i virkeligheden, kan vi se efter disse problemer med det nye værktøj, hvis forbrug
er lidt kryptisk at skrive.
Men lad mig gå videre og splash det op på skærmen på bare et øjeblik.
Jeg har tænkt mig at gå videre og køre Valgrind med parameter hvis første kommando
linje argument er navnet af dette program hej-2.
Og desværre er det output er afskyeligt
kompleks uden god grund.
Så vi ser alt det rod.
David er oplyse mit navn.
Så det er programmet faktisk kører.
Og nu får vi denne udgang.
>> Så Valgrind ligner i ånden til GDB.
Det er ikke en debugger per se.
Men det er en hukommelse checker.
Det er et program, der vil køre din programmere og fortælle dig, hvis du spurgte en
computer for hukommelsen og aldrig gav den tilbage, og derved betyder, at du har
en hukommelsesfejl.
Og memory leaks tendens til at være dårlig.
Og du er brugere af computere har formentlig følte det, om du har en
Mac eller en PC.
Har du nogensinde brugt din computer for mens og ikke genstartet i flere
dage, eller du har bare fået en masse programmer, der kører, og skid
bremser i stå, eller i det mindste det er super irriterende at bruge, fordi
alt bare fået super langsom.
>> Nu, kan være en række årsager.
Det kunne være en uendelig løkke, en fejl i andens kode, eller, mere enkelt, det
kan betyde, at du bruger mere hukommelse, eller forsøger at, end din
computer faktisk har.
Og måske er der en fejl i nogle program der holder beder om hukommelsen.
Browsere årevis var berygtede for dette, beder om mere og mere hukommelse
men aldrig aflevere det tilbage.
Sikkert, hvis du kun har en begrænset mængde hukommelse, kan du ikke bede
uendeligt mange gange for nogle af denne hukommelse.
>> Og så hvad du ser her, selvom igen Valgrind udgang er
unødigt indviklet at kaste et blik på første, det er den interessante del.
Heap -
i brug på exit.
Så her er, hvor meget hukommelse var i brug i bunke på
tid mit program forlades -
tilsyneladende seks bytes i en blok.
Så jeg har tænkt mig at vinke mine hænder på, hvad en blok er.
Tænk på det er bare en luns, en mere teknisk ord for bid.
Men seks bytes -
hvad er de seks byte, var stadig i brug?
>> Præcis.
D-A-V-I-D omvendt skråstreg nul, fem bogstaver navn plus null terminator.
Så dette program Valgrind bemærket, at jeg bedt om seks bytes, tilsyneladende ved
måde getString, men aldrig gav dem tilbage.
Og i virkeligheden, kan dette ikke være så indlysende, hvis mit program ikke er tre
linjer, men det er 300 linjer.
Så vi kan faktisk give en anden kommando line argument Valgrind til
gøre det mere detaljeret.
Det er lidt irriterende at huske.
Men hvis jeg gør -
lad os se.
Leak -
Blev det lække -
selv jeg kan ikke huske hvad det er off hånd.
>> - Lækage-check lig fuld.
Jep, tak.
- Lækage-check lig fuld.
Enter.
Samme program kører.
Skrive i David igen.
Nu kan jeg se en lidt mere detaljeret.
Men under bunke resumé, som er identisk med fire - ah,
det er lidt rart.
Nu Valgrind er faktisk på udkig lidt hårdere i min kode.
Og det er at sige, at, tilsyneladende, malloc ved linie -
vi zoome ud.
På linje -
Vi kan ikke se hvad linje det er.
Men malloc er den første synderen.
Der er en blog i malloc.
>> Okay?
OK, nej.
Right?
Jeg ringede getString.
getString tilsyneladende kalder malloc.
Så hvad linje kode er tilsyneladende skyld for at have
tildelt denne hukommelse?
Lad os antage, at hvem skrev malloc har eksisteret længe nok til, at det er
ikke deres skyld.
Så det er nok mit.
getString i cs50.c - så det er en filen et sted på computeren -
i linie 286 synes at være den skyldige.
Lad os nu antage, at CS50 har været rundt for anstændig mængde tid, så
vi også er ufejlbarlig.
Og så det er formentlig ikke i getString at fejlen ligger, men snarere i
hej-2.c linie 18.
>> Så lad os tage et kig på hvad denne linje 18 var.
Oh.
En eller anden måde denne linje er ikke nødvendigvis buggy, per se, men det er grunden
bag denne hukommelsesfejl.
Så super enkelt, hvad ville intuitivt være løsningen her?
Hvis vi beder om hukommelse, blev aldrig giver det tilbage, og der synes at være en
problem, fordi over tid min computer kan løbe tør for hukommelse, kan bremse
ned, måske dårlige ting sker, ja, hvad er den simple intuitive løsning?
Bare give det tilbage.
>> Hvordan kan du frigøre at hukommelsen?
Nå, heldigvis er det ganske simpelt bare at sige frit navn.
Og vi har aldrig gjort dette før.
Men du kan hovedsagelig tænke på fri som det modsatte af malloc.
fri er det modsatte af tildele hukommelse.
Så lad mig kompilere dette.
Gør hej-2.
Lad mig køre det igen. hej-2 David.
Så det lader til at virke i nøjagtig samme måde.
Men hvis jeg gå tilbage til Valgrind og re-run den samme kommando på min nyligt
kompileret program, maskinskrivning i mit navn som før -
Nice.
Heap resumé -
i brug på exit -
nul bytes i nul blokke.
Og det er super nice, alle bunke blokke blev løsladt.
Ingen utætheder er mulig.
>> Så kommer op, ikke med Problem Set 4, men med Problem Set 5, de retsvidenskab
og fremefter, hvilket også vil blive en mål for rigtigheden af ​​din
program, uanset om du har eller ikke har memory leaks.
Men heldigvis, kan du ikke blot ræsonnere gennem dem intuitivt, som
er velsagtens nemt for små programmer men sværere for større programmer,
Valgrind, for de større programmer, kan hjælpe dig med at identificere
det særlige problem.
>> Men der er et andet problem der måtte opstå.
Lad mig åbne op denne fil her, hvilket er, igen, en noget simpelt eksempel.
Men lad os fokusere på, hvad dette program gør.
Dette kaldes memory.c.
Vi vil bogføre dette senere i dag i zip dagens kildekode.
Og mærke til, at jeg har en funktion kaldet f der ikke tager nogen argumenter og
returnerer ingenting.
På linje 20, jeg tilsyneladende om en pointer til en int og kalder det x.
Jeg tildele er afkastet værdien af ​​malloc.
Og bare for at være klar, hvor mange bytes am Jeg nok komme tilbage fra malloc
i denne situation?
>> Sandsynligvis 40..
Hvor får du det fra?
Tja, hvis du husker at en int er ofte 4 byte, i det mindste er i
apparat, 10 gange 4 er naturligvis 40.
Så malloc vender tilbage en adresse på en bid af hukommelse og lagring at
tage i sidste ende i x.
Så for at være klar, hvad så sker der?
Nå, lad mig skifte tilbage til vores billede her.
Lad mig ikke bare trække bunden af ​​mit computerens hukommelse, lad mig gå videre og
trække hele rektangel, repræsenterer alle mine RAM.
>> Vi vil sige, at stakken er på bunden.
Og der er en tekst segment i de startværdi data.
Men jeg bare at abstrahere dem andet væk som prik, prik prik.
Jeg skal bare til at henvise til denne som bunke på toppen.
Og så i bunden af ​​dette billede, at repræsentere main, vil jeg
at give det en skiver hukommelse på stakken.
For f, jeg vil give det en skive hukommelse på stakken.
Nu fik jeg konsulterer min kildekode igen.
Hvad er de lokale variable til main?
Tilsyneladende ingenting, så skive er effektivt tomt eller ikke engang så stor
som jeg har tegnet det.
Men i f, har jeg en lokal variabel, som kaldes x.
Så jeg har tænkt mig at gå videre og give f en luns af hukommelse, kalder det x.
>> Og nu malloc af 10 gange 4, Så malloc 40, hvor er det
hukommelse kommer fra?
Vi har ikke tegnet et billede lide det før.
Men lad os antage, at det er effektivt kommer herfra, så man,
to, tre, fire, fem.
Og nu har jeg brug 40 af disse.
Så jeg vil bare gøre dot, dot, dot at foreslå at der er endnu mere hukommelse
kommer tilbage fra den bunke.
Nu hvad er adressen?
Lad os vælge vores vilkårlige behandle som altid -
Ox123, selvom det sandsynligvis kommer at være noget helt andet.
Det er adressen på den første byte i hukommelse, som jeg beder malloc for.
>> Så kort sagt, når linje 20 udfører, hvad er bogstaveligt
gemt inde i x her?
Ox123.
Og Ox er uinteressant.
Det betyder blot, her er en hexadecimale tal.
Men hvad er nøglen er, at hvad jeg har butik i x, hvilket er en lokal variabel.
Men dens datatype, igen, er en adresse på en int.
Nå, jeg vil gemme Ox123.
Men igen, hvis det er lidt for kompliceret unødigt, hvis jeg ruller
tilbage, vi kan abstrakt det væk helt rimelighed og bare sige, at x er en
pointer til denne bid af hukommelse.
>> OK.
Nu er spørgsmålet ved hånden er følgende -
line 21, viser det sig, er buggy.
Hvorfor?
>> Undskyld?
Det har ikke -
sige, at når mere.
Tja, er det ikke gratis.
Så det er den anden, men.
Så der er en anden, men specifikt ved linie 21..
>> Præcis.
Denne enkle linje kode er blot en buffer overflow, en buffer overskridelsen.
En buffer betyder bare en luns af hukommelse.
Men den luns af hukommelse er på størrelse 10, 10 heltal, hvilket betyder, at hvis vi
indekset i det ved hjælp af syntaktiske sukker af matrix notation, square
parentes, har du adgang til x beslag 0 x beslag 1 x,
beslag dot, dot, dot.
x beslag 9 er den største.
Så hvis jeg gør x beslag 10, hvor Jeg er faktisk at gå i hukommelsen?
>> Tja, hvis jeg har 10 int -
lad os faktisk trække alle af disse her.
Så det var de første fem.
Her er de andre fem ints.
Så x beslag 0 er her. x beslag 1 er her. x beslag 9 er her. x beslag
10 er her, hvilket betyder, at jeg fortæller, i linie 21, til computeren sætte
nummer, hvor?
Tallet 0 hvor?
Tja, det er 0, ja.
Men bare det faktum, at dens 0 er lidt af en tilfældighed.
Det kunne være antallet 50, for alle vi pleje.
Men vi forsøger at sætte det på x beslag 10, hvilket er hvor dette
spørgsmålstegn er trukket, hvilket er ikke en god ting.
Dette program kan meget vel ned som et resultat.
>> Lad os nu gå videre og se, om dette er, ja, hvad der sker.
Gør hukommelsen, da filen kaldes memory.c.
Lad os gå videre og køre programhukommelse.
Så vi fik heldig, faktisk, det ser ud.
Vi fik heldig.
Men lad os se, om vi nu køre Valgrind.
Ved første øjekast kan mit program synes at være helt korrekt.
Men lad mig løbe Valgrind med - Lækage-check lig fuld på hukommelsen.
>> Og nu når jeg køre dette -
interessant.
Ugyldig skrive størrelse 4 ved line 21 memory.c.
Linje 21 i memory.c er, hvilken en?
Åh, interessant.
Men vent.
Str. 4, hvad er det at henvise til?
Jeg kun gjorde man skrive, men det er i str. 4.
Hvorfor er det 4.?
Det er fordi det er en int, der er, igen, fire bytes.
Så Valgrind fundet en fejl, som jeg, blik på min kode, gjorde det ikke.
Og måske din TF ville eller ikke ville.
Hvad Men Valgrind sikkert fundet, at Vi har lavet en fejl der, selv
selvom vi fik heldig, og computeren besluttet, eh, jeg ikke kommer til at gå ned
bare fordi du rørt en byte, en int værd af hukommelse, som du ikke har
faktisk selv.
>> Nå, hvad der ellers er buggy her.
Adresse -
dette er en vanvittig leder adresse i hexadecimal.
Det betyder bare et sted i den bunke er nul bytes efter en blok af str. 40
er knyttet til.
Lad mig zoome ud her og se, om dette er en lidt mere nyttigt.
Interessant.
40 bytes er absolut tabt i tab rekord 1 af 1.
Igen, flere ord end er nyttigt her.
Men baseret på de fremhævede linjer hvor skal jeg nok fokusere min
opmærksomhed for en anden fejl?
Ligner en linie 20 i memory.c.
>> Så hvis vi går tilbage til linje 20, der er den en, som du har identificeret tidligere.
Og det er ikke nødvendigvis buggy.
Men vi har det vendt dens virkninger.
Så hvordan kan jeg rette det mindste en af ​​disse fejltagelser?
Hvad kunne jeg gøre, når linje 21?
Jeg kunne gøre fri for x, er så at give tilbage, at hukommelsen.
Og hvordan løser jeg denne fejl?
Jeg skal helt sikkert gå ikke længere end 0.
Så lad mig prøve og re-run dette.
Beklager, helt sikkert gå ikke længere end 9..
Foretag hukommelse.
Lad mig køre Valgrind i et større vindue.
Og se nu.
Nice.
Alle bunke blokke blev løsladt.
Ingen utætheder er mulig.
Og op over her, der er ingen omtale mere af den ugyldige højre.
>> Bare for at få grådige, og lad os se, om en anden demonstration
ikke går efter hensigten -
Jeg fik heldig for et øjeblik siden.
Og det faktum, at dette er 0 er måske unødigt vildledende.
Lad os bare gøre 50, en noget vilkårlig nummer, gør hukommelse dot slash-hukommelse -
stadig få heldige.
Intet er ned.
Antag jeg bare gøre noget virkelig dumt, og jeg gør 100.
Lad mig genindspilning hukommelse, dot slash-hukommelse -
fik heldig igen.
Hvordan omkring 1.000?
ints ud, groft, hvor jeg skal være?
Gør hukommelse -
damn it.
>> [Latter]
>> OK.
Lad os ikke rode rundt længere.
Rerun hukommelse.
Der går vi.
Ok.
Så tilsyneladende du index 100.000 ints over, hvor du skulle have været i
hukommelse, dårlige ting ske.
Så dette er naturligvis ikke en hård, fast regel.
Jeg var slags hjælp retssag and error at komme der.
Men det er fordi, lang historie kort, computerens hukommelse er også opdelt
ind i disse ting kaldet segmenter.
Og nogle gange, at computeren faktisk har givet dig lidt mere hukommelse
end du beder om.
Men for effektivitet, er det bare nemmere at få mere hukommelse, men kun fortælle dig
at du får en del af det.
>> Og hvis du får heldig nogle gange, Derfor kan du være i stand til at røre
hukommelse, der ikke tilhører dig.
Du har ingen garanti for, at hvilken værdi du placerede der vil bo der, fordi
computeren stadig synes det er ikke dit, men det er ikke nødvendigvis vil
at ramme et andet segment af hukommelse i computer og fremkalde en fejl som
denne ene her.
Ok.
Eventuelle spørgsmål derefter på hukommelsen?
>> Ok.
Lad os tage et kig her, så på noget, vi har taget for
givet i temmelig lang tid, hvilket er i denne fil, der hedder cs50.h.
Så dette er en fil.
Disse er blot en hel masse bemærkninger op toppen.
Og du måske har set på dette, hvis du prikkede rundt på apparatet.
Men det viser sig, at al den tid, når vi plejede at bruge streng som
synonym, de midler, som vi erklærede der synonym var med dette
søgeord typedef, for type definition.
Og vi hovedsageligt siger, gør snor et synonym for char stjerne.
At de midler, hvormed stakken skabt disse støttehjul kendt som
strengen.
>> Nu her er bare en prototype for getchar.
Vi kunne have set det før, men det er faktisk, hvad den gør. getchar
tager ingen argumenter, returnerer en char.
getdouble tager ingen argumenter, returnerer en dobbelt.
getfloat tager ingen argumenter, returnerer en float, og så videre.
getint er her. getlonglong er her.
Og getString er her.
Og det er det.
Denne lilla linje er en anden forprocessor direktiv, fordi den
hashtag i begyndelsen af ​​det.
>> Ok.
Så lad mig gå ind cs50.c.
Og vi vil ikke tale for længe på dette.
Men for at give dig et indblik i, hvad der er stået på alt dette
tid, lad mig gå til -
lad os gøre getchar.
Så getchar er for det meste bemærkninger.
Men det ser sådan ud.
Så dette er den aktuelle funktion getchar at vi har været
tager for givet eksisterer.
Og selv om vi ikke har brug denne her der ofte, om nogensinde, det er mindst
forholdsvis enkel.
Så det er værd at tage en hurtigt kig på her.
>> Så getchar har en uendelig løkke, bevidst så tilsyneladende.
Det kalder derefter - og det er lidt af en flot genbrug af kode, vi selv skrev.
Det kalder getString.
For hvad betyder det betyde at få en char?
Nå, kan du lige så godt prøve at få et hel linie af tekst fra brugeren og
så bare se på en af disse tegn.
På linje 60, er her en lille lidt af et sanity check.
Hvis getString returnerede null, lad os ikke fortsætte.
Noget gik galt.
>> Nu er det lidt irriterende, men konventionel i C. char max sandsynligvis
repræsenterer, hvad der lige baseret på dens navn?
Det er en konstant.
Det er ligesom den numeriske værdi af største char du kan repræsentere med
én bid, hvilket sandsynligvis er det 255, hvilket er det største antal, du
repræsentere otte bits, startende fra nul.
Så jeg har bruger dette, i denne funktion, når skrive denne kode, kun fordi
hvis noget går galt i getchar men sit formål i livet er at returnere en
char, skal du en eller anden måde være i stand til at signalere til brugeren at
noget gik galt.
Vi kan ikke returnere null.
Det viser sig, at null er en pointer.
Og igen, getchar har at returnere en char.
>> Så konventionen, hvis noget går forkert, er dig, programmør eller i
dette tilfælde mig med biblioteket, havde jeg en bare beslutte vilkårligt, hvis
noget går galt, vil jeg returnere antallet 255, som er virkelig
betyder, at vi ikke kan, kan brugeren ikke skrive tegnet repræsenteret ved
nummer 255, fordi vi havde en stjæle det som en såkaldt sentinel værdi til
repræsentere et problem.
Nu viser det sig, at tegnet 255 er ikke noget, du kan skrive på
dit tastatur, så det er ikke nogen big deal.
Brugeren ikke mærke til, at Jeg har stjålet denne karakter.
Men hvis du nogensinde ser i mennesket sider på et computersystem nogle reference til en
alle caps konstant som dette, der siger, i tilfælde af fejl denne konstante magt
returneres, det er alle nogle mennesker gjorde år siden blev vilkårligt besluttet at
returnere denne særlige værdi, og kalder det en konstant i tilfælde
noget går galt.
>> Nu magiske sker hernede.
Først, jeg erklære på linje 67 to tegn, C1 og C2.
Og så på linje 68, er der faktisk en linje kode, der er minder om
vores ven printf, da det har procent Cs i anførselstegn.
Men bemærk, hvad der sker her. sscanf betyder string scan -
betyder scanne et formateret streng, ergo sscanf.
Hvad betyder det?
Det betyder, at du overgår til sscanf en streng.
Og line er, hvad brugeren typer i.
Du passerer at sscanf et format streng som dette som fortæller scanf hvad er
du håber brugeren har skrevet i.
Du kan derefter pass-i adresserne på to bidder af hukommelsen, i dette tilfælde,
fordi jeg har to pladsholdere.
Så jeg har tænkt mig at give det den adresse C1 og adressen på C2.
>> Og huske, at du giver en funktion adresse for nogle variable, hvad er
Implikationen?
Hvad kan denne funktion gøre som følge for at give det adressen på en
variabel, i modsætning til variablen selv?
Det kan ændre det, right?
Hvis du havde nogen et kort til en fysisk adresse, kan de gå der og gøre
hvad de vil på denne adresse.
Samme idé her.
Hvis vi overgår til sscanf, adressen på to bidder af hukommelsen, selv disse bittesmå
små bidder af hukommelsen, C1 og C2, men vi fortæller den adressen på dem,
sscanf kan ændre det.
>> Så sscanf formål i livet, hvis vi læser manden siden, er at læse hvad
brugeren har indtastet, håb for at brugeren har skrevet i et tegn, og måske
et andet tegn, og hvad brugeren indtastet, det første tegn går
her, det andet tegn går her.
Nu, som en sidebemærkning, det, og du ville kun kender det fra den dokumentation,
det faktum, at jeg sætter en tom plads der betyder blot, at jeg er ligeglad, hvis
brugeren rammer Space bar et par gange, før han eller hun tager en
karakter, vil jeg ignorere enhver hvide rum.
Så det, jeg kender fra dokumentationen.
>> Det faktum, at der er en anden% c efterfulgt af hvide rum er faktisk
bevidst.
Jeg ønsker at være i stand til at opdage, hvis brugeren skruet op eller ikke samarbejdede.
Så jeg håber, at brugeren kun har skrevet i et tegn, jeg derfor er håbende
der sscanf er kun kommer til at returnere værdien 1, fordi igen, hvis jeg læste
dokumentationen, sscanf formål i livet er at vende tilbage til antallet af
variabler, der var fyldt med brugerinput.
>> Jeg passerede i to variabler adresser, C1 og C2.
Jeg håber dog, at kun én af dem bliver dræbt, fordi hvis sscanf
returnerer 2, hvad er formentlig Implikationen logisk?
At brugeren ikke bare give mig en karakter som jeg fortalte ham eller hende.
De formentlig skrevet på mindst to tegn.
Så hvis jeg i stedet havde ikke den anden % C, jeg havde bare en, hvilket
ærligt ville være mere intuitiv tilgang, jeg tror en første øjekast,
du ikke vil være i stand til at opdage hvis brugeren har været at give dig mere
input, end du rent faktisk ønskede.
Så dette er en implicit formular af fejlkontrol.
>> Men bemærk, hvad jeg gør her.
Når jeg er sikker på, at brugeren har givet mig en tegn, jeg befri den linje, laver
det modsatte af getString, som igen bruger malloc, og så vender jeg tilbage
C1, tegnet som jeg håbede bruger forudsat og kun forudsat.
Så en hurtig skimtes alene, men spørgsmål om getchar?
Vi kommer tilbage til nogle af de andre.
>> Nå, lad mig gå videre og gøre det - Antag nu, bare for at motivere vores
drøftelse i en uge plus tid, det er en fil kaldet structs.h.
Og igen, det er bare en smagsprøve af noget, der ligger forude.
Men bemærk, at en masse af denne er kommentarer.
Så lad mig fremhæve kun interessante del for nu.
typedef -
er der den samme søgeord igen.
typedef vi bruger til at erklære string som en særlig datatype.
Du kan bruge typedef til at skabe helt nye datatyper, der ikke fandtes, da
C blev opfundet.
For eksempel kommer int med C. char kommer med C. double kommer med C. Men
der er ingen forestilling om en studerende.
Og alligevel ville være temmelig nyttigt at være i stand til at skrive et program, der gemmer
i en variabel, en elevs ID-nummer deres navn og deres hus.
Med andre ord, dele tre af data, ligesom en int og en
streng og en anden streng.
>> Med typedef, hvad er temmelig kraftig om dette og nøgleordet sturct for
struktur, får du som programmør i 2013 kan faktisk definere din egen på
datatyper, som ikke eksisterede år siden, men det passer til dit formål.
Og så her, i linjerne 13 til 19, vi om en ny datatype, ligesom
en int, men at kalde det studerende.
Og inde i denne variabel vil være tre ting - en int, en streng,
og en streng.
Så du kan tænke på, hvad der er virkelig er sket her, selvom det er en
lidt af en forenkling for i dag, en studerende hovedsagelig er at gå
til at ligne dette.
Dens vil være en luns af hukommelse med et ID, et navn
felt, og et hus felt.
Og vi vil være i stand til at bruge disse bidder af hukommelse og få adgang til dem som følger.
>> Hvis jeg går ind i struct0.c, her er der en forholdsvis lang, men efter en
mønster af kode, bruger denne nye trick.
Så det første, lad mig henlede Deres opmærksomhed til de interessante dele op toppen.
Sharp definerer eleverne 3, erklærer en konstante kaldet studerende og erhververe
det vilkårligt nummer 3, bare så jeg har tre studerende, der bruger
dette program for nu.
Her kommer Main.
Og varsel, hvordan jeg erklærer en bred vifte af studerende?
Nå, jeg bare bruge den samme syntaks.
Ordet studerende er selvfølgelig nye.
Men studerende, klasse, beslag studerende.
>> Så desværre er der en masse genbrug af termer her.
Dette er blot et tal.
Så det er ligesom at sige tre.
Class er lige, hvad jeg vil at kalde variablen.
Jeg kunne kalde det studerende.
Men klasse, dette er ikke en klasse i en objektorienteret Java slags måde.
Det er bare en klasse af studerende.
Og datatypen for hvert element i denne matrix er studerende.
Så dette er en lidt anderledes og fra at sige noget
som dette, er det bare -
Jeg siger give mig tre elever og kalder denne matrix klasse.
>> Ok.
Nu her er en fire løkke.
Denne fyr er velkendte - gentage fra nul på op til tre.
Og her er den nye stykke syntaks.
Programmet kommer til at bede mig, mennesket, for at give det en elev
ID, hvilket er en int.
Og her er den syntaks, som du kan opbevare noget i id-feltet på
placering class beslag I. So denne syntaks er ikke nyt.
Det betyder bare at give mig den ottende elev i klassen.
Men dette symbol er ny.
Indtil nu har vi ikke brugt dot, mindst i kode som dette.
Dette betyder at gå til struct kendt som en studerende og sætte noget der.
Ligeledes i denne næste linje 31, gå fremad og sætte hvad brugeren skriver
efter et navn her, og hvad de gør for en hus, det samme, gå videre og
sætte det i. hus.
>> Så hvad har dette program i sidste ende gøre?
Du kan se en lille teaser der.
Lad mig gå videre og gør structs 0 dot skråstreg struct 0, studerendes ID 1,
siger David Mather, studiekort 2..
Rob Kirkland, studiekort 3..
Lauren Leverit -
og det eneste dette program gjorde, som er bare helt vilkårligt, er
Jeg ønskede at gøre noget med disse data, nu hvor jeg har lært os, hvordan man
bruge structs er jeg netop havde denne ekstra løkke her.
Jeg gentage over den vifte af studerende.
Jeg brugte vores, måske nu velkendte ven, string sammenligne, stircomp til
check er 8. studerendes hus svarende til Mather?
Og hvis ja, udskrive bare noget vilkårligt gerne, ja, det er.
Men igen, bare at give mig muligheder, at bruge og genbruge og
genbruge denne nye dot notation.
>> Så Hvem bekymrer sig, right?
Kommer op med en studerende program er noget vilkårlige, men det viser sig
at vi kan gøre nyttige ting med dette, for eksempel som følger.
Dette er en meget mere kompliceret struct i C. Det har et dusin eller flere felter,
noget kryptisk hedder.
Men hvis du nogensinde har hørt om et grafisk filformat kaldet bitmap, BMP, det
viser sig, at bitmap filformat temmelig meget ligner det dette.
Det er en dum lille Smiley ansigt.
Det er et lille billede, som jeg har zoomet ind på temmelig stor, så jeg kunne se hver
af de enkelte prikker eller pixels.
Nu viser det sig, at vi kan udgøre en sort prik med, siger, at antallet 0.
Og en hvid prik med nummer 1.
>> Så med andre ord, at hvis du ønsker tegne en Smilende ansigt og redde dette billede i et
computer, er det tilstrækkeligt at opbevare nuller og dem, der ser sådan ud, hvor,
igen, dem er hvide og nuller er sort.
Og sammen, hvis du effektivt har a binde af ettaller og nuller, har du en
gitter af pixels, og hvis man lægger dem ud, har du en sød
lille Smiley ansigt.
Nu bitmap filformat, BMP, er effektivt, at under hætten,
men med flere pixels sot, at du kan faktisk repræsentere farver.
>> Men når du har mere sofistikerede filformater som BMP og JPEG og GIF
som du kan være bekendt, der filer på disken typisk ikke blot
har nuller og ettaller for pixel, men de har nogle metadata samt -
meta i den forstand, at er ikke rigtig data, men det er nyttigt at have.
Så disse felter her er antyde, og vi vil se dette mere detaljeret i P-set
5, at før nuller og ettaller, der repræsentere pixel i et billede,
der er en masse af metadata som størrelsen af ​​billedet og
bredden af ​​billedet.
Og mærke jeg plukning off nogle vilkårlige ting her -
bredde og højde.
Bit tæller, og nogle andre ting.
Så der er nogle metadata i en fil.
>> Men ved at forstå, hvordan filer er lagt ud på denne måde, kan du faktisk
derefter manipulere billeder, gendanne billeder fra disk, ændre størrelse på billeder.
Men du kan ikke nødvendigvis forbedre dem.
Jeg havde brug for et fotografi.
Så jeg gik tilbage til RJ her, som du så på skærmen temmelig lang tid siden.
Og hvis jeg åbner Keynote her, det er hvad sker der hvis du forsøger at zoome ind og
øge RJ.
Han er ikke få nogen bedre rigtig.
Nu Keynote er en slags sløring det en lille smule, bare for at tilsløre
kendsgerning, at RJ ikke får særlig forbedret, når du zoome ind
Og hvis gøre det på denne måde, se firkanter?
Ja, du kan helt sikkert se firkanter på en projektor.
>> Det er hvad du får, når du forbedre.
Men at forstå, hvordan vores RJ eller Smiley ansigt er gennemført, vil lade os
rent faktisk at skrive kode, der manipulerer disse ting.
Og jeg troede, jeg ville ende på denne note, med 55 sekunder ved en styrke, der er,
Jeg tør sige temmelig misvisende.
>> [VIDEO AFSPIL]
>> -Han lyver.
Om hvad, ved jeg ikke.
>> -Så hvad ved vi?
>> -Det ved 09:15 Ray Santoya var på ATM.
>> -Så spørgsmålet er, hvad han gør på 9:16?
>> -Optagelse de ni millimeter til noget.
Måske han så snigskytte.
>> -Eller arbejdede med ham.
>> -Vent.
Gå ét.
>> -Hvad kan du se?
>> -Bring hans ansigt op, fuld skærm.
>> -Hans briller.
>> -Der er en refleksion.
>> -Det er Neuvitas baseball hold.
Det er deres logo.
>> -Og han taler til hvem er iført den jakke.
>> [END VIDEOAFSPILNING]
>> DAVID J. MALAN: Dette vil være Problem Set 5..
Vi vil se dig i næste uge.
>> MAND: På det næste CS50.
>> [Fårekyllinger kvidrende]
>> [MUSIC Playing]