[Powered by Google Translate] [Java 5]
[David J. Malan - Universiteti i Harvardit]
[Kjo është CS50. - CS50.TV]
>> Kjo është CS50, Java 5.
Sot dhe këtë javë, ne kemi prezantuar një pak të botës së mjekësinë ligjore
në kontekstin e problemit Set 4.
Sot do të jetë një leksion i shkurtuar për shkak se ka një ngjarje të veçantë në këtu më pas.
Pra, ne do të hedhim një vështrim dhe të 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 MIT nismë e re në internet për OpenCourseWare dhe më shumë,
ka nisur në kampus Harvardit të hënën, që do të thotë të vijë e hëna
ju do të keni, si e numërimin e fundit, 86.000 shokët e klasës të tjera
Kush do të jetë ndjekur 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 të CS50 dhe tani CS50x.
Si pjesë e kësaj tani, të kuptojë 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,
kjo nuk është mjaft e mirë nxënës-arsimtar dikur ne hit 80.000 e studentëve.
Ne nuk do të jeni të kategorizim 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ë command-line utility brenda pajisjes
që ju do të merrni një herë ju update it më vonë këtë fundjavë.
Ju do të jenë në gjendje për të drejtuar një komandë, check50, në pset tuaj,
dhe ju do të merrni reagime të menjëhershme për të parë nëse programi juaj është e saktë apo i pasaktë
sipas specifikimeve të ndryshme të projektimit që kemi dhënë.
Më shumë se në specifikimet e caktuar e problemit.
Shokët e klasës CS50x do të jetë duke përdorur këtë si.
>> Set Problem 4 është mbi të gjitha mjekësinë ligjore,
dhe kjo pset ishte i frymëzuar me të vërtetë nga disa sende të vërtetë të jetës
ku kur isha në shkollën e diplomuar I internuar për një kohë
me zyrën e Prokurorit të Rrethit Middlesex County s së bërë punë mjeko-ligjore
me plumb hetues mjeko-ligjor të tyre.
Çfarë kjo arriti në, si unë mendoj se kam përmendur disa javë kaluara,
Policia e Shtetit është e Mass ose të tjerët do të vijë në,
ata do të zbres gjëra të tilla si hard drives dhe CD dhe floppy disqe dhe si,
dhe pastaj qëllimi i zyrës mjeko-ligjore ka qenë për të vërtetuar
nëse kishte 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, gjë që përfshin disa lloj të mediave digjitale.
Ajo rezulton se nuk është se shumë njerëz shkruajnë një email duke thënë, "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ë pset4 një grimë e graphics.
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 piksele.
Në rastin e fytyrës Rob, ka të gjitha llojet e ngjyrave,
dhe kemi filluar të shohim dots individuale, i njohur ndryshe si pixels,
sapo kemi filluar të zoom in
Por nëse ne thjeshtojë botën një pak dhe vetëm thonë se kjo këtu është Rob në të zezë dhe të bardhë,
për të përfaqësuar zezë dhe e bardhë, ne 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ë
fytyrë të qeshur e 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 për të filluar pastaj të flasim për fotografitë shumëngjyrëshe,
gjërat 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 e mundësive të ndryshme ngjyra.
Pra, ne do të prezantoj këtë Set 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 nesër zakonshme.
>> Ne gjithashtu do të prezantoj me një tjetër format file.
Kjo është për qëllim me qëllim për të parë frikësuese në fillim,
por kjo është vetëm disa dokumentacioni për një struct C.
Ajo rezulton se Microsoft vjet më parë ka ndihmuar popullarizohen këtë format
quajtur bitmap format file, bmp, dhe kjo ishte një super e thjeshtë, ngjyra format grafik fotografi
që është përdorur për mjaft kohë dhe nganjëherë ende për Wallpapers në desktop.
Nëse ju mendoni përsëri në Windows XP dhe kodra kodrina dhe qiellit blu,
që ishte zakonisht një imazh bmp ose bitmap.
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 0s dhe 1s.
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 0s dhe 1s,
por ka disa 0s 1s shtesë dhe në atje.
Dhe kjo rezulton se ajo që ne kemi marrë për të dhënë ndoshta për vite -
file formats si. doc ose. xls apo. mp3, mp4., çfarëdo file formats
se ju jeni të njohur me - ç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 0s dhe 1s.
Dhe ndoshta ata 0s dhe 1s përfaqësojnë ABC përmes ASCII apo të ngjashme,
por në fund të ditës, ai është ende vetëm 0s dhe 1s.
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 0 kompensuar atje,
aty do të jenë disa quajtur cryptically bfType ndryshueshme quajtur,
të cilat vetëm qëndron për llojin e file bitmap, çfarë lloji i file bitmap është kjo.
Ju mund të konkludoj ndoshta nga rreshtin e dytë që kompensuar 2, numri i bajt 2,
ka një model të 0s dhe 1s që përfaqëson çfarë? Madhësia e diçka.
Dhe ajo shkon në nga atje.
Pra, në Set 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 vëreni se fillon të marrë interesante rreth bajt 54: rgbtBlue, Green, dhe Red.
Nëse ju keni dëgjuar ndonjëherë akronim RGB - 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 një dritë të ndritshme që vijnë nga një lente,
por mbrapa në ditë keni pasur lente të kuqe, lente blu, dhe lente jeshile,
dhe së bashku ata që synojnë një ekran dhe formoi një foto ngjyra.
Dhe mjaft shpesh, shkollat ​​e mesme dhe shkollat ​​e larta do të ketë këto lente
ndonjëherë kaq pak shtrembër, kështu ju keni qenë lloj i shohim imazhe të dyfishta apo trefishtë.
Por kjo 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, ndër sfidat atëherë për ju në problemin Set 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ë 0s dhe 1s,
kuptoj se cila chunks e 0s dhe 1s 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,
kjo mund të duket si ky vend pas kësaj.
Ndër sfidat tjera shumë do të jetë që ju do të dorëzohet një imazh mjeko-ligjore
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ë që ne aksidentalisht fshirë ose kishte imazhin e korruptuar disi.
Gjëra të këqija të ndodhë me kamera dixhitale.
Dhe kështu që ne kopjuar shpejt të gjitha off 0s dhe 1s të këtë kartë për ju,
shpëtuar të gjithë ata në një skedar të madh, dhe pastaj ne do të dorëzojë ato tek ju në problemin Set 4
kështu që ju mund të shkruani një program në C me të cilin për të rimarrë të gjitha ato JPEGs, në mënyrë ideale.
Dhe kjo rezulton se jpegs, edhe pse ata janë disi e një format file kompleks -
ata janë shumë më komplekse se kjo fytyrë të qeshur këtu -
kjo rezulton se çdo JPEG fillon me modelet e njëjta të 0s dhe 1s.
Pra, duke përdorur, në fund të fundit, një lak, ndërsa ose një për lak apo të ngjashme,
ju mund iterate mbi të gjitha 0s dhe 1s në këtë imazh mjeko-ligjore,
dhe çdo herë që të shihni model të veçantë që është përcaktuar në specifikimet e caktuar e problemit,
ju mund të marrë 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 numrin e bytes
ose kilobytes ose megabajt vonë, ju mund të marrë këtu është një JPEG dytë,
foto e mora pas një të parë.
Më lejoni të mos e lexuar këtë skedar parë, filloni të shkruani këtë një të re,
dhe prodhimi i programit tuaj për pset4 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ë shumë do të jetë mjaft e një rasti të përbashkët.
Pra, kjo është ajo që është në horizont.
>> Quiz 0 pas nesh, të realizuar në email tim që gjithmonë ka njerëz të cilët janë të dyja të lumtur,
lloj kohe neutrale, dhe i trishtuar rreth quiz 0.
Dhe ju lutem mos arritur jashtë për mua, kreu TF 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ë, ajo është biblioteka CS50?
[Qeshur] Good job.
Çfarë është bibliotekë CS50? Po. >> [Student] Kjo është një para-shkruar grup i kodit [padëgjueshme]
Mirë, mirë.
Kjo është një para-shkruar grup i kodit që kemi stafi i shkruar, ne ofrojmë për ju,
që ofron një funksionalitet të përbashkët,
sende si të merrni më një varg, të 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ë.
Ne jemi duke shkuar për të filluar për të marrë një varg larg nga ju,
e cila risjell ishte vetëm një sinonim për çfarë lloji të dhënave aktuale? Studentët shumta >> [] char *.
* Char. Për prindërit, që ishte ndoshta [e bën të shëndoshë whooshing]. Kjo është e mirë.
* Char ne do të fillojnë të shohin në ekran të gjithë më shumë si ne vargun hequr 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ë shkruani diçka në, 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ë tërheqë deri Appliance CS50
dhe ky file i quajtur cs50.h, të cilat ju keni qenë për disa javë # përfshirë,
por le të shohim se çfarë është në të vërtetë në brendësi të kësaj.
Në krye të dosjes 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 software këto ditë është ajo që quhet burim të 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 që 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.
Njoftimi në krye këtu se dosja cs50.h përfshin një bandë e tërë e dosjeve header.
Shumica e këtyre, ne nuk e kemi parë më parë, por një është e njohur.
Cila nga këto kemi parë, megjithëse shkurtimisht, deri më tani? >> [Student] bibliotekë Standard.
Po, biblioteka standarde. stdlib.h ka malloc.
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.
Ne kemi qenë të përfshirë për disa javë stdbool.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ë.
Në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ë ylli nuk ka 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 ylli ka të bëjë me llojin,
por e kuptojnë vetëm si e zakonshme, nëse nuk është një pak më të zakonshme,
është për të vënë atë atje, por funksionalisht është e njëjta gjë.
Por tani, nëse lexojmë poshtë më tej, le të marrin një vështrim në GetInt
sepse ne kemi përdorur që ndoshta të parë para se çdo gjë tjetër këtë semestër.
Këtu është GetInt. Kjo është ajo? >> [Student] Një prototip. Kjo >> është vetëm një prototip.
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 që ju dëshironi që njerëzit e tjerë të jenë në gjendje për t'u përdorur,
e cila ë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 # përfshijë në kodin e tyre.
Pra, gjithë kësaj kohe, ju keni qenë të përfshirë të gjitha këto prototipa,
efektive në krye të dosjes tuaj, por me anë të këtij mekanizmi # include,
e cila në thelb kopje dhe pastat këtë fotografi në tuaj.
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.
Ç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?
Idealisht, kjo është e parashikueshme.
Pra, në këtë rast, në qoftë se ju në të vërtetë lexuar shkruar gjobë,
në fakt ju do të shihni se në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?
[Student] A konstante. >> Kjo është një konstante.
Kjo është një konstante të 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 rreth 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ë: -2000000000 më 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 -2000000000,
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 të mëdha.
Por ju nuk doni të shtypni diçka përdorues fshehta si ... 234, një numër i madh të vërtetë.
Ju përgjithësuar atë vend si një konstante.
Pra me të vërtetë, në qoftë se ju ishin duke u anal javëve të fundit, çdo herë që quhet GetInt,
ju duhet të keni qenë të kontrolluar me një kusht nëse bënë llojin e përdoruesit në INT_MAX,
ose, më saktësisht, bëri INT_MAX GetInt kthimit, 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, të cilat vetëm do të thotë të veçantë.
>> Le të kthehemi tani në dosje. C.
File C ka ekzistuar në aplikim për disa kohë.
Dhe në fakt, ajo ka aplikim para-hartuar për ju në atë gjë, ne të quajtur kod objekt,
por ai thjesht nuk ka rëndësi për ju, ku ajo është për shkak se sistemi di
në këtë rast kur ai është: aplikim.
Le të lëvizni poshtë për të GetInt tani dhe shikoni se si GetInt ka qenë duke punuar gjithë këtë kohë.
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 input.
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ë thyer nga kjo disi ose të kthehen nga brenda këtë.
>> Le të shohim se si punon kjo.
Ne duket të jetë duke përdorur getString në këtë linjë të parë brenda loop, 166.
Kjo është tani praktikë e mirë, sepse në çfarë rrethanash mund të kthehen getString
NULL veçantë fjalen? >> [Student] Nëse diçka shkon keq.
Nëse diçka shkon keq. Dhe çfarë mund të shkojnë keq kur ju telefononi diçka si getString?
Po. >> [Student] malloc dështon për të dhënë atë ints.
Po. Ndoshta malloc dështon.
Diku nën kapuç, getString është duke bërë thirrje malloc, e cila akordon kujtesës,
e cila lejon të dyqan kompjuter të gjitha personazhet
se përdoruesi lloje në tastierë.
Dhe mendoj përdorues kishte një të tërë shumë kohë të lirë dhe më të shtypur, për shembull,
se 2 miliardë karaktere në, karaktere më shumë se kompjuteri ka edhe RAM.
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 në gjendje për të trajtuar këtë,
dhe kështu getString, në qoftë se ne kemi shkuar mbrapa dhe lexoni dokumentacionin e saj, e bën në fakt e kthimit NULL.
Deri tani, nëse dështon getString duke u kthyer NULL, GetInt do të dështojë duke u kthyer INT_MAX
vetëm 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.
>> Le të lëvizni poshtë për të ku int është marrë në të vërtetë.
Nëse unë lëvizni poshtë pak më tej, në përputhje 170, ne kemi një koment mbi këto linja.
Ne shpallim 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 para, sscanf.
Kjo qëndron për scanf string.
Me fjalë të tjera, më jep mua një varg dhe unë do të scan atë për pjesë të informacionit të interesit.
Çfarë do të thotë kjo?
Le të supozojmë se unë lloji në, fjalë për fjalë, 123 në tastierë dhe pastaj goditi Enter.
Çfarë është lloji dhënat e 123, kur u kthye nga getString? >> [Student] String.
Kjo është padyshim një varg, apo jo? Unë kam një varg.
Pra, 123 është me të vërtetë, të japin kuotën e-mbyll thonjëzat, 123 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ë varg majta në të djathtë - 123 \ 0 - dhe disi të konvertohet në një numër të plotë aktuale.
Ju mund të kuptoj se si ta bëni këtë.
Nëse ju mendoni përsëri në pset2, ju me sa duket mori një pak më të rehatshme me Cezarit
ose Vigenere, kështu që ju mund iterate mbi një varg, ju mund të konvertohet chars të ints.
Por dreq, kjo është një tërësi shumë të punë.
Pse të mos thërrasë një funksion si sscanf që bën që për ju?
Kështu sscanf pret një argumenti - në këtë rast quajtur linjë, e cila është një varg.
Ju pastaj të specifikojë në thonjëza, shumë të ngjashme me printf, çfarë ju presim të shohim në këtë varg.
Dhe atë 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.
Dhe kjo rezulton se ky simbol është tani kujton gjëra kemi filluar duke folur për
vetëm mbi një javë më parë.
Çfarë është & n & dhe c bërë për ne këtu? >> [Student] Adresa e n dhe adresa e c.
Po. Është dhënë mua adresën e n dhe adresa e c. Pse është se e rëndësishme?
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ë kthehen zbrazëti,
por ju mund të kthehen vetëm një 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.
Ju doni në mënyrë efektive sscanf të kthehen dy gjëra, por kjo nuk është e mundur vetëm në C.
Ju mund të punojnë rreth se duke kaluar në dy adresat
sepse sa më shpejt që ju të dorëzojë një funksion dy adresat,
çfarë mund të bëni që të funksionojnë me to? >> [Student] Shkruani me ato adresa.
Ajo mund të shkruani në adresat ato.
Ju mund të përdorni operacion yll dhe shkoni atje, në secilën prej këtyre adresave.
Kjo është lloj i këtij mekanizmi prapa-derë, por shumë e zakonshme për ndryshimin e vlerave të variablave
më shumë se vetëm një vend - në këtë rast, dy.
Tani vini re unë jam duke kontrolluar për == 1 dhe pastaj kthehen n në qoftë se ka, në fakt, për të vlerësuar e vërtetë.
Pra, çfarë po ndodh? 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ë lexuar string - citim-mbyll thonjëzat 123 -
dhe në qoftë se kjo duket si ka një numër atje, ajo që ne jemi duke thënë sscanf për të bërë
është vënë atë numër - 123 - në këtë variabël n për mua.
Pra, pse atëherë nuk kam të vërtetë kanë këtë si?
Çfarë është roli i sscanf duke thënë se ju mund të merrni edhe një karakter këtu?
[Përgjigja e padëgjueshme Studenti] >> Një pikë decimale në fakt mund të punojnë.
Le të thonë se mendohet për një moment. Çfarë tjetër?
[Student] Kjo mund të jetë NULL. Mirë >> mendimi. Kjo mund të jetë personazhi null.
Kjo nuk është në fakt në këtë rast. Po. >> [Student] ASCII.
ASCII. Ose më lejoni të përgjithësuar edhe më tej.
C% nuk ​​është vetëm për kontrollin gabim.
Ne nuk duam që të ketë një 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 numrin e variablave të vënë vlerat in
Pra, nëse ju vetëm shkruani në 123, atëherë vetëm% d do të shkojë,
dhe vetëm merr n ruajtur me një vlerë si 123,
dhe asgjë nuk merr vënë në c.
C mbetet një vlerë e mbeturinave, kështu që të flasin -
mbeturina, sepse ajo kurrë nuk është initialized për disa vlera.
Pra, në këtë rast, sscanf kthehet 1 sepse unë populluar 1 e këtyre 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ë kthehen n,
tjetër në qoftë se keni menduar ndonjëherë se ku Riprovo deklaratë vjen nga, ajo vjen nga të drejtë këtu.
Pra, nëse, nga ana tjetër, unë lloji në 123foo - vetëm disa sekuenca të rastit të tekstit -
sscanf do të shohim, numri numrin numrin,, f,
dhe kjo do të vihet në 123 n, ajo do të vënë në f c dhe pastaj kthehen 2.
Pra, ne kemi, vetëm duke përdorur përkufizimin bazë të sjelljes sscanf, një mënyrë shumë të thjeshtë -
edhe, komplekse në shikim të parë, por në fund të ditës mekanizmit mjaft e thjeshtë -
e duke thënë se ka një int dhe nëse është kështu, është se e vetmja gjë që kam gjetur?
Dhe hapësira të bardha 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ë të whitespace
në fillim apo në fund, edhe sscanf do të lejojë përdoruesit, për çfarëdo arsye,
për të goditur bar hapësirë ​​123 dhe që do të jetë legjitim.
Ju nuk do të çirrem në përdoruesi vetëm për shkak se ata e goditi space bar
në fillim apo në fund, e cila është vetëm pak më shumë përdorues-miqësor.
>> Çdo pyetje pastaj në GetInt? Po. >> [Student] Çfarë ndodh nëse ju vetëm vënë në një char?
Mirë pyetje.
Çfarë ndodh nëse ju shtypur vetëm në një char si f dhe hit Enter pa ndonjëherë shtypja 123?
Çfarë mendoni se sjellja e kësaj linje të kodit atëherë do të jetë?
[Përgjigja e padëgjueshme Student]
Yeah, kështu që mund të mbulojë sscanf se edhe për shkak se në këtë rast, kjo nuk do të plotësoni n ose c.
Ajo do të kthehet në vend 0, rast në të cilin unë jam gjithashtu infektues atë skenar
sepse vlera e pritur që unë dua është 1.
Unë vetëm dua një dhe vetëm një gjë për t'u mbushur. Mirë pyetje.
>> Të tjerët? Dakord.
>> Le të mos të kalojnë nëpër të gjitha funksioneve në këtu,
por ai që duket të jetë ndoshta e interesit të mbetur është getString
sepse kjo rezulton se GetFloat, GetInt, GetDouble, GetLongLong
gjitha sandall 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.
Në getString, e cila merr asnjë argument sipas pavlefshme deri këtu
dhe ajo kthen një varg, unë jam deklaruar me sa duket një varg quajtur buffer.
Unë vërtetë nuk e di se çka do të përdoren për, por ne do të shohim.
Ajo duket si kapaciteti është nga default 0.
Nuk jam i sigurt ku po shkon kjo, jo të 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.
Në linjë 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? >> [Student] 256. 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ë atë rast 128 ose 256 karaktere ASCII.
Ne kemi përdorur të gjitha modelet e lart 0s dhe 1s.
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ë se ata përdorin vlerën e ardhshëm më të madhe, diçka si një int,
kështu që ju keni një numër të çmendur të bit, 32, 4 miliardë për vlerat e mundshme
kështu që ju thjesht mund të përfundojnë duke përdorur në thelb 257 prej tyre,
1 e cila 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ërkohë që është duke bërë thirrje fgetc,
f fotografi kuptimi, kështu getc, dhe pastaj STDIN.
Kjo rezulton nga kjo është vetëm mënyra më e saktë për të thënë të lexuar të dhëna nga tastierë.
Standard mjete input tastierë, prodhimi standarde do të thotë ekran,
dhe gabimi standard, të cilat ne do të shohim në pset4, do të thotë 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 Enter, ne duam të ndalemi në këtë pikë,
fund të lak - dhe ne gjithashtu duam të kontrolloni për EOF veçantë të vazhdueshme,
që nëse ju e dini apo me mend, çfarë e bën atë të qëndrojë për? >> [Student] Fundi i file. Fundi >> e dosjes.
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.
EOF - fundi i file.
Si një mënjanë, në qoftë se ju keni goditur ndonjëherë Kontrollit D në tastierën tuaj, jo që ju do të keni ende -
ju keni goditur Kontrollit C - Kontrolli D dërgon këtë konstante të veçantë të quajtur EOF.
Deri tani ne vetëm duhet disa alokimin dinamik kujtesës.
>> Pra, në qoftë se (n + 1> kapaciteteve). 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,
intuitivisht se çfarë ne duhet të bëjmë atëherë është ndajë më shumë kapacitet.
Kështu që 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ë ose malloc të paktën në përgjithësi të njohur.
Merrni me mend se çfarë realloc bën. >> [Student] Adds kujtesës.
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 mund të mbani vetëm vënë personazhet e vargut të kthehet prapa për të kthyer prapa.
Por në qoftë se nuk është rasti për shkak se ju ka pritur shumë gjatë
dhe diçka të rastit u plopped në kujtesën atje
por ka memorie ekstra 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ë shumë larg nga këtu, e 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 një karakter të vetëm,
dhe në qoftë se përdoruesi lloje në dy karaktere, getString përfundon thirrje realloc dhe thotë
një karakter nuk ishte e mjaftueshme, jepni dy karaktere.
Pastaj në qoftë se ju lexoni me anë të logjikës së lak, kjo do të thotë
përdoruesi shtypur në 3 shkronja; jep mua tani nuk 2 por 4 karaktere,
pastaj 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 shpejtë super.
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 një karakter shtesë nga tastierë?
[Përgjigja e padëgjueshme Studenti] >> Çfarë është ajo? >> [Student] Ju nuk duhet të rritet atë sa më shpesh.
Saktësisht. Ju nuk duhet të rritet atë sa më shpesh.
Dhe kjo është vetëm lloj i ju jeni mbrojtëse baste tuaj këtu,
Ideja është se ju nuk doni të telefononi realloc shumë për shkak se 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 -
vëreni 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 buffer lirë e tepër të madh
në qoftë se ajo vërtetë u dyfishua shumë herë.
Pra me pak fjalë, kjo është se si getString ka qenë duke punuar gjithë këtë kohë.
Të gjitha ai 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 telefonuar 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 gjithë bota 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ëz 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. >> [Malan] Një argument i vetëm.
Pra, argv [1], që do të thotë fjalën e parë që përdoruesi typed në command line
pas a.out apo çfarëdo programi është quajtur.
Pra, foo në krye merr në një char *. Por * char është vetëm ajo? >> [Student] Një varg.
[Malan] Një string, kështu që nuk ka asgjë të re këtu.
Kjo është string arbitrarisht 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ë?
[Student] Një grup i - >> Array e? >> [Student] Personazhet. 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 thjesht do të thotë një bandë e hapësirës
që ju mund të vënë disa sende in
Pastaj fundi, memcpy ne nuk e kam 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ë?
Ajo duket kopje bar, kontributi i saj, në të c por vetëm deri në gjatësinë e bar.
Por ka një bug këtu. >> [Student] Ju duhet karakterin sizeof. Mirë >>.
Teknikisht, ne duhet të vërtetë të bëjë strlen (bar) * sizeof (char)). Kjo është e saktë.
Por në rastin më të keq këtu, le të supozojmë se that's -
Rregull. Pastaj ka dy mete.
Kështu sizeof (char));
Le të bëjnë këtë një pak më të gjerë.
Deri tani nuk ka ende një bug, e cila është ajo? >> [Përgjigja e padëgjueshme Student]
Kontrollo për çfarë? >> [Student] Kontrolloni for null.
Ne përgjithësi duhet të jetë kontrolluar for null, sepse gjëra të këqija të ndodhë
kur akrep juaj është NULL, sepse ju mund të përfundojnë duke shkuar atje,
dhe ju kurrë nuk duhet të shkojnë në NULL duke dereferencing atë me operatorin yll.
Pra, kjo është e mirë. Dhe çfarë tjetër po bëjmë? Logjikisht, ka një krisje edhe këtu.
[Studenti] Kontrolloni nëse argc është> = tek 2.
Pra kontrolloni nëse argc është> = 2. Mirë, kështu që nuk ka tre mete në këtë program këtu.
Ne jemi tani 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] C nuk mund të jetë mjaft e madhe.
Mirë. 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 çfarë ndodh nëse përdoruesi typed në një fjalë në të shpejtë si një fjalë 20-karakter?
Kjo është thënë kopje 20 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 apo muar tampon sulm.
Dhe kjo është një sulm në kuptimin që nëse përdoruesi ose program që flet funksionin tuaj
është duke bërë këtë me keqdashje, se çfarë ndodh në të vërtetë tjetër në fakt mund të jetë mjaft e keqe.
>> Pra, le të marrin një sy në këtë foto këtu.
Kjo foto paraqet turrë tuaj të kujtesës.
Kujtojnë se çdo herë që të thërrasë një funksion që ju të merrni këtë kornizë të vogël në rafte
dhe pastaj një tjetër dhe pastaj një tjetër dhe një tjetër.
Dhe deri tani, ne kemi vetëm lloji i përhumbur këto si rectangles
ose në dërrasë ose në ekran këtu.
Por nëse ne zoom në në një nga ato rectangles, kur ju e quani një foo funksion,
ajo rezulton se ka më shumë në brendësi të rafte atë kornizë në atë 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 Adresa Kthim.
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 mbyllur 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ë këtë drejtkëndësh të 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 Frame lidhet në mënyrë të ngjashme me këtë.
Bar char * ketu përfaqëson çfarë?
Tani ky segment blu këtu është kornizë foo-së. Çfarë është bar?
Bar është vetëm argumenti në funksion foo.
Deri tani ne jemi kthyer në lloj foto njohur.
Ka gjëra shumë dhe distractions më shumë në ekran,
por ky segment të lehta blu vetëm është ajo që ne kemi qenë duke u bazuar në dërrasë
për diçka si shkëmbim. Kjo është kornizë për foo.
Dhe e vetmja gjë në të drejtë tani është bar, e cila është ky parametër.
Por çfarë tjetër duhet të jetë në rafte në përputhje me këtë kod këtu?
[Student] char c [12]. >> [Malan] char c [12].
Ne gjithashtu duhet të shohim 12 sheshet e kujtesës ndarë në një ndryshore të quajtur c,
dhe në 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 duke tërhequr të gjithë 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ë bajt 12 të tilla.
Por këtu është problemi.
Në cilin drejtim po c rritje?
Lloj i lartë poshtë në qoftë se ajo fillon në krye dhe rritet deri në fund.
Ajo 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 treguesin Frame Saved,
që është e drejtë kundër Adresa e kthimit. Nuk ka vend më shumë.
Pra, çfarë është implikimi atëherë nëse ju vidhos deri
dhe ju provoni lexuar 20 bytes në një tampon 12-byte?
Ku janë ato 8 bytes shtesë do të shkojnë? >> [Student] Brenda -
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 Kthehu,
sepse mendoj se ju ose rastësisht ose adversarially prishësh ato 4 byte,
se 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ë implikimi, logjikisht? >> [Student] Funksioni do të kthehet në një vend tjetër.
Saktësisht.
Kur kthehet foo dhe hits qe mbajtëse kaçurrel, programi do të vazhdojë
të mos kthehen në kryesore, ajo do të kthehet në çdo gjë që adresa është në atë kuti të kuqe.
>> Në rastin e regjistrimit software anashkaluar,
çka nëse adresa që është duke u kthyer në është funksion që normalisht merr quajtur
pasi ju keni paguar për software dhe futur kodin e regjistrimit?
Ju mund të lloj mashtrim e kompjuterit në mos shkuar këtu, por në vend që të shkojnë deri këtu.
Ose në qoftë se jeni të vërtetë i 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 në fakt në lloje
disa karaktere që përfaqësojnë kodin.
Dhe kjo nuk do të jetë kodi C, ajo është në të vërtetë do të jenë karaktere
që përfaqësojnë kodin binar makine, 0s dhe 1s.
Por mendoj se ata janë të zgjuar të mjaftueshme për të bërë këtë,
në një farë mënyre ngjitur në diçka getString shpejtë që është hartuar kodi në thelb,
dhe e fundit 4 bytes prishësh atë adresë të kthimit.
Dhe çfarë bën që adresa input bëni?
Ajo në fakt 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 të këqija nga atje,
por në qoftë se ju mund të kuptoj se sa e madhe kjo tampon është
të tilla që bytes fundit në kontributin që japin për programin
ndodhë që të jetë e barabartë me adresën e fillimit të tampon tuaj, ju mund ta bëni këtë.
Nëse themi normalisht Përshëndetje 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 -
AAA,, sulm sulm, sulm - ku kjo është vetëm diçka që e bën diçka të keqe,
ç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, C0, 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ëse djalë i keq është super i zgjuar, ai ose ajo do të përfshijë në këtë kod sulm
diçka si të fshirë të gjitha dosjet e përdoruesit ose kopje fjalëkalimet
ose krijoni një llogari përdoruesi që unë pastaj mund të hyni në të - 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ë ndonjë gjë që ju dëshironi
thjesht nga që ajo të hidhen rreth brenda hapësirës së vet kujtesës.
Dhe kështu në këtë ditë kaq shumë programe dhe faqet e internetit kaq shumë që janë të kompromituar
avulloj për njerëzit duke përfituar nga kjo.
Dhe kjo mund të duket si një sulm super të 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,
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 internetit Rrëzohet
ose ju të presim për të parë 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 çmendur
se 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, gjykim dhe gabimi të mjaftueshme,
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ë të vërtetë duke kërkuar në shkrimet
dhe duke parë atë që inputet çmendur të ketë njerëz të shtypur në faqen tuaj te internetit,
çfarë kushte kërkimi njerëzit kanë shtypur në faqen tuaj te internetit
në 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.
>> Lidhur me atë që atëherë shumë është kjo.
Le të shikoj në brendësi të një hard drive përsëri.
Ju kujtohet nga një ose dy javë më parë se kur ju drag fotografi në Recycle Bin tuaj ose plehra mund,
çfarë ndodh? >> [Student] Asgjë. Absolutisht asgjë >>, apo jo?
Përfundimisht, nëse ju drejtuar të ulët në hapësirë ​​në disk,
Windows apo Mac OS do të fillojë grisësh fotografi për ju.
Por në qoftë se ju drag diçka në atje, kjo nuk është aspak e sigurt.
Të gjitha shokun tuaj apo mik apo anëtar i familjes ka të bëni është të klikoni dy herë dhe, voila,
ka të gjitha dosjet që ju të paqarta u përpoqën për të fshirë.
Shumica prej nesh të paktën e di se ju duhet të klikoni me të djathtën apo të Kontrollit klikoni
dhe bosh plehra ose diçka të tillë.
Por edhe atëherë se nuk ka fare të bëjë hile
sepse ajo që ndodh kur ju keni një fotografi në hard drive tuaj
që përfaqëson një dokument Word ose disa 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 0s dhe 1s.
Çfarë ndodh kur nuk jeni vetëm terhiq atë skedar në plehra mund, ose Recycle 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 një kolonë për dosjet 'emra dhe një kolonë për dosjet' vend,
ku kjo mund të jetë vendndodhja 123, vetëm një numër të rastit.
Pra, ne mund të kemi diçka si x.jpeg dhe lokacioni 123.
Çfarë ndodh atëherë kur ju të vërtetë bosh plehra tuaj?
Që shkon larg.
Por ajo që nuk shkojnë larg, është 0s dhe 1s.
>> Pra, çfarë është atëherë lidhja me pset4?
E pra, me pset4, vetëm për shkak se ne kemi fshirë aksidentalisht kartë kompakt flash
që kishte të gjitha këto foto ose vetëm për shkak se ajo me fat të keq u bë e korruptuar
nuk do të thotë se 0s dhe 1s nuk janë ende atje.
Ndoshta disa prej tyre janë humbur për shkak se diçka u korruptuar
në kuptimin që disa 0s became 1s dhe 0s 1s became.
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.
Është vetëm se kompjuteri apo kamera nuk e di ku JPEG1 filluar
dhe ku JPEG2 filluar.
Por në qoftë se ju, programues, e di me pak tru ku ato janë jpegs
apo atë që ata të duken si kështu që ju mund të analizuar JPEG 0s dhe 1s dhe thonë, JPEG,
ju mund të shkruani një program me thelb vetëm një për lak ose kur
që rimëkëmbet çdo një prej këtyre dosjeve.
Pra, mësimi është, pra, për të filluar sigurt fshirja dosjet tuaja
në qoftë se ju dëshironi të shmangur këtë krejt. Po.
>> [Student] Si të vijë ajo thotë se në kompjuterin tuaj
që ju kanë kujtesë më shumë se ju bëri para?
Kanë kujtesë më shumë se ju bëri para - >> [Student] memorie më në dispozicion.
Oh. Mirë pyetje.
Pra, pse pastaj pas zbrazjes plehra ka kompjuteri juaj të 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 keni thënë
ju mund të vendosni gjëra të tjera se ku dikur ishte fotografinë.
Por kjo nuk do të thotë se BITS janë duke shkuar larg,
dhe se nuk do të thotë se janë duke u ndryshuar bit të gjitha 0s, për shembull,
për mbrojtjen tuaj.
Pra, nga ana tjetër, në qoftë se ju të sigurt fshihet fotografi apo fizikisht shkatërruar pajisjen,
që me të vërtetë është e vetmja mënyrë rreth se ndonjëherë.
>> 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.
[Duartrokitje]
>> [CS50.TV]