[Nagpe-play ng musika] David J. MALAN: Lahat ng karapatan. [Tawa] Maligayang pagbabalik. Ito ay CS50. At ito ang katapusan ng linggo limang. At hanggang ngayon, na namin medyo marami Na-pagkuha para sa ipinagkaloob na doon Umiiral na ito tagatala, kalatungin, na ikaw Na-invoking sa pamamagitan ng paraan ng ito iba pang mga tool na tinatawag na Magsagawa sa paanuman magically Kino-convert ng iyong source code sa bagay na code, ang mga zero at mga bago na ang iyong computer CPU, central processing unit, talagang naiintindihan. Ngunit ito lumiliko out mayroong isang numero na pagpunta sa ilalim ng hood sa sa pagitan ng input at output. At nais kong imungkahi na namin laman na out sa isang kaunti pa sa detalye apat na mga hakbang na ito, may isang bagay na tinatawag na pre-processing, isang bagay tinatawag na kino-compile, na nakita natin, isang bagay na tinatawag na assembling, at isang bagay na tinatawag na pag-uugnay. Kaya hanggang ngayon, sa ilan sa aming mga mga programa, mayroon kaming kasamang matalim. Higit pang mga kamakailan-lamang na namin ay may ilang matulis Tinutukoy para sa constants. Kaya ito lumiliko out na ang mga bagay na ay may prefix na ang hash simbolo o ang pound simbolo ay mga pre-processor direktiba. Iyon lang ang isang magarbong paraan ng sinasabi ng mga ito isang linya ng code na talaga convert sa ibang bagay bago ang computer kahit subukang i-convert ang iyong programa sa mga zero at mga bago. Halimbawa, matulis kasamang standard I / O. H, medyo magkano lamang ay nangangahulugan pumunta nauuna, grab ang mga nilalaman ng mga file stdio.h at ilagay ang mga ito doon. Kaya walang mga zero at mga bago sa puntong iyon pa. Ito ay talagang lamang ng isang pagpapalit. At na tapos na sa panahon ng tinatawag na pre-processing entablado, kapag nag- talaga tumakbo kalatungin o partikular na Magsagawa sa karamihan ng mga kaso. Kaya ang lahat ng ito ay na nangyayari unang awtomatikong kaya sa ngayon. Pagkatapos ay dumating ang compilation hakbang. Ngunit kami oversimplified compilation. Kino-compile ang isang programa talagang ay nangangahulugan na dalhin ito mula sa isang bagay tulad ng C, ang source code na aming pagsusulat, pababa sa isang bagay na tinatawag na assembly. Assembly wika ay isang mas mababang antas wika na, thankfully, hindi namin kalooban magkano ang pagkakataon upang isulat ito semestre. Ngunit ito ay sa pinakamababang antas sa pakiramdam mo na literal magsimula pagsulat idagdag at ibawas at multiply at i-load mula sa memorya at i-save sa memorya, ang napaka mga pangunahing tagubilin na ang isang computer, sa ilalim ng hood, talaga naiintindihan. Panghuli, assembling tumatagal na wika sa mga zero at mga bago na kami nakapunta naglalarawan kaya sa ngayon. At tunay na bilang wakas, mayroon ng tinatawag na pag-uugnay phase, na kung saan bibigyan namin ng makita sa sandali lamang, na pinagsasama ang iyong mga zero at ang mga may mga zero at mga iba pang mga tao bago na nilikha mo. Kaya isaalang-alang ito sobrang simple na programa. Ito ay mula sa Linggo 1. Ito lang ang sinabi, Hello World, sa screen. Kami bumangga ito sa pamamagitan ng kalatungin. O kaya namin tumakbo ito sa pamamagitan ng Gawing na kung saan tumatakbo kalatungin. At outputted sa panahon kung saan ilang mga zero at mga bago. Ngunit ito lumiliko out mayroong isang intermediate na hakbang. Kung pumunta ako sa paglipas dito - oops, hindi nais na makita sa kanya pa. Kung pumunta ako sa paglipas dito sa aking appliance at buksan up ako hello.c, dito ay ang parehong programa. At kung ano ako ng pagpunta sa gawin sa aking mga terminal window dito ay pupuntahan ko tumakbo kalatungin sa halip na Magsagawa, na automates ang lahat ng apat mga hakbang na ito para sa amin. At ako pagpunta sa gawin kalatungin-S at pagkatapos hello.c at pagkatapos ay ipasok. At nakakuha ako ng nagbi-blink na prompt muli, na ay mabuti. At ngayon sa isang bahagyang mas malaking window, Pupunta ako upang buksan ang gedit in dito. At ako pagpunta upang buksan ang isang file na, lumiliko out, ay tinatawag na hello.s ito Naglalaman ang assembly na wika Ako refer sa mas maaga. At ito ay kung ano ang tinatawag na assembly wika, medyo mababa ang antas mga tagubilin na ang iyong Intel CPU o kahit anong ito ay na ang nasa loob ng naiintindihan. At mov ay para sa paglipat. tawag ay para sa pagtawag, isang napakababang antas ng pag-andar. sub ay para ibawas. Kaya kapag mayroon kang isang partikular na CPU sa loob ng iyong computer, kung bakit ito naiiba, kumpara sa ibang mga CPUs sa merkado, na kung saan ay tagubilin ito Nauunawaan at madalas kung paano mahusay na ito ay, kung gaano kabilis ito ay sa pagpapatupad sa ilang ng mga tagubilin. Ngayon para sa higit sa na ito, maaari mong gawin susunod Taglagas CS61 sa kolehiyo. Ngunit dito mayroon kami, halimbawa, ang ilang mga mga pantukoy na maaaring magmukhang pamilyar. hello.c ay ang pangalan ng program. . Teksto - mayroong hindi magkano ng interes doon ngayon lang, isipin ang na ang teksto segment, pati na ng Monday, kung saan ay sa memorya ng iyong aktwal na programa ay nagtatapos up. Kaya na hindi bababa sa vaguely pamilyar doon. Dito, siyempre, ay isang pagbanggit sa aming mga pangunahing pag-andar. Scroll down, ang mga mag-refer sa mga bagay tinatawag na nagrerehistro, napakaliit na chunks ng memory sa loob ng iyong aktwal na CPU. At kung mag-scroll down na ako kahit na pa, nakikita ko ang ilang mga pag-uuri hindi direktang mga pagbanggit ng ASCII. At doon, sa katunayan, ay ang string na, kumusta, kuwit, mundo. Kaya mahaba kuwento maikli, ito ay naging nangyayari para sa iyo, awtomatiko, sa ilalim ng hood sa lahat ng oras na ito. At kung ano ang nai-nangyayari talaga ay sabay-sabay mo na tumakbo kalatungin, o sa pamamagitan ng paraan ng Gawing, nakakakuha ka ng una, mula sa source code, ang tinatawag nang gayon assembly wika. Pagkatapos kalatungin ay nagko-convert ang assembly wika pababa sa zero at bago. At ito ay ang slide na nagsimula kaming ang aming mga talakayan sa Linggo sa 0 - at pagkatapos ay Linggo 1 on. At pagkatapos ay sa wakas, mga zero at mga bago ay na kasama ng mga zero at mga bago mula sa mga aklatan na aming pagkuha para nabigyan tulad ng Standard I / O o ang String Library o kahit ang CS50 library. Kaya upang ipinta ang larawang ito nang higit pa biswal, mayroon kaming hello.c. At, siyempre, ay gumagamit ng printf gumana na sabihing, kumusta mundo. Ang compilation hakbang na tumatagal ito pababa sa na file pa lang namin nakita hello.s, kahit kahit na karaniwang tinanggal Awtomatikong para sa iyo. Ngunit iyon ang assembly code sa gitna na hakbang. At pagkatapos ay kapag magtipon namin ang assembly wika, kaya na magsalita, na kapag nag- makakuha ng mga zero at mga bago. Kaya namin ang naka-zoom in nang epektibo sa ngayon kung ano ang aming na-pagkuha para sa ipinagkaloob, ay nangangahulugan ng pagpunta source code sa bagay na code. Ngunit bilang wakas, ngayon na ang parehong larawan - sabihin isalya ito sa paglipas ng sa kaliwang bahagi. At tandaan na sa tuktok na mayroong Nabanggit ko stdio.h. Iyan ay isang file na nagsama kami ng mga sa halos lahat ng mga programa na aming isinulat. At iyon ang file na kung saan ang mga nilalaman makapag-copy paste, mabisa nasa ibabaw ng iyong code. Ngunit ito lumiliko out na, sa isang computer sistema sa isang lugar, mayroong isang baka stdio.c file na may isang taong nagsulat taon nakalipas na ipinapatupad ng lahat ng mga mga function na ay ipinahayag sa stdio.h. Ngayon sa katotohanan ito ay marahil hindi sa sa iyong Mac o PC iyong o kahit na sa CS50 appliance ay isang raw C code. May isang tao na pinagsama-sama ito at isinama . O file para sa object code o. Isang file, na tumutukoy sa isang ibinahaging library na na-pre-install na at pre-sama para sa iyo. Ngunit ipagpalagay na mayroon talagang umiiral sa aming mga computer na stdio.c kahanay may kalatungin. Ang iyong code ay ina-sama at binuo. stdio.c ni code ay pinagsama-sama at binuo, kaya na ito napaka-huling hakbang, pababa dito, mayroon kaming upang kahit papaano link, sa gayon na magsalita, ang iyong mga zero at mga bago kasama ang kanyang mga zero at mga bago sa isa simpleng programa na sa huli ay tinatawag lang Hello. Kaya na ang lahat ng mga magic na na-kaya nangyayari ngayon. At patuloy na gawin ang mga mga proseso para sa ipinagkaloob, ngunit mapagtanto mayroong isang pulutong ng mga detalye ng makatas pagpunta sa ilalim doon. At ito ay kung bakit ang iyong computer na may Intel loob lalo na naiiba. Kaya sa na tandaan, kung nais mong sumali sa amin para sa tanghalian ito Biyernes, gawin pumunta sa karaniwan cs50.net/rsvp lugar, 1:15 ito Biyernes. At ngayon ng ilang mga anunsyo. Kaya mayroon kaming ilang mga mabuting balita. At kami ay may ilang mga masamang balita. Magsimula sa ilang mga magandang balita dito. [GROANING] Ayos lang. Well, ito ay technically isang holiday, kaya ito ay hindi kaya magkano ang isang regalo mula sa amin. Ngunit pagkatapos ay ang masamang balita ng kurso. [GROANING] Ako na ginugol ng maraming oras sa mga animation. [Tawa] Magkakaroon ng isang review session ito darating na Lunes. Ito ay pagpunta sa maging sa 05:30. Susubukan naming ipaalala sa iyo ng lahat ng mga detalye sa pamamagitan ng email sa kurso ng website sa loob lamang ng ilang mga araw ng panahon. Ito ay kumuha at ginawang magagamit makalipas ang ilang sandali. Kaya't kung hindi ka maaaring gumawa na Lunes night slot, huwag mag-alala. Seksyon na ito darating na linggo kalooban din tumutok sa pagsusuri para sa mga pagsusulit. Kung ang iyong mga seksyon ay sa Monday, na kung saan ay sa katunayan unibersidad holiday, kami ay pa rin matugunan sa seksyon. Kung ikaw lamang ay hindi maaaring gawin na dahil ang seksyon ka ng pagpunta layo, na fine. Dumalo sa isang Linggo o Martes seksyon o tune-in sa Jason ng seksyon, na kung saan ay magagamit online. Kaya, mas masamang balita. Kaya ayon sa syllabus, mayroon kaming magbigay ng panayam sa tabi Biyernes. Ngunit ang mabuting balita - malinaw, ako na ginugol ng masyadong maraming oras sa ito. [Tawa] Susubukan naming kanselahin ang susunod na Biyernes ng aralin. Kaya iyon ay magiging isang regalo para sa amin, kaya mo Maaari ba talagang magkaroon ng magandang pahinga sa sa pagitan ng mga ito linggo at dalawang linggo mula rito. Kaya walang mga aralin sa susunod na linggo, lamang ng isang maliit na maliit maliit na pagsusulit, na kung saan ang dapat mong maging nagsisimula nagiging nasasabik. Kaya natin ngayon i aming pansin sa isang bagay na talagang mas visual at mas kapana-panabik at i-set ang entablado para sa kung ano ang nangyayari sa nasa abot-tanaw sa loob lamang ng ilang linggo oras. Pagkatapos ng unang pagsusulit, aming i-on ang pokus ng aming mga hanay ng problema sa isa pang domain partikular na problema, na ng forensics seguridad o higit pa sa pangkalahatan. Sa katunayan, ang tradisyon na may ganitong problema hanay ay para sa akin ang isa sa mga pagtuturo sa kapwa o Cas upang maglakad sa kabuuan campus pagkuha ng litrato ng makikilalang ngunit hindi halata mga tao, mga lugar, o mga bagay, at pagkatapos ay sa bawat taon ko sa paanuman pamahalaan upang sinasadyang tanggalin o sirain ang digital media card na ang nasa loob ng aming camera. Subalit hindi sang-ayon. Maaari ko sige at plug na sa aking computer. Maaari ba akong gumawa ng isang forensic imahe ng ito, kaya upang makipag-usap, sa pamamagitan ng pagkopya ng mga zero at mga bago off ng na memory card, kung nito ang isang SD card o compact flash card o kahit anong pamilyar ka sa. At pagkatapos ay maaari naming ipasa ang out. At kaya ang hamon maaga, bukod sa iba pang mga bagay na para sa iyo, ay magiging upang isulat C code na recovers ang maramihang mga Mga JPEG para sa akin at ipinahayag ay magiging mga tao, mga lugar, o mga bagay. At gagamitin din namin makipag-usap, sa problemang ito set at sa mga araw na dumating, tungkol sa graphics sa mas pangkalahatang. Ginamit namin ang mga ito, isang kurso, para masira out. Ngunit mo na ang uri ng kinuha para sa ipinagkaloob may mga umiiral na mataas na antas notions ng mga parihaba at ovals. Ngunit sa ilalim ng hood may mga pixels. At nagkaroon ka ng upang simulan ang nag-iisip tungkol sa mga. O kaya ay sa iyo para sa p-set 4 na kailangang isipin tungkol sa puwang sa pagitan ng iyong mga bricks, kung paano mabilis ka bola ay gumagalaw sa kabuuan ang screen para masira out. Kaya doon ay ang pagkaunawa ng mga tuldok sa iyong screen na dumating sa pag-play na. Ngayon kung ano ang nakikita mo, bagaman, ay kung ano ang kumuha ka sa isang computer screen. Kung kailanman na iyong napanood ilang mabuti o masamang TV, bentahe ang mga ito ay medyo magkano tratuhin ang mga madla tulad ng technophobes na gawin hindi talaga alam magkano ang tungkol sa computing. At kaya napakadali para sa mga pulis tiktik upang sabihin, maaari mong linisin up na para sa akin? O nagpapahusay, tama? Pagandahin ay tulad ng buzz salita sa karamihan ng anumang krimen kaugnay show. At ang katotohanang ay kung mong gawin ang isang napaka malabo ang litrato ng isang pinaghihinalaan paggawa isang bagay na masama, hindi mo makakaya lamang mapahusay ito. Hindi ka maaaring mag-zoom in walang hanggan. Hindi mo maaaring makita sa sinag ng isang tao mata na nakatuon na partikular na krimen, sa kabila ng pagkalat ng mga ito sa TV. At kaya may na sabihin na mag-udyok paparating na mga problema itakda sa isang sulyap sa ilang palabas na kung saan mo ay maaaring maging pamilyar. [Video playback] -OK. Ngayon, sabihin makakuha ng magandang pagtingin sa iyo. -Hold ito. Patakbuhin na bumalik. -Maghintay ng isang minuto. Pumunta kanan. -Walang. I-freeze na. Full-screen. -OK. I-freeze na. -Higpitan ang sa na, ay Ya? Vector-in sa na tao sa pamamagitan ng likod na gulong. -Mag-zoom in dito mismo sa lugar na ito. -Gamit ang karapatan kagamitan, ang nakunan maaaring pinalaki at sharpened. -Ano iyon? -Ito ay isang pagpapahusay programa. -Maaari mong i-clear up na anumang? -Hindi ko alam. Sabihin mapahusay ito. Pagandahin-seksyon A-6. I-pinaghusay ang detalye at - -Sa tingin ko mayroong sapat upang mapahusay. Palabasin ito sa aking screen. -Pagandahin ang pagmuni-muni sa kanyang mga mata. -Natin patakbuhin ito sa pamamagitan ng video pagpapahusay. -Edgar, maaari mong pagandahin ito? Mag-hang-on. -I've pinagsusumikapan ito pagmuni-muni. May-aninag ni. -Reflection. -Mayroon isang panganganinag ng mukha ng tao. -Ang pagmuni-muni. -Mayroon isang panganganinag. Mag-zoom-in sa mirror. -Mo maaaring makita ang isang pagmuni-muni. -Maaari mong mapahusay ang mga imahe mula dito? -Maaari mo mapapahusay kanya dito mismo? -Maaari mo mapapahusay ito? -Maaari mo mapapahusay ito? -Maaari ba kaming mapahusay ito? -Maaari mo mapapahusay ito? -Hold sa isang segundo, makikita ko mapapabuti. Mag-zoom-in sa pinto. -X10. -Zoom. [Tawa] Ilipat-in -Maghintay, itigil. -Itigil. -I-pause ito. -Rotate ng 75 degrees sa paligid ang vertical mangyaring. [Tawa] -Itigil, at pabalik sa bahagi tungkol sa mga pinto muli. -Mayroon ka bang isang imahe Enhancer na maaari bitmap? -Siguro maaari naming gamitin ang Pradeep Sen paraan upang makita sa bintana. -Ito ang software ay estado ng sining. -Ang mga icon na halaga ay off. -Gamit ang tamang kumbinasyon ng mga algorithm. -Siya'y kinuha algorithm sa pag-iilaw sa susunod na antas at ako ay maaaring gamitin ang mga ito upang pagandahin ito kunan ng larawan. I-lock-on at palakihin ang z-axis. -Pagandahin. -Pagandahin. -Pagandahin. -I-freeze at pagbutihin. [END-playback ng video] David J. MALAN: So Problema Set 5 ay kung ano ang namamalagi maaga doon. Kaya makikita namin sa lalong madaling panahon makakuha ng isang mas mahusay na pang-unawa ng kung kailan at kung bakit maaari kang at ang aming hindi maaaring pahusayin sa na paraan. Ngunit una, sabihin bumalik sa aming pansin sa ilan sa mga bloke gusali bibigyan namin ng kailangan upang magagawang upang sabihin na ang kuwento. Kaya isipin ang na iginuhit namin ang larawang ito sa Lunes at Medyo noong nakaraang linggo. At ito ang naglalarawan ang layout ng mga bagay sa memorya ng iyong computer kapag tumatakbo ang ilang mga programa. Ang tech segment up tuktok, isipin ang, ay tumutukoy sa aktwal na mga zero at mga bago na gumawa ng sulat ng iyong programa. Mayroong, sa ibaba na, ang ilang mga nasimulan o uninitialized data, na kung saan ay karaniwang ay tumutukoy sa mga bagay tulad ng constants o string o global variable na mayroon na ipinahayag nang maaga. Mayroong kimpal ang, ngunit gagamitin namin dumating bumalik sa na sa isang bit. At pagkatapos ay mayroong mga stack. Karamihan tulad ng isang stack ng mga trays sa cafeteria, ito ay kung saan nakukuha ng memory layered layered at kailanman gawin mo kung ano sa isang program? Ano ang stack ng paggamit para sa? Oo? Tumawag ng function. Anumang oras na tumawag ka ng isang function, ito ay ibinigay sa salubsob ng memory para sa kanyang lokal na mga variable o mga parameter nito. At pictorially, nakita namin na may bawat sunud-sunod na tinatawag na pag-andar, kapag A tawag B C tawag tawag D, sila makapag-layered papunta sa stack. At sa loob ng bawat isa sa mga hiwa ng memory ay mahalagang isang natatanging saklaw para na function, na kung saan, siyempre, ay may problemang kung gusto mong ipasa mula sa isang function na sa isa pang Ang isang piraso ng data na gusto mo ito upang mutate o magbago. Kaya ano ang aming mga solusyon sa pagpapagana Ang isang function na kinakatawan ng isang stack frame upang baguhin ang memory sa loob ng isa pang stack na frame? Paano gawin ang dalawang talk sa isa't isa? Kaya sa pamamagitan ng paraan ng payo o mga address, kung saan, muli, lamang ilarawan kung saan sa memory, sa pamamagitan ng isang partikular na kagat ng numero, ang partikular na halaga ay matatagpuan. Kaya isipin ang huling beses na masyadong namin ipinagpatuloy ang kuwento at tumingin sa isang Medyo maraming surot programa. At ang programang ito ay maraming surot para sa ilang kadahilanan, ngunit ang pinaka-nakakaligalig isa ay dahil nabigo upang suriin kung ano? Oo, ito nabigo upang suriin ang input. Paumanhin? Kung ito ay higit sa 12 mga character. Kaya napaka-makisig, kapag tumatawag memcopy, na kung saan, bilang ang pangalan nagmumungkahi, lamang mga kopya mula sa memorya nito pangalawang argumento sa kanyang unang argumento. Ang ikatlong argumento, napaka-makisig, ay naka-check upang tiyakin na hindi mo gusto kopyahin higit sa, sa kasong ito, ang haba ng bar, bilang ng mga character, papunta sa patutunguhan, na ito array C. Ngunit ang problema ay ang kung ano ang kung C mismo ay hindi sapat na malaki upang mahawakan iyon? Ikaw ay pagpunta upang kopyahin ang mga numero ng bytes na iyong binigyan. Ngunit ano ang iyong aktwal na magkaroon ng higit pa bytes kaysa mayroon kang kuwarto para sa? Well, ang program na ito napaka-maloko lang nang walang taros naaayos gumawa ng kahit anong ito binigay, kumusta backslash 0 ay mahusay na kung string ay maikli sapat, tulad ng limang karakter. Ngunit kung ito ay aktwal na 12 character o 1,200 mga character, nakita natin huling oras na lamang ka ng pagpunta sa ganap patungan na memory ay hindi nabibilang sa iyo. At pinakamasama kaso, kung patungan na pulang bahagi doon na namin na tinatawag na bumalik address - ito ay lamang kung saan ang computer awtomatikong, para sa iyo, sa likod ng eksena, tucks ang layo ng 32-bit na halaga reminds ito sa kung ano ang address dapat ito bumalik kapag foo, ang iba pang mga function, tapos na e-execute. Ito ay isang tinapay mumo ng uri na kung saan ito ay nagbabalik. Kung nag-o-overwrite na, potensyal, kung ikaw ang masamang tao, maaari ng dati potensyal na pumalit computer na ng isang tao. At bibigyan ka pinaka-tiyak lumagpak ito sa karamihan ng mga kaso. Ngayon ang problemang ito ay lamang exacerbated bilang namin magsimula ng pakikipag-usap tungkol sa memory pamamahala sa mas pangkalahatang. At malloc, para sa memory laang-gugulin, ay isang function na maaari naming gamitin upang magtalaga ng memorya kapag hindi namin alam nang maaga na maaaring kailanganin naming ilan. Kaya, halimbawa, kung pumunta ako pabalik sa appliance dito. At buksan ko up mula sa huling beses hello2.c, maalala muli ang programa dito, na kung saan ay tumingin isang maliit na isang bagay na tulad nito, lamang tatlong linya - sabihin ang iyong pangalan, pagkatapos ay i-string pangalan, sa kaliwa, ay katumbas ng getstring. At pagkatapos naming i-print ito, pangalan ng gumagamit. Kaya ito ay isang napaka-simpleng programa. Upang maging malinaw, sabihin sa akin sige at gumawa ng halo-2. Pupunta ako sa gagawin tuldok slash halo-2. Sabihin ang iyong pangalan - David. Enter. Kamusta David. Tila upang gumana ang OK. Ngunit kung ano talaga ang nangyayari sa sa ilalim ng hood dito? Una natin alisan ng balat likod ng ilang mga layer. String ay isang kasingkahulugan na namin maisasakatuparan para sa kung ano? Pansamantalang trabaho star. Kaya sabihin gawin itong isang kaunti pa arcane pero mas technically tama na ito ay isang pansamantalang trabaho bituin, na nangangahulugan na ang pangalan, oo, ay isang variable. Ngunit kung ano ang pangalan ng tindahan ay ang address ng isang pansamantalang trabaho, na pakiramdam ng isang maliit na kakaiba dahil nakakakuha ako ng likod ng isang string. Nakakakuha ako pabalik ng maraming char hindi isang pansamantalang trabaho. Ngunit siyempre, kailangan mo lamang ang unang pansamantalang trabaho ni address upang tandaan kung saan ang buong string ay dahil bakit? Paano kang malaman kung saan sa dulo ng string ay ang pag-alam sa umpisa? Ang backslash zero. Kaya may mga dalawang mga pahiwatig maisip mo out bago sa simula at sa katapusan ng string anumang ay, kaya hangga't ang mga ito ay wastong binuo na may null Terminator, na backslash zero. Ngunit ito ay pagtawag getstring. At ito lumiliko out na getstring lahat ng oras na ito ay naging uri ng Pandaraya para sa amin. Ito ay nai-paggawa nito labor, upang maging sigurado, pagkuha ng isang string mula sa user. Ngunit nasaan ang memory na na nagmumula? Kung pumunta kami pabalik sa mga larawan dito at ilapat ang kahulugan lamang mula sa isang ilang sandali ang nakalipas, na stack ang na kung saan ay memory napupunta kapag function ay tinatawag na, ayon sa logic na, kapag tumawag ka getstring, at pagkatapos ay i-type ko sa D-A-V-ko-D Ipasok, kung saan ay D-A-V-ko-D backslash zero na naka-imbak, batay sa kuwento namin ang sinabi sa amin ngayon? Gusto ito mukhang ang stack, tama? Kapag tumawag ka ng string kumuha ka ng isang maliit na hiwa ng memory sa stack. Kaya ito ay nakatayo sa dahilan na D-A-V-ko-D backslash zero ay naka-imbak doon sa stack. Ngunit maghintay ng isang minuto, babalik getstring string na, kaya na magsalita, na nangangahulugang ito ay tray mula sa cafeteria ay kinuha off ang stack. At sinabi namin huling beses na sa lalong madaling isang function na nagbabalik, at kumuha ka na tray, kaya na magsalita, off ang stack, kung ano maaari mong ipalagay tungkol sa ang mga labi ng na memory? Ako uri ng redrew ang mga ito bilang mga markang tanong dahil sila ay maging mabisa hindi alam na mga halaga. Maaari silang ma-reused kapag ang ilang mga susunod na function na ay tinatawag na. Sa ibang salita, kung namin mangyari na pag-iimbak - Kukunin ko gumuhit ng isang mabilis na larawan dito ng stack. Kung mangyayari namin na ma-drowing sa ibaba ng aking memory segment, at kami sabihin na ito ay ang lugar ng memorya inookupahan ng pangunahing at siguro ARG c at ARG v at anumang bagay sa programa, kapag getstring ay tinatawag na, siguro ay nakakakuha getstring isang tipak ng memory dito. At pagkatapos ay i-D-A-V-ko-D sa paanuman ay nagtatapos up sa function na ito. At ako pagpunta sa oversimplify. Ngunit sabihin ipinapalagay na nito D-A-V-ko-D backslash zero. Kaya ito maraming bytes ang ginagamit sa mga frame para sa getstring. Ngunit sa lalong madaling getstring babalik, namin Sinabi huling beses na ito sa paglipas ng memorya dito lahat nagiging - woops! - lahat ay magiging epektibo mabubura. At maaari naming isipin na ito ngayon bilang tanong mark dahil may alam kung ano ang nangyayari upang maging na ng memory. Sa katunayan, ako napakadalas call function bukod sa getstring. At sa lalong madaling tumawag ako ng ilang mga iba pang function na kaysa getstring, siguro hindi sa ang partikular na programa pa lang namin ay tumingin ngunit sa ilang mga iba pang, tiyak ilang iba pang mga function na maaaring magtapos up na ibinigay ito susunod na lugar sa stack. Kaya hindi ito maaaring maging getstring na tindahan D-A-V-ko-D sa stack dahil gagawin ko agad na mawawala ang access dito. Ngunit alam namin sila getstring nagbabalik lamang kung ano? Hindi ito bumabalik sa ako anim na character. Ano ay ito tunay na pagbabalik ay pagtibayin namin ang huling panahon? Ang address ng unang. Kaya kahit papaano, kapag tinatawag getstring, ito ay paglaan ng isang tipak ng memory para sa ang string na ang mga gumagamit ng uri at pagkatapos ay bumabalik na address ng ito. At ito lumiliko out na kapag gusto mong i- gumana upang magtalaga ng memory sa ito paraan at return sa taong tinatawag na function, ang address ng na tipak ng memory, kung talagang hindi maaaring ilagay ito sa ang stack sa ibaba, dahil ang pagtakbo ito lamang pagpunta sa hindi naging iyo napaka mabilis, sa gayon maaari mong marahil hulaan kung saan marahil kami ay pagpunta sa pag-itsa ito sa halip, ang tinaguriang kimpal. Kaya sa pagitan ng mga ibaba ng iyong memorya ng layout at sa tuktok ng iyong memorya ng layout ay ang maramihang mga segment. Ang isa ay ang stack, at kanang nasa itaas nito ay ang kimpal. At kimpal lamang ang iba't ibang mga tipak ng memorya na hindi na ginagamit para sa mga function kapag sila ay tinatawag na. Ito ay ginagamit para sa mas mahabang term na memorya, kapag gusto mo ang isa sa function na grab ang ilang mga memory at ma-hang sa dito nang hindi nawawalan ng kontrol sa ito. Ngayon ay maaari mong marahil agad makita na ito ay hindi nangangahulugang isang perpektong disenyo. Tulad ng iyong programa na inilaan sa memory ang stack, o bilang tawagan ka pa at higit pang mga pag-andar, o bilang maglaan ka memory sa kimpal may malloc off bilang getstring ay paggawa, ano ang malinaw Mukhang walang mintis problema? I-right. Tulad ng ang katunayan na ang mga arrow na ito ay tumuturo sa isa't isa ay hindi maghudyat na rin. At sa katunayan, maaari kaming masyadong mabilis lumagpak isang programa sa anumang bilang ng mga paraan. Sa katunayan, sa palagay ko magkaroon tayo ng tapos ito sinasadyang sabay-sabay. O kung hindi, sabihin gawin ito sadyang ngayon. Hayaan akong sige at isulat ang super mabilis isang programa na tinatawag na dontdothis.c. At ngayon, makikita ko pumunta sa dito at matulis huwag isama stdio.h. Tayo'y magpahayag ng function na tumatagal ng foo walang argumento, na kung saan ay naitala pati na rin sa pamamagitan ng walang bisa. At ang tanging bagay foo ay pagpunta sa gawin ay tawag foo, na marahil ay hindi ang smartest ideya, ngunit kaya ito. Ent pangunahing walang bisa. Ngayon ang tanging bagay pangunahing ay pagpunta gawin ay tumawag foo pati na rin. At para lamang sa mga kicks, pupuntahan ko pumunta maaga dito at sabihin printf "Kamusta mula sa foo. " OK. Kaya kung hindi ko gumawa ng anumang mga pagkakamali, Gawing dontdothis tuldok slash. At sabihin gawin ito sa isang mas malaking window - dot slash, dontdothis. Halika sa. Uh oh. Sa malas, maaari mong gawin ito. Diyablo. OK. Maghintay. Stand sa pamamagitan ng. Nagustuhan namin - Namin gamitin ito sa Gawing. [SIGHS] Alam ko ngunit sa palagay ko kami lamang tinanggal na. Uh, oo. Diyablo. Lutasin ang Rob. Ano? Ito ay napaka-simple. Oo, namin naka-off ang pag-optimize. OK, tumayo hindi importanteng bagay. Ngayon pakiramdam ko mas mahusay. OK. Ayos lang. Kaya natin mag-recompile ito - Gawin mo dontdothis. Maaaring mayroon kang upang palitan ang pangalan na ito sa dothis.c sa loob lamang ng ilang sandali. Nagkaroon kami pumunta. Salamat sa inyo. OK. Kaya ang katotohanan na ako ay pag-print isang bagay out ay talagang lamang alalay ang proseso sa pamamagitan ng kung saan namin sana ay umabot sa puntong iyon. OK. Phew! Kaya kung ano ang talagang nangyari? Ang dahilan doon, tulad ng isang bukod, ay paggawa ng anumang bagay sa mga tuntunin ng pag-input at output ay may gawi na maging mas mabagal dahil sa iyo mayroon na magsulat character sa screen, Ito ay may upang mag-scroll. Kaya mahaba kuwento maikli, nagkaroon ako talaga nangyari kaya walang tiyaga, gusto naming magkaroon nakita ito ng pagtatapos ng resulta pati na rin. Ngayon na nakuha ko ride ng naka-print na-up, makita namin ito agad. Kaya bakit ito ay mangyari. Well, ang simpleng paliwanag, siyempre, ay na foo marahil hindi dapat ay pagtawag mismo. Ngayon, sa mga pangkalahatang tuntunin, ito ay recursion. At naisip namin ng ilang linggo nakalipas recursive ay mabuti. Recursion ito ay mahiwagang paraan ng pagpapahayag ng iyong sarili super succinctly. At ito lamang ang gumagana. Subalit mayroong isang pangunahing tampok ng lahat ng recursive ang mga programa na aming uusapang tungkol at tumingin sa kaya malayo, na ay na sila ay nagkaroon ano? Ang isang base ng kaso, na kung saan ay ilang mga naka-code na matapang kaso na sinabi sa ilang mga sitwasyon huwag tumawag foo, na kung saan ay malinaw na hindi ito ang kaso dito. Kaya kung ano ang talagang nangyayari sa mga tuntunin ng ang larawang ito? Well, kapag ang pangunahing tawag foo, ito ay makakakuha ng isang hiwa ng memorya. Kapag foo foo tawag, ito ay makakakuha ng isang hiwa ng memorya. Kapag foo foo tawag, ito ay makakakuha ng isang slice. Ito ay makakakuha ng isang slice. Ito ay makakakuha ng isang slice. Dahil foo ay hindi kailanman bumabalik. Hindi kailanman Kami ay binubura ang isa sa mga mga frame mula sa stack. Kaya kami ay pamumulaklak sa pamamagitan ng kimpal, hindi upang mailakip ang may alam kung ano pa man, at kami overstepping ang hanggahan ng ating tinatawag nang gayon segment ng memorya. Error pumunta segmentation hindi totoo. Kaya ang solusyon doon ay malinaw na huwag gawin ito. Ngunit ang mas malaking implikasyon ay na, oo, doon ay talagang ilang mga limitasyon, kahit na hindi ito mahusay na tinukoy, tulad ng sa kung paano maraming mga pag-andar maaari kang tumawag sa isang programa, kung gaano karaming beses isang function Maaari tawagan mismo. Kaya kahit na ginawa namin ipangaral recursion ito bilang potensyal na mahiwagang bagay isang dalawang linggo ang nakalipas para sa mga palatandaan function, at kapag makuha namin ang mga data kaayusan at CS50, makakakita ka ng iba pang mga mga application para dito, ito ay hindi kinakailangan na ang pinakamahusay na bagay. Dahil kung ang pag-andar ng tawag mismo, tawag mismo, kahit na mayroong isang base kaso, kung hindi mo pindutin na base kaso 1,000 para sa mga tawag o 10,000 na tawag, sa pamamagitan ng oras na iyon na maaaring maubusan ng kuwarto sa iyong tinatawag na stack at pindutin ang sa ilang ibang mga segment ng memorya. Kaya ito masyadong ay isang disenyo ng kalakalan-off sa pagitan ng kagandahan at sa pagitan ng katabaan ng iyong partikular na pagpapatupad. Kaya mayroong isa pang downside o isa pang gotcha sa kung ano na namin Na-paggawa kaya sa ngayon. Kapag ako tinatawag na getstring - hayaan mo akong bumalik sa halo-2. Pansinin na ako sa pagtawag getstring, na kung saan ay nagbabalik ng isang address. At i-claim namin ngayon na address ay mula sa kimpal. At ngayon ako ay nagpi-print out ang string sa address na iyon. Ngunit hindi namin ang tinatawag na sa tapat ng getstring. Hindi namin nagkaroon upang calll isang function tulad ng ungetstring, kung saan mo isauli na memorya. Ngunit nang tapat namin marahil Dapat naging. Dahil kung panatilihin namin ang pagtatanong sa computer para sa memory, sa pamamagitan ng isang tao tulad ng getstring ngunit hindi kailanman bigyan ito pabalik, ay tiyak na masyadong ay nakatali na humantong sa problema kung saan tumakbo kami sa labas ng memorya. At sa katunayan, maaari naming hanapin ang mga mga problema sa mga bagong tool na paggamit ay isang maliit na misteriyoso na mag-type. Ngunit ipaalam sa akin sige at Splash up ito sa screen sa loob lamang ng ilang sandali. Pupunta ako sa sige at patakbuhin Valgrind may parameter na ang unang utos linya ng argumento ay ang pangalan ng programang iyon halo-2. At sa kasamaang-palad ito output ay atrociously complex para sa walang magandang dahilan. Kaya namin makita ang lahat na gulo. Si David ay sabihin ang aking pangalan. Kaya na programa sa aktwal na tumatakbo. At ngayon namin makuha ang output. Kaya Valgrind ay katulad sa espiritu sa GDB. Ito ay hindi isang debugger per se. Ngunit ito ay isang memory checker. Ito ay isang programa na tatakbo ang iyong mga programa at sabihin sa iyo kung hiniling mo sa isang computer para sa memorya at hindi kailanman ipinasa ito pabalik, at dahil doon na nangangahulugan na ikaw ay may isang memory tumagas. At memory paglabas ay may posibilidad na maging masama. At ikaw ay gumagamit ng mga computer ay may marahil nadama na ito, kung mayroon kang isang Mac o PC. Nakarating na ba kayo na ginagamit ng iyong computer para sa at habang hindi rebooted sa ilang araw, o lamang na iyong nakuha ng maraming mga programa sa pagtakbo, at ang sumpain bagay slows sa isang paggiling huminto, o hindi bababa sa ito ay sobrang nakakainis na upang gamitin, dahil lahat ng bagay Naging super mabagal. Ngayon na maaaring maging anumang bilang ng mga kadahilanan. Ito ay maaaring maging isang walang-katapusang loop, isang bug sa code ng isang tao, o, mas lamang, ito Maaaring ibig sabihin na gumagamit ka ng higit pa memorya, o sinusubukang i, kaysa sa iyong computer na may aktwal na. At siguro mayroong isang bug sa ilang mga programa na panatilihin ang humihingi ng memorya. Browser para sa taon ay kilalang-kilala para sa ito, humihiling ng higit pa at mas memorya ngunit hindi kailanman handing ito pabalik. Tiyak, kung mayroon ka lamang isang may wakas halaga ng memory, hindi mo maaaring magtanong walang hanggan maraming beses para sa ang ilan sa na memorya. At kaya kung ano ang makikita mo dito, kahit na muli Valgrind ng output ay nang hindi kinakailangan kumplikado upang sumulyap sa una sa lahat, ito ay ang mga kawili-wiling bahagi. Kimpal - sa paggamit sa exit. Kaya narito ang kung magkano ang memorya ay sa paggamit sa kimpal sa oras ng aking programa lumabas - tila anim bytes sa isang bloke. Kaya pupuntahan ko iwagayway ang aking mga kamay sa kung ano ang isang bloke ay. Isipin ito lamang ang tipak, isang mas teknikal na salita para sa tipak. Ngunit anim bytes - ano ang mga anim na bytes ay pa rin sa paggamit? Mismong. D-A-V-ko-D backslash zero, limang titik pangalan plus ang null Terminator. Kaya programang ito Valgrind napansin ko tinanong para sa anim bytes, tila, sa pamamagitan ng paraan ng getstring, ngunit hindi kailanman ibinigay sa kanila pabalik. At sa katunayan, ito ay maaaring hindi kaya halata kung ang aking programa ay hindi tatlong mga linya, ngunit ito ay 300 mga linya. Kaya maaari naming talagang bigyan ng isa pang utos linya ng argumento sa Valgrind sa gawin itong mas maligoy. Ito ay isang maliit na nakakainis na matandaan. Ngunit kung gagawin ko - sabihin makita. Mahayag - Ay mahayag ito - kahit na hindi ko matandaan kung ano ito ay off kamay. - Mahayag-tseke ay katumbas ng full. Yep, salamat sa iyo. - Mahayag-tseke ay katumbas ng full. Enter. Parehong programa ay tumatakbo. I-type sa David muli. Ngayon ko makita ang isang maliit na karagdagang detalye. Ngunit sa ibaba ang buod kimpal, na ay kapareho ng apat - ah, ito ay uri ng magaling. Ngayon Valgrind ay talagang aktwal na tumitingin medyo mas mahirap sa aking mga code. At ito ay nagsasabi na, tila, malloc sa linyang - kami mag-zoom out. Sa linya - hindi namin makita kung ano ang linya ito ay. Ngunit malloc ay ang unang salarin. Mayroong isang blog sa malloc. Ang lahat ng mga karapatan? OK, hindi. I-right? Tumawag ako getstring. getstring tila tawag malloc. Kaya kung ano ang linya ng code ay tila sa kasalanan dahil sa pagkakaroon ng inilalaan memory na ito? Ipagpalagay nating na kung sinuman ang nagsulat malloc ay naging sa paligid ng may sapat na katagalan na ito hindi kasalanan ng kanilang. Kaya marahil ito ay minahan. getstring sa cs50.c - kaya iyan ay isang maghain sa isang lugar sa computer - sa line 286 Mukhang ang salarin. Ngayon, sabihin ipinapalagay na ang cs50 ay naging sa paligid para sa disenteng dami ng oras, sa gayon namin masyadong ay hindi maaaring magkamali. At kaya ito ay marahil hindi sa getstring na bug ang namamalagi, ngunit sa halip sa halo-2.c linya 18. Kaya sabihin tumingin sa ano na linya 18 noon. Oh. Sa paanuman linya na ito ay hindi nangangahulugang maraming surot, per se, ngunit ito ay ang dahilan sa likod na memory mahayag. Kaya napaka-simple, ano ang gagawin intuitively maging ang solusyon dito? Kung hinihiling namin para sa memory, ay hindi kailanman nagbibigay ito pabalik, at na tila may problema dahil sa paglipas ng panahon ang aking computer baka maubusan ng memory, maaaring pabagalin pababa, masamang bagay maaaring mangyari, na rin, kung ano ang mga simpleng solusyon madaling maunawaan? Lang bigyan ito pabalik. Paano mo magbakante na memory? Well, thankfully ito ay medyo simple sa makatarungan sabihin libreng pangalan. At hindi namin nagawa mo na ito bago. Ngunit maaari kang mahalagang isipin libre bilang ng kabaligtaran ng malloc. libreng ay ang kabaligtaran ng paglaan ng memorya. Kaya ngayon hayaan mo akong mag-recompile ito. Gumawa ng halo-2. Hayaan akong patakbuhin itong muli. halo-2 David. Kaya ito ay tila upang gumana sa eksakto sa parehong paraan. Ngunit kung pumunta ako pabalik sa Valgrind at patakbuhin muli na parehong utos sa aking bagong inipon programa, pagta-type sa aking pangalan tulad ng dati - Nice. Kimpal buod - sa paggamit sa exit - zero bytes sa zero bloke. At ito ay sobrang magaling, lahat kimpal bloke ay napalaya. Walang paglabas ang posible. Kaya darating up, hindi na may Problema Set 4, pero may Problema Set 5, ang forensics at pasulong, ito masyadong ay magiging isang sukatan ng kawastuhan ng iyong programa, kung mayroon o wala ka o walang paglabas memory. Pero thankfully, hindi lamang ang maaari mong Dahilan sa pamamagitan ng mga ito intuitively, na ay, arguably, madali para sa maliit na mga programa ngunit mas mahirap para sa mas malaking mga programa, Valgrind, para sa mga mas malalaking mga programa, ay maaaring makatulong sa iyo na makilala ang partikular na problema. Subalit mayroong isa pang problema na maaaring lumabas dahil. Hayaan akong buksan up ang file na ito dito, na kung saan ay, muli, isang medyo simpleng halimbawa. Ngunit sabihin tumuon sa kung ano programang ito gumagana. Ito ay tinatawag na memory.c. Magpo-post kami na ito sa ibang pagkakataon ngayong araw sa zip ng source code ngayon. At mapansin na mayroon akong isang function na tinatawag na f na tumatagal ng walang argumento at Ibinabalik ng wala. Sa line 20, tila ako deklarasyon ng pointer sa isang int at pagtawag ito x. Ako ay nagtatalaga ang return halaga ng malloc. At para lamang maging malinaw, kung gaano karaming bytes am Ako malamang pagbalik mula sa malloc sa sitwasyong ito? Malamang 40. Saan mo makuha na mula sa? Well, kung isipin ang mo na ang isang int ay madalas 4 bytes, kahit ito ay nasa appliance, 10 beses 4 ay malinaw naman 40. Kaya malloc ay nagbabalik ng isang address ng isang tipak ng memory at pag-imbak na tugunan ang huli sa x. Kaya upang maging malinaw, kung ano pagkatapos ay ang nangyayari? Well, hayaan mo akong bumalik sa aming mga larawan dito. Hayaan akong hindi lamang gumuhit sa ibaba ng aking computer memory, hayaan mo akong magpatuloy at gumuhit ang buong parihaba na Kinakatawan ng lahat ng aking mga RAM. Susubukan naming sabihin na ang stack ay nasa ibaba. At mayroong teksto sa segment ang uninitialized data. Ngunit lang ako sa pagpunta sa mga abstract iba pang mga bagay ang layo bilang tuldok, tuldok tuldok. Lamang ako ng pagpunta sa sumangguni sa bilang ang kimpal sa tuktok. At pagkatapos ay sa ilalim ng litrato na ito, upang kumatawan sa main, pupuntahan ko upang bigyan ito ng isang hiwa memory sa stack. Para sa f, pupuntahan ko bigyan ito ng isang slice ng memorya sa stack. Ngayon, ang nakuha ko sa aking kumonsulta source code muli. Ano ang mga lokal na mga variable para sa main? Tila wala, kaya hiwa na mabisa walang laman o kahit hindi bilang malaki bilang ko ang iginuhit ito. Ngunit sa f, mayroon akong isang lokal na variable, na kung saan ay tinatawag na x. Kaya pupuntahan ko sige at bigyan f isang tipak ng memory, pagtawag ito x. At ngayon malloc ng 10 beses 4, Kaya malloc 40, kung saan lang iyon memory nagmumula? Hindi na namin ang iginuhit ng litrato gustuhin ang bago. Ngunit sabihin ipagpalagay na ito ay epektibo nagmumula dito, kaya isa, dalawa, tatlo, apat, lima. At ngayon ay kailangan ko 40 sa mga ito. Kaya kukunin ko na lang gawin tuldok, tuldok, tuldok upang magmungkahi na mayroong kahit na mas memory bumabalik mula sa kimpal. Ngayon kung ano ang address ang? Sabihin piliin ang aming arbitrary tugunan gaya ng lagi - Ox123, kahit na marahil ito ang nangyayari upang maging isang bagay na ganap na naiibang. Iyan ang address ng unang byte sa memorya na ako humihingi para sa malloc. Kaya sa maikling, isang beses linya 20 executes, ano ang literal naka-imbak sa loob ng x dito? Ox123. Ox123. At baka ay hindi kawili-wili. Ito ay nangangahulugan lamang narito ang isang hexadecimal numero. Ngunit kung ano ang key na ay kung ano ang nag ko store sa x, na kung saan ay isang lokal na variable. Ngunit nito sa uri ng data, muli, ay isang address ng isang int. Well, Pupunta ako sa store Ox123. Ngunit muli, kung na ang isang maliit na masyadong nang hindi kinakailangan kumplikado, kung mag-scroll ako pabalik, maaari naming abstract ito ang layo pa makatwirang at sabihin lamang na x ay isang pointer sa na tipak ng memory. OK. Ngayon ang tanong sa kamay ay ang mga sumusunod - 21 linya, ito lumiliko out, ay maraming surot. Bakit? Paumanhin? Hindi nito ay may - sabihin na sa sandaling higit pa. Well, ito ay hindi libre. Kaya iyon ang ikalawang ngunit. Kaya mayroong isang iba pang ngunit partikular na sa linya 21. Mismong. Ito simpleng linya ng code lamang ang buffer overflow, isang paglampas sa buffer. Isang buffer lang ay nangangahulugang isang tipak ng memory. Ngunit na tipak ng memory ay ng laki 10, 10 integer, na nangangahulugan na kung namin sa index ito gamit ang sintaktik asukal ng array notation, ang parisukat bracket, mayroon kang access sa x bracket 0 bracket x 1 x, bracket tuldok, tuldok, tuldok. x 9 bracket ay ang pinakamalaking isa. Kaya kung gagawin ko bracket x 10, kung saan Talaga ako pupunta sa memory? Well, kung mayroon akong 10 int - sabihin talagang gumuhit lahat ng mga out dito. Kaya na ay ang unang limang. Narito ang iba pang mga limang ints. Kaya x bracket ay 0 dito. x bracket 1 ay dito. x 9 bracket ay dito. x bracket Ang 10 dito, na nangangahulugan na ako ay nagsasabi, sa line 21, ang computer upang ilagay ang numero kung saan? Ang bilang 0 saan? Well, ito ay 0, oo. Ngunit lamang ang katotohanan na nito 0 ay uri ng isang pagkakatulad. Maaaring ito ay ang bilang 50, para sa lahat ng pinapahalagahan namin. Ngunit sinusubukan naming ilagay ito sa x bracket 10, na kung saan ito tandang pananong ay iginuguhit, na ay hindi isang magandang bagay. Ang program na ito ay maaaring napakahusay lumagpak bilang isang resulta. Ngayon, sabihin sige at tingnan kung ito ay, sa katunayan, kung ano ang mangyayari. Gumawa ng memorya, dahil ang file ay tinatawag na memory.c. Sabihin sige at magpatakbo ng programa ng memorya. Kaya namin nakuha masuwerteng, talaga, parang. Nakakuha kami ng masuwerteng. Ngunit sabihin makita kung namin ngayon tumakbo Valgrind. Sa unang tingin, ang aking programa kapangyarihan mukhang perpektong tama. Ngunit hayaan mo akong tumakbo Valgrind sa - Mahayag-tseke ay katumbas ng full sa memorya. At ngayon kapag nagpatakbo ako ng ito - kawili-wili. Di-wastong sumulat ng laki 4 sa 21 linya ng memory.c. Linya ng 21 memory.c ay kung alin? Oh, kawili-wili. Ngunit maghintay. Sukat 4, ano ang na nagre-refer sa? Lamang ako ay isa magsulat, pero sukat ng 4. Bakit ito 4? Ito ay dahil ito ay isang int, na ay, muli, apat na bytes. Kaya Valgrind nakitang isang bug na ako, glancing sa aking code, ang hindi. At marahil iyong tf gagawin o hindi gagawin. Ano Valgrind Ngunit para bang natagpuan na nagkamali kami ng doon, kahit na bagaman namin nakuha masuwerteng, at ang computer nagpasya, eh, hindi ako pupunta ng pag-crash dahil lang sa iyo hinawakan isa byte, isa int ni nagkakahalaga ng memorya na ikaw ay hindi talaga sarili. Well, ano pa ang maraming surot dito. Address - ito ay isang nakatutuwang naghahanap address sa hexadecimal. Iyon lang ang ibig sabihin nito sa isang lugar sa kimpal ay zero bytes pagkatapos ng isang bloke ng laki 40 ay inilalaan. Hayaan akong mag-zoom out dito at tingnan kung ito ay isang maliit na mas kapaki-pakinabang. Kawili-wili. 40 bytes ay siguradong mawawala sa pagkawala record 1 ng 1. Muli, higit pa kaysa sa mga salita ay kapaki-pakinabang dito. Ngunit batay sa mga naka-highlight na mga linya, kung saan ang dapat kong marahil ituon ang aking pansin para sa isa pang bug? Mukhang isang linya ng 20 memory.c. Kaya kung pumunta kami pabalik sa linya 20, na ang isa na nakilala mo nang mas maaga. At hindi ito nangangahulugang maraming surot. Ngunit pa namin ito reverse epekto nito. Kaya paano ko itama ang hindi bababa sa isa sa mga pagkakamali? Ano ang maaari kong gawin pagkatapos linya 21? Maaari kong gawin libreng ng x, sa gayon ay upang bigyan pabalik na memory. At paano ko ito aayusin bug? Dapat ko talagang pumunta walang higit na malayo kaysa sa 0. Kaya hayaan mo akong subukan at muling patakbuhin ito. Paumanhin, siguradong pumunta walang higit na malayo kaysa 9. Gumawa ng memorya. Hayaan akong muling palabas ng pelikula Valgrind sa isang mas malaking window. At ngayon tumingin. Nice. Ang lahat ng mga bloke kimpal ay napalaya. Walang paglabas ang posible. At hanggang dito sa itaas, mayroong walang pagbanggit anumang higit pa sa mga di-wastong karapatan. Lamang upang makakuha ng sakim, at sabihin makita kung ang isa pang demonstration ay hindi pumunta bilang nilayon - Ako ay makakuha ng masuwerteng ng ilang sandali ang nakalipas. At ang katotohanan na ito ay 0 ay marahil nang hindi kinakailangan mapanligaw. Sabihin lang gawin 50, isang medyo arbitrary numero, gumawa memory dot slash memorya - pa ring makakuha ng masuwerteng. Walang bagay na pag-crash. Ipagpalagay ko lang gawin ang isang bagay talaga sira ang bait, at gagawin ko 100. Hayaan ang gawing muli sa akin memorya, dot slash memorya - Nakakuha masuwerteng muli. Paano tungkol sa 1,000? ints lampas, halos, kung saan ang dapat kong maging? Gumawa ng memorya - diyablo. [Tawa] OK. Tayo'y hindi Nagkamali sa paligid na ngayon. Muling palabas ng pelikula memory. Nagkaroon kami pumunta. Ayos lang. Kaya tila ka index 100,000 ints lampas saan mo dapat naging sa memorya, masamang bagay mangyari. Kaya ito ay malinaw naman hindi isang matapang, mabilis panuntunan. Ako ay uri ng paggamit ng pagsubok at error upang makakuha ng doon. Ngunit ito ay dahil, mahaba kuwento maikli, memory ng iyong computer ay hinati rin sa mga bagay na ito na tinatawag na mga segment. At kung minsan, ang computer talaga ay nagbigay sa iyo ng kaunti pa sa memory kaysa hilingin sa iyo para sa. Ngunit para sa kahusayan, ito lamang ay mas madali upang makakuha ng mas maraming memorya ngunit lamang sabihin sa iyo na nakakakuha ka ng isang bahagi ng mga ito. At kung makakuha ka ng masuwerteng kung minsan, samakatuwid, maaari mong ma-hawakan memorya na ay hindi nabibilang sa iyo. Mayroon kang walang garantiya na kung ano ang halaga inilagay mo doon ay manatili doon, dahil ang computer pa rin ang palagay ni ito ay hindi iyo, ngunit ito ay hindi kinakailangan na dumalo tamaan ng isa pang segment ng memory sa computer at magbuod ng isang pagkakamali tulad ng ang isang ito dito. Ayos lang. Ang anumang mga katanungan pagkatapos ay sa memory? Ayos lang. Tingnan natin ang isang hitsura dito, pagkatapos, sa isang bagay na aming paglalaan para sa Binigyan para sa lubos ng ilang oras, na ay sa file na ito na tinatawag na cs50.h. Kaya ito ay isang file. Ang mga ito ay lamang ang maramihang ng mga komento up tuktok. At maaari mo pa Tiningnan ito kung mo poked sa paligid sa appliance. Ngunit ito lumiliko out na sa lahat ng oras, kapag ginamit namin upang gamitin ang string na ito bilang isang kasingkahulugan, ang mga paraan kung naming ipinahayag na kasing kahulugan ay may ito typedef keyword, para sa mga uri ng kahulugan. At talaga namin sinasabi na, gumawa String isang kasingkahulugan para sa pansamantalang trabaho star. Na ang paraan kung saan ang stack Nilikha ang mga gulong ng pagsasanay na kilala bilang ang string. Ngayon narito lamang isang prototype para getchar. Maaaring Nakita natin ito bago, ngunit iyan ay talaga kung ano ang ginagawa nito. getchar Walang inaakong argumento, nagbalik ng isang pansamantalang trabaho. getdouble Walang inaakong argumento, Ibinabalik ng isang double. getfloat Walang inaakong argument, babalik isang Float, at iba pa. getint ay in dito. getlonglong ay in dito. At getstring ay in dito. At na ito. Ito lilang linya ay isa pang Preprocessor directive dahil sa hashtag sa simula ng ito. Ayos lang. Kaya ngayon hayaan mo akong pumunta sa cs50.c. At hindi namin makipag-usap masyadong mahaba sa ito. Ngunit upang bigyan ka ng isang sulyap sa kung ano ang nangyayari ang lahat ng ito oras, hayaan mo akong pumunta sa - sabihin gawin getchar. Kaya getchar ay halos mga komento. Ngunit mukhang ito. Kaya ito ay ang aktwal na pag-andar getchar na kami nakapunta paglalaan para sa ibinigay na. At kahit na hindi pa namin na gamitin ang isang ito na madalas, kung kailanman, ito ay hindi bababa sa medyo simple. Kaya ito ay nagkakahalaga ng pagkuha ng isang mabilis na pagtingin sa dito. Kaya getchar ay isang walang-katapusang loop, sadyang kaya sa malas. Ito pagkatapos tawag - at ito ay uri ng isang magaling sa muling paggamit ng code namin ating sarili ay nagsulat. Ito tawag getstring. Dahil kung ano ang ibig ito ibig sabihin upang makakuha ng isang pansamantalang trabaho? Well, maaari mong pati na rin subukan upang makakuha ng isang buong linya ng teksto mula sa mga gumagamit at pagkatapos lamang tumingin sa isa ng mga character. Sa line 60, narito ang isang maliit na bit ng isang tseke katinuan. Kung getstring ibinalik null, sabihin hindi magpatuloy. May nangyaring mali. Ngayon ito ay medyo nakakainis na ngunit maginoo sa C. pansamantalang trabaho max marahil Kinakatawan ng kung ano lamang batay sa pangalan nito? Ito ay isang pare-pareho. Ito ay tulad ng mga numerong halaga ng pinakamalaking pansamantalang trabaho maaari mong kumatawan sa isa kagat, na kung saan ay marahil ang bilang 255, kung saan ay ang pinakamalaking bilang ka Kinakatawan walong bits, simula sa zero. Kaya ko na gamitin ito, sa function na ito, kapag pagsulat ang code na ito, dahil lamang kung ang isang bagay napupunta mali sa getchar ngunit ang layunin nito sa buhay ay upang magbalik ng pansamantalang trabaho, kailangan mong sa paanuman magagawang upang magsenyas sa user na may nangyaring mali. Hindi kami maaaring bumalik null. Ito ay lumiliko out na null ay isang pointer. At muli, may getchar upang magbalik ng pansamantalang trabaho. Kaya ang convention, kung ang isang bagay napupunta mali, ay ikaw, ang programmer, o sa kasong ito, ako gamit ang library, ako ay nagkaroon isang lang magpasya mang, kung isang bagay napupunta mali, pupuntahan ko ibalik ang numero 255, na kung saan ay tunay na ibig sabihin hindi namin, ang gumagamit ay hindi maaaring mag-type ang mga character na kinakatawan ng mga number 255 dahil nagkaroon kami ng isang magnakaw ito bilang isang tinaguriang halaga nagbabantay sa kumakatawan sa isang problema. Ngayon ay lumiliko out na ang mga character na 255 ay hindi isang bagay na maaari mong i-type sa iyong keyboard, kaya hindi sang-ayon. Ang user ay hindi mapansin na Ko na ninakaw ng character na ito. Ngunit kung sakaling makita sa mga pahina ng tao sa isang computer system ang ilang mga reference sa isang lahat pare-pareho ang caps tulad nito na nagsasabing, sa mga kaso ng mga error na ito ay maaaring pare-pareho ibabalik, na lahat ng tao sa ilang ginawa taon na ang nakakaraan ay mang nagpasya ibalik ang espesyal na halaga at tumawag ito ng isang pare-pareho sa kaso isang bagay napupunta mali. Ngayon magic ang mangyayari pababa dito. Una, ako deklarasyon sa linya 67 dalawang character, C1 at C2. At pagkatapos sa linya 68, mayroong talaga isang linya ng code na nakapagpapagunita ng ang aming mga kaibigan printf, naibigay na ito ay mayroon porsiyento CS sa mga panipi. Ngunit mapansin kung ano ang nangyayari dito. sscanf nangangahulugan string scan - Nangangahulugan i-scan ang isang na-format string, samakatuwid sscanf. Ano ang ibig sabihin na? Ito ay nangangahulugan na pumasa sa sscanf isang string. At line ay kahit ano ang mga uri ng user in Pumasa ka sa sscanf isang format tulad ng string ito ang sinasabi sa scanf kung ano ang mga umaasa sa iyo ang gumagamit ay nag-type in Ikaw pagkatapos ay pumasa-in ang mga address ng dalawang chunks ng memorya, sa kasong ito, dahil mayroon akong dalawang mga placeholder. Kaya ako ng pagpunta sa bigyan ito ang address ng C1 at ang address ng C2. At isipin ang na nagbibigay sa iyo ng isang function sa address ng ilang mga variable, kung ano ang ang implikasyon? Ano ang maaari function na gawin bilang isang resulta ng pagbibigay ito ang address ng isang variable, na taliwas sa ang variable na mismo? Maaari itong baguhin ito, tama? Kung kayo ay nagkaroon ng isang tao sa isang mapa sa isang pisikal na address, maaari silang pumunta doon at gawin kahit anong gusto nila sa address na iyon. Parehong ideya dito. Kung pumasa kami sa sscanf, ang address ng dalawang chunks ng memorya, kahit na ang mga maliliit na maliit na chunks ng memorya, C1 at C2, pero kami sabihin dito ang address ng mga ito, sscanf maaari itong baguhin. Kaya sscanf ng layunin sa buhay, kung basahin namin ang tao na pahina, ay upang basahin kung ano ang gumagamit na nai-type sa, umaasa para sa user pagkakaroon nai-type sa isang character at siguro isa pang karakter, at ano ang user nai-type, ang unang character na napupunta dito, ang pangalawang character na napupunta dito. Ngayon, bilang isang tabi, ito, at ginagawa mo lamang malaman na ito mula sa dokumentasyon, ang katunayan na ang ko bang ilagay ang isang blangkong espasyo doon Nangangahulugan lamang na hindi akong pakialam kung pinindot ng user ang mga Space bar ng ilang beses bago siya ay tumatagal ng isang karakter, pupuntahan ko huwag pansinin anumang mga white space. Kaya iyon, alam ko mula sa ang dokumentasyon. Ang katotohanan na mayroong isang pangalawang c% sinundan ng white space ay talagang sinadya. Gusto kong maging magawang makita kung ang user screwed up o hindi makikipagtulungan. Kaya ako umaasa na ang gumagamit ay nag-type lamang sa isang character, kaya ako umaasa sscanf na lamang ang pagpunta upang ibalik ang 1 halaga dahil, muli, kung nabasa ko ang dokumentasyon, sscanf ng layunin sa buhay ay upang bumalik sa bilang ng mga variable na puno may user input. Ako pumasa sa dalawang variable address, C1 at C2. Ako umaasa, bagaman, na ang isa lamang sa ang mga ito ay makakakuha ng pumatay dahil kung sscanf return 2, ano ang siguro ang lohikal na implikasyon? Na ang gumagamit ay hindi lang ninyo ako ng isa na character tulad ng sinabi ko sa kanya. Sila ay malamang na nai-type sa hindi bababa sa dalawang mga character. Kaya kung ako sa halip ay hindi magkaroon ng ikalawang % C, ko lang ay nagkaroon ng isa, na nang tapat ay magiging mas madaling maunawaan diskarte, sa palagay ko isang unang tingin, hindi ka pagpunta sa magagawang detect kung ang gumagamit ay nagbibigay sa iyo ng higit pa input kaysa sa iyo talaga gusto. Kaya ito ay isang implicit paraan ng error checking. Ngunit mapansin kung ano ang ginagawa ko dito. Sa sandaling ako sigurado na ang gumagamit ay nagbigay sa akin ng isa karakter, magbakante ko ang mga linya, paggawa sa tapat ng getstring, na siya namang ay gumagamit ng malloc, at pagkatapos ay bumalik ako C1, ang character na ako umaasa sa gumagamit ibinigay at lamang na ibinigay. Kaya isang mabilis na glimpsed lamang, ngunit anumang mga katanungan sa getchar? Kami ay bumalik sa ilan sa mga iba. Well, ipaalam sa akin sige at gawin ito - ipagpalagay ngayon, lamang upang mag-udyok sa aming talakayan sa isang linggo plus oras, ito ay isang file na tinatawag na structs.h. At muli, ito lamang ang lasa ng isang bagay na namamalagi maaga. Ngunit notice na ng maraming ng mga ito ay mga komento. Kaya hayaan mo akong i-highlight lamang ang kagiliw-giliw na bahagi para sa ngayon. typedef - mayroong na parehong keyword muli. typedef ginagamit namin upang magpahayag ng string bilang isang espesyal na uri ng data. Maaari mong gamitin ang typedef upang lumikha ng bagong tatak mga uri ng data na ay hindi umiiral kapag C ay na-imbento. Halimbawa, int ay may C. pansamantalang trabaho ay may double C. ay may C. Ngunit walang paniwala ng isang mag-aaral. At pa magiging kaakit-akit kapaki-pakinabang upang maging magagawang magsulat ng isang programa na nag-iimbak sa isang variable, numero ng ID ng isang mag-aaral, ang kanilang pangalan, at ang kanilang mga bahay. Sa ibang salita, tatlong piraso ng data, i isang int at isang string at ng isa pang string. Sa typedef, kung ano ang medyo malakas tungkol sa mga ito at ang mga keyword para sa sturct istraktura, ikaw, ang programmer sa 2013, Maaari aktwal na matukoy ang iyong sariling mga mga uri ng data na ay hindi umiiral ang taon ang nakalipas pero na nababagay sa iyong mga layunin. At kaya dito, sa linya 13 sa pamamagitan ng 19, kami ay deklarasyon ng isang bagong uri ng data, tulad ng isang int, ngunit pagtawag ito mag-aaral. At sa loob ng mga variable na ito ay pagpunta sa maging tatlong bagay - sa isang int, isang string, at isang string. Kaya maaari mong isipin kung ano ang talagang nangyari dito, kahit na ito ay isang bit ng isang pagpapagaan para sa araw, mag-aaral ay isang mahalagang pagpunta upang magmukhang ganito. Ang pagpunta sa maging isang tipak ng memory sa isang ID, pangalan ng field, at isang bahay na patlang. At magagawa naming gamitin ang mga chunks ng memorya at i-access ang mga ito tulad ng sumusunod. Kung pumunta ako sa struct0.c, dito ay isang medyo mahaba, ngunit ang pagsunod sa isang pattern, ng code na Ginagamit ang bagong bilis ng kamay. Kaya una sa lahat, ipaalam sa akin gumuhit ng iyong pansin sa mga kagiliw-giliw na mga bahagi up tuktok. Biglang tumutukoy sa mga mag-aaral 3, declares isang pare-pareho na tinatawag na mag-aaral at pinaglaanan mang ito ang bilang 3, lamang kaya Mayroon akong tatlong mga mag-aaral gamit ang program na ito para sa ngayon. Narito pagdating Main. At notice, paano ko idedeklara isang array ng mga mag-aaral? Well, ko lang gamitin ang parehong syntax. Ang salitang mag-aaral ay malinaw naman bagong. Ngunit mag-aaral, klase, mga mag-aaral bracket. Kaya sa kasamaang palad, mayroong maraming isang ng muling paggamit ng mga terminong ginamit dito. Ito ay lamang ng isang numero. Kaya ito ay tulad ng sinasabi ng tatlo. Class ay lamang kung ano ang gusto ko upang tawagan ang variable. Kaya kong tumawag ito mag-aaral. Ngunit klase, ito ay hindi isang klase sa isang bagay na nakatuon sa Java na uri ng paraan. Ito ay lamang ng isang klase ng mga mag-aaral. At ang uri ng data ng bawat elemento sa array na ay mag-aaral. Kaya ito ay isang maliit na iba't ibang at mula sa sinasabi ng isang bagay tulad nito, ito lamang ay - Ako sinasabi ninyo akong bigyan ng tatlong mag-aaral at tumawag na array klase. Ayos lang. Ngayon narito ang isang apat na loop. Ang pamilyar na lalaki ni - umulit mula sa zero hanggang sa tatlong. At narito ang mga bagong piraso ng syntax. Ang programa ang nangyayari upang i-prompt sa akin, ang tao, upang bigyan ito ng isang mag-aaral ID, na kung saan ay sa isang int. At narito ang syntax na kung saan maaari kang mag-imbak ng isang bagay sa ID patlang sa lokasyon klase bracket I. Kaya syntax na ito ay hindi bago. Ito ay nangangahulugan lamang ninyo akong bigyan ang pangwalo mag-aaral sa klase. Ngunit simbolo na ito ay bago. Up hanggang ngayon, kami ay hindi maaaring ginamit na tuldok, hindi bababa sa code na tulad nito. Nangangahulugan itong pumunta sa struct kilala bilang isang mag-aaral at maglagay ng isang bagay doon. Katulad nito, sa susunod na linya, 31, pumunta Magpatuloy at ilagay ang kahit anong user ang mga uri para sa isang pangalan dito at kung ano ang ginagawa nila para sa isang bahay, ang parehong bagay, sige at ilagay ito sa. bahay. Kaya kung ano ang program na ito sa huli gawin? Maaari mong makita ang isang maliit na teaser doon. Hayaan akong sige at huwag gumawa structs 0 dot slash struct 0, mag-aaral ID 1, sabihin David Mather, mag-aaral ID 2. Rob Kirkland, mag-aaral ID 3. Lauren Leverit - at ang tanging bagay na programa na ito ginawa, na kung saan ay ganap lamang arbitrary, ay Nais kong gawin ang isang bagay na may data na ito, ngayon na ko na nagturo sa amin kung paano gamitin structs, ay ko lang nagkaroon ito dagdag loop dito. Umulit ako sa ibabaw ng hanay ng mga mag-aaral. Ginamit ko ang aming, marahil ngayon pamilyar na kaibigan, ihambing ang string, stircomp sa tseke ay bahay-8 ng mag-aaral katumbas ng Mather? At kung kaya, i-print lamang ng isang bagay mang gusto, oo, ito ay. Ngunit muli, lamang ang pagbibigay sa akin mga pagkakataon gamitin at muling gamitin at muling gamitin ang bagong notation tuldok. Kaya kung sino ang nagmamalasakit, tama? Pagdating up sa isang programa ng mag-aaral ay medyo arbitrary, ngunit ito lumiliko out na maaari naming gawin kapaki-pakinabang na bagay sa ito, halimbawa tulad ng sumusunod. Ito ay isang mas kumplikadong struct sa C. Ito ay nakuha ng isang dosena o higit pang mga patlang, medyo cryptically pinangalanan. Ngunit kung sakaling mo na narinig ng isang graphics format ng file na tinatawag na bitmap, BMP, ito lumiliko out na ang bitmap format ng file medyo magkano Mukhang na ito. Ito ay isang maliit na nakababagod SMILEY mukha. Ito ay isang maliit na larawan ko na naka-zoom in sa medyo malaki upang ang maaari kong makita ang bawat ng indibidwal na mga tuldok o pixels. Ngayon, ito lumiliko out maaari naming kumakatawan sa isang itim na tuldok sa, sabihin nating, ang bilang 0. At isang puting tuldok na kasama ang numero 1. Kaya sa ibang salita, kung nais mong upang gumuhit ng isang SMILEY mukha at i-save ang imaheng iyon sa isang computer, ito suffices upang mag-imbak at mga zero buhay na ganito ang hitsura, kung saan, muli, alin ang puti at mga zero ay mga itim. At sama-sama, kung mabisa mong magkaroon isang magbigkis ng mga bago at mga zero, mayroon kang isang grid ng pixels, at kung ikaw lay out ang mga ito, mayroon kang isang nakatutuwa maliit SMILEY mukha. Ngayon, bitmap format ng file, BMP, ay epektibo na sa ilalim ng hood, ngunit may higit pang mga pixel maglalasing ka na Maaari aktwal na kumakatawan sa mga kulay. Ngunit kapag mayroon kang higit pang mga kumplikadong format ng file tulad ng BMP at JPEG at GIF kung saan maaari kang maging pamilyar, mga mga file sa disk ay karaniwang hindi lamang may mga zero at mga bago para sa pixels, ngunit mayroon silang ilang metadata pati na rin - meta sa kamalayan na hindi talaga data ngunit ito ay kapaki-pakinabang na magkaroon. Kaya mga patlang na ito dito ay nagpapahiwatig, at ipapakita namin makita ito nang mas detalyado sa P-set 5, na bago ang mga zero at mga bago na Kumakatawan sa mga pixel sa isang imahe, mayroong isang bungkos ng metadata tulad ng ang laki ng mga imahe at mga lapad ng imahe. At mapansin ako plucking off ang ilang mga arbitrary bagay dito - lapad at taas. Bit bilang at ilang iba pang mga bagay. Kaya mayroong ilang mga metadata sa isang file. Ngunit sa pamamagitan ng pag-unawa kung paano ang mga file ay inilatag out sa paraang ito, maaari mo talaga pagkatapos ay manipulahin ang mga imahe, mga larawan mabawi mula sa disk, palitan ang laki larawan. Ngunit hindi ka maaari kinakailangang paghusayin ang mga ito. Kailangan ko isang larawan. Kaya nagpunta ako pabalik sa RJ dito, sino na nakita mo sa screen pa ng ilang oras ang nakalipas. At kung ako buksan up pangunahing tono dito, ito ay kung ano ang mangyayari kung susubukan mo upang mag-zoom in at paghusayin RJ. Hindi siya ay nakakakuha ng anumang mas mahusay na talaga. Ngayon ay pangunahing tono uri ng blurring ito ng Medyo, lamang upang pagtakpan ang katotohanan na RJ ay hindi makakuha ng partikular na pinahusay na kapag nag-zoom in At kung gawin ito sa ganitong paraan, makita ang mga parisukat? Oo, maaari mong makita Talagang ang mga parisukat sa isang projector. Iyon ay kung ano ang makakuha ka kapag mo mapapahusay. Ngunit sa pag-unawa kung paano ang aming RJ o ang SMILEY mukha ay ipinatupad ay ipaalam sa amin talaga magsulat code na manipulates mga bagay na ito. At naisip ko na gusto kong magtapos sa talang ito, may 55 segundo ng isang pagandahin na, Maglakas-loob ko, sabihin sa halip nakaliligaw. [Video playback] -Siya'y nakahiga. Tungkol sa ano, hindi ko alam. -Kaya ano ang gagawin namin malaman? -Iyon sa 09:15 Ray Santoya noon ay sa ATM. -Kaya ang tanong ay kung ano ang ay siya ang paggawa sa 9:16? -Shooting ang siyam milimetro sa isang bagay. Siguro nakita niya ang mamamaril na nakatago. -O kaya ay nagtatrabaho kasama niya. -Maghintay. Bumalik isa. -Ano ang gagawin mo makita? -Dalhin sa kanyang mukha up, full screen. -Ang kanyang baso. -Mayroon isang panganganinag. -Iyan ang koponan Neuvitas baseball. Iyon ang kanilang logo. -At ang kanyang pakikipag-usap sa kung sinuman ang suot na jacket. [END-playback ng video] David J. MALAN: Ito kalooban maging Problema Set 5. Kami ay makita mo sa susunod na linggo. MALE Tagapagsalita: Sa susunod na CS50. [CRICKETS CHIRPING] [Nagpe-play ng musika]