>> [MUSIC Playing]
DAVID J. Malan: Në rregull.
Kjo është CS50, dhe kjo është fundi i Javës Four.
Dhe një nga temat sot është ajo e mjekësisë ligjore dixhitale,
arti i shërohet informacion.
Dhe me të vërtetë, edhe pse ju jeni në mes
tani e Paqes në tre dhe Breakout, javën e ardhshme,
Fokusi do të jetë në pikërisht këtë domain.
>> Pra, një nga punët coolest kam kishte ishte kthyer në shkollën e diplomuar,
kur unë isha duke punuar për lokale Middlesex County Prokurorit të Qarkut-së
zyra, mjeko-ligjore duke bërë punë.
Pra, në thelb, Massachusetts Policia e Shtetit, në disa raste,
kur punojnë në raste do sjellë në gjëra të tilla si hard drives
dhe disqe floppy dhe kartat e kujtesës dhe të ngjashme.
Dhe ata do të dorëzojë ato për mua dhe mentorin tim,
dhe qëllimi ynë është për të gjetur prova, nëse ka pasur ndonjë, në këto media.
Shikime të Tani, ju mund të keni parë e kësaj bote të mjekësisë ligjore
në media, TV dhe filma.
Por punë kam pasur, dhe guxoj të them se bota,
nuk është fare si ju do të shihni atë.
Le të marrin një vështrim në atë ju ndoshta keni parë.
[VIDEO Playback]
OK.
Tani, le të marrë një sy të mirë në ju.
>> [MUSIC Playing]
>> -Hold Atë.
Run që i mbështesin.
>> -Wait Një minutë.
Shko e drejtë.
-Ka.
Freeze se.
PLOTE-ekran.
>> OK.
Freeze se.
-Tighten Deri në këtë, do ju?
>> -Vector Në më se djalë nga rrota e pasme.
>> -Zoom Në të drejtë këtu në këtë vend.
>> -Me Pajisje të drejtë, image mund të zgjerohet dhe të mprehur.
>> -Çfarë Është se?
>> -Ajo Është një program zgjerimin.
>> -Mund Ju të qartë se deri ndonjë?
>> -Unë Nuk e di.
Le të rritur atë.
>> -Enhance Seksioni A6.
Unë zgjeruara detaje, and--
-Unë Mendoj se ka mjaft për të rritur.
Lirimin e tij për ekranin tim.
>> -Unë Zgjeruara reflektimin në sytë e saj.
-Le Është drejtuar këtë përmes zgjerimin Video.
>> -Edgar, Mund të rrisë këtë?
>> -Hang Më.
>> -Ve Qenë duke punuar në këtë reflektim.
>> Pasqyrim i dikujt -Ka së.
>> -Reflection.
-Nuk Është një pasqyrim i fytyrës së njeriut.
>> Reflektim, Partia!
-Nuk Është një reflektim.
-Zoom Në në pasqyrë.
Ju mund të shihni një reflektim.
>> -A Mund të përmirësuar imazhin nga këtu?
-A Mund të rritur atë?
-A Mund ne të rritur këtë?
-A Mund të rritur atë?
-Hold Në një të dytë.
Unë do të rritur.
-Zoom Në në derë.
-Times 10.
-Zoom.
-Move Në.
-Më Shumë.
-Wait, Të ndaluar.
-Ndaloni.
-Pause Atë.
Na -Rotate 75 gradë rreth vertikale, ju lutem.
>> -Ndaloni.
Kthehu mbrapa në pjesën përpara derës përsëri.
>> -Got Një enhancer imazhit që mund të bitmap?
>> -Maybe Ne mund të përdorim Pradeep Singh Metoda për të parë në dritare.
>> -The software është shtet i artit.
>> , Partia eigenvalue është off.
>> -Me Të djathtë kombinim i algorithms--
>> Ndriçim marrë -Ai-së algoritme në nivelin e ardhshëm,
dhe unë mund t'i përdorë ato për të rritur këtë fotografi.
>> -Lock Në dhe të zgjeruar z-aks.
>> -Enhance.
Përmirëso.
-Enhance.
-Freeze Dhe të rritur.
[VIDEO END rishikim]
DAVID J. Malan: Pra, ata janë të të gjitha fjalët, por ato nuk ishin të
përdorur në fjali të saktë.
Dhe me të vërtetë në të ardhmen, në çdo kohë, ju lutem, dëgjoni dikë që thotë fjalën,
"Rritur", nënqeshje vetëm pak.
Sepse kur ju përpiqeni për të rritur, për shembull, kjo është ajo që ndodh.
>> Kështu që këtu është një foto mrekullueshëm.
Ky është vet Daven CS50-së.
Dhe mendoj se ne të kërkuar për të të përqëndrohet në në vezullim në sy të tij,
ose reflektim i djalë i keq që ishte në mënyrë të qartë
kapur nga kamera e sigurisë.
Kjo është ajo që ndodh kur ju zoom në një imazh që
ka vetëm një numër i caktuar i bit që lidhen me të.
>> Kjo është ajo që ju do të merrni.
Dhe me të vërtetë, në sy Daven-së është vetëm katër, ndoshta gjashtë pixels
që kompozoj saktësisht se çfarë ishte dritëz atje.
Pra Problem Set Katër në fund të fundit do të duhet ju eksploruar këtë botë, veçanërisht
nga natyra e diçka ne e quajmë fotografi i / o, ku
i / o është vetëm një mënyrë e sofistikuar për të duke thënë input dhe output.
>> Pra deri më tani, të gjitha bashkëveprimet ne kemi pasur me një kompjuter
kanë qenë kryesisht me tuaj tastierë dhe ekran,
por jo aq shumë me hard disk, ose kursim të dosjeve përtej atyre ju
veten shkruani.
Programet tuaja deri tani kanë nuk janë krijuar, dhe të kursimit,
dhe përditësimin dosjet e tyre.
>> E pra, çfarë është një skedar?
E pra, diçka si një JPEG.
Ky është një imazh që ju mund duhet ose ngarkoni në Facebook,
ose të shihni kudo në internet.
Në të vërtetë, që foto ne vetëm pa e Daven ishte një JPEG.
Dhe çfarë është interesante për fotografi si JPEGs
është se ato mund të identifikohen, zakonisht, nga modele të caktuara të bit.
>> Me fjalë të tjera, çfarë është ajo që dallon një JPEG nga një GIF
nga një PING nga një fjalë dokument nga një file Excel?
E pra, kjo është vetëm e ndryshme modelet e copa.
Dhe këto modele të ndryshme janë zakonisht në fillim të këtyre dosjeve.
>> Kështu që kur kompjuteri juaj hap një Word doc, ose kur një kompjuter hap një JPEG,
kjo duket në mënyrë tipike në disa bit e para në dosjen.
Dhe në qoftë se ajo njeh një model, ai thotë, oh, ky është një imazh.
Më lejoni të shfaq atë në përdoruesi si një grafik.
Ose, oh, kjo duket si një Word doc.
Më lejoni të tregojë se për të përdoruesit, si një ese.
>> Kështu për shembull, JPEGs, rezulton, janë
mjaft të sofistikuar nën kapuç.
Por tre bytes e para në më të çdo JPEG fillojë me këto tre numra.
Pra byte zero, një, dhe dy janë, në më çdo JPEG, 255, atëherë numri
216, atëherë numri 255.
>> Dhe ajo që ju do të jetë në gjendje për të fillojnë të bëjnë javën e ardhshme
është në të vërtetë poking nën individualitet e dosjeve si JPEGs
dhe si fotografi bitmap, dhe duke parë ajo që ka qenë gjithmonë atje për aq kohë
si ju keni qenë duke përdorur një kompjuter.
>> Por ajo që është atje nuk është në mënyrë tipike shkruar si numra dhjetorë si kjo.
Shkencëtarët kompjuter nuk e bëjnë kanë tendencë për të folur në decimal.
Ata vërtetë nuk flasin në binar.
Në mënyrë tipike, kur ne duam për të shprehur numrat,
ne fakt përdorni hexadecimal, të cilat ju mund të kujtojnë
nga, të themi, Problem Set Një, e cila sfidoi
ju të mendoni për një sistem të ndryshëm.
>> Ne, natyrisht, janë të njohur me decimal, zero përmes nëntë.
Biseduam për binar.
Dhe ne nuk të vërtetë kanë për të përdorur që shumë këtu
më jashtë, sepse kompjuterat do të përdorë këtë.
Por programuesit do shumë shpesh, por jo gjithmonë,
përdorni hexadecimal, e cila vetëm do të thotë ju keni 16 shkronja në alfabetin tënd,
në krahasim me dy ose 10.
>> Deri sa ju të mbështeteni për të më e lartë se nëntë në heksadecimal?
Qe shkojnë 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, a, b, c, d, e, f, vetëm nga konventa.
Por ajo që është kryesore është që çdo nga këto është një simbol i vetëm.
Nuk ka 10.
Nuk ka 11, në vetvete, sepse çdo i shifrave tuaja, ashtu si në decimal
dhe ashtu si në binar, duhet vetëm të të jetë një karakter të vetëm, nga konventa.
>> Pra, që atëherë është alfabeti ne kemi në dispozicionin tonë për heksadecimal.
Pra, çfarë e bën një JPEG duket si në qoftë se ju ishin të shkruar nga këta të tre e parë
nuk bytes si decimal, por, për shembull, si heksadecimal?
Dhe pse është magji edhe të gjithë që të dobishme?
>> E pra, një vështrim i shpejtë në një shembull.
Pra, nëse unë shkruaj nga copa që përfaqësojnë këto numbers-- decimal
kjo mund të jetë një ndryshkur pak tani nga disa javë prapa,
por një e majtë dhe një e drejtë janë goxha e lehtë.
255 ishte numri më i madh që ne mund të përfaqësojë me tetë bit.
Ishte të gjitha ato.
Pra, i vetmi që është e butë interesante është një e mesme.
Dhe në qoftë se ju lloj i bëni jashtë matematikë, ju do të nxjerr një përfundim se, me të vërtetë,
se modeli i një dhe zero përfaqëson 216.
Pra, le të vetëm të parashikojë për tani që këto janë të sakta.
Por pse është kjo interesante?
>> E pra, një bajt, natyrisht, është tetë bit.
Dhe kjo rezulton se në qoftë se ju mendoni se e një bajt si dy copa të katër copa,
si kjo.
Më lejoni vetëm të shtoni një hapësirë.
Pra, para, pas.
Unë e kam vetëm të shtuar një hapësirë ​​të bardhë për hir Vizualizimi-së këtu.
Si mund të kemi tani të përfaqësojë në, të themi, heksadecimal secilin kuadrat i bit,
secili grup i katër bit?
>> Kështu për shembull, në të majtë tani, ne kemi 1111 në binar.
Çfarë është se numri në decimal, në qoftë se ju bëni jashtë matematikë?
Ju keni vendin Ones, vend twos, vendi katër këmbët, dhe vendi tetë.
>> Audienca: 15.
DAVID J. Malan: Kjo është 15.
Pra, nëse ne bëjmë tetë plus katër plus dy plus një, ne kemi marrë 15.
Kështu që unë mund të shkruani 15 më poshtë 1111 dhe por pika e tërë këtu
është heksadecimal, nuk dhjetore.
Pra, në vend të shkruar 15, 1-5, Unë jam duke shkuar për të shkruar që në magji,
e cila në qoftë se ju mendoni përsëri, në qoftë se ju keni zero nëpërmjet f, çfarë është 15 do të jetë?
Audienca: f.
DAVID J. Malan: Pra, ajo rezulton se është f.
Dhe ju mund të punojnë jashtë se duke thënë, dhe, nëse A është 10, pastaj në rregull, f është 15.
Pra, me të vërtetë, ne mund të rishkruaj ky grup i njëjtë i numrave si f f.
Atëherë, nëse ne bëjmë një grimë e matematikës, ne do të nxjerr një përfundim se kjo është d.
Tetë është shumë e lehtë, sepse ne kanë një një në vendin e tetë.
Dhe pastaj, ne kemi një çift shumë f f-së.
>> Pra, ajo që njerëzit kanë tendencë për të bërë nga konventa kur ata përdorin heksadecimal është se ata vetëm
shkruaj këtë pak më shkurtimisht, shpëtoj nga shumica e asaj hapësirë ​​të bardhë.
Dhe vetëm të jenë super të qartë të lexuesit se kjo është heksadecimal,
Konventa e thjeshtë në mes të njerëzit po ju shkruani zero
x, e cila nuk ka kuptimin tjetër se një identifikues vizuale të,
këtu vjen një numër magji.
>> Dhe pastaj, të vendosni dy shifra, f f në këtë rast, pastaj d a, pastaj f f.
Pra histori të gjatë të shkurtër, heksadecimal vetëm ka tendencë
të jetë e dobishme për shkak se secili prej saj shifrat e kodit, zero nëpërmjet f, të përkryer linjat
me një model të katër copa.
>> Pra, nëse ju keni dy numra heksadecimal, zero përmes F, përsëri dhe përsëri,
që ju jep të përkryer tetë bit ose një bajt.
Pra, kjo është arsyeja pse ajo tenton të të jetë konvencionale të dobishme.
Nuk ka intelektuale përmbajtje me të vërtetë përtej kësaj,
përveç shërbimeve të saj aktual.
>> Tani JPEGs nuk janë vetëm paraqesë formate për graphics.
Ju mund të kujtojnë se ka fotografi si kjo në botë,
të paktën nga disa vjet mbrapa.
>> Pra, kjo ishte në të vërtetë instaluar në Windows XP
në miliona PC në mbarë botën.
Dhe kjo ishte një fotografi bitmap, BMP.
Dhe një fotografi bitmap, si ju do të shihni tjetër javë, thjesht do të thotë një model i dots,
pixels si ata janë quajtur, një hartë në copa, me të vërtetë.
>> Pra, çfarë është interesante, edhe pse, në lidhje me këtë format file, BMP, është
që nën kapuç, atë ka më shumë se vetëm tre bytes
që kompozoj header e saj, në mënyrë të flasin, e disa kafshon e para.
Ajo në fakt duket pak komplikuar në shikim të parë.
Dhe ju do të shihni këtë në setin P.
Dhe për të gjetur diçka nga të veçantë të kësaj tani
nuk është aq e rëndësishme, sa vetëm fakti që në fillim të çdo bitmap
fotografi, një format grafik, ka një bandë e tërë e numrave.
>> Tani Microsoft, autor i këtij formati,
ka tendencë për të thirrur ata Gjërat nuk Ints dhe chars
dhe gjithandej, por fjalët dhe d fjalët dhe longs dhe bytes.
Pra, ata janë vetëm lloje të ndryshme të të dhënave.
Ata janë emra të ndryshëm për të njëjtën gjë.
Por ju do të shihni se në P Set Katër.
>> Por kjo është vetëm për të thënë se në qoftë se një njeri dy klikimeve disa fotografi bmp në e tij
ose hard drive e saj, dhe një dritare hapet up duke treguar atë që e imazhit,
se ka ndodhur për shkak të operimit sistemi me sa duket vënë re jo vetëm
file extension bmp në emrin e file,
por edhe fakti se ka disa konventë në modelin e copa
në fillim e këtë dosje bitmap.
>> Por le të tani të përqëndrohet në tillë një fotografi e komplikuar,
por në vend të kësaj në diçka si kjo.
Supozoni këtu në Gedit, unë vetëm kanë fillimet
i një programi që është shumë e thjeshtë.
Unë kam marrë disa përfshin deri të lartë.
Tani unë kam marrë # Include "structs.h", por Unë do të kthehem në se në një moment.
Por kjo është e dobishme për tani.
Pra, ky është një program që do të zbatojë
si bazën e të dhënave të gjendjes civile.
Pra, një bazë të dhënash e studentëve, dhe çdo studenti në botë
ka një emër dhe një shtëpi dhe ndoshta disa sende të tjera, por ne do të mbani atë të thjeshtë.
Çdo nxënës ka një emër dhe një shtëpi.
>> Pra, nëse kam kërkuar të shkruaj një Programi qëllimi i të cilit në jetë
ishte vetëm për të iterate nga zero për deri në tre,
në qoftë se ka tre studentë në Universitetin e Harvardit.
Dhe unë vetëm dua të të marrë, duke përdorur GetString, emrin e studentit dhe shtëpi,
dhe pastaj vetëm të shtypura ato jashtë.
>> Kjo është lloj si Javës Një, Java Dy gjëra tani,
ku unë vetëm dua një për loop ose diçka të tillë.
Dhe unë dua të thërrasë GetString disa herë, dhe pastaj të shtypura f disa herë.
Pra, si mund të bëj këtë, edhe pse, kur të dyja një emër dhe një shtëpi
janë të përfshirë për çdo student?
>> Pra instinkti im i parë mund të jetë për të bërë diçka si kjo.
Unë mund të them së pari, dhe, më jepni, thonë, një rrjet të strings quajtur emra.
Dhe unë nuk dua një hardcode tre këtu.
Çfarë dua të vënë atje?
Pra STUDENTËT, sepse kjo është vetëm një konstante deklaruar në krye,
vetëm kështu që unë nuk duhet të hardcode tre në vende të shumta.
Në këtë mënyrë, unë mund të ndryshojë atë një vend, dhe kjo ndikon në ndryshimin kudo.
Dhe pastaj, unë mund të bëj string shtëpi STUDENTËT.
>> Dhe tani, unë mund të bëjë diçka si për (int i = 0; i <STUDENTËT, i ++.
Kështu që unë jam i shtypur të shpejtë, por kjo është ndoshta Sintaksa njohur tani.
>> Dhe tani, kjo ishte më shumë kohëve të fundit.
Nëse unë dua të vënë në i-th Emri i studentit, unë mendoj se kam bërë këtë.
Dhe pastaj, jo emrat por shtëpitë kllapa i.
Bëj këtë, GetString, dhe le shkoj mbrapa dhe të rregulluar këtë linjë.
Pajtohem?
Nuk pajtohem?
Kjo nuk është shumë përdorues-miqësor.
Unë nuk e kam thënë përdoruesit se çfarë të bëjë.
>> Por tani, në qoftë se unë edhe kërkuar për më vonë, le të
të themi, të shkruar këto gjëra out-- kështu TODO vonë.
Unë do të bëjë më shumë me this-- kjo ndoshta IS
një zbatimi korrekt i duke marrë emrat dhe shtëpi, tre
e tyre e përgjithshme secili, nga një përdorues.
>> Por kjo nuk është dizajn shumë e mirë, e drejtë?
Po në qoftë se një student ka jo vetëm një emër dhe një shtëpi, por edhe një numër ID,
dhe një numër telefoni, dhe një adresë e-mail,
dhe ndoshta një faqe në shtëpi, dhe ndoshta një të trajtojë Twitter,
dhe çdo numër të detaje të tjera lidhur me një student ose një person,
në përgjithësi.
Si do të fillojë për të shtuar funksionalitetin për këtë program?
>> E pra, unë ndjehem si mënyrë më të thjeshtë mund të jetë për të bërë diçka si, le të themi,
int IDS STUDENTËT.
Kështu që unë mund të vënë të gjitha kartat e identitetit e tyre në atje.
Dhe pastaj, për diçka si numrat e telefonit,
Unë nuk jam i sigurt se si të paraqesin se vetëm ende.
Pra, le të shkojnë përpara dhe të vetëm thirrje kjo Twitters STUDENTËT, të cilat
është pak e çuditshme, but-- dhe një bandë më shumë fusha.
>> Unë kam filluar të në mënyrë efektive kopjoni dhe ngjisni këtu.
Dhe kjo do të rritet mjaft ngathët shumë shpejt, e drejtë?
A nuk do të ishte mirë nëse do të kishte në botë e njohur një strukturë e të dhënave
jo si një int ose një varg, por diçka nivel më të lartë, një abstraksion, kështu
për të folur, i njohur si një student?
C nuk ka ardhur me të ndërtuar në funksionalitetin për studentët,
por çka nëse kam kërkuar për të dhënë atë të tillë?
>> E pra, ajo rezulton, unë jam duke shkuar për të të hapur një skedar të quajtur structs.h këtu,
dhe ju mund të bëjë pikërisht këtë.
Dhe ne jemi duke shkuar për të fillojnë të bëjnë këtë tani.
Dhe nën kapuç e P Set Tre, ju keni qenë tashmë duke bërë këtë tani.
Nuk ka gjë të tillë si një g rect ose një g ovale në gjuhën e programimit C.
>> Folks në Stanford zbatuar ato lloje të të dhënave duke përdorur këtë qasje këtu,
duke deklaruar të dhënat e tyre të ri Llojet duke përdorur një fjalen ri
quajtur struct dhe një tjetër e quajtur typedef.
Dhe me të vërtetë, edhe pse sintaksë duket pak e ndryshme nga sende
ne kemi parë më parë, në parim, kjo është super e thjeshtë.
>> Kjo thjesht do të thotë "të përcaktuar një lloj."
Kjo do të jetë një struktura, dhe një strukturë
është vetëm si një enë për gjëra të shumta.
Dhe kjo strukturë është duke shkuar që të ketë një varg të quajtur emrin,
dhe një varg të quajtur shtëpi.
Dhe le të thërrasë, vetëm për lehtësi, tërë ky student Struktura e të dhënave.
>> Pra, në momentin që ju të merrni për të pikëpresje, ju keni tani
krijuar të dhënat tuaj Lloji i quajtur studenti
që tani qëndron së bashku int, dhe noton, dhe char, dhe string,
dhe g rect, dhe g ovale, dhe çdo numër e gjëra të tjera njerëzit kanë shpikur.
>> Pra, çfarë është e dobishme në lidhje me këtë tani është se në qoftë se unë kthehem
të struct 0 dhe të përfundojë kjo zbatimi, të cilat kam shkruar
paraprakisht këtu, vini re se të gjitha i Çrregullia pashmangshme që
ishte gati të fillojnë të ndodhin, si kam shtuar numrat e telefonit dhe Twitters dhe të gjitha
këto gjëra të tjera për të Përkufizimi studentit,
tani ajo përfundoi në mënyrë të përmbledhur deri si vetëm një grup të nxënësve.
>> Dhe secili prej atyre nxënësve tani ka gjëra të shumta në brendësi të tij.
Kështu që vetëm lë një pyetje.
Si mund të merrni në emër, dhe shtëpia, dhe ID,
dhe çdo gjë tjetër është e brenda e studentit?
Super thjeshtë, si edhe.
Sintaksa e re, por një ide e thjeshtë.
>> Ju thjesht indeksi në grup, siç bëmë javën e kaluar dhe këtë.
Dhe çfarë është në mënyrë të qartë copë e re e sintaksës?
Vetëm., Që do të thotë "të shkojnë brenda Struktura dhe merrni fushë të quajtur
Emri, të marrë në fushë të quajtur shtëpi, të marrë në fushë të quajtur studenti. "
>> Pra, në P Set Tre, nëse ju jeni të ende duke punuar në këtë,
dhe shumica e njerëzve ende janë, kuptojnë se si ju
filloni duke përdorur gjëra të tilla si g rects dhe g ovale
dhe gjëra të tjera që nuk duket të vijnë nga Java Zero, Një ose dy,
të kuptojë se kjo është për shkak se Stanford deklaruar disa lloje të reja të të dhënave.
>> Dhe me të vërtetë, kjo është pikërisht ajo që ne do të të bëjë, si dhe, në P Set Four, kur
ne të fillojnë të merren me gjëra të si imazhe, bitmaps, dhe më shumë.
Pra, kjo është vetëm një ngacmues dhe një Modeli mendore për atë që është për të ardhur.
Tani, unë zvarritur pak këtë mëngjes.
Unë kam qenë lloj kurioz për të parë se çfarë letër-muri Microsoft në fakt
duket si sot.
Dhe del dikush në 2006 në fakt shkoi në pothuajse saktësisht
njëjti vend për të fotografuar në realitet atë që duket si se këto ditë.
Fushë është tani pak më i madh.
>> Pra, duke folur tani e imazheve, le të sjellë përsëri Daven këtu
në ekran dhe Nikollës, dhe vetëm të ju kujtoj
se në qoftë se ju dëshironi që të bashkohen me ne për drekë kjo e premte, kreu të zakonshme URL tonë
këtu.
>> Pra, ku nuk e kemi lënë jashtë të hënën?
Ne kemi prezantuar këtë problem, apo jo?
Kjo ishte me sa duket një saktë zbatimi i swap,
ku ju duke marrë dy ints, e quajtur, e quajtur b,
shkëmbim të tyre, ashtu si Laura bëri këtu në skenë me qumësht dhe ujë,
duke përdorur një të përkohshme variable, ose një kupë bosh,
në mënyrë që ne mund të vënë b në një dhe një in b pa bërë një rrëmujë e gjërave.
Ne kemi përdorur një ndryshore.
Ajo që quhet temp.
>> Por, ajo që ishte themelore Problemi me këtë kod të hënën?
Cili ishte problemi këtu?
Po.
>> Audienca: Ajo merr më shumë hapësirë.
>> DAVID J. Malan: Merr më shumë hapësirë, sepse unë jam duke përdorur një ndryshore,
dhe kjo është OK.
Kjo është e vërtetë, por unë jam i do të thotë kjo është në rregull.
Është vetëm 32 bit në madh Skema e gjërave, kështu që nuk është një punë e madhe.
Mendime të tjera?
Audienca: Ajo vetëm këmbime variablat nivel lokal.
DAVID J. Malan: Pikërisht.
Ajo vetëm këmbime e variablave në nivel lokal.
Për shkak se çdo herë që të thërrasë një function-- kur kam pasur tabaka nga Annenberg
Herën e fundit, ju keni kryesor në pjesën e poshtme.
Sa më shpejt që ju e quani një funksion të quajtur swap, swap-i nuk ka marrë x dhe y,
vlerat origjinale.
Çfarë ka marrë swap, e ne të pretendojnë?
Audienca: Kopjet.
DAVID J. Malan: Pra, kopjet e tyre.
Pra, ajo merr një dhe dy, në qoftë se ju kujtojnë shembullin nga koha e kaluar,
por një kopje e një dhe dy që janë swapped sukses.
Por për fat të keq në fund, ato vlera janë ende të njëjta.
Pra, ne mund të shohim këtë me tonë mik të ri, shpresë Gdb,
se ju ose TFS dhe Ca-së kanë qenë e ju do të udhëheqin drejt si vijon.
>> Pra nuk ka risjell swap duket like-- le të hapur deri this-- duket si kjo.
Ne niset x për një, y për të dy.
Sikur një bandë e shtypura f-së.
Por më pas, thirrjes këtu ishte që të bie në ujdi, e cila
është pikërisht kodi ne vetëm e pa një moment më parë.
Cila është e saktë në fillim shikim, por funksionale,
ky program nuk funksionon, për shkak se ajo nuk permanente shkëmbim X dhe Y.
>> Pra, le të shohim këtë, një të ngrohtë të shpejtë deri këtu me Gdb, një ./noswap.
Një bandë e informacionit të madhe se Unë do të të shpëtoj prej me Kontrollit L tani për tani.
Dhe tani, unë jam duke shkuar për të të shkojnë përpara dhe të drejtuar atë.
Dhe për fat të keq, që nuk ishte se i dobishëm.
Ajo u zhvillua programin brenda kësaj Programi quhet Gdb, një Rregullues,
por ajo nuk e lejoni të thes rreth.
>> Pra, si mund unë në fakt pauzë ekzekutimi brenda këtij programi?
Pra pushim.
Dhe unë mund të thyejnë në ndonjë Linja numër, një, 10, 15.
Por unë mund të thyejnë simbolikisht duke thënë pushim Main.
Dhe kjo po ndodh për të vendosur një pushim pikë, me sa duket në linjë 16 në kryesore.
Dhe ku është linjë 16?
Le të shkojmë deri në kodin dhe të shkojnë deri në noswap.
Dhe me të vërtetë, linja 16 është e parë në program.
>> Deri tani, në qoftë se unë të shkojnë përpara dhe lloji drejtuar këtë herë, Enter, ajo ndaluar.
Pra, le të thes rreth.
Print x-- pse është x zero?
Dhe injorojnë shenjë dollar.
Kjo është vetëm për njohës Përdorimi i programit.
Pse është x zero në këtë moment?
Po.
>> Audienca: Ajo heshti e drejtë para se të Linja 16, jo të vërtetë në linjë 16.
DAVID J. Malan: Pikërisht.
Gdb, si parazgjedhje, ka ndaluar Ekzekutimi i vetëm para linjë 16.
Pra, ajo nuk e ka ekzekutuar, i cili do të thotë x është i një vlere të panjohur.
Dhe ne mori me fat që është e diçka të pastër si zero.
Deri tani, nëse unë lloji tjetër, tani ajo ekzekutuar 16.
Është duke pritur për mua për të ekzekutuar 17.
Më lejoni të shkojnë përpara dhe të shtypura x.
Kjo është një.
Më lejoni të shkojnë përpara dhe y të shtypura.
Çfarë duhet të shikoni tani?
>> Audienca: [padëgjueshme]
>> DAVID J. Malan: Një louder pak.
>> Audienca: [padëgjueshme]
DAVID J. Malan: Jo mjaft e një konsensusi.
Pra, po, ne shohim disa vlera e mbeturinave.
Tani, y është 134514064 atje.
E pra, kjo është vetëm disa vlera e mbeturinave.
Programi im përdor RAM për qëllime të ndryshme.
Ka funksione të tjera.
Njerëz të tjerë shkroi brenda kompjuterin tim.
Pra, ato copa janë përdorur për vlera të tjera, dhe çfarë unë jam duke parë
është mbeturinat e disa Përdorimi para të atij kujtesës.
>> Pra, nuk është e madhe, sepse sa më shpejt si unë lloji tjetër dhe pastaj të shtypura y,
është e inicializuar me vlera që unë dua.
Deri tani, le të shkojë përpara pak më të shpejtë.
N për të ardhshëm.
Le të bëjë atë përsëri.
Por unë nuk dua të goditur kjo këtu, sepse në qoftë se unë
duan të shohin se çfarë po ndodh brenda e swap, çfarë është komanda?
>> Audienca: hapa.
>> DAVID J. Malan: hapa.
Pra, kjo hapa mua në një funksion, në vend se mbi të.
Dhe tani, është pak i fshehtë sinqerisht, por kjo është vetëm
thënë mua unë jam në linjë 33 tani.
Dhe le ta bëjmë këtë përsëri.
Printo temp.
Vlera e mbeturinave, negative këtë herë, por kjo është vetëm ende një vlerë të mbeturinave.
Pra, le të bëjë tjetër, temp të shtypura.
Është nisur me 1, e cila ishte vlera e x, aka a.
>> Tani, ku janë tonë një dhe x vjen nga?
E pra, njoftim kryesore, ne quajtur këto vlerat x dhe y.
Ne pastaj kaloi ato në shkëmbim si në vijim.
X arriti i pari, y presje.
Dhe pastaj, swap mund të telefononi ata x dhe y.
Por për qartësi, është e duke i quajtur ato një dhe b.
Por a dhe b tani do të jenë të kopje të x dhe y, respektivisht.
>> Pra, nëse unë kthehem në Gdb, temp është tashmë një dhe a është tashmë e.
Por nëse i bëj tjetër dhe tani bëjnë të shtypura a, a tashmë është lëvizur gjatë.
Qumështi është derdhur në ish- gotë lëng portokalli-së, ose anasjelltas.
>> Dhe në qoftë se unë bëj tjetër përsëri, dhe tani në qoftë se unë të shtypura nga si një kontroll mendje e shëndoshë,
një është ende dy, por b është tani një.
Sinqerisht, është ende atje.
Unë nuk bëj kujdes atë temp është.
Por sa më shpejt që unë tani lloji, le të themi, vazhdojnë të kthehen, tani unë jam në fund
programi.
Dhe për fat të keq, x është akoma një dhe y është ende dy.
>> Pra, çfarë ishte shërbimeve të gdb atje?
Ajo nuk e ka ndihmuar mua fix problemi në vetvete,
por me shpresë të më ndihmojë kuptojnë atë duke e kuptuar
se po, logjika ime është e drejtë, por kodi im nuk është në fund të fundit që ka
një ndikim të përhershëm.
Pra, kjo është një problem që ne jemi do të tani të zgjidhur sot.
>> Por le të marrë atje me anë të kësaj.
String është një gënjeshtër.
Ajo, gjithashtu, nuk është një lloj i të dhënave që ekziston në C. Kjo është
qenë sinonim për disa koha për diçka tjetër,
dhe ne mund të zbulojnë se si më poshtë.
>> Më lejoni të shkoj përpara dhe të hapur një program i quajtur krahasojnë-0.
Dhe në vend se të shtypni këtë jashtë, ne do të fillojnë të ecin nëpër kodin
Unë tashmë e ka shkruar, por kjo është vetëm disa rreshta.
Pra, kjo është e krahasojnë-0.
Dhe gjëja e parë që unë jam duke bërë po bëhet një linjë të tekstit.
>> Por vini re atë që unë jam duke bërë për herë të parë.
Çfarë është e ndryshme në mënyrë të qartë në lidhje me linjë 21?
Në fakt, prit një minutë.
Kjo është kopje dy.
Kjo nuk është edhe programi i drejtë.
Në rregull, vigjilent spoiler.
Në rregull, kështu që mos u mërzit se.
Kjo është përgjigje për një pyetje të ardhmen.
>> Këtu është e krahasoni-0, dhe unë jam i gati për të marrë një linjë të tekstit.
Programi-së shumë më e thjeshtë.
Pra, kjo është e drejtpërdrejtë.
Kjo është si një javë, Week Dy sende në momentin. String s = GetString.
Tani, unë them përsëri këtu.
varg t = GetString.
Dhe pastaj, gjëja e fundit në këtë program, si emrin e saj,
po unë jam duke shkuar për të përpiqen për të krahasuar ato.
>> Pra, nëse s, vargu i parë, barabartë = t, atëherë unë jam
do të thonë se ju shkruani të njëjtën gjë.
Tjetër, Unë jam duke shkuar për të thënë ju shkruani gjëra të ndryshme.
Pra, le të përpilojnë dhe të drejtuar këtë program.
Pra, ti krahasoni zero.
Duket e mirë.
Nuk ka gabime përmbledhje.
>> Më lejoni të shkojnë përpara tani dhe lloji ./compare-0.
Më lejoni të shkojnë përpara dhe të thonë diçka : Daven dhe diçka: Rob.
Dhe unë lloji gjëra të ndryshme.
Deri më tani, në mënyrë të mirë.
Programi duket të jetë e saktë.
>> Por le të drejtuar atë përsëri.
Thuaj diçka: Gabe.
Të gjithë të drejtë.
Ndoshta unë goditi space bar apo diçka shokuar.
Le të bëjë atë përsëri.
Pra Zamyla.
Zamyla.
Gjëra të ndryshme.
Pra, çfarë po ndodh?
>> Pra, ne kemi këto dy linja e Kodi, GetString duke u quajtur dy herë.
Dhe pastaj, unë jam thjesht duke u përpjekur për të krahasuar s dhe t.
Por ajo që me të vërtetë, atëherë po ndodh?
E pra, shkrim dore tim gati kasap këtë shembull disi.
Dhe le të vërtetë të hedhin këtë deri këtu, si.
>> Pra, ne kemi një linjë si String s = GetString.
Pra, kjo është thjesht e parë Linja interesante nga ky program.
Por ajo që e gjithë kjo kohë ka qenë ndodh nën kapuç?
E pra, në të dorës së majtë anë është varg, e cila është një lloj ndryshore,
dhe është quajtur s.
Kështu që unë e di se kjo është duke përdorur kujtesën, ose RAM, në kompjuterin tim disi.
Kështu që unë jam duke shkuar për të abstrakte barazim se si një shesh.
32 bit, rezulton, por më shumë se në të ardhmen.
Dhe pastaj, çfarë po ndodh këtu?
>> E pra, GetString padyshim merr një varg nga përdoruesit.
Dhe GetString mori Zamyla ose Gabe ose Daven.
Pra, le të zgjedhin parë e atyre, që ishte Daven.
Pra në mënyrë efektive, çfarë GetString mori më në këtë rast e parë është D-a-v-E-n.
Dhe pastaj, çfarë tjetër ka ajo më jep fshehurazi?
Audienca: [padëgjueshme]
DAVID J. Malan: Po, / 0 ose null karakter.
Pra, në mënyrë efektive më dha një varg.
Por ne tashmë e dimë nga e mëparshme duket se një varg është vetëm një grup
të karaktereve, dhe është e ndërprerë nga ky karakter të veçantë sentinel, / 0.
>> Por nëse kjo është e vërtetë dhe kjo është një shesh,
kjo është qartë një drejtkëndësh shumë më të madhe.
Dhe në të vërtetë, kjo është, Unë pretendojnë, vetëm 32 bit.
Dhe kjo është në mënyrë të qartë më shumë se 32 bit, sepse kjo është ndoshta
tetë plus tetë plus tetë plus tetë plus tetë,
vetëm për shkak të bytes në ASCII.
Si dreq do të shkojmë për të përshtaten Daven në këtë kuti të vogël këtu?
>> E pra, ajo që është GetString bërë në të vërtetë?
E pra, ky rrjet këtu paraqet memorie kompjuteri tim ose RAM.
Pra, le të themi në mënyrë arbitrare se nëse secili prej tyre perfaqeson nje bajt,
atëherë ne mund të mendoj për secilin byte si ka një adresë,
si 33 Rruga e Oksfordit, ose 34 Oxford Street, apo 35 Oxford Street.
>> Pra, ashtu si shtëpitë kanë adresat dhe ndërtesat kanë adresat,
kështu që të bëjë bytes individuale të kujtesës kanë adresat ose numrat
që në mënyrë unike identifikimin e tyre.
Tani, kjo është arbitrar.
Por, për ta mbajtur atë të thjeshtë, unë jam duke shkuar për të përdorni hexadecimal vetëm nga konventa,
por 0x do të thotë asgjë tjetër se "kjo është heksadecimal."
dhe unë jam duke shkuar për të thonë se "D" përfundon në Byte Një në kujtesën.
>> I kam asgjë tjetër ndodh në kujtesës, kështu Daven mori vendin e parë
në Byte One.
Kjo, pastaj, do të jetë 0x2.
Kjo do të 0x3.
Kjo do të jetë 0x4.
Kjo do të 0x5.
Kjo do të jetë 0x6.
>> Por sapo ju të fillojnë të mendojnë në lidhje me atë duke bërë të kompjuterit
nën kapuç, ju mund të filloni për të dëshmoj
si ju, disa vjet më parë, do të kanë zbatuar C vetvete.
Çfarë është GetString ndoshta returning-- shkak të
ndjehet si ajo nuk është kthyer Daven, në vetvete,
sepse ai me siguri nuk do të përshtaten në këtë box-- pak
kështu që ajo që është e GetString ndoshta kthyer?
>> Audienca: [padëgjueshme]
>> DAVID J. Malan: Vendndodhja e Daven.
Dhe kjo është bërë këtë ndonjëherë që Week One.
Çfarë GetString është me të vërtetë kthimit nuk është një varg, në vetvete.
Kjo është një nga gënjeshtrat e vogla të bardha.
Është kthyer adresën e string në kujtesë, adresa unike.
Daven jeton në 33 Oxford Street.
Por më shumë shkurtimisht, Gavin jeton në 0x1, Adresa Number One.
>> Pra, ajo që merr vënë në këtë pak kuti pastaj, të jetë i qartë,
është vetëm adresa e atij vargut.
Pra, e gjithë kjo kohë, kjo ka qenë në vazhdim e sipër.
Por ajo që kjo lë të kuptohet se tani është se nëse të gjithë s ka
është një numër në brendësi të saj, i cili është për të ndaluar ju, programues,
nga vënë ndonjë numër në çdo ndryshueshme dhe vetëm duke kërcyer
në atë copë e kujtesës?
Dhe me të vërtetë, ne do të shohim që është një kërcënim herën tjetër.
>> Por tani për tani, kjo ndihet pamjaftueshme.
Nëse unë them, merrni mua një string, më jepni Daven.
Por ju nuk duhet të vërtetë jepni Daven.
Të gjithë ju më jepni është adresa Daven-së.
Si mund ta dini me siguri ku Daven fillon dhe ends--
Historia e gjetjes weird-- ku Daven fillon dhe mbaron,
dhe pastaj, tjetër string në memorie fillon?
>> E pra, nëse ju jeni të dorëzuar mua fillimi i Daven,
në thelb, si mund ta di ku në fund të emrit të tij është?
Ky karakter i veçantë null, e cila është e gjitha më e rëndësishme tani
nëse vargjet nën të individualitet identifikohen thjesht
në mënyrë unike nga vendndodhja e tyre në kujtesën.
Pra, e gjithë kjo kohë, kjo është atë që është duke ndodhur.
>> Pra, kur ne shohim tani në Kodi këtu, shpjegojnë
në qoftë se ju do të bug në linjë 26.
Pse është Zamyla dhe Zamyla ndryshme?
Pse është Gabe dhe Gabe ndryshme?
Po, në shpinë.
>> Audienca: Ata kanë adresa të ndryshme.
>> DAVID J. Malan: Thjesht sepse ata kanë adresa të ndryshme.
Sepse kur ju telefononi GetString përsëri, të cilat unë do të bëj shpejt këtu,
në qoftë se kjo është linja e dytë, string t, siç kam bërë në atë program,
është e barabartë me një tjetër thirrje për GetString.
Herën tjetër unë e quaj GetString, unë jam duke shkuar
për të marrë një copë të ndryshme të kujtesës.
>> GetString lejohet të pyesni operative
sistemi për më shumë dhe më shumë memorie.
Kjo nuk do të ripërdorimin e njëjtë gjashtë bytes çdo herë të vetme.
Ajo do të marrë një të re copë e kujtesës, e cila
do të thotë t do të merrni disa vlera të tjera mbi këtu.
>> Pra, kur të bëj s barabartë = t, ju nuk jeni të krahasuar
D kundër kësaj dhe një kundër kjo dhe V kundër kësaj.
Ju jeni duke e krahasuar këtë kundër kësaj, e cila
sinqerisht është useless-- goxha useful-- është shumë e kotë, pasi që me të vërtetë
kujdeset ku vargjet janë në kujtesën?
>> Dhe me të vërtetë, ne nuk kemi.
Dhe ne nuk jemi duke shkuar për fillojnë veçanërisht i kujdesshëm.
Vetëm për aq sa mete mund të lindin dhe kërcënimet e sigurisë mund të lindin vullnetin
ne fakt të fillojnë të kujdesen për këtë.
Pra, le të rregulluar këtë problem.
Rezulton, ju rregullohet super thjesht.
>> Dhe le të vërtetë, para se unë tregojnë se përsëri, çfarë do
të bëni në qoftë se në një klasë CS50, dhe keni pasur për të zbatuar
një krahasim kundër dy vargjet.
Ju në mënyrë të qartë nuk mund të përdorni vetëm s barabartë = t.
Por vetëm logjikisht, sa do ta krahasojmë këtë varg
kundër këtij vargut duke përdorur kodin e C?
Po.
>> Audienca: Vetëm të bëjë për lak [padëgjueshme]
DAVID J. Malan: Perfect.
Audienca: [padëgjueshme]
DAVID J. Malan: Po.
Vetëm të përdorni një për lak ose një ndërsa lak apo çfarëdo.
Por vetëm të aplikoni idenë themelore se në qoftë se kjo është një copë e kujtesës ose një grup
dhe kjo është, iterate mbi dy në të njëjtën kohë.
Dhe vetëm krahasoni letra.
>> Dhe ju keni marrë të jetë një pak të kujdesshëm, sepse ju
nuk duan një gisht të kaloj tjera
sepse një varg është më gjatë se sa të tjera.
Pra, ju jeni do të dëshironi të shikoni për kjo vlerë të veçantë në fund, null.
Por kjo është me të vërtetë, në fund, aq e thjeshtë sa që.
Dhe sinqerisht, ne nuk kemi nevojë për të reinvent timon atë.
Këtu është Version Dy.
Dhe ajo që unë jam duke shkuar për të thënë këtu është se në vend të krahasimit s barabartë = t,
Unë jam në vend që do të them, nëse vargu krahasimi i s presje t barabartë = 0.
Tani, çfarë është string krahasoni?
>> Kjo rezulton, kjo është një funksion që vjen me C, qëllimi i të cilit në jetë
është për të krahasuar dy vargjet.
Dhe trazim të krahasuar, nëse lexojmë saj faqe apo dokumentacionin ose CS50 njeri
referencë, ajo do të thjesht ju them se trazim
krahasoni kthimit ose një negative Numri i ose një numër pozitiv ose zero,
ku do të thotë zero ata janë të barabartë.
>> Pra thjesht hamendje.
Çfarë mund të thotë nëse llokoçis kthimit të krahasuar
vlera negative apo vlera pozitive?
Audienca: Më e madhe ose më pak se.
DAVID J. Malan: Po, madhe se ose më pak se.
Pra, në qoftë se ju të kërkuar për të zgjidhur një tërësi bandë e vargjet në një dictionary--
si ne do përfundimisht poshtë road-- Funksioni i përsosur për të përdorur potencialisht,
sepse kjo do të bëjë që krahasimi i strings për ju, dhe tregoni
ju bën një vijë para b, ose bën b vijnë përpara një alfabetik.
Ne mund të bëjë pikërisht këtë.
>> Dhe njoftim kam bërë një tjetër gjë në këtë shembull.
Çfarë tjetër ka ndryshuar më e lartë deri në këtë funksion kryesor?
Char *.
Dhe kjo është se gënjeshtër tjetër bardhë.
E gjithë kjo kohë, kur ju keni qenë i shkruar në varg,
ne kemi qenë në fshehtësi rishkrimin string si char * në mënyrë që tingëllimë të vërtetë
ju kupton.
>> Me fjalë të tjera, në CS50.h dhe si ne do të shohim në fund,
kemi bërë një sinonim i quajtur varg kjo është e njëjta gjë si char *.
Dhe tani për tani, e di vetëm se *, Në këtë kontekst, të paktën,
do të thotë adresën.
>> Adresën e kujt?
E pra, fakti që kam thënë char *, dhe nuk int * ose noton *,
do të thotë se char * është adresa e një char.
Pra, kjo kuti pak këtu, aka string, është me të vërtetë i tipit char *,
e cila është thjesht një mënyrë e sofistikuar për të thënë, në këtë kuti do të shkojë një adresë.
Dhe çfarë bën që adresa referohen?
Me sa duket, një char.
>> Por ne mund absolutisht kanë int * dhe gjëra të tjera.
Por tani për tani, char * është me të vërtetë më e drejtpërdrejtë dhe një interes.
Pra, ky problem është duke shkuar të rritet, edhe pse, përsëri.
>> Supozoni I hapur këtë program.
Le të shohim nëse tani ne mund të parashikojnë çfarë është e gabuar me këtë kod.
Pra, në këtë program, kopje-0, unë jam duke shkuar për të shkuar përpara dhe përsëri e quajnë
GetString dhe ruajtur vlerën në s.
>> Dhe pastaj, pse jam unë duke bërë këtë, vetëm si një kujtim nga javët e fundit?
Ne e bëmë të themi se GetString nganjëherë kthehet null.
Çfarë do të thotë nëse GetString kthehet null?
Diçka shkoi keq.
Kjo ndoshta do të thotë vargu është shumë e madhe, nga e kompjuterit e kujtesës.
Kjo ndodh super, super, super rrallë, por kjo mund të ndodhë.
Ne duam që të shikoni për të, dhe kjo është e gjitha ne jemi duke bërë.
>> Sepse ne do të shohim tani, në qoftë se ju nuk e bëni filloni duke kontrolluar zakonisht për gjëra të
si null, ju mund të në të vërtetë të fillojë për të shkuar
për adresat në kujtesën që janë të pavlefshme.
Dhe ju do të jeni për të filluar inducing gjithnjë e më shumë gabime segmentimit.
Ose në një Mac apo PC, vetëm duke shkaktuar një kompjuter për të ul receptorin e telefonit
ose një program për të ngrirë, potencialisht.
>> Deri tani, unë pretendojnë në kopje-0.c, që unë jam duke shkuar për të kopjuar këto vargjet nga rruga
i linjës 28.
Dhe pastaj, unë jam duke shkuar pretendimit në fund
këtu që unë jam duke shkuar për të ndryshuar një prej tyre.
>> Pra këtë njoftim.
Unë jam duke e quajtur strlen tonë të vjetër mik.
Dhe vetëm të shpjegojë në anglisht çfarë kjo linjë 34 është duke bërë?
Çfarë do t kllapa 0 përfaqësojnë në të majtë.
Po.
>> Audienca: Karakteri i parë i t?
DAVID J. Malan: karakteri i parë i t.
Kjo ishte.
Karakteri i parë i t, unë dua të caktojë versionin uppercase
të karakterit të parë në t.
Pra, kjo është kapitalizuar Letra e parë.
Dhe pastaj, gjëja e fundit që unë bëj në këtë program është pohoj këtu është
origjinal, s, dhe këtu është kopje, t.
>> Por bazuar në histori ne vetëm tha për atë që vargjet të vërtetë janë,
çfarë është linjë 28 vërtetë duke bërë, dhe çfarë është
bug rezultuar shkuar të jetë në ekran?
>> Pra, së pari, pyetja e parë, 28.
Çfarë është = varg t s me të vërtetë duke bërë?
Në qoftë se ne kemi mbi-dorën e majtë Ana këtu = varg t s;
që më jep një kuti këtu dhe një kuti këtu.
Dhe mendoj kjo adresë është 0x, le të themi, 50 këtë herë, në mënyrë arbitrare.
Çfarë bën = varg t s bëjnë nën kapuç?
>> Audienca: [padëgjueshme]
>> DAVID J. Malan: Ajo ruan kujtesën adresojnë atje, kështu që 0x50 shkon atje.
Pra, nëse tani, unë shkoj për të parë karakter në t dhe uppercase atë,
çfarë jam unë në mënyrë efektive duke bërë të s?
Unë jam me të vërtetë duke bërë të njëjtën gjë, apo jo?
Sepse nëse Adresa 0x50-- dhe vetëm, unë nuk kanë shumë vend në bord këtu,
por supozojmë se kjo është e 0x50 poshtë këtu, diku në kujtesë të kompjuterit tim.
>> Dhe unë, për shembull, Gabe në Fjala këtu, si kjo.
Dhe unë kam thënë t kllapa 0 merr kapitalizuar.
E pra, t kllapa 0 është Letra e parë në t.
Pra, pak g do të bëhet G. i madh Por problemi
është, çfarë bën s gjithashtu tregojnë për?
>> Audienca: E njëjta gjë.
>> DAVID J. Malan: E njëjta gjë e saktë.
Pra, një shpjegim i thjeshtë ndoshta, edhe në qoftë se sintaksa është pak i çuditshëm.
Pra, le ta bëjmë këtë.
Bëni kopje-0 dhe pastaj ./copy-0.
Thuaj diçka: Gabe.
Dhe për fat të keq, të dy ata tani janë kapitalizuar,
por për se themel Arsyeja që ne jemi thjesht
tani që kanë të bëjnë me adresat.
>> Deri sa nuk kemi të fillojnë të address-- nuk ka pun intended--
si nuk kemi të fillojnë për të adresuar ky problem i veçantë?
E pra, në copy1.c, gjërat janë duke shkuar për të marrë një pak më e komplikuar.
Por unë do të pretendojnë një zgjidhje e konceptualisht e thjeshtë.
>> Pra, shumë për të marrë në shikim të parë.
Nuk do të jetë e lehtë për të parë herë që të shtypni atë, ndoshta,
por nëse problemi është se thjesht duke bërë = t s vetëm
kopje adresa, çfarë, përsëri në qoftë se unë mund të vini për ju,
do të jetë zgjidhje për të vërtetë kopjimi një varg?
>> Audienca: Ne do të ndoshta përdorni një lak përsëri.
>> DAVID J. Malan: Po.
Pra, ne do të duhet një lak përsëri.
Dhe për shkak se në qoftë se ne duam të kopje një s varg në një tjetër varg,
ne ndoshta doni të bëni atë karakter nga karakteri.
Por problemi është, në qoftë se kjo është me origjinë s,
tani ne kemi nevojë për të filluar në mënyrë të qartë caktimin e kujtesës për t.
>> Me fjalë të tjera, le të shlyen këtë për herë të fundit.
Nëse kjo është String s = GetString.
Dhe le të vënë këtë deri këtu, si.
Kjo është GetString.
Dhe pastaj, foto për diçka si kjo do të jetë si më parë,
g-a-b-e- / 0.
Kjo duket një diçka të vogël si kjo.
Dhe s për këtë arsye, ne e quajmë këtë 0x50, dhe që do të jetë 51, 52.
>> Pra, kjo është 0x50.
Dhe pastaj, unë bëj varg t.
Në kujtim, që vetëm do të më jepni një shesh të vogël si kjo.
Pra, çfarë është hapi kyç tani?
Nëse unë dua të kopjoni s në t, çfarë bosh nuk kemi nevojë për të mbushur në këtu?
Apo çfarë na duhet të bëjë në nivel të lartë?
Po?
Dikush?
Po.
>> Audienca: Ne duhet të [padëgjueshme].
DAVID J. Malan: Po, ne duhet të plotësoni këtë bosh.
Unë nuk mund të kopjoni dhe pastaj germa emrin Gabe-së
deri sa unë kërkoj të sistemit operativ për një copë e kujtesës
kjo është të paktën po aq i madh sa në origjinal.
Kështu që na lë me një pyetje.
>> Si mund të kërkojë të sistemit operativ nuk vetëm për një pointer-- të thjeshtë të vogël
pasi kjo është quajtur, një adresa, a nuk pointer--
për një kuti të thjeshtë të vogël si kjo quhet një varg?
Si mund të pyesni operative sistem për një copë të madhe të kujtesës?
Deri tani, unë kam marrë vetëm që i mbështesin në mënyrë indirekte duke telefonuar GetString.
Pra, si është e GetString madje edhe duke marrë kujtimin e saj?
>> E pra, ajo rezulton se ka ky funksion tjetër këtu
që ne tani do të fillojnë të përdorin.
Tani, kjo duket than-- mënyrë më të fshehtë dhe unë jam i vetmi që mund të shihni it--
këtë linjë duket rruga më e fshehtë atëherë ajo duhet në shikim të parë.
Por le të vë në lojë atë larg.
>> Në anën e majtë, unë kam char * t.
Pra, në anglisht, le të fillojë për të formuluar dënimet e duhura në zhargon teknik.
Pra, kjo është caktimin e një variabël i tipit char * quajtur t.
Tani, çfarë do të vërtetë do të thotë?
>> E pra, që do të thotë, çfarë jam unë do për të vënë në këtë variabël të quajtur t?
Një adresë e një char.
Pra, kjo është vetëm e thjeshtë, Mënyra më e arsyeshme
e përshkruan anën e majtë.
Kështu që krijon kjo kuti këtu vetëm.
Pra, në anën e djathtë, me sa duket, do
për të caktuar se madhe copë e kujtesës se si?
Pra, le të vë në lojë këtë larg.
>> Është e madhe në shikim të parë, por çfarë po ndodh brenda këtu?
Së pari, nuk ka e malloc, e cila është me sa duket miku ynë i ri,
"Memorie ndajë."
Pra, ky është argumenti duke u kaluar në të, kështu që është një argument mjaft i madh.
Pra, le të vë në lojë këtë larg.
>> strlen i s, natyrisht, paraqet the--
Audienca: Numri i karaktereve.
DAVID J. Malan: Vetëm Numri i karaktereve në s.
Pra, gjatësia e s, string origjinale.
Pra, G-a-b-e.
Pra, kjo është ndoshta katër në këtë rast.
Pse jam unë duke bërë +1 pas duke e quajtur strlen të s?
Audienca: [padëgjueshme]
DAVID J. Malan: Për se karakter të veçantë null.
Nëse ju më pyesni se çfarë është gjatësia e Emri Gabe-së, unë jam duke shkuar për të thënë katër.
Nën kapuç, edhe pse, unë duhet që byte pestë për karakterin null.
Pra, kjo është arsyeja pse unë jam duke bërë +1.
>> Tani vetëm në rast se ju jeni duke këtë program në një kompjuter tjetër se, të themi,
aplikim CS50, ku madhësia e një char
mund të jenë të ndryshme nga computer-- tim
rezulton se unë mund të telefononi këtë sizeof operator, thjesht pyesni kompjuterin,
çfarë është madhësia e një char në këtë kompjuter?
>> Dhe duke shumëzuar pesë në këtë shembull nga madhësia e një char, e cila
në shumicën e kompjuterëve do të vetëm të jetë një, e malloc
do të ndajë për mua kjo madh copë e kujtesës mbi këtu në të djathtë.
Dhe ajo do të return-- kjo është një function-- kështu që është e
do të kthehen tek unë çfarë?
Audienca: Adresa?
DAVID J. Malan: adresa e çfarë?
Audienca: Nga kujtesës kjo ndarë?
DAVID J. Malan: Nga memorie të ndarë.
Kështu që unë nuk kam asnjë ide, sinqerisht, ku kjo do të përfundojë.
Unë do të propozojë që ajo do të përfundojë deri në 0x88.
Krejtësisht arbitrare, por diku tjetër se 0x50,
për shkak të sistemit operativ, çfarë Windows dhe Mac OS të bëjë për mua, është
sigurohuni se ai është duke i dhënë me chunks të ndryshme të RAM.
>> Pra, kjo është vlera e ku ky copë e kujtesës mund të përfundojnë.
Pra, kjo është ajo që përfundon këtu, 0x88.
Deri tani në mënyrë të qartë, unë mund ta kuptoj se kjo nuk është e njëjtë si kjo,
sepse ata janë treguar në chunks të ndryshme të kujtesës.
Pra, nëse unë tani në të vërtetë dua të kopjoni këtë në, le të bëjë zgjidhjen e propozuar.
>> Le të shkojë, të krijojë një për lak, dhe të bëjë t kllapa i merr s kllapa i.
Sepse tani unë mund të përdorni kjo array-si simbol,
sepse edhe pse e malloc shumë generically ndan mua kujtesës,
memorie është bytes vetëm puqur.
Byte, byte, bajt, të kthyer prapa në shpinë.
>> Unë mund me siguri si një programues trajtojnë atë si një grup, i cili
do të thotë unë mund të përdorni këtë në fund të njohur simbol i vetëm disa kllapa katrore.
>> Pra, më lejoni të bëj një pauzë atje, sepse kjo është një shumë të gjithë në të njëjtën kohë, edhe
pse ideja themelore në radhitje është se string, të gjithë këtë kohë,
nuk është një lloj i ri dhënave në vetvete.
Është vetëm një të ashtu-quajtur akrep, një adresë e një karakter,
e cila vetëm do të thotë se është një numër i që nga konventa e njeriut
ne priren për të shkruar si 0x diçka.
>> Por kjo është vetëm një numër, si 33 Oxford Street,
e cila ndodh të jetë Adresa e ndërtesës CS-së.
Çdo pyetje mbi këto detaje?
Po?
>> Audienca: Pse ne kontrolloni për t barabartë tek null?
>> DAVID J. Malan: Pse nuk kemi kontrolloni për t barabartë me null?
Nëse lexojmë documentation-- question-- madhe për malloc,
kjo do të thotë në shtyp gjobë, ndonjëherë malloc mund të kthehen null,
ashtu si GetString.
Dhe me të vërtetë, GetString kthen null në qoftë se, nga ana tjetër, e malloc kthen null,
sepse GetString përdor malloc.
>> Dhe kjo mund të ndodhë nëse OS, Mac OS, Windows, çdo gjë, është thjesht
jashtë kujtesës për ju.
Pra, kjo është ajo që ka ndodhur atje.
>> Dhe më lejoni të zbulojë një gjë tjetër që vetëm mund të fryj mendjen tuaj
ose plotësisht të jetë shumë larg mbi linjë.
Por më lejoni të ndalem njëjtë për lak për kopjim,
të cilën një moment më parë, risjell ishte këtë. t kllapa i merr s kllapa i.
>> E bukur dhe user-friendly.
Ndjehet si Week Dy përsëri.
Por ky version në fakt mund të jetë e rishkruhen si ky, i cili duket i fshehtë.
Kjo është një teknikë të quajtur akrep aritmetike, adresa aritmetikë.
Por pse e bën këtë punë?
>> Tani annoyingly, Autorët e C vendosi të përdorë
simboli * për qëllime të ndryshme.
Ne kemi parë që përdoret një herë tashmë, char *, që do të thotë "më jepni një ndryshore
që do të përmbajë adresa e një char. "
* Pra, char në këtë kontekst do të thotë "më jep mua një ndryshore."
>> Për fat të keq, në qoftë se ju përdorni * pa një fjalë para saj, si shkrumb,
është quajtur tani Operatori dereference.
Dhe ne do të shohim më shumë të këtë para se të gjatë.
Por ai thjesht do të thotë "shkoni atje."
Është si duke thënë, në qoftë se dikush i dorëzoi mua në një copë letër "33 Oxford Street"
në qoftë se unë bëj "* 33 Oxford Street", që do të thotë "Shkojnë poshtë rrugës për të ndërtesës CS."
>> Pra * thjesht do të thotë të shkoni atje nëse nuk ka asnjë fjalë në frontin e tij.
Pra, çfarë është t, të jetë i qartë?
t është adresa e copë e kujtesës që është dhënë përsëri në mua.
s është adresa e asaj, që të jetë i qartë, në shembullin e kemi diskutuar,
i Gabe renditshëm?
s është adresa of--
Audienca: string.
DAVID J. Malan: Nga emri origjinal Gabe-së.
Pra, kjo është adresa e kjo copë e kujtesës.
Pra, nëse unë them t + i-- i, njoftim, është vetëm miku ynë i vjetër.
Është vetëm një variabël indeks që është iterating nga zero në dorë
në gjatësinë e string s.
Kështu ajo do të jetë zero, atëherë, pastaj dy, pastaj tre, pastaj katër.
Pra, le të mblidhen këto të reja Scratch-si copa mister, nëse do,
edhe pse, përsëri, sintaksë është shumë më e errët se Scratch.
Pra, t është një adresë + Unë do të më jepni
një numër, sepse këto janë të gjitha Numrat që ne kemi qenë duke tërhequr si magji.
Por ata janë vetëm numra.
>> Pra, nëse adresa e t thoshim: ishte 0x88, çfarë është 0x88 plus zero.
Edhe nëse ju nuk jeni të kënaqur me magji akoma, të marrë një guess.
>> Audienca: origjinale.
>> DAVID J. Malan: Ende 0x88.
Pra, çfarë do të thotë * 0x88?
Kjo do të thotë, "të shkojnë atje", që do të thotë mënyrë efektive, "vënë gishtin këtu."
Dhe tani në të djathtë anën e kjo shprehje, * dhe pastaj në parens,
s + i nënkupton S, e cila është adresuar deri këtu e pak g.
s + 0 është, sigurisht, s, çfarëdo që është.
>> Deri tani, kjo është s *, të cilat ashtu si * 33 Oxford Street do të thotë të shkojnë në adresën e
s.
Kështu që këtu është ky gisht, dora e djathtë.
Pra, çfarë jam unë do të kopje në çfarë?
Gjëja në të djathtë, e cila është Gabe, pak g këtu, në këtu.
>> Dhe kështu që efekti i se përsëritje e parë e lak,
si ju propozuar, edhe pse kjo duket crazy më e komplikuar se çdo gjë
ne kemi parë më parë, është thjesht duke thënë shkoni këtu dhe kopje atë karakter këtu.
Është duke ju dhënë një hartë të të dy vende.
>> Dhe ne do të shohim shumë më tepër për këtë.
Por tani për tani, shpresa është vetëm për të prezantoj disa nga këto ide themelore.
Dhe me të vërtetë, le të shohim në një program final këtu,
dhe pastaj claymation premtuar, e cila do të bëjë çdo gjë në rregull.
Të gjithë të drejtë.
Pra më lejoni të hapur up-- atje të shkojmë.
Pra, le me-- ne do të kthehen për këtë foto para se të gjatë.
Më lejoni të hapur këtë shembull përfundimtar këtu.
>> Kështu që këtu është një super, super program i cili realizon
asgjë në jetë që bën në vijim.
Ajo së pari shpall dy variablave, x dhe y, që nuk janë numra këtë herë,
në vetvete.
Ata nuk janë integers, në vetvete.
Ata janë me sa duket int *.
Pra vetëm njeri, çfarë do të thotë në qoftë se llojin e të dhënave tuaja, ndryshueshme tuaj,
është e tipit int * yll?
Kjo është adresa e një int.
>> Kështu që unë kam asnjë ide se ku është ende.
Ajo thjesht do të thotë "të vënë, përfundimisht, adresa e një int këtu. "
0x50, 0x88, kudo që është në kujtesës, një adresë po ndodh atje.
Dhe kjo është ajo y është do të jetë, si.
>> Nëse unë tani them x = malloc (sizeof (int)), kjo është një mënyrë e sofistikuar për të thënë,
hey sistemit operativ, nëpërmjet malloc, më jepni kujtesë të mjaftueshme për madhësinë
e një int, e cila është ndoshta do të jetë 32 bit ose katër bytes.
>> Pra, çfarë do malloc kthehet?
Malloc kthen një adresë.
Pra, çfarë do të merrni ruhen në x?
Adresa e copë e kujtesës, katër bytes, që malloc
gjetur vetëm për mua duke i pyetur sistemit operativ.
>> Tani ndërkohë, linjë katër këtu, x = 42 *.
Vetëm të jetë i qartë, çfarë po ndodh atje poshtë?
Në anën e majtë, * x.
që është si * 33 Oxford Street.
Pra * x do të thotë çfarë?
>> Audienca: Go to.
>> DAVID J. Malan: Shko në atë adresë.
Kudo se copë e memorie është, shkoni për të.
Dhe të vënë atë atje, natyrisht?
Audienca: 42.
DAVID J. Malan: 42.
Në rregull, y *, të njëjtën ide.
Shko në adresën në y.
Vendos numrin 13 atje, por ajo që është y në këtë moment?
Audienca: Nuk ka memorie për y.
DAVID J. Malan: Ka ka memorie për y.
Pra, çfarë e bën y ndoshta përmbajnë, si ne kemi qenë duke thënë se?
>> Audienca: Garbage.
>> DAVID J. Malan: Disa vlera e mbeturinave.
Tani, vlera e mbeturinave është ende një numër.
Ajo ende mund të jetë i gabuar për një adresë.
Është sikur dikush scribbled diçka poshtë,
dhe unë keqinterpretuar atë si kuptim disa ndërtesa poshtë rrugës.
Dhe në qoftë se ju vetëm të përpiqen për të shkuar në disa ndërtesa që ju nuk bëni vet,
apo ndonjë copë e kujtesës ju nuk keni qenë dhënë, gjëra të këqija mund të ndodhë.
Kompjuteri mund të rrëzimit, ose disa të tjera Sjellja e papërcaktuar mund të ndodhë.
>> Pra intro, atëherë, për të Binky është kjo.
Unë ende kujtohet, 20 disa vite më vonë i rastësishëm,
ku isha kur më në fund kuptohet pointers.
>> Që do të thotë, në qoftë se ju lënë këtu në tre minuta
dhe mendoj se unë nuk bëj kuptojnë pointers, të realizuar
M'u kujtua për 20 vjet për disa arsye të çmendur
kur dhe pse ajo më në fund zhytur në, i ulur me mësimin tim
shokët, Nishat Mehta në mbrapa e Eliot Dining Hall.
Tani, unë kam mend kjo për shkak se kjo ishte
njëra nga temat I, në veçanti, luftuan me të.
Dhe pastaj, ai më në fund klikuar, si unë guxoj të them shumë tema
përfundimisht do.
Dhe tani, për të bërë që të ndjehen të gjithë më të lumtur dhe të gjithë më bindëse,
le të marrin një vështrim përfundimtar në tonë tre minuta e fundit këtu në Binky,
nga mikut tonë, Nick Parlante nga Stanford.
>> [VIDEO Playback]
>> -Hej, Binky.
Zgjohu!
Është koha për argëtim akrep.
>> -Çfarë Është se?
Mëso për pointers?
Oh, Goody!
>> -Well, Për të filluar, unë mendoj që ne jemi do të duhet një çift pointers.
>> OK.
Ky kod ndan dy pointers, të cilat mund të tregojnë për integers.
OK.
E pra, unë shoh dy pointers, por ata nuk duket të jetë duke treguar për ndonjë gjë.
>> -Kjo Është e drejtë.
Fillimisht, pointers nuk tregojnë për ndonjë gjë.
Gjërat që ata tregojnë për quhen pointees, dhe vendosjen e tyre deri-së
një hap i veçantë.
>> Oh, e drejtë, e drejtë.
Unë e dinte se.
Të pointees janë të ndara.
Er, kështu që si mund të ndajë një pointee?
>> OK.
E pra, ky kod ndan një pointee re numër i plotë,
dhe kjo pjesë përcakton x për pikë për të.
>> -Hej, Që duket më mirë.
Pra, të bëjë atë të bëjë diçka.
>> OK.
Unë do dereference x akrep në ruani numrin 42 në pointee saj.
Për këtë mashtrim, unë do të duhet tim Magic Wand e Dereferencing.
>> -Your Magic Wand e Dereferencing?
That-- kjo është e madhe.
>> -Kjo është ajo që kodi duket si.
Do vendosur vetëm numrin, dhe [POP]
>> -Hej, Shikoni.
Nuk shkon.
>> -Kështu që duke bërë një dereference në x poshtë shigjeta për të hyrë pointee saj.
Në këtë rast, një dyqan 42 në atje.
Hey përpiquni të përdorni atë për të ruajtur numrin 13 nëpërmjet kursorit tjetër, y.
>> OK.
Unë do të shkoj vetëm mbi këtu për të y, dhe për të marrë numrin 13 krijimit.
Dhe pastaj, të marrë shkopin e Dereferencing dhe vetëm [BUZZ]
>> Oh!
>> Oh, hej!
Kjo nuk funksionoi.
Thuaj, Binky, unë nuk mendoj dereferencing y është një ide e mirë, sepse ju e dini,
ngritjen e pointee është një hap i veçantë.
Dhe unë nuk mendoj se ne ndonjëherë e bëri atë.
>> Pikë -Mirë.
-Po.
Ne ndarë tregues y, por ne kurrë nuk e vënë atë në tregojnë për një pointee.
>> -Shumë Vëmendshëm.
-Hej, Ju jeni në kërkim të mira atje, Binky.
A mund të rregullohet në mënyrë që pikat y në të njëjtën pointee si X?
>> -Sure.
Unë do të përdorin magjik shkop magjik e mia e Pointer Caktimin.
>> -A Që do të jetë një problem si më parë?
-Jo.
Kjo nuk prek pointees.
Ajo vetëm ndryshon një tregues për tregojnë të njëjtën gjë si një tjetër.
>> Oh, unë shoh.
Tani pikë y në të njëjtin vend si x.
Pra, të presim.
Tani, y është fikse.
Ajo ka një pointee.
Kështu që ju mund të përpiquni shkopin e Dereferencing përsëri për të dërguar 13 over.
>> -Uh, OK.
Këtu ajo shkon. [POP]
>> -Hej, Shikoni në se.
Tani dereferencing punimeve të y.
Dhe për shkak se pointers janë ndarë se një pointee, ata të dy e shohin 13.
-Po.
Ndarja, çfarëdo.
Pra, do të shkojmë për të kaluar vende tani?
>> Oh, shikoni.
Ne jemi jashtë kohe.
>> -But--
>> -Vetëm mos harroni të tre rregullat akrep.
Numri Një, struktura bazë është se ju keni një tregues,
dhe kjo vë mbi të një pointee.
Por akrep dhe pointee janë të ndara,
dhe gabim i përbashkët është për të ngritur një tregues,
por për të harruar për të dhënë atë një pointee.
>> Numër Dy, dereferencing akrep fillon në treguesin
dhe ndjek shigjetën e saj mbi të hyni pointee saj.
Siç e dimë të gjithë, kjo punon vetëm nëse ka
një pointee, cili lloj i merr përsëri Rregulli numër një.
>> Numri Tre, akrep Detyra merr një akrep
dhe ndryshon atë që të tregojnë për njëjtë pointee si një tjetër tregues.
Pra, pas detyrës, dy pointers
do pikë të njëjtë pointee.
Ndonjëherë, që quhet ndarja.
Dhe kjo është e gjitha nuk është për atë, me të vërtetë.
Bye-bye tani.
[VIDEO END rishikim]
DAVID J. Malan: Kjo është ajo për CS50.
Ne do të shihemi javën e ardhshme.