Tip:
Highlight text to annotate it
X
>> Gjuha 1: Hi everyone.
Ne jemi duke shkuar për të marrë filluar.
Unë mendoj se njerëzit janë ende duke shkuar për të filtrimin in
Por në interes të kohës, kështu që ne mund të merrni ju djema nga këtu në kohë,
ne jemi duke shkuar për të filluar.
Pra, mirë se vini në CS50 Quiz 0 rishikim.
Për ata që nuk e kanë realizuar ende, ju keni një pyetje të mërkurën.
Woo-hoo.
>> Nëse ju nuk kanë filluar ende duke studiuar ose nuk e kanë kuptuar se kjo ekziston akoma,
kuize e kaluara dhe të gjitha informatat në lidhje me quiz tuaj janë në cs50.net/quizzes.
Ka disa gjëra mjaft të mirë në atje, kuize e fundit nga 10 e fundit
vjeç, si dhe informacione në lidhje me këtë quiz dhe tema të
që do të mbulohet.
Pra, le të ketë filluar.
>> Pra, ju djema mund të mbani mend, i pari dita e klasit të Davidit, kishte ato llambat në.
Pra, në thelb, çdo gjë që shkon në nën kapuç e një kompjuteri është
bërë në binar.
Binary do të thotë ajo që tingëllon si, 0 dhe 1 i.
Ajo ka dy vlera që mund të përfaqësohen.
>> Pra, ashtu si në ditën e parë të seksionit Kur Davidi u kthye në një dritë
llambë për të përfaqësuar në, ose 1, kompjuteri ynë kupton binare si 0-të dhe
1-të, në ose jashtë.
Bazat e Binary.
Çdo vend është i përfaqësuar në bazë të dy.
Kështu që ju të shtoni 2 me 0 për 1 deri në 2 të gjithë rrugën deri.
>> Për të llogaritur se çfarë binar juaj është që të decimal, ju vetëm ndjekin këtë ekuacion
shkruani gjë.
Nëse ju keni një 1 në asnjërin nga këto qytete, ju shumohen atë me çfarëdo
bazë është në, shtoni atë, dhe ju merrni decimal.
Pra, kjo është se si ju të mbështeteni në 5 në binar.
Ashtu si ajo që ne ishim duke bërë në rrëshqitje të fundit, kjo është se si ju do
përfaqësojnë 1 deri në 5.
>> Në mënyrë të ngjashme, ashtu si ju mund të shtoni dhe të zbres në dhjetore ose baze 10, ose
me të vërtetë ndonjë bazë, në mund të shtoni dhe zbres në binar.
Pikërisht ajo që ju do të presin kur ju shtoni dy lart, në qoftë se ajo është e barabartë me më të madh
se 1, keni kryer një 1, e bëjnë atë një 0, dhe të bëjë shtimin në këtë mënyrë, vetëm
si ju do të presin me rregullt decimal apo ndonjë bazë tjetër.
Ftohtë.
>> Pra, si kam thënë më parë, çdo gjë që vazhdon nën kapuç e kompjuterin tonë
është bërë në 0 dhe 1 i, apo binar.
Deri sa nuk kemi të shprehur, për shembull, shkronja ose numra, apo karaktere?
Dhe Përgjigja për këtë është ASCII.
>> ASCII është një hartë në mes të karaktereve që ne normalisht do të shohim në
Gjuha angleze si A-së, B-së, C-së, theksojnë, dashes, dhe
diçka të tillë.
Dhe harta që për një vlerë ASCII.
Një vlerë ASCII është vetëm një numër që mund të kuptohet nga kompjuteri juaj.
Dhe ashtu si ju mund të bëni shtimin dhe zbritje me numra, ju mund të bëni
ato me vlera ASCII.
>> Pra, në këtë shembull, çfarë kjo do të shtypura nga?
Yeah, kështu që vetëm një hapësirë hapësirë hapësirë B C D. Ku ka shkuar miu im?
Vini re se ju mund të përcaktojë një int në 65 vjeç.
Dhe kur keni shkruar se duke përdorur përqind C, ajo do të interpretojnë këtë si një
karakter dhe do të shtypura nga A.
>> Në mënyrë të ngjashme, ju mund të deklarojë ajo si një char.
Dhe kur ju të shtypura it out duke përdorur për qind C, ajo do të interpretojnë se si
qind D. Dhe ashtu si ju mund të shtoni një numrin, ju mund të shtoni karaktere janë
Vlerat ASCII, në këtë rast.
>> Pra, një tregues i vogël për të gjithë.
5, si një varg, nuk në të vërtetë të barabartë 5.
Pra, si mund të kemi kthyer varg 5 deri integer 5?
Ndonjë ide?
Po.
>> Pra, në qoftë se ne kemi 5 si një varg, ne mund të zbres 0.
Dhe kjo do të na ***ë 5.
Dhe në mënyrë të ngjashme, në qoftë se ne kemi 5 si një numër i plotë, të shtoj se në vargun 0.
Dhe kjo na jep vargun 5.
Ftohtë.
>> Tani, kujtojnë përsëri në një leksion ku kemi biseduar për algoritme.
Deri sa nuk kemi të vërtetë duan një kompjuter për të bërë gjëra interesante?
Ju e dini, thjesht duke shtuar dhe zbritur numrat dhe shtypje gjërat jashtë nuk është e
se emocionuese.
Zakonisht, ne duam kompjuterin tonë për kryejnë një lloj algorithm.
Diçka kompleks pak më shumë se vetëm aritmetikë të thjeshtë.
>> Një algoritëm është vetëm një hap pas hapi set e udhëzimeve për se si për të kryer
një detyrë të caktuar -
ashtu si një recetë.
Ju mund të mbani mend ditën e parë të klasë ku Davidi kishte na llogarisin një dhomë
e njerëzve dhe se sa njerëz ishin në dhomë.
Ju mund të përdoren për të numërimit një nga një.
1, 2, 3, 4.
Në këtë rast, një algoritmi kohë lineare.
>> Por Davidi futur një algoritëm për ju për të numëruar njerëzit në dhomë
ku të gjithë qëndron lart, ju thoni tuaj Numri një personi tjetër, të shtoj se
Numri up, dhe një person i ulet.
Dhe ju përsëris atë.
Kjo është një lloj algorithm.
Ne mund të analizuar se si efikase një algorithm është e bazuar në atë të kandidojë kohë.
Por ne do të flasim pak më shumë për këtë më vonë.
>> Pra, të gjitha algoritme gjithashtu mund të të jetë e shkruar në pseudokod.
Pseudokod është vetëm një angleze si Sintaksa e përdorur për të përfaqësuar
një gjuhë programimi.
Për shembull, në qoftë se kemi dashur të kërkojë një përdorues me mend numrin tim të preferuar, ne
mund të ketë pseudokod si të tillë.
>> Merrni një përdorues të guess.
Nëse guess është e saktë, tregoni atyre ata janë korrekt, tjetër tregoni atyre
ata nuk janë të sakta.
Dhe pseudokod është një mënyrë e lehtë përfaqëson një ide apo një algoritëm.
Deri tani ne mund të dëshironi të vërtetë shkruani kjo në gjuhën që kompjuteri
mund të të kuptuarit.
Pra, ne mund të shkruaj pseudokod tonë dhe interpretojnë që në kodin e burimit.
>> Deri më tani, kod burim duhet t'i përmbahet në një sintaksë të caktuar të
një gjuhë programimi.
Dhe deri më tani, në CS50, ne kemi qenë duke përdorur kryesisht c.
Pra, kjo mund të jetë kodi burim për c.
Më vonë në kurs, që vijnë natën në kontakt me programimin e tjera
gjuhë si PHP.
Ose në qoftë se ju edhe të marrë klasat e tjera, o mund të bëni Java, Python, apo edhe OCML.
Por në c gjuhën tonë të programit, ky është se si ne mund të shkruani kodin burim për
algorithm pseudokod që Unë vetëm përshkruar më parë.
>> Pra, si e bën kompjuterin tuaj të vërtetë kuptojnë se?
Ashtu si kam thënë më parë, se vetëm me të vërtetë kupton zero dhe ato.
Pra, si e bën atë të marrë nga burimi Kodi për diçka që mund të jetë
kuptohet?
E pra, ne kemi diçka quajtur një përpilues.
>> Nëse ju kujtohet përsëri në shumicën nga tuaj psets, keni pasur një lloj të programit
shkruar në një skedar dot c.
Dhe pastaj ju do të tipit make.
Pra, çfarë po bëni duke bërë?
>> Ju mund të shtypni make për të hartuar tuaj Programi për shkak se dikush -
kushdo që ka shkruar vendosur tuaj p; ndoshta David -
krijuar një make file.
Dhe kjo tregon bëjë të dini për të kandiduar tuaj përpilues, i quajtur tingëllimë, se vullneti
pastaj përpilojnë kodin tuaj burim për objektin Kodi, e cila është zero dhe ato
se kompjuteri juaj kupton.
Por, pak më vonë, ne do të shkojmë më në thellësi rreth hartuesit.
>> Pra kujtojnë pset 0, ku - po, ju keni një pyetje?
>> Audienca: [padëgjueshme]?
>> Gjuha 1: Po.
Unë mendoj se ata në fakt duhet të jetë online.
Po.
>> Audienca: A është si [e padëgjueshme]?
>> Gjuha 1: Nuk është.
Janë në cs50.net/quizzes.
>> Audienca: Slash kuize, çaj 2013, 0 plagë, dhe vetëm të klikoni me
kuize 2013 dhe quiz 0, shqyrtojë slides seksion.
>> Gjuha 1: Po, kështu që nëse ju djema doni të tërheqë atë dhe të kërkoni në atë në tuaj
kompjuter vet, kjo është në rregull shumë.
Thuaj se përsëri.
>> Audienca: [padëgjueshme].
>> Gjuha 1: Po, [e padëgjueshme] është variabël dummy.
Oh, po?
>> Audienca: [padëgjueshme]?
>> Kryetari 1: Jo, grevat nuk janë në provim.
Na vjen keq, pyetja e saj ishte, u greva në provim.
Dhe kjo nuk është.
Pra pset 0, ju djema duhet të kenë të gjithë zbatuar diçka duke përdorur zeroja.
Dhe kemi mësuar një programimit bazë blloqe ndërtimi duke përdorur zeroja.
>> Pra, le të marrin një vështrim në disa këto blloqe të ndërtimit
që përbëjnë një program.
Së pari është shprehje Boolean.
Shprehjet Boolean janë ato dhe 0-së apo ndonjë gjë që ka
dy vlera të mundshme.
Në këtë rast, e vërtetë apo e rreme, në ose jashtë, dhe po ose jo.
Një shembull i një të thjeshtë, shumë e thjeshtë, program që përdor një Boolean
shprehje këtu.
>> Pra, në mënyrë për shprehje Boolean për të të jenë të dobishme, ne kemi operatorë Boolean.
Këto janë operatorët që mund të përdoren për të krahasuar vlera të caktuara.
Pra, ne kemi dhe ose jo të barabartë për të, më pak se ose e barabartë me e madhe se ose
barabartë me, dhe më pak se ose më e madhe se.
Por këta operatorë nuk janë shumë të dobishme nëse ne mund të kombinohen ato në
kushtet.
>> Pra, ju djema mund të mbani mend nga e para dhe nga p juaj vendos që ne
kishte kushte.
Ata janë, në thelb, si forks në logjika e programit tuaj që
ekzekuton varësi të faktit nëse një kusht është plotësuar.
Pra, një nga kushtet që kemi pasur përdorur shumë herë në këtë kurs është
në qoftë se, tjetër, nëse kushtet, dhe tjetër.
>> Ja një shembull se si ju mund të përdorni atë.
A ka dikush di dallimin në mes vetëm duke përdorur në qoftë se deklarata të gjitha
shumë më poshtë vargjeve në qoftë se, tjetër, në qoftë se, dhe tjetër e kombinuar?
Po?
>> Audienca: [padëgjueshme].
>> Gjuha 1: Pikërisht.
Pra, nëse kam pasur në qoftë se të gjithë rrugën poshtë këtë mënyrë, edhe nëse ky kusht i kthimit
e vërtetë, ajo do të vazhdojë të vazhdojë testimin e dy të ardhshëm.
Ndërsa, me një tjetër-nëse, një tjetër deklaratë, nëse ai jep true,
të tjerët nuk janë testuar.
Ndonjë pyetje në lidhje me këtë?
Ftohtë.
>> Kështu që ju përdorni një nëse-tjetër e një tjetër deklaratë në qoftë se ju e dini se ajo vetëm mund të
të jetë një nga këto raste.
Pra, ne e dimë, nëse x është më pak se 0, kjo është definitivisht nuk do të jetë
madhe se 0.
>> Tjetra, një tjetër bllok ndërtimi se ne jemi mësuar sythe.
Ne kemi tri lloje të sythe.
Për unazore, ndërsa sythe, dhe bëni ndërsa sythe.
Dhe në përgjithësi, kur ti ulesh për të shkruani diçka, ju duhet të vendosë
e cila nga tre që dëshironi të përdorni.
Deri sa nuk kemi vendosë që një?
>> Ne në përgjithësi përdorin një për lak në qoftë se ne e dimë sa herë që ne duam të iterate
me diçka ose sa herë ne duam të kryer një detyrë.
Ne përdorim, ndërsa sythe në qoftë se ne kemi nevojë për disa kusht që të jetë e vërtetë për të mbajtur running.
Dhe ne i përdorim të bërë, ndërsa shumë të ngjashme me ndërsa, por ne duam kodi ynë për të kandiduar në
paku një herë.
>> Pra mos ndërsa, çdo gjë që është në të bërë vullnetin gjithmonë të drejtuar të paktën një herë.
Ndërsa, me kohë, kjo mund të mos të kandidojë në të gjitha nëse
kusht nuk është i kënaqur.
Çdo pyetje me se?
>> Pra, struktura e një për lak.
Ju djema e keni parë të gjithë këtë.
Ju nisja atë.
Ju keni disa lloj gjendje.
Kështu, për shembull, ne mund të nisja si për i barabartë me 0.
i është më pak se 10.
Dhe i + +.
Një shumë e thjeshtë që ne i kemi bërë.
>> Për një lak ndërsa, në mënyrë të ngjashme, ju keni që të ketë një lloj inicializimit,
një lloj gjendje, dhe një lloj update.
Pra, ne mund të zbatojë për lak tonë edhe si një lak duke përdorur këtë.
Dhe në mënyrë të ngjashme me një e detyrave, ndërsa loop, ne mund të kemi disa inicializimit,
ekzekutuar diçka, update it, dhe atëherë kontrolloni gjendjen.
>> Deri tani funksionon.
Ne kemi vënë çdo gjë së bashku.
Ne mund të dëshironi të shkruani disa lloj funksioni.
Funksion i zakonshëm që ju mund të kanë parë tashmë është kryesore.
Kryesor është një funksion.
Ajo ka një lloj kthimi, int.
Ajo ka një emër funksion, kryesore.
Dhe kjo ka argumente, argc dhe ARGV.
Pra kryesor është vetëm një funksion.
>> Funksione të tjera ju mund të keni përdorur, printf - printf është një funksion -
GetInt, toupper.
Por këto të ndodhë që të ketë qenë zbatohet për ne nga
një lloj biblioteke.
Nëse ju djema mos harroni përfshirë kjo bibliotekë CS50.h ose
Standardi I / O bibliotekë.
Po, pyetje?
>> Audienca: A është kryesor vetëm e natyrshme në c?
A vetëm ajo lloj [e padëgjueshme]?
>> Gjuha 1: Pyetja është në qoftë se kryesore është e natyrshme në c.
Dhe po, të gjitha funksionet kanë një funksion kryesor.
Kjo është lloj i nevojshëm për kompjuter të dinë se ku të fillojë
drejtimin kodin.
>> Audienca: Pra, ju nuk do të [padëgjueshme]?
>> Gjuha 1: Jo.
Çdo pyetje të tjera?
Ftohtë.
Pra, ashtu si ju mund të përdorni një funksion që është shkruar për ju, ju mund të
shkruani funksionin tuaj.
Ky është një funksion që dikush mund kanë shkruar për të llogaritur vëllimin
i Q, per shembull.
Ka një lloj kthimi këtu, në këtë rast int, emri ynë funksionin q dhe tonë
lista e parametrave.
>> Dhe vini re që ju duhet të shkruani të dhënat Lloji i parametër që dëshironi të
përdorim ose tjetër funksion nuk ka e di se çfarë lloj të
Parametri duhet të jetë pranuar.
Pra, në këtë rast, ne duam një numër i plotë si input tonë.
Pra, pse mund të duam të përdorim funksione?
>> Para së gjithash, i madh për organizatën.
Ato ndihmojnë për të thyer kodin tuaj në chunks më të organizuar dhe të bëjë
më të lehtë për të lexuar.
Thjeshtësimi.
Kjo është e mirë për dizajn.
Kur ju jeni duke lexuar një pjesë të kodit dhe funksioni kryesor është me të vërtetë,
me të vërtetë të gjatë, mund të jetë e vështirë për të Arsyeja për atë që po ndodh.
Pra, nëse ju thyejnë atë në funksionet, ajo mund të jetë më e lehtë për të lexuar.
Dhe ripërdorimi-aftësinë.
Nëse ju keni një copë të kodit që është duke u quajtur ose të drejtuar shumë herë,
në vend të rishkrimin se kodi 10 herë në funksion tuaj kryesor, ju mund
doni të ripërdorimin atë.
Dhe pastaj çdo herë që duhet të përdorni atë pjesë të kodit, thirrni funksionin.
>> Deri tani në qoftë se ne kujtojmë përsëri në para, ne gjithashtu foli për disa koncepteve,
një nga të cilat është e filetim.
Thread është koncepti i shumëfishtë sekuenca të kodit
ekzekutimin në të njëjtën kohë.
Pra, mendoj se përsëri në një ku Davidi kishte ditë ju djema numërimin off numrin e
njerëz në dhomë.
>> Në thelb, ajo që po ndodhte më është e të gjithë ju djema ishin
running temat e veçanta.
Dhe ato temat vinin së bashku për të marrë një lloj përgjigje.
Në mënyrë të ngjashme, në Scratch, kur ju keni sprites të shumta, ju mund
kanë një mace dhe një qen.
Dhe ata do të jenë në të njëjtën kohë drejtimin Scripts tyre.
Kjo është një shembull i fillesë.
>> Dhe koncepti tjetër që ishte futur në zeroja ishte ngjarje.
Dhe ngjarje janë kur pjesë të shumta e formuar juaj komunikuar me njëri tjetrin.
Në Scratch, kjo ishte kur ju të përdorur transmetuar kontrollit dhe Kur unë
Merre blloqe.
>> Dhe gjithashtu, ne Problem Set 4, ne pamë pak e ngjarjeve, si dhe.
Ju djema mund të ketë përdorur biblioteka Gevent.
Dhe aty ishte një funksion waitForClick në të cilat ju janë duke pritur
për përdoruesin të klikoni.
Dhe klikoni tuaj, në këtë rast, do të ishte e ngjarje dhe të presin për klikim është tuaj
Mbajtësi i ngjarjeve.
>> Dhe gjithashtu, të gjithë drejtimin psets tuaj dhe duke punuar në psets tuaj, ju
mund të vijnë në kontakt me disa prej këtyre komandave.
Kjo është ajo që ju typed në tuaj dritare terminali ose çfarëdo dritare
që tregon deri në g redaktoni tuaj për të, në thelb, të lundruar kompjuterin tuaj.
>> Kështu për shembull, LS listat përmbajtjen e një directory.
Bëni directory krijon një dosje të re.
CD, directory ndryshim.
RM, hiqni, fshin një fotografi ose disa directory.
Dhe pastaj hiqni directory heq një directory.
>> Audienca: [padëgjueshme]?
>> Gjuha 1: Po, sigurisht.
Na vjen keq, çështja ishte nëse do të sugjeroja vënë këtë
në mashtrojnë fletë.
Kjo mund të ndihmojë.
Nëse ju keni hapësirë, ju mund të vënë atë në.
Është gjithashtu vetëm përgjithësisht mjaft e mirë për të kujtuar, sepse kur ju përdorni atë
ju mund të dëshironi të vetëm të atë e kanë memorizuar.
Kjo do të bëjë jetën tuaj shumë më të lehtë.
A e kam të përgjigjem pyetjes tuaj?
>> Deri tani, kemi biseduar pak shkurtimisht për bibliotekat.
Por të dy më kryesore që ne kemi qenë përdorur deri më tani gjatë janë
I standard / O dhe CS50.
Çfarë lloj gjëra janë të përfshira në standarde I / O bibliotekë?
>> Po, deri tani ne kemi përdorur printf.
Në CS50, ne kemi përdorur GetInt dhe getString.
Dhe llojin e të dhënave string ndodh edhe që do të shpallet në këtë bibliotekë CS50.
Ne do të flasim pak më shumë në thellësi rreth se si bibliotekat punojnë dhe se si ato
bashkëveprojnë me pjesën tjetër të kodit tuaj.
Por ato janë dy të kryesore që ne kanë ardhur në kontakt me deri tani në
kurs.
>> Llojet.
Këto janë të mira për të kujtuar se sa çdo lloji përfaqësohet nga ose si
shumë bytes secili prej llojit kërkon -
int, 4 bytes, char, 1 bajt.
Float është 4 bytes.
Çfarë është një të dyfishtë?
>> Audienca: [padëgjueshme].
>> Gjuha 1: Po, kështu që një noton por dyfishojë madhësinë.
Po në lidhje me një kohë të gjatë?
>> Audienca: [padëgjueshme].
>> Gjuha 1: OK.
Çfarë është një kohë të gjatë?
>> Audienca: [padëgjueshme].
>> Gjuha 1: Po, të dyfishtë një int.
Po.
>> Audienca: [padëgjueshme].
>> Gjuha 1: e gjatë [padëgjueshme].
Dhe pastaj një kohë të gjatë është e dyfishtë që.
>> Audienca: Jo, jo.
Një kohë të gjatë është vetëm një int.
Kjo varet nga arkitekturës para se të [padëgjueshme]
dhe int kanë të njëjtën madhësi.
[Padëgjueshme].
>> Gjuha 1: Pra, një kohë të gjatë dhe një int janë njëjtë.
Dhe pastaj një kohë të gjatë është dyfishi i int.
Ftohtë.
Dhe pastaj, çfarë është lloji i fundit?
>> Audienca: Pointer.
>> Gjuha 1: Po, kështu që ne mësuam pak pak për pointers.
Dhe pa marrë parasysh se çfarë është një akrep është duke treguar - ajo mund të jetë një yll char
ose një yll int -
është gjithmonë 4 bytes për një akrep.
Pyetje në lidhje me se?
Po?
>> Audienca: [padëgjueshme]?
>> Gjuha 1: Pra, një kohë të gjatë dhe një int janë të njëjtën gjë në këtë aplikim CS50.
>> Audienca: aplikim janë plotësisht të këmbyeshëm.
>> Gjuha 1: Po.
Kështu, pra një kohë të gjatë është e dyfishtë një int.
>> Audienca: Kjo është 32 bit?
>> Gjuha 1: 32 bit, po.
>> Audienca: Pra, [e padëgjueshme]?
>> Gjuha 1: Po, në qoftë se ajo nuk thonë në mënyrë eksplicite, ju
duhet të marrin një 32 bit.
>> Audienca: Kjo do të thotë diçka si duke supozuar një
Arkitektura si aplikim.
Për 64 bit, të vetmet gjëra që Ndryshimi janë dëshiron dhe pointers.
Ata të dy [e padëgjueshme].
>> Gjuha 1: Po?
>> Audienca: Pyetje.
Pra, në një nga kuize praktikë, ai e kërkon për një int unsigned.
Pra, si do që të përcaktohet nga një int [padëgjueshme]?
>> Gjuha 1: Një unsigned në është edhe 4 bytes.
Por ajo që është e ndryshme në lidhje me një të nënshkruar int dhe një int e panënshkruar?
>> Audienca: [padëgjueshme].
>> Gjuha 1: E drejta.
Dikush mund të përfaqësojnë vlera negative.
Por si e bën atë të bëjë këtë?
>> Audienca: [padëgjueshme].
>> Gjuha 1: Po, ai kursen 1 bit për të përfaqësuar shenjë.
Nënshkruar ka një grimë që përfaqëson shenjën.
Dhe unsigned vetëm është të gjitha pozitive.
>> Audienca: OK.
Pra, ju thoni se një të dyfishtë është dy herë madhësinë e një noton?
>> Gjuha 1: Dopjo është dy herë madhësinë e një noton, po.
>> Audienca: Si një akrep për një kohë të gjatë të gjatë [padëgjueshme]?
>> Gjuha 1: Pra, pyetja është se si e bën tregues për një kohë të gjatë të gjatë -
se si është se vetëm katër bytes kur një kohë të gjatë 8 bytes saj.
Pra, mbani mend se çfarë është një akrep, thelb, me vlerë shumë bazë.
>> Audienca: [padëgjueshme].
>> Gjuha 1: Po, kështu që një akrep është vetëm një vend kujtim.
Pra, kjo nuk ka rëndësi se sa shumë hapësirë se tregues është duke treguar për të.
Ajo ka nevojë vetëm 4 bytes për të mbajtur nën e atë vend të kujtesës.
Çdo pyetje të tjera?
Ftohtë.
>> Pra, gjëja e fundit që unë kam është output standarde.
Ju duhet të përdorni ato shpesh mjaftueshme që ju mund të mbani mend.
Por kjo është kur ne përdorim printf, për shembull.
Dhe ne kemi këto placeholders që u thirrën kodet format.
>> Pra qind c char, qind për int i, dhe ne mund të përdorë gjithashtu qind d.
Është e njëjta gjë.
Por, në përgjithësi, në CS50 ne të përpiqemi për të përdorur për qind i.
Përqindja f për noton.
Ld qind për kohë të gjatë kohë të gjatë dhe të përqind s për varg.
>> Në mënyrë të ngjashme, ne kemi qenë duke përdorur disa nga këto sekuenca shpëtuar.
Për shembull, backslash n për linjë të re.
Kjo është vetëm për kur ju jeni formatimit Kodi juaj për të shtypura f.
Po?
>> Audienca: Çfarë është qind për d?
>> Gjuha 1: Pra pyetja është ajo që është qind për d?
Përqindja d është për ints.
Përqind d dhe perqind i janë njëjtë.
>> Audienca: Çfarë është dallimi në mes të backslash n dhe backslash r?
>> Gjuha 1: Pra, pyetja është se çfarë është Dallimi në mes reagim i ashpër n dhe
r reagim i ashpër?
Unë mendoj se r backslash është -
>> Audienca: r Pra, backslash vetëm nënkupton kthehet në fillim të linjës
pa të vërtetë duke shkuar në një linjë të re.
Pra, nëse keni shkruar një r backslash dhe ju të kthehemi në fillim të linjës
atëherë keni shkruar më shumë gjëra, ju prishësh sende që është tashmë në
[Padëgjueshme].
Ndërsa, n fakt shkon në një të re line dhe shkon në [padëgjueshme].
>> Gjuha 1: E pra, ndonjë pyetje të tjera?
Dakord.
Unë jam duke shkuar për dore atë për në Dan i cili do të vazhdojë.
>> [Duartrokitje]
>> DAN: All righty.
Kështu që unë do të flasim për një tjetër e gjerë varg i ideve nga klasa që janë
afërsisht përfaqësues i javës dy dhe Fillimi i javës tre duke filluar nga jashtë
me hedh, e cila është vetëm një mënyrë për të trajtimin e një vlerë e një lloji të caktuar si
një vlerë e një lloji të ndryshëm.
Pra, ne mund të bëjmë këtë me chars të Ints, gjithandej në ints, dhe
dëshiron të gjatë të dyfishtë.
>> Të gjitha këto gjëra mund të përdoret si mënyra e trajtimit të disa vlera numerike
minus char si disa të tjera vlera numerike.
Pra, ka disa çështje me këtë, i Sigurisht, e cila vjen kur ju hedhin
gjëra të tilla si noton në ints.
Pra, kjo është pak i çuditshëm.
Ne kemi një noton që është 1.31.
Ne shumohen atë nga 10.000.
Dhe atëherë ne print it si një int.
Çfarë e bën këtë prodhim?
10.000 herë 1.31.
Pra 13.000, është se me mend?
>> Audienca: Unë mendoj se është 10,000.
>> DAN: Kështu që unë jam duke shumëzuar atë me 10,000 para se unë jam hedh atë.
>> Audienca: Oh.
A nuk do të jetë vetëm 9 dhe disa 0 numra?
>> DAN: Ju mund të keni disa shifra të pazakontë.
Në mënyrë të drejtë, kjo është 1.3 herë 10.000.
Pra, kjo është 13.000.
Dhe kjo shtesë pazakontë -
>> Audienca: 13.100.
>> DAN: 13.100.
Ju faleminderit, Rob.
Dhe kjo weirdness ekstra -
kjo 9,9 -
është thjesht për shkak se kjo e hedh përfundoi arrestimi poshtë ku
ajo nuk duhet të ketë.
Po.
>> Audienca: hedh ndodh pas çdo gjë tjetër?
>> DAN: Pra, sepse unë kam këtë në shtyp, ajo e bën këtë shumëzimin para saj
e bën këtë hedh.
>> Audienca: [padëgjueshme].
>> DAN: Unë mendoj se do të hedhur së pari, yeah, e cila do të ishte 10,000.
Çdo gjë tjetër?
Ftohtë.
Pra, kjo është 13.099.
Pse ndodh kjo?
Pasaktësi.
>> Gjithandej nuk janë perfekte.
Ato mund të përfaqësojnë vetëm numra të një numër i caktuar i figurave të rëndësishme.
Pra, në qoftë se ne të shtypura nga 8 fiq sig mbi kjo noton, kemi një lloj
Numri i shëmtuar në kërkim.
Dhe kjo është për shkak se 1.31 nuk mund të saktë të përfaqësohet nga e thjeshtë
kompetencat e dy në makinë.
Kështu që ajo përfundon duke afërt me mend, e cila përfundon
duke qenë një ulët pak.
Kuptim?
OK.
>> Tani, kaloi janë një mënyrë të ndryshme të duke bërë deklarata të kushtëzuara, ku të gjithë
ne lidhje me kujdes është një variabël i vetëm.
Pra, në këtë shembull të veçantë, ne jemi marrjen e një numër i plotë nga ana e përdoruesit.
Dhe atëherë ne jemi duke kërkuar në ajo që është numër i plotë.
Me sa duket, kjo është numër një deri në katër.
Kjo është ajo që ne jemi duke kërkuar për.
>> Kështu që ju të bëni një switch të emrin e ndryshueshme.
Pastaj ju krijuar raste të jetë e mundur vlerat ajo mund të jetë.
Pra një rast, thonë se është e ulët.
Dhe pastaj ju të thyer për të marrë nga ndërprerësit kusht mënyrë
ju nuk do të mbajë.
>> Në rastin e ardhshëm -
kështu rast dy dhe rast tre -
në qoftë se është rasti dy vetëm ajo bie poshtë për të rreshtin e parë të kodit që e sheh si me
rast tre deri sa të sheh një pushim.
Pra, arsyeja që ju të merrni një rast të vetëm të ulët të shtypura është sepse unë
kanë këtë pushim këtu.
Në qoftë se unë, të themi, injoruar këtë pushim - në qoftë se unë e hodhi këtë shkëputjen -
ajo do të shtypura të ulët, dhe pastaj ajo do të shtypura mesme, dhe atëherë ajo do të thyejnë.
>> Pra pushimet janë një pjesë e rëndësishme e kaloni kushteve dhe
ata duhet të jenë atje.
Çdo raste që nuk është përcaktuar në mënyrë të qartë trajtohen nga default
rast në kaloni dhe duhet të hidhet.
>> AUDIENCA: OS 1, 2, 3, dhe 4 do të ishte n?
>> DAN: Vlerat që n mund të jetë.
Po.
Po?
>> Audienca: Pra, kur ju keni se [e padëgjueshme]?
>> DAN: Ju do të shtypura të ulët, dhe më pas ajo do të shtypura mesme, dhe
atëherë ajo do të prishej.
>> Audienca: Pse do të shtypura mesme në qoftë se [e padëgjueshme]?
>> DAN: Pra, çdo gjë nën një rast para një pushim bie nën.
Pra, çështja e shkruar është rasti nën një si kjo është shkruar më poshtë.
Po?
>> Audienca: [padëgjueshme]?
>> DAN: Pra, ky numër është vetëm një të veçantë vlerë që ky variabël
mund të marrë, apo jo?
A ka kjo kuptim?
Po.
>> Audienca: [padëgjueshme]?
>> DAN: Po, rasti dy do të shtypura e mesme dhe pastaj pushim.
>> Audienca: [padëgjueshme]?
>> DAN: Unë mendoj se ndonjë?
Çfarë të tjera lloje të të dhënave ju mund të kaloni mbi?
>> Audienca: Ju mund të kaloni mbi çdo lloje të të dhënave.
Por kjo vetëm do të thotë asgjë mbi chars dhe Ints dhe stuff like that, sepse
në qoftë se ju jeni switching mbi një tregues që nuk ka të vërtetë kuptim,
switching mbi ngarkesat, qoftë ajo edhe le ta keni bërë këtë, për shkak të pikës lundrues
në saktësi, ju nuk do të vërtetë doni të bëni atë gjithsesi.
Pra shumë e shumë, vetëm Ints dhe chars dhe sende si kjo.
>> DAN: Po, kjo është kur ju keni të qartë Vlerat që ju e dini, unë mendoj, mund të jetë
se kalimi është në të vërtetë e dobishme.
Mirë?
OK.
>> Fushëveprimi është varg që një deklaruar ndryshueshme shtrihet.
Pra, në këtë copë të vogël të kodit kam, do të ishte e plotë e gabimeve.
Dhe arsyeja është e deklarova këtë int Unë në kuadër të kësaj për lak.
Dhe atëherë unë jam duke u përpjekur të referimit që i jashtë që për qëllimin loop.
>> Pra, në thelb, ju mund të mendoni për qëllimin si çdo gjë që ju të deklarojë
me brenda një sërë formatimin e teksteve kaçurrel vetëm ekziston brenda këtyre formatimin e teksteve kaçurrel.
Dhe në qoftë se ju provoni dhe të përdorin këtë variabël jashtë këtyre formatimin e teksteve kaçurrel, ju do të
merrni një gabim nga përpiluesit.
Po?
>> Audienca: Pra, kjo nuk punon?
>> DAN: Kjo nuk funksionon, po.
Vargjet.
String një char *.
Ata janë të njëjtë.
Ata janë vetëm pointers në karaktere.
Dhe çdo vargjet që ju duhet të përfundojë backslash me zero, që është vetëm
një konventë c.
>> Ajo quhet terminator NULL.
Dhe NULL -
Kapitali N, kapitali U, kapitali L, kapitali L -
nuk është e njëjtë si Terminator NULL.
Kjo është një akrep.
Kjo është një karakter.
Ata janë shumë të dallueshme.
Mos harroni atë.
Ajo do të jetë në quiz, ndoshta.
Unë nuk kam parë quiz.
Po?
>> Audienca: Pra NULL është, të themi, akrep?
>> DAN: Po.
>> Audienca: Çfarë e bën [padëgjueshme]?
>> DAN: Në qoftë se, të themi, malloc quhet kur ju nuk kanë kujtesë të mjaftueshme për të marrë
çfarëdo madhësi ju jeni duke kërkuar për, malloc do të kthehet NULL.
Kjo është, në thelb, sa herë që një funksion është dashur të kthehen një tregues, ju
duhet të kontrolloni kundër NULL sepse NULL është një shumë e mirë -
kjo është, lloj, vlera e mbeturinave.
Kjo është një zero sa i përket pointers shkojnë.
>> Sa herë që ju e quani një funksion, që jep një akrep.
Ju jeni do të dëshironi të shikoni të jetë i sigurt se kjo nuk është NULL pointer
sepse NULL është shumë e zakonshme.
Kjo është lloj i një kthim mbeturina.
Pra, nëse diçka nuk ka shkuar drejtë, kthehen vetëm NULL vend.
>> Audienca: [padëgjueshme]?
>> DAN: Po, dhe kjo është kjo.
>> Audienca: [padëgjueshme]?
>> DAN: Spell atë si kjo.
Është terminator NULL.
Është me të vogla N-U-L-L nëse ju jeni që lexon atë.
>> Audienca: Dhe Unë vetëm shkova mbrapa dhe testuar atë.
Dhe në qoftë se ju provoni për të vënë një pikë lundrues vlerësojmë në një switch, ajo do të çirrem në ju
duke thënë, deklarata kërkon shprehje e tipit integer.
>> DAN: Nuk ju shkoni.
Por, vërtet, ajo që ishte pyetja përsëri?
>> Audienca: [padëgjueshme]?
>> DAN: Pra kapitalit N, kapitali U, kapitali L, kapitali L është një c gjë aktual.
Është tregues NULL dhe do vetëm të trajtohet si i tillë.
Ju kurrë nuk do të përpiqet dhe spell Karakteri NULL dhe të shohim çdo
mënyrë tjetër se sa kjo.
Po?
>> Audienca: Pra u kthyer në char max ose diçka në shënimet shpjeguese, do ajo
mishërojnë të njëjtin funksion si [e padëgjueshme]?
>> Audienca: Pra, ju jeni duke iu referuar max kthyer char nga getchar, ose
çfarëdo qoftë ajo?
>> Audienca: Po.
>> Audienca: Po, në mënyrë të përgjithshme Termi për të gjitha ato gjëra
janë Sentinel vlerat.
Pra, si u kthyer max int nga GetInt dhe max char nga getchar, është e
menduar të jetë si, të gjithë të drejtë, në qoftë se këto gjëra janë duke u kthyer për ne,
diçka shkoi keq.
>> Për pointers, ne vetëm ndodh që të ketë kjo vlerë rojtar që të gjithë
dakord mbi.
Dhe kjo është gjëja që ju të kthehet kur gjërat shkojnë keq.
Max Pra, char është ajo që ne jemi duke përdorur për të përfaqësuar diçka
si NULL ose getchar.
>> Audienca: Pra, nëse ju jeni të testimit getchar, mund të ju vetëm vënë NULL?
A do që të bëjë një ndryshim?
>> DAN: Ju nuk mund vetëm të kontrolloni NULL.
Ju do të duhet të kontrolloni max char, sepse Vlera e kthyer nga funksioni është
një karakter jo një akrep.
Po?
>> Audienca: Kjo pyetje kërkon për gjatësinë string.
A do të përfshijnë karakterin NULL?
>> DAN: Jo.
Dhe kjo është në të vërtetë se si gjatësia string e di për të ndaluar për shkak se ajo shkon përmes
array juaj i karaktereve deri ai sheh një karakter NULL.
Dhe pastaj do të thotë, të gjithë e drejtë, unë jam bërë.
>> Audienca: [padëgjueshme] pesë?
>> DAN: Përshëndetje do të ishte pesë.
Yep.
Pra vargjeve janë të vazhdueshme blloqet e RAM.
Ata kanë qasje të menjëhershme duke thënë emrin e grup dhe më pas, në kaçurrel
formatimin e teksteve, çfarëdo indeksi që ju doni të shkoni për të, ata janë të indeksuar nga zero deri
gjatësia e vektorit minus 1.
>> Dhe ata janë deklaruar nga lloji i gjë që ju jeni ruajtjen në
array, emrin e array, dhe më pas pavarësisht nga madhësia është i asaj grup.
Pra, kjo është një koleksion char e gjatësisë gjashtë që ka këto vlera.
Po?
>> Audienca: [padëgjueshme]?
>> DAN: Po.
>> Audienca: [padëgjueshme]?
>> DAN: Nëse ju keni se çfarë po ndodh në bërë tashmë array.
Kështu që ju mund të specifikoni këtë vend si, thonë, char, pavarësisht nga emri i juaj
array është, kllapa bosh barabartë kaçurrel mbajtëse H presje E comma comma L L comma
Karakteri O presje NULL dhe tiranta kaçurrel.
Kjo do të punojnë edhe si një deklaratë.
>> Audienca: [padëgjueshme]?
>> DAN: Pastaj ju duhet të keni Madhësia e bërë tashmë.
>> Audienca: [padëgjueshme]?
>> DAN: Po.
Të gjitha righty.
Argumentet të linjës së komandës janë një mënyrë e duke marrë të dhëna nga përdoruesi si
Argumentet në kryesore.
Main merr dy argumente.
Numri i argumenteve që është duke u kalonte vija e komandës dhe a
vektor string ose një grup string të gjitha argumenteve.
>> Pra, nëse unë, të themi, i quajtur një funksion të tillë si a dot nga 1 hapësirë, 2 hapësirë, tre,
argc do të jetë 4.
Dhe ARGV 0 do të ishte një dot jashtë.
Argv1 do të jetë 1.
argv2 do të jetë 2. argv3 do të ishte 3, në këtë rast të veçantë.
Po?
>> Audienca: [padëgjueshme]?
>> DAN: Elementi i fundit në grup sepse array është argc gjatësi plus
një argb, element fundit është tregues NULL.
Është argc plus 1.
Pra, në rast se unë vetëm tha, ajo do të ARGV 0 është një dot jashtë.
ARGV 1 është 1. argv2 është 2. ARGV 3 është 3.
ARGV 4, e cila është e madhe se argc do të jetë NULL.
>> Dhe kjo është tregues NULL.
Po.
Dhe kjo është për shkak se vargu është një yll char është një akrep.
Kështu që ajo duhet të jetë e njëjtë lloji.
Po?
>> Audienca: Dy pyetje.
Pra një, çfarë është dallimi në mes këtë dhe getString tjetër se një lloj
në motor përdorues?
Dhe dy, ajo është e ruajtur në kujtesa juaj i fundit?
Pra si, getString do të jetë [e padëgjueshme]?
>> DAN: Ku është ajo ruhet?
Unë nuk e di se ku është ruajtur.
>> Audienca: Pra, në të vërtetë, ju e dini se si çdo funksion ju telefononi atë e argumente
janë ruajtur në rafte?
Pra argc dhe ARGV janë argumente të kryesore dhe ata janë në rafte, apo me të vërtetë
vetëm mbi atë që ju mendoni si fillimi i rafte.
Cila ishte pjesa tjetër e pyetjes?
>> Audienca: Pra, çfarë është [e padëgjueshme]?
>> DAN: Po, kjo është vetëm një mënyrë të ndryshme për të marrë të dhëna nga përdoruesit.
Pak më të efektshme dhe të këtij dikujt kjo është handier për Scripts sepse ju
vetëm mund të kalojë argumente tek Qendrori tuaj Funksioni në vend që të presin
për përdoruesit nëse ju nuk keni ndonjë përdorues.
>> Audienca: Dhe vërtet, merrni strings do të ishte [e padëgjueshme].
Ajo do të ruajë gjëra që ju nevojitet.
>> DAN: Po?
>> Audienca: [padëgjueshme]?
>> DAN: Po, ARGV 0 gjithmonë përfshin dot plagë e thirrjes së funksionit.
Po?
>> Audienca: [padëgjueshme]?
>> DAN: Po, secili nga argumentet janë përfundoi në karakter NULL, sepse ata
janë vargjet.
>> Audienca: [padëgjueshme]?
>> DAN: Po, ARGV argc është një tregues NULL.
>> Audienca: [padëgjueshme]?
>> DAN: Oh yeah.
Po, më vjen keq.
>> Audienca: Pra, [e padëgjueshme]?
>> DAN: Pra, pyetja është, nëse keni pasur Komanda linjë dot zvogëlojë një pikë nga 1, 2,
do numri i linjës së komandës argumente të jenë dy apo do të ishte tre?
>> Audienca: Unë mendoj se kjo nuk ka me të vërtetë rëndësi.
Unë priren për të thënë, oh, ju nuk e kalojnë çdo komandë argumentet linjë kur,
natyrisht, ju të quajtur funksionin.
Kështu që unë priren të me zë të përjashtuar funksion nga vija e komandës
argumente edhe pse kjo është përfshirë në ARGV.
>> DAN: Por në qoftë se ajo ishte në testin -
vërtet - dhe edhe në qoftë se ju thonë diçka si argc barabartë 3,
ju jeni në gjendje të sigurt.
Po?
>> Audienca: [padëgjueshme]?
>> DAN: Unë mendoj se në qoftë se në vend të duke e quajtur këtë në argc dhe string ARGV kllapa
por mbajti të njëjtat lloje dhe vetëm e quajti ata diçka të ndryshme si një
dhe b, do të ishte ende punë?
Dhe kjo do të punojë ende, ju do të vetëm -
në vend të përdorimit argc - ju do të përdorë dhe b.
Po?
>> Audienca: [padëgjueshme]?
>> DAN: Pra, pyetja është getString është duke shkuar për të ruajtur kujtesën në grumbull
sepse getString është char *.
Ajo ruan kujtesës në grumbull, sepse atë e quan tani malloc brenda aktual
zbatimin e getString.
OK, të lëvizin.
>> Sigurimit.
Pra, që të jetë me të vërtetë të sigurtë, ju të mbështetet në nr një dhe ju lejon askush qasje në ndonjë
e informacionit tuaj, cila është arsyeja pse të gjithë ndërton makinat e tyre,
sistemet e tyre të operimit, të gjithë e tyre Programet nga zeroja, dhe padyshim
mos lidheni me çdo makina të tjera nepermjet internetit.
Pra, kompjutera janë të pasigurt.
Ata me të vërtetë janë.
Ne duhet të besojmë njerëz të tjerë.
>> Dhe ideja e sigurisë është se ju jeni duke u përpjekur për të kufizuar sasinë e
besim që ju duhet.
Dhe një nga mjetet që ju bëni atë është me anë të kriptografisë.
Kriptografia është, në thelb, ne kemi sekrete.
>> Ndonjëherë ne kemi për të kaluar sekretet tona së bashku me, të themi, në internet ose
gjëra të tjera.
Dhe ne nuk duam njerëzit të dini këto sekrete.
Pra, ne encrypt sekretet tona në një mënyrë të që ne shpresojmë askush nuk mund ta kuptoj.
>> Pra, ne e përdorur -
përmes rrjedhës së kësaj klase -
gjëra të tilla si shifër Cezarit dhe [Ngan], të cilat janë të dyja shumë shumë
mënyra e pasigurtë të encrypting gjëra.
Ata janë të lehtë për të kuptoj se çfarë ata janë dhe çfarë sekretet tuaja.
Bota reale përdor shumë më tepër Skemat e komplikuara encryption.
Dhe ne nuk do të marrë në shumë më tepër se kaq.
>> Debugging.
Gdb është më e mira.
Unë jam duke shkuar për të theksuar këtë përsëri.
Përdorni gdb gjithë kohës çdo herë ju keni një problem.
Komandat që janë të dobishme në gdb janë të thyer, të cilat ju të kalojë ose një linjë të
numrin, një emër funksion, në thelb ku në kodin tuaj që ju doni të ndaluar,
dhe të jenë në gjendje për të marrë kontrollin.
>> Printo merr një ndryshore dhe printime nga çdo gjë që është e ndryshueshme në se
pikë në ekzekutimin tuaj.
Next lëviz Ekzekutimi tuaj përgjatë një hap.
Dhe hapat e hap brenda një funksion në ekzekutimin tuaj.
>> Gjëra të tjera janë drejtuar, e cila është se si ju në të vërtetë të drejtuar kodin tuaj.
Vazhdo merr të gjitha hapat e nevojshme për të shkuar në pikën e ardhshme pushim.
Dhe ka shumë, shumë të tjerë.
Shikoni ata.
Ata janë të mëdha.
Po?
>> Audienca: [padëgjueshme]?
>> DAN: Po, e cila është një Rregullues.
Pra, një Rregullues është një program që ju lejon të korrigjoj programin tuaj.
Kjo nuk është një program i cili gjen mete për ju, edhe pse kjo do të jetë i madh.
>> Dhe e fundit për mua është search.
Kështu lloje të kërkimit që kemi biseduar lidhje në këtë klasë janë search lineare,
e cila është vetëm se ju shoh nga çdo element i hapësirës kërkimit, një
element në një kohë, derisa ju të gjeni atë që ju jeni duke kërkuar për ose deri sa të arrijnë
fundi i hapësirës kërkimit tuaj në të cilën moment ju them se ju nuk mund të gjeni
element që ju po kërkoni.
Dhe kjo merr në kohën më të mirë të vazhdueshme, cila eshte 0 nga 1 dhe në të keqe lineare
kohë, e cila është 0 i N.
>> Kërko Binary, e cila ka nevojë elemente të ndyrë.
Ju shkoni në mes të elementeve të tu, të parë nëse elementi që ju po kërkoni
është më e vogël se ose e elementit që ju jeni në mes.
Kjo është më e madhe, ju thoni se në fund e hapësirës e kërkimit tuaj është tuaj
vendndodhja aktuale, e mesme, dhe ju të rinisni procesin.
Në qoftë se kjo është më e vogël, ju duken thoni se - po, çfarë është lart?
>> Audienca: [padëgjueshme]?
>> DAN: Po.
Çdo lloj lloj që është mësuar në klasë është lojë e drejtë për testin.
>> [Të qeshura]
>> DAN: Dhe fakti që ju nuk keni pasur për të bërë atë për një problem të caktuar, është e drejtë
lojë për testin.
>> Audienca: A mund të shkojnë mbi atë se si për të -
>> DAN: Ajo do të jetë zhdukur gjatë.
>> Gjuha 2: Kodi aktuale për [Padëgjueshme] është në study.cs50.net.
Pra, nëse ju shikoni në problemin praktikë në faqen bashkojë e renditjes së
study.cs50.net, nuk është kodi për zbatimin bashkojë lloj.
Pra, ju nuk keni për të zbatuar ajo veten sonte.
Por sigurohuni që ju të kuptoni atë në vend se vetëm memorizimin atë.
>> Audienca: [padëgjueshme]?
>> Gjuha 2: Faqja merge lloj në study.cs50.net, ekziston një praktikë e
Problemi që, në qoftë se ju klikoni me problem, në fund ka nje
zgjidhje, e cila është bashkojë Zbatimi lloj.
Por sigurohuni që ju kuptoni atë në vend se vetëm memorizimin
apo kopjimit të saj poshtë.
>> Audienca: Dhe një të përkryer të vlefshme Problemi për provim do të ishte
diçka si këtu është një listë.
Çfarë e bën këtë listë duket si pas një hap i Zgjedhje lloji ose
lloj futje apo çfarëdo.
Një përsëritje e plotë të listës.
Pra, edhe në qoftë se ju nuk do të përfundojnë kanë nevojë për të Kodi për të, ju duhet të kuptoni atë
të mjaftueshme për të dini se si ajo do për të modifikuar ky grup.
>> DAN: Kjo është ajo për mua.
>> [Duartrokitje]
>> Lucas: Hey të gjithë.
Emri im është Lucas.
Unë do të flas për recursion, të gjithë llojet që ne kemi mësuar, dhe një
pak e të gjitha pointers.
OK?
Pra, para së gjithash, recursion.
Çfarë do të thotë për të thënë se një funksion është recursive?
>> Audienca: Thirrjet veten.
>> Lucas: OK, e quan veten, po.
Pra, si kjo foto, për shembull.
Është si foto brenda e një foto dhe kështu me radhë.
Kështu për shembull, ju mund të ketë - në Dan që ishte duke folur për kërkimin binar.
Një mënyrë në të cilën kërkimi binar është recursive është fakti se ju jeni
duke u përpjekur për të gjetur një numër.
Kështu që ju shkoni në mes.
Dhe pastaj ju kontrolloni nëse numrat atje në të majtë dhe në të djathtë.
>> Dhe pastaj nëse ju gjeni se numri është do të jetë në të majtë, është e njëjta
gjë si duke bërë kërkimin përsëri, por vetëm në të majtë të listës.
Pra, kjo është se si kjo tingëllon si ajo e gjithkund rekursive.
Pra, kjo është arsyeja pse ju djema keni recursive zgjidhje për merge lloj.
>> OK, kështu që këtu është një shembull.
Pra, le të themi se unë dua për të zgjedhur të gjitha numrat nga 1 deri në n.
Unë mund të kuptojë se shuma e të n Numri është n plus n minus 1 deri në 1.
Por atëherë, në qoftë se unë shoh n minus 1 plus n minus 2 plus 1, që është e njëjta
gjë të mbledhur numrat deri n minus 1.
Kështu që unë mund të them me shumën e një shumë të barabartë është e barabartë n plus shumën e n minus 1.
A ka kjo kuptim?
>> Dhe unë gjithashtu do të ketë diçka tjetër quajtur rastit bazë, e cila është se
shuma e numrave deri në zero do të jetë zero.
Pra, sa më shpejt që të shkoj në numrin zero, unë të ndaluar duke numëruar.
A ka kjo kuptim?
>> Kështu që këtu është një shembull se si Unë mund të zbatojë atë.
Kështu që unë kam këtë funksion në disa.
Kjo merr një n numër i plotë.
Kështu që këtu unë së pari të kontrolloni nëse n është pak a është e barabartë me zero.
Pra, nëse kjo është më pak ose e barabartë me zero, unë kthehet zero, e cila është rasti ynë bazë.
Përndryshe, unë vetëm mund të kthehen n plus shuma e numrave nga
një deri n minus një.
Kuptim?
OK.
>> Kështu që këtu është ajo që duket si.
Ju keni shumën e 2 të barabartëve 2 plus shuma e 1.
Dhe disa nga 1 eshte 1 plus shuma e 0, e cila është 0.
Kuptim?
Pra, nëse ne shikojmë në rafte e juaj Programi, kjo është ajo që duket si.
>> Së pari, ne kemi funksionin kryesor.
Dhe pastaj funksioni kryesor quajtur Shuma 2.
Dhe pastaj shuma 2 do të thotë, oh, shuma 2 është e barabartë me 2 plus shumën e një.
Kështu që unë të shtoni një shumë prej 1 deri në rafte.
Dhe shuma e 1 do të thërrasë shumën e 0, e cila është gjithashtu do të jetë shtuar
në pirg.
Dhe pastaj secili prej këtyre atyre që janë në krye të një tjetër duhet të kthehen
para se ato të tjera mund të mbajë.
>> Kështu për shembull, këtu, shuma e 0, së pari, do të kthehet 0.
Dhe pastaj të zgjidhni shumën prej 1.
Atëherë shuma e 1 do të 1 kthehen në shumë prej 2.
Dhe në fund, shuma e 2 po shkon të kthehen 3 në kryesore.
A ka kjo kuptim?
>> Është me të vërtetë e rëndësishme për të kuptuar se si rafte është duke punuar dhe të përpiqen për të
të parë nëse kjo ka kuptim.
OK, kështu që zgjidhja.
Pra, pse është zgjidhja e rëndësishme, në radhë të parë?
Pse duhet të kemi kujdes?
Çdokush?
Më jepni një shembull?
Po?
>> Audienca: [padëgjueshme].
>> Lucas: Po, OK.
Kështu që ju mund të kërkoni në mënyrë më efikase.
Kjo është një mënyrë e mirë.
Kështu, për shembull, ne kemi shumë gjërat, në fakt, në jetën tonë që
janë të renditura.
Për shembull, fjalorë.
>> Është shumë e rëndësishme që të ketë të gjitha fjalë në një lloj mënyrë që ne
mund të hyni lehtë.
Pra, kjo është ajo që ai thoshte.
Ju mund të kërkoni në mënyrë më efikase.
Mendoni sa e vështirë do të ishte që të ketë një fjalor ku fjalët janë në
mënyrë të rastit.
Ju do të duhet për të parë, shumë e shumë, çdo fjalë të vetme deri sa ju të gjeni
Fjala që ju po kërkoni.
>> Nëse jeni duke përdorur Facebook gjithashtu, kur ju jeni duke kërkuar në miqtë tuaj, ju jeni
do të shohim se Facebook vënë tuaj Miku më afër është në krye të atyre
se ju nuk flisni me aq shumë.
Nëse ju shkoni gjatë gjithë rrugës për në fund të lista e juaj e mik, ju jeni do të shohim
njerëzit që ju ndoshta nuk e bëni edhe mos harroni se ju jeni miq me.
Dhe kjo është për shkak se llojet Facebook miqtë tuaj të bazuar mbi atë se si
të mbyllur ti je për ta.
>> Pra, organizimin e të dhënave.
Gjithashtu Pokemon.
Kështu që ju shihni se të gjitha Pokemons kanë numra.
Dhe kjo është si një i lehtë mënyrë për të marrë të dhëna.
>> Audienca: Përdorimi Pokemon.
>> Lucas: Po.
>> Audienca: [padëgjueshme].
>> Lucas: Yep.
OK, kështu që zgjedhja lloj.
Përzgjedhja lloj do të zgjidhni vlera më të vogël unsorted e një listë çdo
Koha në çdo përsëritje.
Kjo është lloj i si lloj që ju bëni në kokën tuaj, kur ju jeni duke u përpjekur për të
lloj një listë në dorë.
>> Në thelb, të gjithë ju të bëni është të shikoni për numrin më të vogël.
Ju vënë atë në listën e renditura.
Dhe pastaj ju shikoni për ardhshëm numri më i vogël.
Dhe pastaj ju të vazhdojmë të bëjmë se dhe kështu me radhë.
>> Pra, zgjedhja lloj është në thelb ju zgjidhni çdo herë më të vogël
Vlera e unsorted.
Vendos në fund të renditura Pjesa e lista.
Dhe të vazhdojmë të bëjmë këtë.
Pra, le të shohim se çfarë shpejt kjo duket si.
Kështu që këtu është renditur dhe lista unsorted.
>> Pra, për të renditura të listës, kjo është fillimisht bosh.
Dhe atëherë unë jam duke shkuar për të zgjedhur Numri i vogël here, e cila është 2.
Kështu që unë të marrë numrin 2 dhe kam vënë në pjesën e përparme të lista.
Dhe pastaj unë të shikoni për tjetër më të vogël element, i cili është 3.
Kështu që unë e vënë atë në fund i listës renditura.
Dhe pastaj unë të vazhdojmë të bëjmë atë.
Gjej 4 dhe e vënë atë në fund.
Gjeni 5 dhe e vuri atë në fund.
>> Dhe të shohim se si gjithë ato kohë që Unë jam duke thënë se të vënë atë në fund është,
në thelb, shkëmbejnë dy vlera.
OK?
Dhe pastaj e fundit, ju vetëm kanë një element më shumë.
Pra, është e renditura tashmë.
>> OK, kështu që futje lloj.
Futja lloj që ju jeni do të ketë edhe ajo gjë e ka një renditura dhe
një listë unsorted.
E vetmja gjë është se çdo herë që ju jeni duke shtuar një element të zgjidhet
listë, ju vetëm të vini element që është përballë lista pa klasifikuar.
Dhe pastaj ju jeni do të gjeni atë pozicionin ajo duhet të jetë në të renditura
Pjesa e lista.
>> Le të shohim se çfarë kjo është kështu kjo e bën më shumë kuptim.
Kështu që fillimisht, për shembull, unë jam duke u përpjekur për të futur numrin e tre në
renditura pjesë lista.
Pra, lista nuk ka asgjë.
Kështu që unë mund vetëm të vënë numrin 3.
>> Tani, unë dua të shtoj numrin 5 të pjesa e renditura në listë.
Kështu që unë shoh në numrin 5.
Unë konstatoj se kjo është më e madhe se 3.
Kështu që unë e di se ajo duhet të jetë pas 3.
Kështu që unë vë 3 dhe 5.
>> Atëherë unë dua të futur numrin 2.
Unë konstatoj se numri 2 është në të vërtetë i fundit atëherë të dy 3 dhe 5.
Kështu që unë në fakt duhet të vënë atë të gjithë Mënyra në fillim të listës.
Pra, unë kam për të, lloj, ndryshim të gjithë elemente në listën e renditura në mënyrë që unë mund të
të bëjë vend për numrin 2.
>> Pastaj unë shoh numrin 6.
Unë shoh se ajo duhet të jetë pas 5.
Kështu që unë e vënë atë atje.
Dhe së fundi, unë shoh në numrin 4.
Dhe unë njoftim sa duhet jetë midis 3 dhe 5.
Dhe pastaj kam vënë atë atje dhe zhvendosje të gjitha elementet e tjera.
Kuptim?
>> Bubble Sort.
Pra flluskë lloj është në thelb ajo që ju jeni do të bëjmë - ne e quajmë atë flluskë
lloj për shkak se ju shkoni nëpër lista - është në fakt më mirë në qoftë se unë vetëm të tregoj
ju pëlqen kjo -
dhe ju do të jeni për të krahasuar numrat e ngjitur.
Dhe ju jeni do të bie në ujdi tyre pozicione në qoftë se ata nuk janë
në mënyrë të drejtë.
>> Pra, në thelb, ajo që do të ndodhë është këtu, për shembull,
ju keni 8 dhe 6.
Ju e dini se rendi renditura do në të vërtetë të jetë e 6 dhe 5, e drejtë?
Pra, ju jeni do të bie në ujdi urdhra.
Pastaj unë shoh 8 dhe 4 here.
Dhe unë bëj të njëjtën gjë.
I bie në ujdi përsëri.
Dhe së fundi, 2 dhe 8.
Unë gjithashtu bie në ujdi tyre.
>> Ajo që quhet Bubble Sort sepse pas secilin nga këto iterations, në të vërtetë,
numri më i madh në listën e merr të gjithë mënyrë që fundi i lista.
A ka kjo kuptim?
Për shkak se ajo mban shkëmbejnë atë dhe duke lëvizur atë në të djathtë.
>> OK, kështu që kjo është përsëritje e dytë.
Do të ishte e njëjta gjë.
Unë do të bëj një shkëmbim dhe atëherë e fundit.
Unë se nuk ka këmbime dhe lista të zgjidhet.
Pra, në Bubble Sort, ne thelb mbajtur duke shkuar nëpër lista dhe të shkëmbejnë
gjërat deri sa të vëreni se unë nuk e kam bërë çdo këmbime bërë atë përsëritje, të cilat
do të thotë se lista është renditur tashmë.
Kuptim?
>> Le të flasim pak në lidhje me kandidimin kohë.
Pra mbani mend ju djema Big O, Omega dhe Theta?
Po?
OK, ajo që është e Big O, në radhë të parë?
>> Audienca: [padëgjueshme].
>> Lucas: Po, është quajtur një rast më të keq Runtime, e cila vetëm do të thotë se është e
se sa ju presin programin për të marrë për të kandiduar.
Si, në drejtim të -
në këtë rast - n.
Numri i elementeve në lista në rastin më të keq.
Si, në rastin më të keq të mundshëm.
>> Pra, për Bubble Sort, për shembull, ne kemi O Big të sheshit n.
Pse ne kemi se?
Pse është flluskë Renditur Big katror O n?
>> Audienca: [padëgjueshme].
>> Lucas: Po, kështu rastin më të keq do të jetë se unë do të duhet të bëni iterations n.
Pra, secili nga iterations do të sjellë elementin më të madh deri në fund
lista.
Pra, rasti më i keq është se unë kam për të bërë atë gjë n herë.
Dhe për secilën nga ato kohë, më duhet të të bëjë këmbime n, sepse unë kam për të krahasuar
çdo dy elemente.
Pra, kjo është arsyeja pse ajo është katror n sepse kjo është n herë n.
>> Pastaj, zgjedhja lloj është gjithashtu n katror sepse, për çdo ripërsëritje, më duhet të
shikojmë në çdo element të vetëm në lista.
Dhe pastaj gjeni më të vogël, që do të thotë se unë duhet të
të parë përmes elementeve n.
Dhe unë duhet të bëni që herë n sepse Unë kam për të zgjedhur të gjitha elementet e n.
>> Një lloj futje është gjithashtu n katror sepse skenari rastin më të keq do të
të, e, unë kam për të futur numrat n, apo jo?
Kështu që unë tashmë e di që unë jam duke shkuar që të ketë iterations n.
Por, për secilin nga këto numra, në qoftë se kam pasur për të parë në të gjithë numrat në
lista të renditura dhe të vënë atë të gjithë rrugën në para, që do të jetë n katror
sepse kjo do të n herë n përsëri.
Kuptim?
Po në lidhje me omega?
>> Audienca: [padëgjueshme].
>> Lucas: Kjo është skenari më i mirë.
Pra, kjo është si, në shumë herë për sorting, skenar rasti më i mirë është
kur lista është e renditura tashmë.
Pra, ju vërtetë nuk kanë për të bërë asgjë.
Bubble Renditur ka më të mirë Skenari i n.
A e dini ju djema pse?
>> Audienca: [padëgjueshme].
>> Lucas: Po, në qoftë se ju mbani gjurmët e nëse të dhënat racion kishte ndonjë këmbime apo
jo, nëse keni diçka si grup për të e vërtetë në qoftë se ka pasur një përsëritje, nëse
Lista është renditur tashmë, në thelb, çfarë do të ndodhë është që unë jam duke shkuar për
të përpiqet të bie në ujdi çdo dy elemente të ngjitur.
Unë jam duke shkuar për të parë se nuk ka këmbime.
Dhe unë vetëm të kthehet menjëherë.
>> Pra, kjo do të thotë se unë vetëm kishte për të shkoni nëpër lista një herë.
Pra, kjo është n sepse unë shoh në n elemente.
Pse Zgjedhja lloj n katror?
>> Po, edhe në qoftë se lista është e renditura, për çdo përsëritje e përzgjedhjes lloj, unë
kanë për të zgjedhur elementin minimale.
Kështu që do të thotë se unë duhet të shikoni jashtë në të gjitha elementet në unsorted
lista dhe për të gjetur minimale për çdo ripërsëritje.
A ka kjo kuptim?
>> Dhe Shpata futje është n sepse në rast se unë jam duke u përpjekur për të futur
numrat dhe të gjithë numrat, kur unë përpiqen për të futur ato, unë shoh se ata
janë në pozicionin e duhur.
Unë nuk kam për të shkuar të kontrolluar të gjitha të tjera numrat në listën e paklasifikuar.
Pra, kjo është arsyeja pse ajo do të jetë n.
Kuptim?
Dhe çfarë është theta?
>> Audienca: [padëgjueshme].
>> Lucas: Çfarë, sorry?
Thonë se ai përsëri.
>> Audienca: [padëgjueshme].
>> Lucas: Pikërisht.
Kështu që ju mund të shihni se vetëm përzgjedhja ruhet në Merge lloj kanë thetas.
Dhe kjo është për shkak se ju keni vetem theta Nese dy O madh dhe Omega janë njëjtë.
OK.
Dhe së fundi, bashkohen lloji është në log n.
>> Dhe pastaj, si Dan u thënë: Merge lloj është lloj si të njëjtën mënyrë se
ju bëni kërkim binar.
Pra, ju merrni listën.
Dhe ju jeni do të prerë në gjysmë.
Dhe pastaj ju prerë ata në gjysmave të vogla.
Dhe atëherë ti bashkojë ato.
Ju djema mos harroni se, e drejtë?
OK, ndërsa Pali i thoshte.
>> OK, pointers.
Pra, çfarë është një akrep?
>> Audienca: [padëgjueshme].
>> Lucas: Një adresë.
OK.
Unë e di se David tregon një bandë e videot e Binky dhe gjëra të treguar
njëri tjetrin.
Por unë doja të mendoj për pointers si thjesht një adresë.
Pra, kjo është një variabël që do për të ruajtur një adresë.
>> Pra, kjo është vetëm kjo variabël të veçantë që është katër bytes e gjatë.
Mos harroni, se tregues për çdo gjë është e gjithmonë katër bytes të gjatë për 32-bit tonë
makinë kështu që në rastin e aplikim.
Dhe vetëm ajo ka vendndodhjen i një brendësi ndryshueshme e saj.
>> OK, kështu që nuk ka këtë kujtim, në thelb.
Pra, secili bllok i kujtesës në të vërtetë ka një etiketë, e cila është adresa e
kujtesës slotty.
Kështu që do të thotë se unë mund të ketë një tregues për të treguar
ndonjë nga këto adresa.
Pra, arsyeja pse ne do të përdorim pointers është në qoftë se unë duhet të mbani mend vendndodhjen
se një variabël të veçantë është një kujtim.
>> Dhe ju djema mos harroni se një nga ata raste ishte në qoftë se unë kam një funksion
në qoftë se unë në fakt kam dua që ju të swap për reals, unë në fakt
duhet të dërgoni një akrep.
Nuk është e ndryshueshme.
A e mbani mend se ju djema?
Dallimi në mes -
çfarë është emri?
Thirrja me vlerë dhe duke e quajtur duke iu referuar, apo jo?
>> OK, po.
Pra, thërret me vlerë.
Kur ju thjesht dërgoni një ndryshore të funksionojë ju jeni vetëm duke dërguar një vlerë.
Pra, ju jeni në të vërtetë duke dërguar një kopje e variablit.
Dhe programi juaj nuk mund të kujdesen më pak për në qoftë se të njëjtën ndryshueshme në fakt
bën një kopje.
>> Dhe duke e quajtur me referenca do të thotë se Unë jam në të vërtetë i dërguar një kopje të
tregues për atë ndryshore.
Pra, kjo do të thotë se unë jam i dërguar vendndodhja e kësaj variable.
Pra kuptim unë kam vendndodhjen e ndryshueshme, kur unë e quaj funksionin
me pointers, unë jam në gjendje që në fakt ndryshoni të dhënat që ishte në kryesore.
Kuptim?
>> Edhe pse, akrep është një kopje, akrep ende ka adresën e vërtetë të
variabël që unë dua të ndryshojë.
Kuptim?
>> Pra, duke krijuar pointers.
Mos harroni, akrep gjithmonë kanë lloji që është e vënë në
për të dhe pastaj një yll.
Dhe pastaj të vendosni emrin.
Pra, mbani mend se sa herë që ju keni çfarëdo yll, është si një tregues për
se çdo gjë që e ndryshueshme lloji që keni pasur.
>> Kështu që këtu në yll, për shembull, është e nje tregues dhe një numër të plotë.
Dhe pastaj yll char është një tregues yll char dhe kështu me radhë.
Po?
>> Audienca: Po në qoftë se ne kemi një tregues për n në yll x.
Unë e di që krijon një tregues për x.
A do të deklarojnë x një numër të plotë?
>> Lucas: OK, kështu që kur ju thoni yll n x, ju nuk jeni duke krijuar një tregues për një
x ndryshueshme.
Ju jeni duke krijuar një pointer quajtur x.
>> Audienca: [padëgjueshme].
>> Lucas: Pra, kur them yll n x, unë jam i duke thënë, hej, në kujtim, unë jam duke shkuar për
të marrë një nga këto tre kuti.
Dhe unë jam duke shkuar për të thënë se se do të jenë x, i cili është
do të jetë një akrep.
Dhe diçka interesante në lidhje me pointers është se ne themi se ata kanë
4 bytes për një makinë 32-bit.
Dhe arsyeja për këtë është për shkak se 4 bytes janë 32-bit.
>> Dhe makina që janë 64 bit të vërtetë kanë Pointers adresat
që janë 64 bit të gjata.
Pra, ai thjesht do të thotë se madhësia e Adresat në makinë është e ndryshme.
>> Pra Referenca dhe Dereferencing.
Ka dy operatorë që ju djema duhet të mbani mend.
E para është simbol.
E dyta është yll.
A nuk merrni hutuar deri në atë yll dhe kjo star sepse mos harroni se, në
këtë rast, ju duhet yll n.
>> Është si një gjë të gjithë së bashku.
Nuk ka hapësirë yll n.
Pra, kjo do të thotë se kjo është lloji.
Mos harroni, se kur ju keni ylli ndryshueshme, ju jeni
duke folur për llojin.
>> Kur ju keni vetëm yll dhe pastaj emri i variablit, kjo do të thotë se
ju jeni dereferencing në treguesin, i cili do të thotë se ju jeni duke kërkuar në
akrep, duke gjetur adresën kjo është duke treguar, duke shkuar në atë adresë,
dhe duke kërkuar në sa herë që ju keni atje.
Kështu që unë them studentëve që kur ju keni yll, ju duhet të mendojnë se është e
shkurtim të përmbajtjes së.
>> Pra, nëse ju keni një tregues dhe ju të bëjë treguesin yll, kjo është
përmbajtja e treguesin.
Kështu që ju shkoni në çfarëdo qoftë ajo është duke treguar dhe të kërkoni në përmbajtjen konstante.
Dhe simbol është i njëjtë gjë si adresë të.
>> Pra, nëse unë kam një të ndryshueshme a - si, le të të them se kam bërë int një është e barabartë me 3 -
në qoftë se unë dua të gjej adresën e që ndryshueshme një kujtim, unë vetëm mund të bëjë
zëvendësojeni me një.
Pra, kjo është adresa e një.
Kuptim?
>> Kështu që këtu është një shembull.
Kjo është e humbur int b dhe c int.
Pra int një është e barabartë me 3 mjete që Unë jam duke shkuar për të shkuar në kujtesën.
Dhe unë jam duke shkuar për të gjetur një vend i caktuar dhe vënë numrin 3 këtu.
>> Dhe pastaj int b është e barabartë me 4.
Unë jam duke shkuar për të bërë të njëjtën gjë.
Shko tek kujtesës dhe të vënë një numër 4 në një kuti.
Dhe int barabartë me 5.
Gjeni një tjetër kuti dhe të vënë një numër 5.
>> Pra, çfarë është kjo linjë duke bërë jashtë? n star pa barabartë ampersand një.
Pra, para së gjithash, n pa yll.
Çfarë është ajo duke bërë?
>> Audienca: [padëgjueshme].
>> Lucas: Po, kështu që n pa yll, së pari, deklaron një tregues të quajtur pa.
Dhe pastaj është caktuar vlerën e që tregues të jetë adresa e një.
Pra, zëvendësojeni me një.
Pastaj, në qoftë se bëj yll BP, çfarë është një pb yll?
>> Oh, sorry.
Kjo gjithashtu mungon. n yll pb.
Unë do të thotë yll pc.
Unë jam aq i keq.
Është e njëjta gjë.
Por tani unë jam i mirë ar duke krijuar një tregues të b dhe pastaj një tregues për të c.
Po?
>> Audienca: [padëgjueshme]?
>> Lucas: Po.
Pra, nëse ju shkoni në kujtesën dhe ju shkoni në kuti që është i destinimit për të pa,
ju jeni në të vërtetë do të shohin një adresë të një.
OK?
Po?
>> Audienca: [padëgjueshme]?
>> Lucas: Po, akrep është një adresë.
Kurrë mos harroni se.
Është si më e rëndësishme pjesë rreth pointers.
Ka ruajtjen dhe adresa për rreth ndryshueshme.
Çdo gjë tjetër?
Çdo pyetje të tjera?
OK.
>> Pra Pointers dhe Vargjeve.
Mos harroni se kur bëj int array 3, në thelb, ajo që unë jam duke bërë është që unë jam, lloj
i, duke deklaruar në një tregues.
Pra array është lloj si një tregues për një vend të veçantë në kujtesën e në të cilat unë
ndarë tre lojëra elektronike për numrat e plotë.
A ka kjo kuptim?
>> Pra, kur Unë int array 3, atë që unë jam duke bërë, në thelb, po krijon tre
lojëra elektronike në kujtesën.
Kështu që unë vetëm të gjejnë tri lojëra elektronike në kujtesë.
Pra, nëse i bëj, pra, një grup yll, ajo në thelb do të thotë përmbajtja e array,
që do të thotë unë fshihet treguesin, shkoj në atë vend që është e treguar për të,
dhe kam vënë numrin një.
>> Dhe pastaj, në qoftë se bëj koleksion star plus 1, kjo është e njëjta gjë si duke bërë koleksion
kllapa një, e cila vetëm do të thotë të shkoj për të vendi se është vënë në.
Dhe pastaj plus 1 bën më zhvendoset një pozicion.
Kështu që unë shkoj në këtë pozitë, në të vërtetë, dhe vënë numrin dy.
>> Dhe pastaj, në fund, kur të bëj array plus 2, unë shkoj në ku
treguar Array-së në të.
Dhe pastaj unë të shkojë në blloqe kujtesës.
Dhe pastaj kam vënë numrin tre këtu.
Po?
>> Audienca: array Pra yll është thjesht duke thënë se pika e parë.
Dhe ju mund të shtoni 1, vetëm për shkak se ne jemi vetëm të vërtetë
referenca atë adresë e parë.
>> Lucas: Po.
Pse nuk kemi, për shembull, thonë koleksion 0, array 1, dhe array 2?
Unë jam duke thënë, pse do të bëni 0, 1, 2, 3 vend nga 1, 2, 3?
Një nga arsyet është, një, kompjuter programuesit preferojnë për të filluar
numëruar nga 0.
Dy është për shkak se kur ju bëni koleksion 0, është e njëjta gjë si duke bërë koleksion
plus 0, që do të thotë unë shkoj në se pozita, dhe unë nuk e bëj
kaloni ndonjë bllokun e memories.
Kështu që unë nuk lëvizin asnjë bllokun e memories.
Po?
>> Audienca: [padëgjueshme]?
>> Lucas: Pra, ajo është pyetur se çfarë është dallimi në mes duke bërë
këtë apo duke bërë malloc.
Një nga dallimet është se int array 3 është duke krijuar një
array në rafte.
Kur unë bëj malloc, ajo krijon në grumbull.
A ka kjo kuptim?
>> Pra, si nuk malloc të vërtetë punojnë?
Pra, pse nuk kemi nevojë edhe për të përdorin malloc?
Lloj juaj përpilues i figurave nga të gjitha variablat që ju të deklaruara.
Ai krijon hapësirë për të gjithë Prej tyre në rafte.
Pra, të gjitha variablave tuaj janë duke shkuar të jetë diku në rafte.
Kështu që këtu është e mjedisit të ndryshueshëm.
>> Pra, në thelb, hapësirë për ato variabla në kujtim është ndarë në
përpilojnë kohë.
Pra, kjo do të thotë se kompjuteri juaj ka të dinë të gjithë atyre variablave
paraprakisht.
Ajo nuk ka nevojë të dini se çfarë vlera ju do të jeni për të vënë në to.
Por duhet të dini se si sa memorie keni nevojë.
>> Por tani le të themi se, për shembull, ju jeni duke krijuar një rrjet ose duke marrë një
string që ju jeni duke marrë nga përdoruesit.
Ju nuk e dini se sa kohë string do të jenë, per shembull.
Pra, ju nuk e dini saktësisht se sa blloqe kujtesës ju ndajë, apo jo?
>> Pra, kjo nuk ka të vërtetë kuptim për ju për të thënë të vënë 100 karaktere.
Dhe pastaj çfarë nëse përdoruesi shkruan 150?
Ju do të jeni të dehur.
>> Pra, në thelb, ju nuk mund të jeni i sigurt se si sa memorie keni nevojë që të ndajë
kur të hartojnë programin.
Ju vetëm e di se në kohë të kandidojë.
Pra, kjo është arsyeja pse ju keni të tog.
Pra grumbull do të ketë memorie se ju jeni caktimin e gjatë
Kohëzgjatja e programit të running.
>> Pra, në thelb, kur ju bëni malloc, çfarë ju jeni duke bërë është për ndarjen e kujtesës në
Runtime, që do të thotë se ju jeni duke vendosur të drejtën në atë moment që ju
duhet të ketë atë memorie.
Pra, kjo është kur ju jeni të ndarjes atë.
A ka kjo kuptim?
>> Pra mbani mend, rafte ka variabla që janë krijuar në kohën e kompilimit.
Dhe pastaj grumbull ka variabla që janë krijuar si ju shkoni
me malloc, për shembull.
>> Audienca: [padëgjueshme]?
>> Lucas: Pra getString është do të thërrasë malloc.
Më lejoni të flas për malloc, dhe Unë do të shpjegojë getString.
Pra malloc është e njëjta gjë si përcaktimin e memorjes.
Pra, kjo do të ndajë kujtesës në grumbull.
Dhe ajo do të kthehet një tregues për ku se kujtesa është ndarë në.
>> Pra, kur ju bëni -
këtu për shembull -
n yll akrep.
Dhe pastaj akrep barabartë malloc Madhësia e herë inç 10.
Unë jam krijuar një akrep.
Dhe atëherë unë jam duke i dhënë asaj tregues të vlera të kursorit që malloc
është duke i dhënë mua.
>> Kështu që unë jam duke kërkuar malloc mund të ju ndajë hapësirë për 10 integers.
Kjo është ajo që është e thënë.
Dhe malloc më jep përsëri një tregues për atë vend.
Kuptim?
OK.
Unë Dhe getString është, në thelb, duke bërë një thirrje për malloc kështu që ju mund të ndajë
kujtesës gjatë duhur.
>> Gjithmonë mos harroni të kontrolloni për null sepse malloc do të kthehen null
në qoftë se ajo nuk mund të siguroj kujtesë.
Le të thonë se ju kërkoni për një qesharake shuma e kujtesës.
Kompjuteri juaj nuk do të jetë në gjendje të ndajë se shumë.
>> Pra malloc është vetëm do të kthehen null.
Pra, gjithmonë mos harroni të kontrolloni nëse tregues që ju mori nga malloc është
null apo jo sepse, në qoftë se ajo është, ju mund të të dereferencing një tregues dhe
duke shkaktuar gabimet anësore.
Dhe së fundi, mos harroni kujtesën tuaj falas.
>> Malloc po krijon memorie në grumbull.
Dhe ju duhet të kujtesës të lirë para se programi përfundon.
OK, kjo është e gjitha për mua.
Na vjen keq, Rob.
Thanks.
>> [Duartrokitje]
>> Lucas: Çdo pyetje e fundit para se të vijë Rob?
Nuk ka?
Po?
>> Audienca: Unë nuk e shoh kjo linjë.
A keni ngarkuar atë akoma?
>> Lucas: Unë mendoj se Dave është ngarkimi atë së shpejti.
>> DAVE: Ajo do të jetë postuar.
>> Lucas: Do të jetë online.
>> Audienca: Është e deri.
>> Lucas: Kjo është up?
OK.
Po?
>> Audienca: [padëgjueshme]?
>> Lucas: Po, ju duhet të lirojë të gjithë kujtesës që është vënë në grumbull.
>> Audienca: [padëgjueshme]?
>> Lucas: Po.
Çdo herë që ju keni një malloc kulturës, ju duhet të keni një kulturë të lirë
pasi të keni ndaluar duke e përdorur atë ndryshore.
Pra malloc dhe të lirë janë gjithmonë bashku.
Miqtë e tyre më të mirë.
Po.
Rob?
>> Rob: Unë do të shkoj shpejt.
Dhe gjithashtu video do të vihet deri.
Unë kam mic në.
>> OK, kështu që javën e pesë gjëra.
Gjëja e parë që kemi është rafte.
Pra, mos harroni se ka vetëm një pirg kornizë për thirrje aktiv funksion.
Ne do të shohim se në një të dytë.
Dhe gjithashtu mos harroni se çfarë në të vërtetë shkon në çdo kuadër rafte do të jetë
variablat lokale të funksioneve tona, argumentet që janë miratuar në tonë
funksionet, së bashku me një çift gjëra të tjera që ju nuk e bëni me të vërtetë
duhet të shqetësohen për.
>> Kështu që këtu është një program shembull ku, Njoftimi, kryesore është printfing e kthimit
Vlera e foo 4.
foo është vetëm do të kthehen Vlera e bar 4 presje 6.
Dhe bar do të vënë disa lokale variable n barabarte me 4 herë 6.
Dhe pastaj kthehen n.
>> Pra, le të shohim në rafte të gjithë përsëritje aktual i këtij programi.
Pra, nuk ka fund të rafte tonë.
Mos harroni se rafte rritet.
Pra, në fund të rafte tonë, ne kanë një kornizë për rafte kryesore.
Kur programi fillon, kryesore është gjithmonë do të jetë në
fund të rafte tonë.
>> Dhe ajo që është brenda tonë rafte kornizë për kryesor?
Pra, edhe pse nuk ka lokale variablave të kryesore, si kam thënë më parë,
ne kemi argc dhe RGV duke marrë deri hapësirë brenda kornizës kryesore rafte.
Pra kryesore tani do të telefononi foo funksion.
Dhe kjo do të thotë foo do të merrni kuadrin e vet rafte.
>> Deri tani ne jemi në brendësi të foo funksion.
Dhe ajo që ka nevojë për të shkuar në kornizë foo-së rafte?
E pra, foo ka një n argumentin.
Dhe n është e barabartë me 4 pasi kjo është ajo kryesore është duke kaluar si argument Foo-së.
>> Deri tani foo do të thërrasë bar.
Çfarë është bar do të ketë brenda e "kornizës së saj rafte?
Ajo ka të barabartë me 4 x y barabartë në gjashtë.
Kjo nuk është e gjitha që ne do të kemi në kuadër rafte sepse bar
gjithashtu ka një variabël n lokal.
Dhe n ne jemi duke shkuar për të vendosur barabartë me 24.
>> Deri tani bar do të kthehet n.
Pra bar po kthehet 24 për kornizë foo rafte.
Dhe për shkak se bar tani po kthehet, se do të thotë ne jemi duke popping kuadrin rafte
për bar off i rafte.
Pra, të gjitha kujtesës se bar ka qenë duke përdorur tani është jashtë rafte.
>> Tani, foo është gjithashtu do për t'u kthyer 24 në kryesore.
Pra, tani që foo po kthehet, kujtesës se foo u përdorur në 'e saj
kornizë rafte është zhdukur gjithashtu.
Dhe tani, kryesor do të thërrasë printf.
Pra printf është vetëm një tjetër funksion.
Kur ne e quajmë printf, ajo do të jetë e një tjetër kornizë rafte për printf
thirrje funksion.
>> Çfarë jemi ne duke kaluar printf?
Kjo është ajo që do të shkojë në kuadrin e saj rafte.
Në shumë pak, ne jemi duke kaluar që përqind i backslash n dhe
argumenti 24.
Ajo mund të ketë më në të është e rafte kornizë printf nëse ndodh të jetë duke përdorur disa
Variablat lokale.
Ne nuk e dimë.
>> Por të gjitha që shkon në printf-së rafte kornizë.
Ajo do të ekzekutojë printf.
Pastaj printf është bërë.
Ai do të kthehet.
Së fundi, kryesore është bërë.
Kryesor do të kthehet.
Dhe pastaj programi ynë është bërë.
Po?
>> Audienca: A jeni duke parë [padëgjueshme]
Argumentet [padëgjueshme]
Parametrat?
>> Rob: Pra, ka një ndryshim delikate ndërmjet argumenteve dhe parametrave.
Dhe me të vërtetë, në të folurit e përbashkët, njerëzit priren për vetëm përzierje e tyre të gjithë kohën.
Por parametrat janë formale emrin nga gjërat.
>> Pra argc dhe ARGV janë Parametrat për kryesor.
Argumentet janë ato që ju të vërtetë të kalojë në të atyre parametrave.
Kështu që aty kur unë e quaj foo e 4, 4 është argumenti që unë jam duke kaluar in
Dhe n parameter, brenda foo, merr në vlerën 4
që nga 4 ishte argumenti.
>> Audienca: [padëgjueshme]?
>> Rob: n është një variabël lokale në bar.
n është ende lokale për të foo, por kjo është një parametër për Foo.
Kjo nuk është një variabël lokale.
Po?
>> Audienca: [padëgjueshme]?
>> Rob: foo është vetëm duke e quajtur bar dhe kthyer çfarëdo kthimit bar.
>> Audienca: [padëgjueshme]?
>> Rob: Po, vetëm për të parë të shumta rafte korniza.
Po?
>> Audienca: Pse u foo quajtur para printf?
>> Rob: Pse u foo quajtur më parë printf?
Kështu që unë mund të ketë, në vend të kësaj, bëhet diçka si int x barabartë foo prej 4
dhe pastaj të shtypura x.
Por në vend të kësaj, unë e kombinuar funksionin telefononi në argumentin printf.
>> Por vini re se ne nuk mund të vërtetë ekzekutuar thirrjen për printf deri ne
kuptoj se çfarë foo i 4 është.
Pra, ne jemi duke shkuar për të vlerësuar këtë.
Dhe vetëm një herë që është bërë do të kthehen dhe të vlerësojë këtë.
Po?
>> Audienca: Që të dy bar [padëgjueshme]
vlera, pse nuk kemi [padëgjueshme]?
>> Rob: Ata duhet të jenë krejtësisht të int.
Kjo nuk u kap gjatë kalon të shumta.
Kështu që ajo duhet të jetë bar dhe int int foo pasi që të dyja nga ata
po kthehen integers.
Pavlefshëm vetëm në qoftë se ata nuk do të kthehen vlerat aktuale.
Po?
>> Audienca: Nëse keni pasur një linjë më lartë kthimi, [e padëgjueshme]?
>> Rob: Një linjë mbi kthimin?
>> Audienca: Po.
Ashtu si në qoftë se ju e printf dhe [e padëgjueshme], do të shtypura dy herë?
>> Rob: Pra, brenda foo?
Nëse do të kishte një printf këtu?
>> Audienca: Po.
>> Rob: Pra, nëse kemi pasur një të drejtë printf këtu, ajo do të shtypura një herë.
Që ne jemi duke e quajtur edhe një e drejtë foo këtu, atëherë ne do të goditur printf.
Pastaj ne do të thërrasë bar.
Dhe pastaj do të kthehet foo.
Dhe kjo është ajo.
Ne vetëm ndonjëherë hasni printf herë.
Po?
>> Audienca: [padëgjueshme]
printf duke e quajtur foo sepse ne jemi e parë duke e quajtur printf dhe pastaj ne jemi duke kaluar
argumentet.
>> Rob: Pra, në teori, nuk është printf quajtur foo?
Kështu që nuk ka.
Vetëm mënyrë që c do të ekzekutuar këto gjëra është, para se të mund të
thërrasë një funksion, të gjitha argumentet të funksionit të ketë
të vlerësohen plotësisht.
Pra, është kjo e vlerësuar plotësisht?
Po, kjo është vetëm një varg.
Është vetëm një vlerë.
>> Pastaj ne duhet të plotësisht vlerësojnë këtë.
Pasi kjo është bërë, tani të gjithë Argumentet e tij janë vlerësuar.
Dhe tani ne mund të bëjë telefononi për printf.
Po?
>> Audienca: Një pyetje.
Nëse ju keni një funksion i pavlefshëm, duhet të ju keni pikëpresje e kthimit?
>> Rob: Ju nuk bëni një pikëpresje kthim në qoftë se ju keni një funksion i pavlefshëm.
OK.
Deri tani disa sende grumbull.
Pra tog është se si ne jemi duke shkuar për t'u marrë me menaxhimin e kujtesës dinamike.
Dhe kjo direkt në kontrast me rafte të cilat ne do të thërrasë automatike
menaxhimit kujtesës.
>> Pra, në rafte, ju kurrë nuk të vërtetë kanë për t'u marrë me të se si variablat lokale
janë duke u shtyrë dhe popped off të gjitha këto korniza rafte dhe të gjitha këto gjëra.
Ju nuk keni për t'u shqetësuar në lidhje me të.
Kjo është automatike.
Pra tog është manual.
Dhe [padëgjueshme]
vjen nga këto funksione malloc dhe të lirë.
>> Kështu që këtu është një tjetër program.
Të gjithë ne jemi duke bërë është mallocing një numër të plotë.
Ne jemi ruajtjen atë në yll x.
Natyrisht, ne duhet të kontrolloni për të parë nëse x është i pavlefshëm.
Pastaj ne jemi duke shkuar për të vendosur vetëm atë që x është duke treguar për të në 50.
Print atë që x është duke treguar për të, print x, dhe pastaj të lirë x.
>> Pra, si është kjo e vërtetë do të shohim nëse ne shikojmë në rafte tonë dhe tok?
Pra, ne do të fillojnë përsëri.
Fund i rafte tonë si më parë.
Mos harroni se ty të grumbullosh direkt kundërshton rafte?
Pra, ne do të kemi lartë e të radhitja tonë atje.
>> Pra, në fund të rafte tonë, ne kemi kornizë tonë rafte për kryesor.
Ajo ka hapësirë për argc, ARGV, dhe ne tani kemi një ndryshueshme x lokale, e cila
është një yll int.
Pra, ne jemi duke shkuar për të iterate përmes këtij programi.
Gjëja e parë që kemi është një thirrje për malloc.
>> Pra, ne jemi duke e bërë një thirrje për malloc.
Malloc është një funksion.
Ajo do të marrë një kornizë rafte.
Çfarë jemi ne duke kaluar për të malloc?
Kjo do të shkojë brenda e kuadrit rafte.
Ne duke kaluar madhësinë e N, i cili është 4.
Kështu që është kaluar për malloc.
>> Çfarë do të malloc bëni?
Kjo na merr disa hapësirë në tog.
Pra, ne jemi duke shkuar për të shkuar në tog.
Dhe ne jemi duke shkuar për të rrëmbyer 4 bytes nga grumbull.
Pra, le të vetëm të ***ë atë një adresë arbitrare.
0x123 Vetëm të pretendojë se është një adresuar që është në tog.
>> Pra, çfarë është në të vërtetë brenda se Rajoni i kujtesës në adresën Ox123?
Garbage.
Pra, ne nuk kemi asgjë të depozituara në të.
Pra, aq sa ne e dimë, ajo mund të jetë çdo gjë.
Ju nuk duhet të supozojmë se është zero.
Kjo është më shumë gjasa nuk zero.
>> Kthimet Deri tani e malloc.
Dhe çfarë bëjmë ne kur kthimet e malloc?
Ne kemi vendosur se çfarë do të kthehet.
Ne kemi vendosur x barabartë me atë që ajo është e kthyer.
Pra, çfarë është ajo që kthehen?
Është kthyer 0x123 pasi që është adresa e bllokut të kujtesës që ajo
vetëm të ndarë në grumbull.
>> Pra kthehen 0x123 x po tani do të të vendosen barabartë me 0x123 cili, në pikturë,
ne shpesh barazim si x paturit e një aktuale shigjetë duke treguar për këtë bllok.
Por x është vetëm ruajtjen atë adresë.
Deri tani ne kemi për të parë nëse x është i pavlefshëm.
Kjo nuk është null.
Ne pretendojmë se se malloc sukses.
>> Deri tani yll x është e barabartë me 50.
Pra yll kujton kjo do të thotë shkojnë në atë adresë.
Pra 0x123 Ne jemi duke shkuar për të shkojnë në atë adresë.
Kështu që na sjell deri atje.
Çfarë po bëjmë në atë adresë?
Ne jemi ruajtjen 50.
>> Pra pas këtë linjë, kjo është ajo që gjërat do të duken si.
Deri tani nuk është më mbeturinave deri atje.
Tani ne e dimë se 50 është në se adresë të veçantë për shkak se
ne kemi vendosur atë në se.
OK?
Deri tani ne jemi duke shkuar për të shtypur f.
>> Pra, së pari ne jemi duke shkuar për të shtypur yll x.
Pra, çfarë është yll x?
Përsëri, yll x mjetet të shkojnë në gjë që x është duke treguar për të.
Pra x është ruajtjen 0x123 Shko me atë.
Ne kemi marrë 50.
Pra, të shtypura f se.
Dhe kjo do të thotë se do të shtypura 50.
Dhe pastaj ajo kthehet.
>> Dhe pastaj ne kemi printf dytë.
Ne jemi tani për qind p.
Nëse ju nuk e keni parë atë, kjo është se sa e keni shkruar një tregues.
Pra, ne kemi qind për qind i, f, dhe të gjitha atyre tashmë.
Pra qind p, të shtypura një akrep.
>> Pra, x është një akrep.
Pra, nëse ne jemi duke shkuar për të shtypur x vetvete, ne jemi duke shtypjen atë që është në të vërtetë brenda
x, i cili është 0x123 Kështu parë print f do të shtypura 50.
E dyta print f po shkon për të printuar 0x123 Po?
>> Audienca: A përdorni për qind x për të shkruar një akrep?
>> Rob: Pra, ju e përdorni për qind x për të shkruar një akrep?
Kështu që ju mund të por për qind x është vetëm, në përgjithësi, për të si në qoftë se ju keni disa
numër i plotë dhe ju doni të shtypura ajo si një heksadecimal.
Kjo është vetëm se si ta bëni këtë.
>> Ndërsa, për qind d do shtypura si decimal.
Kjo është ku kemi marrë për qind d. i është vetëm numër i plotë.
përqind p është në mënyrë specifike për pointers.
>> Pra, x është një akrep.
Ne duam që të përdorin për qind p.
Por për qind x mund të punojnë.
Po?
>> Audienca: [padëgjueshme]?
>> Rob: Po.
Të paktën për këtë thirrje - kështu që unë nuk e përfshijnë atë në këtu.
Por këto dy argumente janë domosdoshmërisht brenda kësaj kornize rafte
së bashku me çdo ndryshore lokale printf ndodh të jetë duke përdorur.
Dhe pastaj e thirrjes tjetër për printf tani brenda kornizës printf rafte është
përqind p backslash n dhe çdo gjë vlera e x është, e cila është 0x123.
Po?
>> Audienca: [padëgjueshme]?
>> Rob: Ajo do të shtypura diçka që duket si ky.
>> Audienca: [padëgjueshme].
>> Rob: Pra, ajo printon në formë të adresave.
Ajo duket si një adresë.
Po?
>> Audienca: [padëgjueshme]?
>> Rob: Pse është ajo?
>> Audienca: [padëgjueshme]?
>> Rob: Pse është ky tregues 4 bytes?
Pra, ka një bandë e tërë nga 0-ta në para të kësaj.
Pra, është e vërtetë 0x0000000123.
Në një sistem të 64-bit, nuk do të një bandë e tërë më shumë zero.
Po?
>> Audienca: [padëgjueshme].
>> Rob: Pra printf parë është duke shkuar për të shtypur -
>> Audienca: [padëgjueshme].
>> Rob: Po, ajo do të shtypura ajo që x është duke treguar për të.
Star thotë se çfarë është kjo gjë e treguar.
Rrëmbej atë.
Pra, çfarë është ajo për të treguar?
50.
Rrëmbej atë.
Kjo është ajo që ne jemi duke shkuar për të shtypur.
Ndërsa, një tjetër, ne jemi vetëm shtypje x vetvete.
Çfarë është brenda f?
0x123.
OK.
>> Dhe pastaj, në fund, ne kemi të lirë.
Çfarë jemi ne duke kaluar për të liruar?
Ne jemi duke kaluar x.
Kjo kohë unë në fakt shfaqet ajo në kuadër rafte.
>> Pra, ne jemi duke kaluar vlerën 0x123 të lirë.
Deri tani pa e di, të gjithë të drejtë, Më duhet të shkoj deri në tog
dhe pa se kujtesa.
Ajo nuk është duke përdorur çfarë është në adresën 0x123.
>> Pra, të lirë do të lëshojë që nga tog.
Tani tog jonë është bosh përsëri.
Ne nuk kemi rrjedhjet e kujtesës.
Tani pa pagesë do të kthehet.
Vini re se x është ende 0x123.
Por kjo është tani e kujtesës nuk është e vlefshme.
Ne nuk duhet dereference x.
Po?
>> Audienca: A është kthyer 0 të tepërta?
>> Rob: A është returen 0 të tepërta?
Po.
Ne vetëm vënë atë atje për shkak ne kemi një të kthimit për ajër.
Pra, kjo është si, po, lejon përfshijnë kthimin 0.
Po?
>> Audienca: [padëgjueshme]?
>> Rob: Pra, pas të lirë x, çfarë ndodh në qoftë se ne përpiqemi të dereference treguesin?
Është e mundur që asgjë nuk shkon keq.
Është e mundur që ne ende do të merrni 50.
>> Është e mundur, gjithashtu, se se kujtesa është tani duke u përdorur për diçka tjetër.
Pra, kjo është sjellje e papërcaktuar.
Dhe papërcaktuar do të thotë asgjë mund të ndodhë.
Po?
>> Audienca: [padëgjueshme]?
>> Rob: Jo, kështu që nëse ju të caktojë x për diçka tjetër.
Pra, nëse këtu kemi thënë x është e barabartë me diçka malloc tjetër -
Ngjarja Madhësia e malloc -
pastaj se blloku origjinale e kujtesës nuk është i liruar.
Dhe ne kemi humbur zyrtarisht atë.
Kjo është një rrjedhje kujtim.
Ne kemi humbur të gjitha referencat në atë bllok të kujtesës.
Pra, nuk ka asnjë mënyrë ne mund të ndonjëherë pa atë.
OK, kështu që pastaj do të ktheheni 0 mjete të bërë.
>> Në rregull, del nga shtrati kështu rafte.
Çfarë është ideja këtu?
Pra mbani mend, tog është duke shkuar poshtë.
Stack është duke shkuar deri.
Pra, ky ishte shembull nga leksion, Unë mendoj, ku kryesor është vetëm do të
e quajnë këtë foo funksion, e cila do për të thirrur veten Recursively mbi dhe
nga e para.
>> Pra, rafte korniza do të punë të njëjtë.
Pra, ne jemi duke shkuar për të filluar me kryesore si kornizë fund rafte.
Pastaj kryesor do të thërrasë foo, e cila do të merrni një kornizë rafte.
>> Pastaj foo do të thërrasë foo përsëri, e cila do të marrë
një tjetër kornizë rafte.
Dhe pastaj përsëri, dhe përsëri, dhe përsëri, dhe përsëri derisa, në fund, ne të drejtuar
në grumbull.
Pra, kjo është se si ne të merrni a del nga shtrati rafte.
Dhe në këtë pikë, ju Seg faj.
Ose ju do të vërtetë të seg faj para këtë pikë, por vërtet.
>> Audienca: A është thelbi hale njëjtë me fajin seg?
>> Rob: Pra, ju do të shihni ndarje core faji hedhur.
Ju merrni një hale bazë kur ju Seg faj.
Dhe kjo është si një hale të gjitha përmbajtja e kujtesës tuaj të tanishme në mënyrë
që ju mund të provoni dhe për të identifikuar pse ju Seg fajësuar.
Po?
>> Audienca: [padëgjueshme]?
>> Rob: Pra, a faji segmentimit do të thotë ka një pirg del nga shtrati.
Pra, jo domosdoshmërisht.
Një faji segmentimit do të thotë se ju jeni memorie prekur në mënyrë
ju nuk duhet të jetë.
Pra, një mënyrë për të që kjo të ndodhë është, kur ju rafte del nga shtrati, ne fillojmë prekur
memorie në një mënyrë që ne nuk duhet të jetë.
Po?
>> Audienca: [padëgjueshme]?
>> Rob: Pra, brenda një lak të pafund.
Ashtu si, kjo është si një Infinite gjithkund rekursive loop dhe kështu që ne të merrni një tjetër
rafte kornizë çdo herë.
Por vetëm brenda një rregullt pafund ndërsa një -
mirë, le të mos edhe të shtypura f -
të bëjë diçka.
Çfarëdo.
>> Ne nuk jemi duke shkuar për të marrë një tjetër kornizë rafte.
Ne jemi vetëm do të mbajë looping gjatë këtij udhëzimi të vetëm.
Rafte nuk është në rritje.
Është fakt se çdo recursive thirrje është duke na dhënë një kornizë rafte.
Kjo është arsyeja pse ne kemi marrë një rafte del nga shtrati.
Po?
>> Audienca: Pra, nëse ju tha që të merrni ndërsa lak dhe pastaj [e padëgjueshme]?
>> Rob: Pra, nëse brenda lak ndërsa ka pasur një printf, ju ende do të
nuk Seg faj.
Unë thjesht nuk dua të ngatërruar gjërat.
Ajo do loop.
Ju do të merrni një pirg të vetme kornizë për printf.
>> Pastaj printf do të kthehen.
Pastaj ju do të lak përsëri.
Ju do të merrni një pirg të vetme kornizë për printf.
Ajo do të kthehej.
Single kornizë rafte.
Pra, ju nuk jeni duke marrë këtë e pafund grumbullonin korniza rafte.
>> Audienca: [padëgjueshme]?
>> Rob: Po.
Pra, kjo del nga shtrati rafte ndodh sepse asnjë nga këto
thirrjet për foo po kthehen.
Pra, nëse do të kthehemi, atëherë ne do të fillojnë humbur korniza rafte.
Dhe atëherë ne nuk do të rafte del nga shtrati.
Dhe kjo është arsyeja pse ju duhet një rast bazë për funksionet tuaja personale.
Po?
>> Audienca: A është madhësia potenciale dhe rafte për të tog njëjtë për
të gjitha programet?
>> Rob: Rreth.
Është madhësia potenciale e rafte dhe të grumbull i njëjtë për të gjitha programet?
Afërsisht.
Ka disa randomization të ku fillon rafte dhe
ku grumbull fillon.
Nëse ju ndodh që të ketë një të tërë shumë Variablat globale dhe gjëra, ju mund të
marr me vete nga një hapësirë për grumbull tuaj.
>> Në një sistem të 64-bit, ju praktikisht kanë memorie të pafund.
Ka vetëm aq shumë.
Midis 32 bit dhe 64 bit, se një ndryshim të rëndësishëm.
>> Ju jeni do të merrni një tërësi shumë më tepër rafte dhe hapësirë tog në një 64-bit
Sistemi sepse nuk është vetëm më shumë adresat që ata mund të përdorin.
Por në një sistem individual, ajo do të të jetë afërsisht të njëjtën sasi e rafte
dhe hapësirë tog.
Dakord.
>> Pra, gjëja e fundit është hartimi.
Kështu që ju duhet të dini këtë proces.
Ka katër hapa të mëdha.
Pra, e para duhet të jetë e lehtë për mësim.
Para-përpunimit.
Ajo ka prefiksin pre në të.
Pra, ajo vjen para se çdo gjë tjetër.
>> Gjë për të kujtuar është hash.
Përcakton në mënyrë hash hash dhe përfshin në të gjithë ata.
Ata janë të gjithë para-procesor direktiva.
Këto janë gjëra që para-procesor kujdeset.
>> Pra, çfarë do një para-procesor të bëjë?
Kjo është një gjë me të vërtetë memec.
Të gjitha është e aftë për të janë të gjitha këto operacionet kopje, dhe të prerë, dhe paste.
>> Pra hash përfshin standarde I0 dot h.
Çfarë është se duke bërë?
Është grabbing standarde I0 dot h paraqesë dhe pasting atë në krye
kudo që thotë hash përfshin standarde I0 dot h.
>> Dhe çdo hash përcaktojnë se ne kemi parë, ajo është se duke bërë?
Kopjimi vlerën që hash saj përcaktuar është përcaktuar si dhe pasting që
kudo që të jeni duke përdorur vlerën.
Pra preprocessor thjesht e bën me të vërtetë tekst i thjeshtë operacionet bazuar.
Ajo nuk bën asgjë zgjuar.
Pra, çdo gjë tjetër është më shumë e komplikuar.
>> Pra, tani që preprocessor është bërë, ne fakt përpiloni.
Pra, çfarë do të thotë hartimin?
Ne jemi tani duke shkuar nga kodi c të kodit të kuvendit.
Po?
>> Audienca: [padëgjueshme]?
>> Rob: Po, ne e kapur atë.
Pra hartimin.
Ne jemi duke shkuar nga c të kuvendit.
Pra, ky është një ndryshim gjuha aktuale.
Hartimi veten do të thotë duke shkuar nga një gjuhë të nivelit të lartë për të
një gjuhë të nivelit më të ulët.
>> Dhe c është një gjuhë të nivelit të lartë në krahasim me asamblenë.
Çfarë është kuvendi?
Udhëzimet e tij që janë, shumë e shumë, bërë për CPU tuaj.
Por kompjuteri juaj ende nuk nuk e kuptojnë kuvendi.
Ajo vetëm e kuptonte ato dhe zero.
Pra, hapi tjetër është grumbulluar, e cila na sjell nga këto udhëzime që
CPU juaj kupton dhe në fakt përkthen ato, për të
ato dhe zero.
>> Pra C të kuvendit të binar.
Por unë nuk kanë një ekzekutueshme ende.
Pra, mendoj se e bibliotekës CS50.
Ne kemi dhënë me një binar për Kjo librari CS50, e cila ka getString
dhe GetInt dhe të gjitha këto.
>> Por biblioteka CS50 -
në vetvete - nuk është i ekzekutueshëm.
Ajo nuk ka një funksion kryesor.
Është vetëm një bandë e binar që ju mund të përdorni.
Pra lidh është se si ne të sjellë së bashku të gjithë nga këto fotografi të ndryshme binare
në një ekzekutues aktuale.
Një që ju mund të shtypni dot çaj një njollë jashtë.
>> Pra, kjo është si e file që ju shkroi, - çdo gjë që programi juaj është -
Ceaser dot c.
Por tani ajo është hartuar deri në binar.
Pra Ceaser dot o.
Dhe kjo është bibliotekat tona CS50 binar.
Dhe ata janë duke u kombinuar në një të vetëm ekzekutues.
Po?
>> Audienca: [padëgjueshme]?
>> Rob: Pra, së pari të përfshijnë, mos harroni, hash përfshijë është në fakt një
hap para-procesor.
Por kjo është e veçantë.
Nëse ju nuk jeni duke përdorur funksione që janë jashtë e file të vetëm atëherë,
jo, ju nuk keni nevojë për të lidhur ndonjë gjë pasi që ju keni gjithçka.
>> Kjo tha, printf është duke u lidhur in
Në qoftë se ju përdorni ndonjëherë printf, kjo është diçka që duhet të jetë i lidhur në
sepse ju nuk e keni shkruar atë.
Dhe, në fakt, printf është automatikisht të lidhura in
Ti e di se si në rreshtin e komandave ose kur ju shkruani bëni, që ju të shihni atë të ketë
dash l CS50, e cila ka lidhje të në bibliotekë CS50?
Printf, dhe stuff like that, do të jetë i lidhur në mënyrë automatike.
Çdo pyetje të tjera në ndonjë gjë?
>> Audienca: [padëgjueshme]?
>> Rob: Lidhja?
Ne kemi një bandë e tërë e Fotografi të ndryshme binare.
Ky është shembulli kanonik që ne përdorim është bibliotekë CS50.
Ne kemi hartuar dhe dhënë për ju në binar për këtë bibliotekë CS50.
>> Ju doni të përdorni getString në programin tuaj.
Pra, ju shkoni dhe të përdorni getString.
Por pa kodin tim binar për GetString, kur të përpilojnë kodin tuaj
poshtë, ju nuk mund të vërtetë të kandidojë tuaj Programi për shkak getString String është
ende nuk është përcaktuar plotësisht.
>> Kjo është vetëm kur ju lidhje në binar tim që përmban getString që tani, të gjithë
e drejtë, unë mund të vërtetë ekzekutuar getString.
Dosja ime është e plotë.
Dhe unë mund të kandidojë këtë.
Po?
>> Audienca: A lidh të kthyer binar të ekzekutueshme?
Pra, edhe në qoftë se ju nuk keni të tjera biblioteka, nuk do të vazhdojë të jetë
nevojshme për të përkthyer [padëgjueshme]?
>> Rob: Pra një ekzekutueshme është ende në binar.
Është vetëm të kombinuar një të tërë bandë e binare.
>> Audienca: Ju faleminderit shumë.
>> Rob: Nuk ka problem.
Çdo pyetje të tjera?
Përndryshe, ne jemi të vendosur të gjithë.
Dakord.
Thanks.
>> [Duartrokitje]
>> Audienca: Ju faleminderit.
>> Rob: Po.