1 00:00:00,000 --> 00:00:03,381 >> [MUSIC nagpe-play] 2 00:00:03,381 --> 00:00:10,626 3 00:00:10,626 --> 00:00:11,610 >> [Playback ng video] 4 00:00:11,610 --> 00:00:13,640 >> -Siya Ay nakahiga. 5 00:00:13,640 --> 00:00:14,380 >> -Tungkol saan? 6 00:00:14,380 --> 00:00:17,182 >> -Hindi Ko alam. 7 00:00:17,182 --> 00:00:19,990 >> -Kaya Kung ano ang alam namin? 8 00:00:19,990 --> 00:00:23,145 >> -na Sa ganap na 9:15, Ray Santoya ay sa ATM. 9 00:00:23,145 --> 00:00:23,644 -Yeah. 10 00:00:23,644 --> 00:00:27,030 Kaya ang tanong ay, kung ano ang ang ginagawa niya sa 9:16? 11 00:00:27,030 --> 00:00:29,720 >> -Shooting Ang 9 milimetro sa isang bagay. 12 00:00:29,720 --> 00:00:31,540 Siguro nakita niya ang sniper. 13 00:00:31,540 --> 00:00:33,412 >> -O Ay nagtatrabaho sa kanya. 14 00:00:33,412 --> 00:00:34,340 >> -Maghintay. 15 00:00:34,340 --> 00:00:36,200 Bumalik isa. 16 00:00:36,200 --> 00:00:36,975 >> -Ano ang nakikita mo? 17 00:00:36,975 --> 00:00:44,400 18 00:00:44,400 --> 00:00:47,805 >> -Bring Kanyang mukha up full screen. 19 00:00:47,805 --> 00:00:48,680 >> -Ang Kanyang baso. 20 00:00:48,680 --> 00:00:50,060 >> -Mayroong Isang pagmuni-muni. 21 00:00:50,060 --> 00:01:00,455 22 00:01:00,455 --> 00:01:02,280 >> -Ito Ay ang koponan ng baseball Nuevitas. 23 00:01:02,280 --> 00:01:03,110 Iyon ang kanilang logo. 24 00:01:03,110 --> 00:01:05,820 >> -At Ang pakikipag-usap niya sa kung sinuman ang may suot na jacket. 25 00:01:05,820 --> 00:01:06,670 >> [END playback] 26 00:01:06,670 --> 00:01:07,628 >> David MALAN: Lahat ng karapatan. 27 00:01:07,628 --> 00:01:11,210 Ito ay CS50 at ito ay medyo mas ng [hindi marinig] na kung saan ikaw ay 28 00:01:11,210 --> 00:01:12,890 dabbling sa hanay ng problema apat. 29 00:01:12,890 --> 00:01:16,606 Ngayon namin simulan upang tumingin ng kaunti pa malalim sa mga bagay na ito na tinatawag na mga payo, 30 00:01:16,606 --> 00:01:18,480 na kahit na ito ay isang pretty arcane topic, 31 00:01:18,480 --> 00:01:20,813 ito ay lumiliko out na ito ay pagpunta na ang paraan kung saan tayo 32 00:01:20,813 --> 00:01:24,320 maaari simulan ang pagbuo at assembling higit na mas sopistikadong mga programa. 33 00:01:24,320 --> 00:01:28,150 Pero ginawa namin ito sa huling Miyerkules sa pamamagitan ng paraan ng ilang claymation unang. 34 00:01:28,150 --> 00:01:30,190 Kaya ito, pagpapabalik, ay Binky at ginagamit namin siya 35 00:01:30,190 --> 00:01:33,148 upang tingnan ang isang programa na ay hindi talagang gawin kagiliw-giliw na kahit ano, 36 00:01:33,148 --> 00:01:34,950 ngunit ito ay magbunyag ng ilang mga problema. 37 00:01:34,950 --> 00:01:38,570 Kaya upang simulan ang araw na ito, kung bakit hindi namin maglakad mabilis sa pamamagitan ng ilang sa mga hakbang na ito, 38 00:01:38,570 --> 00:01:41,920 subukan upang distill sa mga tuntunin ng tao ni kung ano mismo ang nangyayari sa dito 39 00:01:41,920 --> 00:01:45,410 at kung bakit ito ay masama, at pagkatapos ay ilipat sa at talagang simulan ang paggawa ng isang bagay 40 00:01:45,410 --> 00:01:46,309 sa diskarteng ito? 41 00:01:46,309 --> 00:01:48,350 Kaya ang mga ito ay ang unang dalawang linya sa programang ito 42 00:01:48,350 --> 00:01:51,340 at sa mga tuntunin ng karaniwang tao, kung ano ang ginagawa ito ng dalawang mga linya? 43 00:01:51,340 --> 00:01:55,600 May isang tao kung sino ang makatwirang maginhawa sa kung ano ang ipinahayag sa screen? 44 00:01:55,600 --> 00:01:58,340 45 00:01:58,340 --> 00:02:00,120 Ano ang mga ito ng dalawang linya ng paggawa? 46 00:02:00,120 --> 00:02:02,070 Ito ay hindi lahat na naiiba mula sa isang linggo, 47 00:02:02,070 --> 00:02:03,611 ngunit may ilang bagong mga espesyal na simbolo. 48 00:02:03,611 --> 00:02:04,152 Oo? 49 00:02:04,152 --> 00:02:05,628 Bumalik doon. 50 00:02:05,628 --> 00:02:07,092 >> Madla: pagdeklara ng payo? 51 00:02:07,092 --> 00:02:08,050 David MALAN: Sabihing muli? 52 00:02:08,050 --> 00:02:08,860 Madla: pagdeklara ng payo? 53 00:02:08,860 --> 00:02:11,776 David MALAN: Ang pagdeklara ng payo at pinuhin ang mga ito ng isang maliit na kaunti pang ipaalam. 54 00:02:11,776 --> 00:02:14,050 Madla: [hindi marinig] address x at pagkatapos ay y. 55 00:02:14,050 --> 00:02:15,300 David MALAN: At pagkatapos ay address. 56 00:02:15,300 --> 00:02:18,550 Kaya partikular kung anong ginagawa namin ay deklarasyon kami ay dalawang variable. 57 00:02:18,550 --> 00:02:21,252 Ang mga variable, bagaman, ay pagpunta na ng uri int star, na kung saan 58 00:02:21,252 --> 00:02:23,210 higit na partikular ay nangangahulugan sila ay pagpunta sa tindahan 59 00:02:23,210 --> 00:02:26,450 ang address ng isang int, ayon sa pagkakabanggit, x at y. 60 00:02:26,450 --> 00:02:27,660 Ngayon ay may anumang mga halaga? 61 00:02:27,660 --> 00:02:32,621 Mayroon bang anumang mga aktwal na mga address sa mga dalawang variable sa puntong ito sa oras? 62 00:02:32,621 --> 00:02:33,120 Hindi. 63 00:02:33,120 --> 00:02:35,030 Ito lang ang mga tinatawag na mga halaga ng basura. 64 00:02:35,030 --> 00:02:38,120 Kung hindi mo talaga magtalaga ng isang variable, anumang ay sa RAM 65 00:02:38,120 --> 00:02:42,224 dati ay pagpunta upang punan na may mga zero at pareho ng mga variable na iyan. 66 00:02:42,224 --> 00:02:44,140 Ngunit kami ay hindi pa alam ano ang mga ito at na ang 67 00:02:44,140 --> 00:02:47,060 magiging susi sa kung bakit Binky nawala ang kanyang ulo noong nakaraang linggo. 68 00:02:47,060 --> 00:02:49,980 >> Kaya ito ay ang claymation pagkakatawang-tao ng mga ito 69 00:02:49,980 --> 00:02:53,580 kung saan ikaw ay may mga variable ay dalawa lamang, maliit na bilog na piraso ng putik, 70 00:02:53,580 --> 00:02:57,330 na maaaring tindahan ng variable, ngunit bilang Iminumungkahi ang mga abala arrow, 71 00:02:57,330 --> 00:03:00,640 hindi sila ay tunay na tumuturo sa kahit saan kilala per se. 72 00:03:00,640 --> 00:03:03,670 Kaya pagkatapos namin ang linyang ito, at ito ay bago sa nakaraang linggo, malloc para sa memory 73 00:03:03,670 --> 00:03:07,130 laang-gugulin, na kung saan ay lamang ng isang magarbong paraan ng pagsabi ng operating system, Linux 74 00:03:07,130 --> 00:03:09,750 o Mac OS o Windows, hey, bigyan ako ng ilang memory, 75 00:03:09,750 --> 00:03:11,780 at ang kailangan mo upang sabihin sa mga operating system 76 00:03:11,780 --> 00:03:14,699 ay kung ano kapag humihingi ito para sa memory. 77 00:03:14,699 --> 00:03:16,990 Ito ay hindi pagpunta sa pag-aalaga kung ano ang ikaw ay pagpunta sa gawin sa mga ito, 78 00:03:16,990 --> 00:03:19,786 ngunit kailangan mong gawin upang sabihin sa mga operating sistema kung ano ang sa pamamagitan ng paraan ng malloc. 79 00:03:19,786 --> 00:03:20,286 Oo? 80 00:03:20,286 --> 00:03:21,078 >> Madla: Magkano? 81 00:03:21,078 --> 00:03:21,994 David MALAN: Magkano? 82 00:03:21,994 --> 00:03:25,280 Magkano sa bytes, at sa gayon, ito, muli, isang contrived halimbawa, sinasabi lang, 83 00:03:25,280 --> 00:03:27,360 bigyan ako ang laki ng isang int. 84 00:03:27,360 --> 00:03:30,550 Ngayon, ang laki ng isang int ay apat na bytes o 32 bits. 85 00:03:30,550 --> 00:03:32,850 Kaya ito ay isang paraan ng na nagsasabi, hey, operating system, 86 00:03:32,850 --> 00:03:37,290 bigyan ako ng apat na bytes ng memory na maaari kong gamitin sa aking itapon, 87 00:03:37,290 --> 00:03:40,560 at partikular, kung ano ang ginagawa malloc return na may paggalang 88 00:03:40,560 --> 00:03:41,795 sa na tipak ng apat na bytes? 89 00:03:41,795 --> 00:03:44,110 90 00:03:44,110 --> 00:03:44,860 Madla: Address? 91 00:03:44,860 --> 00:03:45,901 David MALAN: Ang address. 92 00:03:45,901 --> 00:03:47,580 Ang address ng na tipak ng apat na bytes. 93 00:03:47,580 --> 00:03:48,190 Mismong. 94 00:03:48,190 --> 00:03:51,430 At kaya na kung ano ang naka-imbak sa huli sa x at iyon ang dahilan kung bakit hindi namin talagang 95 00:03:51,430 --> 00:03:55,240 aalaga kung ano ang bilang ng mga na address ay, kung ito ay OX1 o OX2 96 00:03:55,240 --> 00:03:57,110 o ilang misteryosong hexadecimal address. 97 00:03:57,110 --> 00:03:59,850 Pinapahalagahan namin lamang pictorially na x na variable ay ngayon 98 00:03:59,850 --> 00:04:01,630 tumuturo sa na tipak ng memory. 99 00:04:01,630 --> 00:04:05,570 Kaya ang arrow ay kumakatawan sa isang pointer, o higit na partikular, ang isang memory address. 100 00:04:05,570 --> 00:04:09,120 Ngunit muli, hindi namin kadalasang pinapahalagahan kung ano ang mga tunay na mga address ay. 101 00:04:09,120 --> 00:04:11,780 Ngayon, sinasabi ang linyang ito ano sa mga tuntunin ng karaniwang tao? 102 00:04:11,780 --> 00:04:14,330 Star x nakakakuha ng 42 semicolon. 103 00:04:14,330 --> 00:04:17,390 Ano ang ibig sabihin nito? 104 00:04:17,390 --> 00:04:18,200 Gusto mong pumunta? 105 00:04:18,200 --> 00:04:20,102 Huwag scratch iyong leeg. 106 00:04:20,102 --> 00:04:22,360 >> Madla: Ang address ng x ay nasa 42. 107 00:04:22,360 --> 00:04:24,300 >> David MALAN: Ang address ng x ay 42. 108 00:04:24,300 --> 00:04:25,190 Hindi masyado. 109 00:04:25,190 --> 00:04:28,485 Kaya malapit, ngunit hindi pa, dahil mayroong ang bituin na prefixing ito x. 110 00:04:28,485 --> 00:04:29,860 Kaya kailangan namin upang mag-tweak ng kaunti. 111 00:04:29,860 --> 00:04:31,032 Oo? 112 00:04:31,032 --> 00:04:36,044 >> Madla: Ang halaga na ang pointer x ay tumuturo sa ay 42. 113 00:04:36,044 --> 00:04:36,710 David MALAN: OK. 114 00:04:36,710 --> 00:04:40,840 Ang halaga na ang pointer x ay tumuturo sa, sabihin nating, ay magiging 42, 115 00:04:40,840 --> 00:04:44,165 o maglagay ng isa pang paraan, ang star x sabi, pumunta sa kahit anong address 116 00:04:44,165 --> 00:04:48,340 ay nasa x, maging ito man ay 1 Oxford Street o 33 Oxford Street 117 00:04:48,340 --> 00:04:51,850 o OX1 o ox33, ano man na numeric address ay, 118 00:04:51,850 --> 00:04:54,380 star x ay ang dereferencing ng x. 119 00:04:54,380 --> 00:04:57,297 Kaya pumunta sa address na iyon at pagkatapos ay ilagay ang numero ng 42 doon. 120 00:04:57,297 --> 00:04:59,380 Kaya na ay magiging isang katumbas paraan ng pagsasabi na. 121 00:04:59,380 --> 00:05:01,860 Kaya na ang lahat ng multa at pagkatapos ay Gusto namin ang kumakatawan sa mga larawan 122 00:05:01,860 --> 00:05:05,370 sumusunod na kung saan namin nagdagdag ang 42 na na tipak ng apat 123 00:05:05,370 --> 00:05:09,370 bytes sa kanang gilid, ngunit ang linyang ito ay kung saan nagpunta ang mga bagay magkagulo 124 00:05:09,370 --> 00:05:11,120 at tumuloy Binky pop off sa puntong ito, 125 00:05:11,120 --> 00:05:15,290 dahil masamang bagay na mangyayari kapag mong dereference mga halaga ng basura 126 00:05:15,290 --> 00:05:18,210 o ikaw dereference hindi balidong payo, at sinasabi ko hindi balidong 127 00:05:18,210 --> 00:05:21,020 dahil sa puntong ito sa mga kuwento, ano ang nasa loob ng y? 128 00:05:21,020 --> 00:05:24,440 Ano ang halaga ng y batay sa nakalipas na ilang mga hakbang? 129 00:05:24,440 --> 00:05:25,360 Oo? 130 00:05:25,360 --> 00:05:26,115 Ano yan? 131 00:05:26,115 --> 00:05:26,990 >> Madla: Isang address. 132 00:05:26,990 --> 00:05:28,460 David MALAN: Isang address. 133 00:05:28,460 --> 00:05:31,910 Ito ay dapat na isang address ngunit initialize ko ito? 134 00:05:31,910 --> 00:05:32,800 Kaya hindi pa ako. 135 00:05:32,800 --> 00:05:35,430 Kaya kung ano ay kilala na maging doon? 136 00:05:35,430 --> 00:05:37,590 Ito lamang ang ilang mga halaga ng basura. 137 00:05:37,590 --> 00:05:41,500 Ito ay maaaring maging anumang mga address mula sa zero sa 2 bilyon kung mayroon kang dalawang gig ng RAM, 138 00:05:41,500 --> 00:05:44,289 o zero na 4 na bilyon kung na sa iyo Nakakuha apat na gigabytes ng RAM. 139 00:05:44,289 --> 00:05:46,080 Ito ay ilang mga halaga ng basura, ngunit ang problema ay 140 00:05:46,080 --> 00:05:48,200 na ang mga operating system, kung hindi ito ay nagbigay sa iyo 141 00:05:48,200 --> 00:05:51,140 na tipak ng memorya na sadyang na sinusubukan mong pumunta sa, 142 00:05:51,140 --> 00:05:54,650 pangkalahatan ito ay pagpunta sa maging sanhi ng kung ano ang nasaksihan namin bilang segmentation fault. 143 00:05:54,650 --> 00:05:57,810 Kaya sa katunayan, ang sinuman sa inyo na magkaroon ng nahirapan sa mga problema sa oras ng opisina 144 00:05:57,810 --> 00:06:00,393 o sa mga problema na mas Sa pangkalahatan ay may sinusubukan mong malaman 145 00:06:00,393 --> 00:06:02,150 ng segmentation fault, na karaniwan ay nangangahulugan 146 00:06:02,150 --> 00:06:05,017 ka ng pagpindot ng isang segment ng memory na hindi mo dapat. 147 00:06:05,017 --> 00:06:07,350 Ikaw ay pagpindot ng memorya na ang mga operating system ay hindi 148 00:06:07,350 --> 00:06:10,450 pinapayagan ka na hawakan, kung ito ay sa pamamagitan ng pagpunta masyadong malayo sa iyong array 149 00:06:10,450 --> 00:06:12,870 o simula ngayon, kung ito ay dahil ikaw ay pagpindot 150 00:06:12,870 --> 00:06:14,780 memory na lamang ay ang ilang mga halaga ng basura. 151 00:06:14,780 --> 00:06:18,230 >> Kaya ginagawa star x dito ay uri ng hindi natukoy na pag-uugali. 152 00:06:18,230 --> 00:06:22,030 Hindi ka dapat gawin ito dahil logro ay, ang programa lang ang pagpunta sa crash, 153 00:06:22,030 --> 00:06:24,050 dahil ikaw ay nagsasabi, pumunta sa address na ito 154 00:06:24,050 --> 00:06:27,000 at wala kang mga ideya kung saan address na talagang. 155 00:06:27,000 --> 00:06:30,300 Kaya ang operating system ay malamang pagpunta sa crash ang iyong programa 156 00:06:30,300 --> 00:06:33,840 bilang isang resulta at sa katunayan, iyon kung ano ang nangyari doon sa Binky. 157 00:06:33,840 --> 00:06:37,210 Kaya sa huli, Binky naayos ito problema sa mga ito. 158 00:06:37,210 --> 00:06:38,909 Kaya programa na mismo ay flawed. 159 00:06:38,909 --> 00:06:41,450 Ngunit kung ikaw uri ng sumulong at sa halip na maipatupad ang linyang ito, 160 00:06:41,450 --> 00:06:45,580 y katumbas x lamang nangangahulugan na anumang address ay isang x, ilagay din ito sa y. 161 00:06:45,580 --> 00:06:48,740 >> At kaya pictorially, na namin kinakatawan sa dalawang arrow 162 00:06:48,740 --> 00:06:51,570 mula sa x at mula y pagturo sa parehong lugar. 163 00:06:51,570 --> 00:06:55,760 Kaya semantically, x ay katumbas sa y dahil pareho ng mga 164 00:06:55,760 --> 00:07:00,300 ay nag-iimbak ang parehong address, samakatuwid tumuturo sa 42, 165 00:07:00,300 --> 00:07:04,910 at ngayon, kapag sinabi mong star y, pumunta sa address sa y, 166 00:07:04,910 --> 00:07:06,790 na ito ay may isang kagiliw-giliw na epekto. 167 00:07:06,790 --> 00:07:10,320 Kaya ang address sa y ay ang parehong bagay tulad ng address sa x. 168 00:07:10,320 --> 00:07:15,060 Kaya kung sabihin mo pumunta sa address sa y at baguhin ang halaga sa 13, 169 00:07:15,060 --> 00:07:17,140 sino pa ang apektado? 170 00:07:17,140 --> 00:07:21,100 X ay, point D, kaya na magsalita, dapat maaapektuhan rin. 171 00:07:21,100 --> 00:07:24,340 >> At sa katunayan, kung gaano Drew Nick ang larawang ito sa claymation ay eksakto na. 172 00:07:24,340 --> 00:07:28,665 Kahit na sundin namin ang pointer y, napunta kami sa parehong lugar, 173 00:07:28,665 --> 00:07:32,780 at iba kung tayo ay upang i-print out x o pointee y ni, 174 00:07:32,780 --> 00:07:35,720 pagkatapos ay namin makita ang halaga na 13. 175 00:07:35,720 --> 00:07:37,927 Ngayon, sinasabi ko pointee na maging pare-pareho sa video. 176 00:07:37,927 --> 00:07:39,760 Programmer, sa aking kaalaman, hindi talaga 177 00:07:39,760 --> 00:07:42,460 sabihin ang salita pointee, na kung saan ay tulis 178 00:07:42,460 --> 00:07:44,650 sa, ngunit para sa pagkakapare-pareho may mga video, mapagtanto 179 00:07:44,650 --> 00:07:47,520 na ang lahat na noon ay sinadya sa na sitwasyon. 180 00:07:47,520 --> 00:07:54,190 Kaya ang anumang mga katanungan sa claymation o payo o malloc pa lang? 181 00:07:54,190 --> 00:07:54,850 Hindi? 182 00:07:54,850 --> 00:07:55,470 Lahat tama. 183 00:07:55,470 --> 00:07:58,560 >> Kaya nang walang karagdagang ado, sabihin kumuha ng isang pagtingin 184 00:07:58,560 --> 00:08:00,700 sa kung saan ito ay may tunay na ito ay ginagamit para sa ilang oras. 185 00:08:00,700 --> 00:08:03,580 Kaya mayroon kaming ito CS50 library na nakuha ang lahat ng mga function. 186 00:08:03,580 --> 00:08:06,810 Ginamit namin ang GetInt ng maraming, GetString, marahil GetLongLong mas maaga 187 00:08:06,810 --> 00:08:09,840 sa aking Pset isa o kaya, ngunit kung ano ang aktwal na nangyayari? 188 00:08:09,840 --> 00:08:12,920 Well, sabihin kumuha ng isang mabilis na pagtingin ilalim ng hood sa isang programa na 189 00:08:12,920 --> 00:08:17,017 binibigyang inspirasyon kung bakit namin sa iyo ang CS50 library, at sa katunayan bilang ng nakaraang linggo, 190 00:08:17,017 --> 00:08:18,850 sinimulan namin ang pagkuha ng mga training wheels off. 191 00:08:18,850 --> 00:08:21,080 Kaya ito ay inayos ngayon ng isang postmortem ng kung ano ang 192 00:08:21,080 --> 00:08:23,690 may na-pagpunta sa sa loob ng CS50 library, 193 00:08:23,690 --> 00:08:27,250 kahit na ngayon ay magsisimula kami sa paglipat ang layo mula sa mga ito para sa karamihan ng mga programa. 194 00:08:27,250 --> 00:08:29,460 >> Kaya ito ay isang programa na tinatawag na scanf 0. 195 00:08:29,460 --> 00:08:30,510 Ito ay sobrang short. 196 00:08:30,510 --> 00:08:33,909 Ito lamang ay may mga linyang ito, ngunit ito nagpapakilala ng isang function na tinatawag na scanf 197 00:08:33,909 --> 00:08:36,909 na aktwal na kami ay pagpunta upang makita sa sa isang sandali sa loob ng CS50 library, 198 00:08:36,909 --> 00:08:38,600 kahit na sa isang bahagyang kakaibang paraan. 199 00:08:38,600 --> 00:08:41,330 Kaya ang program na ito sa 16 na linya ay deklarasyon ng variable x. 200 00:08:41,330 --> 00:08:43,150 Kaya bigyan ako ng apat na bytes para sa isang int. 201 00:08:43,150 --> 00:08:45,750 Ito ay nai-nagsasabi sa user, number please, at pagkatapos ay 202 00:08:45,750 --> 00:08:49,010 ito ay isang kagiliw-giliw na linya na talagang relasyon magkasama noong nakaraang linggo 203 00:08:49,010 --> 00:08:49,790 at ito. 204 00:08:49,790 --> 00:08:53,230 Scanf, at pagkatapos ay mapapansin ito ay tumatagal ng format string, tulad ng printf, 205 00:08:53,230 --> 00:08:57,480 % i nangangahulugang isang int, at pagkatapos ay tumatagal ito ng isang pangalawang argumento na kamukha ng kaunti 206 00:08:57,480 --> 00:08:58,260 funky. 207 00:08:58,260 --> 00:09:01,880 Ito ay ampersand x, at sa pagpapabalik, lamang nakita namin ito nang isang beses noong nakaraang linggo. 208 00:09:01,880 --> 00:09:03,465 Ano ang ampersand x kumakatawan? 209 00:09:03,465 --> 00:09:06,210 210 00:09:06,210 --> 00:09:08,450 Ano ang ampersand gawin sa C? 211 00:09:08,450 --> 00:09:08,950 Oo? 212 00:09:08,950 --> 00:09:10,024 >> Madla: Ang address ng. 213 00:09:10,024 --> 00:09:11,190 David MALAN: Ang address ng. 214 00:09:11,190 --> 00:09:13,190 Kaya ito ay ang kabaligtaran ng star operator, 215 00:09:13,190 --> 00:09:17,270 samantalang ang star operator sabi, pumunta sa address na ito, ang mga ampersand operator 216 00:09:17,270 --> 00:09:20,280 sabi, malaman kung ang address ng variable na ito, 217 00:09:20,280 --> 00:09:23,530 at sa gayon ito ay susi, dahil layunin scanf sa buhay 218 00:09:23,530 --> 00:09:26,320 ay upang i-scan ng gumagamit input mula sa keyboard, 219 00:09:26,320 --> 00:09:29,970 depende sa anumang siya mga uri, at pagkatapos ay basahin ang input ng user na iyon 220 00:09:29,970 --> 00:09:32,970 sa isang variable, ngunit hindi namin nakita sa nakalipas na dalawang linggo 221 00:09:32,970 --> 00:09:36,080 na na swap function na tayo Sinubukan walang kahirap-hirap na ipatupad 222 00:09:36,080 --> 00:09:37,110 ay nasira lamang. 223 00:09:37,110 --> 00:09:42,470 Alalahanin na may swap function, kung ipinahayag lang namin ng A at B bilang ints, 224 00:09:42,470 --> 00:09:47,040 Matagumpay namin ginawa swap ang dalawang variable sa loob ng swap 225 00:09:47,040 --> 00:09:50,080 gusto lang na may gatas at OJ, ngunit sa lalong madaling swap ibinalik, 226 00:09:50,080 --> 00:09:55,200 ano ang naging resulta na may paggalang sa x at y, ang orihinal na halaga? 227 00:09:55,200 --> 00:09:55,700 Wala. 228 00:09:55,700 --> 00:09:56,200 Oo. 229 00:09:56,200 --> 00:09:59,754 Walang nangyari oras na iyon, dahil swaps baguhin lamang nito sa mga lokal na mga kopya, 230 00:09:59,754 --> 00:10:01,670 na ang ibig sabihin, ang lahat ng oras na ito, sa tuwing hindi namin 231 00:10:01,670 --> 00:10:04,010 tinanggal ang pagpasa sa mga argumento sa mga pag-andar, hindi namin 232 00:10:04,010 --> 00:10:05,939 pagpasa lamang ng mga kopya ng mga argumento. 233 00:10:05,939 --> 00:10:07,980 Maaari mong gawin sa mga na kahit anong gusto mo sa kanila, 234 00:10:07,980 --> 00:10:10,890 pero ang mga ito ay pagpunta sa may walang epekto sa mga orihinal na halaga. 235 00:10:10,890 --> 00:10:13,650 Kaya ito ay may problema kung ikaw ay gusto mong magkaroon ng isang function tulad ng scanf 236 00:10:13,650 --> 00:10:17,170 sa buhay, na ang layunin ay upang i-scan input ng user mula sa mga keyboard 237 00:10:17,170 --> 00:10:22,010 at pagkatapos ay punan ang mga patlang, kaya na magsalita, iyon ay, magbigay ng isang variable tulad ng x 238 00:10:22,010 --> 00:10:25,410 ang halaga, dahil kung ako ay upang pumasa lamang x sa scanf, 239 00:10:25,410 --> 00:10:28,790 kung isinasaalang-alang mo ang logic ng huling linggo, maaari scanf gawin ang anumang nais 240 00:10:28,790 --> 00:10:33,100 may isang kopya ng x, ngunit hindi ito maaaring permanenteng baguhin x maliban kung bigyan namin 241 00:10:33,100 --> 00:10:37,120 scanf isang mapa ng kayamanan, kaya na magsalita, kung saan ang x ay minamarkahan ang lugar, kung saan ang 242 00:10:37,120 --> 00:10:41,860 ipasa namin sa address ng x sa gayon ay scanf maaaring pumunta doon at talagang pagbabago 243 00:10:41,860 --> 00:10:42,920 ang halaga ng x. 244 00:10:42,920 --> 00:10:45,080 At kaya nga, ang lahat ng na ang programang ito ay 245 00:10:45,080 --> 00:10:53,180 kapag gumawa ako scanf 0, sa aking pinagmulan Directory 5M, gumawa scanf 0, 246 00:10:53,180 --> 00:10:57,730 dot slash scanf, numero mangyaring 50, salamat para sa 50. 247 00:10:57,730 --> 00:11:01,020 >> Kaya ito ay hindi lahat na kawili-wili, ngunit kung ano ang talagang nangyayari 248 00:11:01,020 --> 00:11:04,820 ay na sa lalong madaling ang tawag ko scanf dito, ang halaga ng x 249 00:11:04,820 --> 00:11:06,410 ay tuluyang binago. 250 00:11:06,410 --> 00:11:08,335 Ngayon, ito ay tila magandang at mabuti, at katunayan sa, ito 251 00:11:08,335 --> 00:11:11,200 Tila tulad ng hindi mo talagang kailangan namin CS50 library sa lahat ng anymore. 252 00:11:11,200 --> 00:11:13,960 Halimbawa, sabihin tumakbo ipaalam isang beses pa ito dito. 253 00:11:13,960 --> 00:11:15,750 Hayaan akong muling buksan ito para sa isang segundo. 254 00:11:15,750 --> 00:11:20,600 Subukan natin ang isang bilang Hayaan mangyaring at sa halip na sabihing 50 tulad ng dati, 255 00:11:20,600 --> 00:11:22,810 sabihin lang no. 256 00:11:22,810 --> 00:11:24,000 OK, na ang isang maliit na kakaiba. 257 00:11:24,000 --> 00:11:25,270 SIGE. 258 00:11:25,270 --> 00:11:28,680 At lamang ng ilang mga bagay na walang kapararakan dito. 259 00:11:28,680 --> 00:11:31,170 Kaya ito ay hindi mukhang hawakan maling sitwasyon. 260 00:11:31,170 --> 00:11:33,620 Kaya kailangan namin upang Minimally start pagdagdag ng ilang mga error-checking 261 00:11:33,620 --> 00:11:37,460 tiyakin na ang gumagamit ay may nai-type sa isang aktwal na numero tulad ng 50, 262 00:11:37,460 --> 00:11:40,720 dahil tila type ng mga salita ay hindi nakita bilang katiyakan, 263 00:11:40,720 --> 00:11:42,020 ngunit ito marahil ay dapat na. 264 00:11:42,020 --> 00:11:46,450 >> Tingnan natin ang bersyon na ito ngayon na ang Ipaalam aking mga pagtatangka upang reimplement GetString. 265 00:11:46,450 --> 00:11:48,437 Kung mayroon ng lahat na ito scanf functionality built in, 266 00:11:48,437 --> 00:11:51,270 bakit kami ay dabbling sa mga gulong ng pagsasanay tulad ng GetString? 267 00:11:51,270 --> 00:11:55,450 Well, dito ay marahil ang aking sariling simpleng bersyon ng GetString 268 00:11:55,450 --> 00:12:00,766 kung saan ang isang linggo na ang nakakaraan, ay maaaring magkaroon ng sinabi ko, bigyan ako ng isang string at tawagan ito buffer. 269 00:12:00,766 --> 00:12:03,390 Ngayon, ako pagpunta sa simulan lamang sinasabi char star, na kung saan, pagpapabalik, 270 00:12:03,390 --> 00:12:04,400 ito lamang ay magkasingkahulugan. 271 00:12:04,400 --> 00:12:06,629 Mukhang scarier ngunit ito ay ang eksaktong parehong bagay. 272 00:12:06,629 --> 00:12:09,420 Kaya bigyan ako ng variable na tinatawag na buffer ng isang na ang pagpunta sa tindahan ng isang string, 273 00:12:09,420 --> 00:12:12,780 sabihin ang string user po, at pagkatapos, tulad lamang ng dati, 274 00:12:12,780 --> 00:12:17,760 Subukan nating humiram ng araling ito ipaalam scanf % s oras na ito at pagkatapos ay pumasa sa buffer. 275 00:12:17,760 --> 00:12:19,310 Ngayon, ang isang mabilis katinuan suriin. 276 00:12:19,310 --> 00:12:22,120 Bakit hindi ko sinasabi ampersand buffer oras na ito? 277 00:12:22,120 --> 00:12:25,190 278 00:12:25,190 --> 00:12:26,625 Magpakilala mula sa nakaraang halimbawa. 279 00:12:26,625 --> 00:12:28,000 Madla: Pansamantalang trabaho star ay isang pointer. 280 00:12:28,000 --> 00:12:29,920 David MALAN: Eksakto, dahil sa pagkakataong ito, pansamantalang trabaho 281 00:12:29,920 --> 00:12:34,080 star nang isang pointer, isang address, sa pamamagitan ng kahulugan ng na star na doon. 282 00:12:34,080 --> 00:12:37,530 At kung Inaasahan scanf ng isang address, sapat nang lamang pumasa sa buffer. 283 00:12:37,530 --> 00:12:39,260 Hindi ko kailangan sabihin ampersand buffer. 284 00:12:39,260 --> 00:12:42,177 Para sa mga curious, maaari mong gawin ang isang bagay tulad nito. 285 00:12:42,177 --> 00:12:43,510 Ito ay may iba't ibang kahulugan. 286 00:12:43,510 --> 00:12:47,240 Ito ay magbibigay sa iyo ng isang pointer sa isang pointer, na kung saan ay tunay na 287 00:12:47,240 --> 00:12:50,050 isang wastong bagay sa C, ngunit para sa ngayon, panatilihin ito simple hayaan 288 00:12:50,050 --> 00:12:51,750 at panatilihin ang pare-pareho ang kuwento. 289 00:12:51,750 --> 00:12:54,100 Tingin lang ako sa pagpunta sa pumasa sa nagpapahina ng lakas at iyon ang tama. 290 00:12:54,100 --> 00:12:56,487 Ang problema bagaman ay na ito. 291 00:12:56,487 --> 00:12:58,820 Hayaan akong magpatuloy at patakbuhin ang programa matapos pag-ipon ng mga ito. 292 00:12:58,820 --> 00:13:00,902 Gumawa ng scanf 1. 293 00:13:00,902 --> 00:13:02,610 Mapapahamak ang mga ito, ang aking tagatala pansing aking error. 294 00:13:02,610 --> 00:13:04,090 Bigyan mo ako ng isang segundo. 295 00:13:04,090 --> 00:13:05,460 Clang. 296 00:13:05,460 --> 00:13:06,990 Sabihin natin na scanf-1.c. 297 00:13:06,990 --> 00:13:10,880 298 00:13:10,880 --> 00:13:11,380 SIGE. 299 00:13:11,380 --> 00:13:12,720 Mayroon kaming pumunta. 300 00:13:12,720 --> 00:13:14,280 Kailangan ko. 301 00:13:14,280 --> 00:13:16,750 CS50 ID may iba't-ibang mga setting ng configuration 302 00:13:16,750 --> 00:13:18,280 na maprotektahan ka laban sa iyong sarili. 303 00:13:18,280 --> 00:13:21,300 Kailangan ko upang huwag paganahin ang mga iyon sa pamamagitan mano-mano ang pagpapatakbo clang oras na ito. 304 00:13:21,300 --> 00:13:22,140 Kaya string please. 305 00:13:22,140 --> 00:13:25,560 Pupunta ako sa sige at mag-type sa aking mga paboritong kumusta mundo. 306 00:13:25,560 --> 00:13:26,490 OK, null. 307 00:13:26,490 --> 00:13:27,700 Iyan ay hindi kung ano ang nai-type ko. 308 00:13:27,700 --> 00:13:29,690 Kaya ito ay nagpapakilala ng isang bagay na mali. 309 00:13:29,690 --> 00:13:33,920 Hayaan akong magpatuloy at i-type sa isang talagang mahabang string. 310 00:13:33,920 --> 00:13:37,210 Salamat para sa mga null at hindi ko alam kung ako pagpunta upang ma-crash ito. 311 00:13:37,210 --> 00:13:40,240 Subukan ang isang maliit na kopya Ipaalam idikit at alamin kung makakatulong ito. 312 00:13:40,240 --> 00:13:43,290 Ilagay lamang ang isang pulutong ng mga ito. 313 00:13:43,290 --> 00:13:47,310 Ito ay tiyak na isang mas malaking string kaysa sa karaniwan. 314 00:13:47,310 --> 00:13:51,450 Lang talaga isulat natin ito. 315 00:13:51,450 --> 00:13:51,950 Hindi. 316 00:13:51,950 --> 00:13:52,650 Mapapahamak ang mga ito. 317 00:13:52,650 --> 00:13:53,480 Command hindi natagpuan. 318 00:13:53,480 --> 00:13:54,550 Kaya na hindi kaugnay. 319 00:13:54,550 --> 00:13:56,440 Ito ay dahil nailagay ko ilang hindi magandang mga character, 320 00:13:56,440 --> 00:13:59,780 ngunit ito ay lumiliko out na ito ay hindi pagpunta sa trabaho. 321 00:13:59,780 --> 00:14:03,510 >> Subukan ito nang isa pang beses Ipaalam, dahil ito ay mas masaya kung namin ang tunay na pag-crash ng mga ito. 322 00:14:03,510 --> 00:14:09,116 Ni-type ito Hayaan at ngayon, ako pagpunta sa kopyahin ang isang tunay na mahabang string 323 00:14:09,116 --> 00:14:10,990 at ngayon sabihin makita kung kami ay maaaring bumagsak ang bagay na ito. 324 00:14:10,990 --> 00:14:14,235 Pansinin tinanggal ko na espasyo at bagong linya at semicolons 325 00:14:14,235 --> 00:14:16,035 at ang lahat ng funky mga character. 326 00:14:16,035 --> 00:14:16,535 Enter. 327 00:14:16,535 --> 00:14:21,090 328 00:14:21,090 --> 00:14:22,880 At ngayon, ang network lang ang pagiging mabagal. 329 00:14:22,880 --> 00:14:27,460 Ako gaganapin down Command-V masyadong mahaba, malinaw. 330 00:14:27,460 --> 00:14:28,190 Mapapahamak ang mga ito! 331 00:14:28,190 --> 00:14:29,260 Command hindi natagpuan. 332 00:14:29,260 --> 00:14:29,780 >> SIGE. 333 00:14:29,780 --> 00:14:32,240 Well, ang punto ay gayunman ang mga sumusunod. 334 00:14:32,240 --> 00:14:36,910 Kaya kung ano ang tunay na nangyayari sa may ito deklarasyon 335 00:14:36,910 --> 00:14:39,240 ng char star buffer sa 16 na linya? 336 00:14:39,240 --> 00:14:41,820 Kaya kung ano ang ako pagkuha kapag ipinapahayag ko ang isang pointer? 337 00:14:41,820 --> 00:14:47,440 Lahat Nakakakuha ako ay isang halaga na apat byte tinatawag na buffer, ngunit kung ano ang nasa loob ng mga ito 338 00:14:47,440 --> 00:14:49,540 sa sandaling ito? 339 00:14:49,540 --> 00:14:50,930 Ito lamang ang ilang mga halaga ng basura. 340 00:14:50,930 --> 00:14:54,170 Dahil anumang oras ipinapahayag mo ang isang variable sa C, ito lamang ang ilang mga halaga ng basura, 341 00:14:54,170 --> 00:14:56,220 at kami ay nagsisimula upang trip sa paglipas ng ito sa katotohanan. 342 00:14:56,220 --> 00:14:59,720 Ngayon, kapag ako sabihin scanf, pumunta sa address na ito 343 00:14:59,720 --> 00:15:01,520 at ilagay ang kahit anong uri ng user sa. 344 00:15:01,520 --> 00:15:06,400 Kung ang uri ng user sa halo mundo, na rin, kung saan ko ilalagay ito? 345 00:15:06,400 --> 00:15:07,750 Buffer ay isang halaga ng basura. 346 00:15:07,750 --> 00:15:11,510 >> Kaya na uri ng tulad ng isang arrow na tumuturo na nakakaalam kung saan. 347 00:15:11,510 --> 00:15:13,880 Siguro ito ay tumuturo dito mismo sa aking memorya. 348 00:15:13,880 --> 00:15:16,560 At kaya kapag ang user uri sa kumusta mundo, 349 00:15:16,560 --> 00:15:22,380 ang programa sumusubok na ilagay ang string hello world backslash 0 350 00:15:22,380 --> 00:15:23,910 sa na tipak ng memory. 351 00:15:23,910 --> 00:15:27,070 Ngunit may mataas na posibilidad, ngunit malinaw na hindi 100% na posibilidad na mangyari, 352 00:15:27,070 --> 00:15:30,440 ang computer ay pagpunta sa pagkatapos ng pag-crash ang programa dahil ito ay hindi 353 00:15:30,440 --> 00:15:32,490 memory ko dapat pinapayagan sa pagpindot. 354 00:15:32,490 --> 00:15:36,330 Kaya sa maikling salita, ang programang ito ay flawed para sa eksaktong na dahilan. 355 00:15:36,330 --> 00:15:38,070 Panimula ko hindi ginagawa kung ano? 356 00:15:38,070 --> 00:15:42,366 Ano ang mga hakbang kung tinanggal ko, tulad ng namin tinanggal na sa unang halimbawa Binky? 357 00:15:42,366 --> 00:15:42,866 Oo? 358 00:15:42,866 --> 00:15:43,710 >> Madla: paglalaan Memory? 359 00:15:43,710 --> 00:15:45,001 >> David MALAN: paglalaan Memory. 360 00:15:45,001 --> 00:15:48,400 Hindi ko pa talaga inilalaan anumang memory para sa na string. 361 00:15:48,400 --> 00:15:50,270 Kaya maaari naming ayusin ito sa isang pares ng mga paraan. 362 00:15:50,270 --> 00:15:52,700 One, maaari naming panatilihin ito simple at sa katunayan, ngayon ikaw ay 363 00:15:52,700 --> 00:15:55,116 pagpunta sa simulan na makita ang isang paglabo mga linya sa pagitan ng kung ano ang 364 00:15:55,116 --> 00:15:58,520 isang array ay, kung ano ang isang string ay, kung ano ang isang char star ay, kung ano ang isang array ng mga karakter 365 00:15:58,520 --> 00:15:59,020 ay. 366 00:15:59,020 --> 00:16:02,450 Narito ang isang pangalawang halimbawa kinasasangkutan string at notice 367 00:16:02,450 --> 00:16:05,690 lahat ng nagawa ko on line 16 ay, sa halip na sabihing 368 00:16:05,690 --> 00:16:09,530 na buffer ay magiging isang pansamantalang trabaho star, isang pointer sa isang tipak ng memory, 369 00:16:09,530 --> 00:16:14,057 Pupunta ako sa napaka-proactively bigyan sarili ko ng isang buffer para sa 16 mga character, 370 00:16:14,057 --> 00:16:16,390 at sa katunayan, kung hindi ka pamilyar sa mga kataga ng buffering, 371 00:16:16,390 --> 00:16:20,570 marahil mula sa mundo ng mga video, kung saan ang isang video ay buffering, buffering, 372 00:16:20,570 --> 00:16:21,175 buffering. 373 00:16:21,175 --> 00:16:22,550 Well, ano ang connection dito? 374 00:16:22,550 --> 00:16:24,960 Well, Inside ng YouTube at sa loob ng video player 375 00:16:24,960 --> 00:16:27,200 sa pangkalahatan ay isang array na mas malaki kaysa sa 16. 376 00:16:27,200 --> 00:16:30,340 Ito ay maaaring maging isang hanay ng mga laki ng isa megabyte, marahil 10 megabytes, 377 00:16:30,340 --> 00:16:34,330 at sa na array ang ginagawa ng iyong browser i-download ng isang buong grupo ng mga bytes, 378 00:16:34,330 --> 00:16:37,500 ang maramihang mga megabytes ng video, at mga video player, 379 00:16:37,500 --> 00:16:40,930 , Nagsisimula YouTube o kung sinuman ang pagbabasa ng mga bytes mula sa na array, 380 00:16:40,930 --> 00:16:43,530 at anumang oras na makita mo ang mga word buffering, buffering, 381 00:16:43,530 --> 00:16:46,350 ay nangangahulugan na ang manlalaro ay may tapat na paraan sa dulo ng array na. 382 00:16:46,350 --> 00:16:50,430 Ang network ay kaya mabagal na ito ay hindi refilled ang array na may higit pang mga bytes 383 00:16:50,430 --> 00:16:55,610 at iba nasa labas ka ng bits upang ipakita sa mga gumagamit. 384 00:16:55,610 --> 00:16:59,430 >> Kaya buffer ay isang apt term dito sa na ito lamang ay isang array, isang tipak ng memory. 385 00:16:59,430 --> 00:17:02,530 At ito ay ayusin ito dahil ito ay lumiliko out 386 00:17:02,530 --> 00:17:07,410 na maaari mong ituring array na parang ang mga ito ay mga address, kahit na buffer 387 00:17:07,410 --> 00:17:10,710 ay isang simbolo lamang, ito ay isang pagkakasunod-sunod ng mga character, buffer, 388 00:17:10,710 --> 00:17:14,760 na kapaki-pakinabang para sa akin, ang mga programmer, maaari mong ipasa ang pangalan nito sa paligid 389 00:17:14,760 --> 00:17:17,079 na parang ito ay isang pointer, na parang ito 390 00:17:17,079 --> 00:17:21,000 ay ang address ng isang tipak ng memory para sa 16 na karakter. 391 00:17:21,000 --> 00:17:24,530 Kaya na sabihin, maaari ko bang ipasa ang scanf eksakto na salita 392 00:17:24,530 --> 00:17:30,670 at kaya ngayon, kapag gumawa ako ng program na ito, gumawa scanf 2, tuldok slash scanf 2, 393 00:17:30,670 --> 00:17:35,386 at sa uri ng kumusta mundo, Ipasok, na time-- 394 00:17:35,386 --> 00:17:37,590 >> Hmm, ano ang nangyari? 395 00:17:37,590 --> 00:17:39,340 String please. 396 00:17:39,340 --> 00:17:41,430 Ano ang nagawa kong mali? 397 00:17:41,430 --> 00:17:43,800 Kamusta mundo, buffer. 398 00:17:43,800 --> 00:17:44,705 Kamusta mundo. 399 00:17:44,705 --> 00:17:48,201 400 00:17:48,201 --> 00:17:49,420 Ah, alam ko kung ano ang ginagawa nito. 401 00:17:49,420 --> 00:17:49,920 SIGE. 402 00:17:49,920 --> 00:17:51,628 Kaya ito ay ang pagbabasa up hanggang sa unang space. 403 00:17:51,628 --> 00:17:55,680 Kaya sabihin impostor para sa sandali lamang at sinasabi ko lamang nais na mag-type ng isang bagay 404 00:17:55,680 --> 00:18:01,408 talagang mahaba tulad nito ay isang mahabang pangungusap iyon ang isa, dalawa, tatlo, apat, lima, 405 00:18:01,408 --> 00:18:04,420 anim, pito, walo, siyam, 10, 11, 12, 13, 14, 15, 16. 406 00:18:04,420 --> 00:18:05,300 SIGE. 407 00:18:05,300 --> 00:18:07,600 Ito ay sa katunayan ng isang mahabang pangungusap. 408 00:18:07,600 --> 00:18:10,710 Kaya pangungusap na ito ay mas mahaba sa 16 character 409 00:18:10,710 --> 00:18:13,670 at kaya kapag ako pindutin ang Enter, kung ano ang nangyayari sa mangyayari? 410 00:18:13,670 --> 00:18:16,940 Well, sa kasong ito ng kuwento, ako ay ipinahayag buffer 411 00:18:16,940 --> 00:18:22,190 sa tunay na pagiging isang array may 16 na karakter ay handa na upang patakbuhin. 412 00:18:22,190 --> 00:18:27,426 Kaya isa, dalawa, tatlo, apat, lima, anim, pito, walo, siyam, 10, 11, 12, 13, 14, 413 00:18:27,426 --> 00:18:29,440 15, 16. 414 00:18:29,440 --> 00:18:34,410 Kaya 16 mga character, at ngayon, kapag ako basahin sa isang bagay tulad ng ito ay isang mahabang 415 00:18:34,410 --> 00:18:43,950 pangungusap, kung ano ang nangyayari sa mangyari ay na ako pagpunta sa basahin sa ito ay isang mahabang 416 00:18:43,950 --> 00:18:49,660 S-E-N-T-E-N-C-E, pangungusap. 417 00:18:49,660 --> 00:18:52,270 >> Kaya ito ay sadyang isang masamang bagay na ako 418 00:18:52,270 --> 00:18:55,060 panatilihin ang pagsulat sa kabila ng hangganan ng aking array, 419 00:18:55,060 --> 00:18:56,660 sa kabila ng hangganan ng aking buffer. 420 00:18:56,660 --> 00:19:00,100 Ako ay maaaring makakuha ng masuwerteng at ang programa ay patuloy na sa pagtakbo at hindi pag-aalaga, 421 00:19:00,100 --> 00:19:03,450 ngunit sa pangkalahatan ay nagsasalita, ito sa katunayan ay pag-crash ng aking mga programa, 422 00:19:03,450 --> 00:19:06,440 at ito ay isang bug sa aking code sa sandali hakbang ko 423 00:19:06,440 --> 00:19:08,576 sa ibayo ng hangganan ng na array, dahil ako 424 00:19:08,576 --> 00:19:10,450 hindi alam kung ito ay palaging pagpunta sa pag-crash 425 00:19:10,450 --> 00:19:12,120 o kung ako lamang ang pagpunta upang makakuha ng masuwerteng. 426 00:19:12,120 --> 00:19:15,750 Kaya ito ay may problema dahil sa kasong ito, ito ay tila na magtrabaho 427 00:19:15,750 --> 00:19:20,931 at hayaan tuksuhin ng kapalaran dito, kahit na parang tiisin lubos ng kaunti ang IDE 428 00:19:20,931 --> 00:19:21,430 of-- 429 00:19:21,430 --> 00:19:22,040 >> Mayroon kaming pumunta. 430 00:19:22,040 --> 00:19:23,240 Sa wakas. 431 00:19:23,240 --> 00:19:26,470 Kaya ako ang isa lamang na maaaring makita ito. 432 00:19:26,470 --> 00:19:29,630 Kaya lang ako nagkaroon ng maraming masaya pag-type ang isang tunay na matagal na aktwal na parirala 433 00:19:29,630 --> 00:19:32,800 na ito ay tiyak na nalampasan 16 bytes, dahil ako 434 00:19:32,800 --> 00:19:38,050 nag-type sa mga ito mabaliw pang multi-line parirala, at pagkatapos ay mapapansin kung ano ang nangyari. 435 00:19:38,050 --> 00:19:41,110 Sinubukan programa pag-print ito at pagkatapos ay nakuha ng segmentation fault 436 00:19:41,110 --> 00:19:44,430 at segmentation faults ay kapag isang bagay tulad ng nangyari ito 437 00:19:44,430 --> 00:19:47,650 at sinasabi ng operating system hindi, hindi maaaring hawakan na memory. 438 00:19:47,650 --> 00:19:49,570 Kami ay pagpunta sa pumatay ang programa sa kabuuan. 439 00:19:49,570 --> 00:19:51,180 >> Kaya ito ay tila problemang. 440 00:19:51,180 --> 00:19:54,540 Pinabuting ko na ang mga programa kung saan ang hindi bababa sa magkaroon ng ilang mga memory, 441 00:19:54,540 --> 00:19:58,000 ngunit ito ay tila na makulong ang function GetString sa pagkuha ng 442 00:19:58,000 --> 00:20:00,780 string ng ilang mga hangganan ng haba 16. 443 00:20:00,780 --> 00:20:04,200 Kaya kung nais mong upang suportahan ang mas matagal na pangungusap sa 16 mga character, 444 00:20:04,200 --> 00:20:04,880 ano ang gagawin mo? 445 00:20:04,880 --> 00:20:07,970 Well, maaari mong taasan ang laki ng buffer sa 32 446 00:20:07,970 --> 00:20:09,190 o na tila uri ng short. 447 00:20:09,190 --> 00:20:12,260 Bakit hindi kami gumawa lamang ito 1,000 ngunit uurong. 448 00:20:12,260 --> 00:20:17,100 Ano ang tugon intuitively ng pag-iwas lamang ang problemang ito sa pamamagitan ng paggawa 449 00:20:17,100 --> 00:20:20,660 aking buffer mas malaki, tulad ng 1,000 karakter? 450 00:20:20,660 --> 00:20:23,470 Sa pamamagitan ng pagpapatupad GetString sa ganitong paraan. 451 00:20:23,470 --> 00:20:27,130 Ano ang mabuti o masama dito? 452 00:20:27,130 --> 00:20:28,033 Oo? 453 00:20:28,033 --> 00:20:30,574 Madla: Kung ikaw magpagaling ng isang pulutong ng space at hindi mo gamitin ang mga ito, 454 00:20:30,574 --> 00:20:33,500 pagkatapos ay hindi ka maaaring reallocate puwang na iyon. 455 00:20:33,500 --> 00:20:34,500 David MALAN: Ganap. 456 00:20:34,500 --> 00:20:38,480 Ito ay mapag-aksaya sa abot ng kung hindi mo gusto talagang kailangan 900 mga bytes 457 00:20:38,480 --> 00:20:41,057 at gayon pa man ikaw ay humihingi ng 1,000 sa kabuuang anyway, 458 00:20:41,057 --> 00:20:44,140 lamang ikaw ay ubos ng mas maraming memorya sa computer ng user sa kailangan mo na, 459 00:20:44,140 --> 00:20:45,740 at pagkatapos ng lahat, ang ilan sa na nakaranas ka na 460 00:20:45,740 --> 00:20:47,620 sa buhay na kapag ikaw ay tumatakbo ng maraming mga programa 461 00:20:47,620 --> 00:20:50,470 at sila ay kumakain up ng maraming memorya, ito ay maaari talagang epekto sa pagganap 462 00:20:50,470 --> 00:20:52,220 at karanasan ng gumagamit sa computer. 463 00:20:52,220 --> 00:20:56,090 Kaya na uri ng isang tamad na solusyon, para sigurado, at pasalungat, 464 00:20:56,090 --> 00:21:00,140 ito ay mapag-aksaya hindi lamang, kung ano ang problema nananatili pa rin, kahit na kapag gumawa ako nang aking buffer 465 00:21:00,140 --> 00:21:02,100 1,000? 466 00:21:02,100 --> 00:21:02,600 Oo? 467 00:21:02,600 --> 00:21:04,475 >> Madla: string ay haba 1,001. 468 00:21:04,475 --> 00:21:05,350 David MALAN: Eksakto. 469 00:21:05,350 --> 00:21:08,280 Kung ang iyong mga string ay haba 1,001, mayroon ka ng parehong problema, 470 00:21:08,280 --> 00:21:10,705 at sa pamamagitan ng aking mga argument, gagawin ko lamang pagkatapos ay gawin itong 2000, 471 00:21:10,705 --> 00:21:12,830 ngunit hindi mo alam kung in isulong kung paano malaki ito ay dapat, 472 00:21:12,830 --> 00:21:16,890 at pa, ako ay hindi na ilista ang aking mga program bago pagpapaalam sa mga tao na gamitin at i-download 473 00:21:16,890 --> 00:21:17,390 ito. 474 00:21:17,390 --> 00:21:21,490 Kaya ito ay eksakto ang uri ng mga bagay-bagay na ang mga sumusubok CS50 library 475 00:21:21,490 --> 00:21:24,750 upang makatulong sa amin sa at makikita lamang namin sulyap ang ilan sa mga batayan sa pagpapatupad 476 00:21:24,750 --> 00:21:29,790 dito, ngunit ito ay CS50 dot C. Ito ay ang file na ay naging sa CS50 IDE 477 00:21:29,790 --> 00:21:31,420 lahat ng mga linggo na kayo ay gumagamit ng. 478 00:21:31,420 --> 00:21:34,280 Ito ay pre-naipon at na sa iyo Awtomatikong na ito gamit ang 479 00:21:34,280 --> 00:21:38,780 sa pamamagitan ng likas na katangian ng pagkakaroon ng Dash L CS50 bandila na may kalatungin, 480 00:21:38,780 --> 00:21:42,300 ngunit kung mag-scroll ko pababa sa pamamagitan ng lahat ng mga mga function na ito, narito ang GetString, 481 00:21:42,300 --> 00:21:44,636 at lamang na bigyan ka ng lasa ng kung ano ang nangyayari, 482 00:21:44,636 --> 00:21:46,760 sabihin kumuha ng isang mabilis na pagtingin sa mga kamag-anak kumplikado. 483 00:21:46,760 --> 00:21:48,870 Ito ay hindi isang super long function, ngunit kami ay hindi 484 00:21:48,870 --> 00:21:52,530 kailangang isipin ang lahat ng husto tungkol sa kung paano pumunta tungkol sa pagkuha ng mga string. 485 00:21:52,530 --> 00:21:55,660 >> Kaya narito ang aking buffer at ako Lumilitaw na magpasimula ito sa null. 486 00:21:55,660 --> 00:21:57,990 Ito, siyempre, ay ang parehong bagay tulad ng char star, 487 00:21:57,990 --> 00:22:00,585 ngunit ako ay nagpasya sa pagpapatupad ng CS50 library 488 00:22:00,585 --> 00:22:02,460 na kung kami ay pagpunta sa maging ganap na dynamic, 489 00:22:02,460 --> 00:22:05,770 Hindi ko alam nang maaga kung paano malaki ng isang gumagamit string ay pagpunta sa gusto upang makakuha ng. 490 00:22:05,770 --> 00:22:08,140 Kaya ako pagpunta sa simulan sa pamamagitan lamang ng isang walang laman na string 491 00:22:08,140 --> 00:22:11,507 at ako pagpunta upang bumuo ng up ng mas maraming memory bilang kailangan ko upang magkasya ang mga string ng user 492 00:22:11,507 --> 00:22:13,340 at kung hindi ko magkaroon ng sapat, ako pagpunta sa hilingin 493 00:22:13,340 --> 00:22:15,010 mga operating system para sa mas maraming memory. 494 00:22:15,010 --> 00:22:17,510 Pupunta ako upang ilagay ang kanilang string sa isang mas malaking tipak ng memory 495 00:22:17,510 --> 00:22:21,847 at ako pagpunta upang palabasin o libre ang insufficiently malaking tipak ng memory 496 00:22:21,847 --> 00:22:23,680 at lamang kami ay pagpunta upang gawin ito iteratively. 497 00:22:23,680 --> 00:22:25,570 >> Kaya isang mabilis na sulyap, narito ang isang variable lang 498 00:22:25,570 --> 00:22:28,780 na kung saan ako pupunta upang subaybayan ng kapasidad ng aking buffer. 499 00:22:28,780 --> 00:22:30,071 Gaano karaming bytes ko magkasya? 500 00:22:30,071 --> 00:22:32,070 Narito n isang variable na may kung saan ako pagpunta sa panatilihin 501 00:22:32,070 --> 00:22:36,200 subaybayan kung gaano karaming mga byte ay talagang sa ang buffer o na ang gumagamit ay nag-type. 502 00:22:36,200 --> 00:22:39,900 Kung hindi mo na makikita ito bago, ikaw ay maaaring tukuyin na ang isang variable tulad ng isang int 503 00:22:39,900 --> 00:22:46,370 ay unsigned, na ang pangalan ay nagpapahiwatig, nangangahulugan na ito ay hindi-negatibong, at bakit gagawin 504 00:22:46,370 --> 00:22:50,590 Ko kailanman nais na abala na tumutukoy na ang isang int ay hindi lamang isang int, 505 00:22:50,590 --> 00:22:52,540 ngunit ito ay isang unsigned int? 506 00:22:52,540 --> 00:22:55,064 Ito ay isang hindi-negatibong int. 507 00:22:55,064 --> 00:22:56,355 Ano ang ibig sabihin ng [hindi marinig]? 508 00:22:56,355 --> 00:22:58,910 >> Madla: Ito ay naglalarawan ng isang halaga ng memorya na maaaring maging [hindi marinig]. 509 00:22:58,910 --> 00:22:59,660 >> David MALAN: Oo. 510 00:22:59,660 --> 00:23:03,710 Kaya kung sinasabi ko unsigned, ito ay tunay na nagbibigay sa iyo ng isang piraso ng dagdag na memory 511 00:23:03,710 --> 00:23:07,440 at tila uri ng hangal, ngunit kung ikaw magkaroon ng isa bit ng karagdagang memory, na 512 00:23:07,440 --> 00:23:09,940 nangangahulugan na ikaw ay dalawang beses ng maraming halaga na maaari mong kumatawan, 513 00:23:09,940 --> 00:23:11,570 dahil ito ay maaaring maging isang 0 o 1. 514 00:23:11,570 --> 00:23:14,660 Kaya sa pamamagitan ng default, ang isang int maaaring humigit-kumulang negatibong 2 bilyong lahat ng mga paraan 515 00:23:14,660 --> 00:23:16,030 hanggang sa positibong 2 bilyong. 516 00:23:16,030 --> 00:23:18,540 Ang mga ay malaking saklaw, ngunit ito ay uri ng mapag-aksaya pa rin 517 00:23:18,540 --> 00:23:21,280 kung mahalaga sa iyo lamang tungkol sa na laki, na intuitively lamang 518 00:23:21,280 --> 00:23:24,620 dapat na di-negatibong o positibo o 0, sa gayon, 519 00:23:24,620 --> 00:23:28,884 bakit ka pag-aaksaya ng 2 bilyong posibleng halaga para sa mga negatibong numero 520 00:23:28,884 --> 00:23:30,300 kung hindi ikaw ay pagpunta sa gamitin ang mga ito? 521 00:23:30,300 --> 00:23:35,350 Kaya sa pamamagitan ng pagsasabi unsigned, ngayon ang aking int Maaari nasa pagitan ng 0 at halos 4 na bilyon. 522 00:23:35,350 --> 00:23:39,280 >> Kaya dito lang ang isang int C para sa mga dahilan Hindi namin makuha sa ngayon lang bilang 523 00:23:39,280 --> 00:23:42,280 sa kung bakit ito ay isang int sa halip ng isang pansamantalang trabaho, ngunit dito ay 524 00:23:42,280 --> 00:23:44,630 ang buod ng kung ano ang nangyayari sa, at ang ilan sa inyo 525 00:23:44,630 --> 00:23:48,340 maaaring gumagamit, halimbawa, ang fgetc function na kahit na sa pset apat 526 00:23:48,340 --> 00:23:51,580 o pagkatapos nito, makikita natin na gagawin muli sa hanay ng problema limang, 527 00:23:51,580 --> 00:23:55,410 fgetc ay dahil sa ganda tulad ng pangalan uri ng, uri ng arcanely nagmumungkahi, 528 00:23:55,410 --> 00:23:57,940 ito ay isang function na makakakuha ng isang character at sa gayon, 529 00:23:57,940 --> 00:24:00,690 ano ang panimula ng iba't ibang tungkol sa kung ano ang aming ginagawa sa GetString 530 00:24:00,690 --> 00:24:03,110 ay hindi kami gumagamit scanf sa parehong paraan. 531 00:24:03,110 --> 00:24:07,550 Kami ay gumagapang lamang kasama step-by-step higit sa anuman ang gumagamit ay nai-type sa, 532 00:24:07,550 --> 00:24:10,970 dahil maaari naming laging maglaan ng isa char, at sa gayon maaari naming laging ligtas 533 00:24:10,970 --> 00:24:15,599 tumingin sa isang char sa isang panahon, at mga ang magic ay nagsisimula sa mangyari dito. 534 00:24:15,599 --> 00:24:17,890 Pupunta ako upang mag-scroll pababa sa sa gitna ng mga function na ito 535 00:24:17,890 --> 00:24:20,360 lamang sa madaling sabi kitang ipakilala ang function na ito. 536 00:24:20,360 --> 00:24:22,670 Karamihan tulad ng mayroong isang malloc function, mayroong 537 00:24:22,670 --> 00:24:27,740 isang realloc function na kung saan realloc Hinahayaan ka ng reallocate isang tipak ng memory 538 00:24:27,740 --> 00:24:29,570 at gawin itong mas malaki o mas maliit. 539 00:24:29,570 --> 00:24:33,060 Kaya mahaba kuwento maikli at may isang alon ng aking mga kamay para sa araw na ito, 540 00:24:33,060 --> 00:24:35,620 alam na kung ano ang GetString ay ginagawa ay ito ay isang uri 541 00:24:35,620 --> 00:24:39,720 ng magically lumalaki o pag-urong ang buffer bilang ng gumagamit 542 00:24:39,720 --> 00:24:41,440 uri sa kanyang string. 543 00:24:41,440 --> 00:24:43,962 >> Kaya kung ang uri ng user sa isang maikling string, ang code na ito 544 00:24:43,962 --> 00:24:45,920 lamang naglalaan ng sapat na memory upang magkasya ang string. 545 00:24:45,920 --> 00:24:48,086 Kung patuloy na pag-type ng user ang tulad ng ginawa ko itong muli at muli 546 00:24:48,086 --> 00:24:50,330 at muli, well, kung ang buffer ni una ito malaki 547 00:24:50,330 --> 00:24:53,310 at ang mga programa napagtanto, upang maghintay ng isang minuto, ako sa labas ng espasyo, 548 00:24:53,310 --> 00:24:55,410 ito ay pagpunta sa double ang laki ng buffer 549 00:24:55,410 --> 00:24:59,110 at pagkatapos ay double ang laki ng buffer at ang mga code na gumagana ang pagdodoble, 550 00:24:59,110 --> 00:25:03,170 kung tinitingnan namin ang mga ito dito, ito ay lang ito matalino one-liner. 551 00:25:03,170 --> 00:25:06,830 Hindi maaaring nakita ang syntax na ito bago, ngunit kung sabihin mo star katumbas, 552 00:25:06,830 --> 00:25:10,470 ito ay ang parehong bagay tulad ng sinasabi beses kapasidad 2. 553 00:25:10,470 --> 00:25:13,390 Kaya ito lamang mapigil ang pagdodoble ang kapasidad ng buffer 554 00:25:13,390 --> 00:25:17,480 at pagkatapos ay nagsasabi realloc upang bigyan mismo na marami pa memory. 555 00:25:17,480 --> 00:25:19,720 >> Ngayon, bilang isang bukod, may mga iba pang mga function in dito 556 00:25:19,720 --> 00:25:23,680 na hindi namin ay tumingin sa anumang mga detalye maliban sa upang ipakita sa GetInt, 557 00:25:23,680 --> 00:25:26,150 ginagamit namin ang GetString sa GetInt. 558 00:25:26,150 --> 00:25:28,192 Nagsusuri kami na ito ay hindi null, na kung saan, pagpapabalik, 559 00:25:28,192 --> 00:25:30,400 ay ang espesyal na halaga na nangangahulugan may nangyaring mali. 560 00:25:30,400 --> 00:25:31,233 Humihingi kami ng out of memory. 561 00:25:31,233 --> 00:25:32,310 Mas mahusay na suriin para sa na. 562 00:25:32,310 --> 00:25:33,710 At bumalik kami ang halaga ng isang nagbabantay. 563 00:25:33,710 --> 00:25:37,850 Ngunit kukunin ko na umalinsunod sa mga komento bilang upang kung bakit at pagkatapos ay ginagamit namin ang pinsan ni scanf 564 00:25:37,850 --> 00:25:42,100 tinatawag sscanf at ito ay lumiliko out na sscanf, o string scanf, 565 00:25:42,100 --> 00:25:45,310 hinahayaan kang tingnan ang mga line na ang gumagamit ay nag-type sa at ipaalam sa iyo 566 00:25:45,310 --> 00:25:49,610 pag-aralan ito mahalagang at kung ano ako ginagawa dito ay ako na nagsasabi sscanf, 567 00:25:49,610 --> 00:25:54,440 suriin ang anumang mga user ay may nai-type sa at siguraduhin% i, 568 00:25:54,440 --> 00:25:59,250 may isang integer sa loob nito, at hindi kami kumuha sa ngayon nang eksakto kung bakit mayroon ding 569 00:25:59,250 --> 00:26:03,760 ay nagpapahintulot sa isang% c dito, ngunit na sa maikling sabi amin upang tuklasin kung ang gumagamit ay nag-type 570 00:26:03,760 --> 00:26:06,050 sa isang bagay na bogus pagkatapos ay ang numero. 571 00:26:06,050 --> 00:26:11,766 Kaya ang dahilan na GetInt at GetString sabihin sa inyo na subukan muli, muling subukan, subukang muli 572 00:26:11,766 --> 00:26:13,640 ay dahil sa ang lahat ng mga na code na aming sinulat, 573 00:26:13,640 --> 00:26:17,900 ito ay uri ng pagtingin sa input ng gumagamit sa siguraduhin ito ay ganap numeric 574 00:26:17,900 --> 00:26:21,700 o ito ay isang aktwal na lumulutang halaga o mga katulad na punto, 575 00:26:21,700 --> 00:26:24,233 depende sa kung ano ang halaga gumana ang ginagamit mo. 576 00:26:24,233 --> 00:26:25,060 >> Whew. 577 00:26:25,060 --> 00:26:25,710 SIGE. 578 00:26:25,710 --> 00:26:27,592 Iyon ay isang katiting ngunit ang punto dito ay 579 00:26:27,592 --> 00:26:29,550 na ang dahilan namin ay mga gulong ng pagsasanay sa 580 00:26:29,550 --> 00:26:32,880 ay dahil sa ang pinakamababang antas, may lamang kaya maraming mga bagay na 581 00:26:32,880 --> 00:26:35,674 maaaring magkamali na gusto naming upang preemptively hawakan 582 00:26:35,674 --> 00:26:38,090 tiyak na mga bagay-bagay sa pinakamaagang linggo ng klase, 583 00:26:38,090 --> 00:26:42,230 ngunit ngayon ay may Pset apat at Pset limang at lampas ay makikita mo na ito ay higit sa 584 00:26:42,230 --> 00:26:45,570 sa iyo ngunit din ikaw ay mas may kakayahang ng paglutas ng mga uri ng mga problema 585 00:26:45,570 --> 00:26:47,180 iyong sarili. 586 00:26:47,180 --> 00:26:51,770 Anumang mga katanungan sa GetString o GetInt? 587 00:26:51,770 --> 00:26:52,630 Oo? 588 00:26:52,630 --> 00:26:55,130 >> Madla: Bakit gusto mong i-double ang kapasidad ng buffer 589 00:26:55,130 --> 00:26:57,630 sa halip na lamang ang pagtaas ito sa pamamagitan ng eksaktong halaga? 590 00:26:57,630 --> 00:26:58,100 >> David MALAN: Magandang katanungan. 591 00:26:58,100 --> 00:27:00,474 Bakit namin double ang kapasidad ng buffer bilang laban 592 00:27:00,474 --> 00:27:02,800 sa pagtaas lang ito sa pamamagitan ng ilang tapat na halaga? 593 00:27:02,800 --> 00:27:03,900 Ito ay isang desisyon na disenyo. 594 00:27:03,900 --> 00:27:08,590 Nagpasya kaming lamang na ito sapagkat ito ay may gawi na medyo mahal oras-pera na magtanong 595 00:27:08,590 --> 00:27:10,440 mga operating system para sa memory, kami ay hindi 596 00:27:10,440 --> 00:27:13,210 gusto mong tapusin ang pagkuha sa isang sitwasyon para sa malaking mga string 597 00:27:13,210 --> 00:27:14,960 na kami ay humihingi muli at muli ang OS 598 00:27:14,960 --> 00:27:17,500 at muli at muli sa sunud-sunod para sa memory. 599 00:27:17,500 --> 00:27:20,387 Kaya't nagpasya na lang kami, medyo nagkataon ngunit umaasa kami na makatwirang, 600 00:27:20,387 --> 00:27:22,720 na, alam mo kung ano, sabihin subukan upang makakuha ng maagang ng ating sarili 601 00:27:22,720 --> 00:27:25,520 at lamang panatilihin ang pagdodoble ito upang ang minimize namin ang dami ng beses 602 00:27:25,520 --> 00:27:29,010 Mayroon namin ang tumawag sa malloc o realloc, ngunit isang kabuuang paghatol 603 00:27:29,010 --> 00:27:31,820 tumawag sa kawalan ng pag-alam kung ano ang maaaring gusto ang mga gumagamit na i-type. 604 00:27:31,820 --> 00:27:33,600 Ang parehong paraan ay maaaring hindi tiyak. 605 00:27:33,600 --> 00:27:35,430 Arguably mabuti. 606 00:27:35,430 --> 00:27:39,240 >> Kaya sabihin kumuha ng isang tumingin sa isang pares ng iba pang mga epekto ng memorya, 607 00:27:39,240 --> 00:27:41,610 mga bagay na maaaring maging mali at mga tool na maaari mong 608 00:27:41,610 --> 00:27:43,880 gamitin upang mahuli ang mga ganitong uri ng mga pagkakamali. 609 00:27:43,880 --> 00:27:47,800 Ito ay lumiliko out ang lahat ng sa iyo, kahit na check50 nang hindi sinasabi sa iyo ng mas maraming, 610 00:27:47,800 --> 00:27:50,050 ay sumusulat buggy code mula noong linggo ng isa, 611 00:27:50,050 --> 00:27:53,630 kahit na ang lahat pagsusuri check50 ay lumipas, at kahit na kung ikaw at ang iyong TF 612 00:27:53,630 --> 00:27:56,010 ay sobrang tiwala na gumagana ang iyong code tulad ng inilaan. 613 00:27:56,010 --> 00:27:59,190 Ang iyong code ay maraming surot o flawed sa na ang lahat ng sa iyo, 614 00:27:59,190 --> 00:28:02,540 in gamit ang CS50 library, ay pagtulo memory. 615 00:28:02,540 --> 00:28:06,040 Hindi ka na humihiling sa mga operating system para sa memory sa karamihan ng mga programa 616 00:28:06,040 --> 00:28:08,850 na iyong isinulat, ngunit na sa iyo hindi tunay na ibinigay ito pabalik. 617 00:28:08,850 --> 00:28:12,110 Mo na tinatawag GetString at GetInt at GetFloat, 618 00:28:12,110 --> 00:28:15,270 pero sa pamamagitan ng GetString, na sa iyo hindi na tinatawag unGetString o Bigyan 619 00:28:15,270 --> 00:28:19,890 String Back o mga katulad, ngunit nasaksihan namin na GetString ay magtalaga ng memory 620 00:28:19,890 --> 00:28:22,810 sa pamamagitan ng paraan ng malloc o ito function na realloc, na lamang 621 00:28:22,810 --> 00:28:25,670 halos kapareho sa espiritu, at gayon pa man, kami ay 622 00:28:25,670 --> 00:28:28,629 humihingi ng mga operating system para sa memory at memory muli at muli 623 00:28:28,629 --> 00:28:29,670 ngunit hindi kailanman nagbibigay ito pabalik. 624 00:28:29,670 --> 00:28:33,550 >> Ngayon, bilang isang bukod, ito ay lumiliko out na kapag ang isang programa tabla, ang lahat ng memory 625 00:28:33,550 --> 00:28:34,870 ay awtomatikong napalaya. 626 00:28:34,870 --> 00:28:36,150 Kaya ito ay hindi isang malaking pakikitungo. 627 00:28:36,150 --> 00:28:38,590 Ito ay hindi pagpunta sa basagin ang IDE o mabagal down na mga bagay, 628 00:28:38,590 --> 00:28:40,670 ngunit kapag ang mga programa gawin pangkalahatan tumagas memory 629 00:28:40,670 --> 00:28:42,170 at sila ay tumatakbo para sa isang mahabang panahon. 630 00:28:42,170 --> 00:28:45,640 Kung kailanman na iyong nakita ang hangal kaunti beach ball sa Mac OS o orasa 631 00:28:45,640 --> 00:28:51,160 sa Windows na kung saan ito ay uri ng alalay o pag-iisip o pag-iisip 632 00:28:51,160 --> 00:28:53,770 o talagang lamang nagsisimula sa mabagal sa isang crawl, 633 00:28:53,770 --> 00:28:56,960 ito masyadong marahil ay maaaring ang resulta ng isang memory tumagas. 634 00:28:56,960 --> 00:28:59,970 Ang mga programmer na nagsulat ang software na iyong ginagamit 635 00:28:59,970 --> 00:29:03,570 tanungin ang operating system para sa memory bawat ilang minuto, oras-oras. 636 00:29:03,570 --> 00:29:05,570 Ngunit kung ikaw ay nagpapatakbo ng mga software, kahit na ito ay 637 00:29:05,570 --> 00:29:08,680 mababawasan sa iyong computer para sa mga oras o araw sa dulo, 638 00:29:08,680 --> 00:29:11,980 maaari kang maging na humihingi para sa higit pa at mas memory at hindi aktwal na paggamit nito 639 00:29:11,980 --> 00:29:15,180 at iba ay maaaring ang iyong code, o programa ay maaaring pagtulo memory, 640 00:29:15,180 --> 00:29:18,350 at kung sinimulan mo sa tumagas na memorya, mayroong mas mababa memory para sa iba pang mga programa, 641 00:29:18,350 --> 00:29:21,220 at ang mga epekto ay upang mabagal lahat pababa. 642 00:29:21,220 --> 00:29:23,600 >> Ngayon, ito ay sa pamamagitan ng malayo ang isa sa mga ang pinaka-mabangis programa 643 00:29:23,600 --> 00:29:26,350 magkakaroon ka ng pagkakataon upang tumakbo sa CS50 insofar 644 00:29:26,350 --> 00:29:31,650 bilang output nito ay mas pribado kaysa clang o gumawa o anuman sa mga utos 645 00:29:31,650 --> 00:29:35,930 programs line na namin tumakbo bago ngunit Sa kabutihang palad, naka-embed sa kanyang output 646 00:29:35,930 --> 00:29:39,810 ay ang ilang mga sobrang mga helpful tips na ay magiging kapaki-pakinabang para sa alinman sa pset apat 647 00:29:39,810 --> 00:29:41,510 o tiyak Pset lima. 648 00:29:41,510 --> 00:29:44,250 Kaya valgrind ay isang kasangkapan na maaaring magamit upang tumingin 649 00:29:44,250 --> 00:29:46,930 para sa memory paglabas sa inyong programa. 650 00:29:46,930 --> 00:29:48,570 Ito ay medyo simple upang tumakbo. 651 00:29:48,570 --> 00:29:51,420 Patakbuhin mo valgrind at pagkatapos, kahit na kahit na ito ay isang maliit na masyadong masalita, 652 00:29:51,420 --> 00:29:54,440 dash check dash tumagas ay katumbas ng buong, at pagkatapos ay tuldok 653 00:29:54,440 --> 00:29:56,320 slash at ang pangalan ng iyong programa. 654 00:29:56,320 --> 00:30:00,010 Kaya ay pagkatapos tumakbo valgrind iyong programa at sa dulo ng iyong programa 655 00:30:00,010 --> 00:30:02,240 tumatakbo bago ito tabla at nagbibigay sa iyo ng isa pang prompt, 656 00:30:02,240 --> 00:30:04,980 ito ay pagpunta sa-aralan ang iyong program habang ito ay tumatakbo 657 00:30:04,980 --> 00:30:07,740 at sabihin mo tumagas mo anumang memorya at mas mahusay pa, 658 00:30:07,740 --> 00:30:10,610 humipo ka ng memorya na hindi naman sa iyo? 659 00:30:10,610 --> 00:30:13,700 Hindi na ito maaaring mahuli ang lahat, ngunit ito ay medyo magandang sa pansing karamihan sa mga bagay. 660 00:30:13,700 --> 00:30:19,700 >> Kaya narito ang isang halimbawa ng aking pagkakaroon run ang program na ito, ang pagkakaroon ng run valgrind, 661 00:30:19,700 --> 00:30:21,470 sa isang programa na tinatawag na memory, at ako pagpunta 662 00:30:21,470 --> 00:30:24,730 upang i-highlight ang mga linya na huli ng interes sa amin. 663 00:30:24,730 --> 00:30:27,690 Kaya may mas higit pang distractions na tinanggal ko na mula sa mga slide. 664 00:30:27,690 --> 00:30:30,930 Ngunit sabihin makita lamang kung ano ang mga ito programa ay kaya ng pagsabi sa amin. 665 00:30:30,930 --> 00:30:34,800 Ito ay kaya ng pagsabi sa amin ng mga bagay tulad ng mga di-wastong write ng mga laki 4. 666 00:30:34,800 --> 00:30:38,020 Sa ibang salita, kung pindutin mo memory, partikular na 4 bytes ng memory 667 00:30:38,020 --> 00:30:40,350 na hindi ka dapat magkaroon ng, Maaari sabihin sa iyo valgrind iyon. 668 00:30:40,350 --> 00:30:41,660 Di-wastong write ng mga laki 4. 669 00:30:41,660 --> 00:30:43,640 Baliw kang apat na bytes na hindi mo kailangang. 670 00:30:43,640 --> 00:30:44,840 Saan ginawa mo na? 671 00:30:44,840 --> 00:30:45,900 Ito ang kagandahan. 672 00:30:45,900 --> 00:30:50,000 Dot Memory c line 21 ay kung saan mo screwed up at iyon ang dahilan kung bakit ito ay kapaki-pakinabang. 673 00:30:50,000 --> 00:30:53,410 Karamihan tulad ng GDB, maaari itong makatulong ituro sa iyo sa tunay na mga error. 674 00:30:53,410 --> 00:30:57,170 >> Ngayon, ang isang ito ay isang kaunti pa masyadong masalita, kung hindi nakakalito. 675 00:30:57,170 --> 00:31:01,307 40 bytes in 1 bloke ay tiyak nawala sa pagkawala tala 1 of 1. 676 00:31:01,307 --> 00:31:02,140 Ano ang ibig sabihin nito? 677 00:31:02,140 --> 00:31:05,920 Well, ito ay nangangahulugan lamang na iyong hiniling para sa 40 bytes at hindi ka nagbigay ng ito pabalik. 678 00:31:05,920 --> 00:31:08,930 Ikaw ay tumawag malloc o tumawag kayo GetString at ang operating system 679 00:31:08,930 --> 00:31:12,450 nagbigay ka ng 40 bytes, ngunit hindi mo napalaya o inilabas na memorya, 680 00:31:12,450 --> 00:31:15,400 at upang maging patas, hindi namin ipakita sa iyo kung paano magbigay ng bumalik memory. 681 00:31:15,400 --> 00:31:17,910 Ino-out may isang super simpleng function na tinatawag na libre. 682 00:31:17,910 --> 00:31:21,170 Dadalhin ng isang argument, ang mga bagay nais mong libreng o magbigay ng likod, 683 00:31:21,170 --> 00:31:23,430 ngunit 40 bytes, tila, sa programang ito 684 00:31:23,430 --> 00:31:27,300 ay nawala sa linya 20 ng memory dot c. 685 00:31:27,300 --> 00:31:28,650 >> Kaya sabihin makita programang ito. 686 00:31:28,650 --> 00:31:31,020 Ito ay sobrang walang silbi. 687 00:31:31,020 --> 00:31:33,980 Ito ay nagpapakita lamang ito partikular na error. 688 00:31:33,980 --> 00:31:34,920 Kaya sabihin tumagal ng isang pagtingin. 689 00:31:34,920 --> 00:31:39,920 Narito ang mga pangunahing at pangunahing, paunawa, tawag isang function na tinatawag f at pagkatapos ay nagbalik. 690 00:31:39,920 --> 00:31:41,550 Kaya hindi lahat na kawili-wili. 691 00:31:41,550 --> 00:31:42,664 Ano ang ibig f gawin? 692 00:31:42,664 --> 00:31:44,330 Pansinin na hindi ako nag-abala na may isang tularan. 693 00:31:44,330 --> 00:31:46,520 Nais kong panatilihin ang code bilang kaunti hangga't maaari. 694 00:31:46,520 --> 00:31:49,530 Kaya ko bang ilagay f itaas pangunahing at na multa, tiyak, 695 00:31:49,530 --> 00:31:51,500 para sa maikling programa tulad nito. 696 00:31:51,500 --> 00:31:56,910 Kaya f ay hindi bumalik sa anumang bagay at ang hindi kumuha ng anumang bagay, ngunit ito ay hindi gawin ito. 697 00:31:56,910 --> 00:31:59,620 Ito ay nagpapahayag, magkano ang gusto sa halimbawa sa Binky, 698 00:31:59,620 --> 00:32:02,682 isang pointer na tinatawag na x na pagpunta sa tindahan ng mga address ng isang int. 699 00:32:02,682 --> 00:32:03,890 Kaya na ang kaliwang bahagi. 700 00:32:03,890 --> 00:32:07,230 Sa Ingles, ano ang side-kanan na ginagawa? 701 00:32:07,230 --> 00:32:09,770 Kahit sino? 702 00:32:09,770 --> 00:32:13,665 Ano itong ginagawa para sa atin? 703 00:32:13,665 --> 00:32:14,651 Oo? 704 00:32:14,651 --> 00:32:16,623 >> Madla: [hindi marinig] beses ang laki ng isang int 705 00:32:16,623 --> 00:32:19,175 na kung saan ay 10 beses na [hindi marinig] 706 00:32:19,175 --> 00:32:20,800 David MALAN: Magandang at ipaalam sa akin sabihin sa maikling pangungusap. 707 00:32:20,800 --> 00:32:25,480 Kaya maglaan ng sapat na espasyo para sa 10 integer o 10, ano ang sukat ng isang int, 708 00:32:25,480 --> 00:32:29,340 ito ay apat na bytes, kaya 10 beses 4 ay 40, kaya kanang kamay na side na ko 709 00:32:29,340 --> 00:32:33,930 naka-highlight ay bigyan ako ng 40 bytes at tindahan ang address ng unang byte 710 00:32:33,930 --> 00:32:34,940 sa x. 711 00:32:34,940 --> 00:32:38,380 At ngayon, sa wakas, at narito ang kung saan ang program na ito ay maraming surot, kung ano ang 712 00:32:38,380 --> 00:32:41,540 mali sa linya 21 batay sa na logic? 713 00:32:41,540 --> 00:32:45,197 714 00:32:45,197 --> 00:32:46,280 Ano ang mali sa linya 21? 715 00:32:46,280 --> 00:32:46,780 Oo? 716 00:32:46,780 --> 00:32:49,550 Madla: Maaari mong hindi index sa x [hindi marinig]. 717 00:32:49,550 --> 00:32:50,300 David MALAN: Oo. 718 00:32:50,300 --> 00:32:52,270 Hindi ko dapat index sa x mo na. 719 00:32:52,270 --> 00:32:53,850 Kaya syntactically, na ang OK. 720 00:32:53,850 --> 00:32:56,990 Ano ang maganda ay, magkano ang gusto mong maaaring gamutin ang pangalan ng isang array 721 00:32:56,990 --> 00:33:01,080 parang ito ay isang pointer, katulad maaari mong ituring ang isang pointer na parang ito ay 722 00:33:01,080 --> 00:33:06,425 isang array, at sa gayon maaari kong syntactically sabihin x bracket ng isang bagay, x bracket i, 723 00:33:06,425 --> 00:33:07,800 ngunit ang 10 ay may problema. 724 00:33:07,800 --> 00:33:09,096 Bakit? 725 00:33:09,096 --> 00:33:10,910 >> Madla: Dahil ito ay hindi sa loob. 726 00:33:10,910 --> 00:33:12,390 >> David MALAN: Ito ay hindi sa loob na tipak ng memory. 727 00:33:12,390 --> 00:33:15,306 Ano ang pinakamalaking halaga ang dapat kong ay paglagay sa mga square bracket? 728 00:33:15,306 --> 00:33:16,870 9, 0 hanggang 9. 729 00:33:16,870 --> 00:33:18,160 Dahil sa zero-index. 730 00:33:18,160 --> 00:33:20,190 Kaya 0 hanggang 9 ay magiging masarap. 731 00:33:20,190 --> 00:33:23,960 Bracket 10 ay hindi mabuti at ngunit, pagpapabalik bagaman, sa bawat oras 732 00:33:23,960 --> 00:33:27,017 Mukhang ako na subukan na gumawa ng CS50 IDE crash sa pamamagitan ng pag-type sa bogus na mga halaga, 733 00:33:27,017 --> 00:33:29,100 ito ay hindi laging tumulong, at sa katunayan, na madalas mong 734 00:33:29,100 --> 00:33:31,460 makakuha ng masuwerteng dahil lang sa operating system ay hindi 735 00:33:31,460 --> 00:33:35,467 mapapansin mo na ikaw napaka bahagyang pumasa ang ilang tipak ng memory, 736 00:33:35,467 --> 00:33:38,300 dahil ikaw ay nanatili sa loob ng technically iyong segment, ngunit higit pa sa na 737 00:33:38,300 --> 00:33:40,940 sa isang klase ng mga operating system, at iba bagay na tulad nito 738 00:33:40,940 --> 00:33:43,000 maaaring tunay madaling pumunta undetected. 739 00:33:43,000 --> 00:33:48,120 Ang iyong programa ay hindi kailanman pagpunta sa crash patuloy ngunit marahil isang beses sa sandali. 740 00:33:48,120 --> 00:33:50,610 >> At subukan ni valgrind kaya hayaan sa mga ito, at narito ang 741 00:33:50,610 --> 00:33:52,870 kung saan kami makakuha ng bumagsak sa pamamagitan ng output sa ilang sandali. 742 00:33:52,870 --> 00:34:00,810 Kaya gumawa ng memory check valgrind tumagas ay katumbas ng full dot slash memory. 743 00:34:00,810 --> 00:34:03,040 At narito ang kung bakit nangangako ako ito ay mapuspos. 744 00:34:03,040 --> 00:34:05,700 Narito kung ano ang valgrind, narito kung ano isang programmer, ilang taon na ang nakaraan 745 00:34:05,700 --> 00:34:08,469 nagpasya na ito ay isang magandang ideya para sa mga output sa hitsura. 746 00:34:08,469 --> 00:34:09,750 Kaya sabihin gumawa ng kahulugan ng mga ito. 747 00:34:09,750 --> 00:34:13,120 Kaya lahat ng mga paraan sa kaliwa-kamay side ng walang magandang dahilan 748 00:34:13,120 --> 00:34:16,620 ay ang proseso ng ID ng programa tumakbo lang namin, ang mga natatanging identifier 749 00:34:16,620 --> 00:34:18,030 para sa programa tumakbo lang namin. 750 00:34:18,030 --> 00:34:19,738 Tinanggal namin na mula sa mga slide, ngunit may 751 00:34:19,738 --> 00:34:22,190 ay ang ilang mga kapaki-pakinabang na impormasyon dito. 752 00:34:22,190 --> 00:34:24,684 >> Ni mag-scroll pataas sa pinakatuktok Hayaan. 753 00:34:24,684 --> 00:34:25,600 Narito kung saan sinimulan namin. 754 00:34:25,600 --> 00:34:27,040 Kaya ito ay hindi lahat na marami output. 755 00:34:27,040 --> 00:34:30,429 Narito na ang mga di-wastong write ng laki 4 sa 21 linya. 756 00:34:30,429 --> 00:34:31,760 Well, kung ano ang linya 21? 757 00:34:31,760 --> 00:34:34,500 Line 21 ay eksaktong ito at ito ang akma 758 00:34:34,500 --> 00:34:37,290 na ako sa validly pagsulat ng 4 bytes dahil ako 759 00:34:37,290 --> 00:34:40,389 sinusubukan mong ilagay ito integer, na kung saan ay maaaring maging anumang bagay, 760 00:34:40,389 --> 00:34:42,370 mangyayari lamang ito upang maging zero, ngunit sinusubukan ko 761 00:34:42,370 --> 00:34:44,940 upang ilagay ito sa isang lokasyon na ay hindi nabibilang sa akin. 762 00:34:44,940 --> 00:34:50,900 Bukod pa rito, rito, 40 bytes sa isa bloke ay talagang nawala sa record 1. 763 00:34:50,900 --> 00:34:56,500 Ito ay dahil kapag tumawag ako malloc dito, hindi ko talaga libre ang memory. 764 00:34:56,500 --> 00:34:58,140 >> Kaya kung paano namin ito aayusin? 765 00:34:58,140 --> 00:35:02,970 Hayaan akong magpatuloy at maging isang maliit na mas ligtas at gawin 9 doon at ipaalam sa akin dito libre x. 766 00:35:02,970 --> 00:35:04,820 Ito ang bagong pag-andar para sa araw na ito. 767 00:35:04,820 --> 00:35:11,520 Kung muling palabas ng pelikula ko ngayong gumawa ng memory tuldok slash, ni patakbuhin valgrind muli sa ito ipaalam, 768 00:35:11,520 --> 00:35:14,990 i-maximize ang aking window at pindutin ang Enter. 769 00:35:14,990 --> 00:35:16,900 Ngayon, ito ay mabuti. 770 00:35:16,900 --> 00:35:19,590 Ibaon nila ang mabuting balita sa lahat ng mga ito output. 771 00:35:19,590 --> 00:35:20,810 Lahat magbunton bloke ay libre. 772 00:35:20,810 --> 00:35:23,604 Darating kami pabalik sa kung ano ang magbunton ay, ngunit walang mga paglabas ay maaari. 773 00:35:23,604 --> 00:35:25,520 Kaya ito ay isa lamang kasangkapan para sa iyong tool kit 774 00:35:25,520 --> 00:35:30,220 na kung saan maaari mong simulan upang hanapin mo ngayon ang mga error na tulad ng. 775 00:35:30,220 --> 00:35:34,532 >> Ngunit sabihin makita kung ano higit pa maaaring magkamali dito. 776 00:35:34,532 --> 00:35:38,890 Ni transition Hayaan ngayon upang tunay na paglutas ng problema. 777 00:35:38,890 --> 00:35:42,440 Bilang isang tabi, kung ito ay sa hitsura ng isang maliit na piraso ng pagkalito o pag-aalaala, 778 00:35:42,440 --> 00:35:43,430 ito ay nakakatawa ngayon. 779 00:35:43,430 --> 00:35:46,400 780 00:35:46,400 --> 00:35:46,900 Oo. 781 00:35:46,900 --> 00:35:49,040 Iyan ay medyo mabuti. 782 00:35:49,040 --> 00:35:50,890 Dahil payo ay address at address 783 00:35:50,890 --> 00:35:53,098 sa pangkalahatan sa pamamagitan ng convention nakasulat sa hexadecimal. 784 00:35:53,098 --> 00:35:54,650 Ha, ha, na ito ay funny ngayon. 785 00:35:54,650 --> 00:35:58,390 Sa papaano mang paraan, kaya sabihin ngayon aktwal na malutas ang isang problema. 786 00:35:58,390 --> 00:36:00,840 Ito ay naging sobrang, sobrang low-level kaya sa ngayon, 787 00:36:00,840 --> 00:36:03,950 at maaari naming aktwal na gawin kapaki-pakinabang mga bagay-bagay na may mga detalye ng mababang antas. 788 00:36:03,950 --> 00:36:06,710 >> Kaya ipinakilala namin ng ilang linggo nakalipas ang paniwala ng isang array. 789 00:36:06,710 --> 00:36:09,177 Isang array ay dahil sa ganda ito ay mahirap upang linisin ang aming code 790 00:36:09,177 --> 00:36:11,760 dahil kung gusto naming magsulat ng isang program na may maramihang mga mag-aaral 791 00:36:11,760 --> 00:36:15,270 o maramihang mga pangalan at mga bahay at dorms at mga kolehiyo at lahat ng iyon, 792 00:36:15,270 --> 00:36:19,430 kami ay maaaring tindahan ng higit pa sa lahat ng bagay nang malinis sa loob ng isang array. 793 00:36:19,430 --> 00:36:23,039 Ngunit imungkahi isa downside ng isang array kaya sa ngayon. 794 00:36:23,039 --> 00:36:26,080 Kahit na hindi mo na pinagdudusahan ito sa iyong sarili sa isang programa, katutubo lamang, 795 00:36:26,080 --> 00:36:30,870 kung ano ay isang masamang bagay tungkol sa isang array marahil,? 796 00:36:30,870 --> 00:36:32,337 Ako marinig ng ilang murmurs. 797 00:36:32,337 --> 00:36:34,170 Madla: Ito ay mahirap upang baguhin ang laki. 798 00:36:34,170 --> 00:36:36,128 David MALAN: Ito ay mahirap upang baguhin ang laki. 799 00:36:36,128 --> 00:36:38,660 Hindi mo maaaring baguhin ang laki ng isang array, sa katunayan, per se 800 00:36:38,660 --> 00:36:43,040 sa C. Maaari kang magtalaga ng isa pang array, ilipat ang lahat ng bagay mula sa mga lumang isa 801 00:36:43,040 --> 00:36:45,380 sa bagong, at ngayon magkaroon ng ilang dagdag na espasyo, 802 00:36:45,380 --> 00:36:47,469 ngunit ito ay hindi tulad ng isang wika tulad ng Java o sawa 803 00:36:47,469 --> 00:36:49,760 o anumang bilang ng iba pang mga mga wika na kung saan ang ilan sa iyo 804 00:36:49,760 --> 00:36:52,070 maaaring maging pamilyar kung saan mo Maaari lamang panatilihin ang pagdaragdag ng mga bagay-bagay 805 00:36:52,070 --> 00:36:53,930 hanggang sa pagkainis ad hanggang sa dulo ng isang array. 806 00:36:53,930 --> 00:36:57,880 Kapag mayroon kang isang hanay ng mga laki 6, iyon ay ang laki nito, 807 00:36:57,880 --> 00:37:01,970 at kaya magkano tulad ng mas maaga ang mga ideya pagkakaroon ng isang buffer ng isang tiyak na laki, 808 00:37:01,970 --> 00:37:05,940 mayroon kang hulaan sa labas ng gate ano ang laki na gusto mo ito upang maging? 809 00:37:05,940 --> 00:37:07,880 Kung hulaan mo masyadong malaki, ikaw ay pag-aaksaya ng espasyo. 810 00:37:07,880 --> 00:37:10,950 Kung hulaan mo masyadong maliit, ikaw ay Hindi maaaring mag-imbak ang data na iyon, hindi bababa sa 811 00:37:10,950 --> 00:37:12,940 walang isang pulutong ng mas maraming trabaho. 812 00:37:12,940 --> 00:37:18,180 >> Kaya ngayon, salamat sa mga payo, magagawa namin simulan stitching magkasama ang aming sariling mga pasadyang 813 00:37:18,180 --> 00:37:20,989 istruktura ng data, at sa katunayan, dito ay isang bagay 814 00:37:20,989 --> 00:37:23,030 na mukhang ng kaunti pa cryptic sa unang tingin, 815 00:37:23,030 --> 00:37:26,440 ngunit ito ay kung ano ang makikita namin tumawag ng isang naka-link listahan, at ang pangalan ng kanyang uri ng nagbubuod 816 00:37:26,440 --> 00:37:26,940 ito. 817 00:37:26,940 --> 00:37:29,550 Ito ay isang listahan ng mga numero, o sa kasong ito, ang isang listahan ng mga numero, 818 00:37:29,550 --> 00:37:33,480 ngunit ito ay maaaring maging isang listahan ng anumang bagay, ngunit ito ay naka-link nang sama-sama sa pamamagitan ng paraan ng mga arrow, 819 00:37:33,480 --> 00:37:36,380 at tumagal lamang ng isang hulaan sa kung ano ang diskarteng 820 00:37:36,380 --> 00:37:38,310 kami ay pagpunta sa ma tahiin magkasama, 821 00:37:38,310 --> 00:37:42,540 uri ng tulad ng popcorn sa isang thread, isang listahan ng link parihaba dito? 822 00:37:42,540 --> 00:37:43,936 Ang mga numero? 823 00:37:43,936 --> 00:37:45,560 Ano ang mga tampok na pinagbabatayan ng wika? 824 00:37:45,560 --> 00:37:46,350 >> Madla: A pointer. 825 00:37:46,350 --> 00:37:47,308 >> David MALAN: Isang pointer. 826 00:37:47,308 --> 00:37:51,700 Kaya ang bawat isa sa mga arrow na ito dito ay kumakatawan sa isang pointer o lamang ng isang address. 827 00:37:51,700 --> 00:37:54,590 Kaya sa ibang salita, kung gusto ko upang mag-imbak ng isang listahan ng mga numero, 828 00:37:54,590 --> 00:37:59,040 Hindi ko lang mag-imbak ito kung gusto ko ng kakayahan sa paglaki at pag-urong 829 00:37:59,040 --> 00:38:00,990 aking mga istraktura ng data sa isang array. 830 00:38:00,990 --> 00:38:03,000 Kaya kailangan ko upang magkaroon ng isang maliit mas sopistikado, 831 00:38:03,000 --> 00:38:05,720 ngunit mapapansin na ito larawan ng uri ng nagmumungkahi 832 00:38:05,720 --> 00:38:08,650 na kung lang kayong maliit na mga thread pagkonekta sa lahat ng bagay magkasama, 833 00:38:08,650 --> 00:38:13,100 marahil ay hindi na mahirap upang gumawa ng puwang sa pagitan ng dalawang ng mga parihaba 834 00:38:13,100 --> 00:38:16,750 o dalawang ng mga nodes, tulad ng kami ay magsimula pagtawag sa kanila, ilagay sa isang bagong node, 835 00:38:16,750 --> 00:38:19,547 at pagkatapos ay may ilang mga bagong thread, lamang umaagos ang tatlong nodes magkasama, 836 00:38:19,547 --> 00:38:22,880 ang unang isa, ang huling isa, at ang isa na ipinasok mo lamang sa gitna. 837 00:38:22,880 --> 00:38:26,000 >> At sa katunayan ng isang listahan ng mga link, hindi katulad ng isang array, ay dynamic. 838 00:38:26,000 --> 00:38:27,840 Maaari itong maging at kaya nito pag-urong at wala ka 839 00:38:27,840 --> 00:38:32,434 kung alam o pag-aalaga ng maaga kung magkano ang data na ay pagpunta sa pag-iimbak, 840 00:38:32,434 --> 00:38:35,600 ngunit ito ay lumiliko out na namin na maging isang maliit maingat tungkol sa kung paano ipatupad ito. 841 00:38:35,600 --> 00:38:39,070 Kaya isaalang-alang kung paano namin ipatupad ang unang hayaan ang isa sa maliliit na parihaba. 842 00:38:39,070 --> 00:38:40,690 Ito ay madali upang ipatupad ang isang int. 843 00:38:40,690 --> 00:38:44,000 Sabihin mo lang int n at pagkatapos ay makakakuha ka ng 4 bytes para sa isang int, 844 00:38:44,000 --> 00:38:49,089 ngunit kung paano ako makakakuha ng isang int, tumawag ito n, at pagkatapos ng isang pointer, tumawag ito sa susunod ipaalam. 845 00:38:49,089 --> 00:38:50,880 Kami ay maaaring tumawag sa mga mga bagay-bagay kahit ano ang gusto namin 846 00:38:50,880 --> 00:38:53,590 ngunit kailangan ko ng isang istraktura custom data. 847 00:38:53,590 --> 00:38:54,257 Oo? 848 00:38:54,257 --> 00:38:57,020 >> Madla: Ampersand [hindi marinig]. 849 00:38:57,020 --> 00:39:00,940 >> David MALAN: Kaya ampersand gagamitin namin upang makuha ang address ng isang node potensyal. 850 00:39:00,940 --> 00:39:02,740 Ngunit kailangan namin ng isa pang Ang tampok ng C upang 851 00:39:02,740 --> 00:39:06,700 upang bigyan ako ng kakayahan upang lumikha ito pasadyang parihaba, ang custom 852 00:39:06,700 --> 00:39:08,919 variable kung ikaw ay, sa memorya. 853 00:39:08,919 --> 00:39:09,710 Madla: A struct. 854 00:39:09,710 --> 00:39:10,626 David MALAN: Isang struct. 855 00:39:10,626 --> 00:39:14,310 Pagpapabalik mula noong nakaraang linggo, ipinakilala namin struct, ito medyo simple keyword 856 00:39:14,310 --> 00:39:16,254 na nagbibigay-daan sa amin gumawa ng mga bagay na tulad nito. 857 00:39:16,254 --> 00:39:18,420 C ay hindi dumating sa isang data istraktura na tinatawag na mag-aaral. 858 00:39:18,420 --> 00:39:22,190 Ito ay nanggagaling sa int at float at char at tulad, ngunit ito ay hindi nanggaling sa mga estudyante, 859 00:39:22,190 --> 00:39:26,750 ngunit maaari naming lumikha ng isang uri ng data na estudyante, isang istraktura ng mag-aaral, na may syntax na ito 860 00:39:26,750 --> 00:39:27,250 dito. 861 00:39:27,250 --> 00:39:28,350 At makikita mo ito muli at muli. 862 00:39:28,350 --> 00:39:30,426 Kaya huwag mag-alala tungkol sa pagsasaulo ng mga keyword, 863 00:39:30,426 --> 00:39:33,300 ngunit ang mga keyword na iyon ang mahalaga ay lamang ang katotohanan na sinabi namin struct 864 00:39:33,300 --> 00:39:37,590 at pagkatapos ay tinatawag naming ito ang mag-aaral at sa loob ng ng mag-aaral ay isang pangalan at isang bahay 865 00:39:37,590 --> 00:39:39,390 o isang dorm o mga katulad. 866 00:39:39,390 --> 00:39:41,980 >> At kaya ngayon araw na ito, ni imungkahi ito ipaalam. 867 00:39:41,980 --> 00:39:45,240 Idinagdag ko na ang ilang mga salita, ngunit kung gusto ko upang ipatupad ang rectangle na ito na 868 00:39:45,240 --> 00:39:48,440 Nakakuha parehong isang int at isang pointer, alam mo kung ano, ako 869 00:39:48,440 --> 00:39:51,540 pagpunta na idedeklara ng isang struct tinatawag node. 870 00:39:51,540 --> 00:39:55,630 Ako din, sa loob ng mga ito, pagpunta sa sabihin na ang isang node, ito parihaba, may isang int 871 00:39:55,630 --> 00:39:59,730 at kami ay tumawag ito n at ito ay may susunod na pointer. 872 00:39:59,730 --> 00:40:02,540 At ito ay isang maliit na masyadong masalita, ngunit kung sa tingin mo tungkol dito, 873 00:40:02,540 --> 00:40:07,300 ang mga arrow na nasa larawan ilang sandali ang nakalipas ay kung ano ang uri ng data? 874 00:40:07,300 --> 00:40:12,330 Saan bawat isa ng mga arrow ay nakaturo sa kung ano ang uri ng istraktura ng data? 875 00:40:12,330 --> 00:40:14,332 Ito ay hindi lamang ng pagturo sa isang int per se. 876 00:40:14,332 --> 00:40:16,165 Ito ay nakaturo sa buong parihabang bagay 877 00:40:16,165 --> 00:40:18,720 at na parihabang bagay, sinabi namin, ay tinatawag na isang node. 878 00:40:18,720 --> 00:40:21,720 At kaya namin uri ng kung recursively tukuyin ang mga ito tulad ng 879 00:40:21,720 --> 00:40:26,270 na ang isang node, sabihin natin, ay maglalaman ng isang int tinatawag n 880 00:40:26,270 --> 00:40:31,070 at isang pointer na tinatawag na susunod at ang uri ng data na istraktura na kung saan ang 881 00:40:31,070 --> 00:40:35,770 na pointer mga puntos ay tila magiging struct node. 882 00:40:35,770 --> 00:40:41,550 >> Kaya ito ay annoyingly masyadong masalita at upang maging pilosopo lamang, 883 00:40:41,550 --> 00:40:44,100 ang dahilan kung bakit hindi namin maaari sabihin lang na ito, na lantaran 884 00:40:44,100 --> 00:40:46,860 Mukhang mas nababasa ng isang pulutong, ay dahil pagpapabalik na C basahin 885 00:40:46,860 --> 00:40:48,710 mga bagay-bagay sa itaas hanggang sa ibaba, kaliwa papuntang kanan. 886 00:40:48,710 --> 00:40:54,120 Ito ay hindi hanggang sa makuha namin ang semicolon na ang tunay na umiiral ang keyword node. 887 00:40:54,120 --> 00:40:57,980 Kaya kung nais namin na magkaroon ng ganitong uri ng mga cyclical reference sa loob ng data 888 00:40:57,980 --> 00:41:02,120 istraktura, kami ay may sa gawin ito, na kung saan ang sinasabi namin struct node sa tuktok, na kung saan 889 00:41:02,120 --> 00:41:06,770 ay nagbibigay sa amin ng isang mas matagal na paraan ng naglalarawan na ito bagay, at pagkatapos sa loob sabihin namin struct node, 890 00:41:06,770 --> 00:41:09,560 at pagkatapos ay sa huling linya sinasabi namin, lahat ng karapatan, C, sa daan, 891 00:41:09,560 --> 00:41:12,060 tumawag lamang sa mga ito ang buong sumpain bagay sa isang node at itigil 892 00:41:12,060 --> 00:41:14,360 gamit ang keyword na struct kabuuan. 893 00:41:14,360 --> 00:41:18,030 Kaya ito ay lamang ng isang uri ng isang syntactic bilis ng kamay na nagbibigay-daan sa huli kaming lumikha 894 00:41:18,030 --> 00:41:21,370 isang bagay na mukhang eksakto tulad nito. 895 00:41:21,370 --> 00:41:25,010 >> Kaya kung ipinapalagay namin ngayon ng aming makakaya ipatupad ang bagay na ito sa C, 896 00:41:25,010 --> 00:41:28,040 kung paano gawin namin talagang simulan traversing ito? 897 00:41:28,040 --> 00:41:32,360 Well, sa katunayan, ang kailangan lamang nating gawin ay umulit mula kaliwa papuntang kanan at lamang 898 00:41:32,360 --> 00:41:35,960 uri ng ipasok nodes o tanggalin nodes o maghanap para sa mga bagay-bagay kung saan man gusto namin, 899 00:41:35,960 --> 00:41:39,560 ngunit upang gawin ito, sabihin sige at gumawa mga bagay-bagay ng kaunti pa sa real dahil ito 900 00:41:39,560 --> 00:41:42,560 ay sobrang mababa ang antas ng kaya sa ngayon. 901 00:41:42,560 --> 00:41:45,700 Gusto sinuman literal na maging una? 902 00:41:45,700 --> 00:41:46,200 SIGE. 903 00:41:46,200 --> 00:41:47,092 Lumapit sa up. 904 00:41:47,092 --> 00:41:47,800 Ano ang pangalan mo? 905 00:41:47,800 --> 00:41:48,499 >> DAVID: David. 906 00:41:48,499 --> 00:41:49,290 David MALAN: David. 907 00:41:49,290 --> 00:41:49,998 Masaya akong makilala kayo. 908 00:41:49,998 --> 00:41:50,960 Ako rin. 909 00:41:50,960 --> 00:41:52,450 Lahat tama. 910 00:41:52,450 --> 00:41:53,990 At kailangan namin ng isang number 9. 911 00:41:53,990 --> 00:41:55,240 Hindi kasing ganda ng una, marahil. 912 00:41:55,240 --> 00:41:56,430 OK, number 9. 913 00:41:56,430 --> 00:41:59,667 Ang bilang 17, please. 914 00:41:59,667 --> 00:42:01,000 Hayaan akong bumalik sa dako pa roon. 915 00:42:01,000 --> 00:42:03,980 Number 22, paki, at kung paano tungkol sa malayo sa likod 916 00:42:03,980 --> 00:42:06,344 kung ang maaari kong makita ang anumang mga kamay sa lahat ng mga light o hindi. 917 00:42:06,344 --> 00:42:08,010 Isang tao ang pagiging nagboluntaryo may karapatan. 918 00:42:08,010 --> 00:42:08,968 Gusto mo bang magkaroon ng? 919 00:42:08,968 --> 00:42:10,450 Ang iyong bisig ay pwersahang pagpunta up. 920 00:42:10,450 --> 00:42:12,340 OK, 17. 921 00:42:12,340 --> 00:42:13,690 22. 922 00:42:13,690 --> 00:42:15,120 26 ay darating pababa. 923 00:42:15,120 --> 00:42:18,450 Gusto kahit sino pa ang nais na forcefully-- Halika up. 924 00:42:18,450 --> 00:42:21,030 Isang aktwal na volunteer. 925 00:42:21,030 --> 00:42:23,330 >> Kaya nang masyadong mabilis, kung ka guys ay maaaring ayusin 926 00:42:23,330 --> 00:42:26,550 Gusto ninyo ang inyong sarili lamang ang mga node sa screen. 927 00:42:26,550 --> 00:42:27,510 Salamat. 928 00:42:27,510 --> 00:42:29,234 At makikita mo na 26. 929 00:42:29,234 --> 00:42:30,650 Lahat ng mga karapatan at mabilis na pagpapakilala. 930 00:42:30,650 --> 00:42:32,139 Kaya ako si David at ikaw din? 931 00:42:32,139 --> 00:42:32,680 DAVID: David. 932 00:42:32,680 --> 00:42:33,721 David MALAN: At ikaw? 933 00:42:33,721 --> 00:42:34,229 JAKE: Jake. 934 00:42:34,229 --> 00:42:34,729 SUE: idemanda. 935 00:42:34,729 --> 00:42:35,229 ALEX: Alex. 936 00:42:35,229 --> 00:42:36,475 RAPHAEL: Raphael. 937 00:42:36,475 --> 00:42:37,100 TAYLOR: Taylor. 938 00:42:37,100 --> 00:42:37,466 David MALAN: Taylor. 939 00:42:37,466 --> 00:42:37,590 Magaling. 940 00:42:37,590 --> 00:42:39,810 Kaya ito ay ang aming mga boluntaryo para sa araw at sige 941 00:42:39,810 --> 00:42:43,090 at maglipat ng isang maliit na paraan, at pumunta lamang magpatuloy at panatilihin 942 00:42:43,090 --> 00:42:47,024 humahawak ng iyong numero bilang ikaw o ang iyong unang pag-sign at gamit ang iyong kaliwang kamay, 943 00:42:47,024 --> 00:42:48,940 sige, at ipatupad lamang mga arrow, lamang 944 00:42:48,940 --> 00:42:51,360 upang ang iyong kaliwang kamay ay literal pagturo sa anumang dapat mong ituro 945 00:42:51,360 --> 00:42:54,610 sa, at bigyan ang iyong sarili ng ilang silid sa gayon ay maaari naming makita ang iyong mga arm talaga 946 00:42:54,610 --> 00:42:58,120 pagturo, at maaari mo lamang ituro uri ng sa lupa ay ayos lang. 947 00:42:58,120 --> 00:43:03,040 >> Kaya dito kami ay may isang listahan ng mga link ng isa, dalawa, tatlo, apat, lima nodes sa una, 948 00:43:03,040 --> 00:43:05,860 at mapapansin na namin ang mga espesyal na pointer sa simula kung sino ang 949 00:43:05,860 --> 00:43:09,770 key dahil kami ay may upang subaybayan ng buong listahan haba kahit paano. 950 00:43:09,770 --> 00:43:13,590 Ang mga lalaki, kahit na sila ay nag-iwan sa kanan, pabalik sa likod sa memorya, 951 00:43:13,590 --> 00:43:15,950 ito ay maaari talagang maging kahit saan sa memory ng computer. 952 00:43:15,950 --> 00:43:18,240 Kaya ang mga guys ay maaaring nakatayo kahit saan sa entablado 953 00:43:18,240 --> 00:43:20,960 at na multa, kaya hangga't ang mga ito ay tunay na tumuturo sa isa't isa, 954 00:43:20,960 --> 00:43:22,770 ngunit upang panatilihin ang mga bagay-bagay malinis at simple, bibigyan namin ng 955 00:43:22,770 --> 00:43:25,728 gumuhit lamang ang mga ito kaliwa hanggang kanang tulad na ito, ngunit may maaaring napakalaking gaps 956 00:43:25,728 --> 00:43:26,790 sa pagitan ng mga nodes. 957 00:43:26,790 --> 00:43:30,710 >> Ngayon, kung gusto kong talagang ipasok ang ilang mga bagong halaga, sige at gawin ito ipaalam. 958 00:43:30,710 --> 00:43:33,720 Kami ay may isang pagkakataon na ngayon upang pumili ng isa pang node. 959 00:43:33,720 --> 00:43:39,820 Say ni magsimula sa mallocing 55 ipaalam. 960 00:43:39,820 --> 00:43:41,320 Gusto ng isang tao isip na malloc? 961 00:43:41,320 --> 00:43:42,280 OK, dumating sa up. 962 00:43:42,280 --> 00:43:42,992 Ano ang pangalan mo? 963 00:43:42,992 --> 00:43:43,700 RAINBOW: Rainbow. 964 00:43:43,700 --> 00:43:44,050 David MALAN: Rainbow? 965 00:43:44,050 --> 00:43:44,810 Lahat tama. 966 00:43:44,810 --> 00:43:46,600 Malloc Rainbow. 967 00:43:46,600 --> 00:43:47,450 Lumapit sa up. 968 00:43:47,450 --> 00:43:51,610 Kaya ngayon kami ay upang hilingin sa ating sarili algorithmically kung saan maaari naming ilagay ang 55. 969 00:43:51,610 --> 00:43:53,610 Kaya ang lahat ng sa amin, malinaw naman, kung saan siya ay malamang na 970 00:43:53,610 --> 00:43:55,401 nabibilang kung kami ay nagsisikap upang panatilihin ang pinagsunod-sunod na ito 971 00:43:55,401 --> 00:43:58,299 at kung ikaw guys ay maaaring tumagal ng isa hakbang pabalik kaya hindi namin malagas 972 00:43:58,299 --> 00:43:59,590 entablado, na magiging malaki. 973 00:43:59,590 --> 00:44:01,420 Kaya talaga, Rainbow, magsimulang muli dito sa akin, 974 00:44:01,420 --> 00:44:04,200 dahil kami na ang computer ngayon ay maaari makita lamang ang isang variable sa isang pagkakataon. 975 00:44:04,200 --> 00:44:05,190 Kaya kung ito ay ang unang node. 976 00:44:05,190 --> 00:44:07,160 Pansinin siya ay hindi isang node, siya ay isang pointer lamang, 977 00:44:07,160 --> 00:44:10,270 at iyon ang dahilan kung bakit siya ay iguguhit na maging lamang sa sukat ng isang pointer, hindi 978 00:44:10,270 --> 00:44:11,780 isa sa mga full parihaba. 979 00:44:11,780 --> 00:44:16,650 Kaya kami ay pagpunta upang suriin sa bawat pag-ulit ay 55 mas mababa sa 9? 980 00:44:16,650 --> 00:44:17,150 Hindi. 981 00:44:17,150 --> 00:44:19,060 Ay 55 mas mababa sa 17? 982 00:44:19,060 --> 00:44:19,720 Hindi. 983 00:44:19,720 --> 00:44:20,800 Mas mababa sa 22? 984 00:44:20,800 --> 00:44:22,020 Mas mababa sa 26? 985 00:44:22,020 --> 00:44:23,390 Mas mababa sa 34? 986 00:44:23,390 --> 00:44:25,890 At kaya ngayon, nang walang alinlangan Rainbow nabibilang sa dulo. 987 00:44:25,890 --> 00:44:27,270 Kaya upang maging malinaw, at kung ano ang ay ang iyong pangalan, Taylor? 988 00:44:27,270 --> 00:44:27,895 >> TAYLOR: Taylor. 989 00:44:27,895 --> 00:44:32,510 David MALAN: Kaya bukod sa Taylor kaliwang kamay at kamay Rainbow dito, 990 00:44:32,510 --> 00:44:38,324 pangangailangan na ang kamay upang ituro sa kung ano ang sa order upang ipasok 55 sa listahang ito? 991 00:44:38,324 --> 00:44:39,240 Ano ang dapat nating gawin? 992 00:44:39,240 --> 00:44:39,700 Oo? 993 00:44:39,700 --> 00:44:41,140 >> Madla: hand Taylor pangangailangan sa point kaliwa. 994 00:44:41,140 --> 00:44:41,680 >> David MALAN: Eksakto. 995 00:44:41,680 --> 00:44:43,800 Kaya ng pagpasok ng isang node sa dulo ng listahan 996 00:44:43,800 --> 00:44:47,140 ay medyo simple dahil Taylor lamang Wala sa punto, sa halip ng sa lupa 997 00:44:47,140 --> 00:44:49,640 o kami ay tumawag ito null, null ay uri ng kawalan 998 00:44:49,640 --> 00:44:51,640 ng isang pointer o ng isang espesyal zero pointer, ikaw ay 999 00:44:51,640 --> 00:44:53,740 pagpunta sa point sa iyong kaliwang kamay sa Rainbow at pagkatapos Rainbow, 1000 00:44:53,740 --> 00:44:55,910 kung saan dapat iyong kaliwa kamay marahil point? 1001 00:44:55,910 --> 00:44:56,570 Down. 1002 00:44:56,570 --> 00:45:00,140 Ito ay hindi mabuti kung ang kanyang kamay ay isang uri ng pagturo off dito o uri ng anumang 1003 00:45:00,140 --> 00:45:00,640 na paraan. 1004 00:45:00,640 --> 00:45:02,407 Iyon ay ituturing ang halaga ng basura, 1005 00:45:02,407 --> 00:45:04,240 ngunit kung siya puntos sa ilang kilalang halaga, ipapakita namin 1006 00:45:04,240 --> 00:45:07,360 tawag na ito sa zero o null, na OK dahil kami ay may isang term na ito sa 1007 00:45:07,360 --> 00:45:09,390 at alam namin ang listahan na ngayon ay kumpleto na. 1008 00:45:09,390 --> 00:45:11,550 >> Kaya kung ano ang isa pang medyo simple kaso? 1009 00:45:11,550 --> 00:45:13,125 Puwede naming malloc 5? 1010 00:45:13,125 --> 00:45:14,010 Lumapit sa up. 1011 00:45:14,010 --> 00:45:14,782 Ano ang pangalan mo? 1012 00:45:14,782 --> 00:45:15,490 TIFFANY: Tiffany. 1013 00:45:15,490 --> 00:45:16,000 David MALAN: Sorry? 1014 00:45:16,000 --> 00:45:16,470 TIFFANY: Tiffany. 1015 00:45:16,470 --> 00:45:16,880 David MALAN: Tiffany. 1016 00:45:16,880 --> 00:45:17,110 Lahat tama. 1017 00:45:17,110 --> 00:45:19,071 Tiffany ay malloced may halaga 5. 1018 00:45:19,071 --> 00:45:19,570 Lumapit sa up. 1019 00:45:19,570 --> 00:45:23,820 Isa na ito ay medyo madali masyadong, ngunit Isaalang-alang natin sunod ng mga operasyon sa ngayon. 1020 00:45:23,820 --> 00:45:25,820 Ito ay medyo madali Taylor sa dulo. 1021 00:45:25,820 --> 00:45:30,302 Number 5 ay siyempre mas mababa sa 9, at sa gayon kami David, mayroon kaming Tiffany, 1022 00:45:30,302 --> 00:45:31,260 at kung ano ang pangalan mo? 1023 00:45:31,260 --> 00:45:31,680 >> JAKE: Jake. 1024 00:45:31,680 --> 00:45:32,470 >> David MALAN: Jake. 1025 00:45:32,470 --> 00:45:34,300 Tiffany, Jake, at David. 1026 00:45:34,300 --> 00:45:36,580 Dapat na unang na-update na ang mga kamay? 1027 00:45:36,580 --> 00:45:39,260 1028 00:45:39,260 --> 00:45:40,590 Ano ang gusto mong gawin dito? 1029 00:45:40,590 --> 00:45:45,244 May isang pares ng posibleng paraan, ngunit may isa o higit pang mga maling paraan din. 1030 00:45:45,244 --> 00:45:46,620 >> Madla: Magsimula sa pinakakaliwa. 1031 00:45:46,620 --> 00:45:47,800 >> David MALAN: Magsimula sa pinakakaliwa. 1032 00:45:47,800 --> 00:45:49,008 Sinong pinakakaliwa dito pagkatapos? 1033 00:45:49,008 --> 00:45:49,700 Madla: Una. 1034 00:45:49,700 --> 00:45:50,366 >> David MALAN: OK. 1035 00:45:50,366 --> 00:45:53,781 Kaya magsimula sa una at kung saan mo nais na i-update ang mga kamay ni David upang maging? 1036 00:45:53,781 --> 00:45:54,780 Madla: Patungo sa 5. 1037 00:45:54,780 --> 00:45:55,446 David MALAN: OK. 1038 00:45:55,446 --> 00:45:59,026 Kaya David, point sa limang o Tiffany dito, at ngayon? 1039 00:45:59,026 --> 00:46:01,072 >> Madla: Tiffany puntos sa mga 9? 1040 00:46:01,072 --> 00:46:04,030 David MALAN: Perfect, maliban Binky ulo lamang ang uri ng nahulog off, right? 1041 00:46:04,030 --> 00:46:06,820 Dahil kung ano ang mali sa ang larawang ito ng literal? 1042 00:46:06,820 --> 00:46:08,070 Madla: Wala ay pagturo. 1043 00:46:08,070 --> 00:46:09,945 David MALAN: Wala ay tumuturo sa Jake ngayon. 1044 00:46:09,945 --> 00:46:13,360 Literal na naulila kaming 9 at 17, at na namin literal 1045 00:46:13,360 --> 00:46:18,450 leaked lahat ng ito memory, dahil sa pamamagitan ng pag-update ng unang kamay ni David, na ang 1046 00:46:18,450 --> 00:46:21,660 fine sa abot ng ito ay tama pagturo sa Tiffany ngayon, 1047 00:46:21,660 --> 00:46:25,410 ngunit kung hindi isa ay nagkaroon ng iintindi sa hinaharap upang ituro sa Jake, 1048 00:46:25,410 --> 00:46:27,490 pagkatapos namin nawala ang kabuuan ng listahan na iyon. 1049 00:46:27,490 --> 00:46:28,200 Kaya ni-undo ipaalam. 1050 00:46:28,200 --> 00:46:30,950 Kaya na ay isang magandang bagay na paglalakbay sa loob ngunit ni iwasto ngayon hayaan. 1051 00:46:30,950 --> 00:46:33,624 Ano ang dapat naming gawin sa halip unang? 1052 00:46:33,624 --> 00:46:34,124 Oo? 1053 00:46:34,124 --> 00:46:35,791 >> Madla: dapat point Tiffany sa 9? 1054 00:46:35,791 --> 00:46:37,582 David MALAN: hindi ko makakaya kumuha na malapit sa iyo. 1055 00:46:37,582 --> 00:46:38,720 Sino ang dapat ituro sa 9? 1056 00:46:38,720 --> 00:46:39,220 >> Madla: Tiffany. 1057 00:46:39,220 --> 00:46:39,390 >> David MALAN: Lahat ng karapatan. 1058 00:46:39,390 --> 00:46:41,200 Kaya dapat Tiffany unang punto sa 9. 1059 00:46:41,200 --> 00:46:43,550 Kaya Tiffany ay dapat kumuha ng sa isang kaparehong halaga 1060 00:46:43,550 --> 00:46:45,820 kay David, na tila kalabisan para sa isang sandali, 1061 00:46:45,820 --> 00:46:48,820 ngunit na fine dahil ngayon, pangalawa hakbang, maaari naming i-update ang kamay ni David 1062 00:46:48,820 --> 00:46:52,680 upang ituro sa Tiffany, at pagkatapos ay kung lamang ng uri ng malinis na namin ang mga bagay up 1063 00:46:52,680 --> 00:46:55,740 na parang ito ay uri ng spring-gusto, ngayon na ang isang tamang insertion. 1064 00:46:55,740 --> 00:46:56,700 Kaya mahusay. 1065 00:46:56,700 --> 00:46:57,970 Kaya ngayon kami ay halos doon. 1066 00:46:57,970 --> 00:47:01,075 Ipasok ni isa huling Ipaalam halaga tulad ng mga halaga ng 20. 1067 00:47:01,075 --> 00:47:03,010 Kung maaari naming malloc isang huling volunteer? 1068 00:47:03,010 --> 00:47:04,140 Lumapit sa up. 1069 00:47:04,140 --> 00:47:06,224 Kaya ang isang ito ay mas ng isang maliit na manlilinlang. 1070 00:47:06,224 --> 00:47:08,390 Ngunit talagang, ang code ay hindi namin pagsulat, kahit na sa bibig, 1071 00:47:08,390 --> 00:47:10,610 ay tulad ng pagkakaroon ng grupo ng kung kundisyon ngayon, tama? 1072 00:47:10,610 --> 00:47:12,318 Nagkaroon kami ng isang kondisyon check kung nabibilang ito 1073 00:47:12,318 --> 00:47:13,840 sa dulo, siguro sa simula. 1074 00:47:13,840 --> 00:47:15,940 Kailangan namin ang ilang mga uri ng loop sa hanapin ang spot sa gitna. 1075 00:47:15,940 --> 00:47:17,400 Kaya sabihin gawin iyon sa kung ano ang iyong pangalan? 1076 00:47:17,400 --> 00:47:17,700 >> ERIC: Eric. 1077 00:47:17,700 --> 00:47:18,340 >> David MALAN: Eric? 1078 00:47:18,340 --> 00:47:18,660 Eric. 1079 00:47:18,660 --> 00:47:19,368 Masaya akong makilala kayo. 1080 00:47:19,368 --> 00:47:20,490 Kaya kami ay may 20. 1081 00:47:20,490 --> 00:47:21,220 Mas mababa sa limang? 1082 00:47:21,220 --> 00:47:21,530 Hindi. 1083 00:47:21,530 --> 00:47:22,160 Mas mababa sa siyam? 1084 00:47:22,160 --> 00:47:22,410 Hindi. 1085 00:47:22,410 --> 00:47:23,050 Mas mababa sa 17? 1086 00:47:23,050 --> 00:47:23,550 Hindi. 1087 00:47:23,550 --> 00:47:23,740 SIGE. 1088 00:47:23,740 --> 00:47:25,701 Siya ay kabilang dito at iyong pangalan muli ay ang mga? 1089 00:47:25,701 --> 00:47:26,200 SUE: idemanda. 1090 00:47:26,200 --> 00:47:26,880 David MALAN: idemanda. 1091 00:47:26,880 --> 00:47:27,379 ALEX: Alex. 1092 00:47:27,379 --> 00:47:28,790 David MALAN: idemanda, Alex, at? 1093 00:47:28,790 --> 00:47:29,290 ERIC: Eric. 1094 00:47:29,290 --> 00:47:30,120 David MALAN: Eric. 1095 00:47:30,120 --> 00:47:32,140 Kaninong mga kamay kailangan upang makakuha ng unang-update? 1096 00:47:32,140 --> 00:47:32,930 >> Madla: Eric. 1097 00:47:32,930 --> 00:47:33,429 SIGE. 1098 00:47:33,429 --> 00:47:35,200 Kaya dapat ituro ni Eric sa kung saan? 1099 00:47:35,200 --> 00:47:35,930 Sa 22. 1100 00:47:35,930 --> 00:47:36,430 Good. 1101 00:47:36,430 --> 00:47:38,180 At ngayon kung ano ang susunod? 1102 00:47:38,180 --> 00:47:40,800 Maaari pagkatapos ay ituro ang idemanda sa Eric at ngayon, kung kayo guys lamang 1103 00:47:40,800 --> 00:47:44,077 gumawa ng ilang mga kuwarto, na kung saan ay mainam na biswal, ngayon tapos na namin ang insertion. 1104 00:47:44,077 --> 00:47:47,160 Kaya isaalang-alang ngayon ng isang katanungan ipaalam ngunit salamat sa iyo kaya magkano para sa aming mga boluntaryo. 1105 00:47:47,160 --> 00:47:48,090 Tunay na magaling. 1106 00:47:48,090 --> 00:47:50,831 Maaari mong panatilihin ang mga iyon, kung gusto mo. 1107 00:47:50,831 --> 00:47:54,140 At kami ay may isang kaibig-ibig pamamaalam nito kung Gusto mo sa bawat nais na kumuha ng isang stress ball. 1108 00:47:54,140 --> 00:47:56,030 Hayaan lamang pumasa sa akin ang mga down. 1109 00:47:56,030 --> 00:47:58,430 Kaya kung ano ang takeaway ng mga ito? 1110 00:47:58,430 --> 00:48:02,430 Parang amazing na ito sa abot ng mayroon kami ngayon 1111 00:48:02,430 --> 00:48:06,360 nagpasimula ng isang alternatibo sa isang array na ay hindi kaya nakakulong 1112 00:48:06,360 --> 00:48:07,780 sa isang hanay ng ilang mga nakapirming laki. 1113 00:48:07,780 --> 00:48:09,380 Maaari silang lumaki magilas. 1114 00:48:09,380 --> 00:48:13,220 >> Subalit marami tulad namin na iyong nakita sa linggo nakaraan, hindi namin makuha ang anumang bagay para sa libreng, 1115 00:48:13,220 --> 00:48:15,740 tulad ng tiyak na may isang kalakalan-off dito. 1116 00:48:15,740 --> 00:48:18,890 Kaya may isang baligtad ng isang naka-link listahan, ito dynamism? 1117 00:48:18,890 --> 00:48:21,590 Kakayahan na ito sa paglaki at lantaran, maaaring kami delete 1118 00:48:21,590 --> 00:48:23,570 at maaari naming pag-urong kung kinakailangan. 1119 00:48:23,570 --> 00:48:24,710 Ano ang presyo ay namin nagbabayad? 1120 00:48:24,710 --> 00:48:28,510 1121 00:48:28,510 --> 00:48:30,340 Dalawang beses ng mas maraming espasyo, una sa lahat. 1122 00:48:30,340 --> 00:48:34,010 Kung tumingin ka sa mga larawan, hindi na Ako pagtatabi ng isang listahan ng mga integer. 1123 00:48:34,010 --> 00:48:36,740 Ako sa pagtatabi ng isang listahan ng mga integer plus payo. 1124 00:48:36,740 --> 00:48:38,240 Kaya ako pagdodoble ang halaga ng puwang. 1125 00:48:38,240 --> 00:48:40,740 Ngayon, marahil na hindi tulad ng sang-ayon 4 bytes, 8 bytes, 1126 00:48:40,740 --> 00:48:43,160 ngunit ito ay maaaring tiyak na magdagdag ng up para sa mga malalaking mga hanay ng data. 1127 00:48:43,160 --> 00:48:45,570 Ano ang isa pang downside? 1128 00:48:45,570 --> 00:48:46,070 Oo? 1129 00:48:46,070 --> 00:48:48,010 >> Madla: Mayroon kaming na tawirin ang mga ito ng isa-isa. 1130 00:48:48,010 --> 00:48:48,760 David MALAN: Oo. 1131 00:48:48,760 --> 00:48:50,260 Mayroon kaming upang tumawid ang mga ito ng isa-isa. 1132 00:48:50,260 --> 00:48:53,860 Alam mo kung ano, binigyan up namin ito super maginhawa tampok ng square bracket 1133 00:48:53,860 --> 00:48:57,240 notation, mas maayos kilala bilang random access, 1134 00:48:57,240 --> 00:48:59,280 kung saan maaari naming lamang tumalon sa isang indibidwal na sangkap 1135 00:48:59,280 --> 00:49:01,470 ngunit ngayon kung hindi pa rin ako nagkaroon aking volunteers dito, 1136 00:49:01,470 --> 00:49:04,660 kung nais ko upang mahanap ang number 22, hindi ko na lang 1137 00:49:04,660 --> 00:49:06,620 tumalon sa bracket ng isang bagay ng isang bagay. 1138 00:49:06,620 --> 00:49:10,530 Mayroon akong upang tumingin sa ibabaw ng listahan, marami tulad ng ating mga halimbawa searching linearly, 1139 00:49:10,530 --> 00:49:12,260 upang mahanap ang numero 22. 1140 00:49:12,260 --> 00:49:14,340 Kaya tila namin na may bayad na isang presyo doon. 1141 00:49:14,340 --> 00:49:16,430 Ngunit maaari naming gayunman malutas ang iba pang mga problema. 1142 00:49:16,430 --> 00:49:18,587 >> Sa katunayan, hayaan mo akong ipakilala lamang ng ilang mga visual. 1143 00:49:18,587 --> 00:49:20,920 Kaya kung kayo ay pababa sa Dining Hall Mather kamakailan, 1144 00:49:20,920 --> 00:49:23,320 kayo pagpapabalik na ang kanilang stack ng mga trays na tulad nito, 1145 00:49:23,320 --> 00:49:26,300 hiniram natin ang mga mula Annenberg bago klase. 1146 00:49:26,300 --> 00:49:28,930 Kaya ito stack ng mga trays, bagaman, ay kinatawan aktwal 1147 00:49:28,930 --> 00:49:30,860 ng isang computer science istraktura ng data. 1148 00:49:30,860 --> 00:49:32,910 May ay isang istraktura ng data sa computer science 1149 00:49:32,910 --> 00:49:38,010 kilala bilang isang stack na lubhang mabuti lends mismo sa eksaktong ganitong visual. 1150 00:49:38,010 --> 00:49:41,380 Kaya kung bawat isa sa mga trays ay hindi isang tray ngunit tulad ng isang numero at ang nais ko 1151 00:49:41,380 --> 00:49:45,010 upang mag-imbak ng mga numero, ako maaaring ilagay ang isa rito, 1152 00:49:45,010 --> 00:49:48,320 at maaari ko bang ilagay ang isa pang down dito, at magpatuloy stacking numero 1153 00:49:48,320 --> 00:49:53,180 sa ibabaw ng bawat isa, at kung ano ang potensyal na mga kapaki-pakinabang tungkol sa mga ito 1154 00:49:53,180 --> 00:49:55,450 ay ang kung ano ang implikasyon ng istraktura ng data? 1155 00:49:55,450 --> 00:49:58,045 Aling numero ang maaari kong bunutin unang pinaka Maginhawang? 1156 00:49:58,045 --> 00:50:00,640 1157 00:50:00,640 --> 00:50:03,030 Ang pinaka-kamakailan isa ilagay sa doon. 1158 00:50:03,030 --> 00:50:06,430 >> Kaya ito ay kung ano ang gusto naming tumawag sa computer science ng LIFO istraktura ng data. 1159 00:50:06,430 --> 00:50:08,070 Huling in, first out. 1160 00:50:08,070 --> 00:50:10,800 At kami na makita bago mahaba kung bakit na maaaring maging kapaki-pakinabang ngunit sa ngayon, 1161 00:50:10,800 --> 00:50:12,200 isaalang-alang lamang ang mga ari-arian. 1162 00:50:12,200 --> 00:50:15,158 At ito ay uri ng tangang kung sa tingin mo tungkol sa kung paano gumagana ang mga ito sa dining hall. 1163 00:50:15,158 --> 00:50:17,910 Sa bawat oras na sila ay malinis trays at ilagay ang pinakasariwang mga nasa tuktok, 1164 00:50:17,910 --> 00:50:22,160 maaari kang magkaroon ng isang dati malinis ngunit sa huli napaka marumi at maalikabok 1165 00:50:22,160 --> 00:50:24,360 tray sa pinakadulo ibaba kung hindi mo talaga 1166 00:50:24,360 --> 00:50:26,820 kumuha sa ilalim ng na stack, dahil ikaw lang 1167 00:50:26,820 --> 00:50:29,380 panatilihin ang paglalagay ng mga bago at ang malinis na mga sa ibabaw ng mga ito. 1168 00:50:29,380 --> 00:50:31,840 Ang parehong bagay ang maaaring mangyari sa isang supermarket masyadong. 1169 00:50:31,840 --> 00:50:35,450 Kung mayroon kang isang display case ng gatas at sa bawat oras na CVS 1170 00:50:35,450 --> 00:50:37,610 o kahit sino ang makakakuha ng mas maraming gatas, isalya mo lang ang mga gatas 1171 00:50:37,610 --> 00:50:39,880 ikaw ay mayroon sa likod at ilagay mo ang mga bago up harap, 1172 00:50:39,880 --> 00:50:43,088 ikaw ay pagpunta sa may ilang medyo bastos gatas sa dulo ng mga istraktura ng data, 1173 00:50:43,088 --> 00:50:46,390 dahil ito ay palaging sa ilalim o equivalently ito ay palaging sa likod. 1174 00:50:46,390 --> 00:50:50,407 >> Subalit mayroong isa pang paraan upang isipin ang tungkol sa lining up ng data at halimbawa, ito. 1175 00:50:50,407 --> 00:50:53,490 Kung ikaw ay isa sa mga tao na may gusto sa line up sa labas ng tindahan ng Apple 1176 00:50:53,490 --> 00:50:55,610 kapag dumating ang isang bagong produkto out, ikaw ay malamang na 1177 00:50:55,610 --> 00:50:58,780 hindi gumagamit ng isang data stack istraktura dahil ikaw 1178 00:50:58,780 --> 00:51:03,070 Gusto ipagkakaloob sa iba ang iba kung sino ay panig hanggang sa pagbili ng ilang mga bagong laruan. 1179 00:51:03,070 --> 00:51:06,610 Sa halip, ikaw ay malamang na gamit kung anong uri ng mga istraktura ng data 1180 00:51:06,610 --> 00:51:10,050 o kung ano ang uri ng system sa tunay na mundo? 1181 00:51:10,050 --> 00:51:13,493 Sana ito ay isang linya, o higit pa maayos o mas British-like, isang pila. 1182 00:51:13,493 --> 00:51:17,700 At ito ay lumiliko out ang isang pila ay isa ring istraktura ng data sa computer science, 1183 00:51:17,700 --> 00:51:19,700 ngunit isang queue ay isang napaka iba't-ibang mga ari-arian. 1184 00:51:19,700 --> 00:51:20,820 Ito ay hindi LIFO. 1185 00:51:20,820 --> 00:51:21,990 Huling in, first out. 1186 00:51:21,990 --> 00:51:22,800 Huwag nawang mangyari. 1187 00:51:22,800 --> 00:51:24,280 Ito ay sa halip FIFO. 1188 00:51:24,280 --> 00:51:26,110 Unang in, first out. 1189 00:51:26,110 --> 00:51:27,970 At iyon ay isang magandang bagay para sa pagkamakatarungan 'alang-alang 1190 00:51:27,970 --> 00:51:30,428 tiyak na kapag ikaw ay lining up super maaga sa umaga. 1191 00:51:30,428 --> 00:51:33,400 Kung makakuha ka muna doon, ikaw gusto mong lumabas muna rin. 1192 00:51:33,400 --> 00:51:35,880 >> At sa gayon ang lahat ng mga data na ito kaayusan, queues at stack 1193 00:51:35,880 --> 00:51:39,220 at mga kumpol ng iba, lumiliko out ka maaaring sa tingin ng mga ito bilang lamang ng isang array. 1194 00:51:39,220 --> 00:51:41,820 Ito ay isang array, siguro isang nakapirming laki 4, ngunit gusto ito 1195 00:51:41,820 --> 00:51:44,990 maging uri ng magaling kung lamang namin mai pagtira trays halos walang hanggan ang taas kung tayo 1196 00:51:44,990 --> 00:51:46,780 Mayroon na ang maraming mga trays o numero. 1197 00:51:46,780 --> 00:51:48,840 Kaya marahil, gusto nating gumamit ng isang listahan ng mga link dito, 1198 00:51:48,840 --> 00:51:51,800 ngunit ang kalakalan-off ay magiging potensyal na kailangan namin ng higit pang memory, 1199 00:51:51,800 --> 00:51:55,930 tumatagal ng kaunti pang panahon, ngunit hindi namin huwag limitahan ang taas ng stack, 1200 00:51:55,930 --> 00:51:59,550 marami tulad ng display case Mather ni Maaaring limitahan ang laki ng stack, 1201 00:51:59,550 --> 00:52:03,117 at iba ang mga ito ay disenyo ng mga desisyon o mga opsyon na magagamit sa amin sa huli. 1202 00:52:03,117 --> 00:52:04,950 Kaya sa mga data kaayusan, sinimulan namin sa 1203 00:52:04,950 --> 00:52:09,360 nakakakita ng mga bagong itaas na hangganan potensyal sa kung ano ang dati ay sobrang mabilis 1204 00:52:09,360 --> 00:52:11,260 at kung saan kami ay umalis off ngayon at kung saan 1205 00:52:11,260 --> 00:52:13,200 kami ay umaasa upang makakuha ng sa ay sa Miyerkules, bibigyan namin ng 1206 00:52:13,200 --> 00:52:15,740 simulan upang tumingin sa isang data istraktura na nagbibigay-daan sa amin sa paghahanap 1207 00:52:15,740 --> 00:52:18,260 sa pamamagitan ng data sa oras ng pagtatapos log muli. 1208 00:52:18,260 --> 00:52:21,470 At nakita namin na, pagpapabalik, sa linggo zero at isa sa binary paghahanap o hatiin 1209 00:52:21,470 --> 00:52:22,180 at mapaglabanan. 1210 00:52:22,180 --> 00:52:26,240 Ito ay babalik at mas mahusay pa, ang banal na Kopita para ito Miyerkules 1211 00:52:26,240 --> 00:52:29,510 ay upang makabuo ng mga istraktura ng data na tumatakbo tunay 1212 00:52:29,510 --> 00:52:32,070 o theoretically in tapat na oras, kung saan ang 1213 00:52:32,070 --> 00:52:34,760 hindi mahalaga kung gaano karaming milyon o bilyong bagay 1214 00:52:34,760 --> 00:52:38,470 kami ay may sa istraktura ng data, ito ay kumuha sa amin constant time, siguro isang hakbang 1215 00:52:38,470 --> 00:52:41,387 o dalawang hakbang o 10 mga hakbang, ngunit pare-pareho ang bilang ng mga hakbang 1216 00:52:41,387 --> 00:52:42,970 sa paghahanap sa pamamagitan na istraktura ng data. 1217 00:52:42,970 --> 00:52:46,300 Na sa katunayan ay ang banal na Kopita ngunit higit pa sa na sa Miyerkules. 1218 00:52:46,300 --> 00:52:49,045 Tingnan ang ya pagkatapos. 1219 00:52:49,045 --> 00:52:53,704 >> [MUSIC nagpe-play] 1220 00:52:53,704 --> 00:56:08,448