[Powered by Google Translate] [JAVA 5] [David J. Malan, Universiteti i Harvardit] [Kjo është CS50.] [CS50.TV] [Gruaja] Ai është shtrirë, në lidhje me atë, unë nuk e di. [Man] Pra, çfarë dimë ne? [Gruaja] që në 9:15, Ray Santoya ishte në ATM. [Man] Pra, pyetja është, çfarë ishte ai bën në 09:16? [Gruaja] xhirimi i 9 mm në diçka. Ndoshta ai e pa snajper. [Man] Apo ai ishte duke punuar me të. [Gruaja] Prisni. Kthehu mbrapa një të tillë. [Man] Çfarë e shihni ju? [♫ ♫ muzikë suspenseful] [Gruaja] Sjellë fytyrën e tij deri. Ekran të plotë. [Man] syzet e tij. >> Ka një reflektim. [♫ ♫ muzikë suspenseful] [Man] Kjo është ekipi i Nuevita e baseball. Kjo është logo e tyre. [Gruaja] Dhe ai është duke folur për këdo që e veshur atë xhaketë. [David Malan] Pra, kjo është CS50 javë 5, dhe sot ne kemi prish pak televizion dhe film për ju. Pra, kur ju jeni duke shikuar një shfaqje si ky këtu, dhe policët thonë: "A mund të jeni të pastër se deri?" ose "Rritja" nuk ka asnjë të rritur në botën e vërtetë. Në fakt, ajo që ju të merrni të vërtetë është një diçka të vogël si kjo. Unë e kam tërhequr njërën nga fotot stafit nga faqe. Ky është një program i quajtur Photoshop. Kjo është 1 nga 2 Bowdens, 1 e 3 Bowdens fakt, sot, sepse kemi znj Bowden si edhe këtu, me Rob dhe Palit. Por këtu është Rob në ekran, dhe nëse ne zoom në në atë shkëlqim ai e kishte gjithmonë në sy të tij, ajo që ju shikoni është fakt se ajo që ju shikoni është ajo që ju merrni. Kjo është "rritur", kështu që "CSI" kanë atë pak gabim. Ka një klip tjetër, në qoftë se ne mund të vini në "CSI", vetëm pak më të gjatë. Kjo është një frazë e mirë për të nxjerr tash e tutje në qoftë se ju doni të shëndosha teknike me miqtë tuaj, kur, me të vërtetë, ju jeni duke thënë absolutisht asgjë. [Man] Për javë unë kam qenë duke hetuar vrasjet shofer taksie Killer me një magjepsje të caktuar patologjik. [Woman # 1] Kjo është në kohë reale. [Woman # 2] Unë do të krijojë një ndërfaqe GUI duke përdorur Visual Basic, të shohim nëse unë mund të gjetur një adresë IP. [Malan] Pra audio nga sync mënjanë, duke krijuar një ndërfaqe GUI duke përdorur Visual Basic për të gjetur një adresë IP është e pakuptimtë të plotë. Këto ditë ju nuk do të përdorin Visual Basic, nuk ka nevojë për një GUI, dhe IP adresa ishte një term teknikisht të saktë. Kështu që të mbajë një sy jashtë për këto, dhe një nga të preferuarat e mia: Kjo është pak më e errët, sepse ju duhet të dini një gjuhë të ndryshme. Ka një gjuha quajtur Objektivi-C, i cili është një superset i C. Që do të thotë se është C plus disa karakteristika të tjera, në mesin e tyre object-oriented programimit. Dhe kjo është gjuha që Apple ka popullarizuar për programimin iOS. Dhe kështu që këtu është një klip nga një shfaqje krejt të ndryshme, nga "Numrat" se në qoftë se ju në të vërtetë të shikoni nga afër në TiVo tuaj dhe pauzë në momentin e duhur, ju do të shihni se çfarë ata janë duke kërkuar në nuk është krejt ajo që është duke u përshkruar. Dhe më lejoni të provoni një lidhës të ndryshme audio këtu dhe të shohim nëse ne nuk mund të mbajtur audio sync në këtë kohë. Unë ju jap "Numrat". [Man # 1] Kjo është një 32-bit adresa IPv4. [Man # 2] IP, që është në internet. Rrjeti >> Privat. Është rrjet privat e Anit. [Malan] Okay. Kjo është Objective-C, dhe kjo është për programin e disa kec për t'u ngjyrosur, si ju ndoshta mund të konkludoj nga emri i variablit atje. Kështu që, më pas, ishte "Numrat". Pra, sot dhe këtë javë kemi prezantuar pak e botës së mjekësinë ligjore dhe kontekstin në probleme prandaj. Sot do të jetë një leksion i shkurtuar për shkak se ka një ngjarje të veçantë këtu më pas, kështu që ne do të marrin një vështrim, dhe vë në lojë dy nxënësit dhe prindërit njësoj sot me disa nga gjërat që janë në horizont. Midis tyre, nga e hëna, ju do të keni një pak më shumë shokët e klasës. EDX, Harvardit dhe MITS re iniciativa në internet për të hapur Courseware dhe më shumë, ka nisur në kampus Harvardit të hënën. Që do të thotë e hënë vijnë ju do të keni - si të numërimin e fundit, 86.000 shokët e klasës shtesë do të jetë pas së bashku me ligjërata CS50 së dhe seksione dhe walkthroughs dhe vendos problem. Dhe si pjesë e kësaj, ju do të bëhen anëtarë të klasës së përurimit CS50 dhe tani CS50x. Si pjesë e kësaj, tani e kuptojnë se nuk do të ketë disa upsides si. Të marrë të gatshme për këtë, për numrin masiv të nxënësve, mjafton të themi se edhe pse ne kemi 108 TFS dhe CAS, jo mjaft të mirë nxënës / arsimtar dikur ne hit 80.000 studentë të tjerë. Pra, ne nuk do të jetë nota problemi kaq shumë vë dorë. Futur kështu këtë javë në setin e problemit do të jetë CS50 Check, e cila do të jetë një linjë komande të shërbimeve në kuadër të pajisjes që ju do të merrni një herë ju update it më vonë këtë fundjavë, dhe ju do të jetë në gjendje për të drejtuar një komandë, kontrolloni 50, më pset tuaj, dhe ju do të merrni disa reagime lidhur me atë nëse programi juaj është sakta ose të pasakta, sipas specifikimeve të projektimit të ndryshme që kemi dhënë. Pra, më shumë se dhe vendosur problemi specifikimet dhe shokët e klasës CS50x do të jetë duke përdorur këtë si. Pra, problemi set 4 është mbi të gjitha mjekësinë ligjore. Dhe kjo pjesë u frymëzua nga disa sende të vërtetë të jetës, ku kur isha në shkollën e diplomuar, unë internuar për një kohë me Zyrës së Prokurorit të Rrethit të qarkut MIDDLESEX-së e bërë punën ligjore me hetues të çojë mjeko-ligjor të tyre, dhe atë që ky arriti në po, unë mendoj se kam përmendur të kaluarën e një javë pak, është policia masive shtetërore ose të tjerët do të vijnë në, ata do të bjerë jashtë gjëra të tilla si hard drives dhe CD dhe floppy disqe dhe si, dhe pastaj qëllimi i zyrës mjeko-ligjore për të verifikuar nëse ishte nuk ishte apo nuk ishte dëshmi e disa lloj. Kjo ishte Njësiti i Hetimeve Speciale, kështu që ishte e bardhë-kular krimit, ajo ishte lloj më shqetësues i krimeve, çdo gjë që përfshin disa lloj të mediave digjitale, rezulton se nuk është se shumë njerëz shkruani një email duke thënë se "unë e bëri atë." Pra, mjaft shpesh këto kërkime mjeko-ligjore nuk kthehet deri të gjitha frutat që shumë, por ndonjëherë njerëzit do të shkruajnë email tilla. Pra, ndonjëherë përpjekjet u shpërblyen. Por për të çojë deri në këtë pset mjeko-ligjor, ne do të jetë futur në një pset 4 bit e graphics. Pra, ju ndoshta merrni këto gjëra për të dhënë, jpegs, gifs dhe si këto ditë, por në qoftë se jeni të vërtetë mendoni rreth saj, një imazh, ashtu si fytyra e Rob, mund të modeluar si një sekuencë të dots, ose pixels. Tani, në rastin e fytyrës Rob, ka të gjitha llojet e ngjyrave, dhe kemi filluar të shohim dots individuale, të njohura si otherwide pixels, sapo kemi filluar të zoom in Por nëse ne thjeshtojë botën një pak, dhe vetëm thonë se ky këtu është Rob në të zezë dhe të bardhë, të mirë, për të përfaqësuar zezë dhe e bardhë mund të përdorni vetëm binar. Dhe në qoftë se ne jemi duke shkuar për të përdorur binar, 1 ose 0, ne mund të shprehin këtë imazh të njëjtë e fytyrës qeshur Rob me këtë model të bit: 11000011 përfaqëson bardhë, e bardhë, e zezë, e zezë, e zezë, e zezë, e bardhë e bardhë. Dhe kështu që nuk është një hap i madh, pastaj, për të filluar duke folur për fotografitë shumëngjyrëshe. Gjëra që ju do të shihni në Facebook ose të marrë me një aparat fotografik dixhital, por, sigurisht, kur është fjala për ngjyra, ju keni nevojë për më shumë bit. Dhe mjaft e zakonshme në botën e fotografive është që të përdorin ngjyra jo 1-bit, si kjo sugjeron, por 24-bit ngjyra, ku ju në të vërtetë të merrni miliona të ngjyrave. Pra, si në rastin kur ne zoomed në në sy Rob, se ishte ndonjë numër të miliona mundësive të ndryshme ngjyra. Pra, ne do të prezantoj këtë grup Problem 4, si dhe në walkthrough, cila do të jetë sot në 03:30 në vend të zakonshme 2:30 shkak të leksionit premtes këtu. Por video do të jetë online, si zakonisht, nesër. Ne gjithashtu do të prezantoj me një tjetër format file. Pra, kjo është menduar qëllimisht për të parë frikësuese në fillim, por kjo është vetëm disa dokumentacioni për një struct C. Ajo rezulton se Microsoft, vite më parë, ka ndihmuar popullarizohen këtë format, quajtur format bitmap file, BMP, dhe kjo ishte një super-thjeshtë, colorful format grafike file që është përdorur për një kohë të dhe nganjëherë ende për Wallpapers në desktop. Nëse ju mendoni përsëri në Windows XP dhe kodra kodrina dhe qielli blu, që ishte zakonisht një BMP, ose imazhi bitmap, dhe bitmaps janë kënaqësi për ne, sepse ata kanë kompleksitetin pak më shumë. Kjo nuk është aq e thjeshtë si ky rrjet i të 0 dhe 1-shave; në vend të kësaj, ju keni gjëra të tilla si një goditje me kokë në fillim të një skedar. Pra, me fjalë të tjera, brenda një skedar. Bmp është një bandë e tërë e të 0 dhe 1-shave, por ka disa shtesë të 0 dhe 1-shave në atje. Dhe kjo rezulton se ajo që ne kemi marrë për të dhënë ndoshta për vite me rradhë, file formats si. doc ose. XLS ose. mp3 apo mp4,. çfarëdo file formats që ju jeni të njohur me të. E pra, çfarë e bën atë edhe do të thotë të jetë një format file? Sepse në fund të ditës, të gjitha këto dosje ne përdorim kemi vetëm 0 dhe e së 1 dhe ndoshta ata të 0 dhe 1 të përfaqësojë a, b, c, përmes ASCII ose të ngjashme, por deri në fund të ditës, kjo është vetëm 0 dhe 1-shave. Pra, njerëzit vetëm herë pas here vendosin të shpikë një format të ri skedar ku ata standardizohet ajo modelet e copa të vërtetë do të thotë. Dhe në këtë rast këtu, folks që projektoi format bitmap fotografi tha se në bajt të parë në një skedar bitmap, pėrcaktuara nga ofset 0, atje, aty do të jenë disa quajtur cryptically bfType ndryshueshme quajtur, të cilat vetëm qëndron për lloj file bitmap, çfarë lloji i file bitmap kjo është. Ju mund të konkludoj, ndoshta, nga rreshtin e dytë që kompensuar 2, numri i bajt 2, ka një model të të 0 dhe 1 e që përfaqëson çfarë? Madhësia e diçka, dhe ajo vazhdon nga atje. Pra në grup Problem 4, ju do të ecte nëpër disa nga këto gjëra. Ne nuk do të përfundojë deri kujdeset për të gjithë ata, por vini re ajo fillon të marrë interesante rreth linjës apo byte 54, rgbtBlue, gjelbëra dhe të kuqe. Nëse ju keni dëgjuar ndonjëherë akronim RGB, e kuqe jeshile blu, kjo është një referencë për këtë. Sepse kjo rezulton nga ju mund të pikturoj të gjitha ngjyrat e ylberit me disa kombinim të kuqe dhe blu dhe të gjelbër. Dhe, në fakt, prindërit në dhomë mund të kujtojnë disa nga projektuesit më të hershme. Këto ditë, ju vetëm shikoni 1 dritë e ndritshme vjen nga një lente. Por mbrapa në ditë, keni pasur lente të kuqe, lente blu, dhe lente gjelbër dhe së bashku ata synojnë në ekran dhe ka formuar një tablo të gjallë. Dhe mjaft shpesh shkollat ​​e mesme dhe të mesme do të kenë këto lente gjithnjë aq pak shtrembër, kështu ju keni qenë lloj i shohim imazhe të dyfishta ose të trefishtë, por që ishte ideja. Keni pasur dritë të kuqe dhe të gjelbër dhe blu pikturë një foto. Dhe se parimi i njëjtë është përdorur në kompjuter. Pra, në mesin e sfidave, atëherë për ju në problemin vendosur 4 do të jetë disa gjëra, njëra është që në fakt të resize një imazh. Për të marrë në një model të 0 dhe 1-shave, kuptoj se cila chunks e të 0 dhe 1 të përfaqësojnë atë në një strukturë si kjo, dhe pastaj të kuptoj se si për të replikuar piksele: Reds, dëshpëruar, zarzavate brenda në mënyrë që kur një foto duket si ky në fillim, mund të duket si ky vend pas kësaj. Ndër sfidat tjera, gjithashtu, do të jetë që ju do të dorëzohet një imazh mjeko-ligjor i një file aktual nga një aparat fotografik dixhital dhe në atë aparat fotografik, një herë e një kohë, ishin një bandë e tërë të fotografive. Problemi është, ne fshirë aksidentalisht ose kishte imazhin e korruptuar disi. Gjëra të këqija të ndodhë me kamera digjitale, dhe kështu që ne kopjuar shpejt të gjitha të 0 dhe 1 të off këtë kartë për ju, e shpëtuam ata të gjithë në 1 dosje të mëdha, dhe pastaj ne do të dorëzojë ato tek ju në problemin vendosur 4 në mënyrë që ju mund të shkruani një program në C me të cilin do të shërohen të gjitha ato JPEGs, ideale. Dhe kjo rezulton se jpegs, edhe pse ata janë disi e një format file komplekse, ata janë shumë më komplekse se kjo fytyrë të qeshur këtu. Ajo rezulton se çdo JPEG fillon me modelet e njëjta të të 0 dhe 1-shave. Pra, duke përdorur një lak, ndërsa për ose një lak ose të ngjashme, ju mund iterate mbi të gjitha të 0 dhe 1 në këtë imazh mjeko-ligjor dhe çdo herë që të shihni model të veçantë që është përcaktuar në specifikimet Set problemit, ju mund të supozojmë, 'Oh, këtu është, me probabilitet shumë të lartë, fillimi i një JPEG, 'dhe sa më shpejt që ju të gjeni të njëjtin model, disa Numri i bytes ose kilobytes ose megabajt më vonë, ju mund të marrë, "Ooh! Këtu është një JPEG dytë, foto mora pas një të parë. Më lejoni të mos e lexuar këtë skedar parë, filloni të shkruani këtë një të ri. " Dhe prodhimi i programit tuaj për pset 4 do të jetë sa më shumë si 50 jpegs. Dhe në qoftë se kjo nuk është 50 jpegs, ju keni një pak e një lak. Nëse ju keni një numër të pafund të JPEGs, ju keni një lak pafund. Kështu që, gjithashtu, do të jetë një rast mjaft të zakonshme. Kjo është ajo që është në horizont. Quiz 0, prapa nesh. Kuptojnë, per email tim, se pa ka folks të cilët janë të dy të lumtur, lloj neutral, dhe i trishtuar rreth quiz 0 koha. Dhe ju lutem mos arritur jashtë për mua, TFS kokë, Zamyla, TF tuaj ose një i CAS-it që ju e dini në qoftë se ju do të donte për të diskutuar se si gjërat shkuan. Pra, për të bërë përshtypje prindërit këtu në dhomë, çfarë është bibliotekë CS50? Good job. Çfarë është bibliotekë CS50? Po? [Student përgjigjet, pakuptueshëm] Mirë >>, mirë. Pra, kjo është një grup prewritten e kodit se ne, stafi, shkroi, që ne ofrojmë për ju, për të siguruar disa funksionalitete të përbashkëta. Stuff like merrni mua një varg; merrni mua një int, të gjitha funksionet që janë të listuara këtu. Duke filluar nga tani, ne të fillojë me të vërtetë të marrë këto rrota trajnimit jashtë. Pra, ne jemi duke shkuar për të filluar për të marrë larg një "varg" nga ju, cilat, risjell, ishte vetëm një sinonim për çfarë lloji të dhënave aktuale? * char. Pra, për prindërit, që ishte ndoshta - kjo është e mirë, kështu që * char ne do të fillojmë të shohim në ekran të gjithë më shumë si kemi hequr "string" nga fjalori ynë, të paktën kur është fjala për të vërtetë shkruar kodin. Në mënyrë të ngjashme, ne do të ndaluar përdorimin e disa prej këtyre funksioneve sa më shumë, sepse programet tona do të merrni më të sofistikuara në vend se të shkruani vetëm programe që rri atje me një keq të shpejtë, duke pritur për përdoruesit të tipit diçka in Ju do të merrni inputet tuaja nga diku tjetër. Për shembull, ju do të merrni ato nga një seri e copa në hard drive lokale. Ju do të merrni në vend të tyre në të ardhmen nga një lidhje të rrjetit, disa website diku. Pra, le të zhvishem mbrapa shtresë këtë për herë të parë, dhe tërheq lart aplikim CS50 dhe ky file i quajtur CS50.h, të cilat ju keni qenë të mprehta, duke përfshirë për disa javë. Por le të shohim se çfarë është në të vërtetë në brendësi të kësaj. Kështu në krye të file në ngjyrë blu është vetëm një bandë e tërë e komenteve, Informacioni garanci dhe licencimit. Kjo është lloj i një paradigmë të përbashkët në software, sepse një shumë e softuerit këto ditë është ajo që quhet "burim i hapur", që do të thotë se dikush ka shkruar kodin dhe e bëri atë të lirë në dispozicion, jo vetëm për të drejtuar dhe për të përdorur, por në fakt lexuar dhe të ndryshojë dhe të integrohen në punën tuaj. Pra, kjo është ajo që ju keni qenë duke përdorur, software burim të hapur, megjithëse në një formë shumë të vogël. Nëse unë lëvizni poshtë e kaluara komenteve, edhe pse, ne do të fillojnë të shohin disa gjëra më të njohura. Pra, vërehet në krye këtu, se dosja CS50.h përfshin një bandë e tërë e dosjeve header. Tani, shumica e këtyre nuk kemi parë më parë, por një është njohur, se cili prej tyre kemi parë, megjithëse shkurtimisht, deri më tani? Po, bibliotekat standarde. Stdlib.h ka malloc, kështu që sapo kemi filluar duke folur për ndarjen e kujtesës dinamike, të cilat ne do të kthehen në javën e ardhshme, si edhe, duke përfshirë edhe kemi filluar këtë dosje. Ajo rezulton se bool dhe të vërteta dhe të rreme në fakt nuk ekzistojnë në C, në vetvete, nëse ju të përfshijë këtë skedë këtu. Kështu që ne kemi, për javë të tëra, janë përfshirë standarde bool.h kështu që ju mund të përdorni nocionin e një bool, e vërtetë apo e rreme. Pa këtë, ju do të keni për të zgjidhur të rreme saj dhe të përdorni një int dhe vetëm në mënyrë arbitrare të supozojmë se 0 është e rreme dhe 1 është e vërtetë. Tani, në qoftë se ne lëvizni poshtë më tej, këtu është përkufizimi ynë i një varg. Kjo rezulton nga, siç kemi thënë më parë, se ku kjo është * nuk ka me të vërtetë rëndësi. Ju mund edhe të ketë hapësirë ​​të gjithë rreth. Ne, këtë semestër, janë promovuar atë si kjo për të bërë të qartë se * ka të bëjë me llojin. Por e kuptojnë, ashtu si e zakonshme, nëse nuk është një pak më të zakonshme, është për të vënë atë atje por funksionalisht kjo është e njëjta gjë. Por tani, në qoftë se lexojmë poshtë më tej, le të marrin një vështrim në thonë, GetInt, sepse ne kemi përdorur që, ndoshta, para se çdo gjë tjetër këtë semestër. Dhe këtu është GetInt. Kjo është ajo? Kjo është prototip. Aq shpesh, ne kemi vënë prototypes në majat e tonë. Fotografi c, por ju gjithashtu mund të vënë prototypes në fotografi header. fotografi H, si ky këtu, kështu që kur ju shkruani disa funksione se ju dëshironi që njerëzit e tjerë të jenë në gjendje për t'u përdorur, i cili është pikërisht rasti me bibliotekën CS50, ju jo vetëm të zbatojë funksionet tuaja në diçka si CS50.c, ju gjithashtu vënë prototipa jo në krye të kësaj dosje, por në krye të një file header, atëherë kjo fotografi header është ajo që miqtë dhe kolegët përfshijnë, me të mprehta të përfshijë në kodin e tyre. Pra, gjithë kësaj kohe ju keni qenë i përfshirë të gjitha këto prototipa efektive në krye të dosjes suaj, por me mënyrën e kësaj mprehtë përfshijnë mekanizmin që në thelb kopje dhe pastat këtë skedë në tuaj. Tani, këtu është një dokumentacion mjaft të detajuar. Ne kemi shumë e shumë të marrë për të dhënë se GetInt merr një int, por ajo rezulton se ka disa raste qoshe, apo jo? Çfarë ndodh nëse përdoruesi lloje në një numër që është mënyrë shumë e madhe? Një quintillion, që thjesht nuk mund të përshtatet në brendësi të një int? Çfarë është sjellja e pritshme? E pra, në mënyrë ideale, kjo është e parashikueshme. Pra, në këtë rast, në qoftë se ju në të vërtetë lexuar shkruar gjobë, ju do të shihni se në qoftë se linja nuk mund të lexohet, këtë INT_MAX kthimit. Ne kurrë nuk kemi folur për këtë, por bazuar në kapitalizimin e saj, çfarë është ajo, ndoshta? Kjo është një konstante, kështu që kjo është një konstante e veçantë që është deklaruar ndoshta në një nga ato fotografi header që është më lart në dosjen, dhe INT_MAX është ndoshta diçka si, afërsisht, 2 miliardë. Ideja është se për shkak se ne kemi nevojë për të ditur se diçka disi shkoi keq, Ne, po, kanë 4 miliard numrat në dispozicionin tonë, negative mbi 2 miliard deri në 2 miliardë, të japë ose të marrë. E pra, ajo që është e zakonshme në programimin është që ju vjedhin vetëm një nga ato numra. Ndoshta 0, ndoshta 2 miliardë, ndoshta negative 2 miliardë. Kështu që ju kaloni një nga vlerat tuaja të mundshme në mënyrë që ju mund të angazhohen në botë se nëse diçka shkon keq, unë do të kthehem këtë vlerë super-madh. Por ju nuk doni të shtypni diçka përdorues fshehta si "2, 3, 4 ..." e numrit të vërtetë të madhe, ku ju përgjithësoni në vend si një konstante. Pra me të vërtetë, në qoftë se ju ishin duke u anal javëve të fundit, në çdo kohë që ju e quani GetInt, ju duhet të keni qenë të kontrolluar me një kusht nëse. A llojin e përdoruesit në INT_MAX, ose më saktë, bëri INT_MAX GetInt kthehen? Sepse në qoftë se ai e bëri, që në fakt do të thotë se ata nuk e shkruani atë, diçka shkoi keq në këtë rast. Pra, kjo është ajo që është e njohur përgjithësisht si një vlerë "sentinel", që do të thotë vetëm të veçantë. E pra, le të kthehemi tani në të. Dosjet c. File C ka ekzistuar në aplikim për disa kohë, dhe, në fakt, ka të precompiled aplikim për ju në atë gjë që ne e quajtur "Kodi objekt," por ai thjesht nuk ka rëndësi për ju, ku ajo është për shkak se sistemi e di, në këtë rast, ku ajo është, aplikim. Por le të lëvizni poshtë tani në GetInt, dhe shikoni se si GetInt ka qenë duke punuar gjithë këtë kohë. Pra, këtu kemi komente të ngjashme nga më parë. Më lejoni të zoom në në vetëm pjesë të Kodit, dhe ajo që ne kemi për GetInt është në vijim. Ajo nuk merr të dhëna dhe ajo kthen një int, ndërsa (e vërtetë), kështu që ne kemi një lak të pafund të qëllimshme por, me sa duket, ne do të thyejnë nga kjo disi, ose kthehen nga brenda këtë. Pra, le të shohim se si punon kjo. E pra, ne duket të jetë duke përdorur getString në këtë linjë të parë brenda lak, 166. Kjo është tani praktikë e mirë, sepse në çfarë rrethanash mund getString kthyer këtë të veçantë, NULL fjalen? Nëse diçka shkon keq. Çfarë mund të shkojnë keq kur ju telefononi diçka si getString? Po? [Student përgjigje, pakuptueshëm] >> Yeah. Kështu që ndoshta malloc dështon. Diku nën getString individualitet është quajtur malloc, e cila ndan kujtesës, e cila lejon të dyqan kompjuter të gjithë personazhet që përdoruesi lloje në tastierë. Dhe mendoj përdorues kishte një të tërë shumë kohë të lirë dhe shtypen më shumë, për shembull, se 2 miliard karaktere. Karaktere më shumë se kompjuteri ka edhe RAM. E pra, getString duhet të jetë në gjendje për të ditur se për ju, edhe në qoftë se kjo është një super, super rast i pazakontë qoshe. Ajo duhet të jetë disi gjendje për të trajtuar këtë, dhe kështu getString, nëse ne kthehemi dhe të lexoni dokumentacionin e saj, ka, në fakt, kthehen null. Tani në qoftë se dështon getString duke u kthyer NULL, GetInt do të dështojë duke u kthyer INT_MAX, ashtu si një Sentinel. Këto janë vetëm konventat njerëzore. E vetmja mënyrë ju do të dini ky është rasti është duke lexuar dokumentacionin. Pra, le të lëvizni poshtë për të ku int është në të vërtetë GotInt. Pra, nëse unë lëvizni poshtë pak më tej, në përputhje 170 ne kemi një koment mbi këto linja. Pra, ne të deklarojë, në 172, një int n dhe një char c, dhe pastaj këtë funksion të ri që disa prej jush kanë ngecur nëpër më parë, por sscanf. Kjo qëndron për harqesh f scan. Me fjalë të tjera, më jep mua një varg dhe unë do të scan atë për pjesë të informacionit të interesit. Pra, çfarë do të thotë kjo? E pra, unë mendoj se të shkruani, fjalë për fjalë, 1 2 3 në tastierë, dhe pastaj goditi të hyjë. Çfarë është lloji i të dhënave 1 2 3 kur u kthye nga getString? Kjo është padyshim një varg, apo jo? Unë kam një varg, kështu 1 2 3 është me të vërtetë "1 2 3" me \ 0 në fund të tij. Që nuk është një int. Kjo nuk është një numër. Ajo duket si një numër, por kjo nuk është e vërtetë. Pra, çfarë ka GetInt duhet të bëni? Ajo ka për të skanoni atë vargun e majta në të djathtë, 1 2 3 \ 0, dhe disi kthyer atë në një numër të plotë aktuale. Tani, ju mund të kuptoj se si ta bëni këtë. Nëse ju mendoni përsëri në pset 2, ju me sa duket mori një pak më të rehatshme me Cezarit apo Vigenere kështu që ju mund iterate mbi një varg, ju mund të konvertohet chars të ints me marr. Kjo është një shumë e tërë e punës. Pse të mos thërrasë një funksion si sscanf që bën që për ju? Pra sscanf pret një argument, në këtë rast quhet Linja, e cila është një varg. Ju pastaj të specifikojë, në thonjëza, shumë të ngjashme me printf, çfarë prisni ju për të parë në këtë varg? Ajo që unë jam duke thënë se këtu është, unë pres për të parë një numër decimal dhe ndoshta një karakter. Dhe ne do të shohim se pse ky është rasti i vetëm një moment. Ajo rezulton se ky simbol është tani kujton gjëra kemi filluar duke folur për pak më shumë se një javë më parë. Çfarë është & n & dhe c bërë për ne këtu? [Student përgjigjet, pakuptueshëm] Po >>. Është dhënë mua adresën e n dhe adresa e c. Tani, përse është se e rëndësishme? E pra, ju e dini se me funksionet në C ju gjithmonë mund të kthehen një vlerë apo pa vlerë fare. Ju mund të kthehet një int, një varg, një noton, një char, çfarëdo. Ose ju mund të ktheheni boshllëk, por ju mund të kthehen vetëm 1 gjë maksimalisht. Por këtu ne duam të kthehen sscanf mua ndoshta një int, një numër decimal, dhe gjithashtu një char, dhe unë do të shpjegojë se pse char në një moment. Pra, ju doni f efektive të kthehen 2 gjëra, që nuk është vetëm e mundshme në C. Kështu që ju mund të punojnë rreth se duke kaluar në 2 adresat, sepse sa më shpejt që ju të dorëzojë një funksion 2 adresat, çfarë mund të bëjë që funksionojnë me ta? Ajo mund të shkruani në adresat ato. Ju mund të përdorni operacion * dhe "shkojnë atje", në secilën prej këtyre adresave. Kjo është lloj i këtij mekanizmi Backdoor, por shumë e zakonshme për ndryshimin e vlerave të variablave në më shumë se vetëm 1 vend, në këtë rast 2. Tani, vini re unë jam duke kontrolluar për == to1, dhe pastaj kthehen n në qoftë se ka, në fakt, për të vlerësuar e vërtetë. Pra, çfarë po ndodh? E pra, teknikisht, të gjithë ne të vërtetë duan të ndodhë në GetInt është kjo. Ne duam të kuptoj, kështu që të flasin, ne duam të lexojnë vargun "1 2 3" dhe në qoftë se ajo duket sikur ka një numër atje, ajo që ne jemi duke thënë sscanf të bëni është që të vënë atë numër, 1 2 3, në këtë n ndryshueshme për mua. Pse, atëherë, unë kam këtë e bëri si? Cili është roli i të thënë, sscanf, ju gjithashtu mund të merrni një karakter këtu. [Student folur, i pakuptueshëm] >> Jo - një pikë dhjetore mund të punojnë. Le të thonë se mendohet për një moment. Çfarë tjetër? [Student, pakuptueshëm] >> Pra, mendimi i mirë, ai mund të jetë personazhi NULL. Kjo nuk është në të vërtetë, në këtë rast. Po? [Student, pakuptueshëm] ASCII >>. Ose, më lejoni të përgjithësojmë edhe më tej. C% nuk ​​është vetëm për gabim kontrollin. Ne nuk duam që të ketë karakter pas numrin, por ajo që kjo lejon mua që të bëni është siç vijon: Ajo rezulton se sscanf, përveç ruajtjen e vlerave në n dhe C, në këtë shembull këtu, ajo gjithashtu nuk është ajo kthen numër të variablave është vënë vlerat in Pra, nëse ju vetëm shkruani 1 2 3, atëherë vetëm% d do të shkojë dhe vetëm merr n ruajtur me një vlerë si 1 2 3 dhe asgjë nuk merr vënë në c; c mbetet një vlerë mbeturina, mënyrë që të flasin. Garbage sepse ajo kurrë nuk ka qenë initialized si disa vlera. Pra, në këtë rast, sscanf kthehet 1, sepse unë populluar një nga ato pointers, në të cilin rast, e madhe. Unë kam një int, kështu që unë liruar linjë të lirë deri kujtesës se getString ndarë në fakt, dhe atëherë unë të kthehet n. Tjetër, në qoftë se keni menduar ndonjëherë se ku rigjykuar deklaratë vjen nga, vjen nga të drejtë këtu. Nëse, nga ana tjetër, unë lloji në 1 2 3 foo, vetëm disa sekuenca të rastit të tekstit, sscanf do të shohin, ooh, numrin, ooh, numrin, ooh, numrin, ooh - f. Dhe kjo do të vënë 1 2 3 në n. Ajo do të vënë në f c, dhe pastaj të kthehen 2. Pra, ne kemi, vetëm duke përdorur përkufizimin bazë të sjelljes së scanf, një mënyrë shumë e thjeshtë - mirë, komplekse në shikim të parë, por në fund të ditës, mekanizëm mjaft e thjeshtë për të thënë, ka një int, dhe nëse është kështu, është se e vetmja gjë që kam gjetur? Dhe hapësirë ​​e bardhë këtu është e qëllimshme. Nëse keni lexuar dokumentacionin për sscanf, ajo ju tregon se në qoftë se ju të përfshijë një pjesë e hapësirë ​​të bardhë në fillim apo në fund, sscanf gjithashtu do të lejojë përdoruesit, për çfarëdo arsye, për të goditur spacebar 1 2 3, dhe se do të jetë e ligjshme. Kjo nuk do të çirrem në përdoruesi vetëm për shkak se ata e goditi spacebar në fillim apo në fund, e cila është vetëm pak më shumë përdorues-miqësor. Çfarëdo pyetjeje, atëherë, në GetInts? Po? [Pyetja Student, pakuptueshëm] Mirë >> pyetje. Çfarë ndodh nëse ju shtypur vetëm në një char, si, f hit dhe të hyjë pa ndonjëherë shtypni 1 2 3, çfarë mendoni se sjellja e kësaj linje të kodit atëherë do të jetë? Pra sscanf mund të mbulojë atë shumë, sepse në këtë rast, ajo nuk do të plotësoni n ose C; ajo do të kthehet në vend 0. Në këtë rast, unë jam gjithashtu infektues atë skenar, sepse vlera e pritur që unë dua është 1. Unë vetëm dua 1, dhe vetëm 1 gjë për të mbushur. Mirë pyetje. Të tjerët? Të gjithë të drejtë, kështu që le të mos kalojnë nëpër të gjitha funksioneve në këtu, por ai që duket të jetë, ndoshta, në interes të mbetur getString është për shkak se ajo rezulton se GetFloat, GetInt, GetDouble, GetLongLong Të gjitha Vë bast një shumë të funksionimit të tyre në getString. Pra, le të marrin një sy se si ai po zbatohet këtu. Ky i fundit duket një kompleks pak, por ai përdor bazat njëjta se kemi filluar duke folur për javën e kaluar. Pra, në getString, e cila merr asnjë argument sipas pavlefshme deri këtu, dhe ajo kthen një varg, kështu që unë jam deklaruar një varg quajtur buffer. Unë vërtetë nuk e di se çka do të përdoren për, por ne do të shohim. Duket si kapacitet është, by default, 0, nuk jam i sigurt ku po shkon kjo. Nuk jam i sigurt se çfarë po ndodh n që do të përdoret për të ende. Por tani ajo është duke marrë një pak më shumë interesante, kështu që në përputhje 243, ne deklarojmë një int c, kjo është lloj i një detaj stupid. Një char është 8 bits, dhe 8 bit mund të ruajë sa vlera të ndryshme? 256. Problemi është, në qoftë se ju dëshironi të keni 256 karaktere ASCII ndryshme, të cilat nuk janë, në qoftë se ju mendoni përsëri, dhe kjo nuk është diçka për të mësuar përmendësh. Por në qoftë se ju mendoni përsëri në atë tabelë të madhe ASCII kishim javë më parë, ka pasur, në këtë rast, 128 ose 256 karaktere ASCII. Ne kemi përdorur të gjitha modelet e të 0 dhe 1 është deri. Kjo është një problem në qoftë se ju doni të jetë në gjendje për të zbuluar një gabim. Sepse në qoftë se ju jeni tashmë duke përdorur vlerat për 256 karaktere tuaj, ju nuk e keni të vërtetë të planifikuar përpara, sepse tani ju keni asnjë mënyrë për të thënë, "Kjo nuk është një karakter legit, ky është një mesazh i gabuar." Pra, atë që bota nuk është, ata përdorin vlerën e ardhshëm më të madh, diçka si një int kështu që ju keni një numër të çmendur të bit, 32 për 4 miliardë vlerave të mundshme, kështu që ju thjesht mund të përfundojnë duke përdorur, thelb, 257 prej tyre, 1 prej të cilave ka disa domethënie të veçantë si një gabim. Pra, le të shohim se si punon kjo. Në linjë 246, unë kam këtë lak të madhe, ndërsa që është duke bërë thirrje fgetc; fotografi f kuptimi, getc, dhe pastaj STDIN. Rezulton se kjo është vetëm mënyra më e saktë për të thënë "lexo dhëna nga tastierë." Standard mjete input tastierë, prodhimi standarde do të thotë ekran, dhe gabimi standard, të cilat ne do të shohim në pset 4, do të thotë në ekran, por një pjesë të veçantë të ekranit në mënyrë që ajo nuk është conflated me prodhim aktual që ju qëllim për të shtypur, por më shumë se në të ardhmen. Pra fgetc thjesht do të thotë të lexuar një karakter nga tastierë, dhe ruajtur atë ku? Ruajtur atë në C, dhe pastaj shikoni, kështu që unë jam vetëm duke përdorur disa bashkime boolean këtu, kontrolloni se ai nuk ka të barabartë \ n, kështu që përdoruesi ka goditur të hyjë. Ne duam të ndalemi në këtë pikë, në fund të lak, dhe ne gjithashtu duam të kontrolloni për të vazhdueshme të veçantë, EOF, i cili në qoftë se ju e dini apo me mend - çfarë e bën atë të qëndrojë për? Fundi i file. Pra, kjo është lloj i pakuptimtë, sepse në qoftë se unë jam i shtypur në tastierë, vërtetë nuk ka asnjë fotografi të përfshira në këtë, por kjo është vetëm lloj i term gjenerik që përdoret për të nënkuptuar se asgjë tjetër po vjen nga gishtat e njeriut-së. EOF. Fundi i file. Si një mënjanë, në qoftë se ju keni goditur ndonjëherë kontrollit d në tastierën tuaj, jo se ju do të keni akoma, ju keni goditur kontrollit c. Por kontrolli d dërgon këtë EOF të veçantë të quajtur konstante. Deri tani ne vetëm duhet disa alokimin dinamik kujtesës. Pra, nëse n + 1> kapaciteti, tani unë do të shpjegoj n. n është vetëm sa bytes jemi aktualisht në tampon, vargu që ju jeni duke ndërtuar nga përdoruesi. Nëse ju keni më shumë karaktere në tampon tuaj se ju keni kapacitet në tampon, intuitive, ajo që ne duhet të bëni pastaj është ndajë më shumë kapacitet. Unë jam duke shkuar për të skremuar mbi disa nga aritmetike këtu dhe të përqëndrohet vetëm në këtë funksion këtu. Ju e dini se çfarë është malloc, ose të paktën në përgjithësi të njohur. Merrni me mend se çfarë realloc bën. [Student përgjigje, pakuptueshëm] Po >>. Dhe kjo nuk është mjaft shtuar memorie, ai bënë një rialokim kujtesë si më poshtë: Nëse ka ende vend në fund të vargut të ju jap më shumë se kujtesa se ajo fillimisht ju jep, atëherë ju do të merrni atë memorie shtesë. Kështu që ju vetëm mund të vënë personazhet vargjet për të kthyer prapa për të kthyer prapa. Por në qoftë se nuk është kështu, sepse ju ka pritur shumë gjatë dhe diçka e rastit mori plopped në kujtesë atje, por ka ekstra kujtesës këtu poshtë, kjo është në rregull. Realloc do të bëjë të gjitha heqjen e rëndë për ju, lëvizin string keni lexuar në mënyrë larg nga këtu, vënë atë atje poshtë, dhe pastaj ju japin më shumë në pistë disa atë pikë. Pra, me një valë të dorës, më lejoni të them se ajo që po bën getString është ajo e filluar me një tampon të vogël, ndoshta 1 karakter të vetme, dhe në qoftë se përdoruesi në 2 lloje të karaktereve, getString përfundon thirrje realloc dhe thotë, "Ooh, 1 karakter nuk ishte e mjaftueshme. Jepni 2 karaktere. ' Pastaj në qoftë se ju lexoni me anë të logjikës së lak, ajo do të thonë, "Ooh, përdorues shtypur në 3 karaktere. Më jepni, por tani nuk 2 4 karaktere, atëherë jepni 8, atëherë jepni 16 dhe 32 '. Fakti që unë jam duke dyfishuar kapacitetin e çdo kohë do të thotë se tampon nuk do të rritet ngadalë. Ajo do të rritet super të shpejtë, dhe çfarë mund të jetë përparësi e se? Pse jam unë dyfishuar madhësinë e tampon, edhe pse përdoruesit mund të duhet vetëm 1 karakter shtesë nga tastierë? [Student përgjigje, pakuptueshëm]. >> Çfarë është ajo? Saktësisht. Ju nuk duhet të rritet atë sa më shpesh. Dhe kjo është vetëm një lloj - you're mbrojtëse baste tuaj këtu. Ideja është se ju nuk doni të telefononi realloc shumë, sepse ajo tenton të jetë i ngadalshëm. Çdo herë që ju kërkoni sistemin operativ për kujtesën, si ju së shpejti do të shihni në një sërë problemeve të ardhmen, ajo tenton të marrë disa kohë. Pra, duke minimizuar atë sasinë e kohës, edhe në qoftë se ju jeni të humbur një hapësirë, tenton të jetë një gjë e mirë. Por nëse lexojmë nëpër pjesën e fundit të getString këtu, dhe përsëri, të kuptuarit çdo linjë të vetme këtu nuk është aq e rëndësishme sot. Por vini re se ajo përfundimisht quan malloc përsëri, dhe ajo ndan pikërisht si bytes shumë si ajo ka nevojë për vargun dhe pastaj hedh larg duke e quajtur të lirë, tampon tepër të mëdha, në qoftë se ajo vërtetë u dyfishua shumë herë. Me pak fjalë, kjo është se si getString ka qenë duke punuar gjithë këtë kohë. Gjithë kjo nuk është lexuar nga një karakter në një kohë përsëri dhe përsëri dhe përsëri dhe çdo herë ajo ka nevojë për disa memorie shtesë, ai i kërkon sistemit operativ për të duke e quajtur realloc. Çdo pyetje? Dakord. Një sulm. Tani që ne e kuptojmë pointers, ose të paktën janë gjithnjë e më të njohur me pointers, le të konsiderojnë si në të gjithë botën fillon të shembet në qoftë se ju nuk keni mjaft të mbrojtur kundër përdoruesve armiqësore, njerëz të cilët janë duke u përpjekur të kollitem në sistemin tuaj. Njerëzit të cilët janë duke u përpjekur për të vjedhur software tuaj duke iu shmangur disa kodin e regjistrimit që përndryshe mund të duhet të tipit in Hidhni një sy në këtë shembull këtu, e cila është vetëm kodi C që ka një funksion kryesor në pjesën e poshtme, që e quan një foo funksion, dhe çfarë është ajo kalon për të foo? [Student] Një argument i vetëm. Vetëm >> argumenti. Pra, argv [1], që do të thotë fjalën e parë e përdoruesit typed në rreshtin e komandave pas a.out apo çfarëdo programi është quajtur. Pra foo, në krye, merr në një char *, char * por është vetëm ajo? String. Nuk ka asgjë të re këtu dhe që string është në mënyrë arbitrare duke u quajtur bar. Në këtë linjë këtu, char c [12], në lloj gjysmë-teknik anglisht, çfarë është kjo linjë duke bërë? Array e -? Personazhet. Më jepni një koleksion prej 12 karaktereve. Pra, ne mund të quajmë këtë një tampon. Ajo që quhet teknikisht c, por një tampon në programimin e thjesht do të thotë një bandë e hapësirës që ju mund të vënë disa sende in Pastaj fundi, memcpy, ne nuk kemi përdorur më parë. Por ju ndoshta mund të me mend se çfarë ajo bën. Kjo kopje memorie. Çfarë e bën atë të bëjë? E pra, kjo duket kopje bar, kontributi i saj, në c, por vetëm deri në gjatësinë e bar. Por ka një bug këtu. Mirë, kështu që teknikisht ne duhet të vërtetë të bëjë strlen (bar) x sizeof (char), që është e saktë. Por në rastin më të keq këtu, le të supozojmë se that's - kështu, në rregull. Pastaj ka 2 mete. Pra, sizeof (char), të gjithë të drejtë, le të bëjnë këtë një pak më të gjerë. Deri tani nuk ka ende një bug, e cila është ajo? [Student përgjigje, pakuptueshëm] Kontrollo >> për çfarë? Mirë, kështu që ne duhet të kontrolluar for null, sepse gjëra të këqija të ndodhë kur kursori juaj është NULL, Sepse ju mund të përfundojnë duke shkuar atje, dhe ju kurrë nuk duhet të shkojnë në NULL nga dereferencing atë me operatorin *. Kështu që është e mirë, dhe çfarë tjetër po bëjmë? Logjikisht nuk ka një krisje edhe këtu. [Student përgjigje, pakuptueshëm] Kështu >> kontrolloni nëse argc ≥ 2? Mirë, kështu që nuk ka 3 mete në këtë program këtu. Ne nuk jemi duke kontrolluar nëse përdoruesi shtypur në të vërtetë në çdo gjë në argv [1], mirë. Pra, çfarë është bug tretë? Po? [Student përgjigje, pakuptueshëm] >> mirë. Pra, ne kontrolluar një skenar. Ne kontrolluar në mënyrë implicite mos kopjoni memorie më shumë se do të kalojë gjatësinë e bar. Pra, nëse vargu përdoruesi është shtypur në 10 karaktere të gjatë, kjo është thënë: "Vetëm kopje 10 karaktere. ' Dhe kjo është në rregull, por ajo në qoftë se përdoruesi typed në një fjalë në ftim si një fjalë 20 karakter, kjo është, duke thënë se 20 kopje karaktere nga bar në çfarë? c, i njohur ndryshe si tampon tonë, që do të thotë që ju vetëm shkroi dhënat në 8 vende bajt se ju nuk bëni vet, dhe ju nuk bëni vet ato në kuptimin që ju kurrë nuk alokuar ato. Pra, kjo është ajo që është e njohur përgjithësisht si sulm del nga shtrati tampon, ose tampon muar sulm, dhe sulmi i saj në kuptimin që nëse përdoruesi apo program që flet funksionin tuaj është duke bërë këtë me keqdashje, çfarë në të vërtetë ndodh ardhshëm mund të jetë mjaft e keqe. Le të marrin një sy në këtë foto këtu. Kjo foto paraqet turrë tuaj të kujtesës. Dhe kujtojnë se çdo herë që të thërrasë një funksion, ju merrni këtë kornizë të vogël në rafte dhe pastaj një tjetër dhe pastaj një tjetër dhe pastaj një tjetër. Dhe deri tani ne kemi vetëm lloji i përhumbur këto larg si rectangles ose atje në bord ose në ekran këtu. Por nëse ne zoom në në një nga ato rectangles, kur ju telefononi një foo funksion, ajo rezulton se ka më shumë në rafte brenda asaj kornize dhe se drejtkëndësh se vetëm x dhe y dhe a dhe b, si ne nuk flasim për shkëmbim. Ajo rezulton se ka disa detaje të nivelit të ulët, në mesin e tyre kthehen adresa. Pra, ajo rezulton, kur e quan foo kryesore, kryesore duhet të informojë foo ajo adresa kryesor është në kujtesën e kompjuterit. Sepse përndryshe, sa më shpejt që foo është bërë ekzekutimin, si në këtë rast këtu, pasi të keni arritur këtë mbajtëse të ngushtë kaçurrel në fund të foo, si dreq nuk e di se ku foo kontrolli i programit është menduar për të shkuar? Ajo rezulton se përgjigja e kësaj pyetje është në atë drejtkëndësh kuqe këtu. Kjo paraqet një tregues, dhe kjo është deri në kompjuter për të ruajtur, përkohësisht, në rafte ashtuquajturës adresën e kryesore në mënyrë që sa më shpejt foo është bërë ekzekutimin, kompjuteri e di se ku dhe çfarë vijë në kryesore për të shkuar mbrapa për të. Akrep ruajtur kornizë lidhet në mënyrë të ngjashme me këtë. Bar char * ketu përfaqëson çfarë? E pra, tani ky segment blu këtu është kornizë foo-së, çka është bar? Mirë, kështu bar është vetëm argumenti në funksion foo. Deri tani ne jemi kthyer në foto njohur. Ka gjëra shumë dhe distractions më shumë në ekran por ky segment drita blu është ajo që ne kemi qenë duke tërhequr mbi dërrasë për diçka si shkëmbim. Kjo është kornizë për foo dhe e vetmja gjë në të drejtën tani është bar, cila është kjo parametri. Por çfarë tjetër duhet të jetë në rafte, në përputhje me këtë kod këtu? Char c [12]. Pra, ne duhet të shohim 12 sheshet e kujtesës, ndarë për një ndryshore të quajtur c. Dhe me të vërtetë ne nuk kemi se në ekran. Shumë të lartë nuk është c [0], dhe pastaj autori i këtij diagram nuk bother tërhequr të gjitha sheshet, por ka të vërtetë nuk ka 12 sepse në qoftë se ju shikoni në fund të drejtën, c [11], në qoftë se ju numërimin nga 0, është 12 bytes të tilla. Por këtu është problemi: Në cilin drejtim është në rritje c? Lloj i lartë poshtë, të drejtë? Në qoftë se ajo fillon në krye dhe rritet në fund, nuk duket si ne e kemi lënë veten pistë shumë këtu në të gjitha. Ne kemi lloj të pikturuar veten në një cep, dhe se c [11] është e drejtë kundër bar, e cila është e drejtë kundër kornizë treguesin rafte, që është e drejtë kundër adresën e kthimit; nuk ka më vend. Pra, çfarë është implikimi, atëherë, në qoftë se ju vidhos deri, dhe ju provoni lexuar 20 bytes në një tampon 12-byte? Ku janë ato 8 bytes shtesë do të shkojnë? Brenda çdo gjë tjetër, disa prej të cilave është super i rëndësishëm. Dhe gjëja më e rëndësishme, potencialisht, është kutia e kuqe atje, adresa e kthimit. Sepse mendoj që ju jeni ose aksidentalisht ose adversarially prishësh ato 4 byte, që adresa pointer, jo vetëm me mbeturina, por me një numër që ndodh për të përfaqësuar një adresë aktual në kujtesë? Çfarë është implicaiton, logjikisht? [Student përgjigjet, pakuptueshëm] >> Pikërisht. Kur kthehet foo dhe hitet që mbajtëse kaçurrel, programi do të vazhdojë të mos kthehen në kryesore, ajo do të kthehen në çfarëdo adresa është në atë kuti të kuqe. Tani, në rastin e regjistrimit software anashkaluar, çfarë është adresa që është duke u kthyer për të është funksioni që zakonisht merr quajti pasi ju keni paguar për software dhe futur kodin tuaj të regjistrimit? Ju mund të lloj mashtrim e kompjuterit në mos shkuar këtu, por në vend të kësaj, duke shkuar deri këtu. Ose, nëse ju jeni të vërtetë të zgjuar, një kundërshtar në fakt mund të shkruani në tastierë, për shembull, nuk është një fjalë e vërtetë, jo 20 karaktere, por mendoj se ai ose ajo Llojet në disa karaktere që përfaqësojnë kodin? Dhe kjo nuk do të jetë kodi C, ajo do të jetë personazhet që përfaqësojnë kodet binare makine, e 0 dhe 1-shave. Por mendoj se ata janë të zgjuar të mjaftueshme për të bërë këtë, në një farë mënyre ngjitur në të shpejtë getString diçka që është hartuar në thelb kodin, dhe e fundit 4 bytes prishësh atë adresë e kthimit, adresa dhe çfarë bën që input bëni? Ajo ruan në këtë drejtkëndësh të kuq adresën e bajt parë të tampon. Kështu që ju duhet të jetë me të vërtetë i zgjuar, dhe kjo është një shumë e gjykimit dhe gabim për njerëzit e keqe atje, por nëse ju mund ta kuptoj se sa e madhe kjo është tampon, të tilla që bytes fundit në kontributin që ju ofrojnë për programin ndodhë që të jetë e barabartë me adresën e fillimit të buffer tuaj, ju mund ta bëni këtë. Nëse ne themi, normalisht, hello, dhe \ 0, kjo është ajo që përfundon deri në tampon. Por në qoftë se ne jemi më të zgjuar, dhe ne buffer mbushur atë me atë që ne do të thërrasë përgjithësi kodin sulm, A, A, A, A: Sulmi,, sulm sulm, sulm, ku kjo është vetëm diçka që e bën diçka të keqe. E pra, çfarë ndodh në qoftë se ju jeni me të vërtetë i zgjuar, ju mund të bëni këtë: Në kutinë e kuqe këtu është një sekuencë të numrave: 80, CO, 35, 08. Vini re se kjo përputhet me numrin që është deri këtu. Kjo është në mënyrë të kundërt, por më shumë në atë kohë tjetër. Vini re se kjo adresë kthimi është ndryshuar qëllimisht të barabartë adresën e deri këtu, jo adresa e kryesor. Pra, në qoftë se djalë i keq është super i zgjuar, ai ose ajo do të përfshijë në këtë kod sulm diçka si, "Fshij të gjitha dosjet e përdoruesit. ' Ose 'Kopjo passwords,' ose 'Krijo një llogari përdoruesi që unë mund të hyni në. " Asgjë në të gjitha, dhe kjo është edhe rreziku dhe fuqia e C. Sepse ju keni qasje në kujtesë nëpërmjet pointers dhe ju mund të shkruani për këtë arsye çdo gjë që ju dëshironi në kujtesë të kompjuterit. Ju mund të bëni një kompjuter të bëjë çdo gjë që ju doni thjesht nga që ajo të hidhen rreth brenda hapësirës së vet kujtesës. Dhe kështu, në këtë ditë, kështu që shumë programe dhe faqet e internetit kaq shumë që janë të komprometuar avulloj për njerëzit duke përfituar nga kjo. Dhe kjo mund të duket si një sulm super-sofistikuar, por kjo nuk ka gjithmonë të fillojë në këtë mënyrë. Realiteti është se ajo që njerëzit zakonisht e këqija do të bëni është, nëse kjo është një program në një command line ose një program GUI ose një faqe interneti, është që ju vetëm të fillojë ofrimin e pakuptimta. Ju shkruani një fjalë të vërtetë të madhe në fushën e kërkimit dhe hit Enter, dhe ju presin të shohin nëse crashes internetit. Ose ju të presim të shohim nëse programi manifeston disa mesazh gabimi. Sepse në qoftë se ju merrni me fat, si djalë i keq, dhe ju japin disa të dhëna të çmendur që crashes programin, që do të thotë programues nuk parashikojnë sjelljen tuaj të keq që do të thotë që ju mund ndoshta, me përpjekje të mjaftueshme, Gjyqi mjaftueshme dhe gabim, të kuptoj se si për të zhvilluar një sulm më të saktë. Pra, sa më shumë që një pjesë e sigurisë nuk është vetëm shmangur këto sulme krejt, por zbulimin e tyre dhe në fakt duke kërkuar në shkrimet dhe duke parë atë që inputet çmendur të ketë njerëz të shtypur në faqen tuaj te internetit. Çfarë terma kërkimi janë njerëz të shtypur në faqen tuaj te internetit me shpresën e tejmbushur disa tampon? Dhe kjo të gjitha boils poshtë për bazat e thjeshta të asaj që është një grup, dhe çfarë do të thotë të ndajë dhe të përdorin kujtesën? Dhe lidhur me këtë, gjithashtu, është kjo. Pra, le të vetëm të shikoj në brendësi të një hard drive përsëri. Kështu që ju kujtohet nga një ose dy javë më parë se kur ju drag fotografi tek Recycle Bin tuaj ose plehra mund, çfarë ndodh? [Student] Asgjë. Po >>, absolutisht asgjë. Përfundimisht, nëse ju drejtuar të ulët në hapësirë ​​në disk, Windows ose Mac OS do të fillojë grisësh fotografi për ju. Por në qoftë se ju drag diçka në atje, atëherë kjo nuk është aspak e sigurt. Gjitha vendet anëtare, roomate mik apo familja juaj ka të bëjë është të klikoni dy herë, dhe voila. Ka të gjitha dosjet që ju të paqarta u përpoqën për të fshirë. Pra, shumica prej nesh të paktën e di që ju keni për të right click ose kontroll klikoni dhe bosh plehra, ose diçka të tillë. Por edhe atëherë, që nuk ka fare të bëjë mashtrim. Sepse ajo që ndodh kur ju keni një fotografi në hard drive tuaj që përfaqëson një dokument fjalë ose ndonjë JPEG? Dhe kjo paraqet hard drive tuaj, dhe le të thonë se kjo copë here paraqet atë skedar, dhe është e përbërë nga një bandë e tërë e të 0 dhe 1-shave. Çfarë ndodh kur nuk jeni vetëm terhiq atë skedar tek një trashcan ose ricikloj bin, por edhe zbrazët atë? Lloj asgjë. Kjo nuk është asgjë tani. Tani ajo është vetëm asgjë, sepse një diçka pak ndodh në formën e këtij tabelën. Pra, ka disa lloj të dhënash ose tabelë në brendësi të kujtesës një kompjuter që në thelb ka 1 kolonë për fotografi emra, dhe 1 kolona për file location, ku kjo mund të jetë vendndodhja 123, vetëm një numër të rastit. Pra, ne mund të kemi diçka si X.jpg, dhe vendndodhjen 123. Dhe çfarë ndodh atëherë, kur ju bosh plehra tuaj? Që shkon larg. Por ajo që nuk shkojnë larg, është e 0 dhe 1 e. Pra, çfarë është, atëherë, lidhja me pset 4? E pra, me pset 4, vetëm për shkak se ne kemi fshirë aksidentalisht kartë compact flash që kishte të gjitha këto foto, ose vetëm për shkak se ajo me fat të keq u bë i korruptuar, nuk do të thotë se të 0 dhe 1 e nuk janë ende atje. Ndoshta disa prej tyre janë humbur për shkak se diçka u korruptuar në kuptimin që disa të 0 became 1 dhe 1 u bë e 0. Gjëra të këqija mund të ndodhë për shkak të programeve buggy apo dëmtuar hardware. Por shumë prej këtyre bit, ndoshta edhe 100% e tyre janë ende atje, kjo është vetëm se kompjuteri apo kamera nuk e di ku JPEG 1 ka filluar dhe ku JPEG 2 filluar, por nëse ju, programues, e di, me pak tru, ku ato janë JPEGs ose atë që ata të duken si, Ju mund të analizuar 0 të dhe të 1 dhe thonë, "Ooh. JPEG. Ooh, JPEG ". Ju mund të shkruani një program me thelb vetëm një për lak ose kur që rimëkëmbet çdo njëri prej këtyre dosjeve. Pra mësim atëherë, është për të filluar "sigurt" fshirja dosjet tuaja në qoftë se ju dëshironi të shmangur këtë krejt. Po? [Pyetja Student, pakuptueshëm] Kanë >> memorie më shumë se ju e bëri më parë - Oh! Mirë pyetje. Pra, pse, atëherë, pas zbrazjes plehra, A kompjuterin tuaj ju them se ju keni më shumë hapësirë ​​të lirë se ju e bëri më parë? Në pak fjalë, sepse kjo është gënjyer. Më teknikisht, ju keni më shumë hapësirë. Sepse tani ju kanë thënë, ju mund të vendosni gjëra të tjera se ku fotografi dikur ishte, por kjo nuk do të thotë BITS janë duke shkuar larg, dhe se nuk do të thotë BITS janë duke u ndryshuar të gjitha 0, për shembull, për mbrojtjen tuaj. Nga ana tjetër, në qoftë se ju "sigurt" fotografi fshihet, ose fizikisht shkatërruar pajisjen, që me të vërtetë është e vetmja rrugë, ndonjëherë, rreth se. Pra, pse nuk kemi lënë në këtë shënim të gjysmë-të frikshme, dhe ne do të shohim ju në hënën. CS50.TV