[Musika nagpe-play] Tagapagsalita 1: Ang lahat ng mga karapatan, ito ay CS50, at ito ang simula ng linggo apat, at bilang maaari kang narinig na o basahin, ang mundo ay nagtatapos. Pagpunta sa buong internet May naging kaalaman at kamalayan sa isang bug sa isang programa, ang isang programming language na tinatawag Bash. Ito ay na-branded wonderfully bilang Shellshock, o ang Bash pinto, ngunit ang mga artikulo tulad ng mga ito hindi naging pangkaraniwan. At sa katunayan, marami sa kanila ang dalhin bumalik mga alaala ng Heartbleed, saan ay maaari mong napansin sa pindutin muli ito nakaraang tagsibol, na ay katulad medyo dramatic. Ngayon ng mga mo dito ngayon, kung gaano karaming mga mayroon kang, kahit na hindi mo maunawaan kung ano ang lahat ng ito ay tungkol sa, Nalaman ng Shellshock? Ang lahat ng mga karapatan, at kung paano marami sa inyo may mga computer na mahina? OK, dapat ay mayroong malayo, malayo sa higit pang mga kamay hanggang ngayon, para sa mga kadahilanang ay dapat namin makita. Tingnan natin ang isang pagtingin sa kung ano ang nangyayari sa media at pagkatapos ay ipaliwanag ito ng kaunti dito para sa amin technically. Tagapagsalita 2: Mayroon eksperto sa Seguridad nagbabala na ang isang seryosong flaw ng dati maging tungkol sa makakaapekto sa daan-daang milyun-milyong mga gumagamit ng web sa buong mundo. Kaya kung ano ang eksaktong ay ang bug na naging tinatawag Shellshock, at kung ano ang ginagawa nito? Well, Shellshock ay kilala rin bilang Bash bug, ang software na ito nananamantala. Hacker gamitin ang virus upang i-scan mahina sistema ng pagpapatakbo ng Linux at Unix operating system at pagkatapos ay makaapekto sa mga ito. Bash ay isang command line shell. Ito ay nagbibigay-daan utos isyu mga gumagamit upang ilunsad mga programa at mga tampok sa loob ng software sa pamamagitan ng pag-type sa teksto. Karaniwang ginagamit ito sa pamamagitan ng mga programmer, at ay hindi dapat na bukas sa mas malawak na mundo, bagaman nagbabago Shellshock na iyon. Well, worringly, ang ilang mga analyst balaan maaari itong isang mas malaking banta, dahil Shellshock nagbibigay-daan sa kumpletong kontrol sa isang nahawaang machine, samantalang Heartbleed pinapayagan lamang hacker upang Spy sa mga computer. Ito ay kaya malubhang, ito ay na-rate 10 sa 10 para sa kalubhaan ng National Kahinaan Database. 2/3 ng lahat ng mga web server ay nasa panganib, kabilang ang ilang mga computer Mac. Well, siguraduhin na patch ang iyong mga system ngayon. Sinuman isang tumatakbong mga website na nagho-host mga apektadong mga operating system dapat gumawa ng pagkilos sa lalong madaling panahon. Sinuman na kayang bayaran ito dapat na tumingin sa kanilang pagsubaybay at web application firewall upang tumingin out para sa anumang mga pag-atake. Tagapagsalita 3: Pinakamahina ang bagay na maaaring mangyari ay na ang isang tao ay sumulat ng code na Gusto awtomatikong pumunta at i-scan ang internet at makakaapekto lahat ng mga computer. At sa sandaling gawin nila iyon, mahusay, ang pinakamasama bagay na maaari nilang gawin ay tanggalin lang ang lahat ng bagay, o shut ang mga site pababa. Kaya maaari naming makita pinsala mula sa na punto ng view, kung saan nais naming magkaroon ng nakahahamak na mga tao sino lamang magpasya na magdulot ng havoc pamamagitan ng pagdadala down na mga sistema o pagtanggal mga file, at mga bagay tulad na. Tagapagsalita 2: Ang ilang mga sabihin ito ay isa sa mga pinaka-mahirap na masukat mga bug sa taon, at ito ay maaaring tumagal ng mga linggo o kahit na buwan upang matukoy ang tunay na epekto nito. Tagapagsalita 1: Kaya lahat ng iyon ay totoo, ngunit ang nakakatawa bagay ay, halos lahat ng koleksyon ng imahe na nakita mo lang, maliban sa siguro ang keyboard, May walang kinalaman sa ang bug kung ano pa man. Server at wire at iba pa, uri ng tangentially ito ay may kaugnayan, ngunit sa core ito ay talagang kaakit-akit pamilyar sa kung ano ang nangyayari sa dito. Sa katunayan, hayaan mo akong pumunta sa aming CS50 appliance. Hayaan akong sige at i-maximize ang terminal na window dito. At sa iyo guys na-gamit na ito, o ang naka-embed na bersyon nito, sa gedit upang isulat ang mga programa, i-type ang command, at iba pa, at ito ay talagang, at may naging para sa linggo, Bash, B-A-S-H. Ito ang Bourne-shell muli, na kung saan ay lamang ng isang magarbong paraan ng sinasabi, ito ay isang programa na may kumikislap prompt, epektibo, na nakaupo doon naghihintay para sa input para sa iyo. At ito ay ang command na line interface sa pamamagitan ng kung aling mga ka guys tumatakbo utos at sa huli kino-compile at pagkatapos ay tumatakbo mga programa. Ngunit Bash ding programming wika sa mga sumusunod na kahulugan. Alam mo na may mga utos tulad ng cd at ls at din clang at iba pa, ngunit maaari mong tukuyin ang iyong sariling mga utos sa pamamagitan ng pagpapatupad ng mga ito sa Bash. Ngayon hindi namin ang pagpunta sa pumunta sa mahusay na detalye bilang sa Bash ang programming language, ngunit alam, halimbawa, na sa sandaling ito, walang command na tinatawag na "kumusta." Kaya ito ay matatagpuan sa isa sa mga pakete. Hindi ito naka-install sa aking computer. Tanungin ang iyong administrator. Ngunit kung gusto ko bang maging isang programa na tinatawag na "kumusta" sa Bash o sa aking prompt, Maaari ko talagang gamitin ang syntax na medyo tulad ng C. Ito ay hindi masyadong ang parehong, ngunit mukha itong kaakit-akit na katulad ng isang function, albeit nawawala ang ilan sa mga detalye. Wala mukhang mangyari, ngunit ngayon kung nagta-type ako "kumusta," Maaari mong aktwal na magsulat ng isang programa, hindi sa C, hindi sa Java, hindi sa ibang programming wika, ngunit sa Bash mismo. Ngayon ang key dito ay na sinulat ni ko ang pangalanan Nais kong bigyan ang bagong utos, at ang mga panaklong ay rin symbolic ng pagiging isang function. Bilang isang bukod, maaari mo ring gawin masaya bagay, at sa katunayan, kahit na sa Mac OS, ito ay isang programa na tinatawag na Terminal. Nagmumula ito built in sa sinuman computer na iyon ay may isang Mac sa kuwartong ito, at maaari mong gawin katulad na bagay sa Mac OS, ngunit maaari kang pumunta nang higit pa lampas na iyon. At ito ay isang maliit na tangential, subalit ito ay uri ng masaya. Ako ay mapaalalahanan na ito umaga, kapag nag-iisip na ito sa pamamagitan, ng isang maliit na laro na ginamit ko upang i-play gamit ang isa sa dating TFs CS50 ni kung saan anumang oras siya ay lumakad ang layo mula sa ang kanyang keyboard sa kanyang screen unlock, Gusto ko magsagawa ng isang utos tulad ng this-- "kamustahin." At ngayon anumang oras siya ay dumating bumalik sa kanyang keyboard pagkatapos kong clear ang screen at siya ay umupo, subukan upang gumawa ng ilang trabaho, ilista ang mga nilalaman ng kanyang directory-- [Audio pag-playback] -Hello. Hello. Tagapagsalita 1: Kaya, sa pagkamakatarungan, ay hindi ito talaga "kumusta." Ito ay karaniwang isang bagay higit pa Akın sa that-- [Audio pag-playback] -Beep. Tagapagsalita 1: --that would-- ko kaya ang kanyang computer na gagawin Sumusumpa sa kanya anumang oras niya talaga nakaupo pababa sa kanyang keyboard. At nang masyadong mabilis niya naisip out hindi mag-iwan unlock ang kanyang screen. Ngunit ito ay nagmumungkahi ng pag-uuri ng hangal masaya na sa iyo ay maaaring magkaroon ng may isang bagay tulad Bash. Ngunit ito ay isang kaunti pa malubha, upang matiyak, kaysa iyon. At sa katunayan, ito ay isa sa mga karamihan sa mga mapanganib at pang-pangmatagalang mga bug na talagang pindutin ang mundo sa buong mundo. Bug na ito ay hindi sa paligid para sa ilang mga 20 taon, at makikita mo na struck sa loob lamang ng sandali sa pamamagitan ng kamag-anak pagiging simple nito. Kaya ito ay isang kinatawan Command na kung iyong pagmamay-ari ng Mac, literal ngayon kapag mayroon kang nakabukas ang iyong takip, maaari mong subukan ang pag-type sa na programa na tinatawag na Terminal. Terminal sa ilalim ng Mga Application Utilities-- para sa isang beses, mga gumagamit ng Windows Hindi mo na kailangang mag-alala tungkol sa partikular na threat-- ngunit ang mga mo sa mga Mac ay maaaring i-type na ito sa isang window tulad ng makikita kong gawin dito, at kung ako nagta-type ka na sa program na ito na tinatawag na Terminal, tulad ng makikita kong gawin ngayon, kung nakita mo ang salitang "mahina," ang iyong computer ay mahina laban sa pagsasamantala. Ngayon kung ano ang aktwal na ibig sabihin? At ito ay admittedly ang ilang mga kaakit-akit na nakatutuwang syntax, ngunit hindi bababa sa gumuhit out ipaalam ang ilan sa mga kawili-wiling aspeto. Kaya mayroong ilang mga syntax na mukhang medyo pamilyar, hindi bababa sa mula sa C at ang mga programa sa mas pangkalahatang paraan. Nakakakita ako ng ilang mga panaklong, semicolons, kulot braces, at tulad, ngunit ito ay lumiliko out na ito hangal bagay dito sa kulay dilaw ay mahalagang isang function na gumagana wala. Ang colon paraan gawin wala, at ang Nangangahulugan semicolon ihinto sa wala kang ginagawa. Kaya sa loob ng mga kulot braces, ang katotohanan na mayroon akong isang katumbas mag-sign sa kaliwa, ito ay mahalagang paglikha isang command, o isang variable, na tinatawag na x, at nagtatalaga ito na dilaw bit ng code doon. Na maaaring maging isang bagay tulad ng "echo kumusta "o" sabihin beep "o isang bagay Akın upang iyon. Ngunit mapansin kung ang iyong mga mata maglibot sa karagdagang sa kanan, mayroon pa sa linyang ito kaysa sa lamang sa dulo ng na semicolon. "Echo mahina," at pagkatapos ay lampas na mayroong kahit na higit pa. Ang isa pang semicolon, Bash -c :. Kaya mahaba kuwento maikli, ito linya ng code ay sapat na para sa nakapanghihimok isang computer na mahina laban sa paggawa ng isang bagay na nais mo itong gawin, dahil mayroong isang bug sa Bash kung saan kahit Bash ay dapat itigil pagbasa ng mga linya ng command na karapatan Mayroon bang matapos ang dilaw na teksto, para sa isang 20-plus na taong gulang bug, Bash ay talagang inalisan ng pagbabasa lampas na semicolon at kaakit-akit magkano ang ginagawa kung ano ito ay sinabi. Kaya kung ano ang mga implikasyon ng na ganap? Lamang ko sinabi "echo kumusta" o "echo mahina," ngunit kung ano kung ginawa mo ang isang bagay talaga nakahahamak na, tulad ng Rm -rf *, kung saan hindi mo maaari nag-type na dati, at tapat marahil dapat hindi masyadong lalong madaling panahon, dahil maaari mong gawin ang isang maraming pinsala sa mga ito. Bakit? Rm ginagawa kung ano ang, siyempre? Tinatanggal. * Ang ibig sabihin kung ano? Lahat. Kaya ito ay isang tinatawag na ligaw card, sa gayon ang ibig sabihin nito tanggalin ang lahat ng bagay sa ang kasalukuyang direktoryo. -r ang mangyayari sa ibig sabihin ng recursive, na nangangahulugan kung ano nagtatanggal ka ay isang direktoryo, at sa loob ng doon ay iba pang mga file at iba pang mga direktoryo, recursively sumisid sa doon at tanggalin ang lahat ng iyon. At -f ay ang pinakamasama sa mga ito ang lahat. Sinuman alam ano ang ibig sabihin -f dito? Force. Kaya pilitin paraan, kahit na kung ito ay isang hindi magandang ideya, gawin ito nang walang pagdikta sa akin para sa karagdagang confirmation. Kaya, alam mo na, tumawa kami sa ito, ngunit tapat, ako marahil i-type ito nang maraming beses sa isang araw, dahil ang katotohanan ay ito ay ang pinakamabilis na paraan upang tanggalin ang maramihang mga bagay-bagay. Ngunit kahit na nagawa ko na ang ilang mga pinsala. Ngunit kung ikaw ay upang linlangin ang isang computer sa pagtukoy ng ilang mga variable hangal o function na tinatawag na x, ngunit pagkatapos ay tricking ang computer sa e-execute lagpas sa mga hangganan ng na function, lampas na semicolon, maaari mong linlangin sa katunayan isang computer sa e-execute ang isang bagay tulad Rm -rf o ang command na Email o ang Kopyahin command. Anumang bagay Literal na maaari mong gawin sa mga computer, kung ang pagtanggal nito file, paglikha ng mga file, nagspa-spam sa isang tao, attacking ilang mga server sa malayo, kung maaari mo itong ipahayag may isang command, mo Maaari linlangin ang isang computer sa paggawa na. Ngayon kung ano ang isang halimbawa ng kung paano mo maaaring gawin ito? Well, maraming ng mga computer sa internet tumakbo Bash. Lahat ng mga user sa amin Mac ay kasama ng mga ito. Ang isang pulutong ng mga server ng Linux ay kabilang sa ang mga ito pati na rin, at Unix server. Muli ay nakakakuha ng Windows medyo off ang hook maliban kung na-install mo espesyal na software. Ngayon ng maraming mga server, para sa Halimbawa, magpatakbo ng mga web server, at sa katunayan Linux ay marahil ang pinaka-popular na operating system upang tumakbo sa mga computer sa internet na paghahatid up sa mga web page. Ngayon dahil kakailanganin namin makita sa ibang pagkakataon sa semestre, kapag magpadala sa iyo ng isang kahilingan mula sa ang iyong browser-- Chrome, Internet Explorer, whatever-- sa isang remote server, ito ay lumiliko out na kahit na nai-type mo pa lang www.example.com, ay magpadala ng mensahe sa iyong browser na mas arcane ng kaunti, tulad nito. Ngunit mapansin ang isang maliit na isang bagay na kakaiba. Ang unang dalawang linya Hindi ko nakita bago, ngunit hindi sila tumingin lalo na pagbabanta. Ngunit mapansin kung ano ang ninakaw ko para sa ikatlong linya dito. Kung ang isang masamang tao ay magpadala ng mensahe tulad nito mula sa kanyang computer na sa isang mahina Mac o isang mahina laban sa Linux server, ang nakakatawang bagay ay na Bash, na simpleng maliit na command prompt, ay omnipresent at madalas na gamit na sa mahalagang maisagawa ang mga nilalaman ng mensahe na natatanggap nito. At sa pamamagitan ng na logic, maaari mong linlangin isang web server, samakatuwid, sa pamamagitan ng pagpapadala ng isang bagay tulad ng User-Agent, na karaniwang ay dapat na sabihin ang pangalanan ng iyong browser. User-Agent Chrome, User-Agent Internet Explorer, User-Agent Firefox, ito ay ang iyong browser lamang ni paraan ng tinutukoy ang sarili nito. Ngunit kung ang isang masamang tao napaka cleverly sabi, mm-mm, ako hindi pagpunta sa sabihin sa iyo kung ano ang aking browser ay, Sa halip Pupunta ako sa magpadala sa iyo na ito cryptic-naghahanap ng bagay na may Rm -rf * Sa loob nito, maaari mong literal na linlangin ang isang mahina web server sa internet sa e-execute nang eksakto na sa doon para sa pagtatanggal ng lahat ng mga file. At tapat, na hindi kahit na ang pinakamasama ng ito. Maaari kang gumawa ng kahit ano. Maaari kang magsimula ng isang ipinamamahagi pagtanggi ng pag-atake ng serbisyo kung nagpadala sa iyo ng mensahe na ito buong bunches ng mga web server at pagkatapos ay nagkaroon ng mga ito ang lahat ng bumaba, para sa Halimbawa, sa Harvard.edu mga server, at maaari mong uri-uriin ng putok ang heck out sa mga ito sa pamamagitan ng isang network ng trapiko na noon ay kung hindi man ay nag-trigger sa pamamagitan ng ito masamang tao. Kaya, mahaba kuwento maikli, halos lahat ng tao sa kuwartong ito na nagmamay-ari ng Mac ay mahina laban sa ito. Ang pilak lining ay na maliban kung ikaw ay pagpapatakbo ng isang web server sa iyong laptop, at maliban kung aktwal mong na-configure ito upang payagan ang isang bagay tulad ng SSH sa ito, ikaw ay talagang safe. Ito ay mahina, ngunit walang isa sinusubukan upang makapunta sa iyong laptop, upang maaari mong uri ng mag-aalala dahil. Gayunpaman, Apple ay sa lalong madaling panahon maging sa pag-update ng isang remedyo para sa na ito. Ang mundo ng Linux ay inilabas ng isang bilang ng mga pag-aayos para sa Fedora at Ubuntu at iba pang mga bersyon ng Linux, at sa katunayan kung nagpapatakbo ka ng update 50 sa appliance, kahit na masyadong magiging update at naitama. Ngunit na masyadong ay hindi talaga naging mahina, dahil maliban kung hindi mo tinkered sa appliance at ginawa sa publiko ang iyong laptop naa-access sa internet, na kung saan ay hindi sa pamamagitan ng default, hindi ka talaga naging fine dahil ng firewalling at iba pang mga diskarte. Ngunit ito ay isang matinding halimbawa ng isang bug na tumira kami para sa para sa literal 20 taon, at kung sino ang nakakaalam kung may isang taong lahat ng oras na ito ay kilala tungkol dito? At sa katunayan, ito ay isa sa sa pangunahing mga hamon na ipapakita namin makita sa ibang pagkakataon sa semestre tungkol sa seguridad, ay na tulad lamang ng sa totoong mundo, ang mabuting guys ay nasa dehado. Upang panatilihing ang masamang guys out, mayroon kaming upang tiyakin na ang bawat pinto ay naka-lock, na ang bawat window ay ligtas, na bawat punto ng pagpasok sa isang bahay ay ligtas upang panatilihin ang mga masamang guys out. Ngunit ano ang ginagawa ng masamang tao mayroon sa gawin upang aktwal na ikompromiso ang iyong home at magnakaw mula sa iyo? Siya lamang ay may upang makahanap ng isang naka-unlock pinto, isa sirang window, o isang bagay na kasama ang mga linya, at ito ay ang parehong bagay sa seguridad computer. Maaari naming magsulat ng milyun-milyong mga linya ng programming code at paggastos daan-daan o libu-libong ng mga oras na sinusubukan mong makakuha ng mga ito tama, ngunit kung gumawa ka ng isa lang pagkakamali sa kawastuhan, maaari mong ilagay ang buong system at sa katunayan sa kasong ito, ang buong internet at mundo sa panganib. Kaya kung nais mong matuto nang higit pa tungkol ito, pumunta sa URL na ito dito. Hindi na kailangan para sa pagkilos ngayong gabi maliban kung ikaw ay kasama ng mga higit pang mga kumportableng na tumatakbo ang iyong sariling web server, kung saan dapat mong, sa katunayan, i-update ang iyong software. At ito masyadong ay ang pamagat ng isang salita, at ngayon ng isang papel, na na-link namin sa website kurso para sa araw na ito. Ito ay sa pamamagitan ng isang kapwa na may pangalang Ken Thompson, na ay tumatanggap ng isang napaka sikat award sa computer science, at ibinigay niya ito speech ilang taon nakaraan, mahalagang sa parehong paksa. Na humihiling sa mga tao ang pinag-uusapan, dapat mo ba talagang tiwala, sa huli, ang software na iyong binigyan? Halimbawa, mayroon kaming lahat nagsusulat programa, at kami ay kino-compile ang mga ito gamit Clang. At sa iyong kaalaman, mayroon kang nakasulat na anumang mga programa para sa CS50 kung saan mayroong ng back pinto ng uri, mayroong isang paraan na isang masamang tao, kung tumatakbo ang iyong programa, Maaaring magtagal sa paglipas ng iyong computer? Marahil hindi, i-right? Mario, at sakim, at ng Credit. Ito ang lahat medyo maliit na mga programa. Gusto mo kailangang maging maganda masamang kung ikaw talaga ginawa madaling maapektuhan ang iyong buong computer na pagkatapos ng pagsusulat ng 10 o 20 mga linya ng code, o hindi bababa sa walang kamalayan sa ilang ng mga implikasyon sa seguridad. Ngayon sabihin ko na facetiously, ngunit kami ay pagpunta upang makita ngayon at sa linggong ito ito ay talagang talaga ito, talagang madali upang maging masama at gumawa ng kahit na maikling mga programa mahina. Ngunit sa ngayon, hindi bababa sa, mapagtanto na ang tanong na hinihingan dito ay tungkol Clang sa isang Compiler. Bakit na-kami nagtitiwala Clang para sa nakaraang dalawa o tatlong linggo? Sino ang upang sabihin na sinuman ay nagsulat Clang ay hindi magkaroon ng isang "kung" kalagayan doon na lubos na injected ilang mga zero at mga bago sa bawat programa ito compiles na ipaalam sa kanya ng access kapag ikaw ay natutulog sa iyong computer at ang iyong laptop panakip bukas at ang iyong computer ay tumatakbo? Mag-right? Mayroon kaming ang ganitong uri ng sistema ng karangalan karapatan ngayon kung saan kami pinagkakatiwalaan na Clang ay legit. Pinagkakatiwalaan mo na ang appliance ay legit. Pinagkakatiwalaan mo na literal bawat programa sa iyong Mac o PC ay mapagkakatiwalaan. At bilang na ito simpleng bug nagmumungkahi, kahit na ito ay hindi nakahahamak na, na talagang hindi malamang na ang kaso. Kaya dapat kang maging natakot bilang impiyerno. Tapat, walang simple solusyon sa iba pang mga kaysa sa isang uri ng kamalayan societal ng pagtaas ng pagiging kumplikado na aming pagbuo sa tuktok ng aming mga computer system, at kung paano lalong madaling maaaring napaka na rin kami. Ngayon na may sinabi na iyon, Breakout. Kaya itakda Breakout ay tatlong problema, at Breakout ay isang laro mula sa yesteryear na maaari mong isipin ang, ngunit para sa atin sa problema magtakda ng tatlo, ay nagbibigay-daan ito sa amin upang magsagawa ng mga bagay-back up ng isang bingaw upang kapag kami ay sumusulat programa, kahit na sa isang Terminal window na tulad nito, maaari naming aktwal na patakbuhin, sa huli, graphical na mga programa hindi hindi tulad ng mga namin ay may pag-access sa sa simula. Kaya ito ay ang mga tauhan pagpapatupad ng Breakout, na lamang ito brick-breaking laro, na ilipat mo ang iyong mga sagwan pabalik at pabalik, at pindutin mo ang bola laban sa mga may-kulay na brick up tuktok. Kaya ito ay nagdadala sa amin uri ng mga pabalik sa kung saan nagawa naming maging masyadong mabilis sa simula, at ngayon may C, pagpapatupad ng ating sariling graphical interface ng gumagamit. Ngunit higit sa na, ito set problema ay kumakatawan sa unang na kung saan kami ay nagbibigay sa sa iyo ng isang bungkos ng code. At sa katunayan, dalhin ako tahasang pansin sa mga ito, dahil lalo na para sa mga mas kumportable, ito itakda ang problema, hindi bababa sa unang tingin, ay pagpunta sa pakiramdam tulad ng nagsagawa kami ng mga ito up ng isang bingaw. Dahil binigyan ka namin, para sa ilan sa paghahanap at pagbubukod-bukod ng mga problema sa pset, isang bungkos ng code na aming sinulat ni, at isang pares ng mga komento na nagsasabing "gawin," kung saan mayroon kang upang punan ang mga blangko. Kaya hindi masyadong nakakatakot, ngunit ito ang unang pagkakataon kami ay handing mo code na kailangan mong basahin muna, nauunawaan, at pagkatapos ay idagdag sa at kumpletuhin ito. At pagkatapos ay may Breakout, kami ay pagpunta sa gawin ang parehong, na nagbibigay sa iyo ng ilang dosenang higit pang mga linya ng code na iyon, tapat, nagbibigay sa iyo ng maraming mga framework para sa ang laro ngunit ihinto ang maikling ng pagpapatupad ng mga brick at ang bola at ang sagwan, ngunit ginagawa namin ipatupad ang ilang iba pang mga tampok. At kahit na sa unang tingin, muli, lalo na kung mas kumportable, maaaring tila lalo na daunting at sa tingin mo ay may napakaraming mga bagong pag-andar kailangan mong i-wrap ang iyong isip sa paligid, at iyon ang totoo. Ngunit tandaan, ito ay medyo tulad ng simula. Logro ay hindi mo gamitin ang lahat ng ang puzzle piraso sa scratch. Logro ay hindi mo na mahalaga sa wrap ang iyong isip sa paligid ng lahat ng mga ito dahil ang lahat kinuha ito ay isang mabilis na pagsulyap upang maunawaan, oh, na kung ano ang maaari kong gawin may na piraso puzzle. At sa katunayan, sa problema nakatakda 3 spec, ipapakita namin ituro sa iyo sa dokumentasyon na gagawin kitang ipakilala sa ilang mga bagong pag-andar, at sa huli ang programming constructs mong gamitin. Kundisyon, loop, variable, at mga function ay magiging magkapareho sa kung ano ang nasaksihan namin sa gayon ay malayo. Kaya sa katunayan, kung ano ang ibibigay namin ikaw ay ilang sample code na hinahayaan kang lumikha ng isang window na mukhang hindi hindi tulad ng ito, at sa huli i-on ito sa isang bagay na lubos na tulad nito. Kaya samantalahin CS50, talakayin oras ng opisina at higit pa, at kumuha ng ginhawa sa ang katunayan na ang ang halaga ng code na mayroon ka na magsulat ay talagang hindi lahat na magkano. Ang unang hamon ay upang acclimate lamang ang iyong sarili sa ilang mga code na namin ang nakasulat. Ang anumang mga katanungan sa pset3, Shellshock, o kung hindi man? Madla: Ito ay tila tulad ng pagdaan sa Breakout na ang code ay halos isang object-oriented estilo, ngunit naisip ko C ay isang object-oriented program. Tagapagsalita 1: Isang mahusay na pinag-uusapan. Kaya sa naghahanap sa pamamagitan ng code ng pamamahagi, ang code kami ay sumulat para sa pset3, para sa mga pamilyar, ito Mukhang ito ay isang maliit na object-oriented. Maikling sagot ay, ito ay. Ito ay isang pagtatantya ng kung paano mo maaaring gawin object-oriented code gamit isang wika tulad ng C, ngunit ito ay pa rin sa huli pamamaraan. Walang mga pamamaraan sa loob ng ang mga variable, tulad ng makikita mo. Ngunit ito ay reminiscent ng iyon. At kami makita muli ang tampok na iyon kapag makuha namin sa PHP at JavaScript patungo sa katapusan ng semestre. Ngunit sa ngayon, sa tingin ng ito bilang isang pahiwatig ng kung ano ang darating. Magandang katanungan. Lahat ng karapatan. Kaya magsamang bumaybay-uri-uriin ay kung paano namin kaliwang bagay na huling beses. At sumanib-uri-uriin ay cool na sa pakiramdam na ito ay kaya magkano ang mas mabilis, hindi bababa sa batay sa cursory pagsubok Ginawa namin noong nakaraang linggo, kaysa sa, sabihin nating, bubble -uri-uriin, uri pagpipilian, ang uri pagpapasok. At kung ano ang kapong baka masyadong lamang paano succinctly at cleanly maaari mong ipahayag ito. At kung ano ang sinabi namin na ito ay isang pang-itaas mapasailalim sa oras ng paggana ng pagsanib pagbukud-bukurin? Oo? Madla: n log n? Tagapagsalita 1: n log n, i-right. n log n. At kami ay bumalik sa kung ano na talaga ay nangangahulugan o kung saan na nagmumula sa, ngunit ito ay mas mahusay kaysa sa kung ano ng panahon Nakita na namin para sa bubble pagpili at pag-uuri pagpapasok? Kaya n nakalapat. n nakalapat ay mas malaki kaysa ito, at kahit na ito ay hindi masyadong halata, malaman na ang pag-log n ay mas maliit kaysa n, kaya kung gagawin mo n beses isang bagay na mas maliit sa n, ito ay magiging mas mababa kaysa sa n nakalapat. Ito ay isang bit ng Swersey doon. Ngunit may bayad kami ng isang presyo para sa mga ito. Ito ay mas mabilis, ngunit isang tema na sinimulan na lumabas noong nakaraang linggo ay ito tradeoff. Mayroon akong mas mahusay na pagganap oras matalino, ngunit kung ano ang kinailangang kong gastusin sa kabilang kamay, upang makamit iyon? Madla: Memory. Tagapagsalita 1: Sabihin nating muli? Madla: Memory. Tagapagsalita 1: Memory, o espasyo sa mas pangkalahatang paraan. At ito ay isang hindi super halata sa aming mga kawani na tao, ngunit isipin na ang aming mga boluntaryo ay stepping pasulong at stepping pabalik na waring mayroong isang array dito, at waring mayroong isang pangalawang array dito na maaari nilang gamitin, dahil kami Kailangan ng isang lugar na naa upang pagsamahin ang mga tao. Hindi namin mai-lamang magpalit ang mga ito sa lugar. Kaya sumanib-uri na magagamit ang ay mas maraming espasyo, na hindi namin ginawa kailangan sa ang iba pang mga algorithm, ngunit ang bentahe ay na ito ay mas mabilis. At tapat, sa tunay na mundo espasyo mga days-- RAM, hard disk space-- ay relatibong murang, at sa gayon ay ang hindi palaging isang masamang bagay. Kaya ipaalam sa tumagal ng isang mabilis na pagtingin, may kaunting panahon higit pa methodically, sa kung ano ang ginawa namin at bakit namin sinabi ito ay mag-log n n. Kaya narito ang ilan sa walong mga numero at mga walong boluntaryo namin ay may mga huling oras. At ang unang bagay na Sumanib Pagbukud-bukurin sinabi sa amin upang gawin ay kung ano? Madla: Divide sa dalawang. Tagapagsalita 1: Sabihin nating muli? Madla: Divide sa dalawang. Tagapagsalita 1: Divide sa dalawang, i-right. Ito ay napaka-reminiscent ng sa aklat ng telepono, ng hatiin at talunin sa mas pangkalahatang paraan. Kaya itinuturing namin ang kaliwang kalahati. At pagkatapos ay sa sandaling sinabi namin, uri kaliwang kalahati ng mga elemento, kung ano ang susunod na namin sasabihin? -Uri-uriin ang kaliwang kalahati ng kaliwang kalahati, na nagpahintulot sa amin upang, pagkatapos ng paghahati sa dalawang, tumuon sa apat at dalawang. Paano ka-uri-uriin ang listahan ngayon, sa dilaw, laki ng dalawang, gamit Pagsamahin ang uri-uriin? Well hatiin ito sa kalahati, at ayusin ang kaliwang kalahati. At ito ay kung saan bagay Nakakuha ng kaunti hangal panandalian. Paano ka-uri-uriin ang listahan na ng laki ng isa, tulad ng ito bilang apat dito? Ito ay pinagsunod-sunod. Tapos ka na. Ngunit pagkatapos ay paano mo uri-uriin ang isang listahan ng mga laki ng isa kapag ito ay ang bilang dalawang? Well, parehong bagay, ngunit ngayon kung ano ang ikatlong at ang mga key na hakbang sa magsamang bumaybay-uri-uriin? Ay nagkaroon ka ng upang sumanib sa kaliwa kalahati at ang kanang kalahati. At sa sandaling ginawa namin na, itinuturing namin sa apat, itinuturing namin ang dalawa. Nagpasya kaming lahat ng karapatan, Malinaw na dalawang ang mauna, kaya inilalagay namin ang dalawang sa sarili lugar, na sinusundan ng apat. At mayroon ka na ngayong upang uri ng rewind, at ito ay isang uri ng katangian ng isang algorithm tulad ng Pagsamahin Pagsunud-sunurin, rewind sa memorya. Ano ang susunod na linya ng kuwento? Ano ang dapat kong tumututok sa susunod? Ang karapatan sa kalahati ng kaliwang kalahati, Alin ang anim at walong. Kaya ipaalam sa basa-lamang sa akin sa pamamagitan na ito walang belaboring sa punto ng labis. Anim at walong, pagkatapos ay anim na pinagsunod-sunod, walong ay pinagsunod-sunod. Pagsamahin ang mga iyon nang magkakasama tulad ng iyon, at ngayon ang susunod na malaking hakbang ay, siyempre, uri-uriin ang karapatan kalahati mula sa pinakadulo unang hakbang ng algorithm na ito. Kaya tumuon kami sa isa, tatlo, pitong, limang. Pagkatapos ay Nakatuon kami sa kaliwang kalahati. Ang kaliwang kalahati ng na, ang karapatan sa kalahati ng na iyon, at pagkatapos ay pagsamahin sa isa at tatlong. Pagkatapos ang karapatan kalahati, pagkatapos ay iniwan ang kalahati ng ito, pagkatapos ay ang karapatan kalahati nito. Pagsamahin ang mga ito sa, at ngayon kung ano ay nananatiling na hakbang? Pagsamahin ang malaking kaliwang kalahati at ang malaki kanang kalahati, kaya isa napupunta down na doon, pagkatapos ng dalawang, pagkatapos tatlong, pagkatapos ng apat na, pagkatapos ay limang, pagkatapos ng anim na, pagkatapos ng pitong, pagkatapos ay walong. Kaya ngayon kung bakit ito sa huli ay ibinubunyag, lalo na kung n at logarithms higit pa Sa pangkalahatan sa halip makatakas sa iyo, hindi bababa sa kamakailang memory? Well, mapansin ang taas ng bagay na ito. Nagkaroon kami ng walong mga elemento, at kami hinati ito sa pamamagitan ng dalawang, sa pamamagitan ng dalawang, sa pamamagitan ng dalawang. Kaya base log dalawa sa walong nagbibigay sa amin ng tatlo. At pinagkakatiwalaan sa akin sa na kung medyo hazy sa iyon. Ngunit base log dalawa sa walong ay tatlong, kaya ginawa namin ang tatlong mga layer ng pagsasama. At kung kailan namin Pinagsama mga elemento, kung gaano karaming mga elemento ay tinitingnan namin ang sa bawat isa sa mga hilera? Isang kabuuan ng n, tama? Dahil upang sumanib hilera sa itaas, kahit na ginawa namin ito piecemeal, sa huli naming hinawakan ang bawat numero sa sandaling. At sa pangalawang hilera, i- pagsamahin ang mga listahan ng mga laki ng dalawang, namin ay may upang pindutin ang bawat elemento nang isang beses. At pagkatapos dito talaga malinaw sa huling hilera, namin ay may upang pindutin ang bawat isa sa mga mga elemento ng isang beses, ngunit nang isang beses lamang, kaya dito ay namamalagi, pagkatapos, ang aming n log n. At ngayon lamang upang makagawa ng isang maliit na bagay higit pa pormal para sa isang sandali lamang, kung ikaw ay sa ngayon pag-aralan ito sa isang uri ng mas mataas na antas at subukan upang magpasya, na rin kung paano maaari kang pumunta tungkol sa pagpapahayag ng ang oras ng paggana ng algorithm na ito sa pamamagitan lamang ng pagtingin sa ito at hindi sa pamamagitan ng paggamit ng isang contrived halimbawa? Well, kung magkano ang oras na sasabihin sa iyo ng isang hakbang na tulad nito sa dilaw na nais kumuha, kung n <2 return? Iyon ay isang malaking O ng kung ano? Kaya ako nakakakita ng isa, kaya isang hakbang, siguro dalawang hakbang dahil ito ay kung at pagkatapos ay bumalik, subalit ito ay pare-pareho ang oras, tama? Kaya't sinabi namin O (1), at iyon ang paano ko ipahayag ito. T, tumatakbo ang oras lamang. n ay ang laki ng input, kaya T (n), isang magarbong paraan sinasabi ng mga running oras ibinigay na input ng laki n ay magiging sa pagkakasunud-sunod pare-pareho ng oras, sa mga O (1). Ngunit kung hindi man, kung ano ang tungkol dito? Paano mo ipahayag ang oras ng paggana ng ito dilaw na linya? T ng kung ano? Maaari mong uri ng cheat dito at sagutin ang aking tanong cyclically. Kaya kung ang oras sa pangkalahatang sabihin namin lamang ay T (n). At ngayon ka uri ng punting dito at sinasabi, mahusay, uri-uriin lamang ang kaliwang kalahati, at pagkatapos ay i-uri-uriin ang karapatan kalahati. Paano maaaring symbolically namin kumatawan ang oras ng paggana ito dilaw na linya? T ng kung ano? Ano ang laki ng input? n higit sa dalawang. Bakit hindi ko pa lang sabihin na? At pagkatapos na ito ay isa pang T (n / 2) at pagkatapos ay muli, kung pagsamahin ko ng dalawang Pinagbukud-bukod halves, kung gaano karaming mga elemento ako ng pagpunta magkaroon upang pindutin ang kabuuang? n. Kaya ang maaari kong ipahayag na ito, upang maging uri ng magarbong lamang, bilang ang oras sa pangkalahatan. T (n) ay isa lamang ang oras ng paggana ng T (n / 2), plus T (n / 2), pakaliwa kalahati at kanang kalahati, plus O (n), na kung saan ay marahil n hakbang na ito, ngunit marahil, kung gumagamit ako ng dalawang daliri, ito ay dalawang beses nang mas maraming hakbang na ito, subalit ito ay linear. Ito ay ilang bilang ng mga hakbang na isang factor ng n, kaya maaaring ipahayag namin ito bilang ito. At ito ay kung saan ngayon ipapakita namin punt sa pabalik sa aming mga aklat-aralin matematika ng mataas na paaralan Ikinalulungkot namin na ang pag-ulit sa huli Nagtatapos up na katumbas na ito, n beses log n, kung aktwal mong gawin out ang matematika sa higit pang pormal. Kaya na pananaw ng dalawang lamang. Isa numerically na may hard-code na kinatawan halimbawa gamit ang walong numero, at isang mas pangkalahatang pagtingin sa kung paano namin nakuha doon. Ngunit kung ano ang talagang kawili-wiling dito ay muli,, ang paniwala ng cycling. Hindi ko ginagamit para sa mga loop. Uri ng ako ng pagtukoy sa isang bagay sa mga tuntunin ng sarili nito, hindi lamang na may ito mathematical function, ngunit din sa mga tuntunin ng ito pseudo code. Ito pseudo code ay recursive sa na dalawa sa mga linya nito ay tunay na nagsasabi ito upang pumunta gamitin ang sarili nito upang malutas ang isang mas maliit na problema ng mas maliit na sukat, at muli at muli at muli hanggang sa whittle ito namin pababa sa ito nang sa gayon tinatawag na base kaso. Kaya ipaalam sa aktwal na gumuhit ng isang mas nakakahimok tumagal-layo mula ito tulad ng sumusunod. Hayaan akong pumunta sa gedit at kumuha ng isang tingnan ang ilan sa source code ngayong araw, sa partikular na halimbawang ito dito. Sigma 0, na tila nagdadagdag ang mga numero ng isa sa pamamagitan ng n. Kaya sabihin makita kung ano ang pamilyar at hindi pamilyar dito. Una mayroon kami ng ilang mga Kabilang, kaya walang bagong doon. Prototype. Ako ay medyo hazy sa ito pagkatapos ng ilang araw, ngunit kung ano ang sinabi namin ang isang prototype ng isang function ay? Madla: [INAUDIBLE]. Tagapagsalita 1: Ano iyon? Madla: ipahayag namin ito. Tagapagsalita 1: ipahayag namin ito. Kaya ikaw ay nagtuturo Clang, hey, Hindi pa talaga ang pagpapatupad na ito, ngunit sa isang lugar sa ang file na ito, baka, Pupunta na isang function na tinatawag na kung ano? Sigma. At ito ay isang pangako lamang na ito ay pagpunta sa ganito ang hitsura. Ito ay pagpunta sa tumagal ng isang integer bilang input-- at maaari ba akong maging mas tahasang at sabihin int n --and ito pagpunta upang bumalik sa isang int, ngunit semicolon paraan, mm, makikita ko makuha sa paligid sa pagpapatupad na ito ng kaunti sa ibang pagkakataon. Muli, Clang ay pipi. Ito ay pagpunta lamang na malaman kung ano sabihin mo ito sa itaas hanggang sa ibaba, kaya kailangan naming hindi bababa sa bigyan ito isang pahiwatig ng kung ano ang darating. Ngayon tingnan natin ang pangunahing dito ipaalam. Ng mag-scroll pababa dito Hayaan at tingnan kung ano ang pangunahing ginagawa. Ito ay hindi na mahaba ng isang function, at sa katunayan ay bumuo dito ay pamilyar. Ipinahahayag ko n isang variable, at pagkatapos ay Pester ko muli at muli ang user para sa isang positibong integer gamit getInt, at lamang na exit out ng loop sa sandaling ang gumagamit ay nakasunod. Gawin Habang, na ginamit namin upang pester ng user sa paraang iyon. Ngayon ito ay kawili-wili. Ipinahahayag ko sa isang int tinatawag na "sagot." Magtalaga ko ito ang halaga return ng isang function na tinatawag na "palatandaan." Hindi ko alam kung ano pa na ginagawa, ngunit Natatandaan ko pagdeklara ito ng ilang sandali ang nakalipas. At pagkatapos ay ako pagpasa sa halaga na ang gumagamit ay nai-type sa, n, at pagkatapos ay mag-uulat ang sagot. Ng mag-scroll pabalik na rin ipaalam para sa isang sandali lamang. Sabihin sige sa direktoryong ito, gumawa palatandaan 0, at aktwal na patakbuhin ang program na ito at tingnan kung ano ang mangyayari. Kaya kung pumunta ako magpatuloy at run ang program na ito, ./sigma-0, at nagta-type ako sa positibong integer tulad ng dalawa, Sigma, bilang nagpapahiwatig ng simbolo ng Griyego, ay lamang pagpunta sa magdagdag ng hanggang ang lahat ng mga numero mula sa ZERO sa hanggang sa dalawang. Kaya 0 plus 1 plus 2. Kaya ito ay dapat sana ay bigyan mo ako 3. Iyon lang nito ang ginagawa. At katulad, kung nagpatakbo ako ng ito muli at bibigyan ko ito ang bilang tatlong, na 3 plus 2, kaya na 5, plus 1 ay dapat magbigay sa akin 6. At pagkatapos ay kung makakuha ako talagang baliw at magsimulang mag-type sa mas malaking mga numero, dapat itong magbigay sa akin Mas malaki at mas malalaking sums. Kaya na ang lahat. Kaya kung ano ang hitsura ng palatandaan katulad? Well, ito ay medyo prangka. Ito ay kung paano maaari naming nagpatupad ito para sa nakalipas na dalawang linggo. "Int" ay magiging ang uri ng return. Sigma ay ang pangalan, at ito ay tumatagal ng isang variable m sa halip ng n. Makikita ko babaguhin na hanggang tuktok. Pagkatapos ito ay lamang ng isang tseke katinuan. Susubukan naming makita kung bakit ang ilang mga sandali. Ngayon Dinedeklara ko ng isa pang variable, suma, initialize ito sa zero. Pagkatapos Mayroon akong na ito Para sa loop iterating, tila para sa kaliwanagan, mula sa i = 1 sa hanggang sa isang = m, na kung saan ay kahit anong user na nai-type sa, at pagkatapos ay ako dagdagan ang halagang tulad nito. At pagkatapos ay bumalik ang kabuuan. Kaya ng ilang mga katanungan. Ang isa, inaangkin ko sa aking mga komento na ito avoids panganib ng isang walang-katapusang loop. Bakit ang pagpasa sa isang negatibong numero humimok, potensyal, isang walang-katapusang loop? Madla: Hindi ka maabot m. Tagapagsalita 1: Huwag kailanman maabot m. Ngunit m ay ipinasa sa, kaya sabihin isaalang-alang ang isang simpleng halimbawa. Kung m ay ipinasa sa pamamagitan ng user bilang mga negatibong isa. Kanikanilang mga pangunahing. Pangunahing pinoprotektahan sa amin mula sa ito, kaya lamang ako pagiging talagang anal sa palatandaan upang matiyak na rin na input ay hindi maaaring maging negatibo. Kaya kung m ay negatibo, isang bagay tulad ng mga negatibong isa. Ano ang nangyayari sa mangyayari? Well, i ay pagpunta sa makakuha ng mga nasimulan sa isa, at pagkatapos ay i ay magiging mas mababa sa o katumbas ng m? Stand sa pamamagitan ng. Iyon was-- sabihin hindi, nix ng kuwentong ito ipaalam. Hindi ko hinihiling na pinag-uusapan, dahil ang panganib na ako ay alluding sa Hindi pupunta mangyari dahil i ay palaging pagpunta na mas malaki than-- OK, Bawiin ko na pinag-uusapan. OK. Ni tumuon lamang sa bahaging ito dito Hayaang. Bakit Ipinahahayag ko ang ilang mga sa labas ng loop? Abiso sa 49 na hindi ko na linya ipinahayag i loob ng loop, ngunit online 48 na hindi ko na ipinahayag ng ilang sa labas. Oo. Madla: [INAUDIBLE]. Tagapagsalita 1: Oo naman. Kaya una at pangunahing ko ay tiyak na hindi nais na idedeklara at simulan ang halagang sa zero sa loob ng loop sa bawat iteration, dahil ito ay malinaw na talunin ang layunin ng summing up ng mga numero. Gusto ko panatilihin ang pagbabago ang halaga pabalik sa zero. At din, kung ano ang isa pang higit pa arcane dahilan para sa na parehong desisyon na disenyo? Oo. Madla: [INAUDIBLE]. Tagapagsalita 1: Mismong. Gusto kong i-access ito sa labas ng loop masyadong sa kung anong line? Sa 53. At batay sa aming pamantayan mula sa loob ng ilang mga aralin na ang nakakaraan, variable ay scoped, talaga ito, sa kulot braces na sumaklaw sa mga ito. Kaya kung hindi ko idedeklara halagang loob sa mga panlabas na kulot braces, Hindi ko ma-gamitin ito sa 53 linya. Ilagay ang isa pang paraan, kung ipinahayag ko halagang in dito, o kahit na sa loob ng Para sa loop, hindi ko ma-access ito sa 53. Ang variable ay epektibo ay nawala. Kaya ng ilang mga dahilan doon. Ngunit ngayon sabihin bumalik at tingnan kung ano ang mangyayari. Kaya palatandaan ay makakakuha ng tinatawag na. Ito ay nagdadagdag ng hanggang 1 plus 2, o 1 plus 2 plus 3, at pagkatapos ay bumalik ang halaga, Nag-iimbak ito sa sagot, at printf dito ang dahilan kung bakit ako nakakakita sa screen. Kaya ito ay kung ano ang makikita namin tumawag sa isang iterative diskarte, kung saan iteration lamang Nangangahulugan ang paggamit ng isang loop. Isang Para sa loop, isang Habang loop, isang Do Habang loop, lamang ang paggawa ng isang bagay na muli at muli at muli. Ngunit palatandaan ay uri ng kapong baka isang function na sa na maaaring ko ito ipatupad nang iba. Paano ang tungkol sa ito, na upang maging uri ng mga cool na lang, ipaalam sa akin talagang mapupuksa ng maraming distraction dahil ito function na ay talagang medyo simple. Sabihin whittle ito pababa lamang sa kanyang apat na pangunahing mga linya at mapupuksa ang lahat ng mga mga komento at mga kulot braces. Ito ay uri ng isang isip-Pagbugso alternatibong pagpapatupad. Ang lahat ng mga karapatan, siguro ay hindi bale-pamumulaklak, subalit ito ay uri ng sexier, lahat ng karapatan, tumingin sa mga ito nang sa gayon mas succinctly. Sa mga linya apat lamang ng mga code, Ako ay may unang katinuan check na ito. Kung m ay mas mababa sa o katumbas ng zero, palatandaan ginagawang walang kahulugan. Ito ay dapat lamang na nasa ito kaso para sa positibong numero, kaya lang pupuntahan ko bumalik sa zero nagkataon nang sa gayon ay hindi bababa sa kami ay may ilang tinatawag na base kaso. Ngunit narito ang beauty. Ang kabuuan ng ideyang ito, ang pagdaragdag ng numero mula 1 hanggang n, o m sa kasong ito, Maaaring magawa sa pamamagitan ng uri ng pagpasa sa Buck. Well, kung ano ay ang kabuuan ng 1 hanggang m? Well, alam mo kung ano? Ito ay ang parehong bilang ang kabuuan ng m plus ang kabuuan ng 1 hanggang m minus 1. Well alam mo kung ano? Ano ang palatandaan ng m minus 1? Well, kung ikaw uri ng sundin ito lohikal, ito ay kapareho ng m minus 1 plus palatandaan ng m minus 2. Kaya maaari mong uri ng just-- ito ay tulad ng, kung ikaw ay lamang sinusubukan mong mang-inis sa isang kaibigan at tanungin sila kang tanong, mo uri ng tumugon sa isang tanong, maaari mong uri ng panatilihin ang pagpasa sa Buck. Ngunit kung ano ang key ay kung patuloy mong paggawa ng mas maliit at mas maliit ang tanong at mas maliit, ikaw ay hindi humihingi kung ano ang palatandaan ng n, kung ano ang palatandaan ng n, kung ano ang palatandaan ng n? Ka na humihiling sa kung ano ang palatandaan ng n, kung ano ang palatandaan ng n minus 1, ano ang palatandaan ng n minus 2? Sa paglaon ang iyong tanong Mawawala na maging kung ano? Ano ang palatandaan ng isa o zero, ang ilang mga napakaliit na halaga, at sa lalong madaling mo makakuha ng mga iyon, ang iyong kaibigan, ikaw ay hindi pagpunta sa magtanong muli ng parehong tanong, lamang ka ng pagpunta sa sabihin, oh ito ay zero. Kami ay tapos na sa paglalaro ng ganitong uri ng hangal paikot-ikot ng laro. Kaya recursion ay ang kilos sa programming ng isang function sa pagtawag mismo. Ang program na ito, kapag pinagsama-sama at magpatakbo, ay pagpunta sa kumilos nang eksakto sa parehong paraan, ngunit kung ano ang key ay na loob ng isang function na tinatawag na palatandaan, doon ay isang linya ng code kung saan kami ay pagtawag sa ating sarili, na kung saan ay normal na maging masama. Halimbawa, kung ano ang unang kung ako pinagsama-sama ito, kaya gumawa sigma-- gumawa ng palatandaan 1 ./sigma-1. Positibong integer, mangyaring, 50 1275. Kaya kung ano Mukhang ang function maging, batay sa isa pagsubok, tama. Ngunit ano kung nakakuha ako ng maliit na mapanganib at tanggalin ang mga tinatawag na base kaso, at sabihin lamang, na rin ako sa paggawa ng lamang ito mas komplikado kaysa ito ay. Compute ng lang ang mga palatandaan Hayaan sa pamamagitan ng pagsasagawa m at pagkatapos ay pagdaragdag ng sa palatandaan ng m minus isa? Well, kung ano ang nangyayari sa mangyayari dito? Ni-zoom out Hayaan. Mag-recompile ng mga programa Hayaan, i-save ito, mag-recompile sa programa, at pagkatapos ay handa ./sigma-1-zoom in, ipasok ang positibong integer mangyaring, 50. Paano marami sa inyo ay payag sa fess up upang makita ang na? OK. Kaya ito ay maaaring mangyari para sa bilang ng mga kadahilanan, at tapat sa linggong ito kami ay tungkol upang makapagbigay ng higit sa mga ito sa iyo. Ngunit sa kasong ito, subukan Dahilan sa paurong kung ano ang maaaring nangyari dito? Segmentation fault, sinabi namin huling panahon, ay tumutukoy sa isang segment ng memorya. Isang bagay masamang nangyari. Ngunit kung ano ang ito mechanically na nagpunta pilipit dito dahil sa aking pag-alis ng na tinatawag na base kaso, kung saan ibinalik ko ang isang hard-code na halaga? Ano ang tingin mo nangyaring mali? Oo. Madla: [INAUDIBLE]. Tagapagsalita 1: Ah. Magandang katanungan. Kaya ang laki ng mga numero na ako ay summing up Nakakuha kaya malaki na ito ay nalampasan ang laki ng puwang ng memory. Magandang ideya, ngunit hindi fundamentally pagpunta sa maging sanhi ng pag-crash. Iyon maaaring magsanhi ng integer overflow, kung saan ang mga bits i-flip ng higit lamang sa at pagkatapos ay pagkakamali namin isang talagang malaking number para sa tulad ng isang negatibong numero, ngunit hindi mismo ay magiging sanhi ng pag-crash. Dahil sa dulo ng araw sa isang int ay 32 bit pa rin. Hindi ka pagpunta sa sinasadyang magnakaw ng isang 33 bit. Ngunit isang mahusay na pag-iisip. Oo. Madla: [INAUDIBLE]. Tagapagsalita 1: Ang paraan ng hindi kailanman tumigil sa pagtakbo, at sa katunayan ito tawag mismo muli at at muli at muli muli at muli, at wala sa mga function kailanman tapusin sapagkat ang kanilang mga nag-iisang linya ng code ng tawag themself muli at muli at muli. At kung ano ang talagang nangyayari dito, at ngayon kami uri ng Maaari gumuhit ito pictorially. Hayaan akong pumunta sa ibabaw sa isang larawan para sa sandali lamang. Ito ay isang larawan, na ay malaon laman out nang mas detalyado, ng kung ano ang nangyayari sa sa loob ng memory ng iyong computer. At ito ay lumiliko out na sa sa ibaba ng larawan na ito ay isang bagay na tinatawag na stack. Ito ay isang chunk ng memorya, isang chunk ng RAM, na ginagamit lamang sa anumang oras isang function ay tinatawag na. Anumang oras mo, isang programmer, tumawag sa isang function, sa operating system, tulad ng Mac OS, Windows, o Linux, grabs isang bungkos ng mga byte, siguro ay isang ilang kilobytes, marahil ilang megabytes ng memorya, mga kamay ang mga ito sa iyo, at pagkatapos ay nagbibigay-daan sa patakbuhin mo ang iyong mga pag-andar ng paggamit anumang mga variable na kailangan mo. At kung pagkatapos ay tumawag sa iyo ng isa pang function at isa pang pag-andar, makakuha ka ng isa pang slice ng memorya at isa pa na hati ng memorya. At sa katunayan, kung ang mga berde trays mula sa Annenberg kumakatawan na memorya, narito kung ano ang mangyayari sa unang oras tawagan ka function na palatandaan. Ito ay tulad ng paglalagay ng tray na tulad nito sa kung ano ang una isang walang laman na stack. Ngunit pagkatapos kung na tray tawag mismo, kaya upang makipag-usap, pagtawag sa isa pang pagkakataon ng palatandaan, na tulad ng pagtatanong sa operating system, ooh, kailangan ng kaunti pa sa memorya, ninyo ako iyon. At pagkatapos ay maipo-piled sa sa tuktok. Ngunit kung ano ang key dito ay ang unang tray ay mayroong pa rin, dahil mahihingi niya ang pangalawang tray. Ngayon samantala, palatandaan tumawag palatandaan, na tulad ng pagtatanong para sa higit pang memory. Ay makakakuha ng piled sa paglipas dito. palatandaan tumawag palatandaan, na ang isa pang tray na maipo-piled sa dito. At kung ikaw panatilihing ginagawa ito, Sa kalaunan, uri ng imapa ang visual na sa tsart na, kung ano ang nangyayari sa mangyari sa mga stack ng mga trays? Ito ay pagpunta lalampas sa halaga ng memory ng iyong computer ay may. At sa lalong madaling ito berde tray lumampas sa pahalang na linya sa itaas stack at sa itaas na salita heap, kung saan ipapakita namin ay bumalik sa sa hinaharap, iyon ay isang masamang bagay. Heap Ang ay isang iba't ibang segment ng memorya, at kung ipaalam sa iyo ang mga trays pile at tumpok sa, ka ng pagpunta sa lumampas ng iyong sariling mga segment ng memorya, at isang programa ay sa katunayan ng pagpunta sa pag-crash ng. Ngayon bilang isang bukod, sa ideya na ito ng recursion, samakatuwid, Maaari malinaw na humahantong sa mga problema, ngunit ito ay hindi palaging isang masamang bagay. Dahil isaalang-alang, pagkatapos lahat, how-- at marahil ito ay tumatagal ng ilang mga nagsisimula pa ginamit upang --how eleganteng o kung paano simple na pagpapatupad ng mga palatandaan ay. At hindi kami ay pagpunta upang gamitin ang recursion lahat na magkano sa CS50, ngunit sa CS51, at talagang anumang klase kung saan mo manipulahin ang mga istraktura ng data tulad ng mga puno, o pamilya mga puno, na may ilang hierarchy, ito ay sobrang, sobrang kapaki-pakinabang. Ngayon, bilang isang bukod, nang sa gayon ay bilang aspiring siyentipiko computer na ay pamilyar sa ilan sa mga Google sa loob biro, kung pumunta ka sa Google at tumingin ka up ano ang kahulugan ng, sabihin nating, recursion, ipasok. Uh-huh. Bilang isang bukod, na nakuha up ako ng ilan. Ito ay tulad ng 10 minuto ng procrastination ito umaga. Kung ikaw din ang Google ng "askew," abiso sa pamamagitan ng Pagkiling iyong ulo slightly-- at pagkatapos ay ang isang ito ay marahil pinaka atrocious ng lahat dahil ang isang tao na ginugol tulad ng ang kanilang araw ng pagpapatupad na ito ilang taon na ago-- dumating sa. Oh, wait-- na ang isang bug. Kaya't ang pagpapatakbo sa isa sa mga pinakamalaking mga website ng mundo ang mga hangal kaunti Easter itlog. Marahil sila kumonsumo ng isang nontrivial bilang ng mga linya ng code lamang sa gayon ay maaari kaming magkaroon maliit na masaya mga bagay tulad na. Ngunit hindi bababa sa ngayon kang makakuha ng ang ilan sa mga nasa loob biro. Ngayon ipaalam sa tumagal ng isang pagtingin sa ilan sa mga puti ay namamalagi nagsi-pagsabi namin ng late, at simulang i-Peel pabalik ilang mga layer technically nang sa gayon ay talagang nauunawaan mo kung ano ang nangyayari at maaari mong maunawaan ang ilan sa mga pagbabanta, tulad ng Shellshock, na Sinimulan na ngayon upang maging sa harap ng lahat pansin, doon man lamang sa media. Kaya dito ay isang napaka-simpleng pag-andar na nagbabalik ng walang, walang bisa. Ang pangalan nito ay magpalitan. Itong tumatagal sa dalawang variable at ito ay nagbabalik wala. Tumatagal sa isang at b. Kaya isang mabilis na pagpapakita. Dinala namin ang mga up. Maaaring pati na rin kami ng isang maliit na masira dito para sa isang sandali lamang at magkaroon ng isang maliit na isang bagay sa pag-inom. Kung may isang taong hindi bale ng pagsali sa akin up dito para sa sandali lamang. Paano tungkol sa iyo sa maroon shirt? Halika sa up. Lamang ang isa ngayon. Salamat sa iyo, bagaman. Ang lahat ng mga karapatan, at mayroon kaming paparating na dito? Ano ang inyong pangalan? Tagapagsalita 4: Laura. Tagapagsalita 1: Laura. Halika sa up. Kaya Laura, napaka-simpleng hamon ngayon. Nice upang matugunan yo. Lahat ng karapatan. Kaya mayroon kaming ilang mga gatas sa paglipas dito at mayroon kaming ilang mga orange juice sa paglipas dito at ang ilan tasa na namin hiniram mula sa Annenberg ngayon. Tagapagsalita 4: hiniram. Tagapagsalita 1: At pagpunta sa sige at bibigyan ka ng kalahati ng isang baso ng ito. Lahat ng karapatan. At bibigyan ka namin ng kalahati isang baso ng gatas. Oh, at sa gayon lamang na maaari kang matandaan kung ano ito ay tulad, Remembered ko bang magdala ng ito up at sa ngayon. Okay. Kung hindi mo nais na bale, sabihin makita, namin Maaaring ilagay ang mga ito sa paglipas ng iyong sariling baso kung gusto mo. Makikita ito maging sa mundo mula sa mga mata ni Laura. Lahat ng karapatan. Kaya ang iyong mga layunin, na ibinigay ng dalawang tasa ng likido dito, gatas at orange juice, ay magpalit ang dalawang mga nilalaman nang sa gayon ay ang orange juice ay pumupunta sa gatas ng tasa at ang gatas ay pumupunta sa ang orange juice tasa. Tagapagsalita 4: Gawin makakuha ako ng isa pang tasa? Tagapagsalita 1: Ako kaya natutuwa hiniling mo, bagaman ito sana ay naging mas mas mahusay na footage kung hindi mo ay nagtanong. Ngunit oo, maaari naming mag-alok ng isang third tasa na walang laman, siyempre. Lahat ng karapatan. Kaya magpalit ang mga nilalaman doon. Sa lalong magaling. Napakabuti. Ginagawa mo ito nang mabuti remarkably. At hakbang tatlo. Lahat ng karapatan. Mahusay. Ang isang malaking round ng applause ay magiging mabuti para sa Laura. Lahat ng karapatan. Mayroon kaming isang maliit na regalo pamamaalam para sa iyo, ngunit hayaan mo akong gawin ang mga. Salamat sa iyo kaya magkano. Kaya isang simpleng halimbawa, bagaman, upang ipakita na kung gagawin mo nais magpalit ng mga nilalaman ng dalawang mga lalagyan, o hayaan tumawag sa kanila na variable, kailangan mo ng ilang mga pansamantalang imbakan sa yugto ng isa sa mga nilalaman sa gayon na maaari mong aktwal na gawin ang swap. Kaya sa katunayan, ito source code up dito sa C ay kinatawan ng eksakto na. Kung ang orange juice ay isang at ang gatas ay b, at gusto naming magpalit ang dalawa, maaari mong subukan ang isang bagay na creative sa pamamagitan ng pagbuhos ng isa sa iba pang, ngunit malamang na gagana hindi magtapos ay partikular na mahusay. At kaya gumagamit kami ng isang third tasa, tawag ito tmp, T-M-P sa pamamagitan ng convention, at ilagay ang mga nilalaman ng OJ sa na, pagkatapos magpalit isa tasa, pagkatapos ay ilagay ang OJ sa orihinal na tasa, at sa gayon pagkamit, nang eksakto kung paano Laura ginawa, ang magpalitan. Kaya sabihin gawin eksakto na. Hayaan akong sige at buksan up isang halimbawa na aktwal na tinatawag na "walang magpalit, "dahil hindi ito bilang lang tapos na bilang maaari mong isipin. Kaya sa programang ito, mapapansin na ang Ginagamit ko ang stdio.h, ang aming lumang kaibigan. Mayroon akong ang prototype para magpalitan up doon, na Nangangahulugan pagpapatupad ng kanyang marahil down na sa ibaba, at sabihin makita kung ano ang pangunahing ito programa pupuntahan gawin para sa akin. Ako unang idedeklara nakakakuha int x isa, at int y nakakakuha ng dalawang. Kaya sa tingin ng mga bilang OJ at gatas, ayon sa pagkakabanggit. At pagkatapos ay may ko lamang ng isang printf sinasabi x ay ito at y ay ito, lamang kaya maaari ko makita kung ano ang nangyayari sa. Pagkatapos printf ko na nagke-claim na ako pagpapalit ang dalawa, at pagkatapos kong mag-print ng i-claim na ito ay naka-swapped, at i-print out ko x at y muli. Kaya down na dito sa swap ay nang eksakto kung ano ang ginawa Laura, at kung ano mismo ang nakita natin sa ang screen ng ilang sandali ang nakalipas. Kaya sabihin sige at maging sorely nabigo. Gumawa ng walang swap, at magpatakbo ng walang swap, ang pag-zoom in sa output dito. Ipasok ang x ay 1, y ay 2, pagpapalit swapped. x pa rin ang 1, at y ay 2 pa rin. Kaya kahit na, tapat, tinitingnan ito eksakto kung gusto, albeit higit pa technically, kung ano ang ginawa Laura, ay tila hindi na magtrabaho. Kaya bakit ay na? Well, ito ay lumiliko out na kapag sumulat kami ng isang programa na tulad nito na parehong pangunahing, na naka-highlight dito, at pagkatapos ay isa pang pag-andar, tulad ng magpalitan, naka-highlight dito, na ito tawag, sa mundo mukhang isang maliit na isang bagay tulad ng mga trays ng ilang sandali ang nakalipas. Kapag unang pangunahing ay makakakuha ng tinatawag na, na tulad ng pagtatanong sa operating system para sa isang bit ng memory para sa anumang lokal na variable tulad ng x at y na pangunahing ay, at nagtatapos ang mga ito doon. Ngunit kung pangunahing tawag magpalit, at pangunahing pass magpalit ng dalawang argumento, isang at b, orange juice at gatas, hindi ito gusto handing ang orange juice at ang gatas sa Laura. Ano ang isang computer, ay ito ipinapasa ng mga kopya ng orange juice at mga kopya ng gatas sa Laura, upang kung ano ang sa huli sa loob ng tray ay ang isang halaga at dalawang, o OJ at gatas, ngunit ang mga kopya nito, nang sa gayon ay sa puntong ito sa kuwento, mayroong ay OJ at gatas sa bawat isa sa mga trays. Mayroong isa at dalawa sa bawat isa sa mga trays, at ang magpalitan function ay sa katunayan gumagana. Ito ay pagpapalit sa kanila sa loob ng ng ikalawang pinakamataas tray, ngunit na pagpapalit ay walang epekto. At batay sa lamang ng ilang pangunahing prinsipyo hindi namin usapan tungkol sa bago, at sa katunayan lamang ng ilang mga minuto na nakalipas, kung ano maaaring ipaliwanag kung bakit ang pagbabago isang at b sa loob ng swap ay walang epekto sa x at y, kahit na Pumasang ko x at y sa swap function. Ano ang mga pangunahing salita dito na Maaaring simplistically ipaliwanag? Sa tingin ko narinig ko rito? Madla: Return. Tagapagsalita 1: Bumalik? Hindi nagbabalik. Sabihin pumunta sa isang iba pa. Ano iyan? Madla: [INAUDIBLE]. Tagapagsalita 1: OK, kaya return-- ng dati namin gumawa balik trabaho sa kuwento, ngunit mayroong isang kahit mas simpleng paliwanag. Madla: Saklaw. Tagapagsalita 1: Saklaw. Kukunin ko ang saklaw. Kaya ang saklaw, tandaan kung saan aming x at y ipinahayag. Ang mga ito ay ipinahayag sa loob ng pangunahing karapatan up dito. isang at b, samantala, ay epektibo ipinahayag sa loob ng magpalitan, hindi masyadong sa ang kulot braces ngunit pa rin sa pangkalahatang lugar ng swap. At kaya sa katunayan, isang at b umiiral lamang sa loob ng tray mula sa Annenberg, ito pangalawang chunk ng code. Kaya kami ay sa katunayan ang pagbabago ng kopya, ngunit na hindi talaga ang lahat na kapaki-pakinabang. Kaya ipaalam sa tumagal ng isang pagtingin sa ito medyo mas mababang antas. Pupunta ako sa bumalik sa ang Pinagmulan Directory, at Pupunta ako sa unang mag-zoom in dito, at lang upang makumpirma na ako sa ganitong mas malaking terminal na window, ay kumikilos pa rin ang programa tulad na. Ipagpalagay na ngayon na ito Hindi sadya. Malinaw Nais kong swap sa trabaho, kaya pakiramdam ito tulad ng isang bug. Ngayon maaari kong magsimulang magdagdag ng isang maraming printf upang aking code, nagpi-print out x sa ibabaw dito, y sa ibabaw dito, isang paglipas dito, b paglipas dito. Ngunit tapat, na malamang na kung ano ang ikaw ay ginagawa para sa isang ilang mga linggo ngayon, sa oras ng opisina at sa bahay kapag nagtatrabaho sa psets sinusubukan mong hanapin ang ilang mga bug. Ngunit makikita mo, kung hindi mo pa nagagawa, itakda ang problema na tatlong introduces sa iyo sa isang command na tinatawag na GDB, kung saan GDB, GNU debugger, May mismo ang maramihang mga mga tampok na maaari talaga ipaalam sa amin na maunawaan sitwasyon tulad nito, ngunit higit pa compellingly, malutas ang mga problema at humanap ng mga bug. Kaya ako ng pagpunta sa gawin ito. Sa halip na ./noswap, sa halip ako pagpunta sa magpatakbo ng GDB ./noswap. Sa ibang salita, ako ako pagpunta upang patakbuhin ang aking programa hindi sa Bash, ang aming mga bagong kaibigan ngayon. Pupunta ako sa tatakbo ang aking noswap programa sa loob ng iba pang mga programa na tinatawag na GDB, na isang debugger, na ay isang programa na dinisenyo upang makatulong mo mahanap ang mga tao at alisin ang mga bug. Kaya kung pindutin ko Magpatakbo dito, mayroong isang atrocious halaga ng teksto na hindi kailanman mo ba talagang mayroon na basahin. Ito ay mahalagang isang distraction mula sa prompt, na Pupunta ako sa pindutin ang Control-L upang makakuha ng hanggang sa tuktok doon. Ito ang GDB prompt. Kung nais kong patakbuhin ang program na ito ngayon, bilang na ito kaunti cheat sheet sa ngayon slide ay nagmumungkahi, Run ay ang unang utos na sinadya naming ipakilala. At lamang ako ng pagpunta sa i-type tumakbo hanggang dito sa loob ng GDB, at sa katunayan ang bumangga ito ang aking programa. Ngayon ay mayroong ilang mga karagdagang output ng screen na tulad nito, ngunit iyon ang GDB lamang pagiging anal at ng pagsasabi sa amin kung ano ang nangyayari sa. Wala ka ba talagang kailangang mag-alala tungkol sa mga detalye ngayon. Ngunit kung ano ang talagang cool na tungkol sa GDB, kung gagawin ko ito again-- Control-L nililimas ang screen-- ipaalam sa akin pumunta Magpatuloy at type ang "masira pangunahing," at sa gayon, kapag pinindot ko ang Enter, ang pagtatakda kung ano ang na tinatawag ng pahinga punto sa noswap.c, 16 linya, na kung saan GDB nalaman ang aking aktwal na programa ay, ang aking aktwal na function na ay. Ito ipapakita namin huwag pansinin sa ngayon ngunit iyon ang address sa memorya ng partikular na ito function. Kaya ngayon kapag ako ay i-type tumakbo, mapansin kung ano ang cool na dito. Aking Mga programa Pinaghihiwa sa linya ko Sinabi GDB i-pause ang pagpapatupad sa. Kaya hindi ko na kailangang ngayon baguhin ang aking code, magdagdag ng ilan printf ni, mag-recompile ito, Patakbuhing muli ito, baguhin, magdagdag ng ilan printf ni, i-save ito, mag-recompile ito, patakbuhin ito. Maaari ko lang maglakad sa pamamagitan ng aking programa basa sa pamamagitan ng sunud-sunod sa bilis ng tao, hindi sa Intel-loob uri ng bilis. Kaya ngayon mapansin ang linyang ito lumilitaw dito, at kung pumunta ako pabalik sa aking programa sa gedit, mapansin na iyon ay ang tunay pinakadulo unang linya ng code. Mayroong 16 na linya sa gedit. Mayroong 16 na linya sa loob ng GDB, at maging ang bagaman ito itim at puti interface Hindi halos bilang gumagamit friendly, ang ibig sabihin nito na line 16 ay hindi pa naipatupad pa, ngunit ito ay tungkol sa upang maging. Kaya nga kung nagta-type ako sa pag-print x, hindi printf, i-print lamang ang x, Nakakuha ako ng ilang bogus halaga doon ng zero, dahil x ay hindi pa nasimulan. Kaya ako ng pagpunta sa susunod na i-type, o, kung ikaw gustong maging fancy, lamang n para sa susunod. Ngunit kapag susunod kong i-type ang magpasok, ngayon mapansin ito gumagalaw sa hanggang sa 17 linya. Kaya lohikal na, kung na-pinaandar ko 16 linya at ngayon nagta-type ako sa pag-print x, ano ang dapat kong makita? Ang isa. At ngayon ito ay admittedly nakalilito. $ 2 lamang ang magarbong paraan ng, kung ikaw nais na mag-refer sa halaga na sa ibang pagkakataon, maaari mong sabihin ang "dollar sign dalawa." Ito ay tulad ng isang reference likod. Ngunit sa ngayon, balewalain lang ito. Ano ang mga kawili-wiling ay kung ano ang sa kanan ng katumbas sign. At ngayon kung nagta-type ako susunod muli at i-print y, ang dapat kong makita 2. Maaari din ako ngayong mag-print x muli, at tapat, kung Nakakuha ako ng isang maliit na nalilito bilang sa kung nasaan ako, maaari nagta-type ako listahan para sa listahan at lamang sa paligid makita ang ilang konteksto sa punto ako talaga sa. At ngayon maaari kong i-type susunod na, at may x ay 1. Ngayon nagta-type ako susunod. Oh, y ay 2. At muli, ito ay nakalilito, dahil ang output ng GDB ay commingled gamit ang aking sariling output. Ngunit kung panatilihin mo sa isip, sa pamamagitan ng glancing pabalik-balik sa iyong code o laying ito gilid sa pamamagitan ng gilid marahil, ipapakita sa iyo makita na talagang lamang ako stepping sa pamamagitan ng aking programa. Ngunit mapansin kung ano ang susunod na mangyayari, literal. Narito ang 22 linya. Hayaan akong pumunta sa paglipas ng ito, at sa gayon ay gumagalaw sa sa 23, at kung mag-print ko x ngayon, isa pa rin. At kung mag-print ko y ngayon, isa pa rin. Kaya ito ay hindi isang kapaki-pakinabang na ehersisyo. Kaya ang gawing muli ito ipaalam. Hayaan akong bumalik hanggang sa ang muli tuktok at uri ng run. At ito ay nagsasabi sa programa na ini-debugged Nagsimula na, na nagsimula mula sa simula. Oo, ni gawin muli ito ipaalam. Ni ang susunod na gagawin at oras na ito ipaalam, susunod, susunod, susunod, susunod, ngunit ngayon bagay makakuha ng kawili-wiling. Ngayon Gusto kong sa hakbang sa magpalitan, kaya hindi ko type susunod. Nagta-type ako hakbang na ito, at ngayon mapansin ito Na jumped ako sa noswap.c line 33. Kung pumunta ako pabalik sa gedit, kung ano ang 33 line? Iyon ang unang aktwal linya ng code sa loob ng swap. Alin ang magaling, dahil ngayon maaari ko uri ng poke sa paligid at makakuha ng malaman bilang sa kung ano ang nangyayari sa tunay na doon. Hayaan akong i-print tmp. Whoa. Bakit ang tmp kumuha ng mabaliw, bogus halaga basura? Madla: Ito ay hindi pa nasimulan. Tagapagsalita 1: Ito ay hindi pa nasimulan. At sa katunayan, kapag nagpatakbo ka ng programa, bibigyan ka ng isang buong bungkos ng memorya ng operating system, ngunit hindi pa nasimulan ang anumang mga halaga, kaya ang anumang mga piraso ikaw ay nakikita dito, kahit na ito ay ito mabaliw malaki negatibong numero, nangangahulugan lamang na ang mga ito ay ang mga labi mula sa ang ilang mga nakaraang paggamit ng na RAM, kahit na mayroon akong hindi kinakailangan ang aking sarili ito pa. Kaya ngayon ako pagpunta sa sige at uri susunod na, at kung ngayon nagta-type ako sa pag-print tmp, ano ang dapat kong makita? Anuman ang halaga ng isang noon ay, isang ay ang unang argumento, lamang tulad ng x ay ang unang bagay na ipinasa sa, kaya isang at x dapat ay parehas, kaya i-print tmp dapat mag-print ng isa sa akin. Kaya ano ang makikita mo sa hanay ng problema tatlong ay isang tutorial ng mga klase sa GDB, ngunit mapagtanto na ito ay ang simula ng isang pagtingin sa isang tool na ay talagang makatulong sa iyo na malutas ang problema kaya magkano ang mas epektibo. Ano kami sa huli pagpunta sa gawin sa Miyerkules ay magsimula sa Peel pabalik ng ilang mga layer at alisin ang ilang mga gulong pagsasanay. Na bagay na tinatawag na string na na ginamit namin para sa ilang oras, kami ay pagpunta sa dahan-dahan tumagal na ang layo mula sa iyo at simulan ang pakikipag-usap tungkol sa isang bagay na mas esoterically na kilala bilang char *, ngunit kami ay pagpunta sa gawin ito maganda at malumanay sa unang, kahit na pointer, habang ang mga ito ay tinatawag na, maaari gumawa ng ilang napaka masamang bagay kung inaabuso, pamamagitan ng pagtingin sa isang maliit na claymation mula sa ang aming mga kaibigan Nick Parlante mula sa Stanford University, isang propesor sa computer agham na ilagay magkasama ang preview na ito ng kung ano ang darating na ito Miyerkules. [VIDEO pag-playback] -Hey, Binky. Gumising. Panahon na para masaya pointer. -What Iyan? Alamin ang tungkol sa mga payo? Oh, goody! [END VIDEO pag-playback] Tagapagsalita 1: Iyon naghihintay sa iyo sa Miyerkules. Ipapakita namin sa iyo pagkatapos makita. [VIDEO pag-playback] -And Ngayon, Deep pananaw, sa pamamagitan ng Daven Farnham. -Why Ay pag-aaral namin C? Bakit hindi A +? [Tawa] [END VIDEO pag-playback]