1 00:00:00,000 --> 00:00:03,381 >> [MUZIKO Ludante] 2 00:00:03,381 --> 00:00:10,626 3 00:00:10,626 --> 00:00:11,610 >> [VIDEO reprodukto] 4 00:00:11,610 --> 00:00:13,640 >> -Li Mensogas. 5 00:00:13,640 --> 00:00:14,380 >> -Pri kio? 6 00:00:14,380 --> 00:00:17,182 >> -Mi ne scias. 7 00:00:17,182 --> 00:00:19,990 >> -Do Kion ni scias? 8 00:00:19,990 --> 00:00:23,145 >> -Tio Je 9:15, Ray Santoya estis ĉe la ATM. 9 00:00:23,145 --> 00:00:23,644 -Yeah. 10 00:00:23,644 --> 00:00:27,030 Do la demando estas, kion li faris je 9:16? 11 00:00:27,030 --> 00:00:29,720 >> -Shooting La 9 milimetro je io. 12 00:00:29,720 --> 00:00:31,540 Eble li vidis la francotirador. 13 00:00:31,540 --> 00:00:33,412 >> -OR Laboris kun li. 14 00:00:33,412 --> 00:00:34,340 >> -Wait. 15 00:00:34,340 --> 00:00:36,200 Reiru unu. 16 00:00:36,200 --> 00:00:36,975 >> -Kio Vi vidas? 17 00:00:36,975 --> 00:00:44,400 18 00:00:44,400 --> 00:00:47,805 >> -Bring Sian vizaĝon supren plena ekrano. 19 00:00:47,805 --> 00:00:48,680 >> -His Glasojn. 20 00:00:48,680 --> 00:00:50,060 >> -There Estas reflekto. 21 00:00:50,060 --> 00:01:00,455 22 00:01:00,455 --> 00:01:02,280 >> -ĝi Estas la Nuevitas basbalteamo. 23 00:01:02,280 --> 00:01:03,110 Tio estas ilia emblemo. 24 00:01:03,110 --> 00:01:05,820 >> -Kaj Li parolas al Kiu surhavas ke jako. 25 00:01:05,820 --> 00:01:06,670 >> [FINO reprodukto] 26 00:01:06,670 --> 00:01:07,628 >> DAVID Malan: Bone. 27 00:01:07,628 --> 00:01:11,210 Jen CS50 kaj ĉi tiu estas iom pli de [inaudible], per kiu vi estas 28 00:01:11,210 --> 00:01:12,890 plaŭdado kun problemo starigis kvar. 29 00:01:12,890 --> 00:01:16,606 Hodiaŭ ni komencos rigardi iom pli profunde ĉe tion nomis punteros, 30 00:01:16,606 --> 00:01:18,480 kiu kvankam ĝi estas bela arcano temo, 31 00:01:18,480 --> 00:01:20,813 ĝi rezultas ke ĝi tuj esti la rimedoj, per kiu ni 32 00:01:20,813 --> 00:01:24,320 povas komenci konstrui kaj ariganta multe pli kompleksaj programoj. 33 00:01:24,320 --> 00:01:28,150 Sed ni faris ĝin sur lasta merkredo tra iuj Claymation unue. 34 00:01:28,150 --> 00:01:30,190 Do tiu, revokon, estas Binky kaj ni uzis lin 35 00:01:30,190 --> 00:01:33,148 preni rigardi programo kiu ne vere fari ion interesan, 36 00:01:33,148 --> 00:01:34,950 sed faris malkaŝi kelkajn problemojn. 37 00:01:34,950 --> 00:01:38,570 Do komenci hodiaŭ, kial ni ne iros rapide tra kelkaj el tiuj ŝtupoj, 38 00:01:38,570 --> 00:01:41,920 provu distili en homaj terminoj precize kio okazas ĉi tie 39 00:01:41,920 --> 00:01:45,410 kaj kial tio estas malbona, kaj tiam pluiri kaj fakte komenci konstrui ion 40 00:01:45,410 --> 00:01:46,309 kun tiu tekniko? 41 00:01:46,309 --> 00:01:48,350 Do jen la unua du liniojn en tiu programo 42 00:01:48,350 --> 00:01:51,340 kaj en laiko La terminoj, kio estas tiuj du linioj faras? 43 00:01:51,340 --> 00:01:55,600 Iu kiu estas prudente komforta kun kio deklaris sur la ekrano? 44 00:01:55,600 --> 00:01:58,340 45 00:01:58,340 --> 00:02:00,120 Kion signifas tiuj du linioj faras? 46 00:02:00,120 --> 00:02:02,070 Ĝi ne estas ĉiuj ke malsama semajno unu, 47 00:02:02,070 --> 00:02:03,611 Sed estas iu nova speciala simbolo. 48 00:02:03,611 --> 00:02:04,152 Yeah? 49 00:02:04,152 --> 00:02:05,628 Revenigu tien. 50 00:02:05,628 --> 00:02:07,092 >> Publiko: Deklarante punteros? 51 00:02:07,092 --> 00:02:08,050 DAVID Malan: Diru denove? 52 00:02:08,050 --> 00:02:08,860 Publiko: Deklarante punteros? 53 00:02:08,860 --> 00:02:11,776 DAVID Malan: Deklarante punteros kaj ni rafini ĝin iomete pli. 54 00:02:11,776 --> 00:02:14,050 Spektantaro: [inaudible] Adreso x kaj tiam y. 55 00:02:14,050 --> 00:02:15,300 DAVID Malan: Kaj poste trakti. 56 00:02:15,300 --> 00:02:18,550 Do konkrete kion ni faras Estas ni deklari du variabloj. 57 00:02:18,550 --> 00:02:21,252 Tiuj variabloj, tamen, iras esti de tipo int stelo, kiu 58 00:02:21,252 --> 00:02:23,210 pli specife signifas ili tuj stoki 59 00:02:23,210 --> 00:02:26,450 la adreso de int, respektive, x kaj y. 60 00:02:26,450 --> 00:02:27,660 Nun estas tie ajna valoroj? 61 00:02:27,660 --> 00:02:32,621 Ĉu ekzistas efektiva adresoj en tiuj du variabloj ĉe tiu punkto en tempo? 62 00:02:32,621 --> 00:02:33,120 No. 63 00:02:33,120 --> 00:02:35,030 Ĝi simple tn rubo valoroj. 64 00:02:35,030 --> 00:02:38,120 Se vi ne efektive asigni variablo, kiom estis en RAM 65 00:02:38,120 --> 00:02:42,224 antaŭe tuj plenigos kun nuloj kaj aĵoj ambaŭ de tiuj variabloj. 66 00:02:42,224 --> 00:02:44,140 Sed ni ankoraŭ ne scias kio estas kaj tio 67 00:02:44,140 --> 00:02:47,060 tuj estos ŝlosilo al kial Binky perdis la kapon pasintsemajne. 68 00:02:47,060 --> 00:02:49,980 >> Do tio estis la Claymation enkarniĝo de tiu 69 00:02:49,980 --> 00:02:53,580 whereby vi havas nur du variabloj, iom cirkla pecoj de argilo, 70 00:02:53,580 --> 00:02:57,330 kiu povas enteni variablojn, sed kiel la enpakita sagoj indikas, 71 00:02:57,330 --> 00:03:00,640 ili fakte ne indikante al ie konata por se. 72 00:03:00,640 --> 00:03:03,670 Tial do ni havis ĉi tiun linion, kaj tiu estis nova lasta semajno, malloc por memoro 73 00:03:03,670 --> 00:03:07,130 atribuo, kiu estas nur ornama metodo diri la mastruma sistemo, Linukso 74 00:03:07,130 --> 00:03:09,750 aŭ Mac OS aŭ Vindozo, hey, donu al mi iom da memoro, 75 00:03:09,750 --> 00:03:11,780 kaj ĉiuj vi devas diri al la operaciumo 76 00:03:11,780 --> 00:03:14,699 estas kio al la demandi lin por memoro. 77 00:03:14,699 --> 00:03:16,990 Oni ne tuj zorgi kion vi faros pri ĝi, 78 00:03:16,990 --> 00:03:19,786 sed vi devas diri al la mastruma sistemo kio pere de malloc. 79 00:03:19,786 --> 00:03:20,286 Yeah? 80 00:03:20,286 --> 00:03:21,078 >> Publiko: Kiom? 81 00:03:21,078 --> 00:03:21,994 DAVID Malan: Kiom? 82 00:03:21,994 --> 00:03:25,280 Kiom en bajtoj, do, tiu, denove, oni elpensita ekzemplo, estas ĝuste diri: 83 00:03:25,280 --> 00:03:27,360 donu min la grandeco de int. 84 00:03:27,360 --> 00:03:30,550 Nun, la grandeco de int Estas kvar bajtoj aŭ 32 bitoj. 85 00:03:30,550 --> 00:03:32,850 Do tio estas nur maniero de dirante, hej, mastruma sistemo, 86 00:03:32,850 --> 00:03:37,290 donu al mi kvar bajtoj de memoro ke mi povas uzi en mia dispono, 87 00:03:37,290 --> 00:03:40,560 kaj specife, kion faras malloc revenas kun respekto 88 00:03:40,560 --> 00:03:41,795 por ke eron de kvar bajtoj? 89 00:03:41,795 --> 00:03:44,110 90 00:03:44,110 --> 00:03:44,860 Spektantaro: Adreso? 91 00:03:44,860 --> 00:03:45,901 DAVID Malan: La adreso. 92 00:03:45,901 --> 00:03:47,580 La adreso de tiu bloko de kvar bajtoj. 93 00:03:47,580 --> 00:03:48,190 Ekzakte. 94 00:03:48,190 --> 00:03:51,430 Kaj por ke-a kio stokitaj finfine en x kaj tial ni ne vere 95 00:03:51,430 --> 00:03:55,240 zorgas kion la nombro de tiu adreso estas, ĉu ĝi estas OX1 aŭ OX2 96 00:03:55,240 --> 00:03:57,110 aŭ iu kripta deksesuma adreso. 97 00:03:57,110 --> 00:03:59,850 Ni nur zorgas bilde ke tiu variablo x estas nun 98 00:03:59,850 --> 00:04:01,630 indikante ke bloko de memoro. 99 00:04:01,630 --> 00:04:05,570 Do la sago reprezentas pointer, aŭ pli specife, memoro adreso. 100 00:04:05,570 --> 00:04:09,120 Sed denove, ni ne tipe zorgas kio tiuj faktaj adresoj estas. 101 00:04:09,120 --> 00:04:11,780 Nun, ĉi tiu linio diras kion en laiko La terminoj? 102 00:04:11,780 --> 00:04:14,330 Stelo x prenas 42 punktokomo. 103 00:04:14,330 --> 00:04:17,390 Kion tio signifas? 104 00:04:17,390 --> 00:04:18,200 Vi volas? 105 00:04:18,200 --> 00:04:20,102 Ne skrapi via kolo. 106 00:04:20,102 --> 00:04:22,360 >> Publiko: La adreso de x estas ĉe la 42. 107 00:04:22,360 --> 00:04:24,300 >> DAVID Malan: La adreso de x estas ĉe 42. 108 00:04:24,300 --> 00:04:25,190 Ne tute. 109 00:04:25,190 --> 00:04:28,485 Tiel proksima, sed ne sufiĉe, ĉar estas la stelo kiu estas prefiksi ĉi x. 110 00:04:28,485 --> 00:04:29,860 Do ni bezonas tweak iomete. 111 00:04:29,860 --> 00:04:31,032 Yeah? 112 00:04:31,032 --> 00:04:36,044 >> Publiko: La valoro kiun la puntero x estas indikante estas 42. 113 00:04:36,044 --> 00:04:36,710 DAVID Malan: Bone. 114 00:04:36,710 --> 00:04:40,840 La valoro kiun la montrilo x estas indikante, diru, estos 42, 115 00:04:40,840 --> 00:04:44,165 aŭ meti alia maniero, la stelo x diras, iru al kiom Adreso 116 00:04:44,165 --> 00:04:48,340 estas en x, ĉu ĝi estas 1 Oksfordo Strato aŭ 33 Oksfordostrato 117 00:04:48,340 --> 00:04:51,850 aŭ OX1 aŭ ox33 ajn ke nombra adreso estas: 118 00:04:51,850 --> 00:04:54,380 stelo x estas la dereferencing de x. 119 00:04:54,380 --> 00:04:57,297 Do iri al tiu adreso kaj tiam metis la numero 42 tie. 120 00:04:57,297 --> 00:04:59,380 Do tio estus ekvivalenta maniero diri tion. 121 00:04:59,380 --> 00:05:01,860 Do jen ĉio bone kaj tiam ni reprezentus la bildon 122 00:05:01,860 --> 00:05:05,370 kiel sekvas kie ni aldonis la 42 al tiu bloko de kvar 123 00:05:05,370 --> 00:05:09,370 bajtoj sur la dekstra flanko, sed tiu linio estis kie aferoj iris malbone 124 00:05:09,370 --> 00:05:11,120 kaj Binky kapo krevita ĉe tiu punkto, 125 00:05:11,120 --> 00:05:15,290 ĉar malbonaj aferoj okazos kiam vi dereference rubo valoroj 126 00:05:15,290 --> 00:05:18,210 aŭ vi dereference nevalida montriloj, kaj mi diras nevalida 127 00:05:18,210 --> 00:05:21,020 ĉar ĉe tiu punkto en la rakonto, kio estas ene de y? 128 00:05:21,020 --> 00:05:24,440 Kio estas la valoro de y bazita sur la lastaj paŝoj? 129 00:05:24,440 --> 00:05:25,360 Yeah? 130 00:05:25,360 --> 00:05:26,115 Kio estas tio? 131 00:05:26,115 --> 00:05:26,990 >> Publiko: An adreso. 132 00:05:26,990 --> 00:05:28,460 DAVID Malan: An adreso. 133 00:05:28,460 --> 00:05:31,910 Ĝi devus esti parolado sed mi pravalorizitaj ĝi? 134 00:05:31,910 --> 00:05:32,800 Do mi ankoraŭ ne havas. 135 00:05:32,800 --> 00:05:35,430 Do kio estas konata esti tie? 136 00:05:35,430 --> 00:05:37,590 Estas nur iuj rubo valoro. 137 00:05:37,590 --> 00:05:41,500 Ĝi povus esti ajna Adreso de nulo al 2 miliardoj, se vi havas du koncertoj de RAM, 138 00:05:41,500 --> 00:05:44,289 aŭ nulo al 4 miliardoj se vi havas ricevis kvar gigabajtoj de RAM. 139 00:05:44,289 --> 00:05:46,080 Estas iuj rubo valoro, sed la problemo estas 140 00:05:46,080 --> 00:05:48,200 ke la mastruma sistemo, se ĝi ne donis al vi 141 00:05:48,200 --> 00:05:51,140 ke bloko de memoro specife ke vi provas iri, 142 00:05:51,140 --> 00:05:54,650 ĝi estas ĝenerale iranta kaŭzi kio ni vidis kiel segmentación kulpo. 143 00:05:54,650 --> 00:05:57,810 Do fakte, iu el vi kiu havas baraktis ĉe problemojn ĉe oficejo horoj 144 00:05:57,810 --> 00:06:00,393 aŭ en problemoj kiuj estas pli ĝenerale per provi elkompreni 145 00:06:00,393 --> 00:06:02,150 segmentación kulpo, kiu ĝenerale signifas 146 00:06:02,150 --> 00:06:05,017 vi tuŝi segmenton de memoro kiun vi ne devus esti. 147 00:06:05,017 --> 00:06:07,350 Vi tuŝi memoro kiu la mastruma sistemo havas ne 148 00:06:07,350 --> 00:06:10,450 permesis vin tuŝi, ĉu ĝi estas irante tro longen en via tabelo 149 00:06:10,450 --> 00:06:12,870 aŭ komencante nun, ĉu ĝi estas ĉar vi tuŝi 150 00:06:12,870 --> 00:06:14,780 memoron kiu ĝuste estas iu rubo valoro. 151 00:06:14,780 --> 00:06:18,230 >> Tion farante stelo x tie estas ia nedifinita konduto. 152 00:06:18,230 --> 00:06:22,030 Vi neniam devus fari ĝin pro malakordo estas, la programo estas ĵus tuj frakasos, 153 00:06:22,030 --> 00:06:24,050 ĉar vi diras, iri al tiu adreso 154 00:06:24,050 --> 00:06:27,000 kaj vi ne scias kien tiu adreso fakte estas. 155 00:06:27,000 --> 00:06:30,300 Do la mastruma sistemo estas verŝajna tuj frakasos vian programon 156 00:06:30,300 --> 00:06:33,840 kiel rezulto kaj efektive, jen kio okazis tie al Binky. 157 00:06:33,840 --> 00:06:37,210 Do finfine, Binky fiksita tiun problemon kun tiu. 158 00:06:37,210 --> 00:06:38,909 Por ke programo mem estis mankhava. 159 00:06:38,909 --> 00:06:41,450 Sed se vi ia forĝi antaŭen kaj ekzekuti ĉi tiun linion anstataŭe, 160 00:06:41,450 --> 00:06:45,580 y egalas x nur signifas ajn Adreso estas x, ankaŭ metis ĝin en y. 161 00:06:45,580 --> 00:06:48,740 >> Kaj tiel bilde, ni reprezentis tiun kun du sagoj 162 00:06:48,740 --> 00:06:51,570 de x kaj de y montradon al la sama loko. 163 00:06:51,570 --> 00:06:55,760 Do semantike, x egalas al y ĉar ambaŭ de tiuj 164 00:06:55,760 --> 00:07:00,300 amasigas la sama adreso, ergo montrante 42, 165 00:07:00,300 --> 00:07:04,910 kaj nun, kiam vi diras stelo y, iru al la adreso en y, 166 00:07:04,910 --> 00:07:06,790 tiu havas interesan kromefikon. 167 00:07:06,790 --> 00:07:10,320 Do la adreso en y estas la samon kiel la adreson en x. 168 00:07:10,320 --> 00:07:15,060 Do se vi diras iri al la adreso en y kaj ŝanĝi la valoron 13, 169 00:07:15,060 --> 00:07:17,140 Kiu alia estas tuŝita? 170 00:07:17,140 --> 00:07:21,100 X estas, punkto D, tiel diri, devus esti tuŝita ankaŭ. 171 00:07:21,100 --> 00:07:24,340 >> Kaj efektive, kiom Nick tiris tiun bildo en Claymation estis ĝuste tio. 172 00:07:24,340 --> 00:07:28,665 Kvankam ni sekvas la montrilon y, ni finis en la sama loko, 173 00:07:28,665 --> 00:07:32,780 kaj do se ni devis presi eksteren x aŭ y-oj pointee, 174 00:07:32,780 --> 00:07:35,720 tiam ni vidus la valoro de 13. 175 00:07:35,720 --> 00:07:37,927 Nun, mi diras pointee esti konsekvenca kun la vídeo. 176 00:07:37,927 --> 00:07:39,760 Programistoj, al mia scio, neniam reale 177 00:07:39,760 --> 00:07:42,460 diri la vorton pointee, kio estas pinta 178 00:07:42,460 --> 00:07:44,650 je, sed por konsistenco kun la vídeo, realigi 179 00:07:44,650 --> 00:07:47,520 jen ĉio tio estis signifis en tiu situacio. 180 00:07:47,520 --> 00:07:54,190 Do demandojn sur Claymation aŭ punteros aŭ malloc nur ankoraŭ? 181 00:07:54,190 --> 00:07:54,850 Neniu? 182 00:07:54,850 --> 00:07:55,470 Bone. 183 00:07:55,470 --> 00:07:58,560 >> Do sen plua ado, ni rigardu 184 00:07:58,560 --> 00:08:00,700 al kie tiu havas reale estis uzita por iom da tempo. 185 00:08:00,700 --> 00:08:03,580 Do ni havis ĉi CS50 biblioteko ke estas atingis ĉiujn tiujn funkciojn. 186 00:08:03,580 --> 00:08:06,810 Ni uzis GetInt multe, GetString, verŝajne GetLongLong frue 187 00:08:06,810 --> 00:08:09,840 en mia pset aŭ tiel, sed kio efektive estis okazanta? 188 00:08:09,840 --> 00:08:12,920 Nu, ni prenu rapidan rigardon sub la kapuĉo je programo kiu 189 00:08:12,920 --> 00:08:17,017 inspiras kial ni doni vin la CS50 biblioteko, kaj ja kiel de lasta semajno, 190 00:08:17,017 --> 00:08:18,850 ni komencis prenante tiujn trejnado radoj ekstere. 191 00:08:18,850 --> 00:08:21,080 Do tiu estas nun ordo de postmortem de kio 192 00:08:21,080 --> 00:08:23,690 estis daŭriganta ene la CS50 biblioteko, 193 00:08:23,690 --> 00:08:27,250 eĉ se ni nun komencos movanta for de ĝi por plej programoj. 194 00:08:27,250 --> 00:08:29,460 >> Do tiu estas programo nomita scanf 0. 195 00:08:29,460 --> 00:08:30,510 Estas super mallonga. 196 00:08:30,510 --> 00:08:33,909 Ĝi nur havas tiujn liniojn, sed ĝi Enkondukas funkcio nomita scanf 197 00:08:33,909 --> 00:08:36,909 ke ni vere tuj vidos en momento ene de la CS50 biblioteko, 198 00:08:36,909 --> 00:08:38,600 kvankam en iomete malsama formo. 199 00:08:38,600 --> 00:08:41,330 Do tiu programo sur linio 16 estas deklari variablon x. 200 00:08:41,330 --> 00:08:43,150 Do donu al mi kvar bitokoj por int. 201 00:08:43,150 --> 00:08:45,750 Ĝi estis rakontanta uzanto, numeron bonvolu, kaj tiam 202 00:08:45,750 --> 00:08:49,010 tiu estas interesa linio kiu fakte ligas kune pasintsemajne 203 00:08:49,010 --> 00:08:49,790 kaj ĉi. 204 00:08:49,790 --> 00:08:53,230 Scanf, kaj tiam rimarkos prenas formato kordoj, ĝuste kiel printf, 205 00:08:53,230 --> 00:08:57,480 % i signifas int, kaj tiam ĝi prenas dua argumento kiu aspektas iom 206 00:08:57,480 --> 00:08:58,260 funky. 207 00:08:58,260 --> 00:09:01,880 Ĝi estas simbolo x, kaj memorigi, ni nur vidis unufoje pasintsemajne. 208 00:09:01,880 --> 00:09:03,465 Kion ampersand x reprezentas? 209 00:09:03,465 --> 00:09:06,210 210 00:09:06,210 --> 00:09:08,450 Kion ampersand fari en C? 211 00:09:08,450 --> 00:09:08,950 Yeah? 212 00:09:08,950 --> 00:09:10,024 >> Publiko: La adreso de. 213 00:09:10,024 --> 00:09:11,190 DAVID Malan: La adreso de. 214 00:09:11,190 --> 00:09:13,190 Do estas la malo de la stelo operatoro, 215 00:09:13,190 --> 00:09:17,270 dum la stelo operatoro diras, iru al tiu adreso, la ampersand operatoro 216 00:09:17,270 --> 00:09:20,280 diras, diveni la Adreso de ĉi variablo, 217 00:09:20,280 --> 00:09:23,530 kaj tiel tio estas ŝlosilo, ĉar scanf la celo en la vivo 218 00:09:23,530 --> 00:09:26,320 estas skani la uzanto enigo per klavaro, 219 00:09:26,320 --> 00:09:29,970 depende kion ajn li aŭ ŝi tipoj, kaj tiam legis ke uzanto enigo 220 00:09:29,970 --> 00:09:32,970 en variablon, sed ni vidis en la pasintaj du semajnoj 221 00:09:32,970 --> 00:09:36,080 ke tiu interŝanĝa funkcio kiu ni provis senpene implementar 222 00:09:36,080 --> 00:09:37,110 estis ĵus rompita. 223 00:09:37,110 --> 00:09:42,470 Memoru ke kun la interŝanĝa funkcio, se ni nur deklaris A kaj B kiel ints, 224 00:09:42,470 --> 00:09:47,040 ni sukcese interŝanĝi la du variabloj ene de swap 225 00:09:47,040 --> 00:09:50,080 Ĝuste kiel kun la lakto kaj OJ, sed tuj kiam interŝanĝa rehejmigxis 226 00:09:50,080 --> 00:09:55,200 kio estis la rezulto kun respekto al x kaj y, la originalaj valoroj? 227 00:09:55,200 --> 00:09:55,700 Nenio. 228 00:09:55,700 --> 00:09:56,200 Yeah. 229 00:09:56,200 --> 00:09:59,754 Nenio okazis tiam, ĉar svopoj ŝanĝi nur lia loka kopiojn, 230 00:09:59,754 --> 00:10:01,670 kiu estas, ĉiuj tiu tempo, kiam ni havas 231 00:10:01,670 --> 00:10:04,010 estis pasanta en argumentoj al funkcioj, ni estas 232 00:10:04,010 --> 00:10:05,939 nur pasanta kopioj de tiuj argumentoj. 233 00:10:05,939 --> 00:10:07,980 Vi povas fari kun tio kion vi volas kun ili, 234 00:10:07,980 --> 00:10:10,890 sed ili tuj devas ne Efekto en la originala valoroj. 235 00:10:10,890 --> 00:10:13,650 Do tio estas problema se vi volas havi funkcion kiel scanf 236 00:10:13,650 --> 00:10:17,170 en vivo, kies celo estas skani la uzanto enigo per klavaro 237 00:10:17,170 --> 00:10:22,010 kaj tiam plenigi la truojn, por tiel paroli, tio estas, doni variablon kiel x 238 00:10:22,010 --> 00:10:25,410 valoro, ĉar se mi estus nur pasas x al scanf, 239 00:10:25,410 --> 00:10:28,790 se vi konsideras la logiko de lasta semajno, scanf povas fari kion ajn ŝi volas 240 00:10:28,790 --> 00:10:33,100 kun kopio de x, sed ne povis konstante ŝanĝas x se ni donas 241 00:10:33,100 --> 00:10:37,120 scanf trezoron mapo, tiel diri, kie x signas la lokon, per 242 00:10:37,120 --> 00:10:41,860 ni pasas en la adreso de x tia ke scanf povas iri tien kaj reale ŝanĝo 243 00:10:41,860 --> 00:10:42,920 la valoro de x. 244 00:10:42,920 --> 00:10:45,080 Kaj tiel ja, ĉiuj ke tiu programo faras 245 00:10:45,080 --> 00:10:53,180 se mi scanf 0, en mia fonto 5m dosierujo, fari scanf 0, 246 00:10:53,180 --> 00:10:57,730 dot oblikvo scanf, nombro bonvolu 50, dankon pro la 50. 247 00:10:57,730 --> 00:11:01,020 >> Do estas ne cxiuj interesaj, sed kio ja okazas 248 00:11:01,020 --> 00:11:04,820 estas ke tuj kiam mi vokas scanf tie, la valoro de x 249 00:11:04,820 --> 00:11:06,410 estas konstante ŝanĝis. 250 00:11:06,410 --> 00:11:08,335 Nun, ĉi tio ŝajnas bela kaj bona, kaj fakte, ĝi 251 00:11:08,335 --> 00:11:11,200 Evidente, ni ne vere bezonas la CS50 biblioteko ĉe ĉiuj anymore. 252 00:11:11,200 --> 00:11:13,960 Ekzemple, ni kuros tiun fojon pli ĉi tie. 253 00:11:13,960 --> 00:11:15,750 Lasu min remalfermi ĝin por dua. 254 00:11:15,750 --> 00:11:20,600 Ni provu kelkajn bonvolu kaj anstataŭ diri 50 kiel antaŭe, 255 00:11:20,600 --> 00:11:22,810 ni nur diras ne. 256 00:11:22,810 --> 00:11:24,000 Okej, tio estas iom stranga. 257 00:11:24,000 --> 00:11:25,270 BONE. 258 00:11:25,270 --> 00:11:28,680 Kaj nur iuj sensencaĵo tie. 259 00:11:28,680 --> 00:11:31,170 Do ĝi ne ŝajnas manipuli eraraj situacioj. 260 00:11:31,170 --> 00:11:33,620 Do ni bezonas minimume komenco aldonante iuj eraro-kontrolanta 261 00:11:33,620 --> 00:11:37,460 certigi ke la uzanto havas tajpita en fakta nombro kiel 50, 262 00:11:37,460 --> 00:11:40,720 ĉar ŝajne tajpi vortojn ne estas detektita kiel problema, 263 00:11:40,720 --> 00:11:42,020 sed probable devus esti. 264 00:11:42,020 --> 00:11:46,450 >> Ni rigardu ĉi versio nun jen mia provo reverki GetString. 265 00:11:46,450 --> 00:11:48,437 Se scanf havas ĉiujn ĉi funkciojn konstruita, 266 00:11:48,437 --> 00:11:51,270 kial ni estis plaŭdado kun tiuj trejnado radoj kiel GetString? 267 00:11:51,270 --> 00:11:55,450 Nu, jen eble mia propra simpla versio de GetString 268 00:11:55,450 --> 00:12:00,766 per unu semajno, mi povus diri, donu al mi ĉenon kaj nomas ĝin buffer. 269 00:12:00,766 --> 00:12:03,390 Hodiaŭ, mi tuj komencos simple dirante char stelo, kiu, memoru, 270 00:12:03,390 --> 00:12:04,400 estas nur sinonimo. 271 00:12:04,400 --> 00:12:06,629 Ĝi aspektas pli timinda sed estas la ĝusta sama afero. 272 00:12:06,629 --> 00:12:09,420 Do donu al mi variablo nomis buffer ke tuj stoki ĉenon, 273 00:12:09,420 --> 00:12:12,780 diri la uzanto kordo bonvolu, kaj tiam, ekzakte kiel antaŭe, 274 00:12:12,780 --> 00:12:17,760 ni provu pruntepreni tiun lecionon scanf % s tiu tempo kaj poste pasos en bufro. 275 00:12:17,760 --> 00:12:19,310 Nun, rapida prudento kontroli. 276 00:12:19,310 --> 00:12:22,120 Kial mi ne diras ampersand buffer tiu tempo? 277 00:12:22,120 --> 00:12:25,190 278 00:12:25,190 --> 00:12:26,625 Konkludi el la antaŭa ekzemplo. 279 00:12:26,625 --> 00:12:28,000 Publiko: Char stelo estas puntero. 280 00:12:28,000 --> 00:12:29,920 DAVID Malan: Ĝuste, ĉar tiu tempo, char 281 00:12:29,920 --> 00:12:34,080 stelo estas jam pointer, adreson, per difino de tiu stelo estanta tie. 282 00:12:34,080 --> 00:12:37,530 Kaj se scanf atendas adreson, sufiĉas nur Iam en bufro. 283 00:12:37,530 --> 00:12:39,260 Mi ne bezonas diri ampersand bufro. 284 00:12:39,260 --> 00:12:42,177 Por la scivolaj, vi povis fari ion kiel tiu. 285 00:12:42,177 --> 00:12:43,510 Ĝi havus malsaman signifon. 286 00:12:43,510 --> 00:12:47,240 Tiu donus al vi montrilo al puntero, kiu estas fakte 287 00:12:47,240 --> 00:12:50,050 validan afero en C, sed por nun, ni teni ĝin simpla 288 00:12:50,050 --> 00:12:51,750 kaj konservi la historion konsekvenca. 289 00:12:51,750 --> 00:12:54,100 Mi simple tuj pasos en buffer kaj tio estas korekta. 290 00:12:54,100 --> 00:12:56,487 La problemo tamen estas tiu. 291 00:12:56,487 --> 00:12:58,820 Lasu min kaj kuras ĉi programo post kompili ĝin. 292 00:12:58,820 --> 00:13:00,902 Faru scanf 1. 293 00:13:00,902 --> 00:13:02,610 Damn, mia tradukilo kaptante mia eraro. 294 00:13:02,610 --> 00:13:04,090 Deme dua. 295 00:13:04,090 --> 00:13:05,460 Tin. 296 00:13:05,460 --> 00:13:06,990 Diru scanf-1.c. 297 00:13:06,990 --> 00:13:10,880 298 00:13:10,880 --> 00:13:11,380 BONE. 299 00:13:11,380 --> 00:13:12,720 Tie ni marŝos. 300 00:13:12,720 --> 00:13:14,280 Mi bezonas ĝin. 301 00:13:14,280 --> 00:13:16,750 CS50 ID havas diversajn agordadaj difinoj 302 00:13:16,750 --> 00:13:18,280 ke protekti vin kontraŭ vi mem. 303 00:13:18,280 --> 00:13:21,300 Mi bezonis malfunkciigi tiujn per kurante Clang permane tiu tempo. 304 00:13:21,300 --> 00:13:22,140 Do string bonvolu. 305 00:13:22,140 --> 00:13:25,560 Mi tuj iros antaŭen kaj tajpu en mia ŝatata saluton mondo. 306 00:13:25,560 --> 00:13:26,490 OK, nula. 307 00:13:26,490 --> 00:13:27,700 Tio ne estas kion mi tajpis. 308 00:13:27,700 --> 00:13:29,690 Do estas indika de io esti erara. 309 00:13:29,690 --> 00:13:33,920 Lasu min kaj tajpu en vere longa ŝnuro. 310 00:13:33,920 --> 00:13:37,210 Dankon pro la nula kaj mi ne scias se mi tuj povus frakasi ĝin. 311 00:13:37,210 --> 00:13:40,240 Ni provu iom kopion algluu kaj vidi se tiu helpas. 312 00:13:40,240 --> 00:13:43,290 Nur alglui multajn ĉi. 313 00:13:43,290 --> 00:13:47,310 Estas definitive granda ŝnuro ol kutime. 314 00:13:47,310 --> 00:13:51,450 Ni nur vere skribi ĝin. 315 00:13:51,450 --> 00:13:51,950 No. 316 00:13:51,950 --> 00:13:52,650 Damnu ĝin. 317 00:13:52,650 --> 00:13:53,480 Ordonu ne trovis. 318 00:13:53,480 --> 00:13:54,550 Do jen senrilataj. 319 00:13:54,550 --> 00:13:56,440 Tio estas ĉar mi pasted iuj malbonaj karakteroj, 320 00:13:56,440 --> 00:13:59,780 sed ĉi rezultas ne tuj funkcios. 321 00:13:59,780 --> 00:14:03,510 >> Ni provu ĉi denove, ĉar ĝi estas pli amuza se ni efektive kraŝi ĝin. 322 00:14:03,510 --> 00:14:09,116 Ni tajpi tion kaj nun mi estas tuj kopii vere longa kordo 323 00:14:09,116 --> 00:14:10,990 kaj nun ni vidu se ni povas frakasi tiun aferon. 324 00:14:10,990 --> 00:14:14,235 Rimarku ke mi preterlasis spacoj kaj novaj linioj kaj punktokomojn 325 00:14:14,235 --> 00:14:16,035 kaj ĉiuj funky karakteroj. 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 Kaj nun la reto estas nur esti malrapida. 329 00:14:22,880 --> 00:14:27,460 Mi tenis malsupren Komando-V tro longaj, klare. 330 00:14:27,460 --> 00:14:28,190 Damnu ĝin! 331 00:14:28,190 --> 00:14:29,260 Ordonu ne trovis. 332 00:14:29,260 --> 00:14:29,780 >> BONE. 333 00:14:29,780 --> 00:14:32,240 Nu, la punkto estas tamen la sekvan. 334 00:14:32,240 --> 00:14:36,910 Do kio estas efektive iranta sur kun ĉi deklaro 335 00:14:36,910 --> 00:14:39,240 char stelo bufro sur linio 16? 336 00:14:39,240 --> 00:14:41,820 Do kion mi ricevas kiam mi deklaras puntero? 337 00:14:41,820 --> 00:14:47,440 Ĉiuj mi ricevas estas kvar bajto valoro nomata buffer, sed kio estas ene de ĝi 338 00:14:47,440 --> 00:14:49,540 ĉe la momento? 339 00:14:49,540 --> 00:14:50,930 Estas nur iuj rubo valoro. 340 00:14:50,930 --> 00:14:54,170 Ĉar ajna momento vi deklaras variablon en C, estas nur iuj rubo valoron, 341 00:14:54,170 --> 00:14:56,220 kaj ni komencas vojaĝo super ĉi tiu realaĵo. 342 00:14:56,220 --> 00:14:59,720 Nun, kiam mi diras scanf, iri al tiu adreso 343 00:14:59,720 --> 00:15:01,520 kaj meti ajn la uzanto tajpas en. 344 00:15:01,520 --> 00:15:06,400 Se la uzanto tajpas en saluton mondo, nu, kie mi metis ĝin? 345 00:15:06,400 --> 00:15:07,750 Buffer estas rubo valoro. 346 00:15:07,750 --> 00:15:11,510 >> Do jen speco de kiel sago ke estas indikante kiu scias kie. 347 00:15:11,510 --> 00:15:13,880 Eble ĝi estas indikante ĝuste ĉi tie en mia memoro. 348 00:15:13,880 --> 00:15:16,560 Kaj do kiam la uzanto tipoj en saluton mondo, 349 00:15:16,560 --> 00:15:22,380 la programo provas meti la kordo saluton mondo backslash 0 350 00:15:22,380 --> 00:15:23,910 en tiu bloko de memoro. 351 00:15:23,910 --> 00:15:27,070 Sed kun alta probablo, sed klare ne 100% probableco, 352 00:15:27,070 --> 00:15:30,440 la komputilo tuj poste kraŝi la programo pro tio ne 353 00:15:30,440 --> 00:15:32,490 memoro mi devus esti permesita tuŝi. 354 00:15:32,490 --> 00:15:36,330 Do mallonge, tiu programo estas mankhava ĉar ĝuste tio. 355 00:15:36,330 --> 00:15:38,070 Mi principe ne faras kion? 356 00:15:38,070 --> 00:15:42,366 Kio paŝoj mi preterlasis, samkiel ni preterlasis kun Binky unua ekzemplo? 357 00:15:42,366 --> 00:15:42,866 Yeah? 358 00:15:42,866 --> 00:15:43,710 >> Publiko: Memoro atribuo? 359 00:15:43,710 --> 00:15:45,001 >> DAVID Malan: Memoro atribuo. 360 00:15:45,001 --> 00:15:48,400 Mi ne efektive asignitaj ajna memoro por ke kordoj. 361 00:15:48,400 --> 00:15:50,270 Do ni povas fiksi tion en kelkaj manieroj. 362 00:15:50,270 --> 00:15:52,700 Unu, ni povas teni ĝin simpla kaj fakte, nun vi estas 363 00:15:52,700 --> 00:15:55,116 tuj komencos vidi malklarigante de la linioj inter kio 364 00:15:55,116 --> 00:15:58,520 tabelo estas, kion kordo estas, kia char stelo estas, kion tabelo de signoj 365 00:15:58,520 --> 00:15:59,020 estas. 366 00:15:59,020 --> 00:16:02,450 Jen dua ekzemplo implikantaj kordoj kaj avizo 367 00:16:02,450 --> 00:16:05,690 ĉiuj mi faris sur linio 16 estas, anstataŭ diri 368 00:16:05,690 --> 00:16:09,530 ke buffer tuj estos char stelo, puntero al bloko de memoro, 369 00:16:09,530 --> 00:16:14,057 Mi tuj tre proactively donu min buffer por 16 karakteroj, 370 00:16:14,057 --> 00:16:16,390 kaj fakte, se vi konas kun la termino buffering, 371 00:16:16,390 --> 00:16:20,570 probable de la mondo de vídeos, kie video estas buffering, buffering, 372 00:16:20,570 --> 00:16:21,175 buffering. 373 00:16:21,175 --> 00:16:22,550 Nu, kio estas la rilato tie? 374 00:16:22,550 --> 00:16:24,960 Nu, Inside de YouTube kaj ene de video ludantoj 375 00:16:24,960 --> 00:16:27,200 ĝenerale estas tabelo Tiu estas pli granda ol 16. 376 00:16:27,200 --> 00:16:30,340 Povus esti tabelo de grandeco unu megabajto, eble 10 megabajtoj, 377 00:16:30,340 --> 00:16:34,330 kaj en tiu tabelo faras via retumilo elŝuti tutan faskon de bajtoj, 378 00:16:34,330 --> 00:16:37,500 tuta aro da megabajtoj de video kaj la video ludanto, 379 00:16:37,500 --> 00:16:40,930 YouTube aŭ kiu ajn estas, komenciĝas legante la bajtoj de tiu tabelo, 380 00:16:40,930 --> 00:16:43,530 kaj iam vi vidos la vorto buffering, buffering, 381 00:16:43,530 --> 00:16:46,350 kiu signifas la ludanto havas alvenis al la fino de tiu tabelo. 382 00:16:46,350 --> 00:16:50,430 La reto estas tiel malrapida ke ĝi havas ne replenigis la tabelo kun pli bajtoj 383 00:16:50,430 --> 00:16:55,610 kaj tial vi estas el bitoj por montri al la uzanto. 384 00:16:55,610 --> 00:16:59,430 >> Do bufro estas kapabla termino tie en tiu ĝi estas nur tabelo, eron de memoro. 385 00:16:59,430 --> 00:17:02,530 Kaj ĉi riparos ĝin ĉar ĝi rezultas 386 00:17:02,530 --> 00:17:07,410 ke vi povas trakti arrays kvazaŭ ili estas adresojn, kvankam bufro 387 00:17:07,410 --> 00:17:10,710 estas nur simbolo, ĝi estas sekvenco de karakteroj, bufro, 388 00:17:10,710 --> 00:17:14,760 ke estas utila por mi, la programisto, vi povas pasi lian nomon ĉirkaŭ 389 00:17:14,760 --> 00:17:17,079 kvazaŭ ĝi estus montrilo, kvazaŭ ĝi 390 00:17:17,079 --> 00:17:21,000 estis la adreso de eron de memoro por 16 signoj. 391 00:17:21,000 --> 00:17:24,530 Do jen diri, mi povas pasi la scanf ĝuste tiu vorto 392 00:17:24,530 --> 00:17:30,670 kaj tial nun, se mi faras tiun programon, fari scanf 2, dot oblikvo scanf 2, 393 00:17:30,670 --> 00:17:35,386 kaj tajpi en saluton mondo, Entajpu, ke time-- 394 00:17:35,386 --> 00:17:37,590 >> Hmm, kio okazis? 395 00:17:37,590 --> 00:17:39,340 String bonvolu. 396 00:17:39,340 --> 00:17:41,430 Kion mi faras malbone? 397 00:17:41,430 --> 00:17:43,800 Saluton mondo, buffer. 398 00:17:43,800 --> 00:17:44,705 Saluton mondo. 399 00:17:44,705 --> 00:17:48,201 400 00:17:48,201 --> 00:17:49,420 Jes mi scias kio ĝi estas faranta. 401 00:17:49,420 --> 00:17:49,920 BONE. 402 00:17:49,920 --> 00:17:51,628 Do ĝi estas leganta supren ĝis la unua spaco. 403 00:17:51,628 --> 00:17:55,680 Do ni cheat por nur momento kaj diras mi nur volis tajpi ion 404 00:17:55,680 --> 00:18:01,408 vere longa kiel tiu estas longa frazo jen unu, du, tri, kvar, kvin, 405 00:18:01,408 --> 00:18:04,420 ses, sep, ok, naux, 10, 11, 12, 13, 14, 15, 16. 406 00:18:04,420 --> 00:18:05,300 BONE. 407 00:18:05,300 --> 00:18:07,600 Ĝi estas ja longa frazo. 408 00:18:07,600 --> 00:18:10,710 Do tiu frazo estas longa ol 16 karakteroj 409 00:18:10,710 --> 00:18:13,670 kaj do kiam mi batis Enter, kio okazos? 410 00:18:13,670 --> 00:18:16,940 Nu, en tiu kazo de la rakonto, mi deklaris bufro 411 00:18:16,940 --> 00:18:22,190 por fakte esti tabelo kun 16 signoj preta iri. 412 00:18:22,190 --> 00:18:27,426 Do unu, du, tri, kvar, kvin, ses, sep, ok, naŭ, 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 Do 16 karakterojn, kaj nun, kiam mi legi en iu kiel tiu estas longa 415 00:18:34,410 --> 00:18:43,950 frazo, kio okazos estas ke mi legos en tiu estas longa 416 00:18:43,950 --> 00:18:49,660 S-Kaj-N-T-Kaj-N-C-Kaj, frazo. 417 00:18:49,660 --> 00:18:52,270 >> Do tiu estas intence malbona afero 418 00:18:52,270 --> 00:18:55,060 teni skribanta trans limoj de mia tabelo, 419 00:18:55,060 --> 00:18:56,660 preter la limoj de mia bufro. 420 00:18:56,660 --> 00:19:00,100 Mi povis akiri bonŝanca kaj la programo tenos sur kurado kaj ne zorgas, 421 00:19:00,100 --> 00:19:03,450 sed ĝenerale parolante, tiu ja frakasi mian programon, 422 00:19:03,450 --> 00:19:06,440 kaj tio estas cimo en mia kodigi la momento mi paŝi 423 00:19:06,440 --> 00:19:08,576 preter la limoj de tiu tabelo, ĉar mi 424 00:19:08,576 --> 00:19:10,450 ne scias se ĝi estas nepre tuj frakasos 425 00:19:10,450 --> 00:19:12,120 aŭ se mi nur ricevos bonŝanca. 426 00:19:12,120 --> 00:19:15,750 Do tio estas problema ĉar en tiu kazo, ĝi ŝajnas funkcii 427 00:19:15,750 --> 00:19:20,931 kaj ni incitos sorton tie, kvankam la IDE ŝajnas toleri tre iom 428 00:19:20,931 --> 00:19:21,430 of-- 429 00:19:21,430 --> 00:19:22,040 >> Tie ni marŝos. 430 00:19:22,040 --> 00:19:23,240 Fine. 431 00:19:23,240 --> 00:19:26,470 Do mi estas la sola kiu povas vidi tion. 432 00:19:26,470 --> 00:19:29,630 Do mi simple havis multan amuzan tajpadon el vere longa fakta frazo 433 00:19:29,630 --> 00:19:32,800 ke ĝi certe superis 16 bajtoj, ĉar mi 434 00:19:32,800 --> 00:19:38,050 tajpita en tiu freneza longa plurliniaj frazo, kaj tiam rimarkas kio okazis. 435 00:19:38,050 --> 00:19:41,110 La programo provis videbligi ĝin kaj tiam ricevis segmentación kulpo 436 00:19:41,110 --> 00:19:44,430 kaj segmentación kulpoj estas kiam io kiel tio okazas 437 00:19:44,430 --> 00:19:47,650 kaj la mastruma sistemo diras Ne, ne povas tuŝi ke memoro. 438 00:19:47,650 --> 00:19:49,570 Ni tuj mortigi la programo entute. 439 00:19:49,570 --> 00:19:51,180 >> Do tio ŝajnas problema. 440 00:19:51,180 --> 00:19:54,540 Mi plibonigis la programon per kiu almenaŭ havi iu memoro, 441 00:19:54,540 --> 00:19:58,000 sed tiu ŝajnus ĉirkaŭlimigi la funkcio GetString al akiranta 442 00:19:58,000 --> 00:20:00,780 kordoj de iu finia longo 16. 443 00:20:00,780 --> 00:20:04,200 Do se vi volas subteni plu frazoj ol 16 karakteroj, 444 00:20:04,200 --> 00:20:04,880 kion vi faras? 445 00:20:04,880 --> 00:20:07,970 Nu, vi povas pligrandigi la grandeco de ĉi buffer 32 446 00:20:07,970 --> 00:20:09,190 aŭ kiu ŝajnas ia mallonga. 447 00:20:09,190 --> 00:20:12,260 Kial ni ne simple ĝi 1.000 sed puŝas reen. 448 00:20:12,260 --> 00:20:17,100 Kio estas la respondo intuicie de nur evitante tiun problemon farante 449 00:20:17,100 --> 00:20:20,660 mian bufron granda, kiel 1.000 signoj? 450 00:20:20,660 --> 00:20:23,470 Per efektivigado GetString tiamaniere. 451 00:20:23,470 --> 00:20:27,130 Kio estas bona aŭ malbona ĉi tie? 452 00:20:27,130 --> 00:20:28,033 Yeah? 453 00:20:28,033 --> 00:20:30,574 Publiko: Se vi prenos multajn de spaco kaj vi ne uzas ĝin, 454 00:20:30,574 --> 00:20:33,500 tiam vi ne povas reallocate tiu spaco. 455 00:20:33,500 --> 00:20:34,500 DAVID Malan: Absolute. 456 00:20:34,500 --> 00:20:38,480 Ĝi estas malŝparema mezuro se vi faras ne vere bezonas 900 el tiuj bajtoj 457 00:20:38,480 --> 00:20:41,057 kaj tamen vi petante 1,000 en totala ĉiuokaze, 458 00:20:41,057 --> 00:20:44,140 vi nur konsumas pli memoro sur la uzanto komputilo ol vi bezonas, 459 00:20:44,140 --> 00:20:45,740 kaj finfine, iuj el vi jam renkontis 460 00:20:45,740 --> 00:20:47,620 en vivo ke kiam vi estas kurante multaj programoj 461 00:20:47,620 --> 00:20:50,470 kaj ili manĝas supren multa memoro, tiu povas fakte efikos agado 462 00:20:50,470 --> 00:20:52,220 kaj la uzanto sperto sur la komputilo. 463 00:20:52,220 --> 00:20:56,090 Do jen speco de mallaborema solvo, por certa, kaj inverse, 464 00:20:56,090 --> 00:21:00,140 ĝi estas ne nur malŝparo, kion problemo ankoraŭ restas, eĉ se mi faras mian bufron 465 00:21:00,140 --> 00:21:02,100 1.000? 466 00:21:02,100 --> 00:21:02,600 Yeah? 467 00:21:02,600 --> 00:21:04,475 >> Publiko: La kordoj estas longo 1,001. 468 00:21:04,475 --> 00:21:05,350 DAVID Malan: Ĝuste. 469 00:21:05,350 --> 00:21:08,280 Se via ĉeno estas longo 1,001, vi havas la ĝustan saman problemon, 470 00:21:08,280 --> 00:21:10,705 kaj per mia argumento, mi volus ĝuste tiam fari ĝin 2000 471 00:21:10,705 --> 00:21:12,830 sed vi ne scias en antaŭi kiom granda ĝi devus esti, 472 00:21:12,830 --> 00:21:16,890 kaj tamen, mi ja devas kompili mia programo antaŭ lasanta homoj uzas kaj malŝarĝo 473 00:21:16,890 --> 00:21:17,390 ĝin. 474 00:21:17,390 --> 00:21:21,490 Do tiu estas ĝuste la speco de aĵoj kiuj la CS50 biblioteko tries 475 00:21:21,490 --> 00:21:24,750 helpi nin per kaj ni nur rigardo en iu el la subaj efektivigo 476 00:21:24,750 --> 00:21:29,790 tie, sed tiu estas CS50 skalara C. Ĉi estas la dosiero kiu estas estita sur CS50 IDE 477 00:21:29,790 --> 00:21:31,420 ĉiuj tiuj semajnoj ke vi estis uzante. 478 00:21:31,420 --> 00:21:34,280 Ĝi estas pre-kompilita kaj vi havas estis uzante ĝin aŭtomate 479 00:21:34,280 --> 00:21:38,780 nature havi la interfrapigos L CS50 flago kun Clang, 480 00:21:38,780 --> 00:21:42,300 sed se mi rulumu malsupren tra ĉiuj tiuj funkcioj, jen GetString, 481 00:21:42,300 --> 00:21:44,636 kaj nur por doni al vi guston de kio okazas, 482 00:21:44,636 --> 00:21:46,760 ni prenu rapidan rigardon al la relativa komplekseco. 483 00:21:46,760 --> 00:21:48,870 Ĝi ne estas súper longa funkcion, sed ni ne 484 00:21:48,870 --> 00:21:52,530 devas pensi pri ĉiuj malfacile kiel iri pri akiri kordoj. 485 00:21:52,530 --> 00:21:55,660 >> Do jen mia bufro kaj mi ŝajne pravalorizi ĝin al nula. 486 00:21:55,660 --> 00:21:57,990 Tio, kompreneble, estas la samon kiel char steloj, 487 00:21:57,990 --> 00:22:00,585 sed mi decidis en implementando la CS50 biblioteko 488 00:22:00,585 --> 00:22:02,460 ke se ni tuj tute dinamika, 489 00:22:02,460 --> 00:22:05,770 Mi ne scias anticipe kiom granda de string uzantoj tuj volas ricevi. 490 00:22:05,770 --> 00:22:08,140 Do mi tuj komencu kun nur malplenan ĉenon 491 00:22:08,140 --> 00:22:11,507 kaj mi tuj konstru tiel memoro kiel mi bezonas persvadi la uzanto kordo 492 00:22:11,507 --> 00:22:13,340 kaj se mi ne havas sufiĉas, mi tuj demandas 493 00:22:13,340 --> 00:22:15,010 la mastruma sistemo por pli memoro. 494 00:22:15,010 --> 00:22:17,510 Mi tuj movi siajn kordo en pli grandan eron de memoro 495 00:22:17,510 --> 00:22:21,847 kaj mi tuj liberigi aŭ liberigi la nesufiĉe granda bloko de memoro 496 00:22:21,847 --> 00:22:23,680 kaj ni ĵus tuj fari tiun ripete. 497 00:22:23,680 --> 00:22:25,570 >> Tiel rapida rigardo, tie estas nur variablo 498 00:22:25,570 --> 00:22:28,780 kun kiu mi tuj sekvigi de la kapablo de mia bufro. 499 00:22:28,780 --> 00:22:30,071 Kiom da bajtoj povas min persvadi? 500 00:22:30,071 --> 00:22:32,070 Jen variablon n kun kiun mi tuj konservi 501 00:22:32,070 --> 00:22:36,200 trako de kiom da bajtoj estas reale en la bufron aŭ ke la uzanto tajpas. 502 00:22:36,200 --> 00:22:39,900 Se vi ne vidis tion antaŭe, vi povas specifi ke variablo kiel int 503 00:22:39,900 --> 00:22:46,370 estas sensigna, kiu kiel la nomo indikas, signifas ke estas ne-negativa, kaj kial 504 00:22:46,370 --> 00:22:50,590 Mi iam volas ĝeni preciziganta ke int ne nur int, 505 00:22:50,590 --> 00:22:52,540 sed estas sensigna int? 506 00:22:52,540 --> 00:22:55,064 Ĝi estas nenegativa int. 507 00:22:55,064 --> 00:22:56,355 Kion faras la [inaudible] signifas? 508 00:22:56,355 --> 00:22:58,910 >> Spektantaro: Ĝi estas priskribanta kvanto de memoro kiu povas esti [inaudible]. 509 00:22:58,910 --> 00:22:59,660 >> DAVID Malan: Yeah. 510 00:22:59,660 --> 00:23:03,710 Do se mi diras sensigna, tio estas fakte donante al vi unu pecon da ekstra memoro 511 00:23:03,710 --> 00:23:07,440 kaj ĝi similas specon de stulta, sed se vi havas unu pecon da aldona memoro, ke 512 00:23:07,440 --> 00:23:09,940 signifas vin havas duoble tiom da valoroj povas reprezenti, 513 00:23:09,940 --> 00:23:11,570 ĉar ĝi povas esti 0 aŭ 1. 514 00:23:11,570 --> 00:23:14,660 Do defaŭlte, int povas esti malglate negativa 2 miliardo tuta vojo 515 00:23:14,660 --> 00:23:16,030 ĝis pozitiva 2 miliardoj. 516 00:23:16,030 --> 00:23:18,540 Tiuj estas grandaj teritorioj, sed ĝi estas ankoraŭ ia malŝparema 517 00:23:18,540 --> 00:23:21,280 se vi nur zorgas pri grandecoj, kiuj nur intuicie 518 00:23:21,280 --> 00:23:24,620 devus esti nenegativa aŭ pozitiva aŭ 0, bone tiam, 519 00:23:24,620 --> 00:23:28,884 kial vi malŝparas 2 miliardoj eblaj valoroj por negativaj nombroj 520 00:23:28,884 --> 00:23:30,300 se vi neniam uzos ilin? 521 00:23:30,300 --> 00:23:35,350 Do dirante sensigna, nun mia int povas esti inter 0 kaj malglate 4 miliardoj. 522 00:23:35,350 --> 00:23:39,280 >> Do jen nur int C por kialoj ni ne enir ĵus nun kiel 523 00:23:39,280 --> 00:23:42,280 al kial ĝi estas int anstataŭe de char, sed ĉi tie estas 524 00:23:42,280 --> 00:23:44,630 la esencon de kio okazas on, kaj kelkaj el vi 525 00:23:44,630 --> 00:23:48,340 eble uzante, ekzemple, la fgetc funkcio eĉ en pset kvar 526 00:23:48,340 --> 00:23:51,580 aŭ poste, ni vidos ŝin denove en problemo starigis kvin, 527 00:23:51,580 --> 00:23:55,410 fgetc estas bela ĉar kiel la nomo ia, ia arcanely sugestas, 528 00:23:55,410 --> 00:23:57,940 ĝi estas funkcio kiu ricevas karaktero kaj tiel, 529 00:23:57,940 --> 00:24:00,690 kio estas fundamente malsama pri kion ni faras en GetString 530 00:24:00,690 --> 00:24:03,110 estas ni ne uzante scanf sammaniere. 531 00:24:03,110 --> 00:24:07,550 Ni nur rampante kune paŝo post paŝo super kio ajn la uzanto tajpas en, 532 00:24:07,550 --> 00:24:10,970 ĉar ni povas ĉiam rezervi unu char, kaj tiel ni povas ĉiam sekure 533 00:24:10,970 --> 00:24:15,599 rigardi unu char samtempe, kaj la magio komencas okazi tie. 534 00:24:15,599 --> 00:24:17,890 Mi tuj rulumu malsupren al Meze de ĉi tiu funkcio 535 00:24:17,890 --> 00:24:20,360 nur enkonduki mallonge tiu funkcio. 536 00:24:20,360 --> 00:24:22,670 Tre kiel ekzistas malloc funkcio, ekzistas 537 00:24:22,670 --> 00:24:27,740 a realloc funkcio kie realloc permesas reallocate eron de memoro 538 00:24:27,740 --> 00:24:29,570 kaj fari ĝin pli granda aŭ pli malgranda. 539 00:24:29,570 --> 00:24:33,060 Do longan rakonton kaj kun ondo de mia mano por hodiaŭ, 540 00:24:33,060 --> 00:24:35,620 scias ke kion GetString faras estas ĝi estas speco 541 00:24:35,620 --> 00:24:39,720 de magie kreskanta aŭ ŝrumpanta la bufro kiel la uzanto 542 00:24:39,720 --> 00:24:41,440 entajpas sian ĉenon. 543 00:24:41,440 --> 00:24:43,962 >> Do se la uzanto tajpas en mallonga kordo, ĉi kodo 544 00:24:43,962 --> 00:24:45,920 nur allocates sufiĉe memoro konveni la kordo. 545 00:24:45,920 --> 00:24:48,086 Se la uzanto tenas tajpadon kiel mi faris ĝin denove kaj denove 546 00:24:48,086 --> 00:24:50,330 kaj denove, bone, se la buffer la komence ĉi tiu granda 547 00:24:50,330 --> 00:24:53,310 kaj la programo rimarkas, al atendu momenton, mi estos for de spaco, 548 00:24:53,310 --> 00:24:55,410 ĝi tuj duobligi la grandeco de la bufro 549 00:24:55,410 --> 00:24:59,110 kaj tiam duobligi la grandecon de la bufro kaj la kodo kiu faras la duobligo, 550 00:24:59,110 --> 00:25:03,170 se ni rigardas ĝin tie, ĝi estas nur tiun lertan unu-Liner. 551 00:25:03,170 --> 00:25:06,830 Vi eble ne jam vidis ĉi sintakso antaŭe, sed se vi diras stelo egalas, 552 00:25:06,830 --> 00:25:10,470 ĉi tiu estas la sama aĵo kiel dirante kapablo fojojn 2. 553 00:25:10,470 --> 00:25:13,390 Do ĝi nur tenas duobliganta la kapablo de la bufro 554 00:25:13,390 --> 00:25:17,480 kaj tiam rakontanta realloc doni mem ke multe pli da memoro. 555 00:25:17,480 --> 00:25:19,720 >> Nun, kiel flanken, tie Estas aliaj funkcioj tien 556 00:25:19,720 --> 00:25:23,680 ke ni ne aspektos en ajnan detalon krom montri en GetInt, 557 00:25:23,680 --> 00:25:26,150 ni uzas GetString en GetInt. 558 00:25:26,150 --> 00:25:28,192 Ni kontrolu ke ĝi ne estas nula, kiu, memoru, 559 00:25:28,192 --> 00:25:30,400 estas la speciala valoro kiu signifas ion misokazis. 560 00:25:30,400 --> 00:25:31,233 Ni estas el memoro. 561 00:25:31,233 --> 00:25:32,310 Pli bona kontroli por tio. 562 00:25:32,310 --> 00:25:33,710 Kaj ni resendas sentinelo valoro. 563 00:25:33,710 --> 00:25:37,850 Sed mi cedu al la komentoj kiel al kial kaj tiam ni uzas tiun kuzo de scanf 564 00:25:37,850 --> 00:25:42,100 nomata sscanf kaj rezultas ke sscanf, aŭ ŝnuro scanf, 565 00:25:42,100 --> 00:25:45,310 permesas preni rigardi la linion kiu la uzanto tajpas en kaj lasos vin 566 00:25:45,310 --> 00:25:49,610 analizi ĝi esence kaj kion mi faras ĉi tie estas fakton mi sscanf, 567 00:25:49,610 --> 00:25:54,440 analizi ajn la uzanto havas tajpitaj kaj certiĝu% i, 568 00:25:54,440 --> 00:25:59,250 estas entjero en ĝi, kaj ni ne enir hodiaŭ ĝuste kial ekzistas ankaŭ 569 00:25:59,250 --> 00:26:03,760 a% c tie, sed ke en malmultaj vortoj permesas nin al detekti se la uzanto tajpita 570 00:26:03,760 --> 00:26:06,050 en io blufa post la nombro. 571 00:26:06,050 --> 00:26:11,766 Do la kialo ke GetInt kaj GetString diras reprovi, reprovi, reprovi 572 00:26:11,766 --> 00:26:13,640 estas pro ĉiuj ke kodo ni skribis, 573 00:26:13,640 --> 00:26:17,900 Estas ia rigardante la uzanto enigo en faranta certe ĝi estas tute numera 574 00:26:17,900 --> 00:26:21,700 aŭ ĝi estas fakta Floating punkto valoro aŭ simile, 575 00:26:21,700 --> 00:26:24,233 depende kion valoro funkcii vi uzas. 576 00:26:24,233 --> 00:26:25,060 >> Whew. 577 00:26:25,060 --> 00:26:25,710 BONE. 578 00:26:25,710 --> 00:26:27,592 Tio estis buŝplenon sed la punkto ĉi tie estas 579 00:26:27,592 --> 00:26:29,550 ke la kialo ni devis tiujn trejnado radoj sur 580 00:26:29,550 --> 00:26:32,880 estas ĉar ĉe la plej malalta nivelo, tie estas nur tiom da aferoj kiuj 581 00:26:32,880 --> 00:26:35,674 povas iri malbone, ke ni volis al preemptively manipuli 582 00:26:35,674 --> 00:26:38,090 tion certe en la fruaj semajnoj de la klaso, 583 00:26:38,090 --> 00:26:42,230 sed nun kun pset kvar kaj pset kvin preter vi vidos ke ĝi estas pli al 584 00:26:42,230 --> 00:26:45,570 vi sed ankaŭ vi estas pli kapabla solvi tiujn specojn de problemoj 585 00:26:45,570 --> 00:26:47,180 mem. 586 00:26:47,180 --> 00:26:51,770 Demandojn sur GetString aŭ GetInt? 587 00:26:51,770 --> 00:26:52,630 Yeah? 588 00:26:52,630 --> 00:26:55,130 >> Publiko: Kial vi duobligi la kapablo de la bufro 589 00:26:55,130 --> 00:26:57,630 anstataŭ nur kreskanta ĝin per la ĝusta kvanto? 590 00:26:57,630 --> 00:26:58,100 >> DAVID Malan: Bona demando. 591 00:26:58,100 --> 00:27:00,474 Kial ni duobligi la kapaciton de la bufro kontraste 592 00:27:00,474 --> 00:27:02,800 nur pliigante ĝin de iu konstanta valoro? 593 00:27:02,800 --> 00:27:03,900 Ĝi estis dezajno decido. 594 00:27:03,900 --> 00:27:08,590 Ni ĵus decidis ke ĉar ĝi emas esti iom multekosta tempo-saĝa demandi 595 00:27:08,590 --> 00:27:10,440 la operaciumo por memoro, ni ne 596 00:27:10,440 --> 00:27:13,210 volas finas por eniri situacio por grandaj kordoj 597 00:27:13,210 --> 00:27:14,960 ke ni petis la VIN multfoje 598 00:27:14,960 --> 00:27:17,500 kaj denove kaj denove en rapida sinsekvo por memoro. 599 00:27:17,500 --> 00:27:20,387 Do ni simple decidis, iom arbitre sed ni esperas prudente, 600 00:27:20,387 --> 00:27:22,720 ke, vi scias kio, ni provu akiri antaŭen de ni mem 601 00:27:22,720 --> 00:27:25,520 kaj ĝuste teni duobliganta ĝin por ke ni minimumigi la kvanton de tempoj 602 00:27:25,520 --> 00:27:29,010 ni devas nomi malloc aŭ realloc, sed tuta juĝo 603 00:27:29,010 --> 00:27:31,820 alvoku la foresto de scianta kio uzantoj eble volas enmeti. 604 00:27:31,820 --> 00:27:33,600 Ambaŭ manieroj povus esti diskutindaj. 605 00:27:33,600 --> 00:27:35,430 Disputeble bona. 606 00:27:35,430 --> 00:27:39,240 >> Do ni rigardu paro de aliaj kromefikoj de memoro, 607 00:27:39,240 --> 00:27:41,610 aĵoj kiuj povas iri malbone kaj iloj kiu vi povas 608 00:27:41,610 --> 00:27:43,880 uzi kapti tiajn erarojn. 609 00:27:43,880 --> 00:27:47,800 Rezultas vi ĉiuj, eĉ kvankam check50 ne sciigis vin kiom, 610 00:27:47,800 --> 00:27:50,050 estis skribanta kalesxon kodo ekde semajno unu, 611 00:27:50,050 --> 00:27:53,630 eĉ se ĉiuj check50 testoj estas pasis, kaj eĉ se vi kaj via TF 612 00:27:53,630 --> 00:27:56,010 estas super certa ke via kodo laboras kiel intencita. 613 00:27:56,010 --> 00:27:59,190 Via kodo estis kalesxo aŭ mankhava en tio vi ĉiuj, 614 00:27:59,190 --> 00:28:02,540 en uzi la CS50 biblioteko, ili iris filtrante memoro. 615 00:28:02,540 --> 00:28:06,040 Vi estis petante la mastruma sistemo por memoro en la plej multaj el la programoj 616 00:28:06,040 --> 00:28:08,850 vi skribis, sed vi havas neniam fakte donis ĝin reen. 617 00:28:08,850 --> 00:28:12,110 Vi nomas GetString kaj GetInt kaj GetFloat, 618 00:28:12,110 --> 00:28:15,270 sed kun GetString, vi havas neniam nomis unGetString aŭ Give 619 00:28:15,270 --> 00:28:19,890 String Reen aŭ simile, sed ni vidis ke GetString faras rezervi memoron 620 00:28:19,890 --> 00:28:22,810 tra malloc aŭ tiun funkcio realloc, kiu estas nur 621 00:28:22,810 --> 00:28:25,670 tre simila en spirito, kaj tamen, ni estis 622 00:28:25,670 --> 00:28:28,629 petante la mastruma sistemo por memoro kaj memoro multfoje 623 00:28:28,629 --> 00:28:29,670 sed neniam donante ĝin. 624 00:28:29,670 --> 00:28:33,550 >> Nun, kiel flanken, ĝi rezultas ke kiam programo malekas, ĉiuj la memoro 625 00:28:33,550 --> 00:28:34,870 aŭtomate liberigitaj. 626 00:28:34,870 --> 00:28:36,150 Do ĝi ne estis grandega interkonsento. 627 00:28:36,150 --> 00:28:38,590 Tio ne tuj rompos la IDE aŭ malrapida aferojn malsupren, 628 00:28:38,590 --> 00:28:40,670 sed kiam programoj fari ĝenerale liki memoro 629 00:28:40,670 --> 00:28:42,170 kaj ili estas kuranta dum longa tempo. 630 00:28:42,170 --> 00:28:45,640 Se vi iam vidis la stultan iom strando pilko en Mac VIN aŭ la sablohorloĝo 631 00:28:45,640 --> 00:28:51,160 en Vindozo kie estas afable desaceleración aŭ pensi aŭ pensado 632 00:28:51,160 --> 00:28:53,770 aŭ nur vere komenciĝas malrapidigi al crawl, 633 00:28:53,770 --> 00:28:56,960 ĝi tre eble povus esti la rezulto de memoro liko. 634 00:28:56,960 --> 00:28:59,970 La programadores kiu skribis la softvaro vi estas uzanta 635 00:28:59,970 --> 00:29:03,570 demandu la mastruma sistemo por memoro ĉiu malmultaj minutoj, ĉiuhore. 636 00:29:03,570 --> 00:29:05,570 Sed se vi uzas la programaron, eĉ se ĝi estas 637 00:29:05,570 --> 00:29:08,680 minimumigita en via komputilo dum horoj aŭ tagoj sur fino, 638 00:29:08,680 --> 00:29:11,980 vi povus esti petante pli kaj pli memoro kaj neniam fakte uzante ĝin 639 00:29:11,980 --> 00:29:15,180 kaj tiel via kodo povus esti, aŭ programoj povus esti likanta memoro, 640 00:29:15,180 --> 00:29:18,350 kaj se vi komencos filtri memoro, Tie estas malpli da memoro por aliaj programoj, 641 00:29:18,350 --> 00:29:21,220 kaj la efiko estas malrapidigi ĉiu malsupren. 642 00:29:21,220 --> 00:29:23,600 >> Nun, ĉi tiu estas nedisputeble unu el la plej abomenaj programoj 643 00:29:23,600 --> 00:29:26,350 vi havos ŝancojn kuri en CS50 mezuro 644 00:29:26,350 --> 00:29:31,650 kiel ĝia eligo estas eĉ pli esotera ol tin La aŭ fari la aŭ ajna de la komando 645 00:29:31,650 --> 00:29:35,930 linio programoj ni kuras antaŭ sed dankeme, enigita en lian eligo 646 00:29:35,930 --> 00:29:39,810 Estas iuj super helpema konsiletoj kiu estos utila aŭ por pset kvar 647 00:29:39,810 --> 00:29:41,510 aŭ certe pset kvin. 648 00:29:41,510 --> 00:29:44,250 Do valgrind estas ilo kiu povas esti uzita rigardi 649 00:29:44,250 --> 00:29:46,930 por memoro fugoj en via programo. 650 00:29:46,930 --> 00:29:48,570 Ĝi estas relative simpla kuri. 651 00:29:48,570 --> 00:29:51,420 Vi kuras valgrind kaj tiam, eĉ kvankam ĝi estas iom parolema, 652 00:29:51,420 --> 00:29:54,440 haltostreko haltostreko liko ĉeko egalas plena, kaj tiam dot 653 00:29:54,440 --> 00:29:56,320 oblikvo kaj la nomo de via programo. 654 00:29:56,320 --> 00:30:00,010 Do valgrind tiam kuri via programo kaj ĉe la fino de via programo 655 00:30:00,010 --> 00:30:02,240 kurante antaŭ ĝi malekas kaj donas alian prompto, 656 00:30:02,240 --> 00:30:04,980 ĝi tuj analizos vian programo dum ĝi estas estinta kurante 657 00:30:04,980 --> 00:30:07,740 Diri al vi vi likas ajna memoro kaj pli bona ankoraŭ, 658 00:30:07,740 --> 00:30:10,610 vi tuŝos memoro kiu ne apartenis al vi? 659 00:30:10,610 --> 00:30:13,700 Ĝi ne povas kapti ĉion, sed ĝi estas sufiĉe bona ĉe kaptante plej aferoj. 660 00:30:13,700 --> 00:30:19,700 >> Do jen ekzemplo de mia kuris tiu programo, kuris valgrind, 661 00:30:19,700 --> 00:30:21,470 sur programo nomata memoro, kaj mi tuj 662 00:30:21,470 --> 00:30:24,730 reliefigi la liniojn kiuj estas finfine de intereso al ni. 663 00:30:24,730 --> 00:30:27,690 Do ekzistas eĉ pli distroj ke mi forigis el la diapozitivo. 664 00:30:27,690 --> 00:30:30,930 Sed ni vidos, kian tiu programo kapablas diranta nin. 665 00:30:30,930 --> 00:30:34,800 Ĝi estas kapabla je diranta nin aferoj kiel nevalidan registran de grandeco 4. 666 00:30:34,800 --> 00:30:38,020 Alivorte, se vi tuŝas la memoro, specife 4 bajtoj de memoro 667 00:30:38,020 --> 00:30:40,350 ke vi ne devus havi, valgrind povas diri al vi ke. 668 00:30:40,350 --> 00:30:41,660 Nevalida registran de grandeco 4. 669 00:30:41,660 --> 00:30:43,640 Vi tuŝis kvar bajtoj ke vi ne devus havi. 670 00:30:43,640 --> 00:30:44,840 Kie vi faris tion? 671 00:30:44,840 --> 00:30:45,900 Jen la beleco. 672 00:30:45,900 --> 00:30:50,000 Memoro punkto c linio 21 estas kie vi ŝraŭbita supren kaj tial ĝi estas helpema. 673 00:30:50,000 --> 00:30:53,410 Tre kiel GDB, ĝi povas helpi atentigi vin je la fakta eraro. 674 00:30:53,410 --> 00:30:57,170 >> Nun, ĉi tiu estas iom pli parolema, se ne konfuza. 675 00:30:57,170 --> 00:31:01,307 40 bitokoj en 1 blokoj estas definitive perdita en perdo rekordo 1 de 1. 676 00:31:01,307 --> 00:31:02,140 Kion tio signifas? 677 00:31:02,140 --> 00:31:05,920 Nu, ĝi nur signifas ke vi petis 40 bajtoj kaj vi neniam donis ĝin reen. 678 00:31:05,920 --> 00:31:08,930 Vi nomas malloc aŭ vi vokis GetString kaj la mastruma sistemo 679 00:31:08,930 --> 00:31:12,450 donis vin 40 bajtoj, sed vi neniam liberigita aŭ liberigita ke memoro, 680 00:31:12,450 --> 00:31:15,400 kaj esti justa, ni neniam montras vi kiom redoni memoro. 681 00:31:15,400 --> 00:31:17,910 Rezultas ke estas súper simpla funkcio nomita libera. 682 00:31:17,910 --> 00:31:21,170 Prenas unu argumenton, la afero Vi volas liberigi aŭ redoni, 683 00:31:21,170 --> 00:31:23,430 sed 40 bitokoj, ŝajne, en tiu programo 684 00:31:23,430 --> 00:31:27,300 perdiĝis ĉe linio 20 de memoro dot c. 685 00:31:27,300 --> 00:31:28,650 >> Do ni vidas ĉi programo. 686 00:31:28,650 --> 00:31:31,020 Estas súper senutila. 687 00:31:31,020 --> 00:31:33,980 Ĝi nur pruvas tiu aparta eraro. 688 00:31:33,980 --> 00:31:34,920 Do ni rigardu. 689 00:31:34,920 --> 00:31:39,920 Jen ĉefa kaj ĉefa, avizo, alvokoj funkcio nomita f kaj tiam revenas. 690 00:31:39,920 --> 00:31:41,550 Do ne cxiuj interesaj. 691 00:31:41,550 --> 00:31:42,664 Kion f faru? 692 00:31:42,664 --> 00:31:44,330 Rimarku ke mi ne tedis kun prototipo. 693 00:31:44,330 --> 00:31:46,520 Mi volis teni la kodo kiel minimumaj kiel ebla. 694 00:31:46,520 --> 00:31:49,530 Do mi metis f super ĉefa kaj tio estas bone, certe, 695 00:31:49,530 --> 00:31:51,500 por mallongaj programoj kiel ĉi. 696 00:31:51,500 --> 00:31:56,910 Do f ne reveni nenion kaj faras ne preni ion, sed ĝi faras tion. 697 00:31:56,910 --> 00:31:59,620 Ĝi deklaras, tre kiel en la Binky ekzemple, 698 00:31:59,620 --> 00:32:02,682 puntero nomata x ke tuj stoki la adreson de int. 699 00:32:02,682 --> 00:32:03,890 Do jen la maldekstra flanko. 700 00:32:03,890 --> 00:32:07,230 En la angla, kio estas la dekstra flanko faras? 701 00:32:07,230 --> 00:32:09,770 Iu ajn? 702 00:32:09,770 --> 00:32:13,665 Kio estas ĉi faras por ni? 703 00:32:13,665 --> 00:32:14,651 Yeah? 704 00:32:14,651 --> 00:32:16,623 >> Spektantaro: [inaudible] fojojn la grandeco de int 705 00:32:16,623 --> 00:32:19,175 kio estas 10 fojoj ke [inaudible] 706 00:32:19,175 --> 00:32:20,800 DAVID Malan: Bona kaj mi resumos. 707 00:32:20,800 --> 00:32:25,480 Do asigni sufiĉan spacon por 10 entjeroj aŭ 10, kio estas la grandeco de int, 708 00:32:25,480 --> 00:32:29,340 ĝi estas kvar bajtoj, do 10 foje 4 estas 40, tiel ke dekstra flanko kiu mi havas 709 00:32:29,340 --> 00:32:33,930 emfazata estas doni al mi 40 bajtoj kaj stoki la adreson de la unua bitoko 710 00:32:33,930 --> 00:32:34,940 en x. 711 00:32:34,940 --> 00:32:38,380 Kaj nun laste, kaj jen kien tiu programo estas kalesxo, kio estas 712 00:32:38,380 --> 00:32:41,540 misas linio 21 bazita sur tiu logiko? 713 00:32:41,540 --> 00:32:45,197 714 00:32:45,197 --> 00:32:46,280 Kio okazas kun linio 21? 715 00:32:46,280 --> 00:32:46,780 Yeah? 716 00:32:46,780 --> 00:32:49,550 Spektantaro: Vi ne povas indekson en x [inaudible]. 717 00:32:49,550 --> 00:32:50,300 DAVID Malan: Yeah. 718 00:32:50,300 --> 00:32:52,270 Mi devus ne indekson en x tiel. 719 00:32:52,270 --> 00:32:53,850 Do sintakse, tio estas bone. 720 00:32:53,850 --> 00:32:56,990 Kio estas bela estas, multe kiel vi povas trakti la nomon de tabelo 721 00:32:56,990 --> 00:33:01,080 kvazaŭ ĝi estas puntero, simile povas trakti montrilo kvazaŭ ĝi estas 722 00:33:01,080 --> 00:33:06,425 tabelo, kaj tial mi povas sintakse diru x krampo ion, x krampo i, 723 00:33:06,425 --> 00:33:07,800 sed la 10 estas problema. 724 00:33:07,800 --> 00:33:09,096 Kial? 725 00:33:09,096 --> 00:33:10,910 >> Publiko: Ĉar ĝi ne estas ene. 726 00:33:10,910 --> 00:33:12,390 >> DAVID Malan: Ne ene ol bloko de memoro. 727 00:33:12,390 --> 00:33:15,306 Kio estas la plej granda valoro mi metante en tiuj rektaj krampoj? 728 00:33:15,306 --> 00:33:16,870 9, 0 tra 9. 729 00:33:16,870 --> 00:33:18,160 Pro nulo indeksado. 730 00:33:18,160 --> 00:33:20,190 Do 0 tra 9 estus bone. 731 00:33:20,190 --> 00:33:23,960 Krampo 10 Ne bone kaj sed, memoru tamen, ĉiufoje 732 00:33:23,960 --> 00:33:27,017 Mi ŝajnas provi fari CS50 IDE kraŝo tajpante en blufa valoroj, 733 00:33:27,017 --> 00:33:29,100 ĝi ne ĉiam kunlaboras, kaj ja, vi ofte 734 00:33:29,100 --> 00:33:31,460 Get Lucky nur ĉar la mastruma sistemo ne 735 00:33:31,460 --> 00:33:35,467 rimarkos ke vi iam tiel iomete pasi iun eron de memoro, 736 00:33:35,467 --> 00:33:38,300 ĉar vi restus ene teknike via segmento, sed pli sur tiu 737 00:33:38,300 --> 00:33:40,940 en operaciumoj klaso, kaj do ion tiel 738 00:33:40,940 --> 00:33:43,000 povus tre facile iri desapercibido. 739 00:33:43,000 --> 00:33:48,120 Via programo estas neniam tuj frakasos konsekvence sed eble unufoje en kelktempe. 740 00:33:48,120 --> 00:33:50,610 >> Kaj tiel ni provu valgrind sur tiu, kaj jen 741 00:33:50,610 --> 00:33:52,870 kie ni akiros superŝutita per la eligo momente. 742 00:33:52,870 --> 00:34:00,810 Do fari memoron valgrind liko ĉeko egalas plena dot oblikvo memoro. 743 00:34:00,810 --> 00:34:03,040 Kaj jen kial mi promesas ĉi surverŝos. 744 00:34:03,040 --> 00:34:05,700 Jen kion valgrind, jen kion programisto, iuj jaroj ago- 745 00:34:05,700 --> 00:34:08,469 decidis ke estus bona ideo por la eligo aspekti. 746 00:34:08,469 --> 00:34:09,750 Do ni sencon de tiu. 747 00:34:09,750 --> 00:34:13,120 Do tute maldekstre-mana flanko por neniu bona kialo 748 00:34:13,120 --> 00:34:16,620 estas la procezo ID de la programon ni nur kuri, la solan ensalutilo 749 00:34:16,620 --> 00:34:18,030 por la programo ni nur kuris. 750 00:34:18,030 --> 00:34:19,738 Ni forigita ke de la glito, sed ekzistas 751 00:34:19,738 --> 00:34:22,190 estas kelkaj utilaj informoj en ĉi tie. 752 00:34:22,190 --> 00:34:24,684 >> Ni rulumu supren al la pinto. 753 00:34:24,684 --> 00:34:25,600 Jen kie ni komencis. 754 00:34:25,600 --> 00:34:27,040 Do estas ne ĉiuj kiuj multe eligo. 755 00:34:27,040 --> 00:34:30,429 Jen ke nevalida registran de grandeco 4 sur linio 21. 756 00:34:30,429 --> 00:34:31,760 Nu, kio estis linio 21? 757 00:34:31,760 --> 00:34:34,500 Linio 21 estis ĝuste tiu kaj ĝi havas sencon 758 00:34:34,500 --> 00:34:37,290 ke mi estas en valide skribi 4 bajtoj ĉar mi estas 759 00:34:37,290 --> 00:34:40,389 provante meti ĉi entjero, kiu povus esti io, 760 00:34:40,389 --> 00:34:42,370 ĝi nur hazarde estas nulo, sed mi provas 761 00:34:42,370 --> 00:34:44,940 meti ĝin je situo kiu ne apartenas al mi. 762 00:34:44,940 --> 00:34:50,900 Cetere, cxi tie, 40 bajtoj en unu blokoj estas definitive perdis en rekordo 1. 763 00:34:50,900 --> 00:34:56,500 Tio estas ĉar kiam mi vokas malloc tie, mi neniam fakte liberigi la memoron. 764 00:34:56,500 --> 00:34:58,140 >> Do kiel ni povas ripari tion? 765 00:34:58,140 --> 00:35:02,970 Lasu min kaj esti iom pli sekuraj kaj fari 9an tie kaj lasu min tie liberaj x. 766 00:35:02,970 --> 00:35:04,820 Tiu estas la nova funkcio por hodiaŭ. 767 00:35:04,820 --> 00:35:11,520 Se mi nun rerun fari memoron dot oblikvo, ni kuras valgrind sur ĝi denove 768 00:35:11,520 --> 00:35:14,990 maksimumigi mia fenestro kaj batis Enter. 769 00:35:14,990 --> 00:35:16,900 Nun, ĝi estas bona. 770 00:35:16,900 --> 00:35:19,590 Enterigos la bona novaĵo en ĉiuj ĉi eligo. 771 00:35:19,590 --> 00:35:20,810 Ĉiuj tenujon blokoj estis liberaj. 772 00:35:20,810 --> 00:35:23,604 Ni revenos al kio la havaĵon estas, sed neniu filtraciones estas eblaj. 773 00:35:23,604 --> 00:35:25,520 Do tiu estas nur alia ilo por via ilo kit 774 00:35:25,520 --> 00:35:30,220 kun kiu vi povas komenci trovu eraroj tiel. 775 00:35:30,220 --> 00:35:34,532 >> Sed ni vidu kion pli povas iri malbone tie. 776 00:35:34,532 --> 00:35:38,890 Ni transiro nun al reale solvi problemon. 777 00:35:38,890 --> 00:35:42,440 Kiel flanken, se tiu estos malpezigi Iomete de konfuzo aŭ streĉiĝo, 778 00:35:42,440 --> 00:35:43,430 tiu estas nun amuza. 779 00:35:43,430 --> 00:35:46,400 780 00:35:46,400 --> 00:35:46,900 Yeah. 781 00:35:46,900 --> 00:35:49,040 Tio estas sufiĉe bona. 782 00:35:49,040 --> 00:35:50,890 Ĉar punteros estas adresoj kaj adresoj 783 00:35:50,890 --> 00:35:53,098 ĝenerale per konvencio skribita kun deksesuma. 784 00:35:53,098 --> 00:35:54,650 Ha, ha, tio estas amuza nun. 785 00:35:54,650 --> 00:35:58,390 Cxiukaze, do ni nun reale solvi problemon. 786 00:35:58,390 --> 00:36:00,840 Tia estis súper, super malalta nivelo tiel malproksime, 787 00:36:00,840 --> 00:36:03,950 kaj ni povas reale fari utilajn aĵoj kun ĉi tiuj malalta nivelo detaloj. 788 00:36:03,950 --> 00:36:06,710 >> Do ni enkondukis kelkajn semajnojn antaŭ la nocio de tabelo. 789 00:36:06,710 --> 00:36:09,177 Tabelo estis bela ĉar estas malfacile purigi nian kodo 790 00:36:09,177 --> 00:36:11,760 ĉar se ni volus skribi programo kun multoblaj studentoj 791 00:36:11,760 --> 00:36:15,270 aŭ multoblaj nomoj kaj domoj kaj dormejoj kaj kolegioj kaj ĉiuj de tiu, 792 00:36:15,270 --> 00:36:19,430 ni povis stoki ĉiu pli pure ene de tabelo. 793 00:36:19,430 --> 00:36:23,039 Sed proponi unu downside de tabelo tiom. 794 00:36:23,039 --> 00:36:26,080 Eĉ se vi ne suferis ĝin vi mem en programo, nur instinkte, 795 00:36:26,080 --> 00:36:30,870 kio estas malbona afero pri tabelo, eble? 796 00:36:30,870 --> 00:36:32,337 Mi aŭdas iun murmuroj. 797 00:36:32,337 --> 00:36:34,170 Spektantaro: Ĝi estas malfacila por ŝanĝi la grandecon. 798 00:36:34,170 --> 00:36:36,128 DAVID Malan: Estas malfacila por ŝanĝi la grandecon. 799 00:36:36,128 --> 00:36:38,660 Vi ne povas ŝanĝi la grandecon de tabelo, fakte, per si 800 00:36:38,660 --> 00:36:43,040 en C. Vi povas atribui alia tabelo, movi ĉiun el la malnova 801 00:36:43,040 --> 00:36:45,380 en la novan, kaj nun havi iun ekstran spacon, 802 00:36:45,380 --> 00:36:47,469 sed ĝi estas ne kiel lingvo kiel Java aŭ Python 803 00:36:47,469 --> 00:36:49,760 aŭ ajnan numeron de aliaj lingvoj kun kiu iuj el vi 804 00:36:49,760 --> 00:36:52,070 povus esti familiara, kie vi povas simple observu aldonante aferoj 805 00:36:52,070 --> 00:36:53,930 ad nauseam al la fino de tabelo. 806 00:36:53,930 --> 00:36:57,880 Kiam vi havas aron de grandeco 6, kiu estas lia grandeco, 807 00:36:57,880 --> 00:37:01,970 kaj tiel kiel la pli frua ideo havi bufron de certa grandeco, 808 00:37:01,970 --> 00:37:05,940 vi devas diveni el la pordego Kiun grandecon vi volas esti? 809 00:37:05,940 --> 00:37:07,880 Se vi divenas tro granda, vi malŝparas spacon. 810 00:37:07,880 --> 00:37:10,950 Se vi divenas tro malgranda, vi ne povas stoki datumojn kiuj, almenaŭ 811 00:37:10,950 --> 00:37:12,940 sen multe pli laboras. 812 00:37:12,940 --> 00:37:18,180 >> Do hodiaŭ, danke al punteros, ni povas komenci riparante kune nian propran 813 00:37:18,180 --> 00:37:20,989 datumstrukturoj, kaj en Fakte, ĉi tie estas io 814 00:37:20,989 --> 00:37:23,030 kiu aspektas iom pli kamufla unuavide, 815 00:37:23,030 --> 00:37:26,440 sed tio kion ni nomas kunligita listo, kaj ĝia nomo ia resumas 816 00:37:26,440 --> 00:37:26,940 ĝin. 817 00:37:26,940 --> 00:37:29,550 Estas listo de nombroj, aŭ en tiu kazo, listo de nombroj, 818 00:37:29,550 --> 00:37:33,480 sed povus esti listo de io, sed ĝi estas kunligitaj pere de sagoj, 819 00:37:33,480 --> 00:37:36,380 kaj simple preni divenon kun kio tekniko 820 00:37:36,380 --> 00:37:38,310 ni tuj povos stebi kune, 821 00:37:38,310 --> 00:37:42,540 ia kiel pufmaizo kun fadeno, kunligita listoj rektangulojn tie? 822 00:37:42,540 --> 00:37:43,936 Lia nombroj? 823 00:37:43,936 --> 00:37:45,560 Kio estas la suba lingvo trajto? 824 00:37:45,560 --> 00:37:46,350 >> Publiko: puntero. 825 00:37:46,350 --> 00:37:47,308 >> DAVID Malan: puntero. 826 00:37:47,308 --> 00:37:51,700 Do ĉiu el tiuj sagoj tie reprezentas montrilo aŭ nur adreson. 827 00:37:51,700 --> 00:37:54,590 Do alivorte, se mi volas stoki liston de nombroj, 828 00:37:54,590 --> 00:37:59,040 Mi ne povas simple stoki ĝin se mi volas la kapablo kreski kaj ŝrumpi 829 00:37:59,040 --> 00:38:00,990 miaj datumstrukturo en tabelo. 830 00:38:00,990 --> 00:38:03,000 Do mi devas havi iom pli sofisticación, 831 00:38:03,000 --> 00:38:05,720 sed rimarki ke ĉi bildo ia sugestas 832 00:38:05,720 --> 00:38:08,650 ke se vi ĵus akiris iom fadenoj konektanta ĉio kune, 833 00:38:08,650 --> 00:38:13,100 verŝajne ne estas ke malfacile fari spacon intere du el tiuj rektangulojn 834 00:38:13,100 --> 00:38:16,750 aŭ du el tiuj nodoj, kiel ni komencos nomante ilin, metis en nova nodo, 835 00:38:16,750 --> 00:38:19,547 kaj tiam kun iu nova fadeno, nur fosaĵo la tri nodoj kune, 836 00:38:19,547 --> 00:38:22,880 la unua unu, la lasta, kaj la ke vi ĵus enmetita en la mezo. 837 00:38:22,880 --> 00:38:26,000 >> Kaj efektive ligillisto, kontraste tabelo, estas dinamika. 838 00:38:26,000 --> 00:38:27,840 Ĝi povas kreski kaj povas ŝrumpi kaj vi ne 839 00:38:27,840 --> 00:38:32,434 devas scii aŭ zorgi anticipe kiom multe datumoj vi tuj estos stokante, 840 00:38:32,434 --> 00:38:35,600 sed rezultas ni devas esti iom zorgema pri kiel apliki ĉi. 841 00:38:35,600 --> 00:38:39,070 Do unue ni pripensi kiel ni efektivigu unu el tiuj malgranduloj ortanguloj. 842 00:38:39,070 --> 00:38:40,690 Ĝi estas facila de implementar int. 843 00:38:40,690 --> 00:38:44,000 Vi nur diri int n kaj tiam vi ricevas 4 bajtoj por int, 844 00:38:44,000 --> 00:38:49,089 sed kiel mi ricevas int, nomas ĝin n, kaj tiam puntero, ni nomas ĝin sekva. 845 00:38:49,089 --> 00:38:50,880 Ni povus nomi tiujn aferojn ion ni volas 846 00:38:50,880 --> 00:38:53,590 sed mi bezonas kutimo datumstrukturo. 847 00:38:53,590 --> 00:38:54,257 Yeah? 848 00:38:54,257 --> 00:38:57,020 >> Publiko: ampersand [inaudible]. 849 00:38:57,020 --> 00:39:00,940 >> DAVID Malan: Do ampersand ni uzos atingi la adreson de nodo potenciale. 850 00:39:00,940 --> 00:39:02,740 Sed ni bezonas alian trajto de C por 851 00:39:02,740 --> 00:39:06,700 doni al mi la eblecon krei tiu kutimo rektangulo, tiu kutimo 852 00:39:06,700 --> 00:39:08,919 variablo, se vi volas, en memoro. 853 00:39:08,919 --> 00:39:09,710 Publiko: struct. 854 00:39:09,710 --> 00:39:10,626 DAVID Malan: struct. 855 00:39:10,626 --> 00:39:14,310 Memoras de lasta semajno, ni enkondukis struct, tiu relative simpla ŝlosilvorto 856 00:39:14,310 --> 00:39:16,254 kiu permesas nin fari aferojn tiel. 857 00:39:16,254 --> 00:39:18,420 C ne venis kun datumoj strukturo nomita studento. 858 00:39:18,420 --> 00:39:22,190 Ĝi venas kun int kaj kaleŝego kaj char kaj tia, sed ĝi ne venas kun studento, 859 00:39:22,190 --> 00:39:26,750 sed ni povas krei studento datumtipo, studento strukturo, kun tiu sintakso 860 00:39:26,750 --> 00:39:27,250 tie. 861 00:39:27,250 --> 00:39:28,350 Kaj vi vidos tion denove kaj denove. 862 00:39:28,350 --> 00:39:30,426 Do ne zorgu pri enmemorigi la ŝlosilvortoj, 863 00:39:30,426 --> 00:39:33,300 sed la ŝlosilvorto jen grava estas nur la fakto ke ni diris struct 864 00:39:33,300 --> 00:39:37,590 kaj tiam ni nomis studento kaj interne de la studento estis nomo kaj domo 865 00:39:37,590 --> 00:39:39,390 aŭ dormejo aŭ similaj. 866 00:39:39,390 --> 00:39:41,980 >> Kaj tial nun hodiaŭ, ni proponas ĉi. 867 00:39:41,980 --> 00:39:45,240 Mi aldonis kelkajn vortojn, sed se mi volas implementar ĉi rektangulo tio 868 00:39:45,240 --> 00:39:48,440 akiris ambaŭ int kaj montrilo, vi scias kion, mi estas 869 00:39:48,440 --> 00:39:51,540 tuj deklari struct nomita nodo. 870 00:39:51,540 --> 00:39:55,630 Mi ankaŭ, ene de ĝi, tuj diri ke nodo, ĉi ortangulo, ĝi havas int 871 00:39:55,630 --> 00:39:59,730 kaj ni vokos ĝi n kaj ĝi havas sekva puntero. 872 00:39:59,730 --> 00:40:02,540 Kaj tio estas iom parolema, sed se vi pensas pri ĝi, 873 00:40:02,540 --> 00:40:07,300 la sagoj, kiuj estis en la bildo antaŭ momento estas de kion datumtipo? 874 00:40:07,300 --> 00:40:12,330 Kie ĉiu de tiuj sagoj notas al kio tipo de datumstrukturo? 875 00:40:12,330 --> 00:40:14,332 Ĝi ne montras ĝuste al int por se. 876 00:40:14,332 --> 00:40:16,165 Ĝi estas indikante la tutaj rektangula afero 877 00:40:16,165 --> 00:40:18,720 kaj ke rektangula aferon, ni diris, estas nomita nodo. 878 00:40:18,720 --> 00:40:21,720 Kaj tial ni ia devas rikure difinas ĉi tiaj 879 00:40:21,720 --> 00:40:26,270 ke nodo, ni diros, enhavos int nomis n 880 00:40:26,270 --> 00:40:31,070 kaj puntero nomis sekva kaj la tipo de datumstrukturo al kiu 881 00:40:31,070 --> 00:40:35,770 ke puntero punktoj estas ŝajne tuj esti struct nodo. 882 00:40:35,770 --> 00:40:41,550 >> Do tiu estas agrene abundajn kaj nur esti pedanta, 883 00:40:41,550 --> 00:40:44,100 la kialo kial ni ne povas simple diru tiu, kiu sincere 884 00:40:44,100 --> 00:40:46,860 aspektas multe pli legebla, Estas ĉar revokon ke C legi 885 00:40:46,860 --> 00:40:48,710 aferojn supre sube, maldekstre dekstren. 886 00:40:48,710 --> 00:40:54,120 Ĝi ne estas ĝis ni preni la punktokomo ke la ŝlosilvorto nodo reale ekzistas. 887 00:40:54,120 --> 00:40:57,980 Do se ni volas havi tian cikla referenco ene de la datumoj 888 00:40:57,980 --> 00:41:02,120 strukturo, ni devas tion fari, kie ni diri struct nodo ĉe la supro, kiu 889 00:41:02,120 --> 00:41:06,770 donas al ni plu vojo priskribi ĉi aferon, tiam ene ni diras struct nodo, 890 00:41:06,770 --> 00:41:09,560 kaj tiam ĉe la lasta linio ni diru, bone, C, cetere, 891 00:41:09,560 --> 00:41:12,060 simple nomas tiun tutan malbenitan afero nodo kaj haltigi 892 00:41:12,060 --> 00:41:14,360 uzante la ŝlosilvorto struct entute. 893 00:41:14,360 --> 00:41:18,030 Do tio estas nur ia sintaksa lertaĵo kiu finfine permesas nin krei 894 00:41:18,030 --> 00:41:21,370 iu kiu aspektas precize kiel tiu. 895 00:41:21,370 --> 00:41:25,010 >> Do se ni supozas nun ni povas efektivigi tion en C, 896 00:41:25,010 --> 00:41:28,040 kiel do ni efektive komenci petolanta ĉi? 897 00:41:28,040 --> 00:41:32,360 Nu, fakte, ĉiuj ni devas fari estas persisti de maldekstre dekstren kaj ĵus 898 00:41:32,360 --> 00:41:35,960 ia enigi nodoj aŭ forigi nodojn aŭ serĉi aferojn kie ajn ni volas, 899 00:41:35,960 --> 00:41:39,560 sed por fari tion, ni iru antaŭen kaj fari aferojn iom pli reala pro tio 900 00:41:39,560 --> 00:41:42,560 estis súper malaltnivela tiom. 901 00:41:42,560 --> 00:41:45,700 Ĉu iu laŭvorte ŝatus esti la unua? 902 00:41:45,700 --> 00:41:46,200 BONE. 903 00:41:46,200 --> 00:41:47,092 Venu supren. 904 00:41:47,092 --> 00:41:47,800 Kio estas via nomo? 905 00:41:47,800 --> 00:41:48,499 >> DAVID David. 906 00:41:48,499 --> 00:41:49,290 DAVID Malan: Davido. 907 00:41:49,290 --> 00:41:49,998 Agrable renkonti vin. 908 00:41:49,998 --> 00:41:50,960 Ankaŭ mi. 909 00:41:50,960 --> 00:41:52,450 Bone. 910 00:41:52,450 --> 00:41:53,990 Kaj ni bezonas numero 9. 911 00:41:53,990 --> 00:41:55,240 Ne tiel bona kiel la unua, eble. 912 00:41:55,240 --> 00:41:56,430 OK, numero 9. 913 00:41:56,430 --> 00:41:59,667 Kelkaj 17, bonvolu. 914 00:41:59,667 --> 00:42:01,000 Lasu min reiri iom pli malproksime. 915 00:42:01,000 --> 00:42:03,980 Numero 22, bonvolu, kaj kion pri fora reen 916 00:42:03,980 --> 00:42:06,344 se mi vidas neniun manoj kun tuta lumo aŭ ne. 917 00:42:06,344 --> 00:42:08,010 Iu estas estanta volontulis prava. 918 00:42:08,010 --> 00:42:08,968 Ĉu vi volas veni supren? 919 00:42:08,968 --> 00:42:10,450 Via antaŭbrako estas perforte suprenirantaj. 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 Venas malsupren. 923 00:42:15,120 --> 00:42:18,450 Ĉu ajnulo ŝatas forcefully-- Venu supren. 924 00:42:18,450 --> 00:42:21,030 Fakta volontulo. 925 00:42:21,030 --> 00:42:23,330 >> Do tre rapide, se vi uloj povus aranĝi 926 00:42:23,330 --> 00:42:26,550 vi simple ŝatas la nodoj sur la ekrano. 927 00:42:26,550 --> 00:42:27,510 Dankon. 928 00:42:27,510 --> 00:42:29,234 Kaj vi estos 26. 929 00:42:29,234 --> 00:42:30,650 Bone kaj rapida enkondukoj. 930 00:42:30,650 --> 00:42:32,139 Do mi estas Davido kaj vi ankaŭ? 931 00:42:32,139 --> 00:42:32,680 DAVID David. 932 00:42:32,680 --> 00:42:33,721 DAVID Malan: Kaj vi estas? 933 00:42:33,721 --> 00:42:34,229 JAKE: Jake. 934 00:42:34,229 --> 00:42:34,729 SUE Sue. 935 00:42:34,729 --> 00:42:35,229 ALEX: Alex. 936 00:42:35,229 --> 00:42:36,475 RAPHAEL: Rafaelo. 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 Bonege. 940 00:42:37,590 --> 00:42:39,810 Tiuj estas niaj volontuloj cxar hodiaux kaj antaŭeniri 941 00:42:39,810 --> 00:42:43,090 kaj ŝanĝi iom tiu maniero, kaj ĝuste iri antaŭen kaj teni 942 00:42:43,090 --> 00:42:47,024 tenante viajn nombrojn kiel vi aŭ via unua signo kaj uzanta vian maldekstran manon 943 00:42:47,024 --> 00:42:48,940 iri antaŭen kaj nur efektivigu tiuj sagoj, ĵus 944 00:42:48,940 --> 00:42:51,360 por ke via maldekstra mano estas laŭvorte montrante kion vi devus celi 945 00:42:51,360 --> 00:42:54,610 je, kaj doni vin iu ĉambro tiel ke ni povas vide vidi viajn brakojn reale 946 00:42:54,610 --> 00:42:58,120 notante, kaj vi povas simple atentigi ia ĉe la grundo estas bona. 947 00:42:58,120 --> 00:43:03,040 >> Do jen ni havas ligillisto de unu, du, tri, kvar, kvin nodoj komence, 948 00:43:03,040 --> 00:43:05,860 kaj rimarki ni havas tiun specialan montrilo ĉe la komenco, kiuj estas 949 00:43:05,860 --> 00:43:09,770 ŝlosilo ĉar ni devas konservi trako de la tuta longo listo iel. 950 00:43:09,770 --> 00:43:13,590 Tiuj infanoj, eĉ se ili restas al dekstre, reen malantaŭeniri en memoro, 951 00:43:13,590 --> 00:43:15,950 ili povas reale esti ie en la komputilo la memoro. 952 00:43:15,950 --> 00:43:18,240 Do tiuj infanoj povus esti staras ie sur la scenejo 953 00:43:18,240 --> 00:43:20,960 kaj tio estas bone, tiel longe kiel ili estas reale montrante unu la alian, 954 00:43:20,960 --> 00:43:22,770 sed konservi aferojn pura kaj simpla, ni 955 00:43:22,770 --> 00:43:25,728 nur tiros ilin lasis al rajto kiel tiu, sed povus esti masiva breĉoj 956 00:43:25,728 --> 00:43:26,790 en inter tiuj nodoj. 957 00:43:26,790 --> 00:43:30,710 >> Nun, se mi volas reale enmeti iun nova valoro, ni iru antaŭen kaj fari tion. 958 00:43:30,710 --> 00:43:33,720 Ni havas ŝancon nun elekti alian nodon. 959 00:43:33,720 --> 00:43:39,820 Diru ni dividas kun mallocing 55. 960 00:43:39,820 --> 00:43:41,320 Ĉu iu gravas esti malloc? 961 00:43:41,320 --> 00:43:42,280 OK, venu supren. 962 00:43:42,280 --> 00:43:42,992 Kio estas via nomo? 963 00:43:42,992 --> 00:43:43,700 RAINBOW: Ĉielarko. 964 00:43:43,700 --> 00:43:44,050 DAVID Malan: Ĉielarko? 965 00:43:44,050 --> 00:43:44,810 Bone. 966 00:43:44,810 --> 00:43:46,600 Malloc Ĉielarko. 967 00:43:46,600 --> 00:43:47,450 Venu supren. 968 00:43:47,450 --> 00:43:51,610 Do nun ni devas demandi al ni algorítmicamente kie ni povas meti 55. 969 00:43:51,610 --> 00:43:53,610 Do ni ĉiuj scias, evidente, kie ŝi verŝajne 970 00:43:53,610 --> 00:43:55,401 apartenas se ni provas teni ĉi ordo 971 00:43:55,401 --> 00:43:58,299 kaj se vi infanoj povus gluti retropaŝi do ni ne defali 972 00:43:58,299 --> 00:43:59,590 la etapo, kiu estus granda. 973 00:43:59,590 --> 00:44:01,420 Do efektive, Ĉielarko, komencu super tie kun mi, 974 00:44:01,420 --> 00:44:04,200 ĉar ni kiel la komputilo nun povas nur vidi unu variablo samtempe. 975 00:44:04,200 --> 00:44:05,190 Do se tiu estas la unua nodo. 976 00:44:05,190 --> 00:44:07,160 Rimarku li ne estas nodo, li estas nur montrilo, 977 00:44:07,160 --> 00:44:10,270 kaj tial li estas tirita al esti nur la grandecon de puntero, ne 978 00:44:10,270 --> 00:44:11,780 unu el tiuj plenaj ortanguloj. 979 00:44:11,780 --> 00:44:16,650 Do ni tuj kontroli ĉe ĉiu ripeto estas 55 malpli ol 9? 980 00:44:16,650 --> 00:44:17,150 No. 981 00:44:17,150 --> 00:44:19,060 Estas 55 malpli ol 17? 982 00:44:19,060 --> 00:44:19,720 No. 983 00:44:19,720 --> 00:44:20,800 Malpli ol 22? 984 00:44:20,800 --> 00:44:22,020 Malpli ol 26? 985 00:44:22,020 --> 00:44:23,390 Malpli ol 34? 986 00:44:23,390 --> 00:44:25,890 Kaj tial nun, evidente Ĉielarko apartenas fine. 987 00:44:25,890 --> 00:44:27,270 Do esti klara, kaj kion estis via nomo, Taylor? 988 00:44:27,270 --> 00:44:27,895 >> Taylor: Taylor. 989 00:44:27,895 --> 00:44:32,510 DAVID Malan: Do inter Taylor maldekstra mano kaj Cxielarko manoj tien, 990 00:44:32,510 --> 00:44:38,324 kies mano devas noti al kio en ordigi enigi 55 en tiu listo? 991 00:44:38,324 --> 00:44:39,240 Kion ni devas fari? 992 00:44:39,240 --> 00:44:39,700 Yeah? 993 00:44:39,700 --> 00:44:41,140 >> Publiko: Taylor mano bezonas atentigi maldekstra. 994 00:44:41,140 --> 00:44:41,680 >> DAVID Malan: Ĝuste. 995 00:44:41,680 --> 00:44:43,800 Do enmeto nodo en la fino de la listo 996 00:44:43,800 --> 00:44:47,140 estas sufiĉe simpla ĉar Taylor ĵus devas atentigi, anstataŭ je la grundo 997 00:44:47,140 --> 00:44:49,640 aŭ ni nomas ĝin nula, null estas speco de la foresto 998 00:44:49,640 --> 00:44:51,640 el puntero aŭ speciala nulo montrilo, vi estas 999 00:44:51,640 --> 00:44:53,740 tuj atentigi kun via maldekstra manon ĉe Ĉielarko kaj tiam Ĉielarko, 1000 00:44:53,740 --> 00:44:55,910 Kien via maldekstro mano probable punkto? 1001 00:44:55,910 --> 00:44:56,570 Malsupren. 1002 00:44:56,570 --> 00:45:00,140 Ĝi ne estas bona se sxi estas speco de indikanta ekstere tie aŭ ia ajn 1003 00:45:00,140 --> 00:45:00,640 kiudirekten. 1004 00:45:00,640 --> 00:45:02,407 Kiu konsiderus rubo valoro, 1005 00:45:02,407 --> 00:45:04,240 sed se ŝi montras al iu konata valoro, ni 1006 00:45:04,240 --> 00:45:07,360 nomas ĝin nulo aŭ nula, tio estas OK ĉar ni havas terminon en tiu 1007 00:45:07,360 --> 00:45:09,390 kaj ni konas la listo nun estas kompletaj. 1008 00:45:09,390 --> 00:45:11,550 >> Do kio estas alia relative simpla kazo? 1009 00:45:11,550 --> 00:45:13,125 Could ni malloc 5? 1010 00:45:13,125 --> 00:45:14,010 Venu supren. 1011 00:45:14,010 --> 00:45:14,782 Kio estas via nomo? 1012 00:45:14,782 --> 00:45:15,490 TIFFANY: Tiffany. 1013 00:45:15,490 --> 00:45:16,000 DAVID Malan: Mi bedaŭras? 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 Bone. 1017 00:45:17,110 --> 00:45:19,071 Tiffany estis malloced kun la valoro 5. 1018 00:45:19,071 --> 00:45:19,570 Venu supren. 1019 00:45:19,570 --> 00:45:23,820 Ĉi tiu estas relative facila tro, sed ni konsideru ordo de operacioj nun. 1020 00:45:23,820 --> 00:45:25,820 Estis sufiĉe facile kun Taylor ĉe la fino. 1021 00:45:25,820 --> 00:45:30,302 Numero 5 estas kompreneble malpli ol 9 kaj do ni havis David ni havas Tiffany, 1022 00:45:30,302 --> 00:45:31,260 kaj kio estis via nomo? 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, kaj Davido. 1026 00:45:34,300 --> 00:45:36,580 Kies mano devus esti ĝisdatigita unuan? 1027 00:45:36,580 --> 00:45:39,260 1028 00:45:39,260 --> 00:45:40,590 Kion vi volas fari tie? 1029 00:45:40,590 --> 00:45:45,244 Ekzistas paro eblaj manieroj, sed Tie estas ankaŭ unu aŭ pli erara manieroj. 1030 00:45:45,244 --> 00:45:46,620 >> Publiko: Komenci kun plej maldekstra. 1031 00:45:46,620 --> 00:45:47,800 >> DAVID Malan: Komenci kun la plej maldekstra. 1032 00:45:47,800 --> 00:45:49,008 Kiu estas la plej maldekstra tie tiam? 1033 00:45:49,008 --> 00:45:49,700 Publiko: Unua. 1034 00:45:49,700 --> 00:45:50,366 >> DAVID Malan: Bone. 1035 00:45:50,366 --> 00:45:53,781 Do komencu kun la unua kaj kie do vi volas ĝisdatigi David manoj esti? 1036 00:45:53,781 --> 00:45:54,780 Publiko: Al la 5. 1037 00:45:54,780 --> 00:45:55,446 DAVID Malan: Bone. 1038 00:45:55,446 --> 00:45:59,026 Kaj David, punkto je kvin aŭ Tiffany tie, kaj nun? 1039 00:45:59,026 --> 00:46:01,072 >> Publiko: Tiffany notas al la 9? 1040 00:46:01,072 --> 00:46:04,030 DAVID Malan: Perfekta, krom Binky La kapo nur ia defalis, dekstra? 1041 00:46:04,030 --> 00:46:06,820 Ĉar kio estas malbone kun ĉi bildo laŭvorte? 1042 00:46:06,820 --> 00:46:08,070 Publiko: Nenio estas indikante. 1043 00:46:08,070 --> 00:46:09,945 DAVID Malan: Nenio indikante Jake nun. 1044 00:46:09,945 --> 00:46:13,360 Ni laŭvorte orfinoj 9 kaj 17, kaj havas ni laŭvorte 1045 00:46:13,360 --> 00:46:18,450 likis ĉiujn ĉi memoro, ĉar per ĝisdatiganta David mano unuan, jen 1046 00:46:18,450 --> 00:46:21,660 fajnan mezuro ĝi estas korekte montrante Tiffany nun, 1047 00:46:21,660 --> 00:46:25,410 sed se neniu havis la Foresight noti al Jake, 1048 00:46:25,410 --> 00:46:27,490 poste ni perdis la tuteco de tiu listo. 1049 00:46:27,490 --> 00:46:28,200 Do ni malfari. 1050 00:46:28,200 --> 00:46:30,950 Por ke estis bona afero stumbli sed ni korektos nun. 1051 00:46:30,950 --> 00:46:33,624 Kion ni faru unuan anstataŭe? 1052 00:46:33,624 --> 00:46:34,124 Yeah? 1053 00:46:34,124 --> 00:46:35,791 >> Publiko: Tiffany devus celi ĉe la 9? 1054 00:46:35,791 --> 00:46:37,582 DAVID Malan: mi ne povas su ke proksime al vi. 1055 00:46:37,582 --> 00:46:38,720 Kiu devus celi ĉe la 9? 1056 00:46:38,720 --> 00:46:39,220 >> Publiko: Tiffany. 1057 00:46:39,220 --> 00:46:39,390 >> DAVID Malan: Bone. 1058 00:46:39,390 --> 00:46:41,200 Do Tiffany devus unue punkto je la 9. 1059 00:46:41,200 --> 00:46:43,550 Do Tiffany devus preni sur identa valoro 1060 00:46:43,550 --> 00:46:45,820 al David, tio ŝajnas redunda dum momento, 1061 00:46:45,820 --> 00:46:48,820 sed tio estas bone ĉar nun, dua paŝo, ni povas ĝisdatigi David mano 1062 00:46:48,820 --> 00:46:52,680 atentigi ĉe Tiffany, kaj tiam se ni nur speco de pura aĵojn 1063 00:46:52,680 --> 00:46:55,740 kvazaŭ tiu estas speco de printempo-kiel, Jen vere korekta inserción. 1064 00:46:55,740 --> 00:46:56,700 Do bonega. 1065 00:46:56,700 --> 00:46:57,970 Do nun ni estas preskaŭ tie. 1066 00:46:57,970 --> 00:47:01,075 Ni enmeti unu fina valoro kiel la valoro 20. 1067 00:47:01,075 --> 00:47:03,010 Se ni povus malloc unu fina volontulo? 1068 00:47:03,010 --> 00:47:04,140 Venu supren. 1069 00:47:04,140 --> 00:47:06,224 Do ĉi tiu estas iom pli malfacila. 1070 00:47:06,224 --> 00:47:08,390 Sed vere, la kodo ni estas skribanta, kvankam parole, 1071 00:47:08,390 --> 00:47:10,610 Estas ĝuste kiel havi faskon de se kondiĉoj nun, ĉu ne? 1072 00:47:10,610 --> 00:47:12,318 Ni havis kondiĉon kontrolanta se ĝi apartenas 1073 00:47:12,318 --> 00:47:13,840 fine, eble la komenco. 1074 00:47:13,840 --> 00:47:15,940 Ni bezonas ian buklo trovi surloke en la mezo. 1075 00:47:15,940 --> 00:47:17,400 Do ni faru ke kun kio estas via nomo? 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 Agrable renkonti vin. 1080 00:47:19,368 --> 00:47:20,490 Do ni havas 20. 1081 00:47:20,490 --> 00:47:21,220 Malpli ol kvin? 1082 00:47:21,220 --> 00:47:21,530 No. 1083 00:47:21,530 --> 00:47:22,160 Malpli ol naŭ? 1084 00:47:22,160 --> 00:47:22,410 No. 1085 00:47:22,410 --> 00:47:23,050 Malpli ol 17? 1086 00:47:23,050 --> 00:47:23,550 No. 1087 00:47:23,550 --> 00:47:23,740 BONE. 1088 00:47:23,740 --> 00:47:25,701 Li apartenas tie kaj viaj nomoj denove estas? 1089 00:47:25,701 --> 00:47:26,200 SUE Sue. 1090 00:47:26,200 --> 00:47:26,880 DAVID Malan: Sue. 1091 00:47:26,880 --> 00:47:27,379 ALEX: Alex. 1092 00:47:27,379 --> 00:47:28,790 DAVID Malan: Sue, Alex, kaj? 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 Kies manoj devas akiri ĝisdatigita unuan? 1096 00:47:32,140 --> 00:47:32,930 >> Publiko: Eric. 1097 00:47:32,930 --> 00:47:33,429 BONE. 1098 00:47:33,429 --> 00:47:35,200 Do Eric devus celi al kie? 1099 00:47:35,200 --> 00:47:35,930 Je 22. 1100 00:47:35,930 --> 00:47:36,430 Bona. 1101 00:47:36,430 --> 00:47:38,180 Kaj nun kio estas poste? 1102 00:47:38,180 --> 00:47:40,800 Sue povas tiam noti al Eric kaj nun, se vi infanoj ĵus 1103 00:47:40,800 --> 00:47:44,077 fari iu ĉambro, kiu estas fajna vide, nun ni faris la inserción. 1104 00:47:44,077 --> 00:47:47,160 Do ni nun konsideras demandon sed Dankoni vin tiel por niaj volontuloj. 1105 00:47:47,160 --> 00:47:48,090 Tre bone farita. 1106 00:47:48,090 --> 00:47:50,831 Vi povas konservi tiujn, se vi volas. 1107 00:47:50,831 --> 00:47:54,140 Kaj ni havas belan adiaŭa donaco se oni kredus ĉiu ŝatas preni streso pilko. 1108 00:47:54,140 --> 00:47:56,030 Lasu min nur pasi ĉi malsupren. 1109 00:47:56,030 --> 00:47:58,430 Do kio estas la takeaway de tio? 1110 00:47:58,430 --> 00:48:02,430 Ĉi tio ŝajnas esti miriga mezuro ni havas nun 1111 00:48:02,430 --> 00:48:06,360 enkondukita alternativo al tabelo kiu ne tiel limigita 1112 00:48:06,360 --> 00:48:07,780 al tabelo de iuj fiksa grandeco. 1113 00:48:07,780 --> 00:48:09,380 Ili povas kreski dinamike. 1114 00:48:09,380 --> 00:48:13,220 >> Sed multe kiel ni vidis en semajnoj pasinteco, ni neniam ricevas nenion senpage, 1115 00:48:13,220 --> 00:48:15,740 kiel certe ekzistas avantaĝinterŝanĝo tie. 1116 00:48:15,740 --> 00:48:18,890 Do kun inversita de ligitaj listo, estas tiu dinamismo? 1117 00:48:18,890 --> 00:48:21,590 Tiu kapablo kreski kaj sincere, ni povus fari delete 1118 00:48:21,590 --> 00:48:23,570 kaj ni povis retiri drajvo. 1119 00:48:23,570 --> 00:48:24,710 Kio prezo ni pagas? 1120 00:48:24,710 --> 00:48:28,510 1121 00:48:28,510 --> 00:48:30,340 Duoble da spaco, antaŭ ĉio. 1122 00:48:30,340 --> 00:48:34,010 Se vi rigardas la bildon, ne plu mi stokante listo de entjeroj. 1123 00:48:34,010 --> 00:48:36,740 Mi stokante listo de entjeroj plus punteros. 1124 00:48:36,740 --> 00:48:38,240 Do mi duobligante la kvanton de spaco. 1125 00:48:38,240 --> 00:48:40,740 Nun, eble tio ne tiom granda interkonsento 4 bajtoj, 8 bajtoj, 1126 00:48:40,740 --> 00:48:43,160 sed certe povus aldoni ĉe grandaj datenaroj. 1127 00:48:43,160 --> 00:48:45,570 Kio estas alia malavantaĝo? 1128 00:48:45,570 --> 00:48:46,070 Yeah? 1129 00:48:46,070 --> 00:48:48,010 >> Publiko: Ni devas _traverse_ ilin unu post unu. 1130 00:48:48,010 --> 00:48:48,760 DAVID Malan: Yeah. 1131 00:48:48,760 --> 00:48:50,260 Ni devas trairi ilin unu post unu. 1132 00:48:50,260 --> 00:48:53,860 Vi scias kion, ni rezignis tiun súper konvena trajto de kvadrata krampo 1133 00:48:53,860 --> 00:48:57,240 skribmaniero, pli konvene konata kiel hazarda aliro, 1134 00:48:57,240 --> 00:48:59,280 kie ni povas simple salti al individua elemento 1135 00:48:59,280 --> 00:49:01,470 sed nun se mi ankoraŭ havis miaj volontuloj tie, 1136 00:49:01,470 --> 00:49:04,660 se mi volis trovi la numero 22, tion mi ne povas ĝuste 1137 00:49:04,660 --> 00:49:06,620 salti al krampo ion ion. 1138 00:49:06,620 --> 00:49:10,530 Mi devas rigardi la liston, multe kiel nia serĉado ekzemploj lineare, 1139 00:49:10,530 --> 00:49:12,260 trovi la nombron 22. 1140 00:49:12,260 --> 00:49:14,340 Do ŝajne ni pagis prezon tie. 1141 00:49:14,340 --> 00:49:16,430 Sed ni povas tamen solvi aliajn problemojn. 1142 00:49:16,430 --> 00:49:18,587 >> Fakte, mi konigu nur kelkaj vidaĵojn. 1143 00:49:18,587 --> 00:49:20,920 Do se vi jam estis malsupren al Mather la Dining Hall ĵus, 1144 00:49:20,920 --> 00:49:23,320 vi memoras, ke iliaj stakoj de pletoj kiel tiu, 1145 00:49:23,320 --> 00:49:26,300 ni prunteprenis tiujn de Annenberg antaŭ klaso. 1146 00:49:26,300 --> 00:49:28,930 Do tiu pilo de pletoj, tamen, estas reprezentanto reale 1147 00:49:28,930 --> 00:49:30,860 de komputika datumstrukturo. 1148 00:49:30,860 --> 00:49:32,910 Estas datumstrukturo en komputiko 1149 00:49:32,910 --> 00:49:38,010 konata kiel stako kiu tre bele pruntas al ekzakte tiu vida. 1150 00:49:38,010 --> 00:49:41,380 Do se ĉiu el tiuj pletoj estas ne pleto sed kiel numero kaj mi volis 1151 00:49:41,380 --> 00:49:45,010 stoki numerojn, mi povis meti unu malsupren tie, 1152 00:49:45,010 --> 00:49:48,320 kaj mi povus meti alian tie, kaj daŭrigi stakiganta nombroj 1153 00:49:48,320 --> 00:49:53,180 unu sur la alia, kaj kio estas potenciale helpema pri tiu 1154 00:49:53,180 --> 00:49:55,450 estas ke kio estas la implikaĵon de tiu datumstrukturo? 1155 00:49:55,450 --> 00:49:58,045 Kiun numeron mi povas tiri el unua plej oportune? 1156 00:49:58,045 --> 00:50:00,640 1157 00:50:00,640 --> 00:50:03,030 La plej laste metis sur tie. 1158 00:50:03,030 --> 00:50:06,430 >> Do ĉi tiu estas kion nomus en komputiko oni LIFO datumstrukturo. 1159 00:50:06,430 --> 00:50:08,070 Daŭri en, unua el. 1160 00:50:08,070 --> 00:50:10,800 Kaj ni vidos post nelonge kial kiuj povus esti utilaj sed nuntempe, 1161 00:50:10,800 --> 00:50:12,200 nur konsideru la proprieto. 1162 00:50:12,200 --> 00:50:15,158 Kaj ĝi estas speco de stulta se vi opinias pri kiel la manĝejo faras. 1163 00:50:15,158 --> 00:50:17,910 Ĉiufoje pura pletoj kaj metis la freŝaj sur supro, 1164 00:50:17,910 --> 00:50:22,160 vi povus havi antaŭe pura sed eventuale tre malpura kaj polvokovrita 1165 00:50:22,160 --> 00:50:24,360 pleto je la tre fundo se vi neniam reale 1166 00:50:24,360 --> 00:50:26,820 akiri al la fundo de tiu pilo, ĉar vi simple 1167 00:50:26,820 --> 00:50:29,380 teni metante la novan kaj purulo sur gxian supron. 1168 00:50:29,380 --> 00:50:31,840 La sama afero povus okazi en superbazaro ankaŭ. 1169 00:50:31,840 --> 00:50:35,450 Se vi havas pri kazo de lakto kaj ĉiufoje CVS 1170 00:50:35,450 --> 00:50:37,610 aŭ kiu ajn akiras pli lakto, vi simple baton la lecha 1171 00:50:37,610 --> 00:50:39,880 vi jam havas la dorson kaj vi metis la novajn supren fronto, 1172 00:50:39,880 --> 00:50:43,088 vi tuj havos kelkajn belajn aĉa lakto fine de la datumstrukturo, 1173 00:50:43,088 --> 00:50:46,390 ĉar ĝi estas ĉiam ĉe la fundo aŭ ekvivalente ĝi estas ĉiam ĉe la dorso. 1174 00:50:46,390 --> 00:50:50,407 >> Sed estas alia maniero pensi viciganta datumoj kaj ekzemple, tiu. 1175 00:50:50,407 --> 00:50:53,490 Se vi estas unu de tiuj personoj kiuj ŝatas laŭliniigi ekster Apple tendencas 1176 00:50:53,490 --> 00:50:55,610 kiam nova produkto venas eksteren, vi probable 1177 00:50:55,610 --> 00:50:58,780 Ne uzante pilo datumoj strukturo ĉar vi 1178 00:50:58,780 --> 00:51:03,070 estus fremdigas ĉiuj aliajn kiu estas viciganta aĉeti iun novan ludilon. 1179 00:51:03,070 --> 00:51:06,610 Prefere, vi probable uzante kia datumstrukturo 1180 00:51:06,610 --> 00:51:10,050 kian sistemon en la reala mondo? 1181 00:51:10,050 --> 00:51:13,493 Espereble ĝi estas linio, aŭ pli konvene aŭ pli brite kiel, atendovico. 1182 00:51:13,493 --> 00:51:17,700 Kaj ĝi rezultas atendovico estas ankaŭ datumstrukturo en komputiko, 1183 00:51:17,700 --> 00:51:19,700 sed atendovico havas tre malsama proprieto. 1184 00:51:19,700 --> 00:51:20,820 Ne LIFO. 1185 00:51:20,820 --> 00:51:21,990 Daŭri en, unua el. 1186 00:51:21,990 --> 00:51:22,800 Malproksima. 1187 00:51:22,800 --> 00:51:24,280 Ĝi estas anstataŭe FIFO. 1188 00:51:24,280 --> 00:51:26,110 Unua en, unua el. 1189 00:51:26,110 --> 00:51:27,970 Kaj tio estas bona afero por justeco mem 1190 00:51:27,970 --> 00:51:30,428 certe kiam vi tegante supren super frumatene. 1191 00:51:30,428 --> 00:51:33,400 Se vi akiras tie la unua, vi volas eliri unuaj ankaŭ. 1192 00:51:33,400 --> 00:51:35,880 >> Kaj tial ĉiuj ĉi tiuj datumoj strukturoj, vostoj kaj stakoj 1193 00:51:35,880 --> 00:51:39,220 kaj aroj da aliaj, rezultas vi povas pensi pri tio kiel nur tabelo. 1194 00:51:39,220 --> 00:51:41,820 Jen tabelo, eble fiksa grandeco 4, sed ĝi estus 1195 00:51:41,820 --> 00:51:44,990 esti ia agrabla se ni povus simple amasiĝas pletoj preskaŭ senlime alta se ni 1196 00:51:44,990 --> 00:51:46,780 havas ke multaj pletoj aŭ nombroj. 1197 00:51:46,780 --> 00:51:48,840 Do eble ni volas uzi ligillisto tie, 1198 00:51:48,840 --> 00:51:51,800 sed la komerco-off estas iranta esti potenciale ke ni bezonas pli memoro, 1199 00:51:51,800 --> 00:51:55,930 prenas iom pli da tempo, sed ni ne limigi la altecon de la pilo, 1200 00:51:55,930 --> 00:51:59,550 multe kiel Mather la ekrano kazo povus limigi la grandecon de la pilo, 1201 00:51:59,550 --> 00:52:03,117 kaj tiel ili estas dezajno decidojn aŭ disponeblaj ebloj al ni finfine. 1202 00:52:03,117 --> 00:52:04,950 Do kun tiuj datumoj strukturoj, ni komencis 1203 00:52:04,950 --> 00:52:09,360 vidante novaj superaj baroj potenciale sur kio antaŭe estis super rapida 1204 00:52:09,360 --> 00:52:11,260 kaj kie ni lasos ekstere hodiaŭ kaj kie 1205 00:52:11,260 --> 00:52:13,200 ni esperas atingi estas merkrede, ni 1206 00:52:13,200 --> 00:52:15,740 komenci rigardi datumoj strukturo, kiu ebligas al ni serĉi 1207 00:52:15,740 --> 00:52:18,260 tra datumojn en log fino fojo. 1208 00:52:18,260 --> 00:52:21,470 Kaj ni vidis ke, memoru, en semajno nulo kaj unu kun duuma serĉo aŭ dislimo 1209 00:52:21,470 --> 00:52:22,180 kaj konkeri. 1210 00:52:22,180 --> 00:52:26,240 Oni revenis kaj pli bona ankoraŭ, la sankta gralo por tiu merkredo 1211 00:52:26,240 --> 00:52:29,510 estos veni supren kun la datumstrukturo kiu kuras vere 1212 00:52:29,510 --> 00:52:32,070 aŭ teorie en konstanta tempo, per kiu 1213 00:52:32,070 --> 00:52:34,760 ne gravas kiom da milionoj aŭ miliardoj da aferoj 1214 00:52:34,760 --> 00:52:38,470 ni havas en la datumstrukturo, ĝi volo preni nin konstanta tempo, eble unu paŝo 1215 00:52:38,470 --> 00:52:41,387 aŭ du paŝojn aŭ 10 paŝojn, sed konstanta nombroj de paŝoj 1216 00:52:41,387 --> 00:52:42,970 serĉi tra tiu datumstrukturo. 1217 00:52:42,970 --> 00:52:46,300 Tio ja estos la Sankta gralo sed pli sur tiu merkrede. 1218 00:52:46,300 --> 00:52:49,045 Vidu ya tiam. 1219 00:52:49,045 --> 00:52:53,704 >> [MUZIKO Ludante] 1220 00:52:53,704 --> 00:56:08,448