1 00:00:00,000 --> 00:00:10,970 >> [Nagpe-play ng musika] 2 00:00:10,970 --> 00:00:12,536 >> David J. MALAN: Lahat ng karapatan. 3 00:00:12,536 --> 00:00:13,392 >> [Tawa] 4 00:00:13,392 --> 00:00:14,240 >> Maligayang pagbabalik. 5 00:00:14,240 --> 00:00:14,990 Ito ay CS50. 6 00:00:14,990 --> 00:00:16,890 At ito ang katapusan ng linggo limang. 7 00:00:16,890 --> 00:00:20,020 At hanggang ngayon, na namin medyo marami Na-pagkuha para sa ipinagkaloob na doon 8 00:00:20,020 --> 00:00:23,480 Umiiral na ito tagatala, kalatungin, na ikaw Na-invoking sa pamamagitan ng paraan ng ito 9 00:00:23,480 --> 00:00:27,100 iba pang mga tool na tinatawag na Magsagawa sa paanuman magically Kino-convert ng iyong source code 10 00:00:27,100 --> 00:00:31,350 sa bagay na code, ang mga zero at mga bago na ang iyong computer CPU, central 11 00:00:31,350 --> 00:00:33,410 processing unit, talagang naiintindihan. 12 00:00:33,410 --> 00:00:36,770 Ngunit ito lumiliko out mayroong isang numero na pagpunta sa ilalim ng hood sa 13 00:00:36,770 --> 00:00:38,690 sa pagitan ng input at output. 14 00:00:38,690 --> 00:00:41,800 >> At nais kong imungkahi na namin laman na out sa isang kaunti pa sa detalye 15 00:00:41,800 --> 00:00:45,130 apat na mga hakbang na ito, may isang bagay na tinatawag na pre-processing, isang bagay 16 00:00:45,130 --> 00:00:48,300 tinatawag na kino-compile, na nakita natin, isang bagay na tinatawag na assembling, at 17 00:00:48,300 --> 00:00:49,420 isang bagay na tinatawag na pag-uugnay. 18 00:00:49,420 --> 00:00:53,270 Kaya hanggang ngayon, sa ilan sa aming mga mga programa, mayroon kaming kasamang matalim. 19 00:00:53,270 --> 00:00:56,650 Higit pang mga kamakailan-lamang na namin ay may ilang matulis Tinutukoy para sa constants. 20 00:00:56,650 --> 00:01:00,660 Kaya ito lumiliko out na ang mga bagay na ay may prefix na ang hash simbolo o 21 00:01:00,660 --> 00:01:04,150 ang pound simbolo ay mga pre-processor direktiba. 22 00:01:04,150 --> 00:01:07,960 Iyon lang ang isang magarbong paraan ng sinasabi ng mga ito isang linya ng code na talaga 23 00:01:07,960 --> 00:01:12,280 convert sa ibang bagay bago ang computer kahit subukang i-convert ang iyong 24 00:01:12,280 --> 00:01:13,800 programa sa mga zero at mga bago. 25 00:01:13,800 --> 00:01:19,000 >> Halimbawa, matulis kasamang standard I / O. H, medyo magkano lamang ay nangangahulugan pumunta 26 00:01:19,000 --> 00:01:24,010 nauuna, grab ang mga nilalaman ng mga file stdio.h at ilagay ang mga ito doon. 27 00:01:24,010 --> 00:01:25,880 Kaya walang mga zero at mga bago sa puntong iyon pa. 28 00:01:25,880 --> 00:01:27,470 Ito ay talagang lamang ng isang pagpapalit. 29 00:01:27,470 --> 00:01:30,790 At na tapos na sa panahon ng tinatawag na pre-processing entablado, kapag nag- 30 00:01:30,790 --> 00:01:34,230 talaga tumakbo kalatungin o partikular na Magsagawa sa karamihan ng mga kaso. 31 00:01:34,230 --> 00:01:36,950 Kaya ang lahat ng ito ay na nangyayari unang awtomatikong kaya sa ngayon. 32 00:01:36,950 --> 00:01:38,800 >> Pagkatapos ay dumating ang compilation hakbang. 33 00:01:38,800 --> 00:01:40,920 Ngunit kami oversimplified compilation. 34 00:01:40,920 --> 00:01:45,060 Kino-compile ang isang programa talagang ay nangangahulugan na dalhin ito mula sa isang bagay tulad ng C, ang 35 00:01:45,060 --> 00:01:48,430 source code na aming pagsusulat, pababa sa isang bagay na tinatawag na assembly. 36 00:01:48,430 --> 00:01:52,900 Assembly wika ay isang mas mababang antas wika na, thankfully, hindi namin kalooban 37 00:01:52,900 --> 00:01:55,480 magkano ang pagkakataon upang isulat ito semestre. 38 00:01:55,480 --> 00:01:59,100 Ngunit ito ay sa pinakamababang antas sa pakiramdam mo na literal magsimula pagsulat 39 00:01:59,100 --> 00:02:04,270 idagdag at ibawas at multiply at i-load mula sa memorya at i-save sa memorya, ang 40 00:02:04,270 --> 00:02:08,259 napaka mga pangunahing tagubilin na ang isang computer, sa ilalim ng hood, 41 00:02:08,259 --> 00:02:09,639 talaga naiintindihan. 42 00:02:09,639 --> 00:02:14,930 >> Panghuli, assembling tumatagal na wika sa mga zero at mga bago na kami nakapunta 43 00:02:14,930 --> 00:02:16,190 naglalarawan kaya sa ngayon. 44 00:02:16,190 --> 00:02:19,270 At tunay na bilang wakas, mayroon ng tinatawag na pag-uugnay phase, na kung saan bibigyan namin ng 45 00:02:19,270 --> 00:02:22,360 makita sa sandali lamang, na pinagsasama ang iyong mga zero at ang mga may mga zero at 46 00:02:22,360 --> 00:02:24,870 mga iba pang mga tao bago na nilikha mo. 47 00:02:24,870 --> 00:02:26,660 >> Kaya isaalang-alang ito sobrang simple na programa. 48 00:02:26,660 --> 00:02:27,560 Ito ay mula sa Linggo 1. 49 00:02:27,560 --> 00:02:29,610 Ito lang ang sinabi, Hello World, sa screen. 50 00:02:29,610 --> 00:02:30,920 Kami bumangga ito sa pamamagitan ng kalatungin. 51 00:02:30,920 --> 00:02:33,200 O kaya namin tumakbo ito sa pamamagitan ng Gawing na kung saan tumatakbo kalatungin. 52 00:02:33,200 --> 00:02:36,170 At outputted sa panahon kung saan ilang mga zero at mga bago. 53 00:02:36,170 --> 00:02:38,100 Ngunit ito lumiliko out mayroong isang intermediate na hakbang. 54 00:02:38,100 --> 00:02:40,460 Kung pumunta ako sa paglipas dito - oops, hindi nais na makita sa kanya pa. 55 00:02:40,460 --> 00:02:44,800 Kung pumunta ako sa paglipas dito sa aking appliance at buksan up ako hello.c, dito 56 00:02:44,800 --> 00:02:46,160 ay ang parehong programa. 57 00:02:46,160 --> 00:02:48,600 At kung ano ako ng pagpunta sa gawin sa aking mga terminal window dito ay pupuntahan ko 58 00:02:48,600 --> 00:02:51,430 tumakbo kalatungin sa halip na Magsagawa, na automates ang lahat ng apat 59 00:02:51,430 --> 00:02:52,870 mga hakbang na ito para sa amin. 60 00:02:52,870 --> 00:02:58,620 At ako pagpunta sa gawin kalatungin-S at pagkatapos hello.c at pagkatapos ay ipasok. 61 00:02:58,620 --> 00:03:00,590 >> At nakakuha ako ng nagbi-blink na prompt muli, na ay mabuti. 62 00:03:00,590 --> 00:03:05,280 At ngayon sa isang bahagyang mas malaking window, Pupunta ako upang buksan ang gedit in dito. 63 00:03:05,280 --> 00:03:09,610 At ako pagpunta upang buksan ang isang file na, lumiliko out, ay tinatawag na hello.s ito 64 00:03:09,610 --> 00:03:11,870 Naglalaman ang assembly na wika Ako refer sa mas maaga. 65 00:03:11,870 --> 00:03:15,060 At ito ay kung ano ang tinatawag na assembly wika, medyo mababa ang antas 66 00:03:15,060 --> 00:03:18,470 mga tagubilin na ang iyong Intel CPU o kahit anong ito ay na ang nasa loob ng 67 00:03:18,470 --> 00:03:19,350 naiintindihan. 68 00:03:19,350 --> 00:03:24,480 At mov ay para sa paglipat. tawag ay para sa pagtawag, isang napakababang antas ng pag-andar. 69 00:03:24,480 --> 00:03:26,380 sub ay para ibawas. 70 00:03:26,380 --> 00:03:30,370 >> Kaya kapag mayroon kang isang partikular na CPU sa loob ng iyong computer, kung bakit ito 71 00:03:30,370 --> 00:03:34,300 naiiba, kumpara sa ibang mga CPUs sa merkado, na kung saan ay tagubilin ito 72 00:03:34,300 --> 00:03:39,460 Nauunawaan at madalas kung paano mahusay na ito ay, kung gaano kabilis ito ay sa pagpapatupad sa ilang 73 00:03:39,460 --> 00:03:40,380 ng mga tagubilin. 74 00:03:40,380 --> 00:03:45,150 Ngayon para sa higit sa na ito, maaari mong gawin susunod Taglagas CS61 sa kolehiyo. 75 00:03:45,150 --> 00:03:48,170 Ngunit dito mayroon kami, halimbawa, ang ilang mga mga pantukoy na maaaring magmukhang pamilyar. 76 00:03:48,170 --> 00:03:50,150 hello.c ay ang pangalan ng program. 77 00:03:50,150 --> 00:03:51,070 >> . Teksto - 78 00:03:51,070 --> 00:03:54,190 mayroong hindi magkano ng interes doon ngayon lang, isipin ang na ang teksto 79 00:03:54,190 --> 00:03:59,190 segment, pati na ng Monday, kung saan ay sa memorya ng iyong aktwal na programa ay nagtatapos up. 80 00:03:59,190 --> 00:04:01,330 Kaya na hindi bababa sa vaguely pamilyar doon. 81 00:04:01,330 --> 00:04:03,730 Dito, siyempre, ay isang pagbanggit sa aming mga pangunahing pag-andar. 82 00:04:03,730 --> 00:04:07,220 Scroll down, ang mga mag-refer sa mga bagay tinatawag na nagrerehistro, napakaliit na chunks ng 83 00:04:07,220 --> 00:04:09,190 memory sa loob ng iyong aktwal na CPU. 84 00:04:09,190 --> 00:04:12,930 At kung mag-scroll down na ako kahit na pa, nakikita ko ang ilang mga pag-uuri 85 00:04:12,930 --> 00:04:14,240 hindi direktang mga pagbanggit ng ASCII. 86 00:04:14,240 --> 00:04:17,120 At doon, sa katunayan, ay ang string na, kumusta, kuwit, mundo. 87 00:04:17,120 --> 00:04:20,079 >> Kaya mahaba kuwento maikli, ito ay naging nangyayari para sa iyo, awtomatiko, 88 00:04:20,079 --> 00:04:22,140 sa ilalim ng hood sa lahat ng oras na ito. 89 00:04:22,140 --> 00:04:26,450 At kung ano ang nai-nangyayari talaga ay sabay-sabay mo na tumakbo kalatungin, o sa pamamagitan ng paraan ng 90 00:04:26,450 --> 00:04:29,150 Gawing, nakakakuha ka ng una, mula sa source code, ang 91 00:04:29,150 --> 00:04:30,700 tinatawag nang gayon assembly wika. 92 00:04:30,700 --> 00:04:35,210 Pagkatapos kalatungin ay nagko-convert ang assembly wika pababa sa zero at bago. 93 00:04:35,210 --> 00:04:38,340 At ito ay ang slide na nagsimula kaming ang aming mga talakayan sa Linggo sa 0 - 94 00:04:38,340 --> 00:04:39,840 at pagkatapos ay Linggo 1 on. 95 00:04:39,840 --> 00:04:44,030 At pagkatapos ay sa wakas, mga zero at mga bago ay na kasama ng mga zero at mga bago 96 00:04:44,030 --> 00:04:47,190 mula sa mga aklatan na aming pagkuha para nabigyan tulad ng Standard I / O o ang 97 00:04:47,190 --> 00:04:50,010 String Library o kahit ang CS50 library. 98 00:04:50,010 --> 00:04:54,200 >> Kaya upang ipinta ang larawang ito nang higit pa biswal, mayroon kaming hello.c. 99 00:04:54,200 --> 00:04:57,220 At, siyempre, ay gumagamit ng printf gumana na sabihing, kumusta mundo. 100 00:04:57,220 --> 00:05:01,810 Ang compilation hakbang na tumatagal ito pababa sa na file pa lang namin nakita hello.s, kahit 101 00:05:01,810 --> 00:05:04,290 kahit na karaniwang tinanggal Awtomatikong para sa iyo. 102 00:05:04,290 --> 00:05:06,050 Ngunit iyon ang assembly code sa gitna na hakbang. 103 00:05:06,050 --> 00:05:09,750 At pagkatapos ay kapag magtipon namin ang assembly wika, kaya na magsalita, na kapag nag- 104 00:05:09,750 --> 00:05:10,830 makakuha ng mga zero at mga bago. 105 00:05:10,830 --> 00:05:13,920 Kaya namin ang naka-zoom in nang epektibo sa ngayon kung ano ang aming na-pagkuha para sa ipinagkaloob, 106 00:05:13,920 --> 00:05:16,430 ay nangangahulugan ng pagpunta source code sa bagay na code. 107 00:05:16,430 --> 00:05:18,850 >> Ngunit bilang wakas, ngayon na ang parehong larawan - sabihin isalya ito sa paglipas ng 108 00:05:18,850 --> 00:05:20,020 sa kaliwang bahagi. 109 00:05:20,020 --> 00:05:22,880 At tandaan na sa tuktok na mayroong Nabanggit ko stdio.h. 110 00:05:22,880 --> 00:05:25,030 Iyan ay isang file na nagsama kami ng mga sa halos lahat ng 111 00:05:25,030 --> 00:05:26,250 mga programa na aming isinulat. 112 00:05:26,250 --> 00:05:28,830 At iyon ang file na kung saan ang mga nilalaman makapag-copy paste, 113 00:05:28,830 --> 00:05:30,350 mabisa nasa ibabaw ng iyong code. 114 00:05:30,350 --> 00:05:34,170 Ngunit ito lumiliko out na, sa isang computer sistema sa isang lugar, mayroong isang baka 115 00:05:34,170 --> 00:05:39,150 stdio.c file na may isang taong nagsulat taon nakalipas na ipinapatupad ng lahat ng mga 116 00:05:39,150 --> 00:05:41,870 mga function na ay ipinahayag sa stdio.h. 117 00:05:41,870 --> 00:05:45,465 >> Ngayon sa katotohanan ito ay marahil hindi sa sa iyong Mac o PC iyong o kahit na sa 118 00:05:45,465 --> 00:05:47,660 CS50 appliance ay isang raw C code. 119 00:05:47,660 --> 00:05:52,710 May isang tao na pinagsama-sama ito at isinama . O file para sa object code o. Isang 120 00:05:52,710 --> 00:05:56,020 file, na tumutukoy sa isang ibinahaging library na na-pre-install na at 121 00:05:56,020 --> 00:05:57,240 pre-sama para sa iyo. 122 00:05:57,240 --> 00:06:01,950 Ngunit ipagpalagay na mayroon talagang umiiral sa aming mga computer na stdio.c kahanay 123 00:06:01,950 --> 00:06:02,650 may kalatungin. 124 00:06:02,650 --> 00:06:04,960 Ang iyong code ay ina-sama at binuo. 125 00:06:04,960 --> 00:06:09,200 stdio.c ni code ay pinagsama-sama at binuo, kaya na ito napaka-huling 126 00:06:09,200 --> 00:06:13,730 hakbang, pababa dito, mayroon kaming upang kahit papaano link, sa gayon na magsalita, ang iyong mga zero at mga bago 127 00:06:13,730 --> 00:06:18,430 kasama ang kanyang mga zero at mga bago sa isa simpleng programa na sa huli ay 128 00:06:18,430 --> 00:06:20,540 tinatawag lang Hello. 129 00:06:20,540 --> 00:06:23,340 >> Kaya na ang lahat ng mga magic na na-kaya nangyayari ngayon. 130 00:06:23,340 --> 00:06:26,430 At patuloy na gawin ang mga mga proseso para sa ipinagkaloob, ngunit mapagtanto 131 00:06:26,430 --> 00:06:28,750 mayroong isang pulutong ng mga detalye ng makatas pagpunta sa ilalim doon. 132 00:06:28,750 --> 00:06:31,920 At ito ay kung bakit ang iyong computer na may Intel loob 133 00:06:31,920 --> 00:06:33,940 lalo na naiiba. 134 00:06:33,940 --> 00:06:37,020 >> Kaya sa na tandaan, kung nais mong sumali sa amin para sa tanghalian ito Biyernes, gawin pumunta 135 00:06:37,020 --> 00:06:41,570 sa karaniwan cs50.net/rsvp lugar, 1:15 ito Biyernes. 136 00:06:41,570 --> 00:06:43,400 At ngayon ng ilang mga anunsyo. 137 00:06:43,400 --> 00:06:44,670 Kaya mayroon kaming ilang mga mabuting balita. 138 00:06:44,670 --> 00:06:45,970 At kami ay may ilang mga masamang balita. 139 00:06:45,970 --> 00:06:47,260 Magsimula sa ilang mga magandang balita dito. 140 00:06:47,260 --> 00:06:52,038 141 00:06:52,038 --> 00:06:54,510 >> [GROANING] 142 00:06:54,510 --> 00:06:54,710 >> Ayos lang. 143 00:06:54,710 --> 00:06:56,670 Well, ito ay technically isang holiday, kaya ito ay hindi kaya magkano ang isang regalo mula sa amin. 144 00:06:56,670 --> 00:06:58,030 Ngunit pagkatapos ay ang masamang balita ng kurso. 145 00:06:58,030 --> 00:07:00,550 146 00:07:00,550 --> 00:07:01,880 >> [GROANING] 147 00:07:01,880 --> 00:07:03,530 >> Ako na ginugol ng maraming oras sa mga animation. 148 00:07:03,530 --> 00:07:04,690 >> [Tawa] 149 00:07:04,690 --> 00:07:07,000 >> Magkakaroon ng isang review session ito darating na Lunes. 150 00:07:07,000 --> 00:07:08,340 Ito ay pagpunta sa maging sa 05:30. 151 00:07:08,340 --> 00:07:11,210 Susubukan naming ipaalala sa iyo ng lahat ng mga detalye sa pamamagitan ng email sa kurso ng 152 00:07:11,210 --> 00:07:13,470 website sa loob lamang ng ilang mga araw ng panahon. 153 00:07:13,470 --> 00:07:16,610 Ito ay kumuha at ginawang magagamit makalipas ang ilang sandali. 154 00:07:16,610 --> 00:07:19,200 Kaya't kung hindi ka maaaring gumawa na Lunes night slot, huwag mag-alala. 155 00:07:19,200 --> 00:07:22,270 Seksyon na ito darating na linggo kalooban din tumutok sa pagsusuri para sa mga pagsusulit. 156 00:07:22,270 --> 00:07:25,670 Kung ang iyong mga seksyon ay sa Monday, na kung saan ay sa katunayan unibersidad holiday, kami ay 157 00:07:25,670 --> 00:07:26,920 pa rin matugunan sa seksyon. 158 00:07:26,920 --> 00:07:28,890 Kung ikaw lamang ay hindi maaaring gawin na dahil ang seksyon ka ng pagpunta 159 00:07:28,890 --> 00:07:29,860 layo, na fine. 160 00:07:29,860 --> 00:07:33,710 Dumalo sa isang Linggo o Martes seksyon o tune-in sa Jason ng seksyon, na kung saan ay 161 00:07:33,710 --> 00:07:35,110 magagamit online. 162 00:07:35,110 --> 00:07:37,490 >> Kaya, mas masamang balita. 163 00:07:37,490 --> 00:07:41,960 Kaya ayon sa syllabus, mayroon kaming magbigay ng panayam sa tabi Biyernes. 164 00:07:41,960 --> 00:07:43,690 Ngunit ang mabuting balita - 165 00:07:43,690 --> 00:07:44,860 malinaw, ako na ginugol ng masyadong maraming oras sa ito. 166 00:07:44,860 --> 00:07:45,280 >> [Tawa] 167 00:07:45,280 --> 00:07:47,140 >> Susubukan naming kanselahin ang susunod na Biyernes ng aralin. 168 00:07:47,140 --> 00:07:50,590 Kaya iyon ay magiging isang regalo para sa amin, kaya mo Maaari ba talagang magkaroon ng magandang pahinga sa 169 00:07:50,590 --> 00:07:52,990 sa pagitan ng mga ito linggo at dalawang linggo mula rito. 170 00:07:52,990 --> 00:07:57,460 Kaya walang mga aralin sa susunod na linggo, lamang ng isang maliit na maliit maliit na pagsusulit, na kung saan ang dapat mong maging 171 00:07:57,460 --> 00:07:59,030 nagsisimula nagiging nasasabik. 172 00:07:59,030 --> 00:08:03,870 >> Kaya natin ngayon i aming pansin sa isang bagay na talagang mas visual 173 00:08:03,870 --> 00:08:06,990 at mas kapana-panabik at i-set ang entablado para sa kung ano ang nangyayari sa nasa abot-tanaw 174 00:08:06,990 --> 00:08:08,420 sa loob lamang ng ilang linggo oras. 175 00:08:08,420 --> 00:08:12,160 Pagkatapos ng unang pagsusulit, aming i-on ang pokus ng aming mga hanay ng problema sa isa pang 176 00:08:12,160 --> 00:08:16,710 domain partikular na problema, na ng forensics seguridad o higit pa sa pangkalahatan. 177 00:08:16,710 --> 00:08:19,550 >> Sa katunayan, ang tradisyon na may ganitong problema hanay ay para sa akin ang isa sa mga 178 00:08:19,550 --> 00:08:24,850 pagtuturo sa kapwa o Cas upang maglakad sa kabuuan campus pagkuha ng litrato ng 179 00:08:24,850 --> 00:08:29,450 makikilalang ngunit hindi halata mga tao, mga lugar, o mga bagay, at pagkatapos ay sa bawat taon ko 180 00:08:29,450 --> 00:08:34,520 sa paanuman pamahalaan upang sinasadyang tanggalin o sirain ang digital media card 181 00:08:34,520 --> 00:08:35,720 na ang nasa loob ng aming camera. 182 00:08:35,720 --> 00:08:36,860 Subalit hindi sang-ayon. 183 00:08:36,860 --> 00:08:39,200 Maaari ko sige at plug na sa aking computer. 184 00:08:39,200 --> 00:08:43,010 Maaari ba akong gumawa ng isang forensic imahe ng ito, kaya upang makipag-usap, sa pamamagitan ng pagkopya ng mga zero at 185 00:08:43,010 --> 00:08:46,830 mga bago off ng na memory card, kung nito ang isang SD card o compact flash card o 186 00:08:46,830 --> 00:08:48,100 kahit anong pamilyar ka sa. 187 00:08:48,100 --> 00:08:49,300 At pagkatapos ay maaari naming ipasa ang out. 188 00:08:49,300 --> 00:08:53,190 >> At kaya ang hamon maaga, bukod sa iba pang mga bagay na para sa iyo, ay magiging upang isulat 189 00:08:53,190 --> 00:08:58,630 C code na recovers ang maramihang mga Mga JPEG para sa akin at ipinahayag ay magiging 190 00:08:58,630 --> 00:09:00,190 mga tao, mga lugar, o mga bagay. 191 00:09:00,190 --> 00:09:03,340 At gagamitin din namin makipag-usap, sa problemang ito set at sa mga araw na dumating, tungkol sa 192 00:09:03,340 --> 00:09:04,440 graphics sa mas pangkalahatang. 193 00:09:04,440 --> 00:09:06,140 Ginamit namin ang mga ito, isang kurso, para masira out. 194 00:09:06,140 --> 00:09:09,080 Ngunit mo na ang uri ng kinuha para sa ipinagkaloob may mga umiiral na mataas na antas notions 195 00:09:09,080 --> 00:09:10,680 ng mga parihaba at ovals. 196 00:09:10,680 --> 00:09:12,450 Ngunit sa ilalim ng hood may mga pixels. 197 00:09:12,450 --> 00:09:14,370 At nagkaroon ka ng upang simulan ang nag-iisip tungkol sa mga. 198 00:09:14,370 --> 00:09:18,800 O kaya ay sa iyo para sa p-set 4 na kailangang isipin tungkol sa puwang sa pagitan ng iyong mga bricks, kung paano 199 00:09:18,800 --> 00:09:21,990 mabilis ka bola ay gumagalaw sa kabuuan ang screen para masira out. 200 00:09:21,990 --> 00:09:24,830 Kaya doon ay ang pagkaunawa ng mga tuldok sa iyong screen na 201 00:09:24,830 --> 00:09:26,290 dumating sa pag-play na. 202 00:09:26,290 --> 00:09:29,430 >> Ngayon kung ano ang nakikita mo, bagaman, ay kung ano ang kumuha ka sa isang computer screen. 203 00:09:29,430 --> 00:09:33,680 Kung kailanman na iyong napanood ilang mabuti o masamang TV, bentahe ang mga ito ay medyo magkano 204 00:09:33,680 --> 00:09:36,280 tratuhin ang mga madla tulad ng technophobes na gawin hindi talaga 205 00:09:36,280 --> 00:09:37,630 alam magkano ang tungkol sa computing. 206 00:09:37,630 --> 00:09:40,840 At kaya napakadali para sa mga pulis tiktik upang sabihin, maaari mong 207 00:09:40,840 --> 00:09:41,710 linisin up na para sa akin? 208 00:09:41,710 --> 00:09:42,710 O nagpapahusay, tama? 209 00:09:42,710 --> 00:09:45,550 Pagandahin ay tulad ng buzz salita sa karamihan ng anumang krimen kaugnay show. 210 00:09:45,550 --> 00:09:49,240 At ang katotohanang ay kung mong gawin ang isang napaka malabo ang litrato ng isang pinaghihinalaan paggawa 211 00:09:49,240 --> 00:09:51,620 isang bagay na masama, hindi mo makakaya lamang mapahusay ito. 212 00:09:51,620 --> 00:09:53,080 Hindi ka maaaring mag-zoom in walang hanggan. 213 00:09:53,080 --> 00:09:56,350 Hindi mo maaaring makita sa sinag ng isang tao mata na nakatuon na 214 00:09:56,350 --> 00:09:59,860 partikular na krimen, sa kabila ng pagkalat ng mga ito sa TV. 215 00:09:59,860 --> 00:10:04,110 >> At kaya may na sabihin na mag-udyok paparating na mga problema itakda sa isang sulyap sa 216 00:10:04,110 --> 00:10:05,765 ilang palabas na kung saan mo ay maaaring maging pamilyar. 217 00:10:05,765 --> 00:10:06,500 >> [Video playback] 218 00:10:06,500 --> 00:10:07,835 >> -OK. 219 00:10:07,835 --> 00:10:09,956 Ngayon, sabihin makakuha ng magandang pagtingin sa iyo. 220 00:10:09,956 --> 00:10:17,060 221 00:10:17,060 --> 00:10:17,766 >> -Hold ito. 222 00:10:17,766 --> 00:10:18,658 Patakbuhin na bumalik. 223 00:10:18,658 --> 00:10:19,550 >> -Maghintay ng isang minuto. 224 00:10:19,550 --> 00:10:21,580 Pumunta kanan. 225 00:10:21,580 --> 00:10:21,800 >> -Walang. 226 00:10:21,800 --> 00:10:22,690 I-freeze na. 227 00:10:22,690 --> 00:10:23,692 >> Full-screen. 228 00:10:23,692 --> 00:10:23,846 >> -OK. 229 00:10:23,846 --> 00:10:24,154 I-freeze na. 230 00:10:24,154 --> 00:10:25,140 >> -Higpitan ang sa na, ay Ya? 231 00:10:25,140 --> 00:10:27,090 >> Vector-in sa na tao sa pamamagitan ng likod na gulong. 232 00:10:27,090 --> 00:10:29,730 >> -Mag-zoom in dito mismo sa lugar na ito. 233 00:10:29,730 --> 00:10:33,700 >> -Gamit ang karapatan kagamitan, ang nakunan maaaring pinalaki at sharpened. 234 00:10:33,700 --> 00:10:34,490 >> -Ano iyon? 235 00:10:34,490 --> 00:10:35,870 >> -Ito ay isang pagpapahusay programa. 236 00:10:35,870 --> 00:10:36,793 >> -Maaari mong i-clear up na anumang? 237 00:10:36,793 --> 00:10:38,560 >> -Hindi ko alam. 238 00:10:38,560 --> 00:10:39,090 Sabihin mapahusay ito. 239 00:10:39,090 --> 00:10:41,690 >> Pagandahin-seksyon A-6. 240 00:10:41,690 --> 00:10:43,510 >> I-pinaghusay ang detalye at - 241 00:10:43,510 --> 00:10:44,456 >> -Sa tingin ko mayroong sapat upang mapahusay. 242 00:10:44,456 --> 00:10:45,402 Palabasin ito sa aking screen. 243 00:10:45,402 --> 00:10:47,300 >> -Pagandahin ang pagmuni-muni sa kanyang mga mata. 244 00:10:47,300 --> 00:10:49,330 >> -Natin patakbuhin ito sa pamamagitan ng video pagpapahusay. 245 00:10:49,330 --> 00:10:50,340 >> -Edgar, maaari mong pagandahin ito? 246 00:10:50,340 --> 00:10:52,320 >> Mag-hang-on. 247 00:10:52,320 --> 00:10:54,290 >> -I've pinagsusumikapan ito pagmuni-muni. 248 00:10:54,290 --> 00:10:55,560 >> May-aninag ni. 249 00:10:55,560 --> 00:10:56,440 >> -Reflection. 250 00:10:56,440 --> 00:10:57,940 >> -Mayroon isang panganganinag ng mukha ng tao. 251 00:10:57,940 --> 00:10:58,860 >> -Ang pagmuni-muni. 252 00:10:58,860 --> 00:10:59,710 >> -Mayroon isang panganganinag. 253 00:10:59,710 --> 00:11:00,900 >> Mag-zoom-in sa mirror. 254 00:11:00,900 --> 00:11:03,500 >> -Mo maaaring makita ang isang pagmuni-muni. 255 00:11:03,500 --> 00:11:04,700 >> -Maaari mong mapahusay ang mga imahe mula dito? 256 00:11:04,700 --> 00:11:05,700 >> -Maaari mo mapapahusay kanya dito mismo? 257 00:11:05,700 --> 00:11:06,500 >> -Maaari mo mapapahusay ito? 258 00:11:06,500 --> 00:11:07,380 >> -Maaari mo mapapahusay ito? 259 00:11:07,380 --> 00:11:08,190 >> -Maaari ba kaming mapahusay ito? 260 00:11:08,190 --> 00:11:08,940 >> -Maaari mo mapapahusay ito? 261 00:11:08,940 --> 00:11:10,280 >> -Hold sa isang segundo, makikita ko mapapabuti. 262 00:11:10,280 --> 00:11:11,570 >> Mag-zoom-in sa pinto. 263 00:11:11,570 --> 00:11:12,180 >> -X10. 264 00:11:12,180 --> 00:11:13,052 >> -Zoom. 265 00:11:13,052 --> 00:11:13,197 >> [Tawa] 266 00:11:13,197 --> 00:11:14,360 >> Ilipat-in 267 00:11:14,360 --> 00:11:15,100 >> -Maghintay, itigil. 268 00:11:15,100 --> 00:11:15,740 >> -Itigil. 269 00:11:15,740 --> 00:11:16,290 >> -I-pause ito. 270 00:11:16,290 --> 00:11:19,390 >> -Rotate ng 75 degrees sa paligid ang vertical mangyaring. 271 00:11:19,390 --> 00:11:19,886 >> [Tawa] 272 00:11:19,886 --> 00:11:24,350 >> -Itigil, at pabalik sa bahagi tungkol sa mga pinto muli. 273 00:11:24,350 --> 00:11:26,330 >> -Mayroon ka bang isang imahe Enhancer na maaari bitmap? 274 00:11:26,330 --> 00:11:28,990 >> -Siguro maaari naming gamitin ang Pradeep Sen paraan upang makita sa bintana. 275 00:11:28,990 --> 00:11:30,680 >> -Ito ang software ay estado ng sining. 276 00:11:30,680 --> 00:11:31,676 >> -Ang mga icon na halaga ay off. 277 00:11:31,676 --> 00:11:34,166 >> -Gamit ang tamang kumbinasyon ng mga algorithm. 278 00:11:34,166 --> 00:11:38,399 >> -Siya'y kinuha algorithm sa pag-iilaw sa susunod na antas at ako ay maaaring gamitin ang mga ito upang 279 00:11:38,399 --> 00:11:38,648 pagandahin ito kunan ng larawan. 280 00:11:38,648 --> 00:11:42,050 >> I-lock-on at palakihin ang z-axis. 281 00:11:42,050 --> 00:11:42,760 >> -Pagandahin. 282 00:11:42,760 --> 00:11:43,060 >> -Pagandahin. 283 00:11:43,060 --> 00:11:43,760 >> -Pagandahin. 284 00:11:43,760 --> 00:11:45,010 >> -I-freeze at pagbutihin. 285 00:11:45,010 --> 00:11:47,470 286 00:11:47,470 --> 00:11:47,910 >> [END-playback ng video] 287 00:11:47,910 --> 00:11:51,470 >> David J. MALAN: So Problema Set 5 ay kung ano ang namamalagi maaga doon. 288 00:11:51,470 --> 00:11:55,260 Kaya makikita namin sa lalong madaling panahon makakuha ng isang mas mahusay na pang-unawa ng kung kailan at kung bakit maaari kang 289 00:11:55,260 --> 00:11:57,300 at ang aming hindi maaaring pahusayin sa na paraan. 290 00:11:57,300 --> 00:12:00,090 Ngunit una, sabihin bumalik sa aming pansin sa ilan sa mga bloke gusali bibigyan namin ng 291 00:12:00,090 --> 00:12:02,250 kailangan upang magagawang upang sabihin na ang kuwento. 292 00:12:02,250 --> 00:12:05,580 >> Kaya isipin ang na iginuhit namin ang larawang ito sa Lunes at Medyo noong nakaraang linggo. 293 00:12:05,580 --> 00:12:09,970 At ito ang naglalarawan ang layout ng mga bagay sa memorya ng iyong computer kapag 294 00:12:09,970 --> 00:12:11,000 tumatakbo ang ilang mga programa. 295 00:12:11,000 --> 00:12:14,310 Ang tech segment up tuktok, isipin ang, ay tumutukoy sa aktwal na mga zero at mga bago 296 00:12:14,310 --> 00:12:16,000 na gumawa ng sulat ng iyong programa. 297 00:12:16,000 --> 00:12:19,340 Mayroong, sa ibaba na, ang ilang mga nasimulan o uninitialized data, na kung saan ay karaniwang 298 00:12:19,340 --> 00:12:22,910 ay tumutukoy sa mga bagay tulad ng constants o string o global variable na mayroon 299 00:12:22,910 --> 00:12:24,200 na ipinahayag nang maaga. 300 00:12:24,200 --> 00:12:26,500 Mayroong kimpal ang, ngunit gagamitin namin dumating bumalik sa na sa isang bit. 301 00:12:26,500 --> 00:12:27,410 >> At pagkatapos ay mayroong mga stack. 302 00:12:27,410 --> 00:12:30,660 Karamihan tulad ng isang stack ng mga trays sa cafeteria, ito ay kung saan nakukuha ng memory 303 00:12:30,660 --> 00:12:33,610 layered layered at kailanman gawin mo kung ano sa isang program? 304 00:12:33,610 --> 00:12:36,380 305 00:12:36,380 --> 00:12:37,730 Ano ang stack ng paggamit para sa? 306 00:12:37,730 --> 00:12:39,320 >> Oo? 307 00:12:39,320 --> 00:12:40,000 >> Tumawag ng function. 308 00:12:40,000 --> 00:12:42,890 Anumang oras na tumawag ka ng isang function, ito ay ibinigay sa salubsob ng memory para sa kanyang 309 00:12:42,890 --> 00:12:45,020 lokal na mga variable o mga parameter nito. 310 00:12:45,020 --> 00:12:48,810 At pictorially, nakita namin na may bawat sunud-sunod na tinatawag na pag-andar, kapag A 311 00:12:48,810 --> 00:12:52,520 tawag B C tawag tawag D, sila makapag-layered papunta sa stack. 312 00:12:52,520 --> 00:12:55,630 At sa loob ng bawat isa sa mga hiwa ng memory ay mahalagang isang natatanging saklaw 313 00:12:55,630 --> 00:12:58,590 para na function, na kung saan, siyempre, ay may problemang kung gusto mong ipasa 314 00:12:58,590 --> 00:13:01,850 mula sa isang function na sa isa pang Ang isang piraso ng data na gusto mo ito 315 00:13:01,850 --> 00:13:03,500 upang mutate o magbago. 316 00:13:03,500 --> 00:13:08,060 >> Kaya ano ang aming mga solusyon sa pagpapagana Ang isang function na kinakatawan ng isang stack 317 00:13:08,060 --> 00:13:11,390 frame upang baguhin ang memory sa loob ng isa pang stack na frame? 318 00:13:11,390 --> 00:13:14,590 Paano gawin ang dalawang talk sa isa't isa? 319 00:13:14,590 --> 00:13:18,510 Kaya sa pamamagitan ng paraan ng payo o mga address, kung saan, muli, lamang ilarawan kung saan sa 320 00:13:18,510 --> 00:13:22,280 memory, sa pamamagitan ng isang partikular na kagat ng numero, ang partikular na 321 00:13:22,280 --> 00:13:23,830 halaga ay matatagpuan. 322 00:13:23,830 --> 00:13:26,860 Kaya isipin ang huling beses na masyadong namin ipinagpatuloy ang kuwento at tumingin sa isang 323 00:13:26,860 --> 00:13:28,280 Medyo maraming surot programa. 324 00:13:28,280 --> 00:13:32,900 At ang programang ito ay maraming surot para sa ilang kadahilanan, ngunit ang pinaka-nakakaligalig isa ay 325 00:13:32,900 --> 00:13:34,620 dahil nabigo upang suriin kung ano? 326 00:13:34,620 --> 00:13:39,111 327 00:13:39,111 --> 00:13:40,450 >> Oo, ito nabigo upang suriin ang input. 328 00:13:40,450 --> 00:13:41,870 Paumanhin? 329 00:13:41,870 --> 00:13:43,880 >> Kung ito ay higit sa 12 mga character. 330 00:13:43,880 --> 00:13:47,260 Kaya napaka-makisig, kapag tumatawag memcopy, na kung saan, bilang ang pangalan nagmumungkahi, lamang 331 00:13:47,260 --> 00:13:50,630 mga kopya mula sa memorya nito pangalawang argumento sa kanyang unang argumento. 332 00:13:50,630 --> 00:13:54,730 Ang ikatlong argumento, napaka-makisig, ay naka-check upang tiyakin na hindi mo gusto 333 00:13:54,730 --> 00:13:59,400 kopyahin higit sa, sa kasong ito, ang haba ng bar, bilang ng mga character, 334 00:13:59,400 --> 00:14:03,810 papunta sa patutunguhan, na ito array C. Ngunit ang problema ay ang kung ano ang 335 00:14:03,810 --> 00:14:07,230 kung C mismo ay hindi sapat na malaki upang mahawakan iyon? 336 00:14:07,230 --> 00:14:09,900 Ikaw ay pagpunta upang kopyahin ang mga numero ng bytes na iyong binigyan. 337 00:14:09,900 --> 00:14:13,040 Ngunit ano ang iyong aktwal na magkaroon ng higit pa bytes kaysa mayroon kang kuwarto para sa? 338 00:14:13,040 --> 00:14:16,770 >> Well, ang program na ito napaka-maloko lang nang walang taros naaayos gumawa ng kahit anong ito 339 00:14:16,770 --> 00:14:20,650 binigay, kumusta backslash 0 ay mahusay na kung string ay maikli 340 00:14:20,650 --> 00:14:22,040 sapat, tulad ng limang karakter. 341 00:14:22,040 --> 00:14:26,470 Ngunit kung ito ay aktwal na 12 character o 1,200 mga character, nakita natin huling oras 342 00:14:26,470 --> 00:14:29,380 na lamang ka ng pagpunta sa ganap patungan na memory 343 00:14:29,380 --> 00:14:30,470 ay hindi nabibilang sa iyo. 344 00:14:30,470 --> 00:14:34,390 At pinakamasama kaso, kung patungan na pulang bahagi doon na namin na tinatawag na 345 00:14:34,390 --> 00:14:35,380 bumalik address - 346 00:14:35,380 --> 00:14:38,370 ito ay lamang kung saan ang computer awtomatikong, para sa iyo, sa likod ng 347 00:14:38,370 --> 00:14:43,130 eksena, tucks ang layo ng 32-bit na halaga reminds ito sa kung ano ang address dapat ito 348 00:14:43,130 --> 00:14:47,080 bumalik kapag foo, ang iba pang mga function, tapos na e-execute. 349 00:14:47,080 --> 00:14:49,320 Ito ay isang tinapay mumo ng uri na kung saan ito ay nagbabalik. 350 00:14:49,320 --> 00:14:52,490 Kung nag-o-overwrite na, potensyal, kung ikaw ang masamang tao, maaari ng dati 351 00:14:52,490 --> 00:14:54,750 potensyal na pumalit computer na ng isang tao. 352 00:14:54,750 --> 00:14:58,020 At bibigyan ka pinaka-tiyak lumagpak ito sa karamihan ng mga kaso. 353 00:14:58,020 --> 00:15:01,690 >> Ngayon ang problemang ito ay lamang exacerbated bilang namin magsimula ng pakikipag-usap tungkol sa memory 354 00:15:01,690 --> 00:15:03,010 pamamahala sa mas pangkalahatang. 355 00:15:03,010 --> 00:15:07,150 At malloc, para sa memory laang-gugulin, ay isang function na maaari naming gamitin upang magtalaga ng 356 00:15:07,150 --> 00:15:11,260 memorya kapag hindi namin alam nang maaga na maaaring kailanganin naming ilan. 357 00:15:11,260 --> 00:15:13,960 Kaya, halimbawa, kung pumunta ako pabalik sa appliance dito. 358 00:15:13,960 --> 00:15:21,010 At buksan ko up mula sa huling beses hello2.c, maalala muli ang programa dito, na kung saan ay tumingin 359 00:15:21,010 --> 00:15:23,500 isang maliit na isang bagay na tulad nito, lamang tatlong linya - 360 00:15:23,500 --> 00:15:27,940 sabihin ang iyong pangalan, pagkatapos ay i-string pangalan, sa kaliwa, ay katumbas ng getstring. 361 00:15:27,940 --> 00:15:29,690 At pagkatapos naming i-print ito, pangalan ng gumagamit. 362 00:15:29,690 --> 00:15:31,170 >> Kaya ito ay isang napaka-simpleng programa. 363 00:15:31,170 --> 00:15:34,870 Upang maging malinaw, sabihin sa akin sige at gumawa ng halo-2. 364 00:15:34,870 --> 00:15:36,680 Pupunta ako sa gagawin tuldok slash halo-2. 365 00:15:36,680 --> 00:15:37,750 Sabihin ang iyong pangalan - 366 00:15:37,750 --> 00:15:38,140 David. 367 00:15:38,140 --> 00:15:38,840 Enter. 368 00:15:38,840 --> 00:15:39,540 Kamusta David. 369 00:15:39,540 --> 00:15:41,060 Tila upang gumana ang OK. 370 00:15:41,060 --> 00:15:43,140 Ngunit kung ano talaga ang nangyayari sa sa ilalim ng hood dito? 371 00:15:43,140 --> 00:15:44,670 Una natin alisan ng balat likod ng ilang mga layer. 372 00:15:44,670 --> 00:15:48,380 String ay isang kasingkahulugan na namin maisasakatuparan para sa kung ano? 373 00:15:48,380 --> 00:15:49,110 Pansamantalang trabaho star. 374 00:15:49,110 --> 00:15:52,740 Kaya sabihin gawin itong isang kaunti pa arcane pero mas technically tama na ito 375 00:15:52,740 --> 00:15:55,570 ay isang pansamantalang trabaho bituin, na nangangahulugan na ang pangalan, oo, ay isang variable. 376 00:15:55,570 --> 00:15:59,920 Ngunit kung ano ang pangalan ng tindahan ay ang address ng isang pansamantalang trabaho, na pakiramdam ng isang maliit na kakaiba 377 00:15:59,920 --> 00:16:01,050 dahil nakakakuha ako ng likod ng isang string. 378 00:16:01,050 --> 00:16:03,580 Nakakakuha ako pabalik ng maraming char hindi isang pansamantalang trabaho. 379 00:16:03,580 --> 00:16:07,400 >> Ngunit siyempre, kailangan mo lamang ang unang pansamantalang trabaho ni address upang tandaan kung saan ang 380 00:16:07,400 --> 00:16:08,870 buong string ay dahil bakit? 381 00:16:08,870 --> 00:16:12,700 Paano kang malaman kung saan sa dulo ng string ay ang pag-alam sa umpisa? 382 00:16:12,700 --> 00:16:13,630 Ang backslash zero. 383 00:16:13,630 --> 00:16:17,260 Kaya may mga dalawang mga pahiwatig maisip mo out bago sa simula at sa katapusan ng 384 00:16:17,260 --> 00:16:20,280 string anumang ay, kaya hangga't ang mga ito ay wastong binuo na may null 385 00:16:20,280 --> 00:16:22,110 Terminator, na backslash zero. 386 00:16:22,110 --> 00:16:24,520 >> Ngunit ito ay pagtawag getstring. 387 00:16:24,520 --> 00:16:28,020 At ito lumiliko out na getstring lahat ng oras na ito ay naging uri ng 388 00:16:28,020 --> 00:16:28,820 Pandaraya para sa amin. 389 00:16:28,820 --> 00:16:32,460 Ito ay nai-paggawa nito labor, upang maging sigurado, pagkuha ng isang string mula sa user. 390 00:16:32,460 --> 00:16:34,580 Ngunit nasaan ang memory na na nagmumula? 391 00:16:34,580 --> 00:16:38,440 Kung pumunta kami pabalik sa mga larawan dito at ilapat ang kahulugan lamang mula sa isang 392 00:16:38,440 --> 00:16:42,610 ilang sandali ang nakalipas, na stack ang na kung saan ay memory napupunta kapag function ay tinatawag na, 393 00:16:42,610 --> 00:16:45,370 ayon sa logic na, kapag tumawag ka getstring, at pagkatapos ay i-type ko sa 394 00:16:45,370 --> 00:16:50,900 D-A-V-ko-D Ipasok, kung saan ay D-A-V-ko-D backslash zero na naka-imbak, batay sa 395 00:16:50,900 --> 00:16:53,480 kuwento namin ang sinabi sa amin ngayon? 396 00:16:53,480 --> 00:16:55,190 >> Gusto ito mukhang ang stack, tama? 397 00:16:55,190 --> 00:16:58,120 Kapag tumawag ka ng string kumuha ka ng isang maliit na hiwa ng memory sa stack. 398 00:16:58,120 --> 00:17:01,630 Kaya ito ay nakatayo sa dahilan na D-A-V-ko-D backslash zero ay naka-imbak 399 00:17:01,630 --> 00:17:02,770 doon sa stack. 400 00:17:02,770 --> 00:17:07,680 Ngunit maghintay ng isang minuto, babalik getstring string na, kaya na magsalita, na nangangahulugang 401 00:17:07,680 --> 00:17:11,700 ito ay tray mula sa cafeteria ay kinuha off ang stack. 402 00:17:11,700 --> 00:17:14,560 At sinabi namin huling beses na sa lalong madaling isang function na nagbabalik, at kumuha ka na 403 00:17:14,560 --> 00:17:20,109 tray, kaya na magsalita, off ang stack, kung ano maaari mong ipalagay tungkol sa ang mga labi ng 404 00:17:20,109 --> 00:17:21,819 na memory? 405 00:17:21,819 --> 00:17:25,160 Ako uri ng redrew ang mga ito bilang mga markang tanong dahil sila ay maging mabisa 406 00:17:25,160 --> 00:17:26,250 hindi alam na mga halaga. 407 00:17:26,250 --> 00:17:29,500 Maaari silang ma-reused kapag ang ilang mga susunod na function na ay tinatawag na. 408 00:17:29,500 --> 00:17:31,870 >> Sa ibang salita, kung namin mangyari na pag-iimbak - 409 00:17:31,870 --> 00:17:34,350 Kukunin ko gumuhit ng isang mabilis na larawan dito ng stack. 410 00:17:34,350 --> 00:17:38,690 Kung mangyayari namin na ma-drowing sa ibaba ng aking memory segment, at kami sabihin 411 00:17:38,690 --> 00:17:42,230 na ito ay ang lugar ng memorya inookupahan ng pangunahing at siguro ARG c at 412 00:17:42,230 --> 00:17:46,790 ARG v at anumang bagay sa programa, kapag getstring ay tinatawag na, 413 00:17:46,790 --> 00:17:51,120 siguro ay nakakakuha getstring isang tipak ng memory dito. 414 00:17:51,120 --> 00:17:53,940 At pagkatapos ay i-D-A-V-ko-D sa paanuman ay nagtatapos up sa function na ito. 415 00:17:53,940 --> 00:17:55,320 At ako pagpunta sa oversimplify. 416 00:17:55,320 --> 00:18:00,050 Ngunit sabihin ipinapalagay na nito D-A-V-ko-D backslash zero. 417 00:18:00,050 --> 00:18:03,500 Kaya ito maraming bytes ang ginagamit sa mga frame para sa getstring. 418 00:18:03,500 --> 00:18:08,270 >> Ngunit sa lalong madaling getstring babalik, namin Sinabi huling beses na ito sa paglipas ng memorya 419 00:18:08,270 --> 00:18:11,340 dito lahat nagiging - woops! - 420 00:18:11,340 --> 00:18:14,270 lahat ay magiging epektibo mabubura. 421 00:18:14,270 --> 00:18:17,220 At maaari naming isipin na ito ngayon bilang tanong mark dahil may alam 422 00:18:17,220 --> 00:18:18,720 kung ano ang nangyayari upang maging na ng memory. 423 00:18:18,720 --> 00:18:22,130 Sa katunayan, ako napakadalas call function bukod sa getstring. 424 00:18:22,130 --> 00:18:24,750 At sa lalong madaling tumawag ako ng ilang mga iba pang function na kaysa getstring, siguro hindi sa 425 00:18:24,750 --> 00:18:28,860 ang partikular na programa pa lang namin ay tumingin ngunit sa ilang mga iba pang, tiyak ilang iba pang mga 426 00:18:28,860 --> 00:18:34,180 function na maaaring magtapos up na ibinigay ito susunod na lugar sa stack. 427 00:18:34,180 --> 00:18:39,410 >> Kaya hindi ito maaaring maging getstring na tindahan D-A-V-ko-D sa stack dahil gagawin ko 428 00:18:39,410 --> 00:18:41,040 agad na mawawala ang access dito. 429 00:18:41,040 --> 00:18:43,720 Ngunit alam namin sila getstring nagbabalik lamang kung ano? 430 00:18:43,720 --> 00:18:47,220 Hindi ito bumabalik sa ako anim na character. 431 00:18:47,220 --> 00:18:51,090 Ano ay ito tunay na pagbabalik ay pagtibayin namin ang huling panahon? 432 00:18:51,090 --> 00:18:52,480 Ang address ng unang. 433 00:18:52,480 --> 00:18:56,650 Kaya kahit papaano, kapag tinatawag getstring, ito ay paglaan ng isang tipak ng memory para sa 434 00:18:56,650 --> 00:18:59,620 ang string na ang mga gumagamit ng uri at pagkatapos ay bumabalik na address ng ito. 435 00:18:59,620 --> 00:19:02,930 At ito lumiliko out na kapag gusto mong i- gumana upang magtalaga ng memory sa ito 436 00:19:02,930 --> 00:19:08,390 paraan at return sa taong tinatawag na function, ang address ng 437 00:19:08,390 --> 00:19:11,870 na tipak ng memory, kung talagang hindi maaaring ilagay ito sa ang stack sa 438 00:19:11,870 --> 00:19:14,750 ibaba, dahil ang pagtakbo ito lamang pagpunta sa hindi naging iyo napaka 439 00:19:14,750 --> 00:19:17,800 mabilis, sa gayon maaari mong marahil hulaan kung saan marahil kami ay pagpunta sa pag-itsa ito 440 00:19:17,800 --> 00:19:20,130 sa halip, ang tinaguriang kimpal. 441 00:19:20,130 --> 00:19:25,290 >> Kaya sa pagitan ng mga ibaba ng iyong memorya ng layout at sa tuktok ng iyong memorya ng 442 00:19:25,290 --> 00:19:26,820 layout ay ang maramihang mga segment. 443 00:19:26,820 --> 00:19:29,270 Ang isa ay ang stack, at kanang nasa itaas nito ay ang kimpal. 444 00:19:29,270 --> 00:19:33,680 At kimpal lamang ang iba't ibang mga tipak ng memorya na hindi na ginagamit para sa mga function 445 00:19:33,680 --> 00:19:34,770 kapag sila ay tinatawag na. 446 00:19:34,770 --> 00:19:38,100 Ito ay ginagamit para sa mas mahabang term na memorya, kapag gusto mo ang isa sa function na grab ang ilang mga 447 00:19:38,100 --> 00:19:42,700 memory at ma-hang sa dito nang hindi nawawalan ng kontrol sa ito. 448 00:19:42,700 --> 00:19:45,550 >> Ngayon ay maaari mong marahil agad makita na ito ay hindi 449 00:19:45,550 --> 00:19:48,060 nangangahulugang isang perpektong disenyo. 450 00:19:48,060 --> 00:19:51,350 Tulad ng iyong programa na inilaan sa memory ang stack, o bilang tawagan ka pa at 451 00:19:51,350 --> 00:19:55,540 higit pang mga pag-andar, o bilang maglaan ka memory sa kimpal may malloc off bilang 452 00:19:55,540 --> 00:20:00,690 getstring ay paggawa, ano ang malinaw Mukhang walang mintis problema? 453 00:20:00,690 --> 00:20:00,860 >> I-right. 454 00:20:00,860 --> 00:20:03,150 Tulad ng ang katunayan na ang mga arrow na ito ay tumuturo sa isa't isa 455 00:20:03,150 --> 00:20:04,380 ay hindi maghudyat na rin. 456 00:20:04,380 --> 00:20:08,630 At sa katunayan, maaari kaming masyadong mabilis lumagpak isang programa sa anumang bilang ng mga paraan. 457 00:20:08,630 --> 00:20:12,050 Sa katunayan, sa palagay ko magkaroon tayo ng tapos ito sinasadyang sabay-sabay. 458 00:20:12,050 --> 00:20:14,020 O kung hindi, sabihin gawin ito sadyang ngayon. 459 00:20:14,020 --> 00:20:21,330 Hayaan akong sige at isulat ang super mabilis isang programa na tinatawag na dontdothis.c. 460 00:20:21,330 --> 00:20:26,730 At ngayon, makikita ko pumunta sa dito at matulis huwag isama stdio.h. 461 00:20:26,730 --> 00:20:32,620 Tayo'y magpahayag ng function na tumatagal ng foo walang argumento, na kung saan ay 462 00:20:32,620 --> 00:20:34,040 naitala pati na rin sa pamamagitan ng walang bisa. 463 00:20:34,040 --> 00:20:37,830 >> At ang tanging bagay foo ay pagpunta sa gawin ay tawag foo, na marahil ay hindi ang 464 00:20:37,830 --> 00:20:39,100 smartest ideya, ngunit kaya ito. 465 00:20:39,100 --> 00:20:40,490 Ent pangunahing walang bisa. 466 00:20:40,490 --> 00:20:45,270 Ngayon ang tanging bagay pangunahing ay pagpunta gawin ay tumawag foo pati na rin. 467 00:20:45,270 --> 00:20:51,050 At para lamang sa mga kicks, pupuntahan ko pumunta maaga dito at sabihin printf "Kamusta mula sa 468 00:20:51,050 --> 00:20:52,340 foo. " 469 00:20:52,340 --> 00:20:52,890 >> OK. 470 00:20:52,890 --> 00:21:00,160 Kaya kung hindi ko gumawa ng anumang mga pagkakamali, Gawing dontdothis tuldok slash. 471 00:21:00,160 --> 00:21:01,960 At sabihin gawin ito sa isang mas malaking window - 472 00:21:01,960 --> 00:21:03,210 dot slash, dontdothis. 473 00:21:03,210 --> 00:21:07,590 474 00:21:07,590 --> 00:21:08,840 Halika sa. 475 00:21:08,840 --> 00:21:10,940 476 00:21:10,940 --> 00:21:11,890 Uh oh. 477 00:21:11,890 --> 00:21:13,100 Sa malas, maaari mong gawin ito. 478 00:21:13,100 --> 00:21:15,190 Diyablo. 479 00:21:15,190 --> 00:21:16,190 OK. 480 00:21:16,190 --> 00:21:16,580 Maghintay. 481 00:21:16,580 --> 00:21:17,370 Stand sa pamamagitan ng. 482 00:21:17,370 --> 00:21:18,270 Nagustuhan namin - 483 00:21:18,270 --> 00:21:20,110 Namin gamitin ito sa Gawing. 484 00:21:20,110 --> 00:21:22,050 >> [SIGHS] 485 00:21:22,050 --> 00:21:25,110 >> Alam ko ngunit sa palagay ko kami lamang tinanggal na. 486 00:21:25,110 --> 00:21:28,410 Uh, oo. 487 00:21:28,410 --> 00:21:30,660 Diyablo. 488 00:21:30,660 --> 00:21:32,640 Lutasin ang Rob. 489 00:21:32,640 --> 00:21:34,678 Ano? 490 00:21:34,678 --> 00:21:35,928 Ito ay napaka-simple. 491 00:21:35,928 --> 00:21:43,820 492 00:21:43,820 --> 00:21:47,360 Oo, namin naka-off ang pag-optimize. 493 00:21:47,360 --> 00:21:48,970 OK, tumayo hindi importanteng bagay. 494 00:21:48,970 --> 00:21:49,950 Ngayon pakiramdam ko mas mahusay. 495 00:21:49,950 --> 00:21:51,390 OK. 496 00:21:51,390 --> 00:21:51,780 Ayos lang. 497 00:21:51,780 --> 00:21:53,430 >> Kaya natin mag-recompile ito - 498 00:21:53,430 --> 00:21:55,880 Gawin mo dontdothis. 499 00:21:55,880 --> 00:22:00,090 Maaaring mayroon kang upang palitan ang pangalan na ito sa dothis.c sa loob lamang ng ilang sandali. 500 00:22:00,090 --> 00:22:00,710 Nagkaroon kami pumunta. 501 00:22:00,710 --> 00:22:01,240 Salamat sa inyo. 502 00:22:01,240 --> 00:22:02,050 OK. 503 00:22:02,050 --> 00:22:05,480 Kaya ang katotohanan na ako ay pag-print isang bagay out ay talagang lamang 504 00:22:05,480 --> 00:22:08,150 alalay ang proseso sa pamamagitan ng kung saan namin sana ay umabot sa puntong iyon. 505 00:22:08,150 --> 00:22:08,510 OK. 506 00:22:08,510 --> 00:22:08,870 Phew! 507 00:22:08,870 --> 00:22:11,180 >> Kaya kung ano ang talagang nangyari? 508 00:22:11,180 --> 00:22:14,440 Ang dahilan doon, tulad ng isang bukod, ay paggawa ng anumang bagay sa mga tuntunin ng pag-input at 509 00:22:14,440 --> 00:22:17,270 output ay may gawi na maging mas mabagal dahil sa iyo mayroon na magsulat character sa 510 00:22:17,270 --> 00:22:18,600 screen, Ito ay may upang mag-scroll. 511 00:22:18,600 --> 00:22:21,720 Kaya mahaba kuwento maikli, nagkaroon ako talaga nangyari kaya walang tiyaga, gusto naming magkaroon 512 00:22:21,720 --> 00:22:23,260 nakita ito ng pagtatapos ng resulta pati na rin. 513 00:22:23,260 --> 00:22:26,220 Ngayon na nakuha ko ride ng naka-print na-up, makita namin ito agad. 514 00:22:26,220 --> 00:22:28,410 Kaya bakit ito ay mangyari. 515 00:22:28,410 --> 00:22:31,300 Well, ang simpleng paliwanag, siyempre, ay na foo marahil hindi dapat 516 00:22:31,300 --> 00:22:32,500 ay pagtawag mismo. 517 00:22:32,500 --> 00:22:34,470 >> Ngayon, sa mga pangkalahatang tuntunin, ito ay recursion. 518 00:22:34,470 --> 00:22:36,970 At naisip namin ng ilang linggo nakalipas recursive ay mabuti. 519 00:22:36,970 --> 00:22:40,330 Recursion ito ay mahiwagang paraan ng pagpapahayag ng iyong sarili super succinctly. 520 00:22:40,330 --> 00:22:41,400 At ito lamang ang gumagana. 521 00:22:41,400 --> 00:22:45,060 Subalit mayroong isang pangunahing tampok ng lahat ng recursive ang mga programa na aming uusapang 522 00:22:45,060 --> 00:22:48,260 tungkol at tumingin sa kaya malayo, na ay na sila ay nagkaroon ano? 523 00:22:48,260 --> 00:22:52,610 Ang isang base ng kaso, na kung saan ay ilang mga naka-code na matapang kaso na sinabi sa ilang mga sitwasyon 524 00:22:52,610 --> 00:22:56,210 huwag tumawag foo, na kung saan ay malinaw na hindi ito ang kaso dito. 525 00:22:56,210 --> 00:22:58,920 >> Kaya kung ano ang talagang nangyayari sa mga tuntunin ng ang larawang ito? 526 00:22:58,920 --> 00:23:01,790 Well, kapag ang pangunahing tawag foo, ito ay makakakuha ng isang hiwa ng memorya. 527 00:23:01,790 --> 00:23:04,150 Kapag foo foo tawag, ito ay makakakuha ng isang hiwa ng memorya. 528 00:23:04,150 --> 00:23:06,430 Kapag foo foo tawag, ito ay makakakuha ng isang slice. 529 00:23:06,430 --> 00:23:07,080 Ito ay makakakuha ng isang slice. 530 00:23:07,080 --> 00:23:08,120 Ito ay makakakuha ng isang slice. 531 00:23:08,120 --> 00:23:09,460 Dahil foo ay hindi kailanman bumabalik. 532 00:23:09,460 --> 00:23:12,160 Hindi kailanman Kami ay binubura ang isa sa mga mga frame mula sa stack. 533 00:23:12,160 --> 00:23:15,930 Kaya kami ay pamumulaklak sa pamamagitan ng kimpal, hindi upang mailakip ang may alam kung ano pa man, at 534 00:23:15,930 --> 00:23:19,600 kami overstepping ang hanggahan ng ating tinatawag nang gayon segment ng memorya. 535 00:23:19,600 --> 00:23:21,790 Error pumunta segmentation hindi totoo. 536 00:23:21,790 --> 00:23:24,110 >> Kaya ang solusyon doon ay malinaw na huwag gawin ito. 537 00:23:24,110 --> 00:23:28,830 Ngunit ang mas malaking implikasyon ay na, oo, doon ay talagang ilang mga limitasyon, 538 00:23:28,830 --> 00:23:32,470 kahit na hindi ito mahusay na tinukoy, tulad ng sa kung paano maraming mga pag-andar maaari kang tumawag sa isang 539 00:23:32,470 --> 00:23:34,970 programa, kung gaano karaming beses isang function Maaari tawagan mismo. 540 00:23:34,970 --> 00:23:38,430 Kaya kahit na ginawa namin ipangaral recursion ito bilang potensyal na mahiwagang bagay isang 541 00:23:38,430 --> 00:23:41,870 dalawang linggo ang nakalipas para sa mga palatandaan function, at kapag makuha namin ang mga data 542 00:23:41,870 --> 00:23:45,270 kaayusan at CS50, makakakita ka ng iba pang mga mga application para dito, ito ay hindi 543 00:23:45,270 --> 00:23:46,500 kinakailangan na ang pinakamahusay na bagay. 544 00:23:46,500 --> 00:23:50,070 Dahil kung ang pag-andar ng tawag mismo, tawag mismo, kahit na mayroong isang base 545 00:23:50,070 --> 00:23:54,860 kaso, kung hindi mo pindutin na base kaso 1,000 para sa mga tawag o 10,000 na tawag, sa pamamagitan ng 546 00:23:54,860 --> 00:23:58,800 oras na iyon na maaaring maubusan ng kuwarto sa iyong tinatawag na stack at pindutin ang 547 00:23:58,800 --> 00:24:00,400 sa ilang ibang mga segment ng memorya. 548 00:24:00,400 --> 00:24:03,950 Kaya ito masyadong ay isang disenyo ng kalakalan-off sa pagitan ng kagandahan at sa pagitan ng 549 00:24:03,950 --> 00:24:06,920 katabaan ng iyong partikular na pagpapatupad. 550 00:24:06,920 --> 00:24:10,780 >> Kaya mayroong isa pang downside o isa pang gotcha sa kung ano na namin 551 00:24:10,780 --> 00:24:11,720 Na-paggawa kaya sa ngayon. 552 00:24:11,720 --> 00:24:12,980 Kapag ako tinatawag na getstring - 553 00:24:12,980 --> 00:24:15,120 hayaan mo akong bumalik sa halo-2. 554 00:24:15,120 --> 00:24:18,170 Pansinin na ako sa pagtawag getstring, na kung saan ay nagbabalik ng isang address. 555 00:24:18,170 --> 00:24:20,730 At i-claim namin ngayon na address ay mula sa kimpal. 556 00:24:20,730 --> 00:24:24,480 At ngayon ako ay nagpi-print out ang string sa address na iyon. 557 00:24:24,480 --> 00:24:27,000 Ngunit hindi namin ang tinatawag na sa tapat ng getstring. 558 00:24:27,000 --> 00:24:30,850 Hindi namin nagkaroon upang calll isang function tulad ng ungetstring, kung saan mo isauli 559 00:24:30,850 --> 00:24:31,610 na memorya. 560 00:24:31,610 --> 00:24:33,250 Ngunit nang tapat namin marahil Dapat naging. 561 00:24:33,250 --> 00:24:37,390 Dahil kung panatilihin namin ang pagtatanong sa computer para sa memory, sa pamamagitan ng isang tao tulad ng 562 00:24:37,390 --> 00:24:40,830 getstring ngunit hindi kailanman bigyan ito pabalik, ay tiyak na masyadong ay nakatali na humantong sa 563 00:24:40,830 --> 00:24:42,970 problema kung saan tumakbo kami sa labas ng memorya. 564 00:24:42,970 --> 00:24:46,140 >> At sa katunayan, maaari naming hanapin ang mga mga problema sa mga bagong tool na paggamit 565 00:24:46,140 --> 00:24:47,640 ay isang maliit na misteriyoso na mag-type. 566 00:24:47,640 --> 00:24:50,960 Ngunit ipaalam sa akin sige at Splash up ito sa screen sa loob lamang ng ilang sandali. 567 00:24:50,960 --> 00:24:56,940 Pupunta ako sa sige at patakbuhin Valgrind may parameter na ang unang utos 568 00:24:56,940 --> 00:25:00,260 linya ng argumento ay ang pangalan ng programang iyon halo-2. 569 00:25:00,260 --> 00:25:02,650 At sa kasamaang-palad ito output ay atrociously 570 00:25:02,650 --> 00:25:04,290 complex para sa walang magandang dahilan. 571 00:25:04,290 --> 00:25:06,280 Kaya namin makita ang lahat na gulo. 572 00:25:06,280 --> 00:25:07,530 Si David ay sabihin ang aking pangalan. 573 00:25:07,530 --> 00:25:09,760 Kaya na programa sa aktwal na tumatakbo. 574 00:25:09,760 --> 00:25:11,180 At ngayon namin makuha ang output. 575 00:25:11,180 --> 00:25:13,400 >> Kaya Valgrind ay katulad sa espiritu sa GDB. 576 00:25:13,400 --> 00:25:14,950 Ito ay hindi isang debugger per se. 577 00:25:14,950 --> 00:25:16,270 Ngunit ito ay isang memory checker. 578 00:25:16,270 --> 00:25:20,140 Ito ay isang programa na tatakbo ang iyong mga programa at sabihin sa iyo kung hiniling mo sa isang 579 00:25:20,140 --> 00:25:23,860 computer para sa memorya at hindi kailanman ipinasa ito pabalik, at dahil doon na nangangahulugan na ikaw ay may 580 00:25:23,860 --> 00:25:24,570 isang memory tumagas. 581 00:25:24,570 --> 00:25:26,240 At memory paglabas ay may posibilidad na maging masama. 582 00:25:26,240 --> 00:25:29,120 At ikaw ay gumagamit ng mga computer ay may marahil nadama na ito, kung mayroon kang isang 583 00:25:29,120 --> 00:25:30,300 Mac o PC. 584 00:25:30,300 --> 00:25:33,730 Nakarating na ba kayo na ginagamit ng iyong computer para sa at habang hindi rebooted sa ilang 585 00:25:33,730 --> 00:25:36,820 araw, o lamang na iyong nakuha ng maraming mga programa sa pagtakbo, at ang sumpain bagay 586 00:25:36,820 --> 00:25:42,360 slows sa isang paggiling huminto, o hindi bababa sa ito ay sobrang nakakainis na upang gamitin, dahil 587 00:25:42,360 --> 00:25:44,350 lahat ng bagay Naging super mabagal. 588 00:25:44,350 --> 00:25:46,260 >> Ngayon na maaaring maging anumang bilang ng mga kadahilanan. 589 00:25:46,260 --> 00:25:49,600 Ito ay maaaring maging isang walang-katapusang loop, isang bug sa code ng isang tao, o, mas lamang, ito 590 00:25:49,600 --> 00:25:53,250 Maaaring ibig sabihin na gumagamit ka ng higit pa memorya, o sinusubukang i, kaysa sa iyong 591 00:25:53,250 --> 00:25:54,920 computer na may aktwal na. 592 00:25:54,920 --> 00:25:57,770 At siguro mayroong isang bug sa ilang mga programa na panatilihin ang humihingi ng memorya. 593 00:25:57,770 --> 00:26:02,480 Browser para sa taon ay kilalang-kilala para sa ito, humihiling ng higit pa at mas memorya 594 00:26:02,480 --> 00:26:03,870 ngunit hindi kailanman handing ito pabalik. 595 00:26:03,870 --> 00:26:07,220 Tiyak, kung mayroon ka lamang isang may wakas halaga ng memory, hindi mo maaaring magtanong 596 00:26:07,220 --> 00:26:09,990 walang hanggan maraming beses para sa ang ilan sa na memorya. 597 00:26:09,990 --> 00:26:13,070 >> At kaya kung ano ang makikita mo dito, kahit na muli Valgrind ng output ay 598 00:26:13,070 --> 00:26:17,490 nang hindi kinakailangan kumplikado upang sumulyap sa una sa lahat, ito ay ang mga kawili-wiling bahagi. 599 00:26:17,490 --> 00:26:18,890 Kimpal - 600 00:26:18,890 --> 00:26:20,060 sa paggamit sa exit. 601 00:26:20,060 --> 00:26:22,810 Kaya narito ang kung magkano ang memorya ay sa paggamit sa kimpal sa 602 00:26:22,810 --> 00:26:24,300 oras ng aking programa lumabas - 603 00:26:24,300 --> 00:26:27,280 tila anim bytes sa isang bloke. 604 00:26:27,280 --> 00:26:28,710 Kaya pupuntahan ko iwagayway ang aking mga kamay sa kung ano ang isang bloke ay. 605 00:26:28,710 --> 00:26:31,270 Isipin ito lamang ang tipak, isang mas teknikal na salita para sa tipak. 606 00:26:31,270 --> 00:26:33,140 Ngunit anim bytes - 607 00:26:33,140 --> 00:26:36,870 ano ang mga anim na bytes ay pa rin sa paggamit? 608 00:26:36,870 --> 00:26:37,390 >> Mismong. 609 00:26:37,390 --> 00:26:41,520 D-A-V-ko-D backslash zero, limang titik pangalan plus ang null Terminator. 610 00:26:41,520 --> 00:26:46,350 Kaya programang ito Valgrind napansin ko tinanong para sa anim bytes, tila, sa pamamagitan ng 611 00:26:46,350 --> 00:26:48,950 paraan ng getstring, ngunit hindi kailanman ibinigay sa kanila pabalik. 612 00:26:48,950 --> 00:26:52,030 At sa katunayan, ito ay maaaring hindi kaya halata kung ang aking programa ay hindi tatlong 613 00:26:52,030 --> 00:26:53,590 mga linya, ngunit ito ay 300 mga linya. 614 00:26:53,590 --> 00:26:56,920 Kaya maaari naming talagang bigyan ng isa pang utos linya ng argumento sa Valgrind sa 615 00:26:56,920 --> 00:26:58,290 gawin itong mas maligoy. 616 00:26:58,290 --> 00:26:59,760 Ito ay isang maliit na nakakainis na matandaan. 617 00:26:59,760 --> 00:27:01,580 Ngunit kung gagawin ko - 618 00:27:01,580 --> 00:27:01,930 sabihin makita. 619 00:27:01,930 --> 00:27:03,540 Mahayag - 620 00:27:03,540 --> 00:27:05,030 Ay mahayag ito - 621 00:27:05,030 --> 00:27:07,580 kahit na hindi ko matandaan kung ano ito ay off kamay. 622 00:27:07,580 --> 00:27:08,550 >> - Mahayag-tseke ay katumbas ng full. 623 00:27:08,550 --> 00:27:10,180 Yep, salamat sa iyo. 624 00:27:10,180 --> 00:27:12,520 - Mahayag-tseke ay katumbas ng full. 625 00:27:12,520 --> 00:27:13,800 Enter. 626 00:27:13,800 --> 00:27:14,940 Parehong programa ay tumatakbo. 627 00:27:14,940 --> 00:27:16,180 I-type sa David muli. 628 00:27:16,180 --> 00:27:17,660 Ngayon ko makita ang isang maliit na karagdagang detalye. 629 00:27:17,660 --> 00:27:20,890 Ngunit sa ibaba ang buod kimpal, na ay kapareho ng apat - ah, 630 00:27:20,890 --> 00:27:22,120 ito ay uri ng magaling. 631 00:27:22,120 --> 00:27:25,460 Ngayon Valgrind ay talagang aktwal na tumitingin medyo mas mahirap sa aking mga code. 632 00:27:25,460 --> 00:27:29,580 At ito ay nagsasabi na, tila, malloc sa linyang - 633 00:27:29,580 --> 00:27:30,580 kami mag-zoom out. 634 00:27:30,580 --> 00:27:31,980 Sa linya - 635 00:27:31,980 --> 00:27:32,930 hindi namin makita kung ano ang linya ito ay. 636 00:27:32,930 --> 00:27:35,110 Ngunit malloc ay ang unang salarin. 637 00:27:35,110 --> 00:27:38,630 Mayroong isang blog sa malloc. 638 00:27:38,630 --> 00:27:39,810 >> Ang lahat ng mga karapatan? 639 00:27:39,810 --> 00:27:40,450 OK, hindi. 640 00:27:40,450 --> 00:27:40,940 I-right? 641 00:27:40,940 --> 00:27:42,520 Tumawag ako getstring. 642 00:27:42,520 --> 00:27:44,460 getstring tila tawag malloc. 643 00:27:44,460 --> 00:27:47,800 Kaya kung ano ang linya ng code ay tila sa kasalanan dahil sa pagkakaroon ng 644 00:27:47,800 --> 00:27:49,050 inilalaan memory na ito? 645 00:27:49,050 --> 00:27:51,560 646 00:27:51,560 --> 00:27:55,540 Ipagpalagay nating na kung sinuman ang nagsulat malloc ay naging sa paligid ng may sapat na katagalan na ito 647 00:27:55,540 --> 00:27:56,390 hindi kasalanan ng kanilang. 648 00:27:56,390 --> 00:27:57,520 Kaya marahil ito ay minahan. 649 00:27:57,520 --> 00:28:02,000 getstring sa cs50.c - kaya iyan ay isang maghain sa isang lugar sa computer - 650 00:28:02,000 --> 00:28:05,210 sa line 286 Mukhang ang salarin. 651 00:28:05,210 --> 00:28:08,140 Ngayon, sabihin ipinapalagay na ang cs50 ay naging sa paligid para sa disenteng dami ng oras, sa gayon 652 00:28:08,140 --> 00:28:09,720 namin masyadong ay hindi maaaring magkamali. 653 00:28:09,720 --> 00:28:14,080 At kaya ito ay marahil hindi sa getstring na bug ang namamalagi, ngunit sa halip sa 654 00:28:14,080 --> 00:28:17,810 halo-2.c linya 18. 655 00:28:17,810 --> 00:28:20,670 >> Kaya sabihin tumingin sa ano na linya 18 noon. 656 00:28:20,670 --> 00:28:21,130 Oh. 657 00:28:21,130 --> 00:28:27,130 Sa paanuman linya na ito ay hindi nangangahulugang maraming surot, per se, ngunit ito ay ang dahilan 658 00:28:27,130 --> 00:28:28,630 sa likod na memory mahayag. 659 00:28:28,630 --> 00:28:32,140 Kaya napaka-simple, ano ang gagawin intuitively maging ang solusyon dito? 660 00:28:32,140 --> 00:28:34,710 Kung hinihiling namin para sa memory, ay hindi kailanman nagbibigay ito pabalik, at na tila may 661 00:28:34,710 --> 00:28:37,940 problema dahil sa paglipas ng panahon ang aking computer baka maubusan ng memory, maaaring pabagalin 662 00:28:37,940 --> 00:28:42,110 pababa, masamang bagay maaaring mangyari, na rin, kung ano ang mga simpleng solusyon madaling maunawaan? 663 00:28:42,110 --> 00:28:43,140 Lang bigyan ito pabalik. 664 00:28:43,140 --> 00:28:44,770 >> Paano mo magbakante na memory? 665 00:28:44,770 --> 00:28:49,970 Well, thankfully ito ay medyo simple sa makatarungan sabihin libreng pangalan. 666 00:28:49,970 --> 00:28:51,260 At hindi namin nagawa mo na ito bago. 667 00:28:51,260 --> 00:28:55,890 Ngunit maaari kang mahalagang isipin libre bilang ng kabaligtaran ng malloc. 668 00:28:55,890 --> 00:28:58,030 libreng ay ang kabaligtaran ng paglaan ng memorya. 669 00:28:58,030 --> 00:28:59,540 Kaya ngayon hayaan mo akong mag-recompile ito. 670 00:28:59,540 --> 00:29:02,050 Gumawa ng halo-2. 671 00:29:02,050 --> 00:29:04,620 Hayaan akong patakbuhin itong muli. halo-2 David. 672 00:29:04,620 --> 00:29:07,290 Kaya ito ay tila upang gumana sa eksakto sa parehong paraan. 673 00:29:07,290 --> 00:29:11,180 Ngunit kung pumunta ako pabalik sa Valgrind at patakbuhin muli na parehong utos sa aking bagong 674 00:29:11,180 --> 00:29:14,720 inipon programa, pagta-type sa aking pangalan tulad ng dati - 675 00:29:14,720 --> 00:29:15,370 Nice. 676 00:29:15,370 --> 00:29:16,760 Kimpal buod - 677 00:29:16,760 --> 00:29:17,740 sa paggamit sa exit - 678 00:29:17,740 --> 00:29:19,370 zero bytes sa zero bloke. 679 00:29:19,370 --> 00:29:21,840 At ito ay sobrang magaling, lahat kimpal bloke ay napalaya. 680 00:29:21,840 --> 00:29:23,480 Walang paglabas ang posible. 681 00:29:23,480 --> 00:29:27,200 >> Kaya darating up, hindi na may Problema Set 4, pero may Problema Set 5, ang forensics 682 00:29:27,200 --> 00:29:30,740 at pasulong, ito masyadong ay magiging isang sukatan ng kawastuhan ng iyong 683 00:29:30,740 --> 00:29:33,630 programa, kung mayroon o wala ka o walang paglabas memory. 684 00:29:33,630 --> 00:29:36,900 Pero thankfully, hindi lamang ang maaari mong Dahilan sa pamamagitan ng mga ito intuitively, na 685 00:29:36,900 --> 00:29:40,430 ay, arguably, madali para sa maliit na mga programa ngunit mas mahirap para sa mas malaking mga programa, 686 00:29:40,430 --> 00:29:43,860 Valgrind, para sa mga mas malalaking mga programa, ay maaaring makatulong sa iyo na makilala 687 00:29:43,860 --> 00:29:45,360 ang partikular na problema. 688 00:29:45,360 --> 00:29:47,500 >> Subalit mayroong isa pang problema na maaaring lumabas dahil. 689 00:29:47,500 --> 00:29:51,245 Hayaan akong buksan up ang file na ito dito, na kung saan ay, muli, isang medyo simpleng halimbawa. 690 00:29:51,245 --> 00:29:53,760 Ngunit sabihin tumuon sa kung ano programang ito gumagana. 691 00:29:53,760 --> 00:29:55,190 Ito ay tinatawag na memory.c. 692 00:29:55,190 --> 00:29:58,380 Magpo-post kami na ito sa ibang pagkakataon ngayong araw sa zip ng source code ngayon. 693 00:29:58,380 --> 00:30:01,610 At mapansin na mayroon akong isang function na tinatawag na f na tumatagal ng walang argumento at 694 00:30:01,610 --> 00:30:02,800 Ibinabalik ng wala. 695 00:30:02,800 --> 00:30:07,240 Sa line 20, tila ako deklarasyon ng pointer sa isang int at pagtawag ito x. 696 00:30:07,240 --> 00:30:09,570 Ako ay nagtatalaga ang return halaga ng malloc. 697 00:30:09,570 --> 00:30:14,590 At para lamang maging malinaw, kung gaano karaming bytes am Ako malamang pagbalik mula sa malloc 698 00:30:14,590 --> 00:30:17,080 sa sitwasyong ito? 699 00:30:17,080 --> 00:30:18,040 >> Malamang 40. 700 00:30:18,040 --> 00:30:18,840 Saan mo makuha na mula sa? 701 00:30:18,840 --> 00:30:22,410 Well, kung isipin ang mo na ang isang int ay madalas 4 bytes, kahit ito ay nasa 702 00:30:22,410 --> 00:30:25,110 appliance, 10 beses 4 ay malinaw naman 40. 703 00:30:25,110 --> 00:30:28,920 Kaya malloc ay nagbabalik ng isang address ng isang tipak ng memory at pag-imbak na 704 00:30:28,920 --> 00:30:30,800 tugunan ang huli sa x. 705 00:30:30,800 --> 00:30:32,570 Kaya upang maging malinaw, kung ano pagkatapos ay ang nangyayari? 706 00:30:32,570 --> 00:30:34,990 Well, hayaan mo akong bumalik sa aming mga larawan dito. 707 00:30:34,990 --> 00:30:38,150 Hayaan akong hindi lamang gumuhit sa ibaba ng aking computer memory, hayaan mo akong magpatuloy at 708 00:30:38,150 --> 00:30:42,990 gumuhit ang buong parihaba na Kinakatawan ng lahat ng aking mga RAM. 709 00:30:42,990 --> 00:30:44,790 >> Susubukan naming sabihin na ang stack ay nasa ibaba. 710 00:30:44,790 --> 00:30:47,010 At mayroong teksto sa segment ang uninitialized data. 711 00:30:47,010 --> 00:30:49,880 Ngunit lang ako sa pagpunta sa mga abstract iba pang mga bagay ang layo bilang tuldok, tuldok tuldok. 712 00:30:49,880 --> 00:30:53,470 Lamang ako ng pagpunta sa sumangguni sa bilang ang kimpal sa tuktok. 713 00:30:53,470 --> 00:30:57,070 At pagkatapos ay sa ilalim ng litrato na ito, upang kumatawan sa main, pupuntahan ko 714 00:30:57,070 --> 00:30:59,880 upang bigyan ito ng isang hiwa memory sa stack. 715 00:30:59,880 --> 00:31:03,150 Para sa f, pupuntahan ko bigyan ito ng isang slice ng memorya sa stack. 716 00:31:03,150 --> 00:31:05,140 Ngayon, ang nakuha ko sa aking kumonsulta source code muli. 717 00:31:05,140 --> 00:31:07,170 Ano ang mga lokal na mga variable para sa main? 718 00:31:07,170 --> 00:31:10,710 Tila wala, kaya hiwa na mabisa walang laman o kahit hindi bilang malaki 719 00:31:10,710 --> 00:31:11,600 bilang ko ang iginuhit ito. 720 00:31:11,600 --> 00:31:15,730 Ngunit sa f, mayroon akong isang lokal na variable, na kung saan ay tinatawag na x. 721 00:31:15,730 --> 00:31:20,410 Kaya pupuntahan ko sige at bigyan f isang tipak ng memory, pagtawag ito x. 722 00:31:20,410 --> 00:31:24,680 >> At ngayon malloc ng 10 beses 4, Kaya malloc 40, kung saan lang iyon 723 00:31:24,680 --> 00:31:25,430 memory nagmumula? 724 00:31:25,430 --> 00:31:27,530 Hindi na namin ang iginuhit ng litrato gustuhin ang bago. 725 00:31:27,530 --> 00:31:31,140 Ngunit sabihin ipagpalagay na ito ay epektibo nagmumula dito, kaya isa, 726 00:31:31,140 --> 00:31:33,170 dalawa, tatlo, apat, lima. 727 00:31:33,170 --> 00:31:34,680 At ngayon ay kailangan ko 40 sa mga ito. 728 00:31:34,680 --> 00:31:37,540 Kaya kukunin ko na lang gawin tuldok, tuldok, tuldok upang magmungkahi na mayroong kahit na mas memory 729 00:31:37,540 --> 00:31:39,350 bumabalik mula sa kimpal. 730 00:31:39,350 --> 00:31:40,710 Ngayon kung ano ang address ang? 731 00:31:40,710 --> 00:31:42,620 Sabihin piliin ang aming arbitrary tugunan gaya ng lagi - 732 00:31:42,620 --> 00:31:46,310 Ox123, kahit na marahil ito ang nangyayari upang maging isang bagay na ganap na naiibang. 733 00:31:46,310 --> 00:31:50,420 Iyan ang address ng unang byte sa memorya na ako humihingi para sa malloc. 734 00:31:50,420 --> 00:31:53,630 >> Kaya sa maikling, isang beses linya 20 executes, ano ang literal 735 00:31:53,630 --> 00:31:57,170 naka-imbak sa loob ng x dito? 736 00:31:57,170 --> 00:31:58,730 Ox123. 737 00:31:58,730 --> 00:32:00,370 Ox123. 738 00:32:00,370 --> 00:32:01,550 At baka ay hindi kawili-wili. 739 00:32:01,550 --> 00:32:03,200 Ito ay nangangahulugan lamang narito ang isang hexadecimal numero. 740 00:32:03,200 --> 00:32:06,490 Ngunit kung ano ang key na ay kung ano ang nag ko store sa x, na kung saan ay isang lokal na variable. 741 00:32:06,490 --> 00:32:10,260 Ngunit nito sa uri ng data, muli, ay isang address ng isang int. 742 00:32:10,260 --> 00:32:12,710 Well, Pupunta ako sa store Ox123. 743 00:32:12,710 --> 00:32:16,610 Ngunit muli, kung na ang isang maliit na masyadong nang hindi kinakailangan kumplikado, kung mag-scroll ako 744 00:32:16,610 --> 00:32:21,490 pabalik, maaari naming abstract ito ang layo pa makatwirang at sabihin lamang na x ay isang 745 00:32:21,490 --> 00:32:23,910 pointer sa na tipak ng memory. 746 00:32:23,910 --> 00:32:24,070 >> OK. 747 00:32:24,070 --> 00:32:26,230 Ngayon ang tanong sa kamay ay ang mga sumusunod - 748 00:32:26,230 --> 00:32:29,910 21 linya, ito lumiliko out, ay maraming surot. 749 00:32:29,910 --> 00:32:31,160 Bakit? 750 00:32:31,160 --> 00:32:34,890 751 00:32:34,890 --> 00:32:36,930 >> Paumanhin? 752 00:32:36,930 --> 00:32:38,640 Hindi nito ay may - 753 00:32:38,640 --> 00:32:40,390 sabihin na sa sandaling higit pa. 754 00:32:40,390 --> 00:32:41,240 Well, ito ay hindi libre. 755 00:32:41,240 --> 00:32:42,350 Kaya iyon ang ikalawang ngunit. 756 00:32:42,350 --> 00:32:45,000 Kaya mayroong isang iba pang ngunit partikular na sa linya 21. 757 00:32:45,000 --> 00:32:49,480 758 00:32:49,480 --> 00:32:50,040 >> Mismong. 759 00:32:50,040 --> 00:32:54,980 Ito simpleng linya ng code lamang ang buffer overflow, isang paglampas sa buffer. 760 00:32:54,980 --> 00:32:57,050 Isang buffer lang ay nangangahulugang isang tipak ng memory. 761 00:32:57,050 --> 00:33:01,520 Ngunit na tipak ng memory ay ng laki 10, 10 integer, na nangangahulugan na kung namin 762 00:33:01,520 --> 00:33:05,350 sa index ito gamit ang sintaktik asukal ng array notation, ang parisukat 763 00:33:05,350 --> 00:33:09,220 bracket, mayroon kang access sa x bracket 0 bracket x 1 x, 764 00:33:09,220 --> 00:33:10,390 bracket tuldok, tuldok, tuldok. 765 00:33:10,390 --> 00:33:13,270 x 9 bracket ay ang pinakamalaking isa. 766 00:33:13,270 --> 00:33:17,680 Kaya kung gagawin ko bracket x 10, kung saan Talaga ako pupunta sa memory? 767 00:33:17,680 --> 00:33:19,120 >> Well, kung mayroon akong 10 int - 768 00:33:19,120 --> 00:33:21,070 sabihin talagang gumuhit lahat ng mga out dito. 769 00:33:21,070 --> 00:33:22,700 Kaya na ay ang unang limang. 770 00:33:22,700 --> 00:33:24,660 Narito ang iba pang mga limang ints. 771 00:33:24,660 --> 00:33:29,580 Kaya x bracket ay 0 dito. x bracket 1 ay dito. x 9 bracket ay dito. x bracket 772 00:33:29,580 --> 00:33:37,960 Ang 10 dito, na nangangahulugan na ako ay nagsasabi, sa line 21, ang computer upang ilagay ang 773 00:33:37,960 --> 00:33:39,400 numero kung saan? 774 00:33:39,400 --> 00:33:42,010 Ang bilang 0 saan? 775 00:33:42,010 --> 00:33:43,380 Well, ito ay 0, oo. 776 00:33:43,380 --> 00:33:45,460 Ngunit lamang ang katotohanan na nito 0 ay uri ng isang pagkakatulad. 777 00:33:45,460 --> 00:33:47,140 Maaaring ito ay ang bilang 50, para sa lahat ng pinapahalagahan namin. 778 00:33:47,140 --> 00:33:50,480 Ngunit sinusubukan naming ilagay ito sa x bracket 10, na kung saan ito 779 00:33:50,480 --> 00:33:53,700 tandang pananong ay iginuguhit, na ay hindi isang magandang bagay. 780 00:33:53,700 --> 00:33:57,070 Ang program na ito ay maaaring napakahusay lumagpak bilang isang resulta. 781 00:33:57,070 --> 00:33:59,400 >> Ngayon, sabihin sige at tingnan kung ito ay, sa katunayan, kung ano ang mangyayari. 782 00:33:59,400 --> 00:34:02,600 Gumawa ng memorya, dahil ang file ay tinatawag na memory.c. 783 00:34:02,600 --> 00:34:05,950 Sabihin sige at magpatakbo ng programa ng memorya. 784 00:34:05,950 --> 00:34:08,239 Kaya namin nakuha masuwerteng, talaga, parang. 785 00:34:08,239 --> 00:34:09,340 Nakakuha kami ng masuwerteng. 786 00:34:09,340 --> 00:34:11,060 Ngunit sabihin makita kung namin ngayon tumakbo Valgrind. 787 00:34:11,060 --> 00:34:14,170 Sa unang tingin, ang aking programa kapangyarihan mukhang perpektong tama. 788 00:34:14,170 --> 00:34:18,010 Ngunit hayaan mo akong tumakbo Valgrind sa - Mahayag-tseke ay katumbas ng full sa memorya. 789 00:34:18,010 --> 00:34:20,110 >> At ngayon kapag nagpatakbo ako ng ito - 790 00:34:20,110 --> 00:34:21,030 kawili-wili. 791 00:34:21,030 --> 00:34:26,800 Di-wastong sumulat ng laki 4 sa 21 linya ng memory.c. 792 00:34:26,800 --> 00:34:29,284 Linya ng 21 memory.c ay kung alin? 793 00:34:29,284 --> 00:34:30,340 Oh, kawili-wili. 794 00:34:30,340 --> 00:34:31,080 Ngunit maghintay. 795 00:34:31,080 --> 00:34:32,389 Sukat 4, ano ang na nagre-refer sa? 796 00:34:32,389 --> 00:34:34,969 Lamang ako ay isa magsulat, pero sukat ng 4. 797 00:34:34,969 --> 00:34:36,889 Bakit ito 4? 798 00:34:36,889 --> 00:34:39,280 Ito ay dahil ito ay isang int, na ay, muli, apat na bytes. 799 00:34:39,280 --> 00:34:42,510 Kaya Valgrind nakitang isang bug na ako, glancing sa aking code, ang hindi. 800 00:34:42,510 --> 00:34:45,040 At marahil iyong tf gagawin o hindi gagawin. 801 00:34:45,040 --> 00:34:48,469 Ano Valgrind Ngunit para bang natagpuan na nagkamali kami ng doon, kahit na 802 00:34:48,469 --> 00:34:52,719 bagaman namin nakuha masuwerteng, at ang computer nagpasya, eh, hindi ako pupunta ng pag-crash 803 00:34:52,719 --> 00:34:57,470 dahil lang sa iyo hinawakan isa byte, isa int ni nagkakahalaga ng memorya na ikaw ay hindi 804 00:34:57,470 --> 00:34:58,550 talaga sarili. 805 00:34:58,550 --> 00:35:00,380 >> Well, ano pa ang maraming surot dito. 806 00:35:00,380 --> 00:35:01,180 Address - 807 00:35:01,180 --> 00:35:03,190 ito ay isang nakatutuwang naghahanap address sa hexadecimal. 808 00:35:03,190 --> 00:35:06,890 Iyon lang ang ibig sabihin nito sa isang lugar sa kimpal ay zero bytes pagkatapos ng isang bloke ng laki 40 809 00:35:06,890 --> 00:35:07,620 ay inilalaan. 810 00:35:07,620 --> 00:35:10,610 Hayaan akong mag-zoom out dito at tingnan kung ito ay isang maliit na mas kapaki-pakinabang. 811 00:35:10,610 --> 00:35:11,410 Kawili-wili. 812 00:35:11,410 --> 00:35:15,600 40 bytes ay siguradong mawawala sa pagkawala record 1 ng 1. 813 00:35:15,600 --> 00:35:17,840 Muli, higit pa kaysa sa mga salita ay kapaki-pakinabang dito. 814 00:35:17,840 --> 00:35:21,350 Ngunit batay sa mga naka-highlight na mga linya, kung saan ang dapat kong marahil ituon ang aking 815 00:35:21,350 --> 00:35:24,070 pansin para sa isa pang bug? 816 00:35:24,070 --> 00:35:26,570 Mukhang isang linya ng 20 memory.c. 817 00:35:26,570 --> 00:35:30,990 >> Kaya kung pumunta kami pabalik sa linya 20, na ang isa na nakilala mo nang mas maaga. 818 00:35:30,990 --> 00:35:33,030 At hindi ito nangangahulugang maraming surot. 819 00:35:33,030 --> 00:35:35,160 Ngunit pa namin ito reverse epekto nito. 820 00:35:35,160 --> 00:35:38,790 Kaya paano ko itama ang hindi bababa sa isa sa mga pagkakamali? 821 00:35:38,790 --> 00:35:42,240 Ano ang maaari kong gawin pagkatapos linya 21? 822 00:35:42,240 --> 00:35:47,110 Maaari kong gawin libreng ng x, sa gayon ay upang bigyan pabalik na memory. 823 00:35:47,110 --> 00:35:49,230 At paano ko ito aayusin bug? 824 00:35:49,230 --> 00:35:52,120 Dapat ko talagang pumunta walang higit na malayo kaysa sa 0. 825 00:35:52,120 --> 00:35:53,670 Kaya hayaan mo akong subukan at muling patakbuhin ito. 826 00:35:53,670 --> 00:35:56,080 Paumanhin, siguradong pumunta walang higit na malayo kaysa 9. 827 00:35:56,080 --> 00:35:57,510 Gumawa ng memorya. 828 00:35:57,510 --> 00:36:00,650 Hayaan akong muling palabas ng pelikula Valgrind sa isang mas malaking window. 829 00:36:00,650 --> 00:36:01,580 At ngayon tumingin. 830 00:36:01,580 --> 00:36:02,250 Nice. 831 00:36:02,250 --> 00:36:03,270 Ang lahat ng mga bloke kimpal ay napalaya. 832 00:36:03,270 --> 00:36:04,270 Walang paglabas ang posible. 833 00:36:04,270 --> 00:36:07,520 At hanggang dito sa itaas, mayroong walang pagbanggit anumang higit pa sa mga di-wastong karapatan. 834 00:36:07,520 --> 00:36:09,820 >> Lamang upang makakuha ng sakim, at sabihin makita kung ang isa pang demonstration 835 00:36:09,820 --> 00:36:11,050 ay hindi pumunta bilang nilayon - 836 00:36:11,050 --> 00:36:12,560 Ako ay makakuha ng masuwerteng ng ilang sandali ang nakalipas. 837 00:36:12,560 --> 00:36:15,530 At ang katotohanan na ito ay 0 ay marahil nang hindi kinakailangan mapanligaw. 838 00:36:15,530 --> 00:36:20,650 Sabihin lang gawin 50, isang medyo arbitrary numero, gumawa memory dot slash memorya - 839 00:36:20,650 --> 00:36:21,410 pa ring makakuha ng masuwerteng. 840 00:36:21,410 --> 00:36:22,510 Walang bagay na pag-crash. 841 00:36:22,510 --> 00:36:26,150 Ipagpalagay ko lang gawin ang isang bagay talaga sira ang bait, at gagawin ko 100. 842 00:36:26,150 --> 00:36:30,360 Hayaan ang gawing muli sa akin memorya, dot slash memorya - 843 00:36:30,360 --> 00:36:31,075 Nakakuha masuwerteng muli. 844 00:36:31,075 --> 00:36:32,800 Paano tungkol sa 1,000? 845 00:36:32,800 --> 00:36:35,370 ints lampas, halos, kung saan ang dapat kong maging? 846 00:36:35,370 --> 00:36:37,410 Gumawa ng memorya - 847 00:36:37,410 --> 00:36:38,570 diyablo. 848 00:36:38,570 --> 00:36:39,920 >> [Tawa] 849 00:36:39,920 --> 00:36:41,270 >> OK. 850 00:36:41,270 --> 00:36:43,920 Tayo'y hindi Nagkamali sa paligid na ngayon. 851 00:36:43,920 --> 00:36:45,120 Muling palabas ng pelikula memory. 852 00:36:45,120 --> 00:36:45,840 Nagkaroon kami pumunta. 853 00:36:45,840 --> 00:36:46,410 Ayos lang. 854 00:36:46,410 --> 00:36:52,500 Kaya tila ka index 100,000 ints lampas saan mo dapat naging sa 855 00:36:52,500 --> 00:36:54,410 memorya, masamang bagay mangyari. 856 00:36:54,410 --> 00:36:56,430 Kaya ito ay malinaw naman hindi isang matapang, mabilis panuntunan. 857 00:36:56,430 --> 00:36:58,190 Ako ay uri ng paggamit ng pagsubok at error upang makakuha ng doon. 858 00:36:58,190 --> 00:37:02,230 Ngunit ito ay dahil, mahaba kuwento maikli, memory ng iyong computer ay hinati rin 859 00:37:02,230 --> 00:37:03,580 sa mga bagay na ito na tinatawag na mga segment. 860 00:37:03,580 --> 00:37:07,260 At kung minsan, ang computer talaga ay nagbigay sa iyo ng kaunti pa sa memory 861 00:37:07,260 --> 00:37:08,400 kaysa hilingin sa iyo para sa. 862 00:37:08,400 --> 00:37:12,170 Ngunit para sa kahusayan, ito lamang ay mas madali upang makakuha ng mas maraming memorya ngunit lamang sabihin sa iyo 863 00:37:12,170 --> 00:37:13,780 na nakakakuha ka ng isang bahagi ng mga ito. 864 00:37:13,780 --> 00:37:16,370 >> At kung makakuha ka ng masuwerteng kung minsan, samakatuwid, maaari mong ma-hawakan 865 00:37:16,370 --> 00:37:17,795 memorya na ay hindi nabibilang sa iyo. 866 00:37:17,795 --> 00:37:21,860 Mayroon kang walang garantiya na kung ano ang halaga inilagay mo doon ay manatili doon, dahil 867 00:37:21,860 --> 00:37:25,080 ang computer pa rin ang palagay ni ito ay hindi iyo, ngunit ito ay hindi kinakailangan na dumalo 868 00:37:25,080 --> 00:37:29,910 tamaan ng isa pang segment ng memory sa computer at magbuod ng isang pagkakamali tulad ng 869 00:37:29,910 --> 00:37:31,710 ang isang ito dito. 870 00:37:31,710 --> 00:37:32,060 Ayos lang. 871 00:37:32,060 --> 00:37:37,240 Ang anumang mga katanungan pagkatapos ay sa memory? 872 00:37:37,240 --> 00:37:37,590 >> Ayos lang. 873 00:37:37,590 --> 00:37:40,610 Tingnan natin ang isang hitsura dito, pagkatapos, sa isang bagay na aming paglalaan para sa 874 00:37:40,610 --> 00:37:48,361 Binigyan para sa lubos ng ilang oras, na ay sa file na ito na tinatawag na cs50.h. 875 00:37:48,361 --> 00:37:49,420 Kaya ito ay isang file. 876 00:37:49,420 --> 00:37:51,130 Ang mga ito ay lamang ang maramihang ng mga komento up tuktok. 877 00:37:51,130 --> 00:37:53,900 At maaari mo pa Tiningnan ito kung mo poked sa paligid sa appliance. 878 00:37:53,900 --> 00:37:57,000 Ngunit ito lumiliko out na sa lahat ng oras, kapag ginamit namin upang gamitin ang string na ito bilang isang 879 00:37:57,000 --> 00:38:01,130 kasingkahulugan, ang mga paraan kung naming ipinahayag na kasing kahulugan ay may ito 880 00:38:01,130 --> 00:38:03,990 typedef keyword, para sa mga uri ng kahulugan. 881 00:38:03,990 --> 00:38:07,500 At talaga namin sinasabi na, gumawa String isang kasingkahulugan para sa pansamantalang trabaho star. 882 00:38:07,500 --> 00:38:11,190 Na ang paraan kung saan ang stack Nilikha ang mga gulong ng pagsasanay na kilala bilang 883 00:38:11,190 --> 00:38:12,040 ang string. 884 00:38:12,040 --> 00:38:14,830 >> Ngayon narito lamang isang prototype para getchar. 885 00:38:14,830 --> 00:38:17,350 Maaaring Nakita natin ito bago, ngunit iyan ay talaga kung ano ang ginagawa nito. getchar 886 00:38:17,350 --> 00:38:19,070 Walang inaakong argumento, nagbalik ng isang pansamantalang trabaho. 887 00:38:19,070 --> 00:38:21,340 getdouble Walang inaakong argumento, Ibinabalik ng isang double. 888 00:38:21,340 --> 00:38:24,440 getfloat Walang inaakong argument, babalik isang Float, at iba pa. 889 00:38:24,440 --> 00:38:27,270 getint ay in dito. getlonglong ay in dito. 890 00:38:27,270 --> 00:38:28,820 At getstring ay in dito. 891 00:38:28,820 --> 00:38:29,420 At na ito. 892 00:38:29,420 --> 00:38:33,080 Ito lilang linya ay isa pang Preprocessor directive dahil sa 893 00:38:33,080 --> 00:38:35,550 hashtag sa simula ng ito. 894 00:38:35,550 --> 00:38:35,870 >> Ayos lang. 895 00:38:35,870 --> 00:38:38,380 Kaya ngayon hayaan mo akong pumunta sa cs50.c. 896 00:38:38,380 --> 00:38:40,400 At hindi namin makipag-usap masyadong mahaba sa ito. 897 00:38:40,400 --> 00:38:43,280 Ngunit upang bigyan ka ng isang sulyap sa kung ano ang nangyayari ang lahat ng ito 898 00:38:43,280 --> 00:38:46,434 oras, hayaan mo akong pumunta sa - 899 00:38:46,434 --> 00:38:48,250 sabihin gawin getchar. 900 00:38:48,250 --> 00:38:51,050 Kaya getchar ay halos mga komento. 901 00:38:51,050 --> 00:38:52,060 Ngunit mukhang ito. 902 00:38:52,060 --> 00:38:54,800 Kaya ito ay ang aktwal na pag-andar getchar na kami nakapunta 903 00:38:54,800 --> 00:38:56,055 paglalaan para sa ibinigay na. 904 00:38:56,055 --> 00:38:59,370 At kahit na hindi pa namin na gamitin ang isang ito na madalas, kung kailanman, ito ay hindi bababa sa 905 00:38:59,370 --> 00:39:00,470 medyo simple. 906 00:39:00,470 --> 00:39:02,580 Kaya ito ay nagkakahalaga ng pagkuha ng isang mabilis na pagtingin sa dito. 907 00:39:02,580 --> 00:39:06,540 >> Kaya getchar ay isang walang-katapusang loop, sadyang kaya sa malas. 908 00:39:06,540 --> 00:39:10,050 Ito pagkatapos tawag - at ito ay uri ng isang magaling sa muling paggamit ng code namin ating sarili ay nagsulat. 909 00:39:10,050 --> 00:39:11,220 Ito tawag getstring. 910 00:39:11,220 --> 00:39:12,460 Dahil kung ano ang ibig ito ibig sabihin upang makakuha ng isang pansamantalang trabaho? 911 00:39:12,460 --> 00:39:14,730 Well, maaari mong pati na rin subukan upang makakuha ng isang buong linya ng teksto mula sa mga gumagamit at 912 00:39:14,730 --> 00:39:16,940 pagkatapos lamang tumingin sa isa ng mga character. 913 00:39:16,940 --> 00:39:19,170 Sa line 60, narito ang isang maliit na bit ng isang tseke katinuan. 914 00:39:19,170 --> 00:39:21,610 Kung getstring ibinalik null, sabihin hindi magpatuloy. 915 00:39:21,610 --> 00:39:22,820 May nangyaring mali. 916 00:39:22,820 --> 00:39:28,120 >> Ngayon ito ay medyo nakakainis na ngunit maginoo sa C. pansamantalang trabaho max marahil 917 00:39:28,120 --> 00:39:29,960 Kinakatawan ng kung ano lamang batay sa pangalan nito? 918 00:39:29,960 --> 00:39:31,670 Ito ay isang pare-pareho. 919 00:39:31,670 --> 00:39:36,040 Ito ay tulad ng mga numerong halaga ng pinakamalaking pansamantalang trabaho maaari mong kumatawan sa 920 00:39:36,040 --> 00:39:40,370 isa kagat, na kung saan ay marahil ang bilang 255, kung saan ay ang pinakamalaking bilang ka 921 00:39:40,370 --> 00:39:42,720 Kinakatawan walong bits, simula sa zero. 922 00:39:42,720 --> 00:39:47,460 Kaya ko na gamitin ito, sa function na ito, kapag pagsulat ang code na ito, dahil lamang 923 00:39:47,460 --> 00:39:51,753 kung ang isang bagay napupunta mali sa getchar ngunit ang layunin nito sa buhay ay upang magbalik ng 924 00:39:51,753 --> 00:39:54,830 pansamantalang trabaho, kailangan mong sa paanuman magagawang upang magsenyas sa user na 925 00:39:54,830 --> 00:39:55,840 may nangyaring mali. 926 00:39:55,840 --> 00:39:56,970 Hindi kami maaaring bumalik null. 927 00:39:56,970 --> 00:39:58,480 Ito ay lumiliko out na null ay isang pointer. 928 00:39:58,480 --> 00:40:01,030 At muli, may getchar upang magbalik ng pansamantalang trabaho. 929 00:40:01,030 --> 00:40:04,760 >> Kaya ang convention, kung ang isang bagay napupunta mali, ay ikaw, ang programmer, o sa 930 00:40:04,760 --> 00:40:08,160 kasong ito, ako gamit ang library, ako ay nagkaroon isang lang magpasya mang, kung 931 00:40:08,160 --> 00:40:12,230 isang bagay napupunta mali, pupuntahan ko ibalik ang numero 255, na kung saan ay tunay na 932 00:40:12,230 --> 00:40:17,240 ibig sabihin hindi namin, ang gumagamit ay hindi maaaring mag-type ang mga character na kinakatawan ng mga 933 00:40:17,240 --> 00:40:21,410 number 255 dahil nagkaroon kami ng isang magnakaw ito bilang isang tinaguriang halaga nagbabantay sa 934 00:40:21,410 --> 00:40:23,410 kumakatawan sa isang problema. 935 00:40:23,410 --> 00:40:27,010 Ngayon ay lumiliko out na ang mga character na 255 ay hindi isang bagay na maaari mong i-type sa 936 00:40:27,010 --> 00:40:28,380 iyong keyboard, kaya hindi sang-ayon. 937 00:40:28,380 --> 00:40:30,910 Ang user ay hindi mapansin na Ko na ninakaw ng character na ito. 938 00:40:30,910 --> 00:40:34,620 Ngunit kung sakaling makita sa mga pahina ng tao sa isang computer system ang ilang mga reference sa isang 939 00:40:34,620 --> 00:40:38,560 lahat pare-pareho ang caps tulad nito na nagsasabing, sa mga kaso ng mga error na ito ay maaaring pare-pareho 940 00:40:38,560 --> 00:40:42,720 ibabalik, na lahat ng tao sa ilang ginawa taon na ang nakakaraan ay mang nagpasya 941 00:40:42,720 --> 00:40:45,680 ibalik ang espesyal na halaga at tumawag ito ng isang pare-pareho sa kaso 942 00:40:45,680 --> 00:40:46,840 isang bagay napupunta mali. 943 00:40:46,840 --> 00:40:48,580 >> Ngayon magic ang mangyayari pababa dito. 944 00:40:48,580 --> 00:40:52,600 Una, ako deklarasyon sa linya 67 dalawang character, C1 at C2. 945 00:40:52,600 --> 00:40:57,080 At pagkatapos sa linya 68, mayroong talaga isang linya ng code na nakapagpapagunita ng 946 00:40:57,080 --> 00:41:01,140 ang aming mga kaibigan printf, naibigay na ito ay mayroon porsiyento CS sa mga panipi. 947 00:41:01,140 --> 00:41:06,490 Ngunit mapansin kung ano ang nangyayari dito. sscanf nangangahulugan string scan - 948 00:41:06,490 --> 00:41:11,690 Nangangahulugan i-scan ang isang na-format string, samakatuwid sscanf. 949 00:41:11,690 --> 00:41:12,590 Ano ang ibig sabihin na? 950 00:41:12,590 --> 00:41:16,310 Ito ay nangangahulugan na pumasa sa sscanf isang string. 951 00:41:16,310 --> 00:41:18,420 At line ay kahit ano ang mga uri ng user in 952 00:41:18,420 --> 00:41:23,520 Pumasa ka sa sscanf isang format tulad ng string ito ang sinasabi sa scanf kung ano ang mga 953 00:41:23,520 --> 00:41:25,870 umaasa sa iyo ang gumagamit ay nag-type in 954 00:41:25,870 --> 00:41:29,730 Ikaw pagkatapos ay pumasa-in ang mga address ng dalawang chunks ng memorya, sa kasong ito, 955 00:41:29,730 --> 00:41:31,150 dahil mayroon akong dalawang mga placeholder. 956 00:41:31,150 --> 00:41:34,610 Kaya ako ng pagpunta sa bigyan ito ang address ng C1 at ang address ng C2. 957 00:41:34,610 --> 00:41:37,700 >> At isipin ang na nagbibigay sa iyo ng isang function sa address ng ilang mga variable, kung ano ang 958 00:41:37,700 --> 00:41:38,950 ang implikasyon? 959 00:41:38,950 --> 00:41:41,400 960 00:41:41,400 --> 00:41:45,050 Ano ang maaari function na gawin bilang isang resulta ng pagbibigay ito ang address ng isang 961 00:41:45,050 --> 00:41:48,170 variable, na taliwas sa ang variable na mismo? 962 00:41:48,170 --> 00:41:49,450 Maaari itong baguhin ito, tama? 963 00:41:49,450 --> 00:41:53,250 Kung kayo ay nagkaroon ng isang tao sa isang mapa sa isang pisikal na address, maaari silang pumunta doon at gawin 964 00:41:53,250 --> 00:41:54,750 kahit anong gusto nila sa address na iyon. 965 00:41:54,750 --> 00:41:55,800 Parehong ideya dito. 966 00:41:55,800 --> 00:41:59,950 Kung pumasa kami sa sscanf, ang address ng dalawang chunks ng memorya, kahit na ang mga maliliit na 967 00:41:59,950 --> 00:42:03,585 maliit na chunks ng memorya, C1 at C2, pero kami sabihin dito ang address ng mga ito, 968 00:42:03,585 --> 00:42:05,170 sscanf maaari itong baguhin. 969 00:42:05,170 --> 00:42:08,530 >> Kaya sscanf ng layunin sa buhay, kung basahin namin ang tao na pahina, ay upang basahin kung ano ang 970 00:42:08,530 --> 00:42:13,420 gumagamit na nai-type sa, umaasa para sa user pagkakaroon nai-type sa isang character at siguro 971 00:42:13,420 --> 00:42:16,470 isa pang karakter, at ano ang user nai-type, ang unang character na napupunta 972 00:42:16,470 --> 00:42:19,310 dito, ang pangalawang character na napupunta dito. 973 00:42:19,310 --> 00:42:22,470 Ngayon, bilang isang tabi, ito, at ginagawa mo lamang malaman na ito mula sa dokumentasyon, 974 00:42:22,470 --> 00:42:25,570 ang katunayan na ang ko bang ilagay ang isang blangkong espasyo doon Nangangahulugan lamang na hindi akong pakialam kung 975 00:42:25,570 --> 00:42:28,440 pinindot ng user ang mga Space bar ng ilang beses bago siya ay tumatagal ng isang 976 00:42:28,440 --> 00:42:30,400 karakter, pupuntahan ko huwag pansinin anumang mga white space. 977 00:42:30,400 --> 00:42:32,510 Kaya iyon, alam ko mula sa ang dokumentasyon. 978 00:42:32,510 --> 00:42:36,570 >> Ang katotohanan na mayroong isang pangalawang c% sinundan ng white space ay talagang 979 00:42:36,570 --> 00:42:37,410 sinadya. 980 00:42:37,410 --> 00:42:41,190 Gusto kong maging magawang makita kung ang user screwed up o hindi makikipagtulungan. 981 00:42:41,190 --> 00:42:45,630 Kaya ako umaasa na ang gumagamit ay nag-type lamang sa isang character, kaya ako umaasa 982 00:42:45,630 --> 00:42:50,640 sscanf na lamang ang pagpunta upang ibalik ang 1 halaga dahil, muli, kung nabasa ko 983 00:42:50,640 --> 00:42:55,400 ang dokumentasyon, sscanf ng layunin sa buhay ay upang bumalik sa bilang ng mga 984 00:42:55,400 --> 00:42:59,170 variable na puno may user input. 985 00:42:59,170 --> 00:43:02,270 >> Ako pumasa sa dalawang variable address, C1 at C2. 986 00:43:02,270 --> 00:43:06,420 Ako umaasa, bagaman, na ang isa lamang sa ang mga ito ay makakakuha ng pumatay dahil kung sscanf 987 00:43:06,420 --> 00:43:11,130 return 2, ano ang siguro ang lohikal na implikasyon? 988 00:43:11,130 --> 00:43:14,600 Na ang gumagamit ay hindi lang ninyo ako ng isa na character tulad ng sinabi ko sa kanya. 989 00:43:14,600 --> 00:43:17,860 Sila ay malamang na nai-type sa hindi bababa sa dalawang mga character. 990 00:43:17,860 --> 00:43:22,430 Kaya kung ako sa halip ay hindi magkaroon ng ikalawang % C, ko lang ay nagkaroon ng isa, na 991 00:43:22,430 --> 00:43:25,370 nang tapat ay magiging mas madaling maunawaan diskarte, sa palagay ko isang unang tingin, 992 00:43:25,370 --> 00:43:30,220 hindi ka pagpunta sa magagawang detect kung ang gumagamit ay nagbibigay sa iyo ng higit pa 993 00:43:30,220 --> 00:43:31,780 input kaysa sa iyo talaga gusto. 994 00:43:31,780 --> 00:43:34,100 Kaya ito ay isang implicit paraan ng error checking. 995 00:43:34,100 --> 00:43:35,640 >> Ngunit mapansin kung ano ang ginagawa ko dito. 996 00:43:35,640 --> 00:43:39,970 Sa sandaling ako sigurado na ang gumagamit ay nagbigay sa akin ng isa karakter, magbakante ko ang mga linya, paggawa 997 00:43:39,970 --> 00:43:44,450 sa tapat ng getstring, na siya namang ay gumagamit ng malloc, at pagkatapos ay bumalik ako 998 00:43:44,450 --> 00:43:51,030 C1, ang character na ako umaasa sa gumagamit ibinigay at lamang na ibinigay. 999 00:43:51,030 --> 00:43:54,680 Kaya isang mabilis na glimpsed lamang, ngunit anumang mga katanungan sa getchar? 1000 00:43:54,680 --> 00:43:57,450 1001 00:43:57,450 --> 00:43:59,590 Kami ay bumalik sa ilan sa mga iba. 1002 00:43:59,590 --> 00:44:03,770 >> Well, ipaalam sa akin sige at gawin ito - ipagpalagay ngayon, lamang upang mag-udyok sa aming 1003 00:44:03,770 --> 00:44:08,910 talakayan sa isang linggo plus oras, ito ay isang file na tinatawag na structs.h. 1004 00:44:08,910 --> 00:44:11,440 At muli, ito lamang ang lasa ng isang bagay na namamalagi maaga. 1005 00:44:11,440 --> 00:44:13,090 Ngunit notice na ng maraming ng mga ito ay mga komento. 1006 00:44:13,090 --> 00:44:17,440 Kaya hayaan mo akong i-highlight lamang ang kagiliw-giliw na bahagi para sa ngayon. 1007 00:44:17,440 --> 00:44:18,020 typedef - 1008 00:44:18,020 --> 00:44:19,700 mayroong na parehong keyword muli. 1009 00:44:19,700 --> 00:44:23,100 typedef ginagamit namin upang magpahayag ng string bilang isang espesyal na uri ng data. 1010 00:44:23,100 --> 00:44:27,490 Maaari mong gamitin ang typedef upang lumikha ng bagong tatak mga uri ng data na ay hindi umiiral kapag 1011 00:44:27,490 --> 00:44:28,570 C ay na-imbento. 1012 00:44:28,570 --> 00:44:32,520 Halimbawa, int ay may C. pansamantalang trabaho ay may double C. ay may C. Ngunit 1013 00:44:32,520 --> 00:44:34,000 walang paniwala ng isang mag-aaral. 1014 00:44:34,000 --> 00:44:37,230 At pa magiging kaakit-akit kapaki-pakinabang upang maging magagawang magsulat ng isang programa na nag-iimbak 1015 00:44:37,230 --> 00:44:40,440 sa isang variable, numero ng ID ng isang mag-aaral, ang kanilang pangalan, at ang kanilang mga bahay. 1016 00:44:40,440 --> 00:44:42,890 Sa ibang salita, tatlong piraso ng data, i isang int at isang 1017 00:44:42,890 --> 00:44:44,420 string at ng isa pang string. 1018 00:44:44,420 --> 00:44:48,220 >> Sa typedef, kung ano ang medyo malakas tungkol sa mga ito at ang mga keyword para sa sturct 1019 00:44:48,220 --> 00:44:53,660 istraktura, ikaw, ang programmer sa 2013, Maaari aktwal na matukoy ang iyong sariling mga 1020 00:44:53,660 --> 00:44:57,530 mga uri ng data na ay hindi umiiral ang taon ang nakalipas pero na nababagay sa iyong mga layunin. 1021 00:44:57,530 --> 00:45:01,910 At kaya dito, sa linya 13 sa pamamagitan ng 19, kami ay deklarasyon ng isang bagong uri ng data, tulad ng 1022 00:45:01,910 --> 00:45:04,320 isang int, ngunit pagtawag ito mag-aaral. 1023 00:45:04,320 --> 00:45:09,310 At sa loob ng mga variable na ito ay pagpunta sa maging tatlong bagay - sa isang int, isang string, 1024 00:45:09,310 --> 00:45:09,930 at isang string. 1025 00:45:09,930 --> 00:45:13,040 Kaya maaari mong isipin kung ano ang talagang nangyari dito, kahit na ito ay isang 1026 00:45:13,040 --> 00:45:17,160 bit ng isang pagpapagaan para sa araw, mag-aaral ay isang mahalagang pagpunta 1027 00:45:17,160 --> 00:45:19,450 upang magmukhang ganito. 1028 00:45:19,450 --> 00:45:22,580 Ang pagpunta sa maging isang tipak ng memory sa isang ID, pangalan ng 1029 00:45:22,580 --> 00:45:25,580 field, at isang bahay na patlang. 1030 00:45:25,580 --> 00:45:30,670 At magagawa naming gamitin ang mga chunks ng memorya at i-access ang mga ito tulad ng sumusunod. 1031 00:45:30,670 --> 00:45:38,870 >> Kung pumunta ako sa struct0.c, dito ay isang medyo mahaba, ngunit ang pagsunod sa isang 1032 00:45:38,870 --> 00:45:42,630 pattern, ng code na Ginagamit ang bagong bilis ng kamay. 1033 00:45:42,630 --> 00:45:45,790 Kaya una sa lahat, ipaalam sa akin gumuhit ng iyong pansin sa mga kagiliw-giliw na mga bahagi up tuktok. 1034 00:45:45,790 --> 00:45:49,670 Biglang tumutukoy sa mga mag-aaral 3, declares isang pare-pareho na tinatawag na mag-aaral at pinaglaanan 1035 00:45:49,670 --> 00:45:53,450 mang ito ang bilang 3, lamang kaya Mayroon akong tatlong mga mag-aaral gamit 1036 00:45:53,450 --> 00:45:54,830 ang program na ito para sa ngayon. 1037 00:45:54,830 --> 00:45:55,960 Narito pagdating Main. 1038 00:45:55,960 --> 00:45:58,860 At notice, paano ko idedeklara isang array ng mga mag-aaral? 1039 00:45:58,860 --> 00:46:00,480 Well, ko lang gamitin ang parehong syntax. 1040 00:46:00,480 --> 00:46:02,110 Ang salitang mag-aaral ay malinaw naman bagong. 1041 00:46:02,110 --> 00:46:04,790 Ngunit mag-aaral, klase, mga mag-aaral bracket. 1042 00:46:04,790 --> 00:46:06,720 >> Kaya sa kasamaang palad, mayroong maraming isang ng muling paggamit ng mga terminong ginamit dito. 1043 00:46:06,720 --> 00:46:07,660 Ito ay lamang ng isang numero. 1044 00:46:07,660 --> 00:46:09,040 Kaya ito ay tulad ng sinasabi ng tatlo. 1045 00:46:09,040 --> 00:46:11,430 Class ay lamang kung ano ang gusto ko upang tawagan ang variable. 1046 00:46:11,430 --> 00:46:12,840 Kaya kong tumawag ito mag-aaral. 1047 00:46:12,840 --> 00:46:15,880 Ngunit klase, ito ay hindi isang klase sa isang bagay na nakatuon sa Java na uri ng paraan. 1048 00:46:15,880 --> 00:46:17,220 Ito ay lamang ng isang klase ng mga mag-aaral. 1049 00:46:17,220 --> 00:46:20,590 At ang uri ng data ng bawat elemento sa array na ay mag-aaral. 1050 00:46:20,590 --> 00:46:23,040 Kaya ito ay isang maliit na iba't ibang at mula sa sinasabi ng isang bagay 1051 00:46:23,040 --> 00:46:25,250 tulad nito, ito lamang ay - 1052 00:46:25,250 --> 00:46:29,500 Ako sinasabi ninyo akong bigyan ng tatlong mag-aaral at tumawag na array klase. 1053 00:46:29,500 --> 00:46:29,800 >> Ayos lang. 1054 00:46:29,800 --> 00:46:30,680 Ngayon narito ang isang apat na loop. 1055 00:46:30,680 --> 00:46:33,480 Ang pamilyar na lalaki ni - umulit mula sa zero hanggang sa tatlong. 1056 00:46:33,480 --> 00:46:35,160 At narito ang mga bagong piraso ng syntax. 1057 00:46:35,160 --> 00:46:37,710 Ang programa ang nangyayari upang i-prompt sa akin, ang tao, upang bigyan ito ng isang mag-aaral 1058 00:46:37,710 --> 00:46:39,200 ID, na kung saan ay sa isang int. 1059 00:46:39,200 --> 00:46:44,650 At narito ang syntax na kung saan maaari kang mag-imbak ng isang bagay sa ID patlang sa 1060 00:46:44,650 --> 00:46:48,630 lokasyon klase bracket I. Kaya syntax na ito ay hindi bago. 1061 00:46:48,630 --> 00:46:51,450 Ito ay nangangahulugan lamang ninyo akong bigyan ang pangwalo mag-aaral sa klase. 1062 00:46:51,450 --> 00:46:52,940 Ngunit simbolo na ito ay bago. 1063 00:46:52,940 --> 00:46:56,320 Up hanggang ngayon, kami ay hindi maaaring ginamit na tuldok, hindi bababa sa code na tulad nito. 1064 00:46:56,320 --> 00:47:01,490 Nangangahulugan itong pumunta sa struct kilala bilang isang mag-aaral at maglagay ng isang bagay doon. 1065 00:47:01,490 --> 00:47:05,670 Katulad nito, sa susunod na linya, 31, pumunta Magpatuloy at ilagay ang kahit anong user ang mga uri 1066 00:47:05,670 --> 00:47:10,530 para sa isang pangalan dito at kung ano ang ginagawa nila para sa isang bahay, ang parehong bagay, sige at 1067 00:47:10,530 --> 00:47:13,230 ilagay ito sa. bahay. 1068 00:47:13,230 --> 00:47:15,955 >> Kaya kung ano ang program na ito sa huli gawin? 1069 00:47:15,955 --> 00:47:17,220 Maaari mong makita ang isang maliit na teaser doon. 1070 00:47:17,220 --> 00:47:24,780 Hayaan akong sige at huwag gumawa structs 0 dot slash struct 0, mag-aaral ID 1, 1071 00:47:24,780 --> 00:47:28,250 sabihin David Mather, mag-aaral ID 2. 1072 00:47:28,250 --> 00:47:32,070 Rob Kirkland, mag-aaral ID 3. 1073 00:47:32,070 --> 00:47:35,010 Lauren Leverit - 1074 00:47:35,010 --> 00:47:38,380 at ang tanging bagay na programa na ito ginawa, na kung saan ay ganap lamang arbitrary, ay 1075 00:47:38,380 --> 00:47:40,980 Nais kong gawin ang isang bagay na may data na ito, ngayon na ko na nagturo sa amin kung paano 1076 00:47:40,980 --> 00:47:43,450 gamitin structs, ay ko lang nagkaroon ito dagdag loop dito. 1077 00:47:43,450 --> 00:47:45,260 Umulit ako sa ibabaw ng hanay ng mga mag-aaral. 1078 00:47:45,260 --> 00:47:49,170 Ginamit ko ang aming, marahil ngayon pamilyar na kaibigan, ihambing ang string, stircomp sa 1079 00:47:49,170 --> 00:47:53,780 tseke ay bahay-8 ng mag-aaral katumbas ng Mather? 1080 00:47:53,780 --> 00:47:56,760 At kung kaya, i-print lamang ng isang bagay mang gusto, oo, ito ay. 1081 00:47:56,760 --> 00:47:59,430 Ngunit muli, lamang ang pagbibigay sa akin mga pagkakataon gamitin at muling gamitin at 1082 00:47:59,430 --> 00:48:02,270 muling gamitin ang bagong notation tuldok. 1083 00:48:02,270 --> 00:48:03,250 >> Kaya kung sino ang nagmamalasakit, tama? 1084 00:48:03,250 --> 00:48:06,270 Pagdating up sa isang programa ng mag-aaral ay medyo arbitrary, ngunit ito lumiliko out 1085 00:48:06,270 --> 00:48:09,800 na maaari naming gawin kapaki-pakinabang na bagay sa ito, halimbawa tulad ng sumusunod. 1086 00:48:09,800 --> 00:48:14,600 Ito ay isang mas kumplikadong struct sa C. Ito ay nakuha ng isang dosena o higit pang mga patlang, 1087 00:48:14,600 --> 00:48:15,880 medyo cryptically pinangalanan. 1088 00:48:15,880 --> 00:48:20,110 Ngunit kung sakaling mo na narinig ng isang graphics format ng file na tinatawag na bitmap, BMP, ito 1089 00:48:20,110 --> 00:48:22,830 lumiliko out na ang bitmap format ng file medyo magkano Mukhang na ito. 1090 00:48:22,830 --> 00:48:24,200 Ito ay isang maliit na nakababagod SMILEY mukha. 1091 00:48:24,200 --> 00:48:27,840 Ito ay isang maliit na larawan ko na naka-zoom in sa medyo malaki upang ang maaari kong makita ang bawat 1092 00:48:27,840 --> 00:48:30,410 ng indibidwal na mga tuldok o pixels. 1093 00:48:30,410 --> 00:48:33,800 Ngayon, ito lumiliko out maaari naming kumakatawan sa isang itim na tuldok sa, sabihin nating, ang bilang 0. 1094 00:48:33,800 --> 00:48:35,520 At isang puting tuldok na kasama ang numero 1. 1095 00:48:35,520 --> 00:48:39,140 >> Kaya sa ibang salita, kung nais mong upang gumuhit ng isang SMILEY mukha at i-save ang imaheng iyon sa isang 1096 00:48:39,140 --> 00:48:42,680 computer, ito suffices upang mag-imbak at mga zero buhay na ganito ang hitsura, kung saan, 1097 00:48:42,680 --> 00:48:45,250 muli, alin ang puti at mga zero ay mga itim. 1098 00:48:45,250 --> 00:48:48,290 At sama-sama, kung mabisa mong magkaroon isang magbigkis ng mga bago at mga zero, mayroon kang isang 1099 00:48:48,290 --> 00:48:51,030 grid ng pixels, at kung ikaw lay out ang mga ito, mayroon kang isang nakatutuwa 1100 00:48:51,030 --> 00:48:52,560 maliit SMILEY mukha. 1101 00:48:52,560 --> 00:48:58,150 Ngayon, bitmap format ng file, BMP, ay epektibo na sa ilalim ng hood, 1102 00:48:58,150 --> 00:49:00,970 ngunit may higit pang mga pixel maglalasing ka na Maaari aktwal na kumakatawan sa mga kulay. 1103 00:49:00,970 --> 00:49:05,170 >> Ngunit kapag mayroon kang higit pang mga kumplikadong format ng file tulad ng BMP at JPEG at GIF 1104 00:49:05,170 --> 00:49:09,360 kung saan maaari kang maging pamilyar, mga mga file sa disk ay karaniwang hindi lamang 1105 00:49:09,360 --> 00:49:13,760 may mga zero at mga bago para sa pixels, ngunit mayroon silang ilang metadata pati na rin - 1106 00:49:13,760 --> 00:49:16,960 meta sa kamalayan na hindi talaga data ngunit ito ay kapaki-pakinabang na magkaroon. 1107 00:49:16,960 --> 00:49:21,370 Kaya mga patlang na ito dito ay nagpapahiwatig, at ipapakita namin makita ito nang mas detalyado sa P-set 1108 00:49:21,370 --> 00:49:25,810 5, na bago ang mga zero at mga bago na Kumakatawan sa mga pixel sa isang imahe, 1109 00:49:25,810 --> 00:49:29,110 mayroong isang bungkos ng metadata tulad ng ang laki ng mga imahe at mga 1110 00:49:29,110 --> 00:49:30,250 lapad ng imahe. 1111 00:49:30,250 --> 00:49:32,910 At mapansin ako plucking off ang ilang mga arbitrary bagay dito - 1112 00:49:32,910 --> 00:49:34,260 lapad at taas. 1113 00:49:34,260 --> 00:49:36,160 Bit bilang at ilang iba pang mga bagay. 1114 00:49:36,160 --> 00:49:37,840 Kaya mayroong ilang mga metadata sa isang file. 1115 00:49:37,840 --> 00:49:41,470 >> Ngunit sa pamamagitan ng pag-unawa kung paano ang mga file ay inilatag out sa paraang ito, maaari mo talaga 1116 00:49:41,470 --> 00:49:45,890 pagkatapos ay manipulahin ang mga imahe, mga larawan mabawi mula sa disk, palitan ang laki larawan. 1117 00:49:45,890 --> 00:49:47,560 Ngunit hindi ka maaari kinakailangang paghusayin ang mga ito. 1118 00:49:47,560 --> 00:49:48,480 Kailangan ko isang larawan. 1119 00:49:48,480 --> 00:49:52,840 Kaya nagpunta ako pabalik sa RJ dito, sino na nakita mo sa screen pa ng ilang oras ang nakalipas. 1120 00:49:52,840 --> 00:49:57,160 At kung ako buksan up pangunahing tono dito, ito ay kung ano ang mangyayari kung susubukan mo upang mag-zoom in at 1121 00:49:57,160 --> 00:49:59,380 paghusayin RJ. 1122 00:49:59,380 --> 00:50:01,480 Hindi siya ay nakakakuha ng anumang mas mahusay na talaga. 1123 00:50:01,480 --> 00:50:06,240 Ngayon ay pangunahing tono uri ng blurring ito ng Medyo, lamang upang pagtakpan ang 1124 00:50:06,240 --> 00:50:11,040 katotohanan na RJ ay hindi makakuha ng partikular na pinahusay na kapag nag-zoom in 1125 00:50:11,040 --> 00:50:13,310 At kung gawin ito sa ganitong paraan, makita ang mga parisukat? 1126 00:50:13,310 --> 00:50:15,490 Oo, maaari mong makita Talagang ang mga parisukat sa isang projector. 1127 00:50:15,490 --> 00:50:17,690 >> Iyon ay kung ano ang makakuha ka kapag mo mapapahusay. 1128 00:50:17,690 --> 00:50:22,570 Ngunit sa pag-unawa kung paano ang aming RJ o ang SMILEY mukha ay ipinatupad ay ipaalam sa amin 1129 00:50:22,570 --> 00:50:24,950 talaga magsulat code na manipulates mga bagay na ito. 1130 00:50:24,950 --> 00:50:29,970 At naisip ko na gusto kong magtapos sa talang ito, may 55 segundo ng isang pagandahin na, 1131 00:50:29,970 --> 00:50:31,230 Maglakas-loob ko, sabihin sa halip nakaliligaw. 1132 00:50:31,230 --> 00:50:32,990 >> [Video playback] 1133 00:50:32,990 --> 00:50:34,790 >> -Siya'y nakahiga. 1134 00:50:34,790 --> 00:50:38,310 Tungkol sa ano, hindi ko alam. 1135 00:50:38,310 --> 00:50:41,200 >> -Kaya ano ang gagawin namin malaman? 1136 00:50:41,200 --> 00:50:45,280 >> -Iyon sa 09:15 Ray Santoya noon ay sa ATM. 1137 00:50:45,280 --> 00:50:47,830 >> -Kaya ang tanong ay kung ano ang ay siya ang paggawa sa 9:16? 1138 00:50:47,830 --> 00:50:50,750 >> -Shooting ang siyam milimetro sa isang bagay. 1139 00:50:50,750 --> 00:50:52,615 Siguro nakita niya ang mamamaril na nakatago. 1140 00:50:52,615 --> 00:50:54,760 >> -O kaya ay nagtatrabaho kasama niya. 1141 00:50:54,760 --> 00:50:56,120 >> -Maghintay. 1142 00:50:56,120 --> 00:50:57,450 Bumalik isa. 1143 00:50:57,450 --> 00:50:58,700 >> -Ano ang gagawin mo makita? 1144 00:50:58,700 --> 00:51:05,530 1145 00:51:05,530 --> 00:51:09,490 >> -Dalhin sa kanyang mukha up, full screen. 1146 00:51:09,490 --> 00:51:09,790 >> -Ang kanyang baso. 1147 00:51:09,790 --> 00:51:11,040 >> -Mayroon isang panganganinag. 1148 00:51:11,040 --> 00:51:21,790 1149 00:51:21,790 --> 00:51:23,520 >> -Iyan ang koponan Neuvitas baseball. 1150 00:51:23,520 --> 00:51:24,530 Iyon ang kanilang logo. 1151 00:51:24,530 --> 00:51:27,040 >> -At ang kanyang pakikipag-usap sa kung sinuman ang suot na jacket. 1152 00:51:27,040 --> 00:51:27,530 >> [END-playback ng video] 1153 00:51:27,530 --> 00:51:29,180 >> David J. MALAN: Ito kalooban maging Problema Set 5. 1154 00:51:29,180 --> 00:51:30,720 Kami ay makita mo sa susunod na linggo. 1155 00:51:30,720 --> 00:51:32,330 >> MALE Tagapagsalita: Sa susunod na CS50. 1156 00:51:32,330 --> 00:51:39,240 >> [CRICKETS CHIRPING] 1157 00:51:39,240 --> 00:51:41,270 >> [Nagpe-play ng musika]