[MUSIC Playing]
>> DAVID J. Malan: Në rregull.
Kjo është CS50.
Dhe ky është fillimi i javës 5.
Dhe si ju mund të keni vënë re, disa prej materialit
po bëhet pak më shumë komplekse, pak më e dendur.
>> Dhe kjo është shumë e lehtë, sidomos nëse ju keni qenë në zakonin për disa kohë,
të jetë duke u përpjekur për të shkarravitje poshtë më çdo gjë që ne bëjmë, ne jemi duke thënë në klasë.
Por e kuptojnë, se nuk është ndoshta Qasja ideal pedagogjik
për të mësuar këtë lloj të materialit, dhe materiale në përgjithësi.
Dhe kështu që ne jemi të kënaqur për të shpallë vet Gheng atij CS50-së
Gong ka filluar të përgatisë një grup kanonik i shënimeve
për kursin, shpresa e e cila është se, e, këto
jo vetëm të shërbejë si një referencë dhe një burim
për shqyrtimin e materialit dhe duke shkuar prapa përmes materialit që mund të ketë
ju shpëtoi herën e parë, por Gjithashtu në mënyrë që krerët tuaj mund të jetë më
lart se poshtë, kur ajo vjen koha për të leksion,
kështu që ju mund të angazhohen më shumë mendueshëm, si
krahasim me më shumë scribbly.
>> Me tha se, ajo që do të gjeni në internetit është dokumente të tilla si kjo.
Dhe vini re, në krye të majtë, nuk ka jo vetëm një tabelë e përmbajtjes,
por edhe kodet kohë që menjëherë do të hidhen
në pjesën e duhur në videove online.
Dhe çfarë Chang këtu ka bërë është, në thelb, të dokumentuara
çfarë ka ndodhur në këtë leksion të veçantë.
Dhe shumë prej leksioneve janë tashmë në linjë me këtë URL.
Dhe ne do të vazhdojmë të postoni mbetur e atyre që deri në fund të kësaj jave,
kështu që të përfitojnë nga ky burim.
>> Pra, pa zhurmë më tej, kemi filluar të zhvishem përsëri
shtresa që ka qenë string për disa kohë.
Dhe çfarë bëri themi një varg në të vërtetë është javën e kaluar?
Yll Pra char.
Dhe yll char, mirë, çfarë e që me të vërtetë do të thotë?
E pra, të gjithë këtë kohë, në qoftë se ne kemi bërë thirrje një funksion,
si getString, dhe ruajtjen e ashtuquajtura kthimit
Vlera e getString në një variable-- është quajtur
s lloj string-- ne kemi qenë të shkruar linjë e kodit deri atje lart.
Dhe kjo është vetëm kur shoh tim shkrim dore zmadhuar këtu
bëj që unë të kuptojë se sa e tmerrshme është kjo.
>> Megjithatë, le të supozojmë se, në anën e djathtë
është, megjithatë, një të arsyeshme përshkrim të asaj që është
vazhduar gjithë këtë Ora me getString.
getString, natyrisht, merr një varg.
Por çfarë do që me të vërtetë do të thotë?
Kjo do të thotë ajo merr një copë të memorie nga sistemi operues
duke e quajtur një funksion, të quajtur malloc.
Por më shumë se më vonë.
Dhe atëherë ajo populates se copë e kujtesës
me letra përdorues ka shtypur në, e ndjekur nga, natyrisht,
një karakter null, ose backslash zero në fund.
>> Ndërkohë, në anën e majtë e këtë histori, të gjithë këtë kohë,
ne kemi qenë deklaruar një ndryshore, si s.
Dhe kjo variabël është ajo tani do të fillojnë duke e quajtur një akrep.
Kjo nuk është një kuti brenda të cilave ne kemi vënë string, Daven, në vetvete,
por ne kemi vënë në atë shesh kuti në të majtë çfarë saktësisht?
Po?
>> Audienca: Adresa e ku është e vendosur në kujtesën.
>> DAVID J. Malan: Pikërisht.
Adresa e ku Daven është e vendosur në memorie.
Dhe jo ku të gjithë Daven është e vendosur, në vetvete, por në mënyrë specifike adresa
e kujt?
Po?
>> Audienca: Karakteri i parë.
>> DAVID J. Malan: Karakteri i parë në Daven, i cili, në këtë rast,
I propozuar ishte në mënyrë arbitrare dhe jorealiste 1, OX1,
e cila vetëm do të thotë numri heksadecimal i 1.
Por kjo ndoshta do të jetë një numër shumë më të madhe
që të mund të tërheqë me një 0x si një parashtesë,
përfaqësojnë një karakter hexadecimal.
Dhe për shkak se ne nuk kemi nevojë të dini se ku Pjesa tjetër e personazheve të Daven
janë, për shkak të asaj dizajn të thjeshtë Vendimi që është bërë shumë vite më parë?
Po?
>> Audienca: Backslash 0.
DAVID J. Malan: Po, pikërisht.
Backslash 0 ju lejon, megjithëse në koha lineare, të kaloj nëpër varg,
këmbë nga e majta në të djathtë, me nje lak, ose një kohë
loop, ose diçka si se, dhe të përcaktojë, oh, këtu
është fundi i këtij vargut të veçantë.
Pra, me vetëm adresën në fillimi i një varg,
ne mund të hyni në tërësinë e kjo, për shkak se të gjithë këtë kohë,
një varg ka qenë vetëm një yll char.
>> Pra, kjo është me siguri e mirë për të vazhduar përdorimin biblioteka CS50 dhe ky abstraksion,
mënyrë që të flasin, por ne do të të fillojnë për të parë saktësisht
çfarë po u ndodh nën këtë kohë e tërë.
Kështu që ju mund të kujtojnë këtë shembull, shumë, nga hera e fundit, krahasuar 0,
e cila në fakt nuk krahasohen.
Por, kemi filluar për të zgjidhur këtë.
>> Por si ndoshta një përmendore, mund të I interesojnë dikë
në një elefant rozë sot, bërë edhe nga Chang?
Si për ju përpara? [E padëgjueshme].
Eja lart.
>> Dhe në ndërkohë, si keni dalë, le të
konsiderojnë për vetëm një moment se çfarë ky kod në të vërtetë kishte bërë.
Është deklaruar dy variabla up lartë, s dhe t, dhe duke e quajtur getString.
Kjo nuk është një program shumë përdorues-miqësor, sepse ajo nuk do të ju tregojnë se çfarë duhet të bëni.
Por, le të vetëm të supozojmë se ne jemi duke u fokusuar në pjesën lëng.
Dhe atëherë ne bëjmë, në qoftë s është e barabartë me është e barabartë me t, ai duhet të them printf,
keni shtypur të njëjtën gjë.
Përshëndetje.
Si e keni emrin?
>> Janelle: Janelle.
DAVID J. Malan: Janelle, nice to meet you.
Pra, sfidën tuaj në dorë për këtë elefant
është që së pari të na tërheqë një foto të asaj që është duke u përfaqësuar në ato dy të parat
linja.
Pra, s dhe t mund të jetë përfaqësuar si në ekran?
Dhe vetëm ju mund të tërheqë atë me gishtin tuaj në këtë ekran të madh.
>> Pra, ka dy gjysmave të secila anë e atij ekuacionit.
Pra, ka s në të majtë, dhe pastaj getString në të djathtë.
Dhe pastaj nuk ka t në të majtë, dhe pastaj getString në të djathtë.
Pra, si mund të fillojmë duke tërhequr një foto që
përfaqëson çfarë po ndodh këtu në kujtesë, do të thoni?
Dhe më lejoni të ju shpjegoj çfarë jeni duke bërë si ju shkoni.
>> Janelle: OK.
E pra, së pari, do të jetë i kërkuar që ju të merrni string input.
Dhe kjo do të store-- oh, sorry.
DAVID J. Malan: OK.
Mirë.
Dhe kjo quhet ajo?
Oh, OK.
Do të mbajë.
Unë nuk do të thotë për të ndërprerë.
Janelle: Na vjen keq.
Pra, kjo do të input atë në Adresa nuk of-- sigurt.
Unë nuk mund të mbani mend saktësisht numrin, por unë besoj se ajo ishte duke filluar me 0.
>> DAVID J. Malan: Kjo është e gjitha e drejtë, sepse unë i kam detyruar numrat lart,
kështu që nuk ka asnjë përgjigje të drejtë.
>> Janelle: Duke filluar me 0 hark.
>> DAVID J. Malan: OK, kështu element 0.
Sigurt.
>> Janelle: Atëherë, nëse është si vetëm një dy-letter--
>> DAVID J. Malan: OK, përsëri tek ju.
>> Janelle: Pra element 0, dhe atëherë element 1 ose element 2.
DAVID J. Malan: Dhe cila pjesë e foto jeni tërhequr tani?
Thirrja për getString?
Ose deklarata e s?
>> Janelle: Deklarata i s, unë besoj.
Oh, getString, sepse kjo do të të futur në çdo [? zonë. ?]
>> DAVID J. Malan: Mirë.
Pikërisht.
Edhe pse kjo mënyrë efektive kthehet një grup, kujtojnë,
kur ne të kthehemi një varg, ne mund Indeksi në atë varg duke përdorur 01 dhe 2.
Teknikisht, këto janë ndoshta përfaqësuar nga adresat individuale,
por kjo është në rregull.
>> Pra mendoj, në qoftë se unë mund vetëm të shpejtë përpara për të ku ne u ndërpre
Herën e fundit, në qoftë se një nga vargjet ishte g a b e,
backslash 0, duke përfaqësuar Gabe-së input, si mund ne përfaqësojmë s tani?
Nëse kjo është e kujtesës që është janë kthyer nga getString?
>> Janelle: A do të ishte përfaqësuar nga një hark?
>> DAVID J. Malan: Me një hark?
E pra, nuk ka.
Le të them vetëm, në pikturë, më lejoni vetëm të shkojnë përpara
dhe të propozojnë se, në qoftë se kjo është s, kjo është vlera kthimi i getString.
Dhe ke tërhequr kjo si 0, 1, 2, e cila është krejtësisht e arsyeshme, sepse ne
mund indeksi në varg, si të tillë.
Por vetëm që të jenë në përputhje me Herën e fundit, më lejoni të shkoj përpara
dhe në mënyrë arbitrare të propozojë që kjo është adresa 1, kjo është adresa 2,
kjo është adresa 3, dhe kështu me radhë.
Dhe kështu, vetëm që të jetë super qartë, se çfarë po ndodh
për të shkuar në s si rezultat i se Linja e parë e kodit, do të thoni?
>> Janelle: Adresa 1?
>> DAVID J. Malan: Pikërisht.
Pra adresuar 0x1.
Dhe ndërkohë, më lejoni të shkoj përpara dhe të kopjuar shumë nga ajo që ju keni bërë
dhe shtoni t tim këtu.
Nëse unë do të shkruani në Gabe përsëri për herë të dytë,
kur e bëri me getString, ku, natyrisht, është Gabe do të shkojnë?
E pra, presumably--
>> Janelle: Ashtu si në këtu?
DAVID J. Malan: Po.
Janelle: Ose ajo është gjithashtu në të njëjtat kuti?
DAVID J. Malan: Më lejoni të propozojë, vërtet, pikërisht, kështu që në këto kuti shtesë.
Por ajo që është kryesore tani është se, edhe edhe pse unë kam tërhequr këto mjaft të ngushtë
together-- 0x1, kjo është 0x2-- në realitet,
kjo tani mund të jetë adresa 0x10, për shembull, dhe 0x11 dhe 0x12,
dhe kështu me radhë.
Dhe kështu, në qoftë se është e rastit, çfarë do të përfundojnë këtu në t?
>> Janelle: 0x10?
DAVID J. Malan: Pikërisht.
Pra 0x10.
Dhe kështu që tani, pyetja e fundit.
Ju keni, nga larg, kishte për të punuar më e vështirë për një elefant deri tani.
Deri tani, në qoftë se unë tërheq lart kodin përsëri, kur unë bëj, në përputhje tre,
në qoftë se s barabartë barabartë t, çfarë jam unë në të vërtetë Krahasimi që ne kemi tërhequr këtu?
>> Janelle: Dy adresat?
DAVID J. Malan: Pikërisht.
Kështu që unë jam duke thënë është s barabartë barabartë me t?
Në fjalë të tjera, është 1 barabartë barabartë me 10?
Dhe sigurisht, Përgjigja e qartë është tani, nuk ka.
Dhe kështu që ky program është në fund të fundit duke shkuar për të shkruar atë, do të thoni?
>> Janelle: A do të ishte, keni shtypur të njëjtën gjë?
>> DAVID J. Malan: Pra, nëse s është 1 dhe t është 10?
>> Janelle: Ju shtypur gjëra të ndryshme.
>> DAVID J. Malan: Pikërisht.
Ju shtypur gjëra të ndryshme.
Të gjithë të drejtë.
Pra, një raund të duartrokitje, në qoftë se ne mund të, këtu.
[Duartrokitje]
Kjo ishte e dhimbshme.
Unë e di.
Bërë mirë.
Pra, tani le të shohim nëse ne nuk mund të vë në lojë përveç asaj fix ishte.
Dhe sigurisht, kur ne fiks this-- që unë tani do të përfaqësojë në green--
ne e bëmë disa përmirësimeve këtu.
Së pari, ashtu si një mendje e shëndoshë shikoni, unë jam i pari kontrolluar
në qoftë se s barabartë pavlefshme dhe t barabartë null.
Dhe vetëm të jetë i qartë, kur mund s ose t jetë null në kod si kjo?
Kur mund të s ose t jetë null.
Po?
>> Audienca: [padëgjueshme].
>> DAVID J. Malan: Pikërisht.
Nëse vargu që përdoruesi shtypur në është mënyrë shumë e gjatë
për të përshtaten në kujtesë, ose disa Rasti i çuditshëm qoshe si kjo,
getString, si ne do të shohim, fjalë për fjalë sot, në dokumentacion,
thotë se ajo do të kthehet null si një vlerë të veçantë rojtar,
ose vetëm lloj i një simboli të veçantë që do të thotë diçka shkoi keq.
Pra, ne duam të kontrolloni për se, për shkak se ajo rezulton
që null është një vlerë shumë e rrezikshme.
>> Shpesh, në qoftë se ju të përpiqet të bëjë diçka me null përfshin një function-- kalon atë
si input, për instance-- atë funksion shumë mund do të rrëzimit dhe, me të,
marrë poshtë të tërë programin tuaj.
Pra, kjo linjë e tretë tani është vetëm një mendje e shëndoshë kontrolloni, kontrollin gabim, nëse ju do.
Kjo është një zakon i mirë tani për ne për të marrë në çdo kohë ne
provoni të përdorni një vlerë që mund, potencialisht, të jetë null.
>> Tani, në vijën e katërt këtu, "Nëse strcmp (s, t)," mirë,
çfarë është që duke iu referuar?
E pra, ne kemi thënë se kjo është një shumë e ngjeshur Funksioni i quajtur për krahasim string.
Dhe qëllimi i tij në jetë është për të krahasuar Argumenti i tij i parë kundër tij të dytë,
por jo në aspektin e adresat e tyre, si ne e bëmë pa qëllim një moment
më parë me kodin kuqe, por vend për të krahasuar këto dy
vargjet në humanizëm intuitiv mënyrë duke e krahasuar këtë, kundër kësaj,
kundër këtij, kundër kësaj, dhe pastaj ndalimin nëse dhe kur një
ose të dy gishtat e mi godet një backslash 0.
Pra dikush vjet më parë zbatohet strcmp për të zbatuar për ne funksionalitetin
që kemi shpresuar ne do të ketë marrë nga vetëm krahasuar dy vlera të thjeshta.
>> Tani sinqerisht, unë mbaj vizatim të gjitha këto numra të ndryshme.
Por realiteti është, unë kam qenë duke e bërë këto deri gjithë kohës.
Dhe kështu që më lejoni vetëm të shkojnë përpara dhe shkarravitje këto jashtë
për të bërë një pikë që, në fund e ditës dhe duke shkuar përpara,
ne nuk jemi me të vërtetë do të kujdeset për çfarë trajton gjërat janë në të vërtetë
në kujtesën.
Pra, unë nuk jam duke shkuar për të nxjerrë këto llojet e numrave në mënyrë shumë më,
Unë jam vetëm një abstrakt ky larg një pak më shumë miqësore me vetëm shigjeta.
>> Me fjalë të tjera, në qoftë se është një tregues, mirë, le të vetëm të tërheqë atë, fjalë për fjalë,
si një tregues, një shigjetë duke treguar nga vetë për diçka tjetër,
dhe mos u shqetësoni shumë më shumë për minutia e këtyre adresave
e cila, përsëri, unë përbërë gjithsesi.
Por ne do të shohim ato adresat, ndonjëherë, kur debugging kodin.
>> Tani ndërkohë, ky program këtu fixes, sigurisht,
se problemi duke krahasuar ato dy vargjet.
Por ne u përplas me një tjetër problem.
Kjo ishte nga kopja programit për herë të fundit,
ku, unë kam qenë duke u përpjekur për të përfituar vetëm karakteri i parë në një varg.
Por ajo që ishte simptomë kemi parë për herë të fundit kur
një përdorues shtypur në një vlerë, si Gabe në Fjala, për s,
atëherë ne caktuar s në t, si në vijën e tretë,
dhe pastaj unë u përpoq për të germa t parantezë 0?
Cili ishte efekti i ndryshimit t parantezë 0 këtu?
>> Audienca: Ajo ndryshoi s.
>> DAVID J. Malan: Po, I ndryshuar s, si.
Për shkak se ajo është me të vërtetë ndodh?
E pra, më lejoni të shohim nëse unë mund të pastër up këtë foto, si më poshtë.
>> Nëse është, përsëri, fjala g, a, b, e, backslash, 0, dhe s
ne do të vazhdojmë vizatimi si një kuti këtu, por jo më shumë adresa.
Le të mos e bërë gjërat.
Le të vetëm të nxjerrë një foto për të lehtësuar botën.
>> Kur unë deklaroj t me varg t, që krijon atë copë e kujtesës.
Sheshi ndodh të jetë 32 bit në shumicën e kompjuterëve.
Në fakt, në qoftë se ju keni dëgjuar ndonjëherë për një kompjuter që ka një arkitekturë të 32-bit,
me të vërtetë dashuroj-flasin, që vetëm do të thotë ai përdor 32-bit adresa.
Dhe si një teknik mënjanë, në qoftë se ju keni menduar ndonjëherë
pse kompjuterët më të vjetër, në qoftë se ju në të vërtetë u përpoq të supë ato me shumë RAM,
mund të ketë vetëm një maksimum nga katër gigabajt të RAM,
dhe kjo është për shkak se, fjalë për fjalë, kompjuterin tuaj të vjetër mund vetëm
llogarisin të larta deri 4 miliard, 4 miliard byte,
sepse ai ishte duke përdorur 32-bit numrat për adresat.
>> Por në çdo rast, në këtë shembull, historia e shumë më të thjeshtë.
t është vetëm një tjetër tregues, ose me të vërtetë një yll char, aka string.
Dhe si mund të dua të rinovuar këtë foto tani me këtë linjë të dytë të kodit,
pas dot, dot, dot?
Kur unë bëj varg t barabartë s pikëpresje, si e bën të ndryshojë kjo foto?
Po?
>> Audienca: [padëgjueshme].
>> DAVID J. Malan: Po.
Pikërisht.
Unë vetëm vënë një shigjetë nga kuti t të njëjtë adrese,
njëjtë letra e parë i dha.
Ose teknikisht, në qoftë se kjo djalë ishin ende në 0x1,
kjo është sikur të kisha 0x1 këtu dhe 0x1 këtu.
Por përsëri, i cili kujdeset në lidhje me adresat?
Është vetëm ideja që tani ka rëndësi.
Pra, kjo është ajo që po ndodh këtu.
Pra, natyrisht, në qoftë se ju bëni t kllapa 0, e cila është grup simbol,
i course-- dhe sinqerisht, kjo duket si ka një koleksion të gjatë këtu,
por tani ka kjo gjë e pazakontë.
E di që gjuhën e programimit, C, ju ofron këtë funksion,
ku, edhe në qoftë se t është një akrep, apo është një tregues,
ju ende mund të përdorni që të njohur, rehatshme kllapa katrore
simbol për të shkuar në elementin e parë, ose element të dytë, apo çdo element
se që akrep është duke treguar për shkak se, me sa duket, atë
është, si në këtë rast, duke treguar në një rrjet.
>> Deri sa nuk kemi rregullojmë këtë?
Sinqerisht, ky është vendi ku ajo mori një pak e madhe në shikim të parë.
Por këtu është një version i ri dhe i përmirësuar.
>> Pra, së pari, unë jam marrë qafe e bibliotekës CS50,
vetëm të vë në dukje se është i vërtetë një yll char, vetëm një sinonim.
Dhe t eshte yll char.
Por çfarë po ndodh në Ana e djathtë e atij linjë
ku t është caktuar një vlerë?
>> Çfarë është e malloc?
Çfarë është e strlen?
Çfarë është sizeof (char)?
Pse dreq e bën këtë vështrim aq komplekse linjë?
Çfarë është ajo duke bërë në një nivel të lartë?
Çfarë është ajo ruajtjen në t?
Po?
Audienca: Është alokimin një sasi të caktuar të hapësirës kujtesës.
Është për të ruajtur, unë mendoj, letra [e padëgjueshme].
>> DAVID J. Malan: Perfect.
Perfect.
Është caktimin e një të caktuar sasia e hapësirës së kujtesës
për të ruajtur, me sa duket, letra e ardhshme.
Dhe në veçanti, malloc prandaj po kthehet ajo?
>> Audienca: Kthimi i [e padëgjueshme]?
DAVID J. Malan: Pikërisht.
Kthimi adresën e atij kujtesës, e cila është një mënyrë e sofistikuar për të thënë,
kthen adresën e bajt i parë i këtij kujtesës.
Barra bie mbi mua për të kujtuar sa memorie kam në të vërtetë
ndarë ose pyeti malloc për.
>> Tani se sa është kjo?
E pra, edhe pse ka një shumë e kllapa këtu,
malloc merr vetëm një argument të vetëm.
Dhe unë jam duke specifikuar strlen të s, kështu që të japë mua si shumë bytes si ka në s,
por të shtuar një.
Pse?
Po?
>> Audienca: backslash 0.
DAVID J. Malan: Pikërisht.
Ne kemi marrë për të bërë një mbajtje e shtëpisë pak.
Pra, për shkak se ka një backslash 0, ne do të më mirë të mbani mend se.
Përndryshe, ne jemi duke shkuar për të krijuar një varg që
nuk e kanë atë terminator të veçantë.
>> Ndërkohë, vetëm që të jetë super anal, unë kam sizeof (char),
vetëm në rast se dikush shkon vëllezërit e mi Kodi jo në aplikim CS50,
por ndoshta një kompjuter tjetër krejt ku chars
janë një bajt, nga konventa, por dy bytes, ose diçka më e madhe se kaq.
Është vetëm për të qenë super, super urrejtës të gabimeve.
Edhe pse, në realitet, është e më shumë gjasa do të jetë një 1.
>> Tani, ndërkohë, unë të shkojnë përpara dhe kopje string, t simboli i barabartë t kllapa s.
Dhe unë do të shtyjë për javën e kaluar Kodi burim për të parë se çfarë po ndodh.
Por takeaway kyç, dhe arsye kam vënë kodin tani në të gjelbër,
është për shkak se atë linjë shumë e fundit, t kllapa 0 barabartë toupper,
ka efektin e kapitalizimin e cila string?
t dhe / ose s?
Kjo linjë e fundit e kodit.
>> Vetëm t, sepse ajo që është ndodhi këtë herë,
në qoftë se kam pak të ndrequr atë hapin e fundit, ajo që ka ndodhur është, kur unë e quaj malloc,
Unë në thelb të merrni një copë e kujtesës që është të njëjtën madhësi si origjinale,
sepse kjo është aritmetike kam bërë.
Unë jam ruajtjen në t adresën i asaj copë e kujtesës.
Edhe pse kjo duket e bukur dhe goxha, e bukur dhe bosh,
realiteti është se ka, ajo që ne do të mbajtur duke e quajtur, vlerat e plehrave në këtu.
Kjo copë e kujtesës mund shumë dhe kanë qenë përdorur më parë,
disa sekonda, pak minuta më parë.
Pra, nuk mund të jetë absolutisht numrat ose letra atje, vetëm nga aksident.
Por ata nuk janë të vlefshme, deri sa unë veten populloj këtë copë e kujtesës
me karaktere aktuale, si unë bëjë në se për lak atje.
Të gjithë të drejtë?
>> Deri tani, kulmi i këto tre shembuj
që me sa duket u thyer për herë të fundit, ky shembull Swap, ky funksion
punuar në kuptimin se ajo swapped a dhe b.
Por ajo nuk ka punë në çfarë kuptimi tjetër?
Po?
>> Audienca: [padëgjueshme].
>> DAVID J. Malan: Pikërisht.
Nëse unë do të thërrasë këtë funksion nga another-- për shembull,
nga një funksion si kryesor, ku Unë kam një ndryshueshme, X dhe Y, si unë
bëri javën e kaluar, njëjtë Kodi, dhe unë të kalojë në x dhe y
të bie në ujdi, dhe pastaj e quajnë Swap-- këtë, natyrisht, është versioni i saktë
është ajo që ne jemi gati për të see-- ajo nuk ka punë.
Pra, çfarë është fix?
>> E pra, në mënyrë të drejtë të jenë të qartë, më lejoni të shkoj përpara
and-- më jepni një të dytë këtu, dhe të shohim në qoftë se unë mund të ju tregojnë një të fundit, e cila
do të jetë in-- le të shohim nëse unë mund të gjeni kjo OK vërtetë fast--, [e padëgjueshme].
OK, nuk është.
Pra injorojnë komandat Unë jam vetëm typing.
Unë dua që ajo të tërhequr në minutën e fundit një shembull
nga hera e fundit, e cila tani quhet jo Swap.
>> Pra, nuk ka Swap është ku ne u ndërpre për herë të fundit,
ku, kam nisur x dhe y me 1 në 2.
Unë pastaj e quajnë Swap, duke kaluar në 1 dhe 2.
Dhe pastaj ky funksion punuar në një kuptim,
por ajo nuk kishte të përhershme efekt në x dhe y.
Pra, pyetja e parë është, se si tani nuk kemi të vërtetë të zgjidhur këtë problem?
Cila është zgjidhja në dorë?
>> E pra, në swap.c, e cila është e re sot, vini re disa dallime.
x dhe y jane njëjta.
Por ajo që është e qartë ndryshme rreth linjë 25?
Çfarë ka të re atje, nëse ju kujtohet atë që dukej si një të dytë më parë?
>> Audienca: [padëgjueshme].
>> DAVID J. Malan: Po.
Pra ampersands janë një pjesë e re i sintaksës, jo vetëm në këtë program,
por edhe në përgjithësi në CS50.
Deri më sot, unë nuk mendoj se ne kemi parë shembuj
ose të vërtetë të folur për ta në çdo hollësi, përveç, ndoshta, preemptively
në pjesë, një simbol si kjo.
E pra, ajo rezulton simbol është një nga pjesët e fundit të sintaksës së re
ne jemi duke shkuar për të mësuar.
Të gjitha kjo do të thotë është adresa e një variable.
Në çfarë adresa e x jetojnë?
Por ajo që adresa e y jetojnë?
Sepse në qoftë se Problemi themelor para
u se x dhe y janë duke kaluar si kopje, ajo që ne me të vërtetë duan të bëjnë
është të sigurojë Swap me si një thesar Harta që çon në ku x dhe y në fakt
janë në RAM, kështu që Swap mund të ndiqni këtë hartë
dhe shkoni për të kudo x apo y shënon vend dhe për të ndryshuar vlerat aktuale 1 dhe 2
atje.
>> Pra Swap duhet të ndryshojë pak shumë.
Dhe në shikim të parë, kjo mund të të duket e ngjashme pak me yll char.
Dhe në të vërtetë është.
Pra, a është një tregues për çfarë lloji i të dhënave, bazuar në këtë pjesë të theksuar?
Pra, kjo është një int.
>> Pra, a nuk është më një int, kjo është adresa e një int.
Dhe në mënyrë të ngjashme, b është tani duke shkuar të jetë adresa e një int.
Pra, kur Unë tani e quajnë Swap nga faqja kryesore, Unë nuk jam duke shkuar për të dhënë bie në ujdi 1 dhe 2.
Unë jam duke shkuar për të dhënë atë si Dem-diçka dhe dem-diçka,
dy adresat që do të çojnë Swap në vendet e tyre aktuale
në kujtesën e kompjuterit tim.
>> Deri tani, zbatimi im mbetur duhet të ndryshojë një fëmijë.
Çfarë është padyshim e ndryshme tani në këto tre rreshta të kodit?
Ka këto yje mallkuar të gjithë vendin, të gjithë të drejtë?
Pra, çfarë po ndodh këtu?
Po?
>> Audienca: Është e qartë [padëgjueshme].
>> DAVID J. Malan: Pikërisht.
Pra, në këtë context-- dhe kjo nuk ishte e vendimi më i mirë dizajn, pa dyshim,
vjet më parë.
Në këtë kontekst, ku ju vetëm duhet një yll,
dhe ju nuk keni një lloj të dhënave, si int, menjëherë në të majtë,
në vend të kësaj ju keni një shenjë të barabartë, në mënyrë të qartë, në këtë kontekst, kur ju thoni yll a,
që do të thotë të shkojnë në Adresa e kjo është në një.
Ndiqni hartë e thesarit, kështu që të flasin.
>> Dhe ndërkohë, në përputhje 37, kjo do të thotë të njëjtën gjë.
Shko tek adresa në a, dhe e vënë atë atje?
Çfarëdo që është në vend që b specifikon.
Me fjalë të tjera, të shkojnë për të b.
Merrni atë vlerë.
Shkoni në një dhe, per barabartë nënshkruajë, operatori detyra,
vënë atë vlerë atje.
>> Në mënyrë të ngjashme, int temp është vetëm një int.
Asgjë nuk duhet të ndryshojë në lidhje me temp.
Është vetëm një gotë rezervë nga Annenberg për disa qumësht ose lëng portokalli.
Por unë duhet të them, të shkojnë në b.
Shko në atë destinacion dhe vënë vlerën në temp atje.
Pra, çfarë po ndodh më pas?
Kur unë në fakt e quajnë Swap këtë kohë, në qoftë se kjo tabaka e parë këtu përfaqëson Main,
kjo tabaka dytë paraqet Swap, kur Unë kalojë simbol x dhe y ampersand
nga Main në Swap, vetëm të jetë i qartë, çfarë është kjo rafte kornizë pranues?
Po?
>> Audienca: [padëgjueshme].
DAVID J. Malan: Pikërisht.
Adresa e x dhe adresa e y.
Dhe ju mund të mendoni për këto si adresat postare.
33 Oxford Street dhe 35 Oxford Street, dhe ju
duan të lëvizin të dy ndërtesave që janë në ato vende.
>> Kjo është lloj i një ide qesharake, por kjo është e gjitha ne do të thotë nga adresë.
Ku në botë mund të ju gjeni këto dy Ints?
Ku në botë mund të ju gjeni ato dy ndërtesa?
Pra, nëse më në fund, pas gjithë kësaj kohe unë shkojnë në kodin e sotme burim dhe të përpilojnë
Swap dhe drejtuar ./swap, më në fund, për hera e parë që ne në fakt shohim se
vlerat e mia kanë me të vërtetë janë swapped sukses.
Dhe tani, ne edhe mund të marrë Shënimi i kësaj në, të themi, Gdb.
>> Pra më lejoni të shkoj në të njëjtin skedar.
Më lejoni të shkojnë përpara dhe të drejtuar gdb e ./swap.
Dhe tani, në Swap, unë jam duke shkuar për të shkuar përpara dhe të vendosur një pikë pushim në Main.
Dhe tani unë jam duke shkuar për të shkuar përpara dhe të drejtuar programin.
Dhe tani ne shohim kodin tim ndaluar në atë linjë.
>> Nëse unë të shkojnë përpara dhe të shtypura x, çfarë duhet të shoh këtu?
Kjo është një pyetje.
Thuaj përsëri?
>> Audienca: [padëgjueshme].
>> DAVID J. Malan: Pra numrat e rastit, ndoshta.
Ndoshta unë të marrë me fat, dhe kjo është bukur dhe të thjeshtë, si 0.
Por ndoshta kjo është ndonjë numër të rastit.
Në këtë rast, unë kam fat.
Ajo vetëm ndodh të jetë 0.
Por kjo është me të vërtetë fat, sepse jo deri sa unë
lloji tjetër dhe pastaj të shtypura x ka se linjë e kodit, linjë 19, janë ekzekutuar.
>> Ndërkohë, në qoftë se unë lloji tjetër përsëri, dhe tani të shtypura nga y, unë jam duke shkuar për të parë 2.
Tani, në qoftë se unë lloji tjetër, ajo do të të marrë një pak konfuze, sepse tani,
printf do të shfaqen në ekran, ashtu siç bëri. x është 1.
>> Le të bëjë këtë përsëri.
Dhe tani, ja ku gjërat interesante.
Para se të telefononi Swap ose edhe hapin në të, le të marrin një vështrim të vogël.
x është, përsëri, 1.
Y është, natyrisht, mendje e shëndoshë të shpejtë kontrolloni, 2, jo aq shumë atje.
Por ajo që është simbol x?
Përgjigje, kjo është lloj i shokuar në kërkim.
Por ylli int në kllapa është vetëm mënyrë e PKB-së e duke thënë se kjo është një adresë.
Kjo nuk është një int, kjo është një tregues për një int, ose i njohur ndryshe si një adresë.
>> Çfarë është kjo gjë i çmendur?
Ne kurrë nuk kam parë diçka të krejt si kjo para.
Pra, kjo është adresa në të kompjuterit tim Kujtim të ku x ndodh të jetojnë.
Është dem-diçka.
Dhe kjo është, sinqerisht, pse Unë kam filluar vizatim shigjeta,
në vend të numrave, pasi që me të vërtetë kujdeset
se int juaj është në një të veçantë Adresa e kjo është që e madhe.
Por bffff0c4, këto janë të gjitha vërtetë shifra hexadecimal,
cilat janë 0 deri f.
>> Pra, ne nuk do të ndalem shumë kohë të gjatë në atë që këto gjëra janë.
Por në qoftë se unë të shtypura nga y, natyrisht, e shoh 2.
Por y simbol, unë shoh këtë adresë.
Dhe vini re, për kurioz, sa larg jeni x dhe y?
Ju mund të injorojë më të adresën.
Katër bytes.
Dhe kjo është në përputhje me tonë më parë pretendojnë se sa e madhe është një int?
Katër bytes.
Pra, duket si rreshtim çdo gjë është deri bukur, si ju mund të shpresojnë, në kujtesë.
>> Deri tani, le të vetëm të shpejtë përpara deri në fund të kësaj historie.
Le të shkojnë përpara dhe të shkruani hap, të zhyten në funksion Swap.
Tani vini re, në qoftë se unë lloji një, është e identike adrese te x.
Nëse unë lloji b, është e njëjtë në adresën e y.
Pra, çfarë duhet të shohim nëse unë thonë, shkoni në adresën e një?
Pra, të shtypura yll a.
Pra yll do të thotë të shkojnë atje, në këtë kontekst.
Simbol do të thotë ajo që është adresa e.
Pra yll një mjet 1.
Dhe yll print b jep mua 2.
>> Dhe më lejoni të supozojmë, për momentin, që të paktën kodi që
vazhdon të ekzekutuar tani mund të jenë të arsyetuar nëpërmjet në këtë mënyrë.
Por ne do të rishqyrtojnë këtë ide para se të gjatë.
Pra, ky version i Swap tani është e saktë dhe lejon
ne që të bie në ujdi këtë lloj të veçantë të dhënave.
>> Pra, ndonjë pyetje atëherë në Swap?
Në yll?
Në adresën e?
Dhe ju do të shihni, me Problemi vendosur 4, lloj,
por problemi vendosur 5, patjetër, se si këto gjërat janë të dobishme dhe për të marrë shumë më tepër
rehat me ta, si rezultat i kësaj.
Çdo gjë në të gjitha?
Të gjithë të drejtë.
Pra malloc është, përsëri, ky funksion se vetëm ndan kujtesës, e kujtesës
Alokimi.
Dhe pse është kjo e dobishme?
E pra, të gjithë këtë kohë, ju keni qenë duke përdorur malloc.
Nëse ju e konsideroni tani se si getString vepra, me sa duket, është e
qenë duke kërkuar dikë për një copë të kujtesës, në çdo kohë nga llojet e përdoruesve një varg
në, sepse ne me siguri nuk e di, si staf CS50,
sa e madhe ato vargjet që njerëzit do të tipit mund të jetë.
>> Pra, le të, për herë të parë, të fillojë të zhvishem mbrapa se si punon bibliotekës CS50,
me anë të disa shembujve që do të na çojë atje.
Pra, nëse unë të hapur gedit dhe të hapur scanf 0,
ne jemi duke shkuar për të parë kodin e mëposhtëm.
Scanf 0, në dispozicion në faqen e internetit për sot, ka relativisht pak rreshta të kodit
këtu, 14 me 20.
Dhe le të shohim se çfarë ajo është duke bërë.
Ajo deklaron një int, të quajtur x.
Ai thotë diçka si, numri ju lutem.
Dhe tani ajo thotë, scanf% i, dhe x.
Pra, ka një bandë e gjëra të reja atje.
>> Por scanf, ju lloj i mund të mendoni e si e kundërta e printf.
printf, natyrisht, printime në ekran.
lloj scanf i skanime nga përdoruesit e diçka keyboard ai ose ajo i ka shtypur.
>> % I është vetëm si printf.
Kjo do të thotë të presin përdoruesit të tipit një int.
Dhe tani, pse mendoni se unë mund të jetë duke kaluar scanf & X?
Nëse qëllimi në jetën e scanf është për të marrë diçka nga përdoruesit,
çfarë është kuptimi i duke kaluar atë, dhe x, tani?
Po?
>> Audienca: [padëgjueshme].
DAVID J. Malan: Pikërisht.
Çfarëdo që unë, njerëzore, shkruani, input tim do të jetë i shpëtuar në atë vend.
Kjo nuk është e mjaftueshme, kujtojnë, të vetëm kalojë në x, sepse ne kemi parë tashmë,
çdo herë që të kalojë vetëm një variabël të papërpunuara, si një int, në një funksion tjetër,
i sigurt, ajo mund të ndryshojë që variabël, por jo përgjithmonë.
Ajo nuk mund të ketë një efekt mbi Main.
Ajo vetëm mund të ndryshojë kopjen e vet lokal.
Por në qoftë se, në vend të kësaj, ju nuk e bëni më jep int aktuale,
por të më jepni udhëzime për se int, unë tani, duke qenë scanf,
me siguri, unë mund të ndiqni se adresuar dhe të vënë një numër atje
kështu që ju keni qasje në atë si të mirë.
>> Pra, kur unë të drejtuar këtë program, le të shohim.
Bëni scanf 0 dot plagë, scanf 0.
Dhe në qoftë se unë tani shkruani një numër si 50, faleminderit për 50.
Nëse unë tani shkruani një numër si negative 1, per negativ 1.
Tani shtypni një numër si 1.5, hm.
Pse programi im injorojë mua?
E pra, sepse thjesht, i thashë ajo për të presin një int vetëm.
Të gjithë të drejtë.
Pra, kjo është një version i këtij.
Le të marrin gjërat një nivel dhe propozojmë që kjo nuk është e mirë.
Dhe këtu qëndron një shembull shumë të thjeshtë se si ne mund të fillojë kodin e shkrimit
që njerëzit e tjerë mund të shfrytëzojnë ose kompromis duke bërë gjëra të këqija.
Pra linjë 16, në mënyrë të ngjashme në frymë të para,
por unë nuk jam deklaruar se int këtë kohë.
Unë jam deklaruar atë char yll, aka string.
>> Por çfarë do që me të vërtetë do të thotë?
Pra, në qoftë se unë nuk e specifikon një address-- dhe Unë jam duke e quajtur atë në mënyrë arbitrare, tampon,
por unë mund të telefononi ajo s, të jetë simple-- dhe pastaj të bëj këtë, të shpjegojë për mua,
në qoftë se ju mund të, në bazë të mëparshme logjikë, ajo që është scanf bërë në përputhje 18,
nëse kalojnë% s dhe buffer, cila është një adresë?
Çfarë është scanf, në qoftë se ju aplikoni njëjta logjikë e saktë si version 0,
do të përpiqen për të bërë këtu, kur lloje përdorues në diçka?
Po?
>> Audienca: [padëgjueshme].
>> DAVID J. Malan: Pikërisht.
Scanf, nga logjika më parë, do të marrë string
që të shtypur e njeriut in-- kjo është tani një varg,
kjo nuk është një numër, me sa duket, në qoftë se ai ose ajo cooperates--
dhe ajo do të përpiqet për të vënë që string në kujtim në çfarëdo adresën
tampon specifikon.
Dhe kjo është e madhe, sepse tampon është me të vërtetë qëllim që të jetë një adresë.
>> Por unë pretendojnë ky program është buggy në një mënyrë shumë serioze, sepse atë vlerë të
tampon nga default?
Çfarë kam nisur në?
Çfarë copë e kujtesës?
Unë nuk e kanë, apo jo?
>> Pra, edhe pse unë kam ndarë një yll char që nuk quhet s,
është quajtur në vend të kësaj, buffer-- kështu le të nxjerrë emrin e ndryshueshme të
tani si buffer-- në qoftë se unë nuk kanë quajtur getString ose malloc këtu,
që në mënyrë efektive do të thotë se tampon është vetëm disa vlera e mbeturinave.
>> Tani çfarë do të thotë kjo?
Kjo do të thotë se unë kam thënë scanf të presin një varg nga përdoruesit.
Dhe ju e dini se çfarë?
Çfarëdo që kjo gjë është duke treguar to-- dhe kam nxjerrë pikëpyetje,
por në realitet, ajo do të jetë e diçka si OX1, 2, 3, apo jo?
Është disa vlera fals që vetëm ndodh të jetë atje para.
Pra, thënë ndryshe, kjo është sikur buffer është vetëm
duke treguar diçka në kujtesë.
Unë nuk kam asnjë ide se çfarë.
>> Pra, nëse unë lloji në Gabe tani, ajo do në përpjekje për të vënë g-a-b-e / 0 atje.
Por kush e di se çka është?
Dhe në të kaluarën, çdo herë ne kemi provuar për të prekur
kujtesës që nuk i përket për ne, çfarë ka ndodhur?
Ose pothuajse çdo herë.
Faji segmentimit, e drejtë?
>> Kjo shigjetë, unë nuk kam asnjë ide se ku është e treguar. kjo është vetëm disa vlera të rastit.
Dhe sigurisht, në qoftë se ju të interpretuar një vlerë të rastit si një adresë,
ju jeni do të shkojnë në disa destinacion të rastit.
Pra Gabe mund të vërtetë përplasje Programi im në këtë rast këtu.
>> Pra, çfarë mund të bëjmë që është pothuajse aq e keqe?
Konsideroni këtë e tretë dhe Shembulli i fundit i scanf.
Ky version është më e mirë në çfarë kuptimi?
Nëse ju jeni të kënaqur me Problemi i mëparshëm, kjo është më e mirë.
Pse?
>> Audienca: [padëgjueshme].
DAVID J. Malan: Mirë.
Pra ky rast i linjës 16 është më e mirë, në kuptimin
se ne jemi në mënyrë të qartë caktimin e disa kujtesës.
Ne nuk jemi duke përdorur malloc, ne jemi duke përdorur java 2
Qasja e vetëm të deklaruar një grup.
Dhe ne kemi thënë më parë se një varg është vetëm një grup të karaktereve,
kështu që kjo është krejtësisht e ligjshme.
Por kjo është, sigurisht, si ju vini re, madhësi të caktuar, 16.
>> Pra, ky program është krejtësisht e sigurt, nëse unë lloji
në vargjet një karakter, dy karakter vargjet, 15 vargjet karakter.
Por sa më shpejt që unë të fillojë shtypur 16, 17, 18, 1000 vargjet karakter,
ku është se varg do të përfundojë?
Ajo do të përfundojnë pjesërisht këtu.
Por pastaj kush e di çfarë tjetër është përtej kufijve
i këtij grup të veçantë?
>> Është sikur unë kam deklaroi 16 kuti këtu.
Pra, në vend se të nxjerrë nga të gjitha 16, ne do të vetëm pretendojë se unë kam tërhequr 16.
Por në qoftë se unë pastaj të përpiqet për të lexuar një varg kjo është shumë më e gjatë, si 50 karaktere,
Unë jam duke shkuar për të filluar vënien a, b, c, d, x, y, z.
Dhe kjo është me sa duket disa segment të tjera kujtesës
që, përsëri, mund të shkaktojë Programi im për të rrëzuar,
sepse unë nuk e kam kërkuar asgjë më shumë se vetëm 16 bytes.
>> Pra, kush kujdeset?
E pra, këtu është biblioteka CS50.
Dhe shumica e kjo është vetëm si udhëzime deri krye.
Biblioteka CS50, të gjithë këtë kohë, ka pasur këtë linjë në linjë 52.
Ne e kemi parë typedef, ose ju do të shihni typedef
në pset 4, e cila vetëm krijon një sinonim ku yll char mund të jenë më të
thjesht të referuara si string.
Pra, kjo është një nga disa rrota trajnimit
ne kemi përdorur në mënyrë të fshehtë nën kapuç.
>> Ndërkohë, këtu është funksioni, getchar.
Tani me sa duket, nuk ka asnjë organ të tij.
Dhe në fakt, në qoftë se unë mbaj scrolling, unë nuk e bëj të vërtetë
shohin ndonjë Implementimi e këtyre funksioneve.
Si një kontroll mendje e shëndoshë, pse është se?
>> Audienca: [padëgjueshme].
DAVID J. Malan: Po.
Pra, kjo është header fotografi.
Dhe header fotografi përmbajnë prototipe, plus disa sende të tjera, me sa duket,
si typedefs.
Por në CS50.c, të cilat ne kemi nuk ju dhënë të drejta të plota,
por ka qenë në aplikim CS50 gjithë këtë herë, thellë brenda e dosjeve të saj,
vini re se ka një të tërë bandë e funksioneve në këtu.
>> Në fakt, le të lëvizni poshtë.
Le të injorojnë shumica e tyre, tani për tani.
Por lëviz nëpër getInt dhe të shohim se si punon getInt.
Kështu që këtu është getInt.
Dhe nëse ndonjëherë me të vërtetë kujdeset se si të merrni int punon, këtu është dokumentacioni i saj.
Dhe në mesin e gjërave ajo thotë se është ajo ju tregon
çfarë shkon e vlerave që mund të kthehen.
Kjo është në thelb negativ 2 miliard në 2 miliardë pozitiv, të japë ose të marrë.
>> Dhe kjo rezulton, e gjithë kjo kohë, edhe pse ne kurrë nuk kemi
kishte të kontrolloni për të, nëse diçka shkon keq,
rezulton se të gjitha këtë herë, getInt ka
janë kthyer një të veçantë konstante, nuk null,
por int_max, e cila është Konventa vetëm një programues-së.
Kjo do të thotë këtu është një vlerë të veçantë.
Sigurohuni që të kontrolloni për këtë, vetëm në rast se diçka shkon keq.
Por ne kurrë nuk kam shqetësuar me se deri më sot,
sepse përsëri, kjo ka për qëllim për të lehtësuar.
>> Por si e bën getInt të zbatohet?
E pra, e, ajo merr nuk ka argumente.
Ne e dimë se.
Ajo kthehet një int.
Ne e dimë se.
Pra, si e bën këtë punë nën kapuç?
>> Pra, nuk ka me sa duket një pafund loop, të paktën pamja e një.
Vini re se ne jemi duke përdorur getString.
Pra, kjo është interesante. getInt e quan vetë funksioni ynë, getString.
Dhe tani pse mund të jetë ky rast?
Pse jam unë duke qenë mbrojtëse këtu në linjë 165?
Çfarë mund të ndodhë në linjë 164, vetëm të jetë i qartë?
Është e njëjta përgjigje si më parë.
Mund të jetë vetëm jashtë kujtesës.
Diçka shkon keq me getString, ne kemi marrë të jetë në gjendje për të trajtuar atë.
Dhe arsyeja nuk kthehen null është se, teknikisht, null është një akrep.
getInt ka për t'u kthyer një int.
Kështu që unë kam në mënyrë arbitrare vendosi, në thelb,
se 2 miliardë, të japë ose të marrë, do të jetë një vlerë të veçantë që unë kurrë nuk mund të
në të vërtetë marrë nga përdoruesit.
Është vetëm një vlerë e unë jam duke shkuar për të humbur për të përfaqësuar një kod gabimi.
>> Deri tani, gjërat të marrë një dashuroj pak.
Dhe kjo nuk është krejt njëjtë funksion si më parë, por është shumë e ngjashme.
Pra vini re, unë deklaroj këtu, në përputhje 172, si një n int dhe një char c.
Dhe pastaj unë e përdorin këtë linjë shokuar, sscanf, e cila rezulton
nuk scan një varg nga tastierë.
Ajo qëndron një varg ekzistuese që përdoruesi ka shtypur tashmë në.
Kështu që unë tashmë e quajtur getString, e cila do të thotë unë kam një varg në kujtesën.
sscanf është ajo që ju do të thërrasë një funksion parsing.
Ajo duket në vargun e kam shtypur në, karakter nga karakteri,
dhe bën diçka të dobishme.
Ky varg është ruajtur në linjë.
Dhe unë e di se vetëm duke shkuar mbështetur këtu dhe duke thënë, oh, OK,
Unë e quajti atë nuk e këtë herë, por linja.
>> Dhe tani kjo është pak më ndryshe.
Por kjo në mënyrë efektive do të thotë, për arsye ne do disi të tundë duart tona në sot,
se ne jemi të kontrolluar të të parë nëse përdoruesi shtypur në
dhe int dhe ndoshta një tjetër karakter.
Nëse përdoruesi shtypur në një int, është e do të ruhen në n, sepse unë jam
kalon këtë duke adresën, mashtrim i ri ne kemi parë sot.
Nëse përdoruesi shtypur edhe në si 123x, se x
do të përfundojë deri në letër në karakter c.
>> Tani del se sscanf do të më thoni, inteligjente,
sa variabla u sscanf sukses në gjendje për të mbushur.
Pra, sipas kësaj logjike, nëse funksioni Unë jam i zbatimit është getInt,
por unë jam duke kontrolluar, potencialisht, për përdoruesin
që kanë shtypur në një int ndjekur nga diçka tjetër,
çfarë unë dua sscanf-së Vlera e kthyer me të vërtetë në jetë?
Nëse qëllimi është për të marrë vetëm një int nga përdoruesit?
>> Pra, nëse sscanf kthimit 2, çfarë do të thotë kjo?
Përdorues shtypur në diçka si, fjalë për fjalë,
123x, e cila është vetëm e pakuptimtë.
Është një kusht gabim, dhe Unë dua për të kontrolluar për këtë.
>> Pra, nëse llojet e përdoruesve këtë në, duke kjo logjikë, ajo që e bën sscanf kthehen,
do të thoni?
Pra, ajo do të kthehet 2, sepse 123 do të shkojnë në këtu,
dhe x do të përfundojë deri në këtu.
Por unë nuk dua x për të marrë mbushur.
Unë dua të sscanf të vetëm të ketë sukses në mbushjen e parë e variablave të saj.
Dhe në mënyrë që është arsyeja pse unë duan sscanf të kthehen 1.
>> Dhe në qoftë se kjo është pak mbi kokë për momentin, kjo është krejtësisht në rregull.
Të kuptojë pse, se një nga vlerat e getInt dhe getString
është se ne jemi duke bërë një dreq e një Shumë gabim kontrolluar si kjo në mënyrë
se, deri më sot, ju mund të pretty much shkruani asgjë në tastierën tuaj,
dhe ne do të kapur atë.
Dhe ne me siguri, Stafi, definitivisht nuk do të
të jetë burim i një bug në tuaj program, sepse ne jemi në mbrojtje
kontrolluar për të gjithë budallenj gjëra që një përdorues mund të bëni,
si shtypja e një varg, kur ju të vërtetë donte int.
Pra, për now-- ne do të vijë përsëri në këtë para long--
por të gjithë këtë kohë, getString dhe getInt kanë
qenë nën kapuç duke përdorur këtë Ideja themelore e adresave të kujtesës.
>> Deri tani, le të bëjë gjëra pak më shumë përdorues-miqësor.
Siç mund ta kujtoni, nga Binky fundit time-- nëse miu im do cooperate-- kështu
kemi pasur këtë kod, i cili sinqerisht, është mjaft absurd.
Ky kod arrin asgjë dobishme, por ishte shembulli
se profesor Parlante përdoret në mënyrë të përfaqësojnë
atë që po ndodhte në një Programi përfshin kujtesës.
>> Pra, le të thotë prapë kjo Historia super shkurtimisht.
Këto dy linja e parë, në Anglisht, e çfarë, do të thoni?
Vetëm në mënyrë të arsyeshme të njeriut, por pak termat teknike, të marrë një goditje me thikë.
Audienca: [padëgjueshme].
>> DAVID J. Malan: OK, ju jeni vendosjen Adresat për x tuaj dhe variablat y.
Jo shumë, sepse x dhe y nuk janë Variablat në kuptimin tradicional.
x dhe y janë adresat ose do të ruajtur adresën.
Pra, le të provoni këtë një herë më shumë.
Nuk është një fillim i keq, edhe pse.
Po?
>> Audienca: [padëgjueshme].
DAVID J. Malan: Mirë.
Unë mendoj se është një pastruese pak.
Shpallja dy pointers, dy integers.
Dhe ne jemi duke i quajtur ato x dhe y.
Ose në qoftë se ne ishim për të nxjerrë këtë si një foto, përsëri,
kujtojnë mjaft e thjeshtë që të gjithë ne jemi duke bërë me atë vijë të parë
është duke tërhequr një kuti si kjo, me një vlerë të mbeturinave në të,
dhe duke e quajtur atë x, dhe pastaj një tjetër kuti si kjo,
me disa vlera e mbeturinave në të, duke e quajtur atë y.
Ne kemi deklaruar dy pointers që në fund të fundit
do të ruajtur adresën e një int.
Pra, kjo është e gjitha atje.
>> Pra, kur Binky bëri këtë, balta ashtu dukej si kjo.
Dhe Nick vetëm lloji i përfundoi shigjetat,
sikur ata nuk janë vënë kudo në mënyrë të veçantë, për shkak se ata janë vetëm
Vlerat e plehrave.
Ata nuk janë nisur në mënyrë të qartë kudo në veçanti.
>> Tani linjë tjetër e Kodi, kujtojnë, ishte kjo.
Pra, në mënyrë të arsyeshme në përdorim, por anglisht disi teknike,
çfarë është kjo linjë e kodit duke bërë?
Po?
>> Audienca: [padëgjueshme].
>> DAVID J. Malan: Perfect.
Është shpërndarjen e copë e kujtesës që është madhësia e një int.
Dhe kjo është gjysma përgjigje.
Ju përgjigj të drejtën gjysma e shprehjes.
Ajo që po ndodh në majtë anë e shenjë të barabartë?
Po?
Audienca: dhe cakton ajo te ndryshueshme X?
>> DAVID J. Malan: dhe cakton ajo te ndryshueshme x.
Pra, për radhitje, djathtë ndan anësore memorie të mjaftueshme për të ruajtur një int.
Por malloc specifike kthen adresë
i asaj copë e kujtesës, të cilat ju keni propozuar vetëm merr ruajtur në x.
>> Pra, çfarë Nick e bëri për herë të fundit me Binky është ai zvarritur atë treguesin jashtë, balta,
për pikë tani në një copë të bardhë të kujtesës që është e barabartë me madhësinë e një int.
Dhe me të vërtetë, që është menduar për të përfaqësuar katër bytes.
>> Tani, linja tjetër e kodit e bëri këtë, yll x merr 42.
Pra, 42 është e drejtpërdrejtë në right-hand side, kuptimi i jetës.
Left-hand side, yll x do të thotë çfarë?
Kjo shumë mund të ketë gone-- kjo është OK.
OK.
>> Audienca: Në thelb, shkoni në [e padëgjueshme]
DAVID J. Malan: Mirë.
Audienca: [padëgjueshme].
DAVID J. Malan: Pikërisht.
Left-hand side do të thotë të shkojnë në x.
x është adresa.
Është si 33 Rruga e Oksfordit, ose OX1.
Dhe yll x do të thotë të shkojnë në se adresuar dhe të vënë atë atje?
42.
>> Pra me të vërtetë, kjo është pikërisht ajo që bëri Nick.
Ai filloi me Nga, në thelb, mendërisht
duke treguar një gisht në x, pas shigjetë
në kutinë e bardhë në të djathtë anë, dhe vënien e numrit 42 atje.
Por pastaj gjërat mori një pak e rrezikshme, apo jo?
Binky-së gati për të humbur kokën e tij.
>> Y Star barabartë me 13, fat i keq, do të thotë çfarë?
Pra, do të thotë yll y shkoni në adresën në y.
Por ajo që është adresa në y?
Në rregull, kjo është vlera e plehrave, e drejtë?
I tërhoqi atë si një pikëpyetje.
Nick tërhoqi atë si një shigjetë më bëni.
Dhe, sa më shpejt që ju të përpiqen për të bëjë y yll, duke thënë të shkojnë atje,
por nuk ka një legjitime adresën, kjo është disa vend fals,
programi do të rrëzuar.
Dhe kreu Binky-së do të fluturojnë jashtë këtu, ashtu siç bëri.
>> Pra, në fund, këtë program ishte vetëm krisje banesë jashtë.
Ishte një program buggy.
Dhe kjo nevojë të jetë fikse.
Dhe e vetmja mënyrë, me të vërtetë, për të rregulluar atë do të ishte, për shembull, kjo linjë,
të cilat ne nuk e merrni edhe për të, sepse Programi u rrëzua shumë shpejt.
Por në qoftë se ne ishim për të rregulluar këtë, çfarë efekti ka bërë y x barabarta keni?
E pra, ajo në thelb tregon y në çfarëdo vlera x është duke treguar.
>> Pra, në historinë e Nick, ose histori Binky-së, të dy
x dhe y janë treguar në copë të bardhë të kujtesës,
në mënyrë që, më në fund, kur ju e yll y barabartë 13 përsëri,
ju deri në fund duke i dhënë 13 në vend i përshtatshëm.
Pra, të gjitha këto linja janë të përkryer ligjshme, me përjashtim për këtë,
kur kjo ka ndodhur para jush fakt caktuar y disa vlera.
>> Tani fatmirësisht, ju nuk e bëni duhet për arsye nëpër të gjitha
e këtyre llojeve të çështjeve në tuaj.
Më lejoni të shkoj përpara dhe të hapur up ndonjë terminali këtu
dhe të hapur, për vetëm një moment, një program super të shkurtër që
gjithashtu është lloj i pakuptimtë.
Është e shëmtuar.
Ajo nuk ka arritur asgjë të dobishme.
Por kjo do të tregojë çështjet e kujtesës, kështu që le të marrin një sy.
>> Kryesore, super e thjeshtë.
Ai me sa duket e quan një funksion, F, dhe pastaj kthen 0.
Kjo është lloj i vështirë për të bela deri këtë.
Pra, kryesore është shumë e mirë, deri më tani.
>> Pra, f është problematike.
Dhe thjesht nuk e vënë shumë përpjekje në emërtimin atë
këtu, për të mbajtur fokusin në kodin.
f ka dy linja.
Dhe le të shohim se çfarë po ndodh tani.
Pra, nga njëra anë here-- dhe më lejoni të bëjë
kjo në përputhje me paraardhëse example-- në njërën anë,
anën e majtë është duke bërë atë, në gjuhën angleze?
Ajo is--
Audienca: Krijimi i një akrep.
DAVID J. Malan: Krijimi i një akrep në një int dhe duke e quajtur atë x.
Pra, kjo është duke krijuar një nga ato kuti Unë mbaj duke tërhequr në ekran touch.
Dhe tani, në të djathtë anë, malloc, natyrisht,
është shpërndarë me një copë e kujtesës.
Dhe vetëm të jetë e qartë, se si sa memorie është ajo me sa duket
ndarjes, në qoftë se ju vetëm të lloj bëjë matematikë këtu?
>> Pra, kjo është 40 bytes.
Dhe unë e di se vetëm për shkak se unë e di një int, në aplikim CS50, të paktën,
është katër bytes.
Pra, 10 herë 4 është 40.
Pra, kjo është ruajtjen e një x, adresa e jashtë e parë të 40 ints se
janë ndarë hapësirën përsëri, për të mbështetur, për të mbështetur, për të pasme.
>> Dhe kjo është ajo që është kyç për malloc.
Ajo nuk ka marrë një kujtesë të vogël këtu, pak këtu, pak këtu.
Kjo ju jep një copë e kujtesës, pranë njëri tjetrit, nga operative
sistemit.
>> Tani ajo që për këtë, x kllapa 10 është e barabartë me 0?
Linjë arbitrare e kodit.
Ajo nuk ka arritur asgjë të dobishme.
Por është interesante, sepse x kllapa 10--?
Po?
>> Audienca: [padëgjueshme]?
>> DAVID J. Malan: x kllapa 10 nuk duhet të jetë null.
Detaje null vetëm vjen në lojë me tela, në fund të një varg.
Por një mendim i mirë.
>> Sa i madh është ky grup, edhe edhe pse unë e kam ndarë 40 bytes?
Është 0 përmes nëntë, e drejtë?
Është 10 Ints, total.
40 bytes, por 10 Ints, indeksuar 0 deri 0.
>> Pra, çfarë është se x parantezë 10?
Është në fakt disa Vlera panjohur mbeturinave.
Është e kujtesës që nuk i përket mua.
Unë nuk duhet të prekur se byte numër 41, 42, 43, 44.
Unë jam duke shkuar pak më shumë larg.
>> Dhe me të vërtetë, në qoftë se unë të drejtuar këtë program, ajo mund shumë mirë të rrëzimit.
Por ndonjëherë, ne do të merrni me fat.
Dhe kështu vetëm për të treguar this-- dhe sinqerisht,
ju nuk e dini se para jush e it-- le të drejtuar këtë.
Ajo nuk ka të vërtetë të rrëzimit.
>> Por në qoftë se unë të ndryshojë këtë, për shembull, të jetë si 1000,
për të bërë këtë të vërtetë qëllimshme, le të shohim
në qoftë se ne mund të merrni atë për të rrëzuar këtë kohë.
OK, ajo nuk e rrëzimit.
Si për 100.000?
Le të ribërë atë, dhe tani përsëritje atë.
OK.
Uh.
Të gjithë të drejtë.
Pra me sa duket, përsëri, këto segmentet e kujtesës, si të thuash,
janë të arsyeshme të mëdha, kështu që ne mund merrni me fat përsëri dhe përsëri.
Por përfundimisht, sapo ju të merrni qesharake dhe me të vërtetë të shkojnë larg jashtë në ekran,
ju prek kujtesën se me të vërtetë, të vërtetë nuk i përket ju.
>> Por sinqerisht, këto llojet e mete do
të jetë më e vështirë dhe më e vështirë të kuptoj se në tuaj.
Por fatmirësisht, si programuesit, ne kemi mjete që të na lejojë për të bërë këtë për ne.
Pra, kjo është, ndoshta, një nga programet më të dëmshëm,
edhe shëmtuar se prodhimit Gdb-së.
Por ajo gjithmonë ka një linjë apo dy që janë super të dobishme.
>> Valgrind është një program që ndihmon ju nuk korrigjoj një program, në vetvete,
por gjeni kujtesës të lidhura probleme, në mënyrë specifike.
Kjo automatikisht do të kandidojë kodin tuaj për ju dhe të kërkoni për të paktën dy gjëra.
Një, keni bërë diçka aksidentale si kujtim touch
që nuk i përkasin për ju?
Kjo do t'ju ndihmojë të gjeni ato raste.
>> Dhe dy, ajo do të ndihmojë ju gjeni diçka të quajtur
rrjedhjet e kujtesës, të cilat ne kemi plotësisht të injoruar, naivitet,
për disa kohë dhe blissfully.
Por kjo rezulton, të gjithë këtë herë, sa herë që
ju keni quajtur getString në kështu që shumë nga programet tona,
ju jeni duke i kërkuar operative sistem për kujtesën,
por ju keni ndonjë kujtesë e ndonjëherë duke i dhënë atë
prapa, duke bërë unalloc, ose pa pagesë, siç është quajtur.
Jo, sepse ne kurrë nuk kemi pyetur ju për të bërë këtë.
>> Por e gjithë kjo kohë, programet ju keni qenë i shkruar në C
kanë bërë të rrjedhin memorie, duke i kërkuar operative
sistem për gjithnjë e më shumë kujtesës për vargjet dhe gjësend,
por kurrë dorëzimin atë.
Dhe tani kjo është pak e një oversimplification,
por në qoftë se ju keni ndonjëherë të kandidojë Mac tuaj ose PC tuaj për mjaft kohë, hapja
shumë programe, ndoshta duke mbyllur programet,
dhe edhe pse tuaj kompjuteri nuk u prish,
është marrë aq shumë më e ngadalshme, sikur është e vërtetë
duke përdorur një shumë të kujtesës ose burimeve, edhe pse,
në qoftë se ju nuk jeni edhe prekur tastierë,
që mund be-- por nuk always-- mund të jetë se programet xhironi
kanë vetë rrjedhjet e kujtesës.
Dhe ata mbajnë kërkuar OS për më shumë dhe më shumë memorie, por duke harruar në lidhje me të,
jo të vërtetë duke e përdorur atë, por Prandaj, duke marrë kujtesës larg
nga programet e tjera që mund të duan atë.
Pra, kjo është një shpjegim i përbashkët.
Tani këtu është ku Valgrind-së Prodhimi është plotësisht
tmerrshme për ata më pak të dhe më të rehatshme njësoj.
Por interesante stuff është e drejtë deri këtu.
Ajo është e thënë mua një shkruaj pavlefshme të Madhësia e katër ndodh në këtë program,
në veçanti në përputhje 21 të memory.c.
>> Nëse unë shkoj për të vijë 21, hm, ka me të vërtetë është një shkruaj pavlefshme të madhësisë katër.
Pse Madhësia katër?
E pra, kjo number-- dhe ajo mund të jetë anything-- është një int.
Pra, kjo është katër bytes.
Kështu që unë jam duke i dhënë katër bytes ku ata nuk i përkasin.
Kjo është ajo që Valgrind është në të vërtetë thënë mua.
Për më tepër, ajo gjithashtu do të më thoni, si ne do të shohim,
si ju drejtuar këtë në një pset të ardhmen, në qoftë se dhe kur ju keni rrjedhur kujtesën, që nga
Unë kam, sepse unë e kam quajtur malloc, por unë nuk duhet të vërtetë
quajtur, në këtë rast, të lirë, të cilat ne përfundimisht do të shohim
është e kundërta e malloc.
>> Deri tani, unë mendoj se, një shembull përfundimtar.
Pra, kjo është pak më e errët, por kjo është ndoshta
Arsyeja më e madhe për të jenë të kujdesshëm me memorie,
dhe arsyeja që shumë programe dhe / ose web servers, edhe në këtë ditë,
janë marrë përsipër nga liq diku në internet të cilët janë disi
dërguar pako fals në serverin tuaj duke u përpjekur të bëjë kompromis llogaritë tuaja,
ose të marrë të dhënat tuaja, ose thjesht në përgjithësi të marrë mbi një makinë.
Tampon del nga shtrati, si emri sugjeron, mjete
tejmbushur jo një int, por një tampon.
Dhe një tampon është vetëm një mënyrë e sofistikuar e duke thënë se kjo është një bandë e kujtesës.
>> Dhe me të vërtetë, unë e quajti një varg para buffer, në vend të s.
Sepse në qoftë se kjo është një tampon, si në kuptimin YouTube,
ose çdo herë që jeni duke shikuar një video, ju mund të keni parë fjalën buffering,
dot, dot, dot.
Është tepër i bezdisshëm.
Dhe kjo vetëm do të thotë se lojtar video tuaj
është duke u përpjekur për të shkarkuar shumë e bytes, shumë bytes
nga një video nga interneti.
Por është e ngadaltë, kështu që është duke u përpjekur për të shkarkuar një bandë e tyre
për të mbushur një tampon, një enë, kështu që ju keni bytes të mjaftueshme që të mund pastaj
ju tregojnë video, pa pushuar vazhdimisht.
Por kjo rezulton, ju mund të kanë një tampon për këtë të mëdha.
Por të përpiqet për të vënë këto të dhëna shumë në ajo, dhe shumë gjëra të këqija mund të ndodhë.
Kështu për shembull, le të shohim në kjo ngacmues përfundimtare e një shembull.
Ky është një tjetër program që, në shikim të parë,
nuk bën asgjë super të dobishme.
Ajo e mori një funksion kryesor që e quan atë funksion, f.
Dhe që funksion, f, deri këtu, ka një array char, i quajtur c, e madhësisë 12.
Dhe pastaj është duke përdorur këtë funksion të ri të quajtur strncpy.
>> Ajo rezulton se, me këtë të thjeshtë, linjë të thjeshtë të kodit, vetëm dy linja,
ne kemi bërë gjithë programin tim, dhe për këtë arsye, tërë kompjuterin tim,
dhe llogaria ime përdoruesit, dhe vështirë e mia përzënë potencialisht të prekshme për të gjithë
kush e di dhe është mjaft e mirë për të drejtuar ky program me një linjë të caktuar komandës
argumenti.
Me fjalë të tjera, në qoftë se ky djalë i keq vë brenda argvargv [1] duke shtypur
në tastierë një shumë e posaçërisht hartuar string, jo abc, 123, por në thelb,
simbole binare që përfaqësojnë ekzekutueshme Kodi, një program që ai ose ajo ka shkruar,
me këtë program thjeshtë, që është përfaqësues i mijëra të programeve
që janë të ngjashme të prekshme, guxoj të them, ai ose ajo në fund të fundit mund të fshini të gjitha
fotografi në hard drive time, të marrë një keq të shpejtë në mënyrë që ai ose ajo mund të
të shkruani komandat të tyre, email gjitha dosjet për veten time.
Çdo gjë që unë mund të bëjë, ai ose ajo mund të bëjë me këtë kod.
>> Ne nuk do të mjaft të zgjidhë këtë ende.
Dhe në fakt, kjo do të përfshijë një foto të vogël
si kjo, të cilën ne do të vijë së shpejti për të kuptuar të gjithë më mirë.
Por për sot, le të përfundojë në çfarë është, me shpresë, një pak më të
kuptueshme shaka RockSonte, deri sa të rifillojë herën tjetër.
Të gjithë të drejtë.
Shihemi të mërkurën.
>> [MUSIC Playing]
>> Gjuha: Dhe tani, thellë Mendimet, nga Daven Farnham.
Memory është si hedhur në një grumbull të lë artë në një e diel pasdite.
Era defekt, hedhur tuaj hair-- oh, I miss ditët when--
>> [Qeshura]