[Duke luajtur muzikë] DAVID J. Malan: Të gjithë të drejtë. [Qeshura] Mirë se vini mbrapa. Kjo është CS50. Dhe ky fundi i javës pesë. Dhe deri tani, ne kemi goxha shumë qenë duke marrë të mirëqenë se ka ekziston në këtë përpilues, tingëllimë, që e keni qenë të thirrur me anë të kësaj mjet tjetër i quajtur Sigurohuni që në njëfarë mënyre magjike konverton kodin tuaj burim në kodin e objektit, zero dhe ato se CPU kompjuterat tuaj, qendrore përpunimit njësi, në të vërtetë e kupton. Por kjo rezulton se ka një numër që është ndodh nën kapuç në mes input dhe output. Dhe unë do të doja të propozojë që ne mish që në një detaj më shumë në këto katër hapa, kanë diçka të quajtur para-përpunimit, diçka Përpilimi i quajtur, të cilat ne kemi parë, diçka që quhet montimi, si dhe diçka që quhet lidh. Pra, deri tani, në disa prej tonë programe, ne kemi pasur përfshin mprehtë. Kohët e fundit ne kemi pasur disa mprehtë përcakton për konstantet. Pra, rezulton se ato gjëra që janë prefixed me simbolin hash apo simbol funt janë të para-procesor direktiva. Kjo është vetëm një mënyrë e sofistikuar për të thënë se është një linjë e kodit që është në fakt konvertuar në diçka tjetër para kompjuteri edhe të përpiqet për të kthyer tuaj Programi në zero dhe ato. Për shembull, të mprehtë përfshin standardin I / O. H, pretty much thjesht do të thotë të shkojnë përpara, kap përmbajtjen e dosjeve stdio.h dhe ngjiti ato të drejtë atje. Pra, nuk ka zero dhe ato ende në atë pikë. Është me të vërtetë vetëm një zëvendësim. Dhe kjo është bërë gjatë ashtuquajtura para-përpunimit fazë, kur ju të vërtetë të drejtuar tingëllimë ose në mënyrë specifike Bëni në shumicën e rasteve. Pra, e gjithë kjo ka ndodhur së pari automatikisht deri tani. Pastaj vjen hapi përpilimi. Por ne kemi qenë të thjeshtëzuar Përpilimi. Hartimin e një programi të vërtetë do të thotë të marrë atë nga diçka si C, source code ne kemi qenë të shkruar, poshtë për diçka që quhet kuvend. Gjuha e Kuvendit është një nivel më i ulët gjuhë që, fatmirësisht, ne nuk do të kanë shumë rast për të shkruaj këtë semestër. Por kjo është në nivelin më të ulët në Ndjenja që ju të filloni të shkruani fjalë për fjalë shtoni dhe zbres dhe të shumohen dhe të ngarkesës nga kujtesa dhe të ruajtur në kujtesë, udhëzime shumë themelore që një kompjuter, nën kapuç, në të vërtetë e kupton. Së fundi, montimi merr atë gjuhë me zero dhe ato që ne kemi qenë përshkruar deri tani. Dhe me të vërtetë së fundi, ka ashtuquajtura lidh fazë, të cilat ne do të shohin në një moment të vetëm, e cila kombinon zero tuaja dhe ato me zero dhe ato të njerëzve të tjerë para ju keni krijuar. Kështu që e konsiderojnë këtë program super të thjeshtë. Ajo ishte nga Javës-1. Ajo thjesht tha, Hello World, në ekran. Ne u zhvillua këtë nëpërmjet tingëllimë. Ose ne vrapoi atë nëpërmjet Bëni e cila u zhvillua tingëllimë. Dhe outputted në kohën kur disa zero dhe ato. Por kjo rezulton se ka një hap i ndërmjetëm. Nëse unë shkoj gjatë këtu - oops, nuk duan të shohin atë ende. Nëse unë shkoj mbi këtu për aplikim tim dhe unë i hapur deri hello.c, këtu është se programi i njëjtë. Dhe ajo që unë jam duke shkuar për të bërë në terminalin e mia Dritarja këtu unë jam duke shkuar për tingëllimë të kandidojë në vend se të bërë, e cila automatizojnë të gjitha katër prej këto hapa për ne. Dhe unë jam duke shkuar për të bërë tingëllimë dhe S- pastaj hello.c dhe pastaj të hyjë. Dhe unë të marrë një të shpejtë keq përsëri, e cila është e mirë. Dhe tani në një dritare pak më të madhe, Unë jam duke shkuar për të hapur deri në Gedit këtu. Dhe unë jam duke shkuar për të hapur një skedar që, rezulton, është quajtur kjo hello.s përmban këtë gjuhë kuvendit I përmendur më herët. Dhe kjo është ajo që quhet kuvendi gjuha, niveli mjaft i ulët udhëzimet që CPU Intel tuaj apo çfarëdo qoftë ajo që është brenda kupton. Dhe mov është për lëvizje. thirrje është për thirrje, një funksion shumë të ulët të nivelit të lartë. nën është për zbres. Pra, kur ju keni një CPU të veçantë brenda e kompjuterit tuaj, çfarë e bën atë CPUs të dallueshme, kundrejt të tjera mbi tregu, është ajo e cila udhëzime e kupton se sa efikase dhe shpesh ajo është, se sa shpejt ajo është në ekzekutimin e disa i këtyre udhëzimeve. Tani për më shumë për këtë, ju mund të merrni CS61 ardhshme Fall në kolegj. Por këtu kemi, për shembull, disa identifikues që mund të duket i njohur. hello.c është emri i programit. . Teksti - nuk ka shumë interes atje vetëm tani, kujtojmë se teksti segment, nga e hëna, ku është në kujtesës programi juaj të vërtetë përfundon. Pra, kjo është të paktën paksa njohur atje. Këtu, natyrisht, është një përmendje nga funksioni ynë kryesor. Scroll poshtë, këto i referohen gjërave Regjistrat thirrur, chunks shumë të vogla të brenda kujtim të CPU tuaj aktuale. Dhe në qoftë se unë lëviz poshtë edhe më tej, unë shoh disa lloj përmendje indirekte e ASCII. Dhe atje, në të vërtetë, është se string, hello, presje, bota. Pra, histori të gjatë të shkurtër, kjo ka qenë ndodh për ju, automatikisht, nën kapuç gjithë kësaj kohe. Dhe çfarë është duke ndodhur me të vërtetë dikur ju keni drejtuar tingëllimë, ose me anë të Bëni, ju jeni marrë të parë, nga kodi burim, ashtuquajtura gjuha kuvendi. Pastaj tingëllimë është konvertimin këtë asamble gjuha e poshtë për zero dhe ato. Dhe kjo është rrëshqitje që kemi filluar diskutimi ynë në Javën 0 në - dhe pastaj Jave 1 on. Dhe pastaj në fund, ato zero dhe ato janë të kombinuara me zero dhe ato nga ato biblioteka që ne kemi qenë duke marrë për të dhënë si standard I / O ose Biblioteka String apo edhe CS50 bibliotekë. Pra, për të pikturuar këtë foto më shumë vizualisht, ne kemi hello.c. Dhe kjo, sigurisht, përdor printf funksionojë për të thënë, përshëndetje bota. Hapi hartimi merr atë poshtë për të se dosja ne vetëm e pa hello.s, madje edhe pse se po fshihen në mënyrë tipike automatikisht për ju. Por kjo është kodi kuvendi në hapin e mesme. Dhe pastaj, kur Ne i tubojmë të kuvendit gjuhës, kështu që të flasin, se kur ju merrni ato zero dhe ato. Pra, ne kemi zoomed në mënyrë efektive sot në atë që ne kemi qenë duke marrë për të dhënë, do të thotë duke shkuar kodin burimor të kundërshtojë kodin. Por së fundi, tani që picture njëjtë - le të fus atë mbi të anën e majtë. Dhe vini re se në krye ka I përmendur stdio.h. Kjo është një fotografi që ne kemi përfshirë pothuajse në të gjitha Programet ne kemi shkruar. Dhe kjo është skedar përmbajtja e së cilës Merrni një kopje ngjit, efektivisht në majë kodin tuaj. Por kjo rezulton se, në një kompjuter Sistemi diku, me sa duket ka një fotografi stdio.c se dikush shkroi vjet më parë se zbaton të gjitha Funksionet që janë të deklaruara në stdio.h. Tani në realitet ajo nuk është ndoshta më Mac tuaj apo PC tuaj apo edhe në CS50 aplikim është një kod C papërpunuara. Dikush përpiluar tashmë atë dhe përfshihen . O fotografi për kodit objekt apo a. fotografinë, e cila i referohet një bibliotekë të përbashkët që është para-instaluar dhe para-hartuar për ju. Por mendoj se ka të vërtetë ekziston on stdio.c tonë kompjuter në paralel me tingëllimë. Kodi juaj është duke u hartuar dhe të mbledhur. stdio.c 's kodi është duke u hartuar dhe mbledhur, në mënyrë që kjo e fundit shumë e hap, këtu poshtë, ne kemi në një farë mënyre Lidhje, kështu që të flasin, zero tuaja dhe ato e tij ose të saj me zero dhe ato në një program i thjeshtë që në fund të fundit është quajtur vetëm Hello. Pra, kjo është e gjitha e magjisë që është ndodhur deri tani. Dhe do të vazhdojë të marrë këto proceset për të dhënë, por të kuptojë ka një shumë detaje lëng zihej atje. Dhe kjo është ajo që e bën tuaj kompjuter me Intel brenda veçanërisht të dallueshme. Pra, në këtë shënim, në qoftë se ju do të donte për të bashkohen me ne për drekë kjo e premte, do të shkojnë në cs50.net/rsvp zakonshme vend, 13:15 kjo e premte. Dhe tani a disa njoftime. Pra, ne kemi disa lajme të mira. Dhe ne kemi disa lajme të këqija. Filloni me disa lajme të mira këtu. [Rënkuari] Dakord. E pra, kjo është teknikisht një festë, kështu që kjo nuk është aq shumë një dhuratë nga ne. Por pastaj lajmi i keq natyrisht. [Rënkuari] Kam shpenzuar shumë kohë në këto animacione. [Qeshura] Nuk do të jetë një seancë shqyrtim kjo vjen të hënën. Ajo do të jetë në orën 05:30. Ne do t'ju kujtojë të gjitha këto detaje përmes emailit në kurs të faqen e internetit në vetëm nja dy ditë kohë. Ajo do të jetë filmuar dhe të vihen në dispozicion menjëherë pas kësaj. Pra, nëse ju nuk mund të bëjë që e hëna slot natë, mos u shqetësoni. Seksionet këtë javë që vjen gjithashtu do të përqëndrohet në shqyrtim për quiz. Nëse pjesa juaj është të hënën, e cila është vërtet universitar pushime, ne do ende takohen në seksion. Nëse ju thjesht nuk mund të bëjë që seksioni për shkak se ju jeni duke shkuar larg, kjo është në rregull. Marrë pjesë në një e diel ose seksion martën ose të mendje-ne te seksionit të Jason, i cili eshte në dispozicion online. Pra, më shumë lajme të këqija. Kështu sipas syllabus, ne kemi ligjëratën e premtja e ardhshme. Por lajm i mirë - në mënyrë të qartë, kam shpenzuar shumë kohë për këtë. [Qeshura] Ne do të anulojë ardhshëm ligjëratave të së premtes. Kështu që do të jetë një dhuratë për ne, kështu që ju mund të vërtetë kanë një afat të bukur në në mes të kësaj jave dhe dy javët e këtej. Pra nuk javën e ardhshme ligjërata, vetëm një të vogël quiz pak, për të cilat ju duhet të jetë duke u ngacmuar gjithnjë. Pra, le të tani kthejmë vëmendjen tonë në diçka që është me të vërtetë shumë vizuale dhe më emocionuese dhe për të ngritur bazën për atë që do të jetë në horizont në vetëm nja një javë kohë. Pas quiz e parë, ne do të kthehet fokus grupe tona i problemit në një tjetër Problemi domain specifike, që i mjekësinë ligjore apo të sigurisë në përgjithësi. Në fakt, tradita me këtë problem grup eshte per më njëri prej CAS-i mësonte shokët apo të ecin nëpër Kampusi marrë disa fotografi të njerëz të identifikueshme, por jo të dukshme, vende, apo gjëra, atëherë çdo vit unë disi të menaxhuar për të fshini aksidentalisht ose të dëmtojë kartën e mediave digjitale kjo është brenda kameras sonë. Por asnjë marrëveshje e madhe. Unë mund të shkoni përpara dhe plug që në kompjuterin tim. Unë mund të bëjë një imazh të mjekësisë ligjore të saj, kështu që që të flasin, duke kopjuar zero dhe ato off e atij kartën e kujtesës, qofshin e saj një kartë SD ose kartë compact flash ose çdo gjë që ju jeni të njohur me të. Dhe atëherë ne mund të dorëzojë atë jashtë. Dhe kështu sfida përpara, ndër të tjera gjëra për ju, do të jetë për të shkruar Kodi C që rimëkëmbet një bandë e tërë e JPEG për mua dhe do të jenë të shpallura ata njerëz, vende, apo gjëra. Dhe ne gjithashtu do të flasim, në këtë problem vendosur dhe në ditët që do të vijnë, në lidhje me Grafika më të përgjithshme. Ne kemi përdorur ato, një kurs, për shpërthen. Por ju keni lloj i marrë për të dhënë ekziston këto nocione të nivelit të lartë i rectangles dhe ovale. Por nën kapuç ka pixels. Dhe ju keni pasur për të filluar duke menduar rreth atyre. Ose ju do të për p-set 4 duhet të mendojnë për hendekun në mes të tullave, si më shpejt që ju jeni topin po lëviz nëpër ekran për të thyer jashtë. Pra, nuk është ky nocion i dots në ekranin tuaj që është të hyjë në lojë tashmë. Tani ajo që ju shihni, edhe pse, është ajo që ju të merrni në një ekran kompjuteri. Nëse e keni shikuar ndonjëherë një të mirë apo TV keqe, shanset janë që ata goxha shumë trajtojnë audiencën si technophobes të cilët nuk të vërtetë di shumë rreth informatikes. Dhe kështu kjo është shumë e lehtë për policinë detektivë të them, mund të ju pastruar se deri për mua? Ose të rritur, e drejtë? Rritja është si fjala lëvizje në shumica e ndonjë show krim të lidhura. Dhe realiteti është në qoftë se ju merrni një shumë të foto blurry e një të dyshuari bërë diçka e keqe, ju nuk mund të vetëm të rrisë atë. Ju nuk mund të zoom në pafundësisht. Ju nuk mund të shihni në shkëlqim e dikujt syri i cili angazhohet që Krimi i veçantë, pavarësisht Prevalenca e kësaj në TV. Dhe kështu me këtë le të motivojë që Problemi ardhshme të vendosur me një paraqitje e shkurtër në disa shfaqje me të cilat ju mund të jetë e njohur. [Video playback] -OK. Tani, le të marrë një sy të mirë në ju. -Do ta mbajë atë. Run atë përsëri. -Prisni një minutë. Shkojnë drejtë. -Ka. Ngrijë se. -Full ekran. -OK. Ngrijë se. -Shtrënguar deri në atë, do ya? Vector-it në atë djalë nga rrota e pasme. Zoom-në të drejtë këtu në këtë vend. -Me pajisje të drejtë, fotografuan mund të zgjerohet dhe të mprehur. -Çfarë është ajo? -Është një program zgjerimin. -Mund të jeni të qartë se deri ndonjë? -Unë nuk e di. Le të rritur atë. -Rritja seksioni A-6. -I rritur dhe detaje - -Unë mendoj se nuk është e mjaftueshme për të rritur. Release atë në ekranin tim. -Rritja reflektimin në syrin e saj. -Le të drejtuar këtë përmes Rritja Video. -Edgar, ju mund të rrisë kjo? -Hang on. -I've qenë duke punuar në këtë reflektim. Dikushi-reflektim-së. -Reflection. -Ka një reflektim e fytyrës së njeriut. -Reflektim. -Ka një reflektim. -Zoom në pasqyrë. -Ju mund të shihni një reflektim. -A mund të përmirësuar imazhin nga këtu? -A mund të rrisë atë të drejtë këtu? -Mund ta rritur atë? -Mund ta rritur atë? -A mund ta përmirësojë këtë? -Mund ta rritur atë? -Mbajë në një të dytë, unë do të të rritur. -Zoom në derë. -X10. -Zoom. [Qeshura] Leviz-in -Prit, stop. -Stop. -Pauzë atë. Rotate një 75-gradë përreth ju lutem vertikale. [Qeshura] -Stop, dhe mbrapsht tek pjesa rreth derës përsëri. Got një enhancer-image që mund të bitmap? -Ndoshta ne mund të përdorni Sen Pradeep Metoda për të parë në dritare. -Ky software është shtet i artit. -Vlera ikonë është off. -Me kombinimin e duhur e algoritme. -Ai është marrë në algoritme ndriçim nivelin e ardhshëm dhe unë mund t'i përdorë ato për të rritur këtë fotografi. Lock-në dhe zgjeruar Z-aks. -Rritja. -Rritja. -Rritja. -Freeze dhe të rritur. [VIDEO END rishikim] DAVID J. Malan: Set Pra Problem 5 është çfarë shtrihet përpara atje. Pra, ne së shpejti do të marrë një kuptim më të mirë prej kur dhe pse ju mund të tonë dhe nuk mund të rrisë në atë mënyrë. Por së pari, le të kthejë vëmendjen tonë për disa nga blloqet e ndërtimit ne do të duhet të jenë në gjendje për të të treguar atë histori. Pra, kujtoj se ne tërhoqi këtë foto në E hënë dhe e pak javën e kaluar. Dhe kjo përshkruan paraqitjen e gjërave në kujtesën e kompjuterit tuaj, kur running ndonjë program. Segmenti i teknologjisë up krye, risjell, i referohet me zero aktuale dhe atyre të që përbëjnë programin tuaj. Ka, më poshtë se, disa initialized ose Të dhënat uninitialized, të cilat në mënyrë tipike referohet për gjëra të tilla si konstantet apo strings ose variablave globale që kanë është deklaruar paraprakisht. Ka grumbull, por ne do të vijnë përsëri në se në një grimë. Dhe pastaj nuk ka rafte. Shumë si një pirg e tabaka në mensë, ky është vendi ku merr memorie shtresa dhe shtresa kurdo ju bëni atë në një program? Çfarë është përdorimi i rafte për të? Po? Tërhiqni vëmendjen e funksionit. Çdo herë që ju e quani një funksion, kjo është jepet copë e kujtesës për vet Variablat lokale ose parametrat e saj. Dhe në pikturë, ne shohim se me njëri- funksion të njëpasnjëshme të thirrur, kur A thirrjet B thirrjet C D thirrjet, ata merrni shtresëzuar mbi rafte. Dhe brenda secilit prej këtyre feta memorie është në thelb një hapësirë ​​unike për atë funksion, e cila, sigurisht, është problematike në qoftë se ju doni të dorëzojë nga një funksion në një tjetër Një copë e të dhënave që ju dëshironi që ajo të shndrrohet ose të ndryshojë. Pra, çfarë ishte zgjidhja jonë për të mundësuar Një funksion i përfaqësuar nga një mullar kornizë për të ndryshuar kujtesën brenda e një tjetër kornizë rafte? Si të bëni ato flasin 0:58 tjetrin? Pra, me anë të pointers ose adresat, e cila, përsëri, vetëm të përshkruani ku në , kujtesës me anë të një specifike Numri i kafshoj, veçanërisht vlera mund të gjendet. Pra, kujtojnë kohën e fundit shumë ne kemi vazhduar historinë dhe shikoi një program mjaft buggy. Dhe ky program është për një buggy pak arsye, por një nga më shqetësuese është sepse ajo dështon për të kontrolluar se çfarë? Yeah, ajo dështon për të kontrolluar input. Na vjen keq? Në qoftë se kjo është më shumë se 12 karaktere. Pra, shumë smartly, kur e quan memcopy, e cila, siç sugjeron emri, vetëm kopje memorie nga argumentin e saj të dytë në argumentit të saj të parë. Argumenti i tretë, shumë smartly, është kontrolluar për të siguruar që ju nuk e bëni kopje më shumë se, në këtë rast, gjatësia e bar, numri i karaktereve, në destinacion, i cili eshte ky array C. Por problemi është se çfarë në qoftë se C në vetvete nuk është mjaft e madhe për të trajtuar atë? Ju do të jeni të kopjoni numrin e bytes që ju keni qenë dhënë. Por çfarë bëni ju në të vërtetë kanë më shumë bytes se ju keni hapësirë ​​për të? E pra, ky program shumë pa mend vetëm verbërisht vazhdon të marrë çfarëdo qoftë ajo e dhënë, përshëndetje backslash 0 është madh nëse vargu është i shkurtër mjaftueshme, si pesë karaktere. Por nëse kjo është në fakt 12 karaktere ose 1.200 karaktere, pamë herën e fundit se ju jeni vetëm duke shkuar për të krejtësisht të prishësh kujtesës që nuk i takon për ju. Dhe në rastin më të keq, në qoftë se ju të prishësh atë pjesa e kuqe atje se ne e quanim kthehen adresë - kjo është vetëm kur kompjuteri automatikisht, për ju, pas tucks larg skenave, një 32-bit vlerë që kujton atë për çfarë adresa ajo duhet kthehen kur foo, ky funksion tjetër, është bërë ekzekutimin. Kjo është një thërrime bukë në terezi për të cilën ai jep. Nëse ju prishësh që, potencialisht, në qoftë se ju jeni djalë i keq, mund të mund të potencialisht të marrë përsipër kompjuterin e dikujt. Dhe ju do të më siguri të rrëzuar atë në shumicën e rasteve. Tani ky problem u përkeqësua vetëm siç kemi filluar duke folur për kujtesën menaxhim më në përgjithësi. Dhe malloc, për dhenie e kujtesës, është një funksion që ne mund të përdorim për të alokuar kujtim kur ne nuk e dimë paraprakisht që ne mund të kenë nevojë disa. Kështu, për shembull, nëse unë kthehem te pajisjes këtu. Dhe unë i hapur deri nga hello2.c herë të fundit, kujtojnë këtë program këtu, e cila dukej një diçka të vogël si kjo, vetëm tre rreshta - thoni emrin tuaj, atëherë emri i vargut, në të majtë, e barabartë me getString. Dhe atëherë ne print it out, Emri i përdoruesit. Pra, kjo ishte një program super të thjeshtë. Për të qenë të qartë, më lejoni të shkoj përpara dhe të bëjnë përshëndetje-2. Unë jam duke shkuar për të bërë dot slash Hello-2. Shënoni emrin tuaj - David. Enter. Përshëndetje David. Kjo duket për të punuar OK. Por çfarë ndodh në të vërtetë nën kapuç këtu? Së pari le të zhvishem përsëri disa shtresa. String është vetëm një sinonim ne kemi realizuar për çfarë? Yll Char. Pra, le të bëjë atë një pak më misterioze por më teknikisht të saktë se kjo eshte nje yll char, që do të thotë se emri, po, është një ndryshore. Por çfarë dyqane emri është adresa e një char, e cila ndihet pak e çuditshme sepse unë jam marrë përsëri një varg. Unë jam duke u kthyer shumëfishtë chars jo një char. Por sigurisht, ju duhet vetëm për të parë Adresa Char për të mbani mend se ku vargut të tërë është për shkak se pse? Si mendoni ju kuptoj se ku fundi i string është të dish se fillimi? Zero backslash. Pra, me këto dy të dhëna të kuptoj se para fillimit dhe në fund të çdo string janë, për aq kohë sa ata janë të formuar siç duhet me atë null terminator, se zero backslash. Por kjo është thirrje getString. Dhe kjo rezulton se getString gjithë kësaj kohe ka qenë lloj i cheating për ne. Ajo ka qenë duke e bërë këtë punë, të jetë i sigurt, marrjen e një varg nga përdoruesit. Por ku është se kujtesa qenë që vijnë nga? Nëse ne do të shkojmë përsëri në foto këtu dhe zbatojë përkufizimin nga vetëm një moment pare, qe pirg është ku kujtesës shkon kur funksionet janë të thirrur, nga kjo logjikë, kur ju telefononi getString, dhe pastaj shkruani në D-A-V-I-D Futni, ku eshte D-A-V-I-D backslash zero ruajtur, bazuar në histori ne kemi na tha larg? Ajo do të duket të jetë në rafte, e drejtë? Kur ju telefononi merrni vargun që ju të merrni një fetë të vogël të kujtesës në rafte. Pra, ajo qëndron për arsye se D-A-V-I-D backslash zero është ruajtur atje në rafte. Por prisni një minutë, getString kthimit që varg, kështu që flet, që do të thotë kjo është tabaka nga lokali është marrë off rafte. Dhe ne i thamë herën e fundit që sa më shpejt si një Kthimet funksionojë, dhe ju merrni se tabaka, kështu që të flasin, jashtë rafte, çfarë ju mund të marrë në lidhje me mbeturinat e se kujtesa? Unë lloj i redrew ato si pikëpyetjesh sepse bëhet në mënyrë efektive Vlerat panjohur. Ata mund të ripërdoren kur disa Funksioni tjetër quhet. Me fjalë të tjera, në qoftë se ne të ndodhë të jetë ruajtjen - Unë do të nxjerrë një tablo të shpejtë ketu i pirg. Në qoftë se ne të ndodhë për të tërhequr pjesën e poshtme i segmentit kujtesën time, dhe ne do të themi se ky është vendi i kujtesës pushtuar nga kryesore dhe ndoshta ARG c dhe arg v dhe çdo gjë tjetër në program, kur getString quhet, me sa duket getString merr një copë e kujtesës këtu. Dhe pastaj D-A-V-I-D disi përfundon deri në këtë funksion. Dhe unë jam duke shkuar për të thjeshtëzoj. Por le të supozojmë se tij D-A-V-I-D backslash zero. Pra, kjo bytes shumë janë përdorur në kornizë për getString. Por, sa më shpejt që kthimet getString, ne tha se koha e fundit që kjo memorie gjatë këtu të gjithë të bëhet - woops! - fshirë të gjitha të bëhet në mënyrë efektive. Dhe ne mund të mendojmë për këtë tani si pyetje Shënon sepse kush e di çfarë do të bëhet i atij kujtesës. Në të vërtetë, Unë shumë shpesh i quajnë funksione përveç getString. Dhe sa më shpejt që unë e quaj disa të tjera Funksioni se getString, ndoshta jo në ky program të veçantë që ne vetëm shikuar por në disa të tjera, me siguri disa të tjera Funksioni mund të përfundojnë duke u dhënë ky spot tjetër në rafte. Pra, ajo nuk mund të jetë që ruan getString D-A-V-I-D në rafte, sepse unë do menjëherë të humbasin qasje në të. Por ne e dimë se ata getString vetëm kthen çfarë? Kjo nuk është kthyer në mua gjashtë shkronja. Çfarë është me të vërtetë e ka kthyer ne konkludojmë herën e fundit? Adresën e parë. Pra, në njëfarë mënyre, kur ju thirri getString, kjo është një copë alokimin e kujtesës për string se lloji përdoruesit dhe Adresa pastaj kthimi i saj. Dhe kjo rezulton se kur ju doni të funksionojë për të alokuar kujtesës në këtë Mënyra dhe kthimi tek personi i cili quhet se funksioni, adresa e se copë e kujtesës, ju absolutisht nuk mund të vënë atë në rafte në fund, sepse kjo është vetëm funksionalisht duke shkuar për të mos bëhet shumë juaji shpejt, kështu që ju mund ndoshta me mend se ku ne jeni me siguri do të hedh atë në vend të kësaj, e ashtuquajtura grumbull. Pra, në mes të poshtme të së kujtesës tuaj faqosja dhe maja e së kujtesës tuaj Layout janë një bandë e tërë e segmenteve. Njëra është rafte, dhe të drejtën sipër saj është tog. Dhe tog është vetëm një copë e ndryshme të kujtesës që nuk është përdorur për funksione të kur ata janë quajtur. Është përdorur për kujtesën afatgjatë, kur ju doni një funksion për të rrëmbyer disa kujtesës dhe të jenë në gjendje për të ul receptorin e telefonit në atë pa humbur kontrollin mbi të. Tani ju ndoshta mund të menjëherë shohim se kjo nuk është domosdoshmërisht një dizajn të përsosur. Si programi juaj ndarë në kujtesë rafte, ose si ju e quani më dhe më shumë funksione, ose si ju të ndajë memorie në grumbull me malloc off si getString është duke bërë, çfarë në mënyrë të qartë duket të jetë problemi i pashmangshëm? Drejtë. Ashtu si fakti se këto shigjeta janë vënë në njëri-tjetrin nuk shenjë e mirë. Dhe me të vërtetë, ne mund shumë shpejt të rrëzimit një program në çdo numër mënyrash. Në fakt, unë mendoj se ne mund të kemi bërë këtë aksidentalisht një herë. Ose në qoftë se jo, le ta bëjmë atë qëllimisht tani. Më lejoni të shkojnë përpara dhe të shkruajnë super të shpejtë një program të quajtur dontdothis.c. Dhe tani unë do të shkoj në këtu dhe e mprehtë përfshijnë stdio.h. Le të deklarojnë funksion foo merr nuk ka argumente, e cila është pėrcaktuara si edhe nga pavlefshme. Dhe gjëja e vetme foo do të bëni është të thirrje foo, e cila ndoshta nuk është ide e zgjuar, por kështu të jetë ajo. Void Ent kryesore. Tani e vetmja gjë që po ndodh kryesore për të bëni është të telefononi foo si. Dhe vetëm për shkelma, unë jam duke shkuar për të shkuar përpara këtu dhe thonë printf "Përshëndetje nga foo ". OK. Pra, në qoftë se unë nuk e ka bërë gabime, Bëni dontdothis dot slash. Dhe le ta bëjmë atë në një dritare të madhe - dot plagë, dontdothis. Come on. Uh oh. Me sa duket, ju mund ta bëni këtë. Damn it. OK. Prisni. Stand by. A ne - Ne e përdorin atë me të bërë. [Psherëtin] Unë e di, por unë mendoj se ne fshihet vetëm se. Uh, vërtet. Damn it. Zgjidhur këtë Rob. Çfarë? Është shumë e thjeshtë. Yeah, ne u kthye off optimization. OK, të qëndrojë bye. Tani ndihem më mirë. OK. Dakord. Pra, le të përpiluar këtë - Sigurohuni që ju dontdothis. Ju mund të keni për të riemërtoni këtë për dothis.c në një moment të vetëm. Ka të shkojmë. Falemnderit. OK. Pra, fakti që unë u shtypjen nga diçka ishte e vërtetë vetëm ngadalësuar procesin me të cilin ne do të kishte arritur në këtë pikë. OK. Uh! Pra, çfarë është në të vërtetë ndodh? Arsyeja atje, ashtu si një mënjanë, është duke bërë asgjë në aspektin e input dhe prodhimi ka tendencë të jetë më e ngadaltë për shkak se ju duhet të shkruani karakteret që ekran, Ajo ka të lëvizni. Pra, histori të gjatë të shkurtër, unë në fakt kishte ndodhi kaq i padurueshëm, ne do të kemi kjo shihet rezultati përfundimtar si. Tani që kam marrë udhëtim të print-ups, ne e shohim atë menjëherë. Pra, pse po ndodh kjo. E pra, shpjegim të thjeshtë, natyrisht, foo është se ndoshta nuk duhet të të quan veten. Tani në terma të përgjithshme, kjo është recursion. Dhe ne kemi menduar nja dy javë recursive më parë është e mirë. Recursion është kjo rruga magjike e shprehur veten super shkurtimisht. Dhe vetëm ajo punon. Por ka një tipar kryesor i të gjithë programet e gjithkund rekursive ne kemi biseduar rreth dhe shikoi deri tani, e cila ishte se ata kishin çfarë? Një rast bazë, e cila ishte disa hard coded rast tha se në disa situata mos telefononi foo, e cila është në mënyrë të qartë nuk është rasti këtu. Pra, çfarë është me të vërtetë ndodh në kuptim të këtij foto? E pra, kur e quan kryesor foo, ajo merr një fetë e kujtesës. Kur e quan foo foo, ajo merr një fetë e kujtesës. Kur e quan foo foo, ajo merr një fetë. Ajo merr një fetë. Ajo merr një fetë. Sepse foo kurrë nuk është kthyer. Ne kurrë nuk jemi të fshirja një prej atyre korniza nga rafte. Pra, ne jemi defekt nëpërmjet një mase jo, për të përmendur kush e di çfarë tjetër, dhe ne jemi duke tejkaluar kufijtë e tonë ashtuquajturat segment i kujtesës. Error shkoni segmentimit të rreme. Pra, zgjidhja ekziston në mënyrë të qartë nuk e bëjmë këtë. Por implikimi i madh është se, po, nuk ka absolutisht është një kufi, edhe nëse ajo nuk është e përcaktuar mirë, se si shumë funksione ju mund të telefononi në një , programi sa herë një funksion mund të telefononi veten. Pra, edhe pse ne nuk predikojmë recursion pasi këtë gjë magjike potencialisht një Nja dy javë më parë për Sigma funksion, dhe kur ne të merrni të dhënat e strukturat dhe CS50, ju do të shihni të tjera aplikacionet për këtë, ajo nuk është domosdoshmërisht gjëja më e mirë. Sepse nëse një funksion quan veten, e quan veten, edhe në qoftë se ka një bazë rast, në qoftë se ju nuk e goditi atë rastin bazë thirrjet për 1.000 apo 10.000 telefonata, nga koha që ju mund të keni drejtuar nga dhoma on ashtuquajturës rafte tuaj dhe e goditi disa segmente të tjera të kujtesës. Pra, edhe ajo është një dizajn të tregtisë-off në mes të hijeshi dhe në mes të Fuqia e veçantë tuaj zbatimi. Pra, ka një downside ose tjetër Gotcha për atë që ne kemi qenë bërë deri tani. Kur kam quajtur getString - më lejoni të kthehem në Hello-2. Vini re se unë jam duke e quajtur getString, e cila është kthyer një adresë. Dhe ne sot pretendojnë se adresa eshte nga pirgut. Dhe tani unë jam i shtypjes nga string në atë adresë. Por ne kurrë nuk e kam quajtur kundërta e getString. Ne kurrë nuk kam pasur për të CALLL një funksion si ungetstring, ku ju dora mbrapa se kujtesa. Por sinqerisht ne ndoshta duhet të ketë qenë. Sepse në qoftë se ne vazhdojmë të kërkuar kompjuterin për kujtesën, nga mënyra e dikujt si getString por kurrë nuk jepni atë përsëri, me siguri që gjithashtu është i detyruar të çojë në Problemet ku kemi drejtuar jashtë kujtesës. Dhe në fakt, ne mund të shikoni për këto Problemet me mjet të ri e të cilit përdorimi eshte nje kriptuar pak te tipit. Por më lejoni të shkoj përpara dhe spërkatje atë në ekran në një moment të vetëm. Unë jam duke shkuar për të shkuar përpara dhe të drejtuar Rregullat e ndërprerjes me parametrin e parë e të cilit komandë Argumenti linjë është emri e atij programi Hello-2. Dhe për fat të keq kjo është prodhimi është atrociously komplekse për asnjë arsye të mirë. Pra, ne shohim të gjitha rrëmujë atë. Davidi është deklarojë emrin tim. Pra, kjo është programi në fakt running. Dhe tani ne kemi marrë këtë prodhim. Shprehje Pra është e ngjashme në shpirt ndaj GDB. Kjo nuk është një debugger në vetvete. Por kjo është një checker kujtesës. Është një program që do të drejtuar tuaj programojnë dhe të ju tregojnë nëse ju kërkohet një kompjuter për kujtesën dhe kurrë nuk dorëzuar atë mbrapa, në këtë mënyrë do të thotë se ju keni një rrjedhje kujtim. Dhe rrjedhjet e kujtesës priren të jenë të këqija. Dhe ju është përdoruesit e kompjuterave kanë ndoshta mendonin këtë, nëse ju keni një Mac apo PC. A keni përdorur ndonjëherë kompjuterin tuaj për ndërkohë që nuk restartohet dhe në disa ditë, ose ju keni vetëm mori një shumë të drejtimin e programeve, dhe gjë damn ngadalëson për të ndalur një kërcëllimë, ose të paktën kjo është super i bezdisshëm për t'u përdorur, sepse çdo gjë mori vetëm super të ngadalshëm. Tani që mund të jetë çdo numër arsyesh. Kjo mund të jetë një lak të pafund, një bug në Kodi i dikujt, ose, më thjesht, kjo mund të thotë se ju jeni duke përdorur më shumë kujtesës, ose duke u përpjekur për të, se sa tuaj kompjuteri në fakt ka. Dhe ndoshta ka një bug në një program që mbajnë kërkuar për kujtesën. Browsers për vitet ishin të njohur për kjo, duke kërkuar për më shumë memorie dhe më shumë por kurrë dorëzimin atë përsëri. Sigurisht, në qoftë se ju keni vetëm një kufizuaren shuma e kujtesës, ju nuk mund të kërkoni pafundësisht shumë herë për disa prej se kujtesa. Dhe kështu që ajo që ju shihni këtu, edhe pse Shprehje përsëri prodhimi është panevojshme kompleks për shikim në Së pari, kjo është pjesë interesante. Heap - në përdorim në dalje. Kështu që këtu është se sa memorie ishte në përdorim në grumbujt Ora programi im exited - me sa duket gjashtë bytes në një bllok. Kështu që unë jam duke shkuar për të tundë duart e mia në çfarë një bllok është. Mendoni se është vetëm një copë, një më shumë Fjala teknike për copë. Por gjashtë bytes - çfarë janë gjashtë bytes që ishin ende në përdorim? Saktësisht. D-A-V-I-D backslash zero, pesë letër Emri plus Terminator null. Pra, ky program Shprehje vënë re se unë pyeti për gjashtë bytes, me sa duket, nga Mënyra e getString, por kurrë dha ato mbrapa. Dhe në fakt, kjo nuk mund të jetë aq e qartë nëse programi im nuk është tre linjat, por kjo është 300 rreshta. Pra, ne në fakt mund të japin një tjetër komandë Argumenti linjë Rregullat e ndërprerjes të të bëjë atë më të fjalëshumë. Është pak i bezdisshëm për të kujtuar. Por në qoftë se unë bëj - le të shohim. Rrjedhje - Ishte ajo del në shesh - edhe unë nuk e mbani mend çfarë është ajo off dorë. - Rrjedhje-check barabartë plotë. Yep, thank you. - Rrjedhje-check barabartë plotë. Enter. Programi i njëjtë është i rrjedhshëm. Shkruani në të Davidit përsëri. Tani unë shoh pak më tepër hollësira. Por më poshtë përmbledhjen tog gurësh, i cili është identike me katër - ah, kjo është lloj i bukur. Shprehje Tani është në të vërtetë në kërkim pak më e vështirë në kodin tim. Dhe kjo është thënë se, me sa duket, malloc në linjë - ne zoom out. Në linjë - ne nuk shohim se çfarë linjë është ajo. Por malloc është fajtori parë. Ka një blog në malloc. Të gjithë të drejtë? OK, nr. E drejta? I quajtur getString. getString duket quan malloc. Pra, çfarë linjë e kodit është me sa duket në faj për të paturit e ndarë këtë kujtesë? Le të supozojmë se kushdo që shkroi malloc ka qenë rreth kohë të mjaftueshme që ajo është nuk është faji i tyre. Pra, kjo është ndoshta imja. getString në cs50.c - kështu që është një paraqesë diku në kompjuter - në përputhje 286 duket të jetë fajtori. Tani le të supozojmë se CS50 ka qenë rreth e rrotull për sasi të mirë të kohës, kështu që edhe ne jemi të pagabueshëm. Dhe kështu që nuk është ndoshta në getString se bug qëndron, por më tepër në Hello-2.c linjë 18. Pra, le të marrin një vështrim në se çfarë linjë ishte 18. Oh. Disi kjo linjë nuk është domosdoshmërisht buggy, në vetvete, por kjo është arsyeja prapa atë rrjedhje kujtesës. Pra thjesht super, çfarë do intuitivisht të jetë zgjidhja këtu? Nëse ne jemi duke kërkuar për kujtesën, asnjëherë nuk ishin duke i dhënë atë përsëri, dhe që duket të jetë një problem, sepse me kalimin e kohës kompjuterin tim mund të dalë jashtë kujtesës, mund të ngadalësojë poshtë, gjëra të këqija mund të ndodhë, mirë, çfarë është zgjidhje e thjeshtë intuitiv? Vetëm jepni atë përsëri. Si mendoni ju se lirë deri memorie? Well, fatmirësisht kjo është mjaft e thjeshtë të them vetëm emrin lirë. Dhe ne kurrë nuk kam bërë këtë më parë. Por ju mund të thelb të mendojnë për pa pagesë si e kundërta e malloc. lirë është e kundërta e alokimin e kujtesës. Pra, tani më lejoni të përpiluar këtë. Bëni Hello-2. Më lejoni të drejtuar atë përsëri. Hello-2 Davidi. Pra, kjo duket për të punuar në saktësisht të njëjtën mënyrë. Por, nëse unë kthehem në Rregullat e ndërprerjes dhe ri-drejtuar se urdhërimi i njëjtë në të sapo ime përpiluar, programi typing në emrin tim si më parë - bukur. Permbledhja Heap - në përdorim në dalje - zero bytes në blloqe zero. Dhe kjo është super e bukur, të gjithë blloqe të grumbullosh u liruan. Asnjë rrjedhjet janë të mundshme. Pra vjen, jo me Set Problem 4, por me Set Problem 5, mjeko-ligjore dhe tutje, kjo shumë do të bëhet një Masa e korrektësinë e juaj Programi, nëse janë apo jo ju keni ose nuk kanë rrjedhjet e kujtesës. Por fatmirësisht, jo vetëm ju mund të arsyetojë nëpërmjet atyre intuitivisht, e cila është, ndoshta, i lehtë për programe të vogla por më e vështirë për programet më të mëdha, Rregullat e ndërprerjes, për ato programe më të mëdha, mund të ju ndihmojë të identifikojnë problem i veçantë. Por ka një problem tjetër që mund të lindin. Më lejoni të hapur këtë skedë këtu, e cila është, përsëri, një shembull i thjeshtë disi. Por le të përqëndrohen në atë ky program bën. Kjo është quajtur memory.c. Ne do të postoj këtë sot më vonë në zip e kodit burimor të sotëm. Dhe vëreni se unë kam një funksion të quajtur f që merr asnjë argumentet dhe kthen asgjë. Në linjë 20, unë jam deklaruar me sa duket një tregues për një int dhe ta quanin x. Unë jam caktimin është kthimi Vlera e malloc. Dhe vetëm të jetë i qartë, sa bytes am Unë ndoshta duke u kthyer nga malloc në këtë situatë? Ndoshta 40. Ku ju merrni se nga? E pra, nëse ju kujtohet se një int shpesh është 4 bytes, te pakten ajo eshte ne aplikim, 10 herë 4 është padyshim 40. Pra malloc po kthehet një adresë të një copë e kujtesës dhe ruajtjen që adresuar në fund të fundit në x. Pra, të jetë i qartë, çfarë atëherë po ndodh? E pra, më lejoni të kaloni mbrapa për foto tonë këtu. Më lejoni të tërheq jo vetëm fundin e mia memorie të kompjuterit, më lejoni të shkoj përpara dhe të barazim drejtkëndësh tërë që përfaqëson të gjithë RAM tim. Ne do të themi se rafte është në pjesën e poshtme. Dhe ka një segment në tekst të dhënat uninitialized. Por unë jam vetëm duke shkuar për të abstrakte ato gjëra të tjera larg si dot, dot dot. Unë jam vetëm duke shkuar për të referuar në këtë si tog në krye. Dhe pastaj në fund të kësaj tabloje, për të përfaqësuar kryesor, unë jam duke shkuar për të dhënë atë një kujtim feta në pirg. Për f, unë jam duke shkuar për të dhënë atë një fetë e kujtesës në rafte. Tani, unë kam për të konsultuar e mia; kodi burim përsëri. Cilat janë variablat lokale për kryesor? Me sa duket asgjë, kështu që fetë është efektivisht bosh ose jo edhe aq i madh si unë e kam tërhequr atë. Por në f, unë kam një ndryshore lokale, e cila është quajtur x. Kështu që unë jam duke shkuar për të shkuar përpara dhe për t'u dhënë f një copë e kujtesës, duke e quajtur atë x. Dhe tani malloc i 10 herë 4, Pra malloc 40, ku se kujtesës që vijnë nga? Ne nuk kemi tërhequr një foto si kjo para. Por le të supozojmë se kjo është në mënyrë efektive vijnë nga këtu, kështu që një, dy, tre, katër, pesë. Dhe tani kam nevojë për 40 nga këto. Kështu që unë vetëm do të bëj dot, dot, dot të sugjerojnë se ka edhe më shumë memorie vijnë nga togu. Tani çfarë është adresa? Le të zgjedhin arbitrare tonë adresuar si gjithmonë - Ox123, edhe pse ajo ndoshta do të jetë diçka krejtësisht të ndryshme. Kjo është adresa e parë në bajt kujtesës që unë jam duke kërkuar për malloc. Pra, në linjë të shkurtër, dikur 20 ekzekuton, çfarë është fjalë për fjalë ruhen brenda x këtu? Ox123. Ox123. Dhe Dem është jointeresant. Ajo thjesht do të thotë këtu është një numër heksadecimal. Por ajo që është kryesore është se ajo që unë kam dyqan në X, i cili eshte nje variabli lokal. Por lloji të dhënave të saj, përsëri, eshte nje adrese e nje int. E pra, unë jam duke shkuar për të ruajtur Ox123. Por përsëri, në qoftë se kjo është pak a shumë të komplikuar të panevojshme, në qoftë se unë lëviz përsëri, ne mund të abstrakt ky mjaft larg të arsyeshme dhe të them vetëm se x është një tregues për atë copë të kujtesës. OK. Tani pyetja në dorë eshte mëposhtme - Linja 21, ajo rezulton, është buggy. Pse? Na vjen keq? Ajo nuk duhet - thonë se një herë më shumë. E pra, kjo nuk e bën lirë. Pra, kjo është e dytë, por. Pra, ka një tjetër, por në mënyrë specifike në linjë 21. Saktësisht. Kjo linjë e kodit është thjeshtë vetëm një del nga shtrati tampon, tampon një muar. Një tampon të thotë vetëm një copë e kujtesës. Por kjo copë e kujtesës është i madhësisë 10, 10 integers, që do të thotë në qoftë se ne indeksi në atë duke përdorur sheqer sintaktik e simbol array, sheshi kllapa, ju keni qasje në x kllapa 0 x 1 x parantezë, parantezë dot, dot, dot. x 9 parantezë është një më i madh. Pra, nëse unë bëj x parantezë 10, ku Unë në fakt jam duke shkuar në kujtesën? E pra, nëse unë kam 10 int - le të vërtetë të tërheqë të gjithë nga këto këtu. Kështu që ishte pesë të parë. Ja pesë të tjerë ints. Pra x kllapa 0 është këtu. 1 x kllapa është këtu. x parantezë 9 është këtu. x kllapa 10 është këtu, që do të thotë unë jam i thënë, në linjë 21, kompjuter për të vënë numri ku? Numri 0, ku? E pra, kjo është 0, po. Por vetëm fakti se 0 i saj është lloj i një rastësi. Kjo mund të jetë numri i 50, për të gjithë ne kujdes. Por ne jemi duke u përpjekur për ta vënë atë në x kllapa 10, e cila eshte ku ky pikëpyetje është tërhequr, e cila nuk është një gjë e mirë. Ky program mund shumë mirë rrëzimit si rezultat. Tani, le të shkojë përpara dhe të shohim nëse kjo është, në të vërtetë, se çfarë ndodh. Bëni kujtesë, pasi fotografinë quhet memory.c. Le të shkojnë përpara dhe të drejtuar kujtesës program. Pra, kemi marrë me fat, në fakt, kjo duket. Ne morëm me fat. Por le të shohim nëse ne tani të drejtuar Shprehje. Në shikim të parë, programi im mund duket të jetë krejtësisht e saktë. Por më lejoni të drejtuar Rregullat e ndërprerjes me - Rrjedhje-check barabartë plotë në kujtesë. Dhe tani, kur kam drejtuar këtë - interesante. Invalid shkruaj e madhësisë 4 në Linja 21 e memory.c. Linja 21 e memory.c e cila është një? Oh, interesante. Por prisni. Size 4, çfarë është ajo duke iu referuar? Unë kam vetëm një shkruaj, por kjo është e madhësisë 4. Pse është 4? Kjo është për shkak se ajo është një int, e cila është, përsëri, katër bytes. Pra Rregullat e ndërprerjes gjetur një bug që unë, glancing në kodin tim, nuk e bëri. Dhe ndoshta TF juaj do apo nuk do. Çfarë Por, për të gjetur Rregullat e ndërprerjes sigurt se ne kemi bërë një gabim atje, madje edhe edhe pse kemi marrë me fat, dhe kompjuteri vendosi, eh, unë nuk jam duke shkuar për të rrëzuar vetëm për shkak se keni prekur një bajt, një vlerë Int i kujtesës që ju nuk e keni në fakt vetë. E pra, çfarë tjetër është buggy këtu. Adresa - kjo është një adresë çmendur në kërkim në heksadecimal. Kjo thjesht do të thotë diku në tog është zero bytes pas një bllok të madhësisë 40 është e ndarë. Më lejoni të zoom out këtu dhe të shohim nëse kjo është pak më e dobishme. Interesting. 40 bytes janë të humbur definitivisht në humbje rekord 1 prej 1. Përsëri, më shumë fjalë se është e dobishme këtu. Por, bazuar në linjat e theksuara, ku duhet unë ndoshta fokusi im Vëmendje për një tjetër bug? Duket si një linjë 20 të memory.c. Pra, nëse ne kthehemi në linjë 20, që është një që ju të identifikuar më herët. Dhe kjo nuk është domosdoshmërisht buggy. Por ne e kemi këtë përmbyset efektet e saj. Pra, si nuk kam korrigjuar të paktën një nga ato gabime? Çfarë mund të bëj unë pas vijës 21? Unë mund të bëjë pa x, kështu që është e për t'i kthyer atë kujtesës. Dhe si mund ta rregullojmë këtë bug? Unë duhet patjetër të shkoni jo më larg se 0. Pra më lejoni të përpiqen dhe të ri-drejtuar këtë. Na vjen keq, patjetër të shkoni jo më larg se 9. Bëni kujtesës. Më lejoni ribërjen Rregullat e ndërprerjes në një dritare të madhe. Dhe tani shohim. Bukur. Të gjitha blloqet grumbullosh u liruan. Asnjë rrjedhjet janë të mundshme. Dhe deri këtu më sipër, nuk ka asnjë përmendje cilido më i drejte pavlefshme. Vetëm të merrni lakmitar, dhe le të shohim nëse një tjetër demonstratë nuk shkojnë si qëllim - Unë e kam marrë me fat një moment më parë. Dhe fakti që kjo është 0 është ndoshta panevojshme mashtruese. Le të vetëm të bëjë 50 vjeç, një disi arbitrar numrin, të bëjë dot kujtesës memorie vizë-- ende të merrni me fat. Asgjë nuk është crashing. Supozoni se unë vetëm të bëjë diçka të vërtetë qesharake, dhe unë bëj 100. Më lejoni të ribërë kujtesën, dot kujtesës slash - mori me fat përsëri. Si rreth 1,000? ints përtej, afërsisht, ku unë duhet të jetë? Bëni kujtesës - mallkonte atë. [Qeshura] OK. Le të mos bela rreth anymore. Ribërjen kujtesës. Ka të shkojmë. Dakord. Pra, me sa duket ju indeksi 100.000 ints përtej ku ju duhet të keni qenë në kujtesës, ndodhin gjëra të këqija. Pra, kjo nuk është e qartë një vështirë, rregull të shpejtë. Unë kam qenë duke përdorur lloj i gjykimit dhe gabim për të arritur atje. Por kjo është për shkak se, histori të gjatë të shkurtër, memorie kompjuteri juaj është e ndarë edhe në këto gjëra quhet segmente. Dhe ndonjëherë, në fakt kompjuteri ju ka dhënë një memorie pak më shumë se ju kërkoni. Por për efikasitet, kjo është vetëm e lehtë për të merrni më shumë memorie, por vetëm t'ju them se ju jeni duke marrë një pjesë të saj. Dhe në qoftë se ju merrni me fat ndonjëherë, Prandaj, ju mund të jetë në gjendje për të prekur kujtesës që nuk i takon për ju. Ju keni asnjë garanci se ajo që vlera e ju vënë atje do të qëndrojnë atje, sepse kompjuteri ende mendon se kjo nuk është e juaji, por kjo nuk është domosdoshmërisht do për të goditur një tjetër segment të kujtesës në kompjuter dhe të shkaktoj një gabim si kjo këtu. Dakord. Çfarëdo pyetjeje pastaj në kujtesë? Dakord. Le të hidhni një sy këtu, atëherë, në diçka që ne kemi qenë duke marrë për dhënë për mjaft kohë, e cila është në këtë dosje të quajtur cs50.h. Pra, kjo është një file i. Këto janë vetëm një bandë e tërë Komentet e deri të lartë. Dhe ju mund të keni shikuar në këtë, nëse ju poked rreth në aplikim. Por kjo rezulton se gjatë gjithë kohës, kur kemi përdorur për të përdorur si një varg sinonim, mjetet me të cilat ne kemi deklaruar që ishte sinonim me këtë fjalen typedef, për përcaktimin e tipit. Dhe ne jemi në thelb duke thënë, të bëjë string sinonim për yllin char. Që mjetet me të cilat rafte krijuar këto rrota trajnimit të njohura si string. Tani këtu është vetëm një prototip për getchar. Ne mund të keni parë atë më parë, por kjo është me të vërtetë atë që bën. getchar nuk merr argumente, kthen një char. getdouble nuk merr argumente, kthen një të dyfishtë. getfloat merr nuk ka argumente, kthimet një noton, dhe kështu me radhë. getint eshte ne ketu. getlonglong eshte ne ketu. Dhe getString është këtu. Dhe kjo është ajo. Kjo linjë purple është një tjetër preprocessor direktivë për shkak të hashtag në fillim të saj. Dakord. Deri tani më lejoni të shkoj në cs50.c. Dhe ne nuk do të flasim shumë kohë për këtë. Por, për të ju jap një paraqitje e shkurtër e asaj që është qenë duke shkuar në të gjithë këtë kohë, më lejoni të shkoj në - le të bëjmë getchar. Pra, është më së shumti getchar komente. Por kjo duket si ky. Pra, ky është funksioni aktual getchar se ne kemi qenë duke marrë për të dhënë ekziston. Dhe edhe pse ne nuk e kemi përdorur këtë një që shpesh, në qoftë se ndonjëherë, kjo është të paktën relativisht e thjeshtë. Pra, kjo është me vlerë duke marrë një vështrim i shpejtë në këtu. Pra getchar ka një lak të pafund, qëllimisht kështu duket. Ajo pastaj e quan - dhe kjo është lloj i një ripërdorimin e kodit bukur ne vetë shkruajtur. Ajo e quan getString. Sepse ajo që e bën atë do të thotë për të marrë një char? E pra, si edhe ju mund të përpiqen për të marrë një linjë e tërë e tekstit nga përdoruesit dhe atëherë vetëm shikoni në njërën e këtyre karaktereve. Në linjë 60, këtu është pak pak e një kontroll sanitar. Nëse getString kthye null, le të mos vazhdojë. Diçka shkoi keq. Tani kjo është disi i bezdisshëm, por konvencionale në char C. max ndoshta përfaqëson atë vetëm bazuar mbi emrin e saj? Kjo është një konstante. Është si me vlerën numerike të madh char ju mund të përfaqësojë me një pickim, e cila është ndoshta numri 255, i cili është numri më i madh që ju përfaqësojnë tetë bit, duke filluar nga zero. Kështu që unë kam përdorur këtë, në këtë funksion, kur shkruar këtë kod, vetëm për shkak se nëse diçka shkon keq në getchar por qëllimi i tij në jetë është që të kthehen një char, ju duhet të jetë në gjendje disi te sinjal te te perdoruesit asaj diçka shkoi keq. Ne nuk mund të kthehen null. Ajo rezulton se null është një akrep. Dhe përsëri, getchar ka të kthehen një char. Pra konventë, nëse diçka shkon keq, eshte qe, programues, ose në Në këtë rast, mua me bibliotekën, kam pasur vetëm një të vendosë në mënyrë arbitrare, në qoftë se diçka shkon keq, unë jam duke shkuar për kthehen në numrin 255, e cila është me të vërtetë do të thotë që ne nuk mund, përdoruesi nuk mund të shtypni karakter përfaqësuar nga numër 255, sepse kemi pasur një vjedhin atë si një vlerë ashtuquajturës sentinel për paraqesin një problem. Tani del se karakteri 255 nuk është diçka që ju mund të shtypni në tastierës tuaj, kështu që nuk është punë e madhe. Shfrytëzuesi nuk vëreni se Unë e kam vjedhur këtë karakter. Por në qoftë se keni parë ndonjëherë në faqet e njeri në një Sistemi kompjuterik disa referenca tek një të gjitha shkronja kapitale të vazhdueshme si kjo që thotë, në rastet e gabimit kjo mund konstante të kthehen, që të gjithë e njeriut bëri disa vjet më parë u vendos në mënyrë arbitrare për të kthyer këtë vlerë të veçantë dhe e quajnë atë një konstante në rast diçka shkon keq. Tani magjike ndodh këtu poshtë. Së pari, unë jam deklaruar në linjë 67 Dy karaktere, C1 dhe C2. Dhe pastaj në linjë 68, nuk ka të vërtetë një linjë e kodit që e kujton miku ynë printf, duke pasur parasysh se ajo sexsy do deshiroja qind Cs në thonjëza. Por vini re se çfarë po ndodh këtu. sscanf thotë scan string - do të thotë të skanoni një formatuar string, sscanf ergo. Çfarë do të thotë kjo? Kjo do të thotë që ju të kalojë në sscanf një varg. Dhe linja është çdo gjë lloje përdorues in Ju sscanf të kalojë në një varg format si kjo tregon se çfarë janë scanf ju duke shpresuar se përdoruesi ka shtypur in Ju pastaj të kalojë-në adresat e dy chunks e kujtesës, në këtë rast, sepse unë kam dy placeholders. Kështu që unë jam duke shkuar për të dhënë atë adresë i C1 dhe i adreses C2. Dhe kujtoj se ju jepni një funksion Adresa e disa ndryshore, çfarë është implikimi? Çfarë mund të bëjë që funksionojnë si rezultat i dhënë asaj një adresë të një variabël, në krahasim me ndryshueshme në vetvete? Ajo mund të ndryshojë atë, e drejtë? Nëse keni pasur një hartë dikë për një fizik adresën, ata mund të shkojnë atje dhe të bëjë çdo gjë që ata duan në atë adresë. Ideja e njëjtë këtu. Nëse ne të kalojë në sscanf, adresa e dy chunks e kujtesës, edhe këto tiny chunks vogla e kujtesës, C1 dhe C2, por ne tregoni adresën e tyre, sscanf mund ta ndryshoni atë. Pra, qëllimi sscanf në jetën, nëse lexojmë Faqja njeriu, është për të lexuar se çfarë përdorues shtypen në, shpresë për përdorues pasur shtypur në një karakter dhe ndoshta një tjetër karakter, dhe çdo gjë përdorues shtypen, karakteri i parë shkon këtu, personazhi i dytë shkon këtu. Tani, si një mënjanë, kjo, dhe ju do të vetëm e di këtë nga dokumentacioni, Fakti që unë kam vënë një hapësirë ​​bosh aty thjesht do të thotë se unë nuk e kujdesit në qoftë se përdoruesit hits space bar një pakice herë para se ai ose ajo merr një karakter, unë jam duke shkuar për të injorojë ndonjë hapësirë ​​të bardhë. Kështu që, unë e di nga dokumentacionin. Fakti që ka një të dytë c% ndjekur nga hapësirë ​​të bardhë është në të vërtetë qëllimshme. Unë dua të jem në gjendje për të zbuluar nëse përdoruesi dehur ose nuk bashkëpunojnë. Kështu që unë jam duke shpresuar se përdoruesi typed vetëm në një karakter, prandaj unë jam duke shpresuar sscanf se është vetëm do të kthehen Vlera e 1 sepse, përsëri, në qoftë se kam lexuar dokumentacioni, qëllimi sscanf në jeta është për t'u kthyer në numrin e Variablat që janë të mbushura me user input. Kam kaluar në dy variablave trajton, C1 dhe C2. Unë jam duke shpresuar, edhe pse, se vetëm njëri prej ata të vritet, sepse nëse sscanf Kthimet 2, çfarë është me sa duket implikimi logjikisht? Se përdoruesi nuk ka të jepni vetëm një Karakteri si unë i thashë atij apo të saj. Ata shtypur ndoshta në paku dy karaktere. Pra, në qoftë se unë nuk kanë vend të dytë C%, unë vetëm e kishte një të tillë, e cila sinqerisht do të jetë më intuitiv qasje, unë mendoj se një shikim të parë, ju nuk jeni do të jetë në gjendje për të zbuluar në qoftë se përdoruesi ka qenë duke ju dhënë më shumë input se ju në të vërtetë të kërkuar. Pra, kjo është një formë implicite e kontrollit të gabimit. Por njoftim se çfarë bëj unë këtu. Pasi unë jam i sigurt që përdoruesi më dha një karakteri, kam liruar linjë, duke bërë kundërta e getString, e cila nga ana përdor malloc, dhe pastaj unë kthehem C1, karakteri që kam shpresuar User dhënë dhe siguruar vetëm. Pra, një të shpejtë rrëshqitazi vetëm, por ndonjë pyetje në getchar? Ne do të vijnë përsëri në disa nga të tjerët. E pra, më lejoni të shkoj përpara dhe të bëjë këtë - mendoj tani, vetëm për të motivuar tonë Diskutimi në një javë plus kohës, kjo është një file i quajtur structs.h. Dhe përsëri, kjo është vetëm një shije i diçkaje që shtrihet përpara. Por vini re se një shumë e kjo është e komente. Pra më lejoni të theksoj vetëm Pjesa interesante tani për tani. typedef - nuk ka se fjalen e njëjtë përsëri. typedef ne përdorim për të deklaruar varg si një lloj të veçantë të të dhënave. Ju mund të përdorni për të krijuar typedef krejt të re Llojet e të dhënave që nuk ekzistojnë, kur C u shpik. Për shembull, int vjen me C. char vjen me C. dyfishtë vjen me C. Por, nuk ka asnjë nocioni i një studenti. Dhe ende ajo do të jetë mjaft e dobishme që të jetë në gjendje të shkruaj një program që ruan në një variabël, numri i ID e nxënësit, emri i tyre, dhe shtëpia e tyre. Me fjalë të tjera, tre copë e të dhënave, si një int dhe një dhe një tjetër string string. Me typedef, çfarë është goxha i fuqishëm në lidhje me këtë dhe sturct fjalen per Struktura, ju, programues në vitin 2013, në fakt mund të përcaktojë tuaj Llojet e të dhënave që nuk ekzistojnë vjet më parë, por që i përshtaten qëllimet tuaja. Dhe kështu që këtu, në linjat 13 deri 19, ne jemi duke deklaruar një lloj të ri të dhënave, si një int, por duke e quajtur atë nxënës. Dhe brenda këtij variabli do të të jetë tre gjëra - një int, një varg, dhe nje varg. Kështu që ju mund të mendoni se çfarë është me të vërtetë ka ndodhur këtu, edhe pse kjo është një pak e një thjeshtëzim për sot, një student është në thelb shkon për të duket si ky. Saj do të jetë një copë e memorie me nje ID, nje Emri fushë, dhe një fushë shtëpia. Dhe ne do të jetë në gjendje të përdorin ato chunks e kujtesës dhe qasjen e tyre si më poshtë. Nëse unë shkoj në struct0.c, këtu është një relativisht të gjatë, por pas një model, të kodit që përdor këtë mashtrim të ri. Pra, së pari, më lejoni të tërheq vëmendjen tuaj në pjesët interesante deri të lartë. Sharp përcakton studentët 3, deklaron një Nxënësit e vazhdueshme quajtur dhe cakton ajo arbitrarisht numër 3, vetëm kështu që unë kam tre nxënësit duke përdorur ky program tani për tani. Këtu vjen Main. Dhe vini re, se si unë deklaroj një grup i nxënësve? E pra, unë vetëm përdorni sintaksë e njëjtë. Studenti Fjala është padyshim i ri. Por, nxënëse të klasës, simboli i studentëve. Pra, për fat të keq nuk ka shumë i ripërdorimin e termave këtu. Kjo është vetëm një numër. Pra, kjo është si duke thënë se tre. Klasa është vetëm ajo që unë dua për të thirrur ndryshore. Unë mund të telefononi atë studentët. Por klasa, kjo nuk është një klasë në një objekt orientuar lloj Java e rrugës. Është vetëm një klasë të nxënësve. Dhe lloji i të dhënave çdo element në atë array është studenti. Pra, kjo është pak më ndryshe dhe nga thënë diçka si kjo, kjo është vetëm - Unë jam duke thënë se më jepni tre studentë dhe të thërrasë atë klasë vektorit. Dakord. Tani këtu është një lak katër. Ky djalosh i njohur s - iterate nga zero në deri në tre. Dhe këtu është pjesë e re e sintaksës. Programi do të shkaktonte mua, njerëzore, për të dhënë atë një student ID, e cila eshte nje int. Dhe këtu është sintaksë me të cilën ju mund të ruajtur diçka në fushën e identifikimit të klasë Vendndodhja parantezë I. Pra, Sintaksa kjo nuk është e re. Kjo thjesht do të thotë jepni teta studenti në klasë. Por ky simbol është e re. Deri tani, ne kemi nuk mund të përdoret dot, të paktën në kod si kjo. Kjo do të thotë shkoni në struct njohur si një student dhe vënë diçka atje. Në mënyrë të ngjashme, në këtë linjë e ardhshëm, 31, shkoni përpara dhe të vënë çdo gjë që përdoruesi lloje për një emër këtu dhe atë që bëjnë ata për një shtëpi, të njëjtën gjë, të shkojnë përpara dhe të vënë atë në. shtëpinë. Pra, çfarë e bën këtë program në fund të fundit të bëjë? Ju mund të shihni një ngacmues pak atje. Më lejoni të shkojnë përpara dhe të bëjnë structs 0 dot slash struct 0, ID studentit 1, thonë David Mather, studenti ID 2. Rob Kirkland, studenti ID 3. Lauren Leverit - dhe e vetmja gjë që ky program e bëri, e cila është vetëm krejtësisht arbitrare, është Doja të bëjë diçka me këto të dhëna, tani që unë kam na mësoi se si të përdorni structs, është që unë vetëm e kishte loop kjo shtesë këtu. Unë iterate mbi array e nxënësve. I përdorur, miku ynë i njohur, ndoshta tani string krahasoni, stircomp të çeku është shtëpia e studentit 8 barabartë me Mather? Dhe nëse është kështu, vetëm të printuar diçka arbitrarisht pëlqen, po, ai është. Por përsëri, vetëm duke i dhënë mua mundësi të përdorin dhe ripërdorimin dhe ripërdorimin këtë simbol të ri dot. Pra, kush kujdeset, e drejtë? Vjen me një program studentore është disi arbitrare, por ajo rezulton që ne mund të bëjmë gjëra të dobishme me kjo, për shembull si më poshtë. Kjo është një struct shumë më e komplikuar në C. Ajo ka një duzinë apo më shumë fusha, disi quajtur cryptically. Por në qoftë se ju keni dëgjuar ndonjëherë një grafikë Formati i file i quajtur bitmap, BMP, ajo rezulton se format bitmap fotografi pretty much duket se ky. Kjo është një budalla pak përballen me smiley. Është një imazh i vogël që unë kam zoomed në on goxha i madh në mënyrë që unë mund të shoh çdo i dots individuale ose pixels. Tani, ajo del ne mund të përfaqësojë një dot zi me, të themi, numri 0. Dhe një të bardhë dot me numrin 1. Pra, me fjalë të tjera, në qoftë se ju doni për të nxjerrë një Përballen me smiley dhe për të shpëtuar atë në një imazh kompjuteri, kjo mjafton për të ruajtur zero dhe ato që duken si ky, ku, përsëri, ato janë të bardhë dhe zero janë të zeza. Dhe së bashku, në qoftë se ju në mënyrë efektive kanë ngjeshuni, një nga ato dhe zero, ju keni një Grid i pixels, dhe në qoftë se ju vë ata jashtë, ju keni një cute pak përballen me smiley. Tani, format bitmap fotografi, BMP, është efektive se nën kapuç, por me pixels Sot më shumë se ju në fakt mund të përfaqësojë ngjyrat. Por kur ju keni më të sofistikuara file formats si PKM dhe JPEG dhe GIF me të cilat ju mund të jenë të njohura, ato fotografi në disk në mënyrë tipike jo vetëm të ketë zero dhe ato për pixels, por ata kanë disa të meta-data si dhe - Meta në kuptimin që nuk është me të vërtetë të dhënave, por kjo është e dobishme që të ketë. Pra, këto fusha janë duke nënkuptuar këtu, dhe ne do të shohim këtë më në hollësi në P-set 5, që para se zero dhe ato që përfaqësojnë piksele në një imazh, ka një bandë e metadata si madhësinë e imazhin dhe Gjerësia e imazhit. Dhe vini re unë jam plucking off disa gjërat arbitrare këtu - gjerësia dhe lartësia. Numërimin Bit dhe disa gjëra të tjera. Pra, ka disa metadata në një skedar. Por, duke e kuptuar se sa fotografi janë të paraqitura në këtë mënyrë, ju mund të vërtetë pastaj manipuluar imazhet, shërohen imazhe nga disku, resize images. Por ju nuk mund domosdoshmërisht zgjeruar ato. Unë e nevojshme një fotografi. Kështu që unë u ktheva në RJ këtu, që ti ke parë në ekran mjaft disa kohë më parë. Dhe në qoftë se unë i hapur deri kryesor këtu, kjo është çfarë ndodh nëse ju përpiqeni të zoom në dhe RJ rritur. Ai nuk ka marrë ndonjë më të mirë të vërtetë. Tani Kryesor është lloj i mjegulluar atë një pak, vetëm për të komentoj mbi Fakti që RJ nuk ka marrë veçanërisht zgjeruara, kur ju zoom in Dhe në qoftë se bëni atë në këtë mënyrë, shikoni sheshet? Yeah, ju mund të patjetër të shihni sheshet në një projektor. Kjo është ajo që ju merrni kur ju të rritur. Por në të kuptuarit se si RJ tonë apo Përballen me smiley është zbatuar do të le të në fakt shkruani kodin që manipulon këto gjëra. Dhe unë mendova se do të përfundojë në këtë shënim, me 55 sekonda të një të rritur që është, Unë guxoj, thonë më tepër mashtruese. [Video playback] -Ai po gënjen. Rreth çfarë, unë nuk e di. -Pra, çfarë dimë? -Se at 09:15 Ray Santoya ishte në ATM. -Pra, pyetja është se çfarë ai është duke bërë at 9:16? Xhirimi-nëntë milimetër në diçka. Ndoshta ai e pa snajper. -Apo ishte duke punuar me të. -Prisni. Kthehu prapa një. -Çfarë e shihni ju? -Sillni fytyrën e tij lart, ekran të plotë. -Syzet e tij. -Ka një reflektim. -Kjo është ekipi baseball Neuvitas. Kjo është logo e tyre. -Dhe ai është duke folur për këdo që është xhaketë veshur atë. [VIDEO END rishikim] DAVID J. Malan: Ky do të jetë Set Problem 5. Ne do të shihemi javën e ardhshme. Kryetari MASHKULL: Në CS50 ardhshëm. [Crickets chirping] [Duke luajtur muzikë]