1 00:00:00,000 --> 00:00:11,200 2 00:00:11,200 --> 00:00:12,580 >> DAVID Malan: Todo ben, benvido de volta. 3 00:00:12,580 --> 00:00:13,290 Esta é a CS50. 4 00:00:13,290 --> 00:00:15,130 Este é o inicio da semana de sete. 5 00:00:15,130 --> 00:00:18,890 Entón foi un tempo, entón eu penso que ía facer un paseo turbillón de onde nós 6 00:00:18,890 --> 00:00:20,760 parou e cara a onde estamos indo agora. 7 00:00:20,760 --> 00:00:23,310 >> Entón, esa cousa aquí pode ter causou certa angustia en primeiro lugar. 8 00:00:23,310 --> 00:00:27,680 Pero espero que, está empezando a aclimatar co que iso denota aquí - 9 00:00:27,680 --> 00:00:32,670 estrela que representa un punteiro, o cal é o que, en termos máis laicos? 10 00:00:32,670 --> 00:00:33,400 Polo tanto, é un enderezo. 11 00:00:33,400 --> 00:00:35,490 >> Polo tanto, é o enderezo de algo na memoria. 12 00:00:35,490 --> 00:00:38,260 E comezamos a pelar as capas un par de semanas atrás, cousas como 13 00:00:38,260 --> 00:00:41,800 GetString e outras funcións tales todo este tempo foron retornando 14 00:00:41,800 --> 00:00:46,010 enderezos de cousas na memoria, como o enderezo do primeiro carácter 15 00:00:46,010 --> 00:00:46,990 algunha secuencia. 16 00:00:46,990 --> 00:00:50,360 >> Entón, nós tamén introduciu Valgrind, que vai comezar a usar a este problema 17 00:00:50,360 --> 00:00:53,380 establecido, en particular á seguinte conxunto de problemas tamén. 18 00:00:53,380 --> 00:00:54,980 E Valgrind fai o que para nós? 19 00:00:54,980 --> 00:00:57,520 20 00:00:57,520 --> 00:01:01,020 El comprobar se hai perdas de memoria, e Tamén comproba a existencia de abuso de memoria. 21 00:01:01,020 --> 00:01:05,890 >> É posible, con certa probabilidade, se detecta seu código tocará de memoria 22 00:01:05,890 --> 00:01:07,100 que simplemente non debería. 23 00:01:07,100 --> 00:01:10,410 Entón, non necesariamente unha fuga, pero se ir máis alá das fronteiras de algúns 24 00:01:10,410 --> 00:01:14,730 array, e realmente executar Valgrind e inducir a que o comportamento mentres 25 00:01:14,730 --> 00:01:17,870 Valgrind está en execución no seu programa rodando dentro del, vai ter 26 00:01:17,870 --> 00:01:21,460 mensaxes como esta - "válido de escribir tamaño 4 ", que, lembre-se de un par de 27 00:01:21,460 --> 00:01:25,880 semanas significaba que eu tiña accidentalmente procura dun int demasiado 28 00:01:25,880 --> 00:01:27,250 alén dos límites dun array. 29 00:01:27,250 --> 00:01:30,790 E así tamaño 4 significa que aquí o tamaño de que int particular. 30 00:01:30,790 --> 00:01:35,260 >> Entón dea confianza no feito de que saída do Valgrind, o formato do mesmo, 31 00:01:35,260 --> 00:01:36,170 é simplemente atroz. 32 00:01:36,170 --> 00:01:40,180 É realmente difícil de ver a través da desorde pola información interesante. 33 00:01:40,180 --> 00:01:42,910 Entón, o que fixemos aquí é só tramo algúns dos compañeiros de máis 34 00:01:42,910 --> 00:01:43,850 liñas interesantes. 35 00:01:43,850 --> 00:01:46,760 Pero entendemos que o 80% dos Valgrind de saída vai ser un pouco de 36 00:01:46,760 --> 00:01:47,650 distracción. 37 00:01:47,650 --> 00:01:52,820 >> Basta ollar para os patróns como estes - válido dereita, válido ler, 40 bytes 38 00:01:52,820 --> 00:01:56,690 e un certo número de bloques son definitivamente perdido, palabras clave como esta. 39 00:01:56,690 --> 00:02:01,920 E o que espera ver algunha tipo de vestixio de que a función do 40 00:02:01,920 --> 00:02:03,340 erro é realmente dentro 41 00:02:03,340 --> 00:02:07,195 Neste caso, aquí, no que a liña de meu código era aparentemente o erro? 42 00:02:07,195 --> 00:02:09,729 43 00:02:09,729 --> 00:02:14,130 >> 26 nun arquivo chamado memory.c, que era o exemplo que estaban a xogar con 44 00:02:14,130 --> 00:02:14,890 no momento. 45 00:02:14,890 --> 00:02:16,460 Polo tanto, non é, probablemente, en malloc. 46 00:02:16,460 --> 00:02:18,630 Foi probabelmente o meu código no seu lugar. 47 00:02:18,630 --> 00:02:20,910 Entón, imos ver iso de novo e de novo en pouco tempo. 48 00:02:20,910 --> 00:02:24,080 >> Entón scanf, esta xurdiu nun algunhas formas ata agora. 49 00:02:24,080 --> 00:02:26,410 Vimos sscanf brevemente. 50 00:02:26,410 --> 00:02:28,330 Era algo que unha serie de lle mergullou na súa 51 00:02:28,330 --> 00:02:29,535 preparatorios para o exame. 52 00:02:29,535 --> 00:02:33,130 E scanf é realmente o que o CS50 biblioteca está a usar por baixo da 53 00:02:33,130 --> 00:02:36,560 capa por algún tempo, a fin para a entrada do usuario. 54 00:02:36,560 --> 00:02:40,420 >> Por exemplo, se eu pasar ao CS50 aparello aquí, déixeme abrir unha 55 00:02:40,420 --> 00:02:45,315 exemplo, hoxe, que se chama scanf-0.C E é super sinxelo. 56 00:02:45,315 --> 00:02:46,590 É só algunhas liñas de código. 57 00:02:46,590 --> 00:02:50,880 Pero el demostra realmente como getInt vén traballando todo este tempo. 58 00:02:50,880 --> 00:02:54,710 >> Neste programa aquí, na liña 16 , Repare que eu declarar un int. 59 00:02:54,710 --> 00:02:57,270 Así, non punteiros, nada de máxico alí, só unha int. 60 00:02:57,270 --> 00:03:00,330 A continuación, na liña 17, eu levar o usuario a un número, por favor. 61 00:03:00,330 --> 00:03:02,930 Así, a finais de 18, eu uso o scanf aquí. 62 00:03:02,930 --> 00:03:06,910 E eu especifiquei, tipo como printf, que eu estou esperando Cita 63 00:03:06,910 --> 00:03:08,110 unquote por cento i. 64 00:03:08,110 --> 00:03:10,920 >> Así por cento de i, por suposto, denota un int. 65 00:03:10,920 --> 00:03:14,580 Pero teña en conta que a segunda argumento de scanf é. 66 00:03:14,580 --> 00:03:17,350 Como describiría a segunda argumento despois da vírgula? 67 00:03:17,350 --> 00:03:19,450 ¿Que é iso? 68 00:03:19,450 --> 00:03:20,670 >> É o enderezo de x. 69 00:03:20,670 --> 00:03:25,490 Entón, iso é útil, porque, que contén scanf co enderezo de x, o que fai 70 00:03:25,490 --> 00:03:29,560 que capacitam esta función para facer? 71 00:03:29,560 --> 00:03:33,010 Non é só ir alí, senón tamén facer o que? 72 00:03:33,010 --> 00:03:34,060 >> Facer un cambio para ela. 73 00:03:34,060 --> 00:03:38,080 Porque pode ir alí, é unha especie de como un mapa para a localización na memoria. 74 00:03:38,080 --> 00:03:41,900 E así, sempre que forneza scanf, ou calquera función cun tal mapa, é dicir 75 00:03:41,900 --> 00:03:45,840 función pode ir alí, e non só mirar para o valor, pero tamén pode 76 00:03:45,840 --> 00:03:49,670 cambiar ese valor, o que é útil cando a propósito na vida de scanf é 77 00:03:49,670 --> 00:03:53,060 dixitalizar a entrada do usuario, especialmente desde o teclado. 78 00:03:53,060 --> 00:03:57,830 E o f denota formato, así como printf, o f denota unha formato 79 00:03:57,830 --> 00:03:58,930 cadea que quere imprimir. 80 00:03:58,930 --> 00:04:04,430 >> Así, en breve, esta liña 18 simplemente di: tente ler un int de usuario do 81 00:04:04,430 --> 00:04:10,420 teclado e almacena-lo dentro de x, en calquera enderezo x pasa a vivir. 82 00:04:10,420 --> 00:04:14,860 E entón, finalmente, a liña 19 só di: grazas pola int, neste caso. 83 00:04:14,860 --> 00:04:15,940 >> Entón deixe-me ir adiante e facelo. 84 00:04:15,940 --> 00:04:18,570 Entón faga scanf 0. 85 00:04:18,570 --> 00:04:20,130 Déixeme ir adiante e facer zoom dentro 86 00:04:20,130 --> 00:04:22,960 Vou correr con esta puntos cortar scanf 0. 87 00:04:22,960 --> 00:04:24,020 Número, por favor? 88 00:04:24,020 --> 00:04:24,720 50. 89 00:04:24,720 --> 00:04:25,730 Grazas pola 50. 90 00:04:25,730 --> 00:04:27,270 Por iso, é moi sinxelo. 91 00:04:27,270 --> 00:04:28,160 >> Agora, o que é que non está facendo? 92 00:04:28,160 --> 00:04:29,940 El non está facendo un grupo enteiro de comprobación de erros. 93 00:04:29,940 --> 00:04:33,000 Por exemplo, se eu non cooperar, e eu non escribir un número, pero 94 00:04:33,000 --> 00:04:37,860 en vez diso, escribir algo como "Ola", iso é só unha especie de estraño. 95 00:04:37,860 --> 00:04:41,130 E así, unha das cousas que o CS50 biblioteca está a facer a nós por algún 96 00:04:41,130 --> 00:04:43,440 tempo é que reprompting e reprompting. 97 00:04:43,440 --> 00:04:49,320 >> O novo intento frase foi retirada en cs50.c, e esa é a razón que getInt en 98 00:04:49,320 --> 00:04:51,670 a biblioteca CS50 é realmente un conxunto banda de longas filas, porque somos 99 00:04:51,670 --> 00:04:53,190 comprobación de cousas estúpidas como esta. 100 00:04:53,190 --> 00:04:55,730 Se o usuario non dar nós, en realidade, un int? 101 00:04:55,730 --> 00:04:57,910 Será que el ou ela dar algo como unha letra alfabética? 102 00:04:57,910 --> 00:05:01,410 Se é así, queremos detectar que e berrar con eles. 103 00:05:01,410 --> 00:05:03,915 >> Pero as cousas están máis interesantes Neste seguinte exemplo. 104 00:05:03,915 --> 00:05:09,840 Se eu fose para scanf-1.c, que é o único cousa que cambiou fundamentalmente en 105 00:05:09,840 --> 00:05:11,135 Neste seguinte exemplo? 106 00:05:11,135 --> 00:05:13,690 107 00:05:13,690 --> 00:05:16,010 Está a usar char *, por suposto, no canto de int. 108 00:05:16,010 --> 00:05:19,210 >> Entón, iso é interesante, porque char *, recordar, é realmente só o 109 00:05:19,210 --> 00:05:20,190 mesmo que a cadea. 110 00:05:20,190 --> 00:05:23,840 Así, parece que quizais iso sexa un super implementación simple de GetString. 111 00:05:23,840 --> 00:05:26,010 Pero eu desmascarado a capa da biblioteca CS50, polo que estou 112 00:05:26,010 --> 00:05:27,550 chamando este char * agora. 113 00:05:27,550 --> 00:05:30,070 Entón imos ver onde, en calquera lugar, nós erramos. 114 00:05:30,070 --> 00:05:30,840 >> Liña 17 - 115 00:05:30,840 --> 00:05:33,950 Volvo a dicir, por favor, me dar algo, neste caso, unha cadea de caracteres. 116 00:05:33,950 --> 00:05:37,940 E, a continuación, na liña seguinte, eu chamo scanf, unha vez máis, dándolle un código de formato, 117 00:05:37,940 --> 00:05:39,310 pero esta vez por cento s. 118 00:05:39,310 --> 00:05:41,900 E, a continuación, esta vez, eu son dándolle tapón. 119 00:05:41,900 --> 00:05:43,550 >> Agora conta, non está a usar o comercial. 120 00:05:43,550 --> 00:05:47,120 Pero por que é que, probablemente, OK aquí? 121 00:05:47,120 --> 00:05:49,760 Porque o que é xa tapón? 122 00:05:49,760 --> 00:05:50,770 Xa é un punteiro. 123 00:05:50,770 --> 00:05:51,650 Xa é un enderezo. 124 00:05:51,650 --> 00:05:54,510 >> E imos a palabra "confundir", déixeme basta chamalo s, por exemplo, para 125 00:05:54,510 --> 00:05:55,050 sinxeleza. 126 00:05:55,050 --> 00:05:58,250 Pero eu chamei-tapón porque en xeral, na programación, se ten un 127 00:05:58,250 --> 00:06:02,130 anaco de memoria, que unha secuencia de verdade só é, pode chamalo de un buffer. 128 00:06:02,130 --> 00:06:04,460 É un lugar para almacenar información. 129 00:06:04,460 --> 00:06:07,400 >> Semellante a cousas como YouTube, cando están de tamponamento, por así dicir, que 130 00:06:07,400 --> 00:06:10,270 significa só que está baixando anacos de Internet e almacena-los nun 131 00:06:10,270 --> 00:06:14,160 variedade local, un anaco da memoria local, así que pode ve-lo máis tarde, sen 132 00:06:14,160 --> 00:06:16,830 el saltar ou colgado vostede durante a reprodución. 133 00:06:16,830 --> 00:06:20,930 >> Polo tanto, hai un problema aquí, con todo, por que eu digo scanf, esperar un 134 00:06:20,930 --> 00:06:22,320 corda do usuario. 135 00:06:22,320 --> 00:06:24,410 Aquí está o enderezo do unha peza de memoria. 136 00:06:24,410 --> 00:06:26,180 Coloca a corda alí. 137 00:06:26,180 --> 00:06:31,230 Por que Bound dar nos problemas, aínda que? 138 00:06:31,230 --> 00:06:33,490 >> ¿Que é iso? 139 00:06:33,490 --> 00:06:35,510 Teño permiso para acceder que parte da memoria? 140 00:06:35,510 --> 00:06:36,250 Vostede sabe, eu non sei. 141 00:06:36,250 --> 00:06:39,210 Porque ten tapón foi inicializar para nada? 142 00:06:39,210 --> 00:06:39,820 Non é verdade. 143 00:06:39,820 --> 00:06:43,090 E iso é o que estamos chamando un valor de lixo, que 144 00:06:43,090 --> 00:06:44,040 non é unha palabra formal. 145 00:06:44,040 --> 00:06:49,200 Significa só que nós non temos ningunha idea do que anacos están dentro das catro bytes 146 00:06:49,200 --> 00:06:51,240 Teño asignado como buffer. 147 00:06:51,240 --> 00:06:52,450 >> Non chamei malloc. 148 00:06:52,450 --> 00:06:53,940 Eu definitivamente non se chama GetString. 149 00:06:53,940 --> 00:06:56,380 Entón, quen sabe o que é realmente dentro tapón de? 150 00:06:56,380 --> 00:07:00,550 E aínda dicindo scanf cegamente, vai alí e poñer o que o usuario inseriu. 151 00:07:00,550 --> 00:07:04,460 >> Entón, o que é susceptible de provocar no noso código, se executa-lo? 152 00:07:04,460 --> 00:07:05,700 Probablemente un segfault. 153 00:07:05,700 --> 00:07:07,970 Quizais non, pero probablemente un segfault. 154 00:07:07,970 --> 00:07:10,620 E digo quizais porque ás veces non fai, ás veces 155 00:07:10,620 --> 00:07:11,380 non ten un segfault. 156 00:07:11,380 --> 00:07:14,280 Ás veces só ter sorte, pero é aínda así será 157 00:07:14,280 --> 00:07:15,340 un erro no noso programa. 158 00:07:15,340 --> 00:07:17,060 >> Entón deixe-me ir adiante e compilar iso. 159 00:07:17,060 --> 00:07:18,280 Vou facer do xeito old school. 160 00:07:18,280 --> 00:07:23,825 Entón bumbum trazo 0, scanf-1, scanf-1.c, Intro. 161 00:07:23,825 --> 00:07:24,720 Oops, escola moi antiga. 162 00:07:24,720 --> 00:07:26,550 Imos ver. 163 00:07:26,550 --> 00:07:28,440 Onde é que eu vou? 164 00:07:28,440 --> 00:07:29,700 Oh, buffer de char *. 165 00:07:29,700 --> 00:07:33,595 166 00:07:33,595 --> 00:07:35,130 Oh, moitas grazas - 167 00:07:35,130 --> 00:07:36,930 Gardar, OK - 168 00:07:36,930 --> 00:07:37,690 escola moi antiga. 169 00:07:37,690 --> 00:07:38,900 Todo ben, iso xa fai un tempo. 170 00:07:38,900 --> 00:07:41,720 >> Entón, eu acabo de gardar o arquivo despois facendo que temporal 171 00:07:41,720 --> 00:07:42,700 cambiar de un momento atrás. 172 00:07:42,700 --> 00:07:46,090 E agora eu compilar el manualmente con Clang. 173 00:07:46,090 --> 00:07:49,500 E agora eu estou indo a ir adiante e realizar scanf-1, Intro. 174 00:07:49,500 --> 00:07:50,290 Cordas favor. 175 00:07:50,290 --> 00:07:51,600 Vou escribir "Ola". 176 00:07:51,600 --> 00:07:54,070 >> E agora, aquí é onde, francamente, printf pode é un pouco irritante. 177 00:07:54,070 --> 00:07:56,020 Non está indo realmente para segfault neste caso. 178 00:07:56,020 --> 00:07:59,860 Printf é algo especial, porque é tan super comunmente utilizado, que 179 00:07:59,860 --> 00:08:03,570 printf esencialmente fai -Nos un favor e entender, 180 00:08:03,570 --> 00:08:04,830 iso non é un punteiro válido. 181 00:08:04,830 --> 00:08:09,080 Déixeme levala a min só para imprimir en parénteses nulo, aínda 182 00:08:09,080 --> 00:08:13,340 aínda que non sexa necesariamente o que que nos esperaba. 183 00:08:13,340 --> 00:08:16,940 >> Polo tanto, non podemos moi facilmente inducir un segfault con iso, pero claramente esta 184 00:08:16,940 --> 00:08:18,600 non é o comportamento que eu quería. 185 00:08:18,600 --> 00:08:19,800 Entón, cal é a solución máis simple? 186 00:08:19,800 --> 00:08:25,650 Ben, en scanf-2, déixeme propoñer que no canto de realidade, só a asignación dunha 187 00:08:25,650 --> 00:08:30,100 char *, deixe-me ser un pouco máis intelixente sobre iso, e déixeme reservar buffer 188 00:08:30,100 --> 00:08:32,940 como unha secuencia de 16 caracteres. 189 00:08:32,940 --> 00:08:34,200 >> Entón eu podo facelo de dous xeitos. 190 00:08:34,200 --> 00:08:35,610 Eu absolutamente podería usar malloc. 191 00:08:35,610 --> 00:08:38,980 Pero eu podo volver a dúas semanas, cando Eu só precisaba unha morea de 192 00:08:38,980 --> 00:08:39,620 caracteres. 193 00:08:39,620 --> 00:08:40,860 Isto é só unha matriz. 194 00:08:40,860 --> 00:08:44,870 Entón déixeme en vez redefinir tapón sendo unha matriz de 16 caracteres. 195 00:08:44,870 --> 00:08:47,340 >> E agora, cando eu pasar tapón in - 196 00:08:47,340 --> 00:08:49,940 e iso é algo que non fixo falar en dúas semanas - 197 00:08:49,940 --> 00:08:53,730 pero pode tratar unha variedade de pero é un enderezo. 198 00:08:53,730 --> 00:08:56,390 Técnicamente, como vimos, son un pouco diferente. 199 00:08:56,390 --> 00:09:01,290 Pero scanf non vai importar se pasalo o nome dun array, porque o que 200 00:09:01,290 --> 00:09:05,030 Clang fará por nós é esencialmente tratar o nome do array como o 201 00:09:05,030 --> 00:09:08,280 dirección do bloque de 16 bytes. 202 00:09:08,280 --> 00:09:09,550 >> Polo tanto, este é mellor. 203 00:09:09,550 --> 00:09:12,110 É dicir, que agora que podo esperar faga o seguinte. 204 00:09:12,110 --> 00:09:16,800 Déixeme zoom por un momento e fan scanf-2, compilada Aceptar. 205 00:09:16,800 --> 00:09:19,390 Agora, deixe-me que teño barra scanf-2. 206 00:09:19,390 --> 00:09:22,430 Cordas favor. "Ola". Correo parecía estar a traballar neste momento. 207 00:09:22,430 --> 00:09:26,020 >> Pero alguén pode propoñer un escenario en que non pode aínda funciona? 208 00:09:26,020 --> 00:09:28,550 Si? 209 00:09:28,550 --> 00:09:30,640 Algo máis que 16 caracteres. 210 00:09:30,640 --> 00:09:32,020 E, de feito, podemos ser algo máis precisa. 211 00:09:32,020 --> 00:09:36,540 Algo máis entón 15 personaxes, porque realmente necesitamos ter presente 212 00:09:36,540 --> 00:09:39,920 que necesitamos que barra invertida de cero implicitamente ao final da cadea, 213 00:09:39,920 --> 00:09:42,950 que é un separadamente scanf ha tipicamente coidar para nós. 214 00:09:42,950 --> 00:09:46,210 >> Entón deixe-me facer algo así - 215 00:09:46,210 --> 00:09:48,040 Ás veces, podemos só deixalo así. 216 00:09:48,040 --> 00:09:50,630 OK, entón agora inducido nosa fallo de segmento. 217 00:09:50,630 --> 00:09:51,000 Por que? 218 00:09:51,000 --> 00:09:54,940 Porque eu escriba a máis de 15 caracteres, e por iso nós realmente 219 00:09:54,940 --> 00:09:58,280 memoria tocado que realmente non debería. 220 00:09:58,280 --> 00:10:00,180 >> Entón, cal é realmente a solución aquí? 221 00:10:00,180 --> 00:10:02,210 Ben, e necesitamos unha secuencia máis longa? 222 00:10:02,210 --> 00:10:03,960 Ben, quizais facelo 32 bytes. 223 00:10:03,960 --> 00:10:05,160 Ben, e se iso non é suficiente? 224 00:10:05,160 --> 00:10:06,040 Como preto de 64 bytes? 225 00:10:06,040 --> 00:10:07,080 E se isto non é suficiente? 226 00:10:07,080 --> 00:10:09,640 Como preto de 128 bytes ou 200? 227 00:10:09,640 --> 00:10:12,660 O que é realmente a solución aquí no caso xeral, se non sabe en 228 00:10:12,660 --> 00:10:14,460 avanzar o que o usuario vai escribir? 229 00:10:14,460 --> 00:10:20,000 230 00:10:20,000 --> 00:10:23,050 >> É só unha especie de gran dor na bunda, para ser honesto, é por iso que o 231 00:10:23,050 --> 00:10:29,050 Biblioteca CS50 ten algunhas decenas de liñas de código que aplicar colectivamente 232 00:10:29,050 --> 00:10:32,390 GetString corda dun xeito que non ten que saber con antelación o que o 233 00:10:32,390 --> 00:10:33,430 usuario vai escribir. 234 00:10:33,430 --> 00:10:37,370 En particular, se ollar cara atrás, cs50.c de dúas semanas, vai ver 235 00:10:37,370 --> 00:10:40,480 que realmente fai GetString non empregue scanf deste xeito. 236 00:10:40,480 --> 00:10:43,720 Pola contra, el le un carácter de cada vez. 237 00:10:43,720 --> 00:10:46,010 >> Porque a única cousa agradable sobre lectura dun personaxe é o que pudermos 238 00:10:46,010 --> 00:10:48,490 nós garante para sempre ter polo menos un carácter. 239 00:10:48,490 --> 00:10:51,740 Só podo declarar un char, e logo tomar estes pasos verdadeiramente bebé para só 240 00:10:51,740 --> 00:10:54,380 ler un personaxe nun tempo desde o teclado. 241 00:10:54,380 --> 00:10:58,240 E entón, o que vai ver GetString fai cada vez é quedar sen, 242 00:10:58,240 --> 00:11:02,280 digamos, 16 bytes de memoria, el usa malloc, ou un seu primo, o 243 00:11:02,280 --> 00:11:06,810 reservar máis memoria, copiando o antigo memoria para a nova, e, a continuación, rastreando 244 00:11:06,810 --> 00:11:09,900 xunto, obtendo un personaxe de cada vez, e cando se executa fóra do que 245 00:11:09,900 --> 00:11:13,370 anaco de memoria, xoga fóra, agarra unha porción maior de memoria, copie vello 246 00:11:13,370 --> 00:11:14,750 en novos e repite. 247 00:11:14,750 --> 00:11:18,480 E é realmente unha dor de verdade aplicar algo tan simple como 248 00:11:18,480 --> 00:11:19,710 a entrada dun usuario. 249 00:11:19,710 --> 00:11:21,090 >> Logo, pode usar scanf. 250 00:11:21,090 --> 00:11:22,430 Pode utilizar outras funcións semellantes. 251 00:11:22,430 --> 00:11:25,420 E unha morea de libros e en liña Exemplos facer, pero todos eles son 252 00:11:25,420 --> 00:11:27,210 vulnerable a problemas como este. 253 00:11:27,210 --> 00:11:29,550 E, finalmente, ser un segfault é medio chat. 254 00:11:29,550 --> 00:11:30,680 Non é bo para o usuario. 255 00:11:30,680 --> 00:11:33,560 >> Pero, no peor dos casos, o que fai fundamentalmente poñer o seu 256 00:11:33,560 --> 00:11:37,160 codificar en risco de? 257 00:11:37,160 --> 00:11:39,250 Algún tipo de ataque, potencialmente. 258 00:11:39,250 --> 00:11:41,680 Nós falamos sobre un tal ataque - rebosar do conxunto. 259 00:11:41,680 --> 00:11:44,660 Pero, en xeral, se está autorizado a un estourido de buffer, coma nós fixemos un 260 00:11:44,660 --> 00:11:48,070 Algunhas semanas atrás, con só escribir máis que "Ola" na pila, vostede 261 00:11:48,070 --> 00:11:52,330 realmente pode asumir, potencialmente, un ordenador, ou polo menos comezar a datos 262 00:11:52,330 --> 00:11:53,510 non pertence a vostede. 263 00:11:53,510 --> 00:11:55,970 >> Entón, en suma, é por iso que temos esas Rodas pequenas. 264 00:11:55,970 --> 00:11:59,090 Pero, agora, comezan a tiralas, como os nosos programas non precisa máis, 265 00:11:59,090 --> 00:12:00,610 necesariamente, a entrada do usuario. 266 00:12:00,610 --> 00:12:03,960 Pero, no caso de problema de definir seis anos, súa contribución virá dunha enorme 267 00:12:03,960 --> 00:12:07,520 ficheiro de dicionario con 150 uns impares mil palabras. 268 00:12:07,520 --> 00:12:10,330 >> Así, non terá que preocuparse entrada arbitraria do usuario. 269 00:12:10,330 --> 00:12:13,720 Imos darlle algunhas suposicións preto de arquivo. 270 00:12:13,720 --> 00:12:20,340 Calquera dúbida sobre punteiros ou scanf ou a entrada do usuario en xeral? 271 00:12:20,340 --> 00:12:24,450 >> Todo ben, entón unha rápida ollada entón nun fuga tema de dúas semanas. 272 00:12:24,450 --> 00:12:28,590 E que era esa noción dun struct. 273 00:12:28,590 --> 00:12:34,180 Non é que - esta noción dun struct, que era o que? 274 00:12:34,180 --> 00:12:35,430 Que struct facer por nós? 275 00:12:35,430 --> 00:12:39,280 276 00:12:39,280 --> 00:12:39,860 >> Definir - 277 00:12:39,860 --> 00:12:41,710 arrepentido? 278 00:12:41,710 --> 00:12:42,820 Axustar un tipo de variable. 279 00:12:42,820 --> 00:12:44,410 Entón, máis ou menos. 280 00:12:44,410 --> 00:12:46,180 En realidade, estamos combinando dous temas. 281 00:12:46,180 --> 00:12:49,510 Así, con typedef, lembre que podemos declarar un tipo de nosa propia, como un 282 00:12:49,510 --> 00:12:51,500 sinónimo, como cadea para char *. 283 00:12:51,500 --> 00:12:56,200 Pero o uso de typedef e struct, podemos realmente crear as nosas propias estruturas de datos. 284 00:12:56,200 --> 00:12:59,600 >> Por exemplo, se eu volver para o gedit aquí por só un momento, e eu vou adiante 285 00:12:59,600 --> 00:13:08,230 e facer algo así, déixeme gardar isto como, digamos, structs.c 286 00:13:08,230 --> 00:13:10,840 temporalmente, eu só vou para ir adiante e inclúen 287 00:13:10,840 --> 00:13:14,360 standardio.h, int void main. 288 00:13:14,360 --> 00:13:18,960 E entón, aquí, imos supor que quero para escribir un programa que almacena 289 00:13:18,960 --> 00:13:21,840 varios alumnos de varios vivendas, por exemplo. 290 00:13:21,840 --> 00:13:24,430 Entón, é como un registrarial base de datos de calquera tipo. 291 00:13:24,430 --> 00:13:29,550 >> Entón, se eu teño do nome dun estudante, eu podería facer algo así co nome de char *, 292 00:13:29,550 --> 00:13:31,570 e eu vou facer algo así - 293 00:13:31,570 --> 00:13:34,410 de feito, imos usar a biblioteca CS50 por só un momento para facer deste un 294 00:13:34,410 --> 00:13:38,380 pouco máis simple, para que poidamos prestar esas decenas de liñas de código. 295 00:13:38,380 --> 00:13:39,340 E imos mantelo simple. 296 00:13:39,340 --> 00:13:42,610 Imos mantelo cadea, e agora GetString. 297 00:13:42,610 --> 00:13:47,420 >> Entón eu afirmo agora que eu teño gardado o nome dalgún alumno, ea casa de 298 00:13:47,420 --> 00:13:50,240 algún alumno, simplemente usando variables como fixemos e nunha semana. 299 00:13:50,240 --> 00:13:52,370 Pero supoño que agora queren apoiar varios alumnos. 300 00:13:52,370 --> 00:13:58,460 Moi ben, os meus instintos están facendo corda nome2, queda GetString, corda 301 00:13:58,460 --> 00:14:01,370 house2 queda GetString. 302 00:14:01,370 --> 00:14:05,850 E entón o noso terceiro estudante, imos facer name3 GetString. 303 00:14:05,850 --> 00:14:09,170 >> Todo ben, entón iso é sorte impresionante como unha especie de idiota, 304 00:14:09,170 --> 00:14:11,580 porque este proceso é realmente nunca vai acabar, e ela só vai 305 00:14:11,580 --> 00:14:13,130 facer o meu código parece peor e peor e peor. 306 00:14:13,130 --> 00:14:14,810 Pero nós resolvemos iso tamén en dúas semanas. 307 00:14:14,810 --> 00:14:19,450 Cal foi a nosa solución relativamente limpa cando tivemos múltiples variables do 308 00:14:19,450 --> 00:14:23,580 mesmo tipo de datos que están relacionados, pero nós non queremos esa confusión atroz 309 00:14:23,580 --> 00:14:26,870 de variables de nome semellante? 310 00:14:26,870 --> 00:14:30,060 O que imos facer no seu canto? 311 00:14:30,060 --> 00:14:31,260 >> Entón, eu creo que escoitei nalgúns lugares. 312 00:14:31,260 --> 00:14:32,590 Tivemos unha matriz. 313 00:14:32,590 --> 00:14:37,110 Se quere varias instancias do algo, por que non imos limpar iso todo 314 00:14:37,110 --> 00:14:39,540 e só dicir, darme array chamado nomes? 315 00:14:39,540 --> 00:14:41,640 >> E, polo de agora, imos 3 código duro. 316 00:14:41,640 --> 00:14:44,450 E entón me dar outro array chamados casas, e deixar-me por 317 00:14:44,450 --> 00:14:45,800 agora ríxido código 3. 318 00:14:45,800 --> 00:14:49,220 E eu masivamente limpou o desorde que acaba de crear. 319 00:14:49,220 --> 00:14:52,400 Agora eu codificado 3, pero aínda o 3 podería vir dinamicamente a partir da 320 00:14:52,400 --> 00:14:54,350 usuario ou argv, ou semellantes. 321 00:14:54,350 --> 00:14:55,720 Entón, iso xa é máis limpo. 322 00:14:55,720 --> 00:15:00,100 >> Pero o que é irritante sobre iso é que agora, aínda que o nome é dalgunha forma 323 00:15:00,100 --> 00:15:02,280 fundamentalmente ligada á casa dun alumno - 324 00:15:02,280 --> 00:15:04,720 é un estudante que realmente quere representar - 325 00:15:04,720 --> 00:15:08,080 Agora teño dúas matrices que son paralelas no sentido de que son os 326 00:15:08,080 --> 00:15:13,930 mesmo tamaño, e os nomes de soporte 0 presuntamente mapas para vivendas apoio 0, 327 00:15:13,930 --> 00:15:16,600 e os nomes de Soporte 1 mapas ás casas soporte 1. 328 00:15:16,600 --> 00:15:19,280 Noutras palabras, que o alumno vive aquela casa, e que outro alumno 329 00:15:19,280 --> 00:15:20,530 que vive en outra casa. 330 00:15:20,530 --> 00:15:23,720 Pero, por suposto, iso se pode feito aínda máis limpa. 331 00:15:23,720 --> 00:15:24,990 >> Ben, isto pode, de feito. 332 00:15:24,990 --> 00:15:28,730 E déixeme ir adiante e abrir se structs.h, e vai 333 00:15:28,730 --> 00:15:31,130 vexa esta idea aquí. 334 00:15:31,130 --> 00:15:34,905 Repare que eu usei typedef, como alusión a un momento atrás, para declarar o noso 335 00:15:34,905 --> 00:15:35,570 tipo de datos propio. 336 00:15:35,570 --> 00:15:39,660 Pero eu tamén está a usar esoutra contrasinal chamado struct que me dá un novo 337 00:15:39,660 --> 00:15:40,790 estrutura de datos. 338 00:15:40,790 --> 00:15:43,980 >> E esa estrutura de datos que afirman que ter dúas cousas no interior da 339 00:15:43,980 --> 00:15:47,060 - Unha cadea chamada nome, e unha serie chamada casa. 340 00:15:47,060 --> 00:15:49,820 E o nome que eu vou dar para esta estrutura de datos que 341 00:15:49,820 --> 00:15:51,005 a ser chamado de estudante. 342 00:15:51,005 --> 00:15:54,030 Podería chamalo de calquera cousa que quero, pero semanticamente facer 343 00:15:54,030 --> 00:15:55,810 sentido para min na miña mente. 344 00:15:55,810 --> 00:15:59,160 >> Entón, agora, se eu abrir unha versión mellor do programa comece a escribir 345 00:15:59,160 --> 00:16:00,390 alí, déixeme ir ata o cumio. 346 00:16:00,390 --> 00:16:03,190 E hai máis algunhas liñas de código aquí, pero déixeme concentrarse para 347 00:16:03,190 --> 00:16:04,160 o momento en un. 348 00:16:04,160 --> 00:16:07,790 Eu xa declarou unha constante chamada estudantes e codificado 3 de momento. 349 00:16:07,790 --> 00:16:11,110 Pero agora, teña en conta como limpa meu código empeza a quedarse. 350 00:16:11,110 --> 00:16:15,030 >> Na liña 22, declaro conxunto de alumnos. 351 00:16:15,030 --> 00:16:18,760 E noten que o alumno é, ao parecer, agora un tipo de datos. 352 00:16:18,760 --> 00:16:23,360 Porque a principios deste arquivo, teña en conta Eu inclúe o arquivo de cabeceira 353 00:16:23,360 --> 00:16:24,820 que eu puxei só un momento atrás. 354 00:16:24,820 --> 00:16:28,820 E ese ficheiro de cabeceira simplemente tiña esta definición dun estudante. 355 00:16:28,820 --> 00:16:32,470 >> Entón, agora, eu creei meus propios datos personalizados tipo que os autores do C anos 356 00:16:32,470 --> 00:16:33,890 atrás non pensar con antelación. 357 00:16:33,890 --> 00:16:34,570 Pero non hai problema. 358 00:16:34,570 --> 00:16:35,870 Podo facelo só. 359 00:16:35,870 --> 00:16:39,050 Polo tanto, esta é unha matriz chamada estudantes, cada un dos membros cuxos 360 00:16:39,050 --> 00:16:41,100 é unha estrutura do estudante. 361 00:16:41,100 --> 00:16:44,270 E quero que tres deses na matriz. 362 00:16:44,270 --> 00:16:46,030 >> E agora, o que fai o resto deste programa fai? 363 00:16:46,030 --> 00:16:47,550 Eu precisaba de algo un pouco arbitraria. 364 00:16:47,550 --> 00:16:51,450 Así, a partir liña 24 en diante, Eu iterado de 0 a 3. 365 00:16:51,450 --> 00:16:54,000 Eu, entón, pedir ao usuario para o nome do alumno. 366 00:16:54,000 --> 00:16:56,110 E entón eu uso GetString como antes. 367 00:16:56,110 --> 00:16:59,410 Entón eu pregunto á casa do alumno, e eu uso GetString como antes. 368 00:16:59,410 --> 00:17:01,780 >> Pero aviso - algo novo peza de sintaxe - 369 00:17:01,780 --> 00:17:07,010 Aínda podo índice para o i-th estudante, pero como fago para obter os datos específicos 370 00:17:07,010 --> 00:17:08,354 campo dentro da estrutura? 371 00:17:08,354 --> 00:17:11,770 Ben, o que é, ao parecer, a nova peza de sintaxe? 372 00:17:11,770 --> 00:17:13,339 É só o operador punto. 373 00:17:13,339 --> 00:17:14,510 >> Nós non temos realmente ver iso antes. 374 00:17:14,510 --> 00:17:17,819 Xa viu iso en pset cinco, se ten dicir xa con arquivos de mapa de bits. 375 00:17:17,819 --> 00:17:22,372 Pero o punto significa só dentro deste struct ou varios campos, dar punto 376 00:17:22,372 --> 00:17:24,510 nome, ou me dar dot casa. 377 00:17:24,510 --> 00:17:28,690 Isto significa ir a dentro da estrutura e obter os campos específicos. 378 00:17:28,690 --> 00:17:30,200 >> O que fai o resto deste programa fai? 379 00:17:30,200 --> 00:17:31,190 Non é todo o que sexy. 380 00:17:31,190 --> 00:17:34,640 Teña en conta que unha iteración de 0 a 3, de novo, e eu simplemente crear un inglés 381 00:17:34,640 --> 00:17:40,500 frase como fulano de tal está en tal e tal casa, pasando en nome de punto de 382 00:17:40,500 --> 00:17:43,320 o i-th alumno ea súa casa tamén. 383 00:17:43,320 --> 00:17:47,560 >> E entón, finalmente, agora imos comezar a ter anal con iso, agora que estamos 384 00:17:47,560 --> 00:17:49,580 familiarizado co que malloc e outras funcións fosen 385 00:17:49,580 --> 00:17:50,570 facendo todo este tempo. 386 00:17:50,570 --> 00:17:54,220 Por que eu teño de liberar tanto o nome ea casa, a pesar de eu 387 00:17:54,220 --> 00:17:56,960 non chamar malloc? 388 00:17:56,960 --> 00:17:58,020 >> GetString fixo. 389 00:17:58,020 --> 00:18:00,930 E ese foi o pequeno segredo sucio para varias semanas, pero ten GetString 390 00:18:00,930 --> 00:18:03,530 ser baleirado de memoria en todo o poñer todo o semestre ata o momento. 391 00:18:03,530 --> 00:18:05,990 E Valgrand vai finalmente revelar iso para nós. 392 00:18:05,990 --> 00:18:10,730 >> Pero non é un gran negocio, porque sei que podo simplemente liberar o nome 393 00:18:10,730 --> 00:18:15,750 ea casa, a pesar de, tecnicamente, a ser super, super seguro, eu debería ser 394 00:18:15,750 --> 00:18:17,890 facer algunha comprobación de erros aquí. 395 00:18:17,890 --> 00:18:19,040 Cales son os seus instintos dicindo? 396 00:18:19,040 --> 00:18:22,480 Que debo estar comprobando antes de liberar o que é un 397 00:18:22,480 --> 00:18:25,470 cadea, aka que un char *? 398 00:18:25,470 --> 00:18:33,460 >> Realmente debería estar comprobando se os alumnos soporte i nome dot non 399 00:18:33,460 --> 00:18:34,840 igual nulo. 400 00:18:34,840 --> 00:18:40,400 A continuación, el vai estar ben para ir adiante e libre ese punteiro, e mesmo ou outro 401 00:18:40,400 --> 00:18:41,160 un ben. 402 00:18:41,160 --> 00:18:46,860 Se os alumnos soporte i dot casa non é igual a cero, que agora vai protexer 403 00:18:46,860 --> 00:18:52,520 contra o canto caso en que GetString devolve algo como nulo. 404 00:18:52,520 --> 00:18:57,310 E vimos hai pouco, printf vai protexer-nos aquí só dicindo 405 00:18:57,310 --> 00:18:58,990 nulo, o que se ve raro. 406 00:18:58,990 --> 00:19:02,340 Pero polo menos non vai segfault, como xa vimos. 407 00:19:02,340 --> 00:19:05,990 >> Ben, deixe-me facer outra cousa aquí. structs-0 é un tipo de programa estúpido 408 00:19:05,990 --> 00:19:09,700 porque eu entro todos estes datos e, a continuación, perdeu xa que o programa remata. 409 00:19:09,700 --> 00:19:10,940 Pero déixeme ir adiante e facelo. 410 00:19:10,940 --> 00:19:12,830 Deixe-me facer a terminal fiestra un pouco maior. 411 00:19:12,830 --> 00:19:17,000 Deixe-me facer-estruturas 1, que é unha nova versión deste. 412 00:19:17,000 --> 00:19:18,520 >> Vou ampliar un pouco. 413 00:19:18,520 --> 00:19:21,620 E agora déixeme executar dot reducir estruturas-1. 414 00:19:21,620 --> 00:19:22,590 Nome do alumno - 415 00:19:22,590 --> 00:19:31,500 David Mather, imos facer Rob Kirkland, imos facer Lauren Leverett. 416 00:19:31,500 --> 00:19:33,650 O que é interesante é agora aviso - 417 00:19:33,650 --> 00:19:35,540 e eu só sei diso porque Eu escribín o programa - 418 00:19:35,540 --> 00:19:38,930 hai un arquivo agora na miña actual directorio chamado students.csv. 419 00:19:38,930 --> 00:19:40,420 Algúns de vostedes poden ver estes no mundo real. 420 00:19:40,420 --> 00:19:42,980 >> ¿Que é un ficheiro CSV? 421 00:19:42,980 --> 00:19:44,170 Os valores separados por comas. 422 00:19:44,170 --> 00:19:46,670 É como unha especie de home pobre versión dun arquivo de Excel. 423 00:19:46,670 --> 00:19:50,580 É unha táboa de liñas e columnas que pode abrir nun programa como Excel, 424 00:19:50,580 --> 00:19:51,800 ou os números en un Mac 425 00:19:51,800 --> 00:19:55,180 >> E se eu abrir o ficheiro aquí en gedit, aviso - e os números non están alí. 426 00:19:55,180 --> 00:19:57,360 Isto é só gedit dicindo me os números de liña. 427 00:19:57,360 --> 00:19:59,740 Teña en conta a primeira liña deste ficheiro é David e Mather. 428 00:19:59,740 --> 00:20:01,450 A seguinte liña é Rob comas Kirkland. 429 00:20:01,450 --> 00:20:04,170 E a terceira liña é Lauren comas Leverett. 430 00:20:04,170 --> 00:20:05,480 >> Entón, o que eu creei? 431 00:20:05,480 --> 00:20:09,580 Eu xa escribín un programa en C que efectivamente pode xerar follas de cálculo 432 00:20:09,580 --> 00:20:11,840 que pode ser aberto nunha programa como Excel. 433 00:20:11,840 --> 00:20:15,520 Non todo o que obrigar un conxunto de datos, pero se ten anacos moi grandes de 434 00:20:15,520 --> 00:20:18,440 datos que realmente quere manipular e facer gráficos de e 435 00:20:18,440 --> 00:20:21,260 como, este é quizais un forma de crear eses datos. 436 00:20:21,260 --> 00:20:25,370 Ademais, CSVs son realmente super-común só para almacenar datos simple - 437 00:20:25,370 --> 00:20:28,940 Yahoo Finance, por exemplo, se recibe presupostos de accións a través do seu nome 438 00:20:28,940 --> 00:20:33,180 API, o servizo gratuíto que permite que estea en stock, up-to-the-data actual 439 00:20:33,180 --> 00:20:35,650 citas para as empresas, que dar os datos de volta o 440 00:20:35,650 --> 00:20:37,800 Super formato CSV simple. 441 00:20:37,800 --> 00:20:39,380 >> Entón, como imos facelo? 442 00:20:39,380 --> 00:20:42,530 Ben notar, a maior parte deste programa de case iguais. 443 00:20:42,530 --> 00:20:46,870 Pero teña en conta-se aquí, en vez de impresión estudantes a fóra, na liña 35 444 00:20:46,870 --> 00:20:51,040 á fronte, eu reclamo que estou gardando o estudantes en disco, para gardar un arquivo. 445 00:20:51,040 --> 00:20:53,630 >> Entón, repare que estou declarando un FILE * - 446 00:20:53,630 --> 00:20:57,260 Agora, iso é unha especie de anomalía no C. Por algunha razón, o FILE é todas as tapas, 447 00:20:57,260 --> 00:21:00,690 o que non é como a maioría dos outros tipos de datos en C. Pero este é un built-in 448 00:21:00,690 --> 00:21:02,320 tipo de datos, FILE *. 449 00:21:02,320 --> 00:21:05,900 E eu estou declarando un punteiro a un ficheiro, é como pode pensar niso. 450 00:21:05,900 --> 00:21:08,070 >> fopen significa ficheiro aberto. 451 00:21:08,070 --> 00:21:09,470 O ficheiro que quere abrir? 452 00:21:09,470 --> 00:21:12,620 Quero abrir un arquivo que eu vou arbitrariamente chamar students.csv. 453 00:21:12,620 --> 00:21:14,480 Podería chamar iso de calquera cousa que eu queira. 454 00:21:14,480 --> 00:21:15,200 >> E, a continuación, dar un palpite. 455 00:21:15,200 --> 00:21:18,960 O que fai o segundo argumento para fopen probablemente significa? 456 00:21:18,960 --> 00:21:21,480 Seguro, w para escribir, podería ser r para lectura. 457 00:21:21,480 --> 00:21:24,120 Hai unha para achegar se quere engadir liñas e non 458 00:21:24,120 --> 00:21:25,200 substituír a cousa toda. 459 00:21:25,200 --> 00:21:28,005 >> Pero eu só quero crear esta imaxe unha vez, polo que vou usar cita unquote w. 460 00:21:28,005 --> 00:21:31,880 E sei que só de ler a documentación, ou a páxina de manual. 461 00:21:31,880 --> 00:21:35,100 O ficheiro non é nulo - noutras palabras, Se nada deu mal alí - 462 00:21:35,100 --> 00:21:37,820 déixeme repetir ao longo do os alumnos de 0 a 3. 463 00:21:37,820 --> 00:21:40,410 >> E agora entende que hai algo sempre así lixeiramente diferente 464 00:21:40,410 --> 00:21:42,110 sobre a liña 41 aquí. 465 00:21:42,110 --> 00:21:42,960 Non é printf. 466 00:21:42,960 --> 00:21:46,530 É fprintf ao arquivo printf. 467 00:21:46,530 --> 00:21:47,790 Entón, que vai escribir no ficheiro. 468 00:21:47,790 --> 00:21:48,860 Que arquivo? 469 00:21:48,860 --> 00:21:53,630 Aquel cuxo punteiro que especifique como o primeiro argumento. 470 00:21:53,630 --> 00:21:55,940 >> Entón nós especifica unha secuencia de formato. 471 00:21:55,940 --> 00:21:59,660 Logo, especifique o Barbante queremos plugin para o primeiro por cento s, e 472 00:21:59,660 --> 00:22:04,320 logo outra variable ou a segunda por cento s. 473 00:22:04,320 --> 00:22:06,760 Despois, peche o ficheiro con fclose. 474 00:22:06,760 --> 00:22:09,380 Que liberar a memoria como antes, aínda que Eu debería volver e engadir 475 00:22:09,380 --> 00:22:10,540 algunhas comprobacións para null. 476 00:22:10,540 --> 00:22:12,090 >> E é iso. 477 00:22:12,090 --> 00:22:16,960 fopen, fprintf, fclose dáme a capacidade de crear arquivos de texto. 478 00:22:16,960 --> 00:22:19,640 Agora, vai ver problema en conxunto de cinco, que implica foto que vai empregar 479 00:22:19,640 --> 00:22:20,990 ficheiros binarios vez. 480 00:22:20,990 --> 00:22:24,200 Pero, fundamentalmente, a idea é a mesma, aínda que as funcións que vai 481 00:22:24,200 --> 00:22:28,710 ver é un pouco diferente. 482 00:22:28,710 --> 00:22:32,580 >> Entón rápido tour, pero vai ter moi familiarizado co arquivo I/O-- 483 00:22:32,580 --> 00:22:34,960 entrada e saída - con pset cinco. 484 00:22:34,960 --> 00:22:38,607 E calquera dúbida sobre a fundamentos iniciais aquí? 485 00:22:38,607 --> 00:22:39,857 Si? 486 00:22:39,857 --> 00:22:41,880 487 00:22:41,880 --> 00:22:43,710 >> E se intenta liberar un valor nulo? 488 00:22:43,710 --> 00:22:48,880 Eu creo que, a menos que obteña a libre algo máis amigable, pode 489 00:22:48,880 --> 00:22:49,890 potencialmente segfault. 490 00:22:49,890 --> 00:22:54,160 Pasando-o nulo é malo porque non cren libre preocupa en comprobar a ti, 491 00:22:54,160 --> 00:22:57,330 porque sería potencialmente un desperdicio de tempo para que faga a si mesmo para 492 00:22:57,330 --> 00:22:59,022 todo o mundo. 493 00:22:59,022 --> 00:23:00,590 Boa pregunta, con todo. 494 00:23:00,590 --> 00:23:04,300 >> Todo ben, entón este tipo de queda nos a un tema interesante. 495 00:23:04,300 --> 00:23:07,010 O tema do conxunto de problemas cinco é forense. 496 00:23:07,010 --> 00:23:08,420 Polo menos esa é a parte do conxunto de problemas. 497 00:23:08,420 --> 00:23:12,030 Forensics xeralmente se refire á recuperación de información que poden ou 498 00:23:12,030 --> 00:23:14,110 non pode ser eliminado deliberadamente. 499 00:23:14,110 --> 00:23:18,680 E entón eu penso que eu ía darlle un rápido gusto do que realmente está a suceder en todos os 500 00:23:18,680 --> 00:23:21,230 esta vez baixo o capa de computador. 501 00:23:21,230 --> 00:23:23,960 >> Por exemplo, se ten dentro do seu portátil ou ordenador de mesa a 502 00:23:23,960 --> 00:23:28,040 disco duro, ou é un mecánico dispositivo que realmente xira - 503 00:23:28,040 --> 00:23:31,650 hai cousas circulares chamados platters parecer moito co que me 504 00:23:31,650 --> 00:23:34,540 só tiña na pantalla aquí, aínda que esta é a escola cada vez máis vello. 505 00:23:34,540 --> 00:23:37,370 Esta é unha de tres e media polgadas disco duro. 506 00:23:37,370 --> 00:23:40,070 E tres centímetros e medio refire-se de coa cousa cando instala-lo 507 00:23:40,070 --> 00:23:40,890 nun ordenador. 508 00:23:40,890 --> 00:23:44,890 >> Moitos de vostedes nos seus portátiles agora teñen drives de estado sólido, ou SSD, 509 00:23:44,890 --> 00:23:46,260 que non teñen partes móbiles. 510 00:23:46,260 --> 00:23:49,170 Son máis como RAM e menos como estes dispositivos mecánicos. 511 00:23:49,170 --> 00:23:51,450 Pero as ideas aínda son os mesmos, seguramente como se relacionan 512 00:23:51,450 --> 00:23:52,790 ao problema de definir cinco. 513 00:23:52,790 --> 00:23:57,400 >> E se pensar agora un disco duro supón ser un círculo, que 514 00:23:57,400 --> 00:23:58,930 Vou debuxar como este aquí. 515 00:23:58,930 --> 00:24:02,290 Cando se crea un ficheiro no seu ordenador, se é un SSD, ou en 516 00:24:02,290 --> 00:24:06,610 Neste caso, unha antiga escola de disco duro, este ficheiro está composto por varios bits. 517 00:24:06,610 --> 00:24:10,510 Digamos que é este 0 e 1, unha morea de 0s e 1s. 518 00:24:10,510 --> 00:24:11,660 Polo tanto, este é o meu disco duro enteiro. 519 00:24:11,660 --> 00:24:13,225 É dicir, ao parecer, un arquivo moi grande. 520 00:24:13,225 --> 00:24:18,080 E está a usar a 0s e 1s na que porción do prato física. 521 00:24:18,080 --> 00:24:19,750 >> Ben, o que é a parte física? 522 00:24:19,750 --> 00:24:25,310 Pois ben, resulta que nun disco duro, polo menos deste tipo, non hai 523 00:24:25,310 --> 00:24:27,340 esas minúsculas partículas magnéticas. 524 00:24:27,340 --> 00:24:32,630 E eles teñen esencialmente norte e polos sur para eles, de xeito que se 525 00:24:32,630 --> 00:24:35,710 transformar unha desas partículas magnéticas Deste xeito, pode-se dicir que é 526 00:24:35,710 --> 00:24:36,720 representando un 1. 527 00:24:36,720 --> 00:24:39,340 E se é de cabeza para baixo ao sur para norte, pódese dicir que é 528 00:24:39,340 --> 00:24:40,390 representa un 0. 529 00:24:40,390 --> 00:24:43,660 >> Así, no mundo físico real, que é como pode representar algo en 530 00:24:43,660 --> 00:24:45,670 Estado binario de 0 a 1 e un. 531 00:24:45,670 --> 00:24:46,720 Entón, iso é todo o que un arquivo é. 532 00:24:46,720 --> 00:24:49,300 Hai unha morea de magnético partículas que son deste xeito ou a súa 533 00:24:49,300 --> 00:24:51,920 Deste xeito, a creación de estándares de 0s e 1s. 534 00:24:51,920 --> 00:24:56,760 >> Pero resulta que cando salva un ficheiro, unha información son gardadas por separado. 535 00:24:56,760 --> 00:25:00,000 Polo tanto, esta é unha pequena mesa, un directorio, por así dicir. 536 00:25:00,000 --> 00:25:05,810 E eu vou chamar este nome de columna e Vou chamar a este lugar columna. 537 00:25:05,810 --> 00:25:08,850 >> E eu vou dicir, supoña este é o meu currículo. 538 00:25:08,850 --> 00:25:14,050 O meu RESUME.DOC almacénase a localización, imos dicir 123. 539 00:25:14,050 --> 00:25:15,390 Sempre vou a ese número. 540 00:25:15,390 --> 00:25:18,810 Pero basta dicir que, así como na memoria RAM, pode levar un disco duro 541 00:25:18,810 --> 00:25:22,350 iso é un gigabyte ou 200 gigabytes ou un terabytes, e pode 542 00:25:22,350 --> 00:25:23,750 número de todos os bytes. 543 00:25:23,750 --> 00:25:26,480 Podes enumerar todos os bloques de 8 bits. 544 00:25:26,480 --> 00:25:29,030 >> Entón, imos dicir que este é a localización 123. 545 00:25:29,030 --> 00:25:32,070 Polo tanto, este directorio dentro do meu ordenador sistema recorda que o meu 546 00:25:32,070 --> 00:25:34,250 currículo é no lugar 123. 547 00:25:34,250 --> 00:25:36,850 Pero torna-se interesante cando apaga un arquivo. 548 00:25:36,850 --> 00:25:37,820 >> Así, por exemplo - 549 00:25:37,820 --> 00:25:40,790 e, por sorte, a maior parte do mundo ten peguei para iso - o que ocorre cando 550 00:25:40,790 --> 00:25:45,040 arrastrar un ficheiro para o seu sistema operativo Mac Trash ou a papeleira de Windows? 551 00:25:45,040 --> 00:25:48,290 552 00:25:48,290 --> 00:25:50,510 Cal é o propósito de facelo? 553 00:25:50,510 --> 00:25:53,860 É, obviamente, para librarse do ficheiro, pero o que fai o acto de arrastrar e 554 00:25:53,860 --> 00:25:57,550 caer no seu lixo ou o seu Lixo facer nun ordenador? 555 00:25:57,550 --> 00:25:59,230 >> Absolutamente nada, en realidade. 556 00:25:59,230 --> 00:26:00,320 É como un cartafol. 557 00:26:00,320 --> 00:26:01,800 É un cartafol especial, para estar seguro. 558 00:26:01,800 --> 00:26:04,460 Pero será que isto realmente eliminar o ficheiro? 559 00:26:04,460 --> 00:26:06,780 >> Ben, non, porque algúns de vostedes probablemente ser, oh caramba, non fixo 560 00:26:06,780 --> 00:26:07,420 quero facelo. 561 00:26:07,420 --> 00:26:09,130 Así que premer dúas veces o Trash ou papeleira. 562 00:26:09,130 --> 00:26:11,630 Vostede cutucou arredor e recuperou o ficheiro só arrastrando o 563 00:26:11,630 --> 00:26:12,110 de alí. 564 00:26:12,110 --> 00:26:14,420 Entón, claramente, non é necesariamente excluílo. 565 00:26:14,420 --> 00:26:15,990 >> OK, vostede é máis intelixente do que iso. 566 00:26:15,990 --> 00:26:18,860 Vostede sabe que só arrastrando-o para o Trash ou papeleira non significa 567 00:26:18,860 --> 00:26:19,930 vostede baleirar lixo. 568 00:26:19,930 --> 00:26:24,110 Entón vai ata o menú, e dis Baleirar papeleira ou Baleirar papeleira. 569 00:26:24,110 --> 00:26:25,360 Entón o que ocorre? 570 00:26:25,360 --> 00:26:29,070 571 00:26:29,070 --> 00:26:32,530 >> Si, por iso é eliminada máis. 572 00:26:32,530 --> 00:26:37,660 Pero todo o que pasa é o seguinte. 573 00:26:37,660 --> 00:26:45,350 O ordenador se esquece de onde RESUME.DOC era. 574 00:26:45,350 --> 00:26:47,400 >> Pero o que non cambiou, ao parecer, na foto? 575 00:26:47,400 --> 00:26:51,390 576 00:26:51,390 --> 00:26:55,570 Os bits, os 0s e 1s que eu afirmo é no lugar dalgún aspecto físico 577 00:26:55,570 --> 00:26:56,280 o hardware. 578 00:26:56,280 --> 00:26:57,110 Eles aínda están alí. 579 00:26:57,110 --> 00:26:58,930 É só o ordenador ten esqueceu o que son. 580 00:26:58,930 --> 00:27:03,160 >> Polo tanto, é esencialmente libre do arquivo bits de xeito que poden ser reutilizados. 581 00:27:03,160 --> 00:27:06,940 Pero non ata que cree máis arquivos, e máis arquivos e máis arquivos serán 582 00:27:06,940 --> 00:27:12,150 probabilisticamente, os 0s e 1s, aquelas partículas magnéticas, son reutilizados, 583 00:27:12,150 --> 00:27:16,220 de cabeza ou do lado dereito cara arriba, outros arquivos, 0s e 1s. 584 00:27:16,220 --> 00:27:17,980 >> Así que ten esta xanela de tempo. 585 00:27:17,980 --> 00:27:19,860 E non é de previsible lonxitude, realmente. 586 00:27:19,860 --> 00:27:22,240 Depende do tamaño do seu disco unidade e cantos arquivos tes e 587 00:27:22,240 --> 00:27:23,490 o; rápido facer novos. 588 00:27:23,490 --> 00:27:27,050 Pero hai esta xanela de tempo durante o que o ficheiro aínda é perfectamente 589 00:27:27,050 --> 00:27:27,770 recuperable. 590 00:27:27,770 --> 00:27:31,050 >> Entón, se non usar programas como o McAfee ou Norton para intentar recuperar 591 00:27:31,050 --> 00:27:35,680 de datos, todo o que estamos facendo é tratar de recuperar este chamado directorio para 592 00:27:35,680 --> 00:27:37,340 descubrir onde o arquivo foi. 593 00:27:37,340 --> 00:27:40,605 E ás veces Norton e dirá: ficheiro é de 93% recuperable. 594 00:27:40,605 --> 00:27:42,020 Ben, o que significa isto? 595 00:27:42,020 --> 00:27:45,690 Isto só significa que algún outro arquivo casualmente acabo mediante, por exemplo, 596 00:27:45,690 --> 00:27:48,920 eses bits fóra do seu ficheiro orixinal. 597 00:27:48,920 --> 00:27:51,950 >> Entón, o que está realmente involucrado na recuperación de datos? 598 00:27:51,950 --> 00:27:55,720 Ben, se non ten algo parecido Norton preinstalado no seu computador, 599 00:27:55,720 --> 00:27:59,510 o mellor que ás veces pode facer é ollar en todo o disco duro buscando 600 00:27:59,510 --> 00:28:00,510 patróns de bits. 601 00:28:00,510 --> 00:28:05,350 E un dos temas do conxunto de problemas cinco é que vai buscar a 602 00:28:05,350 --> 00:28:09,570 equivalente a un disco duro, un forense imaxe dun tarxeta de memoria flash compacto dende un 603 00:28:09,570 --> 00:28:13,660 cámara dixital, buscando a 0s 1s e que normalmente, con elevada 604 00:28:13,660 --> 00:28:16,720 probabelmente, representan o inicio dunha imaxe JPEG. 605 00:28:16,720 --> 00:28:21,120 >> E vostedes poden recuperar aquelas imaxes por supoñendo que, se eu vexo ese patrón de 606 00:28:21,120 --> 00:28:24,380 bits na imaxe forense, con elevada probabilidade, que marca 607 00:28:24,380 --> 00:28:25,650 o inicio dun JPEG. 608 00:28:25,650 --> 00:28:29,520 E se eu ver o mesmo patrón de novo, que probablemente marca o inicio 609 00:28:29,520 --> 00:28:32,440 outro JPEG, e outro JPEG, e outro JPEG. 610 00:28:32,440 --> 00:28:34,970 E este é tipicamente como recuperación de datos vai funcionar. 611 00:28:34,970 --> 00:28:37,870 Que é agradable sobre JPEGs o é formato de ficheiro en si é algo 612 00:28:37,870 --> 00:28:44,400 complexo, ao comezo de cada tal ficheiro é realmente moi identificable 613 00:28:44,400 --> 00:28:47,370 e sinxela, como podes ver, Se non ten xa. 614 00:28:47,370 --> 00:28:50,270 >> Entón, imos dar un ollo debaixo o capó como a exactamente o que foi 615 00:28:50,270 --> 00:28:53,360 pasando, e que estes 0s e 1s son, para darlle un pouco máis dun 616 00:28:53,360 --> 00:28:55,330 contexto para este desafío particular. 617 00:28:55,330 --> 00:28:55,510 >> [REPRODUCIÓN] 618 00:28:55,510 --> 00:28:58,700 >> -Onde seu ordenador almacena máis dos seus datos permanentes. 619 00:28:58,700 --> 00:29:03,390 Para iso, os datos viaxan de RAM xunto con sinais de software que din 620 00:29:03,390 --> 00:29:06,110 o disco duro como almacenar eses datos. 621 00:29:06,110 --> 00:29:09,410 Os circuítos do disco duro traducir eses sinais en tensión 622 00:29:09,410 --> 00:29:10,870 flutuacións. 623 00:29:10,870 --> 00:29:14,970 Estes, á súa vez, controlan o disco duro do partes móbiles, algúns dos poucos 624 00:29:14,970 --> 00:29:17,910 partes móbiles deixados no ordenador moderno. 625 00:29:17,910 --> 00:29:22,130 >> Algúns dos sinais de control dun motor que xira bandexas de metal recubertas. 626 00:29:22,130 --> 00:29:25,470 Os seus datos son realmente almacenados sobre estas travesas. 627 00:29:25,470 --> 00:29:28,610 Outros signos de mover a lectura / escritura cabezas de lectura ou 628 00:29:28,610 --> 00:29:30,710 gardar datos sobre os pratos. 629 00:29:30,710 --> 00:29:35,450 Esta máquina tan preciso que un ser humano pelo non podería mesmo pasar entre a 630 00:29:35,450 --> 00:29:37,280 cabezas e pratos xiratorios. 631 00:29:37,280 --> 00:29:40,316 Con todo, todo funciona en velocidades incribles. 632 00:29:40,316 --> 00:29:40,660 >> [FIN reprodución de vídeo] 633 00:29:40,660 --> 00:29:42,190 >> DAVID Malan: Zoom nun pouco máis profunda agora o que está 634 00:29:42,190 --> 00:29:44,360 realmente neses pratos. 635 00:29:44,360 --> 00:29:44,720 >> [REPRODUCIÓN] 636 00:29:44,720 --> 00:29:47,660 >> -Vexamos o que acabamos de vin en cámara lenta. 637 00:29:47,660 --> 00:29:51,710 Cando un breve pulso de electricidade é enviado a cabeza de lectura / gravación, se vira 638 00:29:51,710 --> 00:29:54,650 nunha pequena electromagnética para unha fracción de segundo. 639 00:29:54,650 --> 00:29:58,970 O imán crea un campo, que cambia a polaridade dun pequeno, minúsculo 640 00:29:58,970 --> 00:30:02,850 parte das partículas metálicas que abrigo de cada superficie do prato. 641 00:30:02,850 --> 00:30:05,940 >> A serie estándar destes pequenos, cobra ata áreas no disco 642 00:30:05,940 --> 00:30:08,470 representa un único bit datos no número binario 643 00:30:08,470 --> 00:30:10,530 sistema usado polos ordenadores. 644 00:30:10,530 --> 00:30:13,775 Agora, se a corrente é enviada unha forma a través da lectura / escritura cabeza, a área 645 00:30:13,775 --> 00:30:15,970 é polarizada nunha dirección. 646 00:30:15,970 --> 00:30:17,950 Se a corrente é enviada en sentido oposto, o 647 00:30:17,950 --> 00:30:19,930 polarización é invertida. 648 00:30:19,930 --> 00:30:22,370 >> Como obter datos fóra do disco duro? 649 00:30:22,370 --> 00:30:24,090 Só reverter o proceso. 650 00:30:24,090 --> 00:30:26,550 Por iso é que as partículas no disco que obteña a corrente no 651 00:30:26,550 --> 00:30:27,960 lectura / escritura cabeza movendo. 652 00:30:27,960 --> 00:30:30,700 Xuntos millóns destes rutas magnetizados e 653 00:30:30,700 --> 00:30:32,160 ten un arquivo. 654 00:30:32,160 --> 00:30:36,060 >> Agora, as pezas dun único arquivo pode ser espallados por toda a unidade de 655 00:30:36,060 --> 00:30:39,970 pratos, como o tipo de desorde de papeis na súa mesa. 656 00:30:39,970 --> 00:30:43,500 Así, un arquivo moi especial mantén o control de onde está todo. 657 00:30:43,500 --> 00:30:45,985 Non quere ter algo así? 658 00:30:45,985 --> 00:30:46,470 >> [FIN reprodución de vídeo] 659 00:30:46,470 --> 00:30:47,820 >> DAVID Malan: OK, probablemente non. 660 00:30:47,820 --> 00:30:52,070 Así como moitos de vostedes Medrei con iso? 661 00:30:52,070 --> 00:30:53,970 OK, por iso é cada vez menos mans cada ano. 662 00:30:53,970 --> 00:30:56,550 Pero eu estou feliz que estea polo menos familiarizado con eles, porque esta é a nosa propia 663 00:30:56,550 --> 00:31:00,520 demostración libro, desgraciadamente, están morrendo moi retardar a morte aquí de familiaridade. 664 00:31:00,520 --> 00:31:04,010 >> Pero iso é o que eu, polo menos, de volta ensino medio, o uso empregado para copias de seguridade. 665 00:31:04,010 --> 00:31:08,110 E foi incrible, porque pode almacenar 1,4 megabytes en 666 00:31:08,110 --> 00:31:08,930 este disco en particular. 667 00:31:08,930 --> 00:31:12,260 E esta foi a versión de alta densidade, indicadas pola alta definición, que ten 668 00:31:12,260 --> 00:31:14,240 é dicir, antes de videos de hoxe en HD. 669 00:31:14,240 --> 00:31:16,400 >> Densidade estándar era de 800 kilobytes. 670 00:31:16,400 --> 00:31:18,640 E antes diso, había Discos de 400 kilobytes. 671 00:31:18,640 --> 00:31:23,120 E antes diso, había 5 e 1/4 discos polgadas, que eran verdadeiramente flexible, 672 00:31:23,120 --> 00:31:25,680 e algo máis ancho e máis alto que estas cousas aquí. 673 00:31:25,680 --> 00:31:29,150 Pero realmente pode ver o chamado aspecto disquete destes discos. 674 00:31:29,150 --> 00:31:32,630 >> E funcionalmente, son, en realidade, moi semellante ao de discos duros de polo 675 00:31:32,630 --> 00:31:33,570 menos deste tipo. 676 00:31:33,570 --> 00:31:37,270 Unha vez máis, os SSDs en ordenadores máis novos traballar un pouco diferente. 677 00:31:37,270 --> 00:31:41,530 Pero se se move, que guía de metal pouco, realmente pode ver un pouco de biscoito, 678 00:31:41,530 --> 00:31:42,560 ou varanda. 679 00:31:42,560 --> 00:31:43,830 >> Non é de metal coma este. 680 00:31:43,830 --> 00:31:46,000 Este é realmente un pouco máis barato material plástico. 681 00:31:46,000 --> 00:31:46,750 E pode tipo de manobra-lo. 682 00:31:46,750 --> 00:31:50,310 E trully só limpou algúns número de bits ou partículas magnéticas 683 00:31:50,310 --> 00:31:51,220 dende este disco. 684 00:31:51,220 --> 00:31:52,710 >> Entón, por sorte, non hai nada sobre el. 685 00:31:52,710 --> 00:31:55,790 Se esa cousa está no camiño - e cobre os seus ollos e os do seu veciño - 686 00:31:55,790 --> 00:31:58,865 pode só tirar este tipo de toda off vaina así. 687 00:31:58,865 --> 00:32:01,900 Pero hai unha pequena primavera, que así sexa consciente de que, cos seus ollos. 688 00:32:01,900 --> 00:32:03,620 Entón agora ten realmente un disquete. 689 00:32:03,620 --> 00:32:07,090 >> E o que é notable sobre esta é que, na medida en que este é un 690 00:32:07,090 --> 00:32:10,830 representación a pequena escala dunha maior disco duro, esas cousas son super, 691 00:32:10,830 --> 00:32:11,590 super sinxelo. 692 00:32:11,590 --> 00:32:15,170 Se usar a parte inferior do mesmo, agora que que cousa de metal está fóra, e pele 693 00:32:15,170 --> 00:32:20,990 las abertas, o único que hai é dúas pezas de feltro e o chamado disquete 694 00:32:20,990 --> 00:32:22,930 cunha peza de metal no interior. 695 00:32:22,930 --> 00:32:25,990 >> E alí se vai a metade do contido do meu disco. 696 00:32:25,990 --> 00:32:27,540 Aí vai outra metade deles. 697 00:32:27,540 --> 00:32:31,375 Pero iso é todo o que estaba xirando dentro do seu ordenador no pasado. 698 00:32:31,375 --> 00:32:35,220 699 00:32:35,220 --> 00:32:38,310 >> E, de novo, para poñer isto en perspectiva, Que grande é a maioría do seu 700 00:32:38,310 --> 00:32:39,560 discos duros de hoxe en día? 701 00:32:39,560 --> 00:32:41,960 702 00:32:41,960 --> 00:32:46,230 500 gigabytes, un terabyte, talvez en un ordenador de escritorio, dous terabytes, 3 703 00:32:46,230 --> 00:32:47,630 terabytes, 4 terabytes, non? 704 00:32:47,630 --> 00:32:52,480 Este é un megabyte, máis ou menos, que non pode sequera poñer un MP3 típico 705 00:32:52,480 --> 00:32:55,310 tecleamos máis algúns días ou unhas arquivo de música similar. 706 00:32:55,310 --> 00:32:59,500 >> Así, unha pequena lembranza para ti hoxe, e tamén para axudar a contextualizar o 707 00:32:59,500 --> 00:33:03,570 nós imos tomar para concedida agora no problema establecer cinco. 708 00:33:03,570 --> 00:33:04,820 Polo tanto, estas son da súa propiedade. 709 00:33:04,820 --> 00:33:07,340 710 00:33:07,340 --> 00:33:13,370 Entón déixeme transición cara a onde se pasar á seguinte pset ben. 711 00:33:13,370 --> 00:33:18,470 Entón, nós temos agora configurar esta páxina a - Oh, un par de anuncios de forma rápida. 712 00:33:18,470 --> 00:33:21,730 >> Este venres, se quere unirse a CS50 para o xantar, ir ao lugar de costume, 713 00:33:21,730 --> 00:33:23,610 cs50.net/rsvp. 714 00:33:23,610 --> 00:33:25,100 Correo proxecto final - 715 00:33:25,100 --> 00:33:28,520 entón por que o programa, nos postamos o especificación do proxecto final xa. 716 00:33:28,520 --> 00:33:31,410 Entenda que iso non quere dicir que débese especialmente pronto. 717 00:33:31,410 --> 00:33:33,990 Está publicado, en realidade, só para obter vostedes a pensar niso. 718 00:33:33,990 --> 00:33:37,620 E, de feito, un súper importante porcentaxe de será fronte 719 00:33:37,620 --> 00:33:40,780 proxectos finais de material que nin sequera chegou a na clase, 720 00:33:40,780 --> 00:33:42,730 pero será xa a próxima semana. 721 00:33:42,730 --> 00:33:45,530 >> Teña en conta, porén, que a especificación require algúns compoñentes distintos do 722 00:33:45,530 --> 00:33:46,190 proxecto final. 723 00:33:46,190 --> 00:33:49,590 O primeiro, en algunhas semanas é un pre-proposta, un correo-e moi casual para 724 00:33:49,590 --> 00:33:52,760 o TF para lle dicir ou o que está pensar para o seu proxecto, con 725 00:33:52,760 --> 00:33:53,650 ningún compromiso. 726 00:33:53,650 --> 00:33:56,710 Proposta será o seu particular compromiso, dicindo, aquí, iso é o que 727 00:33:56,710 --> 00:33:57,770 Gustaríame facer para o meu proxecto. 728 00:33:57,770 --> 00:33:58,250 ¿Que pensas? 729 00:33:58,250 --> 00:33:58,650 Moi grande? 730 00:33:58,650 --> 00:33:59,145 Moi pequena? 731 00:33:59,145 --> 00:34:00,330 É viable? 732 00:34:00,330 --> 00:34:02,230 E ve a especificación para máis detalles. 733 00:34:02,230 --> 00:34:05,060 >> Dúas semanas despois do que é o estado informe, que é unha forma similar 734 00:34:05,060 --> 00:34:08,260 correo casual para o TF para dicir o no; moi lonxe está na súa última 735 00:34:08,260 --> 00:34:12,360 implantación do proxecto, seguido por o CS50 hackathon ao cal todos 736 00:34:12,360 --> 00:34:17,520 é invitado, que será un evento de 20:00 nunha noite ata 07:00 737 00:34:17,520 --> 00:34:19,150 AM na mañá seguinte. 738 00:34:19,150 --> 00:34:22,560 Pizza, como eu xa mencionei a semana cero, Wil ser servido en 09:00, 739 00:34:22,560 --> 00:34:24,120 Comida chinesa en 1h00. 740 00:34:24,120 --> 00:34:27,929 E se aínda está acordado á 5h00, imos levalo para IHOP no almorzo. 741 00:34:27,929 --> 00:34:31,310 >> Así, o hackathon é un dos máis experiencias memorábeis na clase. 742 00:34:31,310 --> 00:34:35,290 A continuación, a implementación é debido, e a continuación, o CS50 Fair clímax. 743 00:34:35,290 --> 00:34:38,070 Máis detalles sobre todos estes nas semanas que virán. 744 00:34:38,070 --> 00:34:40,739 >> Pero imos voltar a algo vella escola - 745 00:34:40,739 --> 00:34:41,920 outra vez, unha matriz. 746 00:34:41,920 --> 00:34:45,040 Así, unha matriz foi bo, porque resolve problemas como vimos só un 747 00:34:45,040 --> 00:34:49,290 momento atrás, con estruturas estudantís quedando un pouco fóra de control se 748 00:34:49,290 --> 00:34:52,405 quere ter un alumno, estudante dous, estudante tres, estudante dot dot dot, 749 00:34:52,405 --> 00:34:54,400 un número arbitrario de alumnos. 750 00:34:54,400 --> 00:34:58,850 >> Entón, matrices, algunhas semanas atrás, mergullou e resolveu todos os nosos problemas de non 751 00:34:58,850 --> 00:35:03,340 sabendo de antemán cantas cousas de calquera tipo que pode querer. 752 00:35:03,340 --> 00:35:07,390 E vimos que estruturas pode axudarnos aínda organizar noso código e manter 753 00:35:07,390 --> 00:35:11,660 variables conceptualmente similares, como a nome e unha casa, en conxunto, de xeito que temos 754 00:35:11,660 --> 00:35:15,570 pode tratalos como unha entidade, dentro dos cales hai anacos pequenos. 755 00:35:15,570 --> 00:35:17,810 >> Pero matrices teñen algunhas desvantaxes. 756 00:35:17,810 --> 00:35:19,780 Cales son algunhas das desvantaxes atopamos 757 00:35:19,780 --> 00:35:22,320 con matrices ata agora? 758 00:35:22,320 --> 00:35:23,450 ¿Que é iso? 759 00:35:23,450 --> 00:35:28,130 Tamaño fixo - que aínda que pode poder reservar memoria para un 760 00:35:28,130 --> 00:35:32,310 matriz, xa que sabe cantos alumnos ten, cantos caracteres ten 761 00:35:32,310 --> 00:35:35,460 do usuario, unha vez que teña asignado a matriz, ten tipo de pintado 762 00:35:35,460 --> 00:35:36,740 só nun recuncho. 763 00:35:36,740 --> 00:35:40,600 >> Porque non pode introducir novos elementos no medio dunha matriz. 764 00:35:40,600 --> 00:35:43,660 Non pode introducir máis elementos ao final dunha matriz. 765 00:35:43,660 --> 00:35:47,750 Realmente, ten que recorrer á creación dun Toda nova matriz, como xa discutido, 766 00:35:47,750 --> 00:35:49,320 copiando o antigo para o novo. 767 00:35:49,320 --> 00:35:52,610 E unha vez máis, que é a dor de cabeza que GetString manexa para ti. 768 00:35:52,610 --> 00:35:56,170 >> Pero, de novo, non se pode inserir algo no medio da matriz 769 00:35:56,170 --> 00:35:58,200 se o tipo non está completamente chea. 770 00:35:58,200 --> 00:36:03,010 Por exemplo, se esa matriz aquí de tamaño seis ten só cinco cousas nel, 771 00:36:03,010 --> 00:36:06,080 Ben, pode só alinhavar algo para o efecto. 772 00:36:06,080 --> 00:36:08,200 Pero e se quere inserir algo no medio da 773 00:36:08,200 --> 00:36:11,280 matriz, aínda que pode ter cinco dos seis cousas nel? 774 00:36:11,280 --> 00:36:14,250 >> Ben, o que fixemos cando tiñamos todo dos nosos voluntarios humanos no escenario 775 00:36:14,250 --> 00:36:15,110 semana pasado? 776 00:36:15,110 --> 00:36:18,710 Se quixésemos poñer alguén aquí, tamén esas persoas como mover este 777 00:36:18,710 --> 00:36:22,540 xeito, ou eles mesmos como mover este forma, e que se fixo caro. 778 00:36:22,540 --> 00:36:26,950 O desprazamento de persoas no interior dun serie acabou sumando e custando 779 00:36:26,950 --> 00:36:31,240 nos tempo, polo tanto, moi do noso n ao cadrado veces funciona como un tipo de inserción, por 780 00:36:31,240 --> 00:36:32,550 exemplo, no peor dos casos. 781 00:36:32,550 --> 00:36:36,520 Así, as matrices son grandes, pero ten que saber de antemán o quão grande quere. 782 00:36:36,520 --> 00:36:38,030 >> Entón, OK, aquí está unha solución. 783 00:36:38,030 --> 00:36:43,860 Se eu non saber de antemán cantos os alumnos que eu podería ter, e sei que unha vez 784 00:36:43,860 --> 00:36:47,870 Eu decido, con todo, eu estou preso con que moitos estudantes, polo que non sempre 785 00:36:47,870 --> 00:36:51,740 reservar o dobre do espazo como eu podería pensar que eu teño? 786 00:36:51,740 --> 00:36:54,450 Isto non é unha solución razoable? 787 00:36:54,450 --> 00:36:58,240 >> En realidade, eu non creo que somos Vai ter máis de 50 caza de recreo 788 00:36:58,240 --> 00:37:02,190 nunha matriz para unha clase de tamaño medio, entón imos redondear para arriba. 789 00:37:02,190 --> 00:37:07,040 Vou facer 100 slots no meu array, só para que poidamos sempre o 790 00:37:07,040 --> 00:37:10,330 número de alumnos que esperan ser, dalgunha clase de tamaño medio. 791 00:37:10,330 --> 00:37:14,320 Entón por que non reunir e reservar máis memoria, tipicamente, por unha matriz 792 00:37:14,320 --> 00:37:16,290 Que pensas que pode incluso ter? 793 00:37:16,290 --> 00:37:20,190 ¿Que é iso pushback simple a esa idea? 794 00:37:20,190 --> 00:37:21,440 >> Só está perdendo memoria. 795 00:37:21,440 --> 00:37:25,350 Literalmente todos os programas que escribe, a continuación, é quizais a usar o dobre da memoria como 796 00:37:25,350 --> 00:37:26,680 realmente precisa. 797 00:37:26,680 --> 00:37:28,990 E iso só non se sente como un especialmente solución elegante. 798 00:37:28,990 --> 00:37:31,990 Ademais, só diminúe o probabilidade dun problema. 799 00:37:31,990 --> 00:37:35,300 Se ocorrer de ter un curso popular un semestre e ten 101 800 00:37:35,300 --> 00:37:39,610 estudantes, o programa aínda é fundamentalmente afrontando o mesmo problema. 801 00:37:39,610 --> 00:37:44,280 >> Entón, por sorte, hai unha solución para Este anuncio todos os nosos problemas, en forma 802 00:37:44,280 --> 00:37:46,790 de estruturas de datos que son máis complexos do que os 803 00:37:46,790 --> 00:37:47,970 vimos ata agora. 804 00:37:47,970 --> 00:37:50,530 Iso, eu afirmo, é unha lista encadeada. 805 00:37:50,530 --> 00:37:51,920 Esta é unha lista de números - 806 00:37:51,920 --> 00:37:54,970 9, 17, 22, 26 e 34 - 807 00:37:54,970 --> 00:38:00,120 que foron ligadas entre si de forma do que eu deseño como frechas. 808 00:38:00,120 --> 00:38:03,580 >> Noutras palabras, se eu quería representar unha matriz, que eu podería facer 809 00:38:03,580 --> 00:38:04,910 algo así. 810 00:38:04,910 --> 00:38:07,310 E eu vou poñer isto a sobrecarga en só un momento. 811 00:38:07,310 --> 00:38:09,970 Podería facer - 812 00:38:09,970 --> 00:38:12,520 Ola, todo ben. 813 00:38:12,520 --> 00:38:14,470 Stand by. 814 00:38:14,470 --> 00:38:17,360 Novo ordenador aquí, claro - 815 00:38:17,360 --> 00:38:18,090 todo ben. 816 00:38:18,090 --> 00:38:21,730 >> Entón, se eu teño eses números en orde - 817 00:38:21,730 --> 00:38:28,880 9, 17, 22, 26, 24 - 818 00:38:28,880 --> 00:38:30,530 non necesariamente a escala. 819 00:38:30,530 --> 00:38:33,730 Todo ben, iso aquí é a miña matriz - 820 00:38:33,730 --> 00:38:34,980 oh meu deus. 821 00:38:34,980 --> 00:38:38,700 822 00:38:38,700 --> 00:38:40,395 Todo ben, iso aquí é a miña matriz. 823 00:38:40,395 --> 00:38:44,110 824 00:38:44,110 --> 00:38:45,050 Oh meu deus. 825 00:38:45,050 --> 00:38:48,820 >> [Risas] 826 00:38:48,820 --> 00:38:49,440 >> DAVID Malan: Pretend. 827 00:38:49,440 --> 00:38:52,330 É moito esforzo para volver e corrixir iso, entón alí - 828 00:38:52,330 --> 00:38:54,290 26. 829 00:38:54,290 --> 00:38:57,650 Entón temos ese conxunto de 9, 17, 22, 26, e 34. 830 00:38:57,650 --> 00:39:00,260 Para aqueles de vostedes poden ver o erro embaraçoso que acaba de facer, 831 00:39:00,260 --> 00:39:00,830 aí está. 832 00:39:00,830 --> 00:39:04,490 >> Entón eu afirmar que esta é unha solución moi eficaz. 833 00:39:04,490 --> 00:39:07,310 Eu asignado como moitos ints como Eu teño - un, dous, tres, 834 00:39:07,310 --> 00:39:09,100 catro, cinco ou seis - 835 00:39:09,100 --> 00:39:11,660 e eu entón almacenados os números interior desta matriz. 836 00:39:11,660 --> 00:39:15,220 Pero imos supoñer que, entón, quero introducir un valor como o número 8? 837 00:39:15,220 --> 00:39:16,100 Ben, para onde vai? 838 00:39:16,100 --> 00:39:18,530 Supoña que queira inserir un número como 20. 839 00:39:18,530 --> 00:39:19,790 Ben, para onde vai? 840 00:39:19,790 --> 00:39:23,160 Nalgún lugar no medio, ou o número 35 ten que pasar 841 00:39:23,160 --> 00:39:24,010 algures no final. 842 00:39:24,010 --> 00:39:25,320 Pero eu estou fóra do espazo. 843 00:39:25,320 --> 00:39:29,120 >> E por iso este é un reto fundamental das matrices que non son a solución. 844 00:39:29,120 --> 00:39:32,280 Afirmei hai pouco, GetString resolve este problema. 845 00:39:32,280 --> 00:39:37,380 Se desexa inserir unha sexto número nesa matriz, o que é, polo menos, un 846 00:39:37,380 --> 00:39:40,090 solución que pode volver a caer, con certeza, así como facemos con GetString? 847 00:39:40,090 --> 00:39:44,340 848 00:39:44,340 --> 00:39:46,030 ¿Que é iso? 849 00:39:46,030 --> 00:39:48,190 >> Así, facelo máis grande é máis fácil de dicir que facer. 850 00:39:48,190 --> 00:39:52,810 Non podemos necesariamente facer a matriz maior, pero o que podemos facer? 851 00:39:52,810 --> 00:39:56,570 Fai unha nova matriz que é maior, de tamaño 6, ou que tamaño 10, se queremos 852 00:39:56,570 --> 00:40:00,490 para chegar á fronte das cousas, e entón por favor copie o array antigo ao novo, e, a continuación, 853 00:40:00,490 --> 00:40:01,680 liberar a antiga matriz. 854 00:40:01,680 --> 00:40:05,770 >> Pero o que é o tempo de execución agora deste proceso? 855 00:40:05,770 --> 00:40:09,870 É grande S de n, xa que a copia lle vai custar algunhas unidades de 856 00:40:09,870 --> 00:40:13,480 tempo, polo que non é tan ideal, se é preciso reservar unha nova matriz, o que está pasando 857 00:40:13,480 --> 00:40:15,610 consumindo o dobre memoria temporal. 858 00:40:15,610 --> 00:40:16,660 Pega vello en novo - 859 00:40:16,660 --> 00:40:18,800 Quero dicir, é só unha dor de cabeza, que é, unha vez máis, por que escribiu 860 00:40:18,800 --> 00:40:19,920 GetString para ti. 861 00:40:19,920 --> 00:40:21,380 >> Entón, o que podemos facer no seu canto? 862 00:40:21,380 --> 00:40:25,000 Ben, e se a nosa estrutura de datos en realidade, ten lagoas nel? 863 00:40:25,000 --> 00:40:30,790 Supoñamos que eu relaxo meu obxectivo de ter bloques contiguos de memoria, onde 9 864 00:40:30,790 --> 00:40:34,500 é ben próximo a 17, o que é xunto 22, e así por diante. 865 00:40:34,500 --> 00:40:39,570 >> E supoña que 9 pode ser aquí en RAM, e 17 pode ser por aquí na RAM, 866 00:40:39,570 --> 00:40:40,990 e 22 pode ser aquí en RAM. 867 00:40:40,990 --> 00:40:43,610 Noutras palabras, eu non teño deles mesmo volver atrás máis. 868 00:40:43,610 --> 00:40:47,850 Eu só teño que dalgunha forma enfiar unha agulla a través de cada un destes números, ou cada 869 00:40:47,850 --> 00:40:51,010 destes nós, como imos chamar o rectángulos como eu deseño a eles, para 870 00:40:51,010 --> 00:40:55,670 recordar como chegar ao último tal nó do primeiro. 871 00:40:55,670 --> 00:40:59,940 >> Entón o que é construír a programación vimos hai pouco tempo co que me 872 00:40:59,940 --> 00:41:03,030 pode aplicar ese segmento, ou trazada aquí, co cal podo 873 00:41:03,030 --> 00:41:05,430 aplicar esas frechas? 874 00:41:05,430 --> 00:41:06,500 Punteiros así, non? 875 00:41:06,500 --> 00:41:09,560 Se eu non reservar só un int, pero un nó - e por 876 00:41:09,560 --> 00:41:10,810 no, eu só quero dicir container. 877 00:41:10,810 --> 00:41:12,900 E visual, quero dicir un rectángulo. 878 00:41:12,900 --> 00:41:16,420 Así, un nó aparentemente necesita para conter dous valores - 879 00:41:16,420 --> 00:41:21,490 o propio int, e entón, como se conclúe da a metade inferior do rectángulo, 880 00:41:21,490 --> 00:41:23,010 espazo suficiente para un int. 881 00:41:23,010 --> 00:41:26,130 >> Entón, só tes que pensar no futuro aquí, quão grande é este nodo, este 882 00:41:26,130 --> 00:41:27,170 recipiente en cuestión? 883 00:41:27,170 --> 00:41:29,250 Cantos bytes ao int? 884 00:41:29,250 --> 00:41:31,310 Presuntamente, 4, se é o mesmo que o habitual. 885 00:41:31,310 --> 00:41:33,270 E entón cantos bytes ao punteiro? 886 00:41:33,270 --> 00:41:33,650 4. 887 00:41:33,650 --> 00:41:37,940 Polo tanto, este recipiente, ou este nodo, é vai ser unha estrutura de 8 bytes. 888 00:41:37,940 --> 00:41:41,760 Ah, e iso é unha feliz coincidencia que que acaba de introducir a noción de 889 00:41:41,760 --> 00:41:44,400 unha estrutura ou unha estrutura C. 890 00:41:44,400 --> 00:41:48,890 >> Entón, eu afirmo que quero dar un paso para iso máis sofisticado 891 00:41:48,890 --> 00:41:52,560 implementación dunha lista de números, un lista encadeada de números, eu teño que facer unha 892 00:41:52,560 --> 00:41:56,920 pouco máis o pensamento diante e declarar non só un int, pero un struct 893 00:41:56,920 --> 00:41:58,620 que eu ligo, convencionalmente aquí, o nó. 894 00:41:58,620 --> 00:42:01,630 Poderiamos chamalo de calquera cousa que queiramos, pero nodo será temática nun monte 895 00:42:01,630 --> 00:42:03,560 das cousas que comezar a ollar para o momento. 896 00:42:03,560 --> 00:42:06,480 >> Dentro dese nodo é un int n. 897 00:42:06,480 --> 00:42:09,350 E entón esa sintaxe, un pouco estraño a primeira vista - 898 00:42:09,350 --> 00:42:12,960 struct node * seguinte. 899 00:42:12,960 --> 00:42:16,900 Ben pictoricamente, o que é iso? 900 00:42:16,900 --> 00:42:21,000 Esa é a metade inferior da o rectángulo que vimos 901 00:42:21,000 --> 00:42:22,730 só un momento atrás. 902 00:42:22,730 --> 00:42:27,600 >> Pero por que digo struct node * no canto de só nodo *? 903 00:42:27,600 --> 00:42:31,370 Porque se ese punteiro está a apuntar noutro nodo, é só o 904 00:42:31,370 --> 00:42:32,760 enderezo dun nodo. 905 00:42:32,760 --> 00:42:35,630 Isto é consistente co que temos discutido sobre punteiros ata o momento. 906 00:42:35,630 --> 00:42:39,690 Pero por que, se eu reclamar esta estrutura é chamado nó, que teño que dicir struct 907 00:42:39,690 --> 00:42:42,660 nó aquí dentro? 908 00:42:42,660 --> 00:42:43,190 >> Exactamente. 909 00:42:43,190 --> 00:42:46,490 É unha especie de unha realidade estúpida C. O typedef, por así dicir, non ten 910 00:42:46,490 --> 00:42:47,220 aconteceu aínda. 911 00:42:47,220 --> 00:42:48,510 C é super literal. 912 00:42:48,510 --> 00:42:51,050 El le o seu código para arriba abaixo, de esquerda a dereita. 913 00:42:51,050 --> 00:42:54,930 E ata que chega ese punto e coma no liña de fondo, creo que non funciona 914 00:42:54,930 --> 00:42:57,590 existir como un tipo de datos? 915 00:42:57,590 --> 00:42:59,060 No, o nó entre comiñas. 916 00:42:59,060 --> 00:43:03,050 >> Pero por mor da máis detallado declaración que fixen na primeira liña - 917 00:43:03,050 --> 00:43:05,340 typedef struct node - 918 00:43:05,340 --> 00:43:08,790 xa que veu primeiro, antes da chaves, que é unha especie de como 919 00:43:08,790 --> 00:43:11,800 pre-educar Clang iso, Sabe, me dea un struct 920 00:43:11,800 --> 00:43:13,570 chamado nó struct. 921 00:43:13,570 --> 00:43:16,270 Francamente, eu non me gusta de cousas que chaman struct node, struct node todo 922 00:43:16,270 --> 00:43:17,090 todo o meu código. 923 00:43:17,090 --> 00:43:20,660 Pero eu só vou usalo xa, só dentro, para que eu poida efectivamente 924 00:43:20,660 --> 00:43:25,010 crear unha especie de referencia circular, non un punteiro para min mesmo, por si só, pero unha 925 00:43:25,010 --> 00:43:29,400 ligazón a outra un do mesmo tipo. 926 00:43:29,400 --> 00:43:32,330 >> Así, verifícase que nunha estrutura de datos así, hai algúns 927 00:43:32,330 --> 00:43:34,470 as operacións que se poden de interese para nós. 928 00:43:34,470 --> 00:43:37,460 Podemos querer inserir nunha lista como esta. 929 00:43:37,460 --> 00:43:39,850 Podemos querer borrar desde unha lista como esta. 930 00:43:39,850 --> 00:43:43,490 Podemos querer buscar a lista para unha valor, ou, máis xeralmente, travesía. 931 00:43:43,490 --> 00:43:46,410 E transversal é só un xeito elegante de dicindo inicio á esquerda e mover todos 932 00:43:46,410 --> 00:43:47,650 o camiño para a dereita. 933 00:43:47,650 --> 00:43:52,640 >> E noten, mesmo con ese algo máis estrutura de datos texto, imos 934 00:43:52,640 --> 00:43:56,510 me propor que podemos prestar algúns dos as ideas das últimas dúas semanas e 935 00:43:56,510 --> 00:43:58,410 implementar unha función chamada investigación como esta. 936 00:43:58,410 --> 00:44:01,360 Devolverá verdadeiro ou false, o que indica, si ou 937 00:44:01,360 --> 00:44:03,390 n, n está na lista. 938 00:44:03,390 --> 00:44:05,960 O segundo argumento é un punteiro á propia lista, co fin de 939 00:44:05,960 --> 00:44:07,920 punteiro para un nó. 940 00:44:07,920 --> 00:44:10,350 >> Todo o que eu vou facer a continuación é declarar unha variable temporal. 941 00:44:10,350 --> 00:44:12,730 Imos chamalo de PTR por convención, para punteiro. 942 00:44:12,730 --> 00:44:15,220 E eu atribuílo lo igual ao inicio da lista. 943 00:44:15,220 --> 00:44:16,680 >> E agora teña en conta o loop while. 944 00:44:16,680 --> 00:44:20,640 Mentres o punteiro non é igual como nulo, vou comprobar. 945 00:44:20,640 --> 00:44:24,520 É punteiro de frecha n igual n que foi pasado en? 946 00:44:24,520 --> 00:44:26,410 E agarde un minuto - novo peza de sintaxe. 947 00:44:26,410 --> 00:44:29,324 Cal é o arco de súpeto? 948 00:44:29,324 --> 00:44:30,574 Si? 949 00:44:30,574 --> 00:44:34,200 950 00:44:34,200 --> 00:44:34,810 >> Exactamente. 951 00:44:34,810 --> 00:44:38,860 Así, mentres a poucos minutos, usan a notación de punto para acceder algo 952 00:44:38,860 --> 00:44:43,080 o interior dunha estrutura, a variable non é o struct 953 00:44:43,080 --> 00:44:47,420 si mesmo, pero un punteiro a unha struct, por sorte, un anaco de sintaxe que 954 00:44:47,420 --> 00:44:48,620 finalmente ten sentido intuitivo. 955 00:44:48,620 --> 00:44:52,360 A frecha significa seguir o punteiro, como as nosas frechas normalmente significa 956 00:44:52,360 --> 00:44:56,570 pictoricamente, e ir en campo de datos en interior. 957 00:44:56,570 --> 00:44:59,700 Entón frecha é o mesmo que punto, pero usalo cando ten un punteiro. 958 00:44:59,700 --> 00:45:05,270 >> Entón, só para recapitular, entón, se o campo de n dentro da estrutura chamada de punteiro 959 00:45:05,270 --> 00:45:07,760 é igual a igual a n, retorna true. 960 00:45:07,760 --> 00:45:11,970 En caso contrario, esta liña aquí - punteiro igual punteiro próximo. 961 00:45:11,970 --> 00:45:17,540 Entón o que está facendo, o aviso previo, é que se eu actualmente estou apuntando para a estrutura 962 00:45:17,540 --> 00:45:21,430 conteñen 9 e 9 non é o número Estou buscando - supoño que eu estou buscando 963 00:45:21,430 --> 00:45:22,830 para n igual a 50 - 964 00:45:22,830 --> 00:45:25,930 Vou actualizar o meu punteiro temporal para non ligar a este nodo 965 00:45:25,930 --> 00:45:31,190 máis, pero punteiro frecha ao lado, que me vai poñer aquí. 966 00:45:31,190 --> 00:45:34,270 >> Agora entender que é un turbillón introdución. 967 00:45:34,270 --> 00:45:37,380 O mércores, imos realmente facelo con algúns seres humanos, e cun pouco máis 968 00:45:37,380 --> 00:45:38,900 código en un ritmo máis lento. 969 00:45:38,900 --> 00:45:42,990 Pero entendo, agora estamos facendo os nosos datos estruturas máis complexas para que o noso 970 00:45:42,990 --> 00:45:45,780 algoritmos poden ser máis eficiente, o que será requisito para 971 00:45:45,780 --> 00:45:50,500 pset seis, cando premer en, unha vez máis, os 150 mil palabras, pero ten que facelo 972 00:45:50,500 --> 00:45:55,650 de forma eficaz e, idealmente, crear un programa que se executa para os nosos usuarios non en 973 00:45:55,650 --> 00:46:00,460 lineal, non en n ao cadrado, pero en constante de tempo, de ideal. 974 00:46:00,460 --> 00:46:02,300 >> Vemo-nos o mércores. 975 00:46:02,300 --> 00:46:07,240 >> Palestrante: Na seguinte CS50, David esquece o seu caso base. 976 00:46:07,240 --> 00:46:12,770 >> DAVID Malan: E é así que envía mensaxes de texto con C. Que - 977 00:46:12,770 --> 00:46:14,020 >> [VARIOS mensaxe de texto Sons de notificación] 978 00:46:14,020 --> 00:46:19,734