1 00:00:00,000 --> 00:00:03,381 >> [REPRODUCCIÓ DE MÚSICA] 2 00:00:03,381 --> 00:00:10,626 3 00:00:10,626 --> 00:00:11,610 >> [REPRODUCCIÓ DE VÍDEO] 4 00:00:11,610 --> 00:00:13,640 >> -Ell És mentir. 5 00:00:13,640 --> 00:00:14,380 >> -Sobre que? 6 00:00:14,380 --> 00:00:17,182 >> -No ho sé. 7 00:00:17,182 --> 00:00:19,990 >> -Llavors, ¿Què en sabem? 8 00:00:19,990 --> 00:00:23,145 >> -Que A les 9:15, Ray Santoya estava al caixer automàtic. 9 00:00:23,145 --> 00:00:23,644 -Sí. 10 00:00:23,644 --> 00:00:27,030 Així que la pregunta és, què estava fent a les 9:16? 11 00:00:27,030 --> 00:00:29,720 >> -Shooting Mil·límetre setembre en alguna cosa. 12 00:00:29,720 --> 00:00:31,540 Potser va veure el franctirador. 13 00:00:31,540 --> 00:00:33,412 >> -O Va ser treballar amb ell. 14 00:00:33,412 --> 00:00:34,340 >> -Espera. 15 00:00:34,340 --> 00:00:36,200 Torna un. 16 00:00:36,200 --> 00:00:36,975 >> -Què veus? 17 00:00:36,975 --> 00:00:44,400 18 00:00:44,400 --> 00:00:47,805 >> -tingui El seu rostre fins pantalla completa. 19 00:00:47,805 --> 00:00:48,680 >> -Els Seus Ulleres. 20 00:00:48,680 --> 00:00:50,060 >> -Hi Ha Una reflexió. 21 00:00:50,060 --> 00:01:00,455 22 00:01:00,455 --> 00:01:02,280 >> -És L'equip de beisbol de Nuevitas. 23 00:01:02,280 --> 00:01:03,110 Aquesta és la seva logotip. 24 00:01:03,110 --> 00:01:05,820 >> -I Ell està parlant amb el que porta la jaqueta. 25 00:01:05,820 --> 00:01:06,670 >> [FI DE REPRODUCCIÓ] 26 00:01:06,670 --> 00:01:07,628 >> DAVID Malan: D'acord. 27 00:01:07,628 --> 00:01:11,210 Això és CS50 i això és una mica més de [inaudible] amb la qual estàs 28 00:01:11,210 --> 00:01:12,890 passos amb el problema d'establir quatre. 29 00:01:12,890 --> 00:01:16,606 Avui comencem a mirar una mica més profundament en aquestes coses anomenades punters, 30 00:01:16,606 --> 00:01:18,480 que tot i que és un tema bastant arcà, 31 00:01:18,480 --> 00:01:20,813 resulta que es va ser el mitjà pel qual ens 32 00:01:20,813 --> 00:01:24,320 pot començar a construir i muntatge programes molt més sofisticats. 33 00:01:24,320 --> 00:01:28,150 Però ho vam fer en dimecres passat per mitjà d'alguns claymation primer. 34 00:01:28,150 --> 00:01:30,190 Així que això, recordar, és Binky i nosaltres el fem servir 35 00:01:30,190 --> 00:01:33,148 a fer una ullada a un programa que realment no fer res interessant, 36 00:01:33,148 --> 00:01:34,950 però sí va revelar alguns problemes. 37 00:01:34,950 --> 00:01:38,570 Així que per començar avui, per què no ens anem ràpidament a través d'alguns d'aquests passos, 38 00:01:38,570 --> 00:01:41,920 tractar de destil·lar en termes d'humans exactament el que està passant aquí 39 00:01:41,920 --> 00:01:45,410 i per què això és dolent, i després seguir endavant i realment començar a construir alguna cosa 40 00:01:45,410 --> 00:01:46,309 amb aquesta tècnica? 41 00:01:46,309 --> 00:01:48,350 Així que aquests van ser els primers dues línies en aquest programa 42 00:01:48,350 --> 00:01:51,340 i en termes simples, el que estan fent aquestes dues línies? 43 00:01:51,340 --> 00:01:55,600 Algú que és raonablement còmode amb el que ha declarat a la pantalla? 44 00:01:55,600 --> 00:01:58,340 45 00:01:58,340 --> 00:02:00,120 Quines són aquestes dues línies que fan? 46 00:02:00,120 --> 00:02:02,070 No és tot el que diferent de setmana un, 47 00:02:02,070 --> 00:02:03,611 però que una novetat símbol especial. 48 00:02:03,611 --> 00:02:04,152 Sí? 49 00:02:04,152 --> 00:02:05,628 Tornar-hi. 50 00:02:05,628 --> 00:02:07,092 >> AUDIÈNCIA: Declarar punters? 51 00:02:07,092 --> 00:02:08,050 DAVID Malan: Digui una altra vegada? 52 00:02:08,050 --> 00:02:08,860 AUDIÈNCIA: Declarar punters? 53 00:02:08,860 --> 00:02:11,776 DAVID Malan: punters declarar i anem a refinar una mica més. 54 00:02:11,776 --> 00:02:14,050 AUDIÈNCIA: [inaudible] direcció x i i. 55 00:02:14,050 --> 00:02:15,300 DAVID Malan: I després abordar. 56 00:02:15,300 --> 00:02:18,550 Així que específicament el que estem fent Som nosaltres vam declarar dues variables. 57 00:02:18,550 --> 00:02:21,252 Aquestes variables, però, van ser de tipus int estrella, que 58 00:02:21,252 --> 00:02:23,210 significa més específicament van a emmagatzemar 59 00:02:23,210 --> 00:02:26,450 la direcció d'un int, respectivament, x i y. 60 00:02:26,450 --> 00:02:27,660 Ara hi ha cap valor? 61 00:02:27,660 --> 00:02:32,621 Hi ha adreces reals en aquests dues variables en aquest punt en el temps? 62 00:02:32,621 --> 00:02:33,120 No. 63 00:02:33,120 --> 00:02:35,030 Simplement ha anomenats valors d'escombraries. 64 00:02:35,030 --> 00:02:38,120 Si en realitat no assigna un variables, el que fos a la memòria RAM 65 00:02:38,120 --> 00:02:42,224 prèviament es va a omplir de zeros i els dos d'aquestes variables. 66 00:02:42,224 --> 00:02:44,140 Però encara no sabem el que són i això és 67 00:02:44,140 --> 00:02:47,060 serà la clau de per què Binky perdut el cap la setmana passada. 68 00:02:47,060 --> 00:02:49,980 >> Així que aquest era el claymation encarnació d'aquesta 69 00:02:49,980 --> 00:02:53,580 pel qual vostè té només dues variables petites peces circulars d'argila, 70 00:02:53,580 --> 00:02:57,330 que pot emmagatzemar variables, però com les fletxes embolicades suggereixen, 71 00:02:57,330 --> 00:03:00,640 no estan realment apuntant a qualsevol lloc conegut per se. 72 00:03:00,640 --> 00:03:03,670 Així que vam tenir aquesta línia, i això era nou la setmana passada, malloc per a la memòria 73 00:03:03,670 --> 00:03:07,130 assignació, que és només una forma elegant de dir-li al sistema operatiu, Linux 74 00:03:07,130 --> 00:03:09,750 o Mac OS o Windows, escolta, dóna'm una mica de memòria, 75 00:03:09,750 --> 00:03:11,780 i tot el que ha de comptar el sistema operatiu 76 00:03:11,780 --> 00:03:14,699 és el que quan se li demana que per a la memòria. 77 00:03:14,699 --> 00:03:16,990 No va a cuidar el que que vas a fer amb ell, 78 00:03:16,990 --> 00:03:19,786 però sí que és necessari per explicar l'operació sistema del que a través de malloc. 79 00:03:19,786 --> 00:03:20,286 Sí? 80 00:03:20,286 --> 00:03:21,078 >> AUDIÈNCIA: Quant? 81 00:03:21,078 --> 00:03:21,994 DAVID Malan: Quant? 82 00:03:21,994 --> 00:03:25,280 Quant en bytes, i així, això, de nou, un exemple artificial, és només dir, 83 00:03:25,280 --> 00:03:27,360 dóna'm la mida d'un int. 84 00:03:27,360 --> 00:03:30,550 Ara, la mida d'un int és de quatre bytes o 32 bits. 85 00:03:30,550 --> 00:03:32,850 Així que això és només una forma de dient, hey, sistema operatiu, 86 00:03:32,850 --> 00:03:37,290 dóna'm 4 bytes de memòria que puc utilitzar a la meva disposició, 87 00:03:37,290 --> 00:03:40,560 i en concret, el que fa retorn malloc respecte 88 00:03:40,560 --> 00:03:41,795 a aquest tros de quatre bytes? 89 00:03:41,795 --> 00:03:44,110 90 00:03:44,110 --> 00:03:44,860 AUDIÈNCIA: Direcció? 91 00:03:44,860 --> 00:03:45,901 DAVID Malan: la direcció. 92 00:03:45,901 --> 00:03:47,580 La direcció d'aquest tros de quatre bytes. 93 00:03:47,580 --> 00:03:48,190 Exactament. 94 00:03:48,190 --> 00:03:51,430 I això és el que està emmagatzemat en última instància, en x i per això no ho fem realitat 95 00:03:51,430 --> 00:03:55,240 cuidar el que el nombre d'aquest direcció és, si es tracta de OX1 o ox2 96 00:03:55,240 --> 00:03:57,110 o alguna adreça hexadecimal críptica. 97 00:03:57,110 --> 00:03:59,850 Ens preocupem pictòricament que aquesta variable x és ara 98 00:03:59,850 --> 00:04:01,630 apuntant al fet que part de la memòria. 99 00:04:01,630 --> 00:04:05,570 Així que la fletxa representa un punter o Més específicament, una adreça de memòria. 100 00:04:05,570 --> 00:04:09,120 Però, de nou, no ens preocupem en general el que aquestes direccions són reals. 101 00:04:09,120 --> 00:04:11,780 Ara, aquesta línia diu el que en termes simples? 102 00:04:11,780 --> 00:04:14,330 Estrella x aconsegueix 42 punt i coma. 103 00:04:14,330 --> 00:04:17,390 Què vol dir això? 104 00:04:17,390 --> 00:04:18,200 Vols anar? 105 00:04:18,200 --> 00:04:20,102 No ratlli el coll. 106 00:04:20,102 --> 00:04:22,360 >> AUDIÈNCIA: La direcció de x està en el 42. 107 00:04:22,360 --> 00:04:24,300 >> DAVID Malan: La direcció de x és als 42. 108 00:04:24,300 --> 00:04:25,190 No exactament. 109 00:04:25,190 --> 00:04:28,485 Tan a prop, però no del tot, perquè hi ha l'estrella que està anteposant aquesta x. 110 00:04:28,485 --> 00:04:29,860 Així que hem d'ajustar una mica. 111 00:04:29,860 --> 00:04:31,032 Sí? 112 00:04:31,032 --> 00:04:36,044 >> AUDIÈNCIA: El valor que el punter x està apuntant és 42. 113 00:04:36,044 --> 00:04:36,710 DAVID Malan: OK. 114 00:04:36,710 --> 00:04:40,840 El valor que el punter x és apuntant a, diguem, seran 42, 115 00:04:40,840 --> 00:04:44,165 o dit d'una altra manera, l'estrella x diu, anar a qualsevol adreça 116 00:04:44,165 --> 00:04:48,340 està en x, ja sigui 1 Oxford Carrer o 33 Oxford Street 117 00:04:48,340 --> 00:04:51,850 o OX1 o OX33, qualsevol que sigui que adreça numèrica és, 118 00:04:51,850 --> 00:04:54,380 estrella de x és el desreferència de x. 119 00:04:54,380 --> 00:04:57,297 Així que anar a aquesta direcció i a continuació, posar el número 42 allà. 120 00:04:57,297 --> 00:04:59,380 Així que seria un manera equivalent a dir això. 121 00:04:59,380 --> 00:05:01,860 Així que això és tot fi i després volem representar la imatge 122 00:05:01,860 --> 00:05:05,370 de la següent manera en què hem afegit la 42 a la part de les quatre 123 00:05:05,370 --> 00:05:09,370 bytes en el costat dret, però aquesta línia era on les coses van sortir malament 124 00:05:09,370 --> 00:05:11,120 i el cap de Binky aparèixer en aquest punt, 125 00:05:11,120 --> 00:05:15,290 perquè les coses dolentes succeeixen quan d'eliminar la referència dels valors d'escombraries 126 00:05:15,290 --> 00:05:18,210 o eliminar la referència no vàlid punters, i em diuen que no vàlid 127 00:05:18,210 --> 00:05:21,020 perquè en aquest punt en el història, el que està dins de i? 128 00:05:21,020 --> 00:05:24,440 Quin és el valor de i en base en els últims passos? 129 00:05:24,440 --> 00:05:25,360 Sí? 130 00:05:25,360 --> 00:05:26,115 Què és això? 131 00:05:26,115 --> 00:05:26,990 >> AUDIÈNCIA: Una adreça. 132 00:05:26,990 --> 00:05:28,460 DAVID Malan: Una adreça. 133 00:05:28,460 --> 00:05:31,910 Ha de ser una adreça però he inicialitzat ell? 134 00:05:31,910 --> 00:05:32,800 Així que no tinc. 135 00:05:32,800 --> 00:05:35,430 Llavors, què se sap que és d'allà? 136 00:05:35,430 --> 00:05:37,590 És només un cert valor de les escombraries. 137 00:05:37,590 --> 00:05:41,500 Podria ser qualsevol adreça de zero a 2000000000 si té dos gigues de RAM, 138 00:05:41,500 --> 00:05:44,289 o zero a 4 milions de dòlars si vostè té té quatre gigabytes de RAM. 139 00:05:44,289 --> 00:05:46,080 És cert valor de les escombraries, però el problema és 140 00:05:46,080 --> 00:05:48,200 que el sistema operatiu, si no s'ha donat 141 00:05:48,200 --> 00:05:51,140 que parteix de la memòria específica que vostè està tractant d'anar, 142 00:05:51,140 --> 00:05:54,650 és generalment va a causar el que hem vist com una fallada de segmentació. 143 00:05:54,650 --> 00:05:57,810 Així que, de fet, qualsevol de vostès que tenen lluitat en problemes en horari d'oficina 144 00:05:57,810 --> 00:06:00,393 o en els problemes que més generalment amb tractant d'esbrinar 145 00:06:00,393 --> 00:06:02,150 un error de segmentació, això significa generalment 146 00:06:02,150 --> 00:06:05,017 estàs tocant un segment de la memòria que no ha de ser. 147 00:06:05,017 --> 00:06:07,350 Estàs tocant de memòria que el sistema operatiu no té 148 00:06:07,350 --> 00:06:10,450 li ha permès tocar, ja sigui per anar massa lluny en la matriu 149 00:06:10,450 --> 00:06:12,870 o a partir d'ara, ja sigui és perquè vostè està tocant 150 00:06:12,870 --> 00:06:14,780 memòria que simplement és un valor de les escombraries. 151 00:06:14,780 --> 00:06:18,230 >> Així que fa l'estrella x aquí es tipus de comportament indefinit. 152 00:06:18,230 --> 00:06:22,030 Vostè mai ha de fer-ho perquè les probabilitats són, el programa només va a xocar, 153 00:06:22,030 --> 00:06:24,050 perquè vostè està dient, anar a aquesta adreça 154 00:06:24,050 --> 00:06:27,000 i vostè no té cap idea d'on que la direcció és en realitat. 155 00:06:27,000 --> 00:06:30,300 Així que el sistema operatiu és probable va estavellar el seu programa 156 00:06:30,300 --> 00:06:33,840 com a resultat i, de fet, això és el que va passar allà per Binky. 157 00:06:33,840 --> 00:06:37,210 Així, en última instància, Binky fixat aquest problema amb això. 158 00:06:37,210 --> 00:06:38,909 Així que el programa en si era defectuós. 159 00:06:38,909 --> 00:06:41,450 Però si vostè mena de seguir endavant i executar aquesta línia en el seu lloc, 160 00:06:41,450 --> 00:06:45,580 i és igual a x només significa el que sigui direcció és una x, també posar-la en i. 161 00:06:45,580 --> 00:06:48,740 >> I així pictòricament, tenim aquesta representat amb dues fletxes 162 00:06:48,740 --> 00:06:51,570 de x i de y apuntant al mateix lloc. 163 00:06:51,570 --> 00:06:55,760 Així semànticament, x és igual a i perquè tots dos d'aquells 164 00:06:55,760 --> 00:07:00,300 s'emmagatzema el mateix direcció, ergo assenyalant a 42, 165 00:07:00,300 --> 00:07:04,910 i ara, quan dius estrelles i, aneu a la direcció en i, 166 00:07:04,910 --> 00:07:06,790 això té un efecte secundari interessant. 167 00:07:06,790 --> 00:07:10,320 Així que la direcció en i és el el mateix que la direcció de x. 168 00:07:10,320 --> 00:07:15,060 Així que si vostè diu anar a l'adreça en i i canvieu el valor a 13, 169 00:07:15,060 --> 00:07:17,140 ¿Qui més es veu afectat? 170 00:07:17,140 --> 00:07:21,100 X és, el punt D, per així dir-ho, s'haurien de veure afectats també. 171 00:07:21,100 --> 00:07:24,340 >> I, en efecte, com Nick va fer aquest dibuix en claymation era exactament això. 172 00:07:24,340 --> 00:07:28,665 Tot i que seguim el punter i, que va acabar en el mateix lloc, 173 00:07:28,665 --> 00:07:32,780 i pel que si haguéssim de imprimir terme xo pointee de i, 174 00:07:32,780 --> 00:07:35,720 llavors podríem veure el valor de 13. 175 00:07:35,720 --> 00:07:37,927 Ara, dic pointee sigui coherent amb el vídeo. 176 00:07:37,927 --> 00:07:39,760 Programadors, al meu coneixement, en realitat mai 177 00:07:39,760 --> 00:07:42,460 dir la paraula pointee, el que és punxeguda 178 00:07:42,460 --> 00:07:44,650 a, però per a la consistència amb el vídeo, s'adonen 179 00:07:44,650 --> 00:07:47,520 això és tot el que era significava en aquesta situació. 180 00:07:47,520 --> 00:07:54,190 Així que qualsevol pregunta sobre claymation o punters o malloc encara? 181 00:07:54,190 --> 00:07:54,850 No? 182 00:07:54,850 --> 00:07:55,470 Tot bé. 183 00:07:55,470 --> 00:07:58,560 >> Així que sense més preàmbuls, anem a fer una ullada 184 00:07:58,560 --> 00:08:00,700 a on això té en realitat ha utilitzat durant algun temps. 185 00:08:00,700 --> 00:08:03,580 Així que hem tingut aquesta biblioteca CS50 això té totes aquestes funcions. 186 00:08:03,580 --> 00:08:06,810 Hem utilitzat getInt molt, GetString, Probablement GetLongLong anterior 187 00:08:06,810 --> 00:08:09,840 en el meu PSet un o així, però el que ha estat passant en realitat? 188 00:08:09,840 --> 00:08:12,920 Bé, anem a fer una ullada ràpida sota de la campana en un programa que 189 00:08:12,920 --> 00:08:17,017 inspira opció et dóna l'CS50 biblioteca, i de fet a partir de la setmana passada, 190 00:08:17,017 --> 00:08:18,850 vam començar a prendre les rodes d'entrenament fora. 191 00:08:18,850 --> 00:08:21,080 Així que això és ara ordenades de l'autòpsia del que 192 00:08:21,080 --> 00:08:23,690 ha estat succeint dins la biblioteca CS50, 193 00:08:23,690 --> 00:08:27,250 tot i que ara començarem a moure lluny d'ell per a la majoria dels programes. 194 00:08:27,250 --> 00:08:29,460 >> Així que aquest és un programa anomenat scanf 0. 195 00:08:29,460 --> 00:08:30,510 És súper curt. 196 00:08:30,510 --> 00:08:33,909 Només té aquestes línies, però introdueix una funció anomenada scanf 197 00:08:33,909 --> 00:08:36,909 que estem en realitat va a veure en un moment dins la biblioteca CS50, 198 00:08:36,909 --> 00:08:38,600 encara que en una forma lleugerament diferent. 199 00:08:38,600 --> 00:08:41,330 Així que aquest programa a la línia 16 es declara una variable x. 200 00:08:41,330 --> 00:08:43,150 Així que em donen quatre bytes per a un int. 201 00:08:43,150 --> 00:08:45,750 Ha estat dient usuari, nombre favor i, a continuació, 202 00:08:45,750 --> 00:08:49,010 aquesta és una línia interessant que realitat corbates junts la setmana passada 203 00:08:49,010 --> 00:08:49,790 i això. 204 00:08:49,790 --> 00:08:53,230 Scanf, i després noten que triga un cadena de format, igual que printf, 205 00:08:53,230 --> 00:08:57,480 % I significa un int, i després es necessita un segon argument que es veu una mica 206 00:08:57,480 --> 00:08:58,260 funky. 207 00:08:58,260 --> 00:09:01,880 És signe x, i recordar, només vam veure això un cop passada setmana. 208 00:09:01,880 --> 00:09:03,465 Quin signe x representa? 209 00:09:03,465 --> 00:09:06,210 210 00:09:06,210 --> 00:09:08,450 Què fa el símbol d'unió en C? 211 00:09:08,450 --> 00:09:08,950 Sí? 212 00:09:08,950 --> 00:09:10,024 >> AUDIÈNCIA: La direcció de. 213 00:09:10,024 --> 00:09:11,190 DAVID Malan: La direcció de. 214 00:09:11,190 --> 00:09:13,190 Així que és tot el contrari de l'operador de l'estrella, 215 00:09:13,190 --> 00:09:17,270 mentre que l'operador de l'estrella diu, aneu a aquesta direcció, l'operador de signe 216 00:09:17,270 --> 00:09:20,280 diu, esbrinar el Direcció d'aquesta variable, 217 00:09:20,280 --> 00:09:23,530 i pel que aquesta és la clau, perquè El propòsit de scanf a la vida 218 00:09:23,530 --> 00:09:26,320 és escanejar l'usuari de entrada des del teclat, 219 00:09:26,320 --> 00:09:29,970 depenent del que ell o ella tipus i, a continuació, llegir l'entrada d'aquest usuari 220 00:09:29,970 --> 00:09:32,970 en una variable, però va veure en les últimes dues setmanes 221 00:09:32,970 --> 00:09:36,080 que aquesta funció d'intercanvi que intentat sense esforç per posar en pràctica 222 00:09:36,080 --> 00:09:37,110 s'acaba de trencar. 223 00:09:37,110 --> 00:09:42,470 Recordem que amb la funció d'intercanvi, si ens declarem A i B com sencers, 224 00:09:42,470 --> 00:09:47,040 vam tenir intercanviem amb èxit el dues variables dins de bescanvi 225 00:09:47,040 --> 00:09:50,080 igual que amb la llet i suc de taronja, però tan aviat com va tornar d'intercanvi, 226 00:09:50,080 --> 00:09:55,200 quin va ser el resultat respecte axey, els valors originals? 227 00:09:55,200 --> 00:09:55,700 Res. 228 00:09:55,700 --> 00:09:56,200 Sí. 229 00:09:56,200 --> 00:09:59,754 Res va passar aquell moment, perquè swaps canvien només les seves còpies locals, 230 00:09:59,754 --> 00:10:01,670 que és a dir, tot aquesta vegada, cada vegada que hem 231 00:10:01,670 --> 00:10:04,010 estat passant en els arguments a les funcions, estem 232 00:10:04,010 --> 00:10:05,939 de pas còpies d'aquests arguments. 233 00:10:05,939 --> 00:10:07,980 Vostè pot fer amb això el que vulguis amb ells, 234 00:10:07,980 --> 00:10:10,890 però van a tenir cap efecte sobre els valors originals. 235 00:10:10,890 --> 00:10:13,650 Així que això és problemàtic si vull tenir una funció com scanf 236 00:10:13,650 --> 00:10:17,170 en la vida, el propòsit és escanejar l'entrada de l'usuari des del teclat 237 00:10:17,170 --> 00:10:22,010 i després omplir els espais en blanc, de manera que parlar, és a dir, donar una variable com x 238 00:10:22,010 --> 00:10:25,410 un valor, perquè si jo fos que només ha de passar x per scanf, 239 00:10:25,410 --> 00:10:28,790 si es té en compte la lògica de l'última setmana, scanf pot fer el que vulgui 240 00:10:28,790 --> 00:10:33,100 amb una còpia de x, però no va poder canviar permanentment x menys que donem 241 00:10:33,100 --> 00:10:37,120 scanf un mapa del tresor, per així dir-ho, on x marca el lloc, per la qual cosa 242 00:10:37,120 --> 00:10:41,860 passem a la direcció de x de manera que scanf pot anar-hi i en realitat el canvi 243 00:10:41,860 --> 00:10:42,920 el valor de x. 244 00:10:42,920 --> 00:10:45,080 I així, de fet, tot que aquest programa fa 245 00:10:45,080 --> 00:10:53,180 si faig scanf 0, en la meva font Directori de 5m, fer scanf 0, 246 00:10:53,180 --> 00:10:57,730 punt slash scanf, nombre si us plau 50, gràcies pel 50. 247 00:10:57,730 --> 00:11:01,020 >> Així que no és tan interessant, però el que en veritat passa 248 00:11:01,020 --> 00:11:04,820 és que tan aviat com em dic scanf aquí, el valor de x 249 00:11:04,820 --> 00:11:06,410 s'està canviant de forma permanent. 250 00:11:06,410 --> 00:11:08,335 Ara, això sembla agradable i bo, i de fet, 251 00:11:08,335 --> 00:11:11,200 sembla que realment no necessitem la biblioteca CS50 en tots els més. 252 00:11:11,200 --> 00:11:13,960 Per exemple, anem a córrer això una vegada més aquí. 253 00:11:13,960 --> 00:11:15,750 Permetin-me tornar a obrir-lo per un segon. 254 00:11:15,750 --> 00:11:20,600 Anem a tractar un nombre favor i en comptes de dir 50 com abans, 255 00:11:20,600 --> 00:11:22,810 diguem que no. 256 00:11:22,810 --> 00:11:24,000 OK, això és una mica estrany. 257 00:11:24,000 --> 00:11:25,270 D'ACORD. 258 00:11:25,270 --> 00:11:28,680 I només algunes tonteries aquí. 259 00:11:28,680 --> 00:11:31,170 Per tant, no sembla manejar situacions errònies. 260 00:11:31,170 --> 00:11:33,620 Així que hem de mínimament inici afegint una mica de comprovació d'errors 261 00:11:33,620 --> 00:11:37,460 per assegurar-se que l'usuari té escrit en un nombre real com 50, 262 00:11:37,460 --> 00:11:40,720 perquè les paraules aparentment mecanografia no es detecta com a problemàtic, 263 00:11:40,720 --> 00:11:42,020 però probablement hauria de ser. 264 00:11:42,020 --> 00:11:46,450 >> Fem una ullada a aquesta versió ara que és el meu intent de tornar a implementar GetString. 265 00:11:46,450 --> 00:11:48,437 Si scanf té tot això funcionalitat incorporada, 266 00:11:48,437 --> 00:11:51,270 ¿Per què hem estat coquetejant amb ells rodes d'entrenament com GetString? 267 00:11:51,270 --> 00:11:55,450 Bé, aquí és potser la meva pròpia versió simple de GetString 268 00:11:55,450 --> 00:12:00,766 pel que fa una setmana, podria haver dit: dóna'm una cadena i en diuen memòria intermèdia. 269 00:12:00,766 --> 00:12:03,390 Avui, vaig a començar just dient estrelles char, que, recordo, 270 00:12:03,390 --> 00:12:04,400 és només sinònim. 271 00:12:04,400 --> 00:12:06,629 Sembla més por però és exactament el mateix. 272 00:12:06,629 --> 00:12:09,420 Així que em donen un buffer variable anomenada això va a emmagatzemar una cadena, 273 00:12:09,420 --> 00:12:12,780 dir la cadena d'usuari si us plau, i després, igual que abans, 274 00:12:12,780 --> 00:12:17,760 anem a tractar de demanar prestat aquesta lliçó scanf % S aquesta vegada i després passar a tampó. 275 00:12:17,760 --> 00:12:19,310 Ara, una comprovació de validesa ràpid. 276 00:12:19,310 --> 00:12:22,120 Per què no estic dient ampersand esmorteir aquesta vegada? 277 00:12:22,120 --> 00:12:25,190 278 00:12:25,190 --> 00:12:26,625 Deduir l'exemple anterior. 279 00:12:26,625 --> 00:12:28,000 AUDIÈNCIA: Char estrelles és un punter. 280 00:12:28,000 --> 00:12:29,920 DAVID Malan: Exactament, perquè aquesta vegada, char 281 00:12:29,920 --> 00:12:34,080 estrelles ja és un punter, una adreça, per definició d'aquesta estrella ser-hi. 282 00:12:34,080 --> 00:12:37,530 I si scanf espera una adreça, n'hi ha prou només per passar a tampó. 283 00:12:37,530 --> 00:12:39,260 No necessito dir memòria intermèdia signe. 284 00:12:39,260 --> 00:12:42,177 Per als curiosos, podria fer alguna cosa com això. 285 00:12:42,177 --> 00:12:43,510 Hi hauria significat diferent. 286 00:12:43,510 --> 00:12:47,240 Això li donaria un punter a un punter, que és en realitat 287 00:12:47,240 --> 00:12:50,050 una cosa vàlida en C, però per ara, anem a mantenir simple 288 00:12:50,050 --> 00:12:51,750 i mantenir la història consistent. 289 00:12:51,750 --> 00:12:54,100 Jo només vaig a passar tampó i això és correcte. 290 00:12:54,100 --> 00:12:56,487 El problema però és això. 291 00:12:56,487 --> 00:12:58,820 Déjame anar endavant i executar aquest programa després de la compilació. 292 00:12:58,820 --> 00:13:00,902 Fer scanf 1. 293 00:13:00,902 --> 00:13:02,610 Maleïda sigui, el meu compilador de la captura del meu error. 294 00:13:02,610 --> 00:13:04,090 Dóna'm un segon. 295 00:13:04,090 --> 00:13:05,460 Clang. 296 00:13:05,460 --> 00:13:06,990 Diguem scanf-1.c. 297 00:13:06,990 --> 00:13:10,880 298 00:13:10,880 --> 00:13:11,380 D'ACORD. 299 00:13:11,380 --> 00:13:12,720 Cal anar. 300 00:13:12,720 --> 00:13:14,280 Ho necessito. 301 00:13:14,280 --> 00:13:16,750 Identificació CS50 té diversos paràmetres de configuració 302 00:13:16,750 --> 00:13:18,280 que protegeixen contra tu mateix. 303 00:13:18,280 --> 00:13:21,300 Necessitava desactivar les de corrent Clang manualment aquest moment. 304 00:13:21,300 --> 00:13:22,140 Així cadena favor. 305 00:13:22,140 --> 00:13:25,560 Vaig a seguir endavant i escriure en el meu món hola favorit. 306 00:13:25,560 --> 00:13:26,490 OK, nul. 307 00:13:26,490 --> 00:13:27,700 Això no és el que he escrit. 308 00:13:27,700 --> 00:13:29,690 Així que és indicatiu de que alguna cosa va malament. 309 00:13:29,690 --> 00:13:33,920 Déjame anar endavant i escric en una cadena molt llarga. 310 00:13:33,920 --> 00:13:37,210 Gràcies per la nul·la i no sé si jo seré capaç de estavellar. 311 00:13:37,210 --> 00:13:40,240 Intentarem una mica de còpia enganxar i veure si això ajuda. 312 00:13:40,240 --> 00:13:43,290 Només has de enganxar un munt d'això. 313 00:13:43,290 --> 00:13:47,310 És, definitivament, una més gran cadena del que és habitual. 314 00:13:47,310 --> 00:13:51,450 Anem a realment escriure-ho. 315 00:13:51,450 --> 00:13:51,950 No. 316 00:13:51,950 --> 00:13:52,650 Maleït sigui. 317 00:13:52,650 --> 00:13:53,480 No Mana trobat. 318 00:13:53,480 --> 00:13:54,550 Així que això no relacionat. 319 00:13:54,550 --> 00:13:56,440 Això és perquè em vaig enganxar alguns personatges dolents, 320 00:13:56,440 --> 00:13:59,780 però això resulta que no funcionarà. 321 00:13:59,780 --> 00:14:03,510 >> Intentarem una vegada més, perquè és més divertit si realment estavellar. 322 00:14:03,510 --> 00:14:09,116 Anem escrigui això i ara, estic va copiar una cadena molt llarga 323 00:14:09,116 --> 00:14:10,990 i ara anem a veure si ens pot xocar aquesta cosa. 324 00:14:10,990 --> 00:14:14,235 Noti que vaig ometre espais i noves línies i punts i comes 325 00:14:14,235 --> 00:14:16,035 i tots els personatges de funky. 326 00:14:16,035 --> 00:14:16,535 Retorn. 327 00:14:16,535 --> 00:14:21,090 328 00:14:21,090 --> 00:14:22,880 I ara la xarxa només està sent lenta. 329 00:14:22,880 --> 00:14:27,460 Vaig sostenir la tecla Comando-V massa temps, amb claredat. 330 00:14:27,460 --> 00:14:28,190 Maleït sigui! 331 00:14:28,190 --> 00:14:29,260 No Mana trobat. 332 00:14:29,260 --> 00:14:29,780 >> D'ACORD. 333 00:14:29,780 --> 00:14:32,240 Bé, el punt és no obstant, el següent. 334 00:14:32,240 --> 00:14:36,910 Així que el que realment està passant en la present declaració 335 00:14:36,910 --> 00:14:39,240 de tampó estrelles Char en la línia 16? 336 00:14:39,240 --> 00:14:41,820 Així que Què si quan em declaro un punter? 337 00:14:41,820 --> 00:14:47,440 Tot el que estic fent és un valor de quatre bytes anomenada buffer, però el que hi ha dins d'ella 338 00:14:47,440 --> 00:14:49,540 en aquest moment? 339 00:14:49,540 --> 00:14:50,930 És només un cert valor de les escombraries. 340 00:14:50,930 --> 00:14:54,170 Perquè cada vegada que declara una variable en C, és només un valor d'escombraries, 341 00:14:54,170 --> 00:14:56,220 i estem començant a viatge per aquesta realitat. 342 00:14:56,220 --> 00:14:59,720 Ara, quan et dic scanf, anar a aquesta adreça 343 00:14:59,720 --> 00:15:01,520 i posar el que l'usuari escriu. 344 00:15:01,520 --> 00:15:06,400 Si l'usuari escriu en hola món, bé, ¿on ho poso? 345 00:15:06,400 --> 00:15:07,750 Buffer és un valor de les escombraries. 346 00:15:07,750 --> 00:15:11,510 >> Així que això és una mica com una fletxa això està assenyalant qui sap on. 347 00:15:11,510 --> 00:15:13,880 Potser és que apunta aquí en la meva memòria. 348 00:15:13,880 --> 00:15:16,560 I així, quan l'usuari tipus de hola món, 349 00:15:16,560 --> 00:15:22,380 el programa tracta de posar el cadena hello world barra invertida 0 350 00:15:22,380 --> 00:15:23,910 en aquesta part de la memòria. 351 00:15:23,910 --> 00:15:27,070 No obstant això, amb alta probabilitat, però clarament no 100% de probabilitat, 352 00:15:27,070 --> 00:15:30,440 l'equip es va a estavellar a continuació el programa perquè no es tracta 353 00:15:30,440 --> 00:15:32,490 la memòria es em permetés tocar. 354 00:15:32,490 --> 00:15:36,330 Així que en resum, aquest programa és viciat per exactament això. 355 00:15:36,330 --> 00:15:38,070 Jo fonamentalment no estic fent què? 356 00:15:38,070 --> 00:15:42,366 Quins passos he omès, igual que ometem amb el primer exemple de Binky? 357 00:15:42,366 --> 00:15:42,866 Sí? 358 00:15:42,866 --> 00:15:43,710 >> AUDIÈNCIA: assignació de memòria? 359 00:15:43,710 --> 00:15:45,001 >> DAVID Malan: assignació de memòria. 360 00:15:45,001 --> 00:15:48,400 En realitat no he assignat qualsevol memòria d'aquesta cadena. 361 00:15:48,400 --> 00:15:50,270 Així que podem arreglar això en un parell de maneres. 362 00:15:50,270 --> 00:15:52,700 Un, podem mantenir simple i de fet, ara estàs 363 00:15:52,700 --> 00:15:55,116 va començar a veure un desdibuixament de les línies entre el 364 00:15:55,116 --> 00:15:58,520 una matriu és, el que és una cadena, el que és un estrelles char és, el que és un conjunt de caràcters 365 00:15:58,520 --> 00:15:59,020 és. 366 00:15:59,020 --> 00:16:02,450 Heus aquí un segon exemple involucrant cordes i notificació 367 00:16:02,450 --> 00:16:05,690 tot el que he fet en la línia 16 És a dir, en comptes de dir 368 00:16:05,690 --> 00:16:09,530 aquest memòria intermèdia serà un char estrella, un punter a una part de la memòria, 369 00:16:09,530 --> 00:16:14,057 Vaig a donar molt proactiva a mi mateix un tampó durant 16 caràcters, 370 00:16:14,057 --> 00:16:16,390 i de fet, si vostè està familiaritzat amb el terme tampó, 371 00:16:16,390 --> 00:16:20,570 probablement del món dels vídeos, on un vídeo és tampó, tampó, 372 00:16:20,570 --> 00:16:21,175 buffering. 373 00:16:21,175 --> 00:16:22,550 Bé, quin és la connexió aquí? 374 00:16:22,550 --> 00:16:24,960 Bé, aquí a YouTube ia l'interior dels reproductors de vídeo 375 00:16:24,960 --> 00:16:27,200 en general, és una matriu això és més gran que 16. 376 00:16:27,200 --> 00:16:30,340 Pot ser que sigui una matriu de mida d'un megabyte, potser 10 megabytes, 377 00:16:30,340 --> 00:16:34,330 i dins d'aquesta matriu fa el seu navegador descarregar un munt de bytes, 378 00:16:34,330 --> 00:16:37,500 un munt de megabytes de vídeo i el reproductor de vídeo, 379 00:16:37,500 --> 00:16:40,930 YouTube o qui és, comença la lectura dels bytes a partir d'aquest array, 380 00:16:40,930 --> 00:16:43,530 i tota vegada que vegi la paraula tampó, tampó, 381 00:16:43,530 --> 00:16:46,350 això vol dir que el jugador té arribat al final d'aquesta matriu. 382 00:16:46,350 --> 00:16:50,430 La xarxa és tan lent que no té omplir la matriu amb més bytes 383 00:16:50,430 --> 00:16:55,610 i pel que està fora de bits per mostrar a l'usuari. 384 00:16:55,610 --> 00:16:59,430 >> Així memòria intermèdia és un terme adequat aquí en què és només una matriu, un tros de la memòria. 385 00:16:59,430 --> 00:17:02,530 I això ho arreglarà perquè resulta que 386 00:17:02,530 --> 00:17:07,410 que es pot tractar com si arrays són adreces, malgrat tampó 387 00:17:07,410 --> 00:17:10,710 és només un símbol, és un seqüència de caràcters, tampó, 388 00:17:10,710 --> 00:17:14,760 això és útil per a mi, el programador, vostè pot passar el seu nom voltant 389 00:17:14,760 --> 00:17:17,079 com si es tractés d'una punter, com si 390 00:17:17,079 --> 00:17:21,000 van ser la direcció d'un tros de la memòria de 16 caràcters. 391 00:17:21,000 --> 00:17:24,530 Així que això és a dir, puc passar el scanf exactament aquesta paraula 392 00:17:24,530 --> 00:17:30,670 i pel que ara, si faig aquest programa, fer scanf 2, punt slash scanf 2, 393 00:17:30,670 --> 00:17:35,386 i el tipus de hola món, Enter, que temps-- 394 00:17:35,386 --> 00:17:37,590 >> Hmm, què va passar? 395 00:17:37,590 --> 00:17:39,340 Cadena favor. 396 00:17:39,340 --> 00:17:41,430 Què vaig fer malament? 397 00:17:41,430 --> 00:17:43,800 Hola món, tampó. 398 00:17:43,800 --> 00:17:44,705 Hola món. 399 00:17:44,705 --> 00:17:48,201 400 00:17:48,201 --> 00:17:49,420 Ah, ja sé el que està fent. 401 00:17:49,420 --> 00:17:49,920 D'ACORD. 402 00:17:49,920 --> 00:17:51,628 Així que ha llegint fins al primer espai. 403 00:17:51,628 --> 00:17:55,680 Així que anem a enganyar per un moment i dic jo només volia escriure alguna cosa 404 00:17:55,680 --> 00:18:01,408 molt llarga com aquesta és una frase llarga aquest és un, dos, tres, quatre, cinc, 405 00:18:01,408 --> 00:18:04,420 sis, set, vuit, nou, 10, 11, 12, 13, 14, 15, 16. 406 00:18:04,420 --> 00:18:05,300 D'ACORD. 407 00:18:05,300 --> 00:18:07,600 De fet, és una llarga condemna. 408 00:18:07,600 --> 00:18:10,710 Així que aquesta frase és més de 16 caràcters 409 00:18:10,710 --> 00:18:13,670 i així quan vaig arribar a Enter, el que va a passar? 410 00:18:13,670 --> 00:18:16,940 Bé, en aquest cas de la memòria intermèdia d'història, havia declarat 411 00:18:16,940 --> 00:18:22,190 de ser en realitat un array amb 16 caràcters llest per anar. 412 00:18:22,190 --> 00:18:27,426 Així que un, dos, tres, quatre, cinc, sis, set, vuit, nou, 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 Així que 16 caràcters, i ara, quan llegit en alguna cosa com això és un llarg 415 00:18:34,410 --> 00:18:43,950 frase, el que va a succeir és que llegiré en aquest és molt 416 00:18:43,950 --> 00:18:49,660 S-E-N-T-E-N-C-E, sentencia. 417 00:18:49,660 --> 00:18:52,270 >> Així que això és deliberadament una cosa dolenta que jo 418 00:18:52,270 --> 00:18:55,060 seguir escrivint més enllà de la límits de la meva matriu, 419 00:18:55,060 --> 00:18:56,660 més enllà dels límits de la meva memòria intermèdia. 420 00:18:56,660 --> 00:19:00,100 Jo podria tenir sort i el programa mantindrà en marxa i no els importa, 421 00:19:00,100 --> 00:19:03,450 però en termes generals, aquesta serà fet estavellar meu programa, 422 00:19:03,450 --> 00:19:06,440 i és un error en el meu codificar el moment em passo 423 00:19:06,440 --> 00:19:08,576 enllà dels límits d'aquesta matriu, perquè jo 424 00:19:08,576 --> 00:19:10,450 no sé si és necessàriament va a estavellar 425 00:19:10,450 --> 00:19:12,120 o si només tindré sort. 426 00:19:12,120 --> 00:19:15,750 Així que això és problemàtic perquè en aquest cas, no sembla funcionar 427 00:19:15,750 --> 00:19:20,931 i anem a temptar la sort aquí, tot i que l'IDE sembla tolerar una mica 428 00:19:20,931 --> 00:19:21,430 de-- 429 00:19:21,430 --> 00:19:22,040 >> Cal anar. 430 00:19:22,040 --> 00:19:23,240 Finalment. 431 00:19:23,240 --> 00:19:26,470 Així que jo sóc l'únic que pot veure això. 432 00:19:26,470 --> 00:19:29,630 Així que acabo de tenir un munt de diversió a escriure 01:00 frase real molt llarg 433 00:19:29,630 --> 00:19:32,800 que sens dubte va superar 16 bytes, perquè jo 434 00:19:32,800 --> 00:19:38,050 escrit en aquest llarg de diverses línies boig frase i, a continuació, donar-se compte del que va passar. 435 00:19:38,050 --> 00:19:41,110 El programa va tractar d'imprimir- i després va obtenir una fallada de segmentació 436 00:19:41,110 --> 00:19:44,430 i errors de segmentació és quan passa una cosa com això 437 00:19:44,430 --> 00:19:47,650 i el sistema operatiu diu no, no pot tocar aquesta memòria. 438 00:19:47,650 --> 00:19:49,570 Anem a matar el programa complet. 439 00:19:49,570 --> 00:19:51,180 >> Així que això sembla problemàtic. 440 00:19:51,180 --> 00:19:54,540 He millorat el programa mitjançant el qual almenys tenir una mica de memòria, 441 00:19:54,540 --> 00:19:58,000 però això sembla confinar el GetString funció per aconseguir 442 00:19:58,000 --> 00:20:00,780 cordes de certa extensió finita 16. 443 00:20:00,780 --> 00:20:04,200 Així que si vols donar suport ja sentències de 16 caràcters, 444 00:20:04,200 --> 00:20:04,880 Què fas? 445 00:20:04,880 --> 00:20:07,970 Bé, es pot augmentar la mida d'aquest buffer per 32 446 00:20:07,970 --> 00:20:09,190 o això sembla classe de curt. 447 00:20:09,190 --> 00:20:12,260 Per què no simplement fer és 1000, però fer retrocedir. 448 00:20:12,260 --> 00:20:17,100 Quina és la resposta intuïtiva de només evitar aquest problema fent 449 00:20:17,100 --> 00:20:20,660 la meva memòria intermèdia més gran, com 1.000 caràcters? 450 00:20:20,660 --> 00:20:23,470 Mitjançant la implementació d'GetString d'aquesta manera. 451 00:20:23,470 --> 00:20:27,130 El que és bo o dolent aquí? 452 00:20:27,130 --> 00:20:28,033 Sí? 453 00:20:28,033 --> 00:20:30,574 AUDIÈNCIA: Si enllaça una gran quantitat de l'espai i no l'utilitza, 454 00:20:30,574 --> 00:20:33,500 llavors no es pot reassignar aquest espai. 455 00:20:33,500 --> 00:20:34,500 DAVID Malan: Per descomptat. 456 00:20:34,500 --> 00:20:38,480 És un malbaratament mesura que si no ho fa realment necessita 900 d'aquests bytes 457 00:20:38,480 --> 00:20:41,057 i no obstant això, vostè està demanant 1.000 en total, de totes maneres, 458 00:20:41,057 --> 00:20:44,140 vostè està consumint més memòria l'ordinador de l'usuari que vostè necessita, 459 00:20:44,140 --> 00:20:45,740 i després de tot, alguns ja has trobat 460 00:20:45,740 --> 00:20:47,620 a la vida que quan estàs corrent un munt de programes 461 00:20:47,620 --> 00:20:50,470 i estan menjant molta memòria, en realitat això pot afectar el rendiment 462 00:20:50,470 --> 00:20:52,220 i l'experiència de l'usuari a l'ordinador. 463 00:20:52,220 --> 00:20:56,090 Així que això és una mena de solució mandrós, amb certesa, i per contra, 464 00:20:56,090 --> 00:21:00,140 que no només és un malbaratament, quin problema segueix sent, fins i tot si faig la meva memòria intermèdia 465 00:21:00,140 --> 00:21:02,100 1000? 466 00:21:02,100 --> 00:21:02,600 Sí? 467 00:21:02,600 --> 00:21:04,475 >> AUDIÈNCIA: La cadena és la longitud de 1.001. 468 00:21:04,475 --> 00:21:05,350 DAVID Malan: Exactament. 469 00:21:05,350 --> 00:21:08,280 Si la cadena és la longitud de 1001, vostè té el mateix problema, 470 00:21:08,280 --> 00:21:10,705 i amb el meu argument, ho faria just en aquest moment que sigui 2000, 471 00:21:10,705 --> 00:21:12,830 però vostè no sap en avançar en el gran que ha de ser, 472 00:21:12,830 --> 00:21:16,890 i, no obstant això, he de compilar el meu programa abans de deixar que la gent fa servir i descàrrega 473 00:21:16,890 --> 00:21:17,390 ella. 474 00:21:17,390 --> 00:21:21,490 Així que aquest és exactament el tipus de coses que els intents de la biblioteca CS50 475 00:21:21,490 --> 00:21:24,750 per ajudar-nos amb i estarem només vista En algunes de la implementació subjacent 476 00:21:24,750 --> 00:21:29,790 aquí, però això és CS50 dot C. Aquest és l'arxiu que ha estat en CS50 IDE 477 00:21:29,790 --> 00:21:31,420 totes aquestes setmanes que ha estat utilitzant. 478 00:21:31,420 --> 00:21:34,280 És pre-compilat i que ha estat utilitzant de forma automàtica 479 00:21:34,280 --> 00:21:38,780 per la naturalesa de tenir el llançar-L bandera CS50 amb estrèpit, 480 00:21:38,780 --> 00:21:42,300 però si em desplaço cap avall a través de tots aquestes funcions, aquí està GetString, 481 00:21:42,300 --> 00:21:44,636 i només per donar-li un mostra del que està passant, 482 00:21:44,636 --> 00:21:46,760 anem a fer una ullada ràpida a la relativa complexitat. 483 00:21:46,760 --> 00:21:48,870 No és un super llarg funció, però no ho vam fer 484 00:21:48,870 --> 00:21:52,530 cal pensar seriosament en tot com fer per aconseguir cadenes. 485 00:21:52,530 --> 00:21:55,660 >> Així que aquí està la meva memòria intermèdia i jo aparentment inicialitzar a null. 486 00:21:55,660 --> 00:21:57,990 Això, per descomptat, és el el mateix que l'estrella char, 487 00:21:57,990 --> 00:22:00,585 però vaig decidir a l'aplicació de la biblioteca CS50 488 00:22:00,585 --> 00:22:02,460 que si anem a ser completament dinàmic, 489 00:22:02,460 --> 00:22:05,770 No sé per endavant el gran d'una usuaris de corda voldran aconseguir. 490 00:22:05,770 --> 00:22:08,140 Així que vaig a començar amb només una cadena buida 491 00:22:08,140 --> 00:22:11,507 i jo vaig a construir la major quantitat la memòria, ja que necessito per adaptar-se a la cadena d'usuari 492 00:22:11,507 --> 00:22:13,340 i si no tinc suficient, vaig a preguntar 493 00:22:13,340 --> 00:22:15,010 el sistema operatiu per a més memòria. 494 00:22:15,010 --> 00:22:17,510 Vaig a moure la seva cadena en un tros més gran de la memòria 495 00:22:17,510 --> 00:22:21,847 i jo vaig a deixar anar o alliberar el insuficientment gran part de la memòria 496 00:22:21,847 --> 00:22:23,680 i només anem per fer això de forma iterativa. 497 00:22:23,680 --> 00:22:25,570 >> Així que una ràpida mirada, aquí és només una variable 498 00:22:25,570 --> 00:22:28,780 amb la qual em vaig a portar un registre de la capacitat del meu buffer. 499 00:22:28,780 --> 00:22:30,071 Quants bytes puc encaixar? 500 00:22:30,071 --> 00:22:32,070 Aquí hi ha una variable n amb que jo seguiré 501 00:22:32,070 --> 00:22:36,200 un registre de quants bytes són realment en el tampó o que l'usuari ha escrit. 502 00:22:36,200 --> 00:22:39,900 Si no has vist això abans, Podeu especificar que una variable com un int 503 00:22:39,900 --> 00:22:46,370 no està signat, que com el seu nom indica, vol dir que és no negatiu, i per què ho faria 504 00:22:46,370 --> 00:22:50,590 Jo mai vull molestar especificant que un int no és només un int, 505 00:22:50,590 --> 00:22:52,540 però és un int sense signar? 506 00:22:52,540 --> 00:22:55,064 És un int no negatiu. 507 00:22:55,064 --> 00:22:56,355 Què fa el [inaudible] vol dir? 508 00:22:56,355 --> 00:22:58,910 >> AUDIÈNCIA: Es descriu una quantitat de memòria que pot ser [inaudible]. 509 00:22:58,910 --> 00:22:59,660 >> DAVID Malan: Sí. 510 00:22:59,660 --> 00:23:03,710 Així que si dic sense signar, això és en realitat donant-li un bit de memòria addicional 511 00:23:03,710 --> 00:23:07,440 i sembla una mica tonto, però si tenen un bit de memòria addicional, que 512 00:23:07,440 --> 00:23:09,940 vol dir que té dues vegades més valors que pot representar, 513 00:23:09,940 --> 00:23:11,570 perquè pot ser un 0 o 1 gen. 514 00:23:11,570 --> 00:23:14,660 Així que per defecte, un int pot ser més o menys negatiu de 2 mil milions fins al final 515 00:23:14,660 --> 00:23:16,030 fins positiu 2000000000. 516 00:23:16,030 --> 00:23:18,540 Aquests són grans rangs, però és encara tipus de deixalla 517 00:23:18,540 --> 00:23:21,280 si només es preocupen per mides, que acaba de forma intuïtiva 518 00:23:21,280 --> 00:23:24,620 ha de ser no negatiu o positiu o 0, doncs bé, 519 00:23:24,620 --> 00:23:28,884 ¿Per què estàs perdent 2000000000 possibles valors per als nombres negatius 520 00:23:28,884 --> 00:23:30,300 si mai vas a usar-los? 521 00:23:30,300 --> 00:23:35,350 Així dient sense signar, ara la meva int pot estar entre 0 i aproximadament 4 mil milions. 522 00:23:35,350 --> 00:23:39,280 >> Així que aquí és simplement un int C per raons no entrarem en un moment com 523 00:23:39,280 --> 00:23:42,280 a això que és un int en lloc d'un char, però aquí és 524 00:23:42,280 --> 00:23:44,630 l'essència del que està passant endavant, i alguns de vostès 525 00:23:44,630 --> 00:23:48,340 podria estar fent servir, per exemple, el funció fgetc fins i tot en PSet de quatre 526 00:23:48,340 --> 00:23:51,580 oa partir de llavors, ja veurem que de nou en un problema conjunt de cinc, 527 00:23:51,580 --> 00:23:55,410 fgetc és agradable perquè com el seu nom classe de, classe de arcanamente suggereix, 528 00:23:55,410 --> 00:23:57,940 és una funció que aconsegueix un personatge i així, 529 00:23:57,940 --> 00:24:00,690 el que és fonamentalment diferent sobre el que estem fent en GetString 530 00:24:00,690 --> 00:24:03,110 és que no estem utilitzant scanf de la mateixa manera. 531 00:24:03,110 --> 00:24:07,550 Només estem arrossegant al llarg pas a pas més del que l'usuari ha premut, 532 00:24:07,550 --> 00:24:10,970 perquè sempre podem assignar un sol tar, de manera que sempre es pot de manera segura 533 00:24:10,970 --> 00:24:15,599 mirar 1 carbó a la vegada, i la màgia comença a succeir aquí. 534 00:24:15,599 --> 00:24:17,890 Vaig a desplaçar-se cap avall per el mitjà d'aquesta funció 535 00:24:17,890 --> 00:24:20,360 només per presentar breument aquesta funció. 536 00:24:20,360 --> 00:24:22,670 Igual que hi ha un funció malloc, hi ha 537 00:24:22,670 --> 00:24:27,740 una funció realloc on realloc li permet reassignar una part de la memòria 538 00:24:27,740 --> 00:24:29,570 i fer-lo més gran o més petit. 539 00:24:29,570 --> 00:24:33,060 En tant conte i amb una ona de la meva mà per avui, 540 00:24:33,060 --> 00:24:35,620 saber que el GetString està fent és que és una espècie 541 00:24:35,620 --> 00:24:39,720 de l'art de màgia de créixer o la reducció de la memòria intermèdia com l'usuari 542 00:24:39,720 --> 00:24:41,440 tipus en la seva cadena. 543 00:24:41,440 --> 00:24:43,962 >> Així que si l'usuari escriu una cadena curta, aquest codi 544 00:24:43,962 --> 00:24:45,920 només s'assigna suficient memòria per adaptar-se a la cadena. 545 00:24:45,920 --> 00:24:48,086 Si l'usuari manté la tipificació com ho vaig fer una vegada i una altra 546 00:24:48,086 --> 00:24:50,330 i una altra vegada, bé, si el memòria intermèdia d'un principi tan gran 547 00:24:50,330 --> 00:24:53,310 i el programa es dóna compte, a Espera un minut, estic fora de l'espai, 548 00:24:53,310 --> 00:24:55,410 que va a duplicar la mida de la memòria intermèdia 549 00:24:55,410 --> 00:24:59,110 i després doblegar la mida de la memòria intermèdia i el codi que fa la duplicació, 550 00:24:59,110 --> 00:25:03,170 si mirem des d'aquí, és només per aquesta intel·ligent d'una sola línia. 551 00:25:03,170 --> 00:25:06,830 És possible que no hagi vist aquesta sintaxi abans, però si dius estrelles és igual, 552 00:25:06,830 --> 00:25:10,470 aquest és el mateix que dient temps capacitat febrer. 553 00:25:10,470 --> 00:25:13,390 Per tant, només segueix duplicant la capacitat de la memòria intermèdia 554 00:25:13,390 --> 00:25:17,480 i després explicant realloc per donar sí que molt més memòria. 555 00:25:17,480 --> 00:25:19,720 >> Ara, com un a part, hi ha són altres funcions en aquí 556 00:25:19,720 --> 00:25:23,680 que no anem a mirar detall a part de mostrar a getInt, 557 00:25:23,680 --> 00:25:26,150 fem servir GetString en getInt. 558 00:25:26,150 --> 00:25:28,192 Comprovem que no és null, que, recordo, 559 00:25:28,192 --> 00:25:30,400 és el valor especial que significa alguna cosa va sortir malament. 560 00:25:30,400 --> 00:25:31,233 Estem fora de la memòria. 561 00:25:31,233 --> 00:25:32,310 Millor comprovar això. 562 00:25:32,310 --> 00:25:33,710 I tornem un valor sentinella. 563 00:25:33,710 --> 00:25:37,850 Però et remeto als comentaris pel que fa a per què i després fem servir aquest cosí de scanf 564 00:25:37,850 --> 00:25:42,100 diu sscanf i resulta que scanf sscanf, o cadena, 565 00:25:42,100 --> 00:25:45,310 li permet fer una ullada a la línia que l'usuari ha escrit i et deixa 566 00:25:45,310 --> 00:25:49,610 analitzar-essencial i el que estic fent aquí és que estic dient sscanf, 567 00:25:49,610 --> 00:25:54,440 analitzar el que l'usuari té escrit en i assegureu-vos de% i, 568 00:25:54,440 --> 00:25:59,250 no és un nombre sencer a ella, i no ho farem entrar a l'actualitat exactament per què també hi ha 569 00:25:59,250 --> 00:26:03,760 1% c aquí, però que en poques paraules permet ens permet detectar si l'usuari ha escrit 570 00:26:03,760 --> 00:26:06,050 en alguna cosa fals després del número. 571 00:26:06,050 --> 00:26:11,766 Així que la raó per la qual getInt i GetString dir-li a reintentar, reintentar, torni a intentar 572 00:26:11,766 --> 00:26:13,640 és perquè de tots que el codi que hem escrit, 573 00:26:13,640 --> 00:26:17,900 És una espècie de mirar a l'entrada de l'usuari en assegurar-se que és totalment numèric 574 00:26:17,900 --> 00:26:21,700 o es tracta d'un flotant real valor de punts o similar, 575 00:26:21,700 --> 00:26:24,233 depenent de quin valor funció que utilitzeu. 576 00:26:24,233 --> 00:26:25,060 >> Sort. 577 00:26:25,060 --> 00:26:25,710 D'ACORD. 578 00:26:25,710 --> 00:26:27,592 Això va ser un mos però el punt aquí és 579 00:26:27,592 --> 00:26:29,550 que la raó per la que vam tenir aquestes rodes de capacitació sobre 580 00:26:29,550 --> 00:26:32,880 és perquè en el nivell més baix, hi ha tantes coses que 581 00:26:32,880 --> 00:26:35,674 pot sortir malament que volíem per a manejar de forma preventiva 582 00:26:35,674 --> 00:26:38,090 aquestes coses certament en el primeres setmanes de la classe, 583 00:26:38,090 --> 00:26:42,230 però ara amb PSet 04:05 i PSet allà va a veure que és més fins 584 00:26:42,230 --> 00:26:45,570 vostè, però també ets més capaç de resoldre aquest tipus de problemes 585 00:26:45,570 --> 00:26:47,180 vostè mateix. 586 00:26:47,180 --> 00:26:51,770 Teniu alguna pregunta respecte GetString o getInt? 587 00:26:51,770 --> 00:26:52,630 Sí? 588 00:26:52,630 --> 00:26:55,130 >> AUDIÈNCIA: Per què el doble la capacitat de la memòria intermèdia 589 00:26:55,130 --> 00:26:57,630 en comptes de augmentar per la quantitat exacta? 590 00:26:57,630 --> 00:26:58,100 >> DAVID Malan: Bona pregunta. 591 00:26:58,100 --> 00:27:00,474 Per què hauríem de duplicar la capacitat de la memòria intermèdia en oposició 592 00:27:00,474 --> 00:27:02,800 només augmentar- per algun valor constant? 593 00:27:02,800 --> 00:27:03,900 Va ser una decisió de disseny. 594 00:27:03,900 --> 00:27:08,590 Ens vam decidir que ja que tendeix a ser una mica car pel que fa a temps de demanar 595 00:27:08,590 --> 00:27:10,440 el sistema operatiu per a la memòria, no ho vam fer 596 00:27:10,440 --> 00:27:13,210 vol acabar ficant una situació per a les cadenes grans 597 00:27:13,210 --> 00:27:14,960 que estàvem demanant el OS i una altra vegada 598 00:27:14,960 --> 00:27:17,500 i una altra vegada i una altra en successió ràpida per a la memòria. 599 00:27:17,500 --> 00:27:20,387 Així que vam decidir, una cosa arbitràriament però esperem raonablement, 600 00:27:20,387 --> 00:27:22,720 que, ja saps què, anem a tractar de tirar endavant de nosaltres mateixos 601 00:27:22,720 --> 00:27:25,520 i simplement seguir doblant de manera que minimitzem la quantitat de vegades 602 00:27:25,520 --> 00:27:29,010 hem de trucar a malloc o realloc, però una fallada total de 603 00:27:29,010 --> 00:27:31,820 trucar a falta de saber el que els usuaris podrien voler escriure. 604 00:27:31,820 --> 00:27:33,600 Les dues formes poden ser discutibles. 605 00:27:33,600 --> 00:27:35,430 Es podria dir que bona. 606 00:27:35,430 --> 00:27:39,240 >> Així que anem a fer una ullada a un parell d'altres efectes secundaris de la memòria, 607 00:27:39,240 --> 00:27:41,610 coses que poden sortir malament i eines que pot 608 00:27:41,610 --> 00:27:43,880 utilitzar per capturar aquest tipus d'errors. 609 00:27:43,880 --> 00:27:47,800 Resulta que tots vostès, tot i que check50 no li ha dit tant, 610 00:27:47,800 --> 00:27:50,050 s'han escrit amb errors codi des de la setmana un, 611 00:27:50,050 --> 00:27:53,630 fins i tot si totes les proves són check50 passava, i fins i tot si vostè i el seu TF 612 00:27:53,630 --> 00:27:56,010 són super segurs que el codi funciona com està previst. 613 00:27:56,010 --> 00:27:59,190 El codi ha estat buggy o viciat en què tots vostès, 614 00:27:59,190 --> 00:28:02,540 en l'ús de la biblioteca CS50, han estat pèrdues de memòria. 615 00:28:02,540 --> 00:28:06,040 Vostè ha estat demanant el sistema operatiu per la memòria en la majoria dels programes 616 00:28:06,040 --> 00:28:08,850 vostè ha escrit, però tens En realitat mai donada volta. 617 00:28:08,850 --> 00:28:12,110 Vostè ha cridat GetString i getInt i GetFloat, 618 00:28:12,110 --> 00:28:15,270 però amb GetString, tens Mai anomenada unGetString o Donar 619 00:28:15,270 --> 00:28:19,890 Posterior de la seqüència o similars, però hem vist GetString que fa assignar memòria 620 00:28:19,890 --> 00:28:22,810 per mitjà de malloc o aquest realloc funció, que és només 621 00:28:22,810 --> 00:28:25,670 molt similar en esperit, i, no obstant això, hem estat 622 00:28:25,670 --> 00:28:28,629 preguntar al sistema operatiu per la memòria i la memòria una i altra vegada 623 00:28:28,629 --> 00:28:29,670 però mai donar-li l'esquena. 624 00:28:29,670 --> 00:28:33,550 >> Ara, com un a part, resulta que quan un programa es tanca, tota la memòria 625 00:28:33,550 --> 00:28:34,870 s'allibera automàticament. 626 00:28:34,870 --> 00:28:36,150 Així que no ha estat un gran negoci. 627 00:28:36,150 --> 00:28:38,590 No va a trencar el IDE o coses més a poc a poc, 628 00:28:38,590 --> 00:28:40,670 Però quan els programes fan generalment perdre memòria 629 00:28:40,670 --> 00:28:42,170 i s'estan executant durant molt de temps. 630 00:28:42,170 --> 00:28:45,640 Si alguna vegada has vist la petita estúpida pilota de platja en Mac OS o el rellotge de sorra 631 00:28:45,640 --> 00:28:51,160 en Windows, on és una espècie de l'alentiment o el pensament o el pensament 632 00:28:51,160 --> 00:28:53,770 o realment comença per frenar un rastreig, 633 00:28:53,770 --> 00:28:56,960 molt possiblement podria ser el resultat d'una pèrdua de memòria. 634 00:28:56,960 --> 00:28:59,970 Els programadors que van escriure el programari que utilitzeu 635 00:28:59,970 --> 00:29:03,570 demanar al sistema operatiu per a la memòria cada pocs minuts, cada hora. 636 00:29:03,570 --> 00:29:05,570 Però si s'està executant la programari, fins i tot si és 637 00:29:05,570 --> 00:29:08,680 minimitzat en el seu ordinador per hores o dies i dies, 638 00:29:08,680 --> 00:29:11,980 es pot preguntar per més i més la memòria i la realitat mai usar-lo 639 00:29:11,980 --> 00:29:15,180 i pel que el seu codi podria ser, o programes podrien tenir fuites de memòria, 640 00:29:15,180 --> 00:29:18,350 i si vostè comença a perdre memòria, hi ha menys memòria per a altres programes, 641 00:29:18,350 --> 00:29:21,220 i l'efecte és frenar tot. 642 00:29:21,220 --> 00:29:23,600 >> Ara, això és, de lluny, un els programes més atroços 643 00:29:23,600 --> 00:29:26,350 vostè tindrà l'oportunitat per funcionar en la mesura CS50 644 00:29:26,350 --> 00:29:31,650 com la seva sortida és encara més esotèric que so metàl·lic d'o fer d'o qualsevol de les comandes 645 00:29:31,650 --> 00:29:35,930 programes de línia ens hem quedat abans, però afortunadament, incrustat en la seva sortida 646 00:29:35,930 --> 00:29:39,810 és alguns consells molt útils que serà útil tant per PSet de quatre 647 00:29:39,810 --> 00:29:41,510 o segurament PConfigure 05:00. 648 00:29:41,510 --> 00:29:44,250 Així valgrind és una eina que es pot utilitzar per buscar 649 00:29:44,250 --> 00:29:46,930 que no hi hagi fuites de memòria en el seu programa. 650 00:29:46,930 --> 00:29:48,570 És relativament fàcil d'executar. 651 00:29:48,570 --> 00:29:51,420 Executa valgrind i després, fins i tot encara que és una mica prolix, 652 00:29:51,420 --> 00:29:54,440 tauler comprovació de fuites tauler iguals per complet, i després puntejar 653 00:29:54,440 --> 00:29:56,320 tala i el nom del seu programa. 654 00:29:56,320 --> 00:30:00,010 Així valgrind llavors executar el programa i al final del seu programa 655 00:30:00,010 --> 00:30:02,240 corrent abans que tanca i li dóna un altre avís, 656 00:30:02,240 --> 00:30:04,980 que va a analitzar la seva programa mentre s'ha estat corrent 657 00:30:04,980 --> 00:30:07,740 i dius que has de tenir fuites qualsevol memòria i millor encara, 658 00:30:07,740 --> 00:30:10,610 vas tocar memòria que no pertanyen a vostè? 659 00:30:10,610 --> 00:30:13,700 No pot agafar tot, però és bastant bo en la captura de la majoria de les coses. 660 00:30:13,700 --> 00:30:19,700 >> Així que aquí està un exemple de la meva haver corregut aquest programa, que té termini valgrind, 661 00:30:19,700 --> 00:30:21,470 en un programa anomenat memòria, i em vaig 662 00:30:21,470 --> 00:30:24,730 per ressaltar les línies que són en última instància, d'interès per a nosaltres. 663 00:30:24,730 --> 00:30:27,690 Així que fins i tot hi més distraccions que he eliminat de la diapositiva. 664 00:30:27,690 --> 00:30:30,930 Però anem a veure el que aquest programa és capaç de dir-nos. 665 00:30:30,930 --> 00:30:34,800 És capaç de dir-nos coses com escriptura no vàlida de mida 4. 666 00:30:34,800 --> 00:30:38,020 En altres paraules, si es toca la memòria, específicament 4 bytes de memòria 667 00:30:38,020 --> 00:30:40,350 que vostè no ha de tenir, valgrind li pot dir això. 668 00:30:40,350 --> 00:30:41,660 Escriptura no vàlida de mida 4. 669 00:30:41,660 --> 00:30:43,640 Vas tocar quatre octets que no hauria de tenir. 670 00:30:43,640 --> 00:30:44,840 On es fa això? 671 00:30:44,840 --> 00:30:45,900 Aquesta és la bellesa. 672 00:30:45,900 --> 00:30:50,000 La línia de punts c Memòria 21 és on es fotut i és per això que és útil. 673 00:30:50,000 --> 00:30:53,410 Igual que l'BGF, pot ajudar assenyalar en l'error real. 674 00:30:53,410 --> 00:30:57,170 >> Ara, aquest és una mica més detallat, si no confús. 675 00:30:57,170 --> 00:31:01,307 40 Bytes 1 blocs són definitivament perdut en el registre de la pèrdua gener 1. 676 00:31:01,307 --> 00:31:02,140 Què vol dir això? 677 00:31:02,140 --> 00:31:05,920 Bé, només dir que vostè va demanar 40 bytes i mai es va donar volta. 678 00:31:05,920 --> 00:31:08,930 Vostè va cridar malloc o cridar GetString i el sistema operatiu 679 00:31:08,930 --> 00:31:12,450 que 40 bytes, però mai es va donar alliberat o alliberada aquesta memòria, 680 00:31:12,450 --> 00:31:15,400 i per ser justos, mai hem mostrem com tornes la memòria. 681 00:31:15,400 --> 00:31:17,910 Resulta que hi ha un súper funció simple trucada gratuïta. 682 00:31:17,910 --> 00:31:21,170 Pren un argument, la cosa desitja alliberar o donar volta, 683 00:31:21,170 --> 00:31:23,430 però 40 bytes, pel que es veu, en aquest programa 684 00:31:23,430 --> 00:31:27,300 s'han perdut en la línia 20 de la memòria dot c. 685 00:31:27,300 --> 00:31:28,650 >> Així que anem a veure aquest programa. 686 00:31:28,650 --> 00:31:31,020 És super inútil. 687 00:31:31,020 --> 00:31:33,980 Només demostra aquest error en particular. 688 00:31:33,980 --> 00:31:34,920 Així que anem a fer una ullada. 689 00:31:34,920 --> 00:31:39,920 Heus aquí els principals i principals, avís, trucades una funció anomenada torna f tant. 690 00:31:39,920 --> 00:31:41,550 Així que no és tan interessant. 691 00:31:41,550 --> 00:31:42,664 Què fer f? 692 00:31:42,664 --> 00:31:44,330 Noti que no es va molestar amb un prototip. 693 00:31:44,330 --> 00:31:46,520 Volia mantenir el codi el mínim possible. 694 00:31:46,520 --> 00:31:49,530 Així que vaig posar f anterior principal i això està bé, sens dubte, 695 00:31:49,530 --> 00:31:51,500 per a programes curts com aquest. 696 00:31:51,500 --> 00:31:56,910 Així que f no torna res i fa No prengui res, però que sí que fa això. 697 00:31:56,910 --> 00:31:59,620 Declara, igual que en l'exemple de Binky, 698 00:31:59,620 --> 00:32:02,682 un punter anomenat X que va per emmagatzemar la direcció d'un int. 699 00:32:02,682 --> 00:32:03,890 Així que aquest és el costat esquerre. 700 00:32:03,890 --> 00:32:07,230 En Anglès, quin és la costat dret fent? 701 00:32:07,230 --> 00:32:09,770 Qualsevol persona? 702 00:32:09,770 --> 00:32:13,665 Què és aquest fent per nosaltres? 703 00:32:13,665 --> 00:32:14,651 Sí? 704 00:32:14,651 --> 00:32:16,623 >> AUDIÈNCIA: [inaudible] vegades la mida d'un int 705 00:32:16,623 --> 00:32:19,175 que és 10 vegades més gran que [inaudible] 706 00:32:19,175 --> 00:32:20,800 DAVID Malan: Bé i permetin-me resumir. 707 00:32:20,800 --> 00:32:25,480 Així assignar prou espai per a 10 enters o 10, quin és la mida d'un int, 708 00:32:25,480 --> 00:32:29,340 és quatre bytes, de manera que 10 vegades 4 és 40, de manera que a mà dreta que tinc 709 00:32:29,340 --> 00:32:33,930 ressaltat és donar-me 40 bytes i emmagatzemar la direcció del primer byte 710 00:32:33,930 --> 00:32:34,940 en x. 711 00:32:34,940 --> 00:32:38,380 I ara, finalment, i aquí és on aquest programa està lliure d'errors, el que és 712 00:32:38,380 --> 00:32:41,540 malament amb la línia 21 basa en què la lògica? 713 00:32:41,540 --> 00:32:45,197 714 00:32:45,197 --> 00:32:46,280 Què hi ha de dolent en la línia 21? 715 00:32:46,280 --> 00:32:46,780 Sí? 716 00:32:46,780 --> 00:32:49,550 AUDIÈNCIA: No pot índex en x [inaudible]. 717 00:32:49,550 --> 00:32:50,300 DAVID Malan: Sí. 718 00:32:50,300 --> 00:32:52,270 Que no hauria índex en x l'estil. 719 00:32:52,270 --> 00:32:53,850 Així sintàcticament, això està bé. 720 00:32:53,850 --> 00:32:56,990 El millor és, igual que pot tractar el nom d'una matriu 721 00:32:56,990 --> 00:33:01,080 com si fos un punter, de manera similar pot tractar a un punter com si fos 722 00:33:01,080 --> 00:33:06,425 una matriu, i així puc sintàcticament dir x suport d'alguna cosa, x suport de i, 723 00:33:06,425 --> 00:33:07,800 però el 10 és problemàtica. 724 00:33:07,800 --> 00:33:09,096 Per què? 725 00:33:09,096 --> 00:33:10,910 >> AUDIÈNCIA: Com que no hi ha dins. 726 00:33:10,910 --> 00:33:12,390 >> DAVID Malan: No és dins d'aquesta part de la memòria. 727 00:33:12,390 --> 00:33:15,306 Què és el valor més gran que ha estar posant en aquests claudàtors? 728 00:33:15,306 --> 00:33:16,870 9, del 0 al 9. 729 00:33:16,870 --> 00:33:18,160 A causa de zero d'indexació. 730 00:33:18,160 --> 00:33:20,190 Així que de 0 a 9 estaria bé. 731 00:33:20,190 --> 00:33:23,960 Suport de 10 no és bo i però, recordar, però, cada vegada que 732 00:33:23,960 --> 00:33:27,017 Em sembla que tractar de fer CS50 IDE accident escrivint en valors falsos, 733 00:33:27,017 --> 00:33:29,100 no sempre coopera, i, de fet, sovint 734 00:33:29,100 --> 00:33:31,460 tenir sort només perquè el sistema operatiu no 735 00:33:31,460 --> 00:33:35,467 adonar que molt lleugerament passar algun tros de la memòria, 736 00:33:35,467 --> 00:33:38,300 perquè vostè es va quedar dins tècnicament seu segment, però més sobre això 737 00:33:38,300 --> 00:33:40,940 en una classe de sistemes operatius, i així alguna cosa com això 738 00:33:40,940 --> 00:33:43,000 podria molt fàcilment passar desapercebuda. 739 00:33:43,000 --> 00:33:48,120 El seu programa mai va a estavellar consistentment però potser en una estona. 740 00:33:48,120 --> 00:33:50,610 >> I així anem a tractar valgrind en això, i aquí està 741 00:33:50,610 --> 00:33:52,870 on arribarem aclaparat per la sortida momentàniament. 742 00:33:52,870 --> 00:34:00,810 Així que la memòria de verificació de fuites valgrind és igual a la memòria barra de punts completa. 743 00:34:00,810 --> 00:34:03,040 I vet aquí per què t'ho prometo això podria aclaparar. 744 00:34:03,040 --> 00:34:05,700 Això és el que valgrind, això és el un programador, alguns anys- 745 00:34:05,700 --> 00:34:08,469 va decidir que seria una bona idea per a la sortida a semblar. 746 00:34:08,469 --> 00:34:09,750 Així que farem sentit d'això. 747 00:34:09,750 --> 00:34:13,120 Així que tot el camí a l'esquerra costat per cap bona raó 748 00:34:13,120 --> 00:34:16,620 és l'ID de procés del programa acabem de córrer, l'identificador únic 749 00:34:16,620 --> 00:34:18,030 per al programa que acabem d'vam córrer. 750 00:34:18,030 --> 00:34:19,738 Hem suprimit que des la diapositiva, però hi ha 751 00:34:19,738 --> 00:34:22,190 hi ha alguna informació útil aquí. 752 00:34:22,190 --> 00:34:24,684 >> Anem a desplaçar-se fins la part superior. 753 00:34:24,684 --> 00:34:25,600 Aquí és on vam començar. 754 00:34:25,600 --> 00:34:27,040 Així que no és tot el que molt de sortida. 755 00:34:27,040 --> 00:34:30,429 Aquí cal escriure invàlida de mida 4 a la línia 21. 756 00:34:30,429 --> 00:34:31,760 Bé, quin va ser la línia 21? 757 00:34:31,760 --> 00:34:34,500 Línia 21 era exactament això i que té sentit 758 00:34:34,500 --> 00:34:37,290 que estic en forma vàlida escriure 4 bytes perquè sóc 759 00:34:37,290 --> 00:34:40,389 tractant de posar aquest sencer, que podria ser qualsevol cosa, 760 00:34:40,389 --> 00:34:42,370 que només passa a ser zero, però estic intentant 761 00:34:42,370 --> 00:34:44,940 per posar-lo en un lloc que no pertany a mi. 762 00:34:44,940 --> 00:34:50,900 D'altra banda, aquí baix, 40 bytes en un blocs estan definitivament perduts en l'expedient 1. 763 00:34:50,900 --> 00:34:56,500 Això és perquè quan dic malloc aquí, jo en realitat mai alliberar la memòria. 764 00:34:56,500 --> 00:34:58,140 >> Llavors, com podem solucionar aquest problema? 765 00:34:58,140 --> 00:35:02,970 Déjame anar per davant i ser una mica més segur i fer 9 allà i em va deixar aquí gratis x. 766 00:35:02,970 --> 00:35:04,820 Aquesta és la nova funció per avui. 767 00:35:04,820 --> 00:35:11,520 Si ara em torneu a executar fer slash dot memòria, anem a córrer valgrind en ell de nou, 768 00:35:11,520 --> 00:35:14,990 maximitzar la finestra i premeu Enter. 769 00:35:14,990 --> 00:35:16,900 Ara, és bo. 770 00:35:16,900 --> 00:35:19,590 Enterren les bones notícies en tot això de sortida. 771 00:35:19,590 --> 00:35:20,810 Tots els blocs de munt eren lliures. 772 00:35:20,810 --> 00:35:23,604 Tornarem al que el munt és, però no hi ha fuites són possibles. 773 00:35:23,604 --> 00:35:25,520 Així que això és només una altra eina per a la seva caixa d'eines 774 00:35:25,520 --> 00:35:30,220 amb el qual es pot començar a troba ara els errors així. 775 00:35:30,220 --> 00:35:34,532 >> Però anem a veure què més pot sortir malament aquí. 776 00:35:34,532 --> 00:35:38,890 De transició Anem ara a en realitat la solució d'un problema. 777 00:35:38,890 --> 00:35:42,440 Com acotació al marge, si això va a alleujar una mica de confusió o de tensió, 778 00:35:42,440 --> 00:35:43,430 això és ara divertit. 779 00:35:43,430 --> 00:35:46,400 780 00:35:46,400 --> 00:35:46,900 Sí. 781 00:35:46,900 --> 00:35:49,040 Això és bastant bo. 782 00:35:49,040 --> 00:35:50,890 A causa que els punters són adreces i direccions 783 00:35:50,890 --> 00:35:53,098 generalment són per convenció escrit amb hexadecimal. 784 00:35:53,098 --> 00:35:54,650 Ha, ha, això és graciós ara. 785 00:35:54,650 --> 00:35:58,390 De totes maneres, així que anem ara realment resoldre un problema. 786 00:35:58,390 --> 00:36:00,840 Aquest ha estat fantàstic, súper baix nivell fins al moment, 787 00:36:00,840 --> 00:36:03,950 i que en realitat podem fer útil coses amb aquests detalls de baix nivell. 788 00:36:03,950 --> 00:36:06,710 >> Així que hem introduït unes setmanes Fa la noció d'una matriu. 789 00:36:06,710 --> 00:36:09,177 Un arsenal era agradable, perquè és difícil de netejar el nostre codi 790 00:36:09,177 --> 00:36:11,760 perquè si volíem escriure una programa amb múltiples estudiants 791 00:36:11,760 --> 00:36:15,270 o múltiples noms i cases i residències i col·legis i tot això, 792 00:36:15,270 --> 00:36:19,430 podríem emmagatzemar tot més netament dins d'una matriu. 793 00:36:19,430 --> 00:36:23,039 Però proposar un desavantatge d'una matriu fins al moment. 794 00:36:23,039 --> 00:36:26,080 Fins i tot si no has patit tu mateix en un programa, simplement per instint, 795 00:36:26,080 --> 00:36:30,870 el que és una mala cosa sobre una matriu, potser? 796 00:36:30,870 --> 00:36:32,337 Sento alguns murmuris. 797 00:36:32,337 --> 00:36:34,170 AUDIÈNCIA: És difícil per canviar la mida. 798 00:36:34,170 --> 00:36:36,128 DAVID Malan: És difícil per canviar la mida. 799 00:36:36,128 --> 00:36:38,660 No es pot canviar la mida d'una matriu, de fet, per se 800 00:36:38,660 --> 00:36:43,040 en C. Podeu assignar una altra matriu, moure tot, des de l'anterior 801 00:36:43,040 --> 00:36:45,380 en el nou, i ara tenir una mica més d'espai, 802 00:36:45,380 --> 00:36:47,469 però no és com un llenguatge com Java o Python 803 00:36:47,469 --> 00:36:49,760 o qualsevol nombre d'una altra llengües amb què alguns de vostès 804 00:36:49,760 --> 00:36:52,070 podria ser familiar on pot simplement seguir afegint coses 805 00:36:52,070 --> 00:36:53,930 fins a la sacietat fins al final d'una matriu. 806 00:36:53,930 --> 00:36:57,880 Quan vostè té una sèrie de mida 6, que és la seva grandària, 807 00:36:57,880 --> 00:37:01,970 i tan semblant a la idea anterior que té un buffer d'una certa mida, 808 00:37:01,970 --> 00:37:05,940 has d'endevinar fora de la porta quina mida és el que vols que sigui? 809 00:37:05,940 --> 00:37:07,880 Si endevina massa gran, perds espai. 810 00:37:07,880 --> 00:37:10,950 Si endevina massa petit, no pot emmagatzemar dades que, almenys 811 00:37:10,950 --> 00:37:12,940 i sense molta feina. 812 00:37:12,940 --> 00:37:18,180 >> Així que avui, gràcies als punters, podem començar unint la nostra pròpia duana 813 00:37:18,180 --> 00:37:20,989 estructures de dades, i en De fet, aquí és una cosa 814 00:37:20,989 --> 00:37:23,030 que es veu una mica més críptica a primera vista, 815 00:37:23,030 --> 00:37:26,440 però això és el que anomenarem 1 lligat llista, i el seu nom tipus d'resumeix 816 00:37:26,440 --> 00:37:26,940 ella. 817 00:37:26,940 --> 00:37:29,550 És una llista de nombres, o en aquest cas, una llista de nombres, 818 00:37:29,550 --> 00:37:33,480 però podria ser una llista de qualsevol cosa, però està vinculat entre si per mitjà de fletxes, 819 00:37:33,480 --> 00:37:36,380 i acaba de prendre una conjectura amb quina tècnica 820 00:37:36,380 --> 00:37:38,310 serem capaços de per cosir junts, 821 00:37:38,310 --> 00:37:42,540 una mena de crispetes de blat de moro amb un fil, una de vinculada llistes rectangles aquí? 822 00:37:42,540 --> 00:37:43,936 Els seus números? 823 00:37:43,936 --> 00:37:45,560 Quina és la característica del llenguatge subjacent? 824 00:37:45,560 --> 00:37:46,350 >> AUDIÈNCIA: Un punter. 825 00:37:46,350 --> 00:37:47,308 >> DAVID Malan: Un punter. 826 00:37:47,308 --> 00:37:51,700 Així que cadascuna d'aquestes fletxes representa aquí un punter o simplement una direcció. 827 00:37:51,700 --> 00:37:54,590 En altres paraules, si vull per emmagatzemar una llista de nombres, 828 00:37:54,590 --> 00:37:59,040 No puc guardar si vull la capacitat de créixer i encongir 829 00:37:59,040 --> 00:38:00,990 la meva estructura de dades en una matriu. 830 00:38:00,990 --> 00:38:03,000 Així que he de tenir una mica de més sofisticació, 831 00:38:03,000 --> 00:38:05,720 de notar que aquesta foto tipus de suggereix 832 00:38:05,720 --> 00:38:08,650 que si vostè acaba d'aconseguir petits fils connectar tot junt, 833 00:38:08,650 --> 00:38:13,100 probablement no és tan difícil de fer espai entre dos dels rectangles 834 00:38:13,100 --> 00:38:16,750 o dos d'aquests nodes, ja que començarem cridant, posar en un nou node, 835 00:38:16,750 --> 00:38:19,547 i després amb una mica de fil nou, just desfer-se dels tres nodes junts, 836 00:38:19,547 --> 00:38:22,880 el primer, l'últim, i el que acaba d'inserir en el medi. 837 00:38:22,880 --> 00:38:26,000 >> I de fet una llista enllaçada, a diferència d'una matriu, és dinàmic. 838 00:38:26,000 --> 00:38:27,840 Pot créixer i pot s'encongeixen i no ho fa 839 00:38:27,840 --> 00:38:32,434 ha de saber o tenir cura per endavant com quantitat de dades que seran l'emmagatzematge, 840 00:38:32,434 --> 00:38:35,600 però resulta que hem de ser una mica cura sobre com implementar això. 841 00:38:35,600 --> 00:38:39,070 Així que primer anem a considerar com implementem un d'aquests petits rectangles. 842 00:38:39,070 --> 00:38:40,690 És fàcil d'implementar un int. 843 00:38:40,690 --> 00:38:44,000 Vostè acaba de dir int n i després vostè aconsegueix 4 bytes per a un int, 844 00:38:44,000 --> 00:38:49,089 però com puc obtenir un int, dir-n, i després un punter, anem a cridar següent. 845 00:38:49,089 --> 00:38:50,880 Podríem cridar a aquests coses el que vulguem 846 00:38:50,880 --> 00:38:53,590 però necessito una estructura de dades personalitzat. 847 00:38:53,590 --> 00:38:54,257 Sí? 848 00:38:54,257 --> 00:38:57,020 >> AUDIÈNCIA: Ampersand [inaudible]. 849 00:38:57,020 --> 00:39:00,940 >> DAVID Malan: Així signe que utilitzarem per obtenir l'adreça d'un node potencialment. 850 00:39:00,940 --> 00:39:02,740 Però necessitem un altre funció de C per tal 851 00:39:02,740 --> 00:39:06,700 que em donés la possibilitat de crear aquest rectangle costum, aquest costum 852 00:39:06,700 --> 00:39:08,919 variable si es vol, en la memòria. 853 00:39:08,919 --> 00:39:09,710 AUDIÈNCIA: Una estructura. 854 00:39:09,710 --> 00:39:10,626 DAVID Malan: Una estructura. 855 00:39:10,626 --> 00:39:14,310 Recordem que la setmana passada, vam introduir estructura, aquesta paraula clau relativament simple 856 00:39:14,310 --> 00:39:16,254 que ens permet fer coses com aquesta. 857 00:39:16,254 --> 00:39:18,420 C no va venir amb una dada estructura anomenada estudiantil. 858 00:39:18,420 --> 00:39:22,190 Ve amb int i float i carbó i tals, però no ve amb els estudiants, 859 00:39:22,190 --> 00:39:26,750 però podem crear un tipus de dades dels estudiants, una estructura d'estudiant, amb aquesta sintaxi 860 00:39:26,750 --> 00:39:27,250 aquí. 861 00:39:27,250 --> 00:39:28,350 I veuràs això una i altra vegada. 862 00:39:28,350 --> 00:39:30,426 Així que no et preocupis per memoritzant les paraules clau, 863 00:39:30,426 --> 00:39:33,300 però la paraula clau que és important és només el fet que hem dit struct 864 00:39:33,300 --> 00:39:37,590 i després en diem estudiant ia l'interior l'estudiant era un nom i una casa 865 00:39:37,590 --> 00:39:39,390 o una residència d'estudiants o similars. 866 00:39:39,390 --> 00:39:41,980 >> I el que ara avui, proposarem això. 867 00:39:41,980 --> 00:39:45,240 He afegit algunes paraules, però si vull per implementar aquest rectangle que és 868 00:39:45,240 --> 00:39:48,440 té tant un int i un punter, saps què, jo sóc 869 00:39:48,440 --> 00:39:51,540 va a declarar una estructura anomenada node. 870 00:39:51,540 --> 00:39:55,630 Sóc també, dins d'ella, dirà que un node, aquest rectangle, té un int 871 00:39:55,630 --> 00:39:59,730 i ho anem a cridar ni té un següent punter. 872 00:39:59,730 --> 00:40:02,540 I això és una mica prolix, però si es pensa en això, 873 00:40:02,540 --> 00:40:07,300 les fletxes que es trobaven a la imatge Fa un moment són de quin tipus de dades? 874 00:40:07,300 --> 00:40:12,330 On cada un d'aquests fletxes està apuntant a quin tipus d'estructura de dades? 875 00:40:12,330 --> 00:40:14,332 No és simplement apuntant a un int per se. 876 00:40:14,332 --> 00:40:16,165 S'apunta a la El rectangular sencera 877 00:40:16,165 --> 00:40:18,720 i aquesta cosa rectangular, hem dit, es diu un node. 878 00:40:18,720 --> 00:40:21,720 I així quin tipus d'haver de recursivament definir estatals 879 00:40:21,720 --> 00:40:26,270 que un node, direm, contindrà un int anomenada n 880 00:40:26,270 --> 00:40:31,070 i un punter anomenat següent i el tipus d'estructura de dades a la qual 881 00:40:31,070 --> 00:40:35,770 que els punts de punter és aparentment serà node d'estructura. 882 00:40:35,770 --> 00:40:41,550 >> Així que això és molest detallat i acaba de ser pedant, 883 00:40:41,550 --> 00:40:44,100 la raó per la qual no podem només dir això, que francament 884 00:40:44,100 --> 00:40:46,860 sembla molt més fàcil de llegir, s'ha de recordar que C llegir 885 00:40:46,860 --> 00:40:48,710 coses de dalt a baix, d'esquerra a dreta. 886 00:40:48,710 --> 00:40:54,120 No és fins que tinguem el punt i coma que en realitat hi ha el node de paraules clau. 887 00:40:54,120 --> 00:40:57,980 Així que si volem tenir aquest tipus de referència cíclica dins de les dades 888 00:40:57,980 --> 00:41:02,120 estructura, hem de fer això, on diem node d'estructura en la part superior, el que 889 00:41:02,120 --> 00:41:06,770 ens dóna una manera de descriure això ja cosa, llavors dins diem node d'estructura, 890 00:41:06,770 --> 00:41:09,560 i després en l'última línia diem, tot dret, C, per cert, 891 00:41:09,560 --> 00:41:12,060 simplement truqui a tota aquesta maleïda cosa que un node i detenir 892 00:41:12,060 --> 00:41:14,360 usant la paraula clau struct per complet. 893 00:41:14,360 --> 00:41:18,030 Així que això és només una espècie d'una sintàctica truc que en última instància ens permet crear 894 00:41:18,030 --> 00:41:21,370 cosa que es veu exactament com aquesta. 895 00:41:21,370 --> 00:41:25,010 >> Així que si suposem ara que podem implementar aquesta cosa en C, 896 00:41:25,010 --> 00:41:28,040 com fer que en realitat començar a travessar això? 897 00:41:28,040 --> 00:41:32,360 Bé, de fet, tot el que hem de fer és repetir d'esquerra a dreta i just 898 00:41:32,360 --> 00:41:35,960 tipus d'inserir nodes o eliminar nodes o buscar coses on vulguem, 899 00:41:35,960 --> 00:41:39,560 però per fer això, seguirem endavant i fer les coses una mica més real perquè aquest 900 00:41:39,560 --> 00:41:42,560 ha estat molt baix nivell fins al moment. 901 00:41:42,560 --> 00:41:45,700 A algú li agrada, literalment, ser el primer? 902 00:41:45,700 --> 00:41:46,200 D'ACORD. 903 00:41:46,200 --> 00:41:47,092 Anem cap amunt. 904 00:41:47,092 --> 00:41:47,800 Com et dius? 905 00:41:47,800 --> 00:41:48,499 >> DAVID: David. 906 00:41:48,499 --> 00:41:49,290 DAVID Malan: David. 907 00:41:49,290 --> 00:41:49,998 Encantat de conéixer-te. 908 00:41:49,998 --> 00:41:50,960 Jo també. 909 00:41:50,960 --> 00:41:52,450 Tot bé. 910 00:41:52,450 --> 00:41:53,990 I necessitem un número 9. 911 00:41:53,990 --> 00:41:55,240 No és tan bona com la primera, potser. 912 00:41:55,240 --> 00:41:56,430 OK, número 9. 913 00:41:56,430 --> 00:41:59,667 Un nombre 17, per favor. 914 00:41:59,667 --> 00:42:01,000 Permetin-me tornar una mica més lluny. 915 00:42:01,000 --> 00:42:03,980 Número 22, per favor, i ¿Què hi ha de més enrere 916 00:42:03,980 --> 00:42:06,344 si puc veure cap mà amb tota la llum o no. 917 00:42:06,344 --> 00:42:08,010 Algú es va oferir allà mateix. 918 00:42:08,010 --> 00:42:08,968 Vols venir? 919 00:42:08,968 --> 00:42:10,450 El seu avantbraç va per la força cap amunt. 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 s'ensorra. 923 00:42:15,120 --> 00:42:18,450 A algú més que vulgui forcefully-- Anem cap amunt. 924 00:42:18,450 --> 00:42:21,030 Un voluntari real. 925 00:42:21,030 --> 00:42:23,330 >> Així que molt ràpidament, si vostès podrien arreglar 926 00:42:23,330 --> 00:42:26,550 Igual que vostès mateixos els nodes a la pantalla. 927 00:42:26,550 --> 00:42:27,510 Gràcies. 928 00:42:27,510 --> 00:42:29,234 I podràs 26. 929 00:42:29,234 --> 00:42:30,650 Totes les presentacions adequades i ràpides. 930 00:42:30,650 --> 00:42:32,139 Així que sóc David i tu també? 931 00:42:32,139 --> 00:42:32,680 DAVID: David. 932 00:42:32,680 --> 00:42:33,721 DAVID Malan: ¿I vostè és? 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: Raphael. 937 00:42:36,475 --> 00:42:37,100 TAYLOR: Taylor. 938 00:42:37,100 --> 00:42:37,466 DAVID Malan: Taylor. 939 00:42:37,466 --> 00:42:37,590 Excel·lent. 940 00:42:37,590 --> 00:42:39,810 Així que aquests són els nostres voluntaris per avui i seguir endavant 941 00:42:39,810 --> 00:42:43,090 i canviar una mica d'aquesta manera, i només seguir endavant i mantenir 942 00:42:43,090 --> 00:42:47,024 la celebració dels seus números com vostè o el seu primer signe i l'ús de la mà esquerra, 943 00:42:47,024 --> 00:42:48,940 seguir endavant i simplement aplicar aquestes fletxes, simplement 944 00:42:48,940 --> 00:42:51,360 de manera que la mà esquerra és, literalment, apuntant al que sigui, ha d'introduir 945 00:42:51,360 --> 00:42:54,610 a, i donar-li una mica d'espai perquè podem veure visualment els braços realitat 946 00:42:54,610 --> 00:42:58,120 apuntant, i només pot apuntar tipus de a la planta està molt bé. 947 00:42:58,120 --> 00:43:03,040 >> Així que aquí tenim una llista enllaçada d'un, dos, tres, quatre, cinc nodes inicialment, 948 00:43:03,040 --> 00:43:05,860 i noti que tenim aquest especial punter al principi qui és 949 00:43:05,860 --> 00:43:09,770 clau perquè hem de seguir la pista de la llista de longitud sencera d'alguna manera. 950 00:43:09,770 --> 00:43:13,590 Aquests nois, tot i que un es queda a dreta, esquena amb esquena a la memòria, 951 00:43:13,590 --> 00:43:15,950 que en realitat pot estar en qualsevol lloc en la memòria de l'ordinador. 952 00:43:15,950 --> 00:43:18,240 Així que aquests nois podrien ser de peu en qualsevol lloc a l'escenari 953 00:43:18,240 --> 00:43:20,960 i això està bé, sempre que estiguin realment apuntant l'un a l'altre, 954 00:43:20,960 --> 00:43:22,770 però per mantenir les coses net i senzill, anem a 955 00:43:22,770 --> 00:43:25,728 simplement dibuixar d'esquerra a dreta com això, però podria haver bretxes massives 956 00:43:25,728 --> 00:43:26,790 entre aquests nodes. 957 00:43:26,790 --> 00:43:30,710 >> Ara, si vull inserir en realitat alguns nou valor, seguirem endavant i fer això. 958 00:43:30,710 --> 00:43:33,720 Tenim una oportunitat ara triar un altre node. 959 00:43:33,720 --> 00:43:39,820 Dir que començarem amb mallocing 55. 960 00:43:39,820 --> 00:43:41,320 Algú faria res ser malloc? 961 00:43:41,320 --> 00:43:42,280 OK, anem cap amunt. 962 00:43:42,280 --> 00:43:42,992 Com et dius? 963 00:43:42,992 --> 00:43:43,700 ARC DE SANT MARTÍ: Arc de Sant Martí. 964 00:43:43,700 --> 00:43:44,050 DAVID Malan: Arc de Sant Martí? 965 00:43:44,050 --> 00:43:44,810 Tot bé. 966 00:43:44,810 --> 00:43:46,600 Rainbow malloc. 967 00:43:46,600 --> 00:43:47,450 Anem cap amunt. 968 00:43:47,450 --> 00:43:51,610 Així que ara hem de preguntar-nos a nosaltres mateixos algorítmicament on podem posar 55. 969 00:43:51,610 --> 00:43:53,610 Així que tots sabem, Òbviament, en la qual, probablement, 970 00:43:53,610 --> 00:43:55,401 pertany, si estem tractant per mantenir aquest ordenades 971 00:43:55,401 --> 00:43:58,299 i si vostès podrien prendre 1 un pas enrere perquè no caiguin 972 00:43:58,299 --> 00:43:59,590 l'escenari, que seria genial. 973 00:43:59,590 --> 00:44:01,420 Així que en realitat, arc de Sant Martí, començar de nou aquí amb mi, 974 00:44:01,420 --> 00:44:04,200 perquè com l'equip ara pot només veuen una variable alhora. 975 00:44:04,200 --> 00:44:05,190 Així que si aquest és el primer node. 976 00:44:05,190 --> 00:44:07,160 Recordeu que no és un node, ell és només un indicador, 977 00:44:07,160 --> 00:44:10,270 i és per això que ha dibuixat per ser només la mida d'un punter, no 978 00:44:10,270 --> 00:44:11,780 un d'aquests rectangles complets. 979 00:44:11,780 --> 00:44:16,650 Així que anem a comprovar en cada iteració és 55 menys de 9? 980 00:44:16,650 --> 00:44:17,150 No. 981 00:44:17,150 --> 00:44:19,060 És 55 de menys de 17? 982 00:44:19,060 --> 00:44:19,720 No. 983 00:44:19,720 --> 00:44:20,800 Menys de 22? 984 00:44:20,800 --> 00:44:22,020 Menys de 26? 985 00:44:22,020 --> 00:44:23,390 Menys de 34? 986 00:44:23,390 --> 00:44:25,890 I així és, òbviament, Rainbow pertany al final. 987 00:44:25,890 --> 00:44:27,270 Així que per ser clars, i què era el seu nom, Taylor? 988 00:44:27,270 --> 00:44:27,895 >> TAYLOR: Taylor. 989 00:44:27,895 --> 00:44:32,510 DAVID Malan: Així que entre Taylor mà esquerra i les mans de l'arc de Sant Martí aquí, 990 00:44:32,510 --> 00:44:38,324 la mà ha d'apuntar al que en Per inserir 55 en aquesta llista? 991 00:44:38,324 --> 00:44:39,240 Què necessitem fer? 992 00:44:39,240 --> 00:44:39,700 Sí? 993 00:44:39,700 --> 00:44:41,140 >> AUDIÈNCIA: la mà de Taylor cal assenyalar esquerra. 994 00:44:41,140 --> 00:44:41,680 >> DAVID Malan: Exactament. 995 00:44:41,680 --> 00:44:43,800 Així la inserció d'un node al final de la llista 996 00:44:43,800 --> 00:44:47,140 és bastant simple perquè Taylor acaba ha d'assenyalar, en lloc de a terra 997 00:44:47,140 --> 00:44:49,640 o l'anomenarem nul, nul·la és una espècie d'absència 998 00:44:49,640 --> 00:44:51,640 d'un punter o una especial punter zero, ets 999 00:44:51,640 --> 00:44:53,740 va assenyalar amb la seva esquerra la mà al Rainbow i després de l'arc de Sant Martí, 1000 00:44:53,740 --> 00:44:55,910 on deu el seu esquerra Probablement mà punt? 1001 00:44:55,910 --> 00:44:56,570 De Down. 1002 00:44:56,570 --> 00:45:00,140 No és bo si la mà és una espècie d'assenyalar fora d'aquí o de qualsevol tipus 1003 00:45:00,140 --> 00:45:00,640 quin camí. 1004 00:45:00,640 --> 00:45:02,407 Això seria considerat un valor d'escombraries, 1005 00:45:02,407 --> 00:45:04,240 però si ella apunta algun valor conegut, anem a 1006 00:45:04,240 --> 00:45:07,360 cridar zero o nul·la, això està bé perquè tenim un terme en aquest 1007 00:45:07,360 --> 00:45:09,390 i sabem que la llista ja està complet. 1008 00:45:09,390 --> 00:45:11,550 >> Llavors, quina altra cas relativament simple? 1009 00:45:11,550 --> 00:45:13,125 Podríem malloc 5? 1010 00:45:13,125 --> 00:45:14,010 Anem cap amunt. 1011 00:45:14,010 --> 00:45:14,782 Com et dius? 1012 00:45:14,782 --> 00:45:15,490 TIFFANY: Tiffany. 1013 00:45:15,490 --> 00:45:16,000 DAVID Malan: Ho sento? 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 Tot bé. 1017 00:45:17,110 --> 00:45:19,071 Tiffany ha estat malloced amb el valor 5. 1018 00:45:19,071 --> 00:45:19,570 Anem cap amunt. 1019 00:45:19,570 --> 00:45:23,820 Aquest és relativament fàcil també, però considerarem l'ordre d'operacions ara. 1020 00:45:23,820 --> 00:45:25,820 Era bastant fàcil amb Taylor a l'extrem. 1021 00:45:25,820 --> 00:45:30,302 Número 5 és, per descomptat, menys de 9, i per això tenim a David, tenim Tiffany, 1022 00:45:30,302 --> 00:45:31,260 i quin era el seu nom? 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, i David. 1026 00:45:34,300 --> 00:45:36,580 La mà del qual s'ha d'actualitzar primer? 1027 00:45:36,580 --> 00:45:39,260 1028 00:45:39,260 --> 00:45:40,590 Què vols fer aquí? 1029 00:45:40,590 --> 00:45:45,244 Hi ha possibles formes en que un parell, però també hi ha una o més formes equivocades. 1030 00:45:45,244 --> 00:45:46,620 >> AUDIÈNCIA: Comenceu amb l'extrem esquerre. 1031 00:45:46,620 --> 00:45:47,800 >> DAVID Malan: Comenceu amb l'extrem esquerre. 1032 00:45:47,800 --> 00:45:49,008 Qui és el més a l'esquerra aquí, doncs? 1033 00:45:49,008 --> 00:45:49,700 AUDIÈNCIA: Primer. 1034 00:45:49,700 --> 00:45:50,366 >> DAVID Malan: OK. 1035 00:45:50,366 --> 00:45:53,781 Així que comença amb la primera i on fer voleu actualitzar les mans de David per a ser? 1036 00:45:53,781 --> 00:45:54,780 AUDIÈNCIA: Cap al maig. 1037 00:45:54,780 --> 00:45:55,446 DAVID Malan: OK. 1038 00:45:55,446 --> 00:45:59,026 Així que David, a les cinc en punt o Tiffany aquí i ara? 1039 00:45:59,026 --> 00:46:01,072 >> AUDIÈNCIA: Tiffany apunta al 9? 1040 00:46:01,072 --> 00:46:04,030 DAVID Malan: Perfecte, excepte Binky de cap només una mica va caure, oi? 1041 00:46:04,030 --> 00:46:06,820 Perquè el que té de dolent aquesta imatge literalment? 1042 00:46:06,820 --> 00:46:08,070 AUDIÈNCIA: Res està apuntant. 1043 00:46:08,070 --> 00:46:09,945 DAVID Malan: Res és assenyalant a Jake ara. 1044 00:46:09,945 --> 00:46:13,360 Literalment Hem orfes setembre i 17, i hem literalment 1045 00:46:13,360 --> 00:46:18,450 filtrat tota aquesta memòria, perquè per actualització de la mà de David primer, això és 1046 00:46:18,450 --> 00:46:21,660 bé en la mesura que és correcta assenyalant en Tiffany ara, 1047 00:46:21,660 --> 00:46:25,410 però si ningú va tenir la previsió per apuntar a Jake, 1048 00:46:25,410 --> 00:46:27,490 llavors hem perdut la totalitat d'aquesta llista. 1049 00:46:27,490 --> 00:46:28,200 Així que anem a desfer. 1050 00:46:28,200 --> 00:46:30,950 Així que va ser una bona cosa per ensopegar però anem a corregir ara. 1051 00:46:30,950 --> 00:46:33,624 Què hem de fer primer el seu lloc? 1052 00:46:33,624 --> 00:46:34,124 Sí? 1053 00:46:34,124 --> 00:46:35,791 >> AUDIÈNCIA: Tiffany ha d'apuntar al 9? 1054 00:46:35,791 --> 00:46:37,582 DAVID Malan: No puc aconseguir que a prop seu. 1055 00:46:37,582 --> 00:46:38,720 Qui ha d'apuntar al 9? 1056 00:46:38,720 --> 00:46:39,220 >> AUDIÈNCIA: Tiffany. 1057 00:46:39,220 --> 00:46:39,390 >> DAVID Malan: D'acord. 1058 00:46:39,390 --> 00:46:41,200 Així Tiffany haurien primer punt en el 9. 1059 00:46:41,200 --> 00:46:43,550 Així Tiffany ha de prendre en un valor idèntic 1060 00:46:43,550 --> 00:46:45,820 David, el que sembla redundant per un moment, 1061 00:46:45,820 --> 00:46:48,820 però això està bé, perquè ara, segon pas, podem actualitzar la mà de David 1062 00:46:48,820 --> 00:46:52,680 assenyalar amb diamants, i després, si nosaltres, només una mica de netejar les coses 1063 00:46:52,680 --> 00:46:55,740 com si això és una espècie de primaveral, ara que és una inserció correcta. 1064 00:46:55,740 --> 00:46:56,700 Així excel·lent. 1065 00:46:56,700 --> 00:46:57,970 Així que ara ja gairebé estem allà. 1066 00:46:57,970 --> 00:47:01,075 Anem a inserir un últim valor com el valor 20. 1067 00:47:01,075 --> 00:47:03,010 Si poguéssim malloc un voluntari final? 1068 00:47:03,010 --> 00:47:04,140 Anem cap amunt. 1069 00:47:04,140 --> 00:47:06,224 Així que aquest és una mica més complicat. 1070 00:47:06,224 --> 00:47:08,390 Però en realitat, el codi som escriure, encara que verbalment, 1071 00:47:08,390 --> 00:47:10,610 és com tenir un munt si les condicions d'ara, oi? 1072 00:47:10,610 --> 00:47:12,318 Vam tenir una condició comprovar si pertany 1073 00:47:12,318 --> 00:47:13,840 al final, potser el principi. 1074 00:47:13,840 --> 00:47:15,940 Necessitem algun tipus de llaç per trobar el punt en el centre. 1075 00:47:15,940 --> 00:47:17,400 Així que anem a fer això amb el que és el seu nom? 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 Encantat de conéixer-te. 1080 00:47:19,368 --> 00:47:20,490 Així que tenim 20. 1081 00:47:20,490 --> 00:47:21,220 Menys de cinc? 1082 00:47:21,220 --> 00:47:21,530 No. 1083 00:47:21,530 --> 00:47:22,160 Menys de nou? 1084 00:47:22,160 --> 00:47:22,410 No. 1085 00:47:22,410 --> 00:47:23,050 Menys de 17? 1086 00:47:23,050 --> 00:47:23,550 No. 1087 00:47:23,550 --> 00:47:23,740 D'ACORD. 1088 00:47:23,740 --> 00:47:25,701 Ell pertany aquí i els seus noms són de nou? 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, i? 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 Que les seves mans han d'actualitzar-primer? 1096 00:47:32,140 --> 00:47:32,930 >> AUDIÈNCIA: Eric. 1097 00:47:32,930 --> 00:47:33,429 D'ACORD. 1098 00:47:33,429 --> 00:47:35,200 Així que Eric hauria d'apuntar a on? 1099 00:47:35,200 --> 00:47:35,930 Als 22 anys. 1100 00:47:35,930 --> 00:47:36,430 Bé. 1101 00:47:36,430 --> 00:47:38,180 I ara què segueix? 1102 00:47:38,180 --> 00:47:40,800 Sue llavors pot apuntar a Eric i ara, si vostès només 1103 00:47:40,800 --> 00:47:44,077 fer una mica d'espai, la qual cosa està bé visualment, ara que hem fet de la inserció. 1104 00:47:44,077 --> 00:47:47,160 Així que considerarem ara una pregunta, però moltes gràcies als nostres voluntaris. 1105 00:47:47,160 --> 00:47:48,090 Molt ben fet. 1106 00:47:48,090 --> 00:47:50,831 Vostè pot mantenir aquests, si ho desitja. 1107 00:47:50,831 --> 00:47:54,140 I tenim un regal de comiat encantador si que li agrada cadascun per prendre una pilota anti-estrès. 1108 00:47:54,140 --> 00:47:56,030 Permetin-me passar això. 1109 00:47:56,030 --> 00:47:58,430 Llavors, què és el menjar per emportar de tot això? 1110 00:47:58,430 --> 00:48:02,430 Això sembla ser increïble en la mesura que tenim ara 1111 00:48:02,430 --> 00:48:06,360 introduït una alternativa a una matriu que no està tan limitat 1112 00:48:06,360 --> 00:48:07,780 a una matriu d'una certa mida fixa. 1113 00:48:07,780 --> 00:48:09,380 Poden créixer dinàmicament. 1114 00:48:09,380 --> 00:48:13,220 >> Però igual que hem vist en setmanes passat, que mai va aconseguir res de forma gratuïta, 1115 00:48:13,220 --> 00:48:15,740 com segurament hi ha un trade-off aquí. 1116 00:48:15,740 --> 00:48:18,890 Així, amb una alça d'un lligat llista, és aquest dinamisme? 1117 00:48:18,890 --> 00:48:21,590 Aquesta capacitat de créixer i, francament, podríem haver fet d'eliminació 1118 00:48:21,590 --> 00:48:23,570 i podríem reduir, segons sigui necessari. 1119 00:48:23,570 --> 00:48:24,710 Quin preu estem pagant? 1120 00:48:24,710 --> 00:48:28,510 1121 00:48:28,510 --> 00:48:30,340 El doble d'espai, en primer lloc. 1122 00:48:30,340 --> 00:48:34,010 Si ens fixem en la imatge, ja no estic emmagatzemant una llista d'enters. 1123 00:48:34,010 --> 00:48:36,740 Estic emmagatzemar una llista de sencers més punters. 1124 00:48:36,740 --> 00:48:38,240 Així que estic duplicant la quantitat d'espai. 1125 00:48:38,240 --> 00:48:40,740 Ara, potser això no és tal una gran cosa 4 bytes, 8 bytes, 1126 00:48:40,740 --> 00:48:43,160 però sens dubte podria afegir per a grans conjunts de dades. 1127 00:48:43,160 --> 00:48:45,570 Quin és altra desavantatge? 1128 00:48:45,570 --> 00:48:46,070 Sí? 1129 00:48:46,070 --> 00:48:48,010 >> AUDIÈNCIA: Hem de travessar ells un per un. 1130 00:48:48,010 --> 00:48:48,760 DAVID Malan: Sí. 1131 00:48:48,760 --> 00:48:50,260 Hem de travessar ells un per un. 1132 00:48:50,260 --> 00:48:53,860 Saps què, ens vam donar per vençuts aquesta super pràctica funció de claudàtors 1133 00:48:53,860 --> 00:48:57,240 notació, més pròpiament coneguda com accés aleatori, 1134 00:48:57,240 --> 00:48:59,280 en el qual només podem saltar a un element individual 1135 00:48:59,280 --> 00:49:01,470 però ara si encara tenia els meus voluntaris aquí, 1136 00:49:01,470 --> 00:49:04,660 si volia trobar la número 22, no puc simplement 1137 00:49:04,660 --> 00:49:06,620 saltar al suport d'alguna cosa d'alguna cosa. 1138 00:49:06,620 --> 00:49:10,530 He de mirar per sobre de la llista, i molt com els nostres exemples de cerca de manera lineal, 1139 00:49:10,530 --> 00:49:12,260 per trobar el nombre 22. 1140 00:49:12,260 --> 00:49:14,340 Així que sembla que hem pagat un preu allà. 1141 00:49:14,340 --> 00:49:16,430 Però podem, però, resoldre altres problemes. 1142 00:49:16,430 --> 00:49:18,587 >> De fet, permetin-me presentar només un parell d'imatges. 1143 00:49:18,587 --> 00:49:20,920 Així que si vostè ha estat fins De Mather Dining Hall recentment, 1144 00:49:20,920 --> 00:49:23,320 vostè recordarà que el seu piles de safates d'aquest tipus, 1145 00:49:23,320 --> 00:49:26,300 demanem prestat aquests de Annenberg abans de la classe. 1146 00:49:26,300 --> 00:49:28,930 Així que aquesta pila de safates, però, és representativa realitat 1147 00:49:28,930 --> 00:49:30,860 d'una estructura de dades informàtica. 1148 00:49:30,860 --> 00:49:32,910 Hi ha una estructura de dades en ciències de la computació 1149 00:49:32,910 --> 00:49:38,010 conegut com una pila que molt bé es presta a exactament això visual. 1150 00:49:38,010 --> 00:49:41,380 Així que si cadascuna d'aquestes safates no és una Safata però igual que un nombre i que volia 1151 00:49:41,380 --> 00:49:45,010 per emmagatzemar nombres, podria posar un fins aquí, 1152 00:49:45,010 --> 00:49:48,320 i vaig poder posar un altre aquí baix, i continuar apilament números 1153 00:49:48,320 --> 00:49:53,180 a la part superior un de l'altre, i el que és potencialment útil sobre aquest 1154 00:49:53,180 --> 00:49:55,450 és que el que és la implicació d'aquesta estructura de dades? 1155 00:49:55,450 --> 00:49:58,045 Quin nombre puc treure primer més convenient? 1156 00:49:58,045 --> 00:50:00,640 1157 00:50:00,640 --> 00:50:03,030 El més recent es va ficar allà. 1158 00:50:03,030 --> 00:50:06,430 >> Així que això és el que anomenaríem en ciències de la computació una estructura de dades LIFO. 1159 00:50:06,430 --> 00:50:08,070 Últim a entrar, primer en sortir. 1160 00:50:08,070 --> 00:50:10,800 I veurem en poc temps per què que podria ser útil, però per ara, 1161 00:50:10,800 --> 00:50:12,200 n'hi ha prou amb considerar la propietat. 1162 00:50:12,200 --> 00:50:15,158 I és una mica estúpid si vostè pensa sobre com el menjador fa. 1163 00:50:15,158 --> 00:50:17,910 Cada vegada que les safates netes i posar els més frescos a la part superior, 1164 00:50:17,910 --> 00:50:22,160 vostè podria tenir una que ja s'hagi neta però amb el temps molt brut i polsegós 1165 00:50:22,160 --> 00:50:24,360 la safata a la part inferior si en realitat mai 1166 00:50:24,360 --> 00:50:26,820 arribar al fons d'aquesta pila, ja que acaba de 1167 00:50:26,820 --> 00:50:29,380 seguir posant el nou i els nets a la part superior de la mateixa. 1168 00:50:29,380 --> 00:50:31,840 El mateix podria succeir en un supermercat també. 1169 00:50:31,840 --> 00:50:35,450 Si vostè té una vitrina de llet i cada vegada CVS 1170 00:50:35,450 --> 00:50:37,610 o qui obté més llet, que acaba empeny les llets 1171 00:50:37,610 --> 00:50:39,880 ja té a l'esquena i posar els nous a la davantera, 1172 00:50:39,880 --> 00:50:43,088 vostè va a tenir alguns bastant desagradable llet a l'extrem de l'estructura de dades, 1173 00:50:43,088 --> 00:50:46,390 perquè sempre a la part inferior o equivalentment sempre a la part posterior. 1174 00:50:46,390 --> 00:50:50,407 >> Però hi ha una altra manera de pensar alineant les dades i, per exemple, aquesta. 1175 00:50:50,407 --> 00:50:53,490 Si ets una d'aquestes persones que li agrada per alinear les afores de les botigues d'Apple 1176 00:50:53,490 --> 00:50:55,610 quan arriba un nou producte a terme, és probable que 1177 00:50:55,610 --> 00:50:58,780 no s'utilitza un dades de la pila estructura perquè 1178 00:50:58,780 --> 00:51:03,070 allunyaria a tots els altres que és fent cua per comprar una nova joguina. 1179 00:51:03,070 --> 00:51:06,610 Més aviat, és probable que estiguis usant quin tipus d'estructura de dades 1180 00:51:06,610 --> 00:51:10,050 o quin tipus de sistema en el món real? 1181 00:51:10,050 --> 00:51:13,493 Esperem que sigui una línia, o més adequadament o més britànic-com, una cua. 1182 00:51:13,493 --> 00:51:17,700 I resulta que una cua és també un estructura de dades en ciències de la computació, 1183 00:51:17,700 --> 00:51:19,700 però una cua té un molt diferent propietat. 1184 00:51:19,700 --> 00:51:20,820 No és LIFO. 1185 00:51:20,820 --> 00:51:21,990 Últim a entrar, primer en sortir. 1186 00:51:21,990 --> 00:51:22,800 Déu no ho vulgui. 1187 00:51:22,800 --> 00:51:24,280 És lloc FIFO. 1188 00:51:24,280 --> 00:51:26,110 Primer a entrar, primer en sortir. 1189 00:51:26,110 --> 00:51:27,970 I això és una bona cosa per causa de la justícia 1190 00:51:27,970 --> 00:51:30,428 sens dubte quan s'està alineant fins molt d'hora al matí. 1191 00:51:30,428 --> 00:51:33,400 Si arribes primer, voler sortir primer també. 1192 00:51:33,400 --> 00:51:35,880 >> I així, totes aquestes dades estructures, cues i piles 1193 00:51:35,880 --> 00:51:39,220 i raïms d'altres, resulta que pot pensar en això com una matriu. 1194 00:51:39,220 --> 00:51:41,820 Aquesta és una matriu, potser una grandària fixa 4, però seria 1195 00:51:41,820 --> 00:51:44,990 ser alguna cosa bona si poguéssim acumular safates gairebé infinitament alt si 1196 00:51:44,990 --> 00:51:46,780 tenir aquesta quantitat de safates o números. 1197 00:51:46,780 --> 00:51:48,840 Així que potser volem utilitzar una llista enllaçada aquí, 1198 00:51:48,840 --> 00:51:51,800 però la compensació serà potencialment que necessitem més memòria, 1199 00:51:51,800 --> 00:51:55,930 pren una mica més de temps, però nosaltres no limitar l'alçada de la pila, 1200 00:51:55,930 --> 00:51:59,550 molt com vitrina de Mather podria limitar la mida de la pila, 1201 00:51:59,550 --> 00:52:03,117 i així es tracta de decisions de disseny o opcions disponibles per a nosaltres en última instància. 1202 00:52:03,117 --> 00:52:04,950 Així, amb aquestes dades estructures, que han començat 1203 00:52:04,950 --> 00:52:09,360 veure nous límits superiors potencialment en el que abans era súper ràpid 1204 00:52:09,360 --> 00:52:11,260 i on deixarem d'avui i on 1205 00:52:11,260 --> 00:52:13,200 anem Esperem arribar és el dimecres, anem a 1206 00:52:13,200 --> 00:52:15,740 començar a mirar una dada estructura que ens permet busquem 1207 00:52:15,740 --> 00:52:18,260 a través de les dades en temps final de registre de nou. 1208 00:52:18,260 --> 00:52:21,470 I vam veure que, recordem, en la setmana zero i un altre amb recerca binària o dividir 1209 00:52:21,470 --> 00:52:22,180 i conquerir. 1210 00:52:22,180 --> 00:52:26,240 Es va a tornar i millor encara, el sant grial per a aquest dimecres 1211 00:52:26,240 --> 00:52:29,510 serà la d'arribar a la estructura de dades que s'executa realment 1212 00:52:29,510 --> 00:52:32,070 o teòricament en constant de temps, amb la qual cosa 1213 00:52:32,070 --> 00:52:34,760 no importa quants milions o milers de milions de coses 1214 00:52:34,760 --> 00:52:38,470 que tenim en l'estructura de dades, ho farà portar-nos constant de temps, potser un pas 1215 00:52:38,470 --> 00:52:41,387 o dos passos o 10 passos, però els números constants de passos 1216 00:52:41,387 --> 00:52:42,970 per buscar a través d'aquesta estructura de dades. 1217 00:52:42,970 --> 00:52:46,300 Aquest fet serà el Sant Grial però més que dimecres. 1218 00:52:46,300 --> 00:52:49,045 Ens veiem llavors. 1219 00:52:49,045 --> 00:52:53,704 >> [REPRODUCCIÓ DE MÚSICA] 1220 00:52:53,704 --> 00:56:08,448