1 00:00:00,000 --> 00:00:10,970 >> [Música tocando] 2 00:00:10,970 --> 00:00:12,536 >> DAVID J. Malan: Todo ben. 3 00:00:12,536 --> 00:00:13,392 >> [Risas] 4 00:00:13,392 --> 00:00:14,240 >> Benvido de volta. 5 00:00:14,240 --> 00:00:14,990 É dicir CS50. 6 00:00:14,990 --> 00:00:16,890 E este fin de semana cinco. 7 00:00:16,890 --> 00:00:20,020 E ata agora temos practicamente tomado como certo que hai 8 00:00:20,020 --> 00:00:23,480 existe este compilador Clang, que ten foi invocar por medio deste 9 00:00:23,480 --> 00:00:27,100 outra ferramenta chamada Comprobe que dalgún xeito Magic transforma o seu código fonte 10 00:00:27,100 --> 00:00:31,350 en código obxecto, os ceros e uns que o seu CPU de ordenadores, centrais 11 00:00:31,350 --> 00:00:33,410 unidade de procesamento, realmente entende. 12 00:00:33,410 --> 00:00:36,770 Pero resulta que hai un número que se suceder debaixo do capó en 13 00:00:36,770 --> 00:00:38,690 entre a entrada ea saída. 14 00:00:38,690 --> 00:00:41,800 >> E gustaríame propoñer que a carne que en algo máis de detalle en 15 00:00:41,800 --> 00:00:45,130 estas catro etapas, ten unha cousa chamada pretratamento, algo 16 00:00:45,130 --> 00:00:48,300 chámase compilación, o que vimos, algo chamado montaxe e 17 00:00:48,300 --> 00:00:49,420 algo chamado de conexión. 18 00:00:49,420 --> 00:00:53,270 Entón, ata agora, en algúns dos nosos programas, tiñamos afiado inclúe. 19 00:00:53,270 --> 00:00:56,650 Máis recentemente tivemos algúns sharp define a constantes. 20 00:00:56,650 --> 00:01:00,660 Así, verifícase que as cousas que son prefixados co símbolo de hash ou 21 00:01:00,660 --> 00:01:04,150 o símbolo da libra son pre-procesador directivas. 22 00:01:04,150 --> 00:01:07,960 Isto é só un xeito elegante de dicir que é unha liña de código que é realmente 23 00:01:07,960 --> 00:01:12,280 convertido noutra cousa antes do ordenador ata tentar converter o seu 24 00:01:12,280 --> 00:01:13,800 programa en ceros e uns. 25 00:01:13,800 --> 00:01:19,000 >> Por exemplo, afiado inclúe por defecto I / O. H, practicamente significa só ir 26 00:01:19,000 --> 00:01:24,010 á cabeza, tome o contido dos arquivos Stdio.h e cola-los alí mesmo. 27 00:01:24,010 --> 00:01:25,880 Polo tanto, non ceros e uns nese punto aínda. 28 00:01:25,880 --> 00:01:27,470 É realmente só unha substitución. 29 00:01:27,470 --> 00:01:30,790 E iso está feito durante a chamada fase de pre-procesamento, cando 30 00:01:30,790 --> 00:01:34,230 realmente executada Clang ou especificamente Facer na maioría dos casos. 31 00:01:34,230 --> 00:01:36,950 Entón, todo o que ven a suceder primeiro automáticamente ata o momento. 32 00:01:36,950 --> 00:01:38,800 >> A continuación, vén a etapa de compilación. 33 00:01:38,800 --> 00:01:40,920 Pero fomos simplificada compilación. 34 00:01:40,920 --> 00:01:45,060 Compilar un programa realmente significa levalo de algo así como C, o 35 00:01:45,060 --> 00:01:48,430 o código fonte que teño escrito, abaixo a algo chamado montaxe. 36 00:01:48,430 --> 00:01:52,900 Linguaxe assembly é un nivel inferior linguaxe que, por sorte, non imos 37 00:01:52,900 --> 00:01:55,480 teñen moita oportunidade de escribir este semestre. 38 00:01:55,480 --> 00:01:59,100 Pero é no nivel máis baixo da sensación de que, literalmente, comezar a escribir 39 00:01:59,100 --> 00:02:04,270 sumar e restar e multiplicar e cargar da memoria e gardar a memoria, o 40 00:02:04,270 --> 00:02:08,259 instrucións moi básicas que un ordenador, debaixo do capó, 41 00:02:08,259 --> 00:02:09,639 realmente entende. 42 00:02:09,639 --> 00:02:14,930 >> Para rematar, a montaxe leva esa lingua para os ceros e uns que fomos 43 00:02:14,930 --> 00:02:16,190 describindo así lonxe. 44 00:02:16,190 --> 00:02:19,270 E, de feito, por último, hai o chamado conectando fase, que imos 45 00:02:19,270 --> 00:02:22,360 ver en só un momento, que combina os ceros e uns con ceros e 46 00:02:22,360 --> 00:02:24,870 as outras persoas antes que creou. 47 00:02:24,870 --> 00:02:26,660 >> Por iso, considero este programa super sinxelo. 48 00:02:26,660 --> 00:02:27,560 Foi da Semana 1. 49 00:02:27,560 --> 00:02:29,610 El só dixo: Ola Mundo, na pantalla. 50 00:02:29,610 --> 00:02:30,920 Nós rodamos este través Clang. 51 00:02:30,920 --> 00:02:33,200 Ou corremos través Facer que tivo lugar Clang. 52 00:02:33,200 --> 00:02:36,170 Se transmite no momento en que algúns ceros e uns. 53 00:02:36,170 --> 00:02:38,100 Pero resulta que hai un paso intermedio. 54 00:02:38,100 --> 00:02:40,460 Se eu pasar por aquí - oops, non quero velo aínda. 55 00:02:40,460 --> 00:02:44,800 Se eu pasar por aquí para o meu dispositivo e eu abrir hello.c, aquí 56 00:02:44,800 --> 00:02:46,160 é o mesmo programa. 57 00:02:46,160 --> 00:02:48,600 E o que eu vou facer o meu terminal xanela é aquí que eu vou 58 00:02:48,600 --> 00:02:51,430 realizar Clang ao contrario de facer, que automatizar as catro 59 00:02:51,430 --> 00:02:52,870 estes pasos para nós. 60 00:02:52,870 --> 00:02:58,620 E eu vou facer clang-S e entón hello.c e despois entrar. 61 00:02:58,620 --> 00:03:00,590 >> E eu fico un prompt chiscando de novo, o que é bo. 62 00:03:00,590 --> 00:03:05,280 E agora nunha fiestra un pouco maior, Vou abrir gedit aquí. 63 00:03:05,280 --> 00:03:09,610 E eu vou abrir un arquivo que, Ocorre, chámase hello.s esta 64 00:03:09,610 --> 00:03:11,870 que contén linguaxe assembly Me referín anteriormente. 65 00:03:11,870 --> 00:03:15,060 E iso é o que se chama de montaxe lingua, nivel moi baixo 66 00:03:15,060 --> 00:03:18,470 instrucións que o seu procesador Intel ou sexa o que sexa que está dentro 67 00:03:18,470 --> 00:03:19,350 entende. 68 00:03:19,350 --> 00:03:24,480 Mov e é para o movemento. chamada para chamando unha función de nivel moi baixo. 69 00:03:24,480 --> 00:03:26,380 sub é para restar. 70 00:03:26,380 --> 00:03:30,370 >> Entón, cando ten un determinado CPU dentro do seu ordenador, o que o fai 71 00:03:30,370 --> 00:03:34,300 distintas, contra outro CPUs no mercado, é que as instrucións que 72 00:03:34,300 --> 00:03:39,460 entende e moitas veces o quão eficaz el é, o quão rápido é a execución dalgúns 73 00:03:39,460 --> 00:03:40,380 destas instrucións. 74 00:03:40,380 --> 00:03:45,150 Agora, para saber máis sobre iso, pode que preto CS61 caída na facultade. 75 00:03:45,150 --> 00:03:48,170 Pero aquí temos, por exemplo, algúns identificadores que pode parecer familiar. 76 00:03:48,170 --> 00:03:50,150 ola.c é o nome do programa. 77 00:03:50,150 --> 00:03:51,070 >> . Texto - 78 00:03:51,070 --> 00:03:54,190 non hai moito interese alí agora, lembre que o texto 79 00:03:54,190 --> 00:03:59,190 segmento, de luns, e cando en memoria do seu programa realmente acaba. 80 00:03:59,190 --> 00:04:01,330 Entón é iso, polo menos vagamente familiarizado alí. 81 00:04:01,330 --> 00:04:03,730 Aquí, por suposto, é unha mención da nosa función principal. 82 00:04:03,730 --> 00:04:07,220 Desprazamento para abaixo, estes refírense a cousas chamados rexistros, moi pequenos anacos de 83 00:04:07,220 --> 00:04:09,190 memoria dentro da súa CPU actual. 84 00:04:09,190 --> 00:04:12,930 E se rodar mesmo Por outra banda, vexo algún tipo 85 00:04:12,930 --> 00:04:14,240 mención indirecta de ASCII. 86 00:04:14,240 --> 00:04:17,120 E hai, de feito, é que a cadea, Ola, coma mundo. 87 00:04:17,120 --> 00:04:20,079 >> Así, longa historia curta, esta foi pasando para ti, automaticamente, 88 00:04:20,079 --> 00:04:22,140 debaixo da capa de todo este tempo. 89 00:04:22,140 --> 00:04:26,450 E o que está pasando realmente é xa executar Clang, ou por medio de 90 00:04:26,450 --> 00:04:29,150 Faga, está quedando en primeiro lugar, a partir do código fonte, o 91 00:04:29,150 --> 00:04:30,700 así chamado en linguaxe ensambladora. 92 00:04:30,700 --> 00:04:35,210 Entón Clang é converter esta asemblea linguaxe de abaixo para ceros e uns. 93 00:04:35,210 --> 00:04:38,340 E esta é a foto que comezamos nosa discusión a Semana 0 en - 94 00:04:38,340 --> 00:04:39,840 e logo, nunha semana. 95 00:04:39,840 --> 00:04:44,030 E entón, finalmente, os ceros e uns son combinados cos ceros e uns 96 00:04:44,030 --> 00:04:47,190 a partir desas librerías que vimos tomar para concedida como defecto E / ou a 97 00:04:47,190 --> 00:04:50,010 Biblioteca de corda ou mesmo a biblioteca de CS50. 98 00:04:50,010 --> 00:04:54,200 >> Entón, para pintar o cadro máis visual, temos hello.c. 99 00:04:54,200 --> 00:04:57,220 E, por suposto, utiliza o printf funciona a dicir, Ola mundo. 100 00:04:57,220 --> 00:05:01,810 A etapa de compilación leva-lo ata o arquivo que acabamos de ver hello.s, aínda 101 00:05:01,810 --> 00:05:04,290 A pesar de que é normalmente suprimido automaticamente para ti. 102 00:05:04,290 --> 00:05:06,050 Pero este é o código de montaxe no paso de medio. 103 00:05:06,050 --> 00:05:09,750 E entón, cando nos montes a montaxe linguaxe, por así dicir, que é cando 104 00:05:09,750 --> 00:05:10,830 obter os ceros e uns. 105 00:05:10,830 --> 00:05:13,920 Entón, temos ampliado de forma eficaz hoxe en o que temos que chegou a tomar para concedida, 106 00:05:13,920 --> 00:05:16,430 significa pasar o código fonte do código obxecto. 107 00:05:16,430 --> 00:05:18,850 >> Pero, finalmente, agora que mesmo cadro - imos empurra-la para 108 00:05:18,850 --> 00:05:20,020 o lado esquerdo. 109 00:05:20,020 --> 00:05:22,880 E teña en conta que na parte superior hai Mencionen stdio.h. 110 00:05:22,880 --> 00:05:25,030 Isto é un arquivo que nós temos en case todos os 111 00:05:25,030 --> 00:05:26,250 programas que escribiu. 112 00:05:26,250 --> 00:05:28,830 E ese é o ficheiro cuxo contido Obter copia pegado, 113 00:05:28,830 --> 00:05:30,350 eficazmente sobre o seu código. 114 00:05:30,350 --> 00:05:34,170 Pero parece que, nun computador sistema en algún lugar, hai probablemente un 115 00:05:34,170 --> 00:05:39,150 ficheiro stdio.c que alguén escribiu anos hai que aplica as 116 00:05:39,150 --> 00:05:41,870 funcións que foron declaradas en stdio.h. 117 00:05:41,870 --> 00:05:45,465 >> Agora, en realidade non é, probablemente, en Mac ou PC ou incluso no 118 00:05:45,465 --> 00:05:47,660 CS50 aparello é un código C cru. 119 00:05:47,660 --> 00:05:52,710 Alguén xa compilou e incluíu . O ficheiro de código obxecto ou. Unha 120 00:05:52,710 --> 00:05:56,020 arquivo, que refírese a unha biblioteca compartida que foi pre-instalado e 121 00:05:56,020 --> 00:05:57,240 precompilados para ti. 122 00:05:57,240 --> 00:06:01,950 Pero supoña que hai de feito existe no noso stdio.c ordenador en paralelo 123 00:06:01,950 --> 00:06:02,650 con Clang. 124 00:06:02,650 --> 00:06:04,960 O seu código está a ser feita e montado. 125 00:06:04,960 --> 00:06:09,200 código stdio.c 's está a ser compilado e montado, de xeito que este último 126 00:06:09,200 --> 00:06:13,730 paso, aquí temos que dalgunha forma ligazón, por así dicir, os ceros e uns 127 00:06:13,730 --> 00:06:18,430 con seus ceros e uns nunha programa sinxelo que finalmente se 128 00:06:18,430 --> 00:06:20,540 Ola chamado só. 129 00:06:20,540 --> 00:06:23,340 >> Así que esta é toda a maxia que se vén acontecendo ata agora. 130 00:06:23,340 --> 00:06:26,430 E seguirá a tomar estes procesos de concesión, pero entender 131 00:06:26,430 --> 00:06:28,750 hai unha morea de detalles suculentos suceder debaixo alí. 132 00:06:28,750 --> 00:06:31,920 E iso é o que fai que o seu ordenador con Intel Inside 133 00:06:31,920 --> 00:06:33,940 particularmente distinta. 134 00:06:33,940 --> 00:06:37,020 >> Entón, con esta nota, se quere unirse a nós para o xantar deste venres, facer ir 135 00:06:37,020 --> 00:06:41,570 ao lugar cs50.net/rsvp habitual, 13:15 deste venres. 136 00:06:41,570 --> 00:06:43,400 E agora algúns anuncios. 137 00:06:43,400 --> 00:06:44,670 Polo tanto, temos unha boa nova. 138 00:06:44,670 --> 00:06:45,970 E nós temos unha mala noticia. 139 00:06:45,970 --> 00:06:47,260 Comece unha boa noticia aquí. 140 00:06:47,260 --> 00:06:52,038 141 00:06:52,038 --> 00:06:54,510 >> [Xemendo] 142 00:06:54,510 --> 00:06:54,710 >> Todo ben. 143 00:06:54,710 --> 00:06:56,670 Ben, é tecnicamente unha festa, así non é tanto un agasallo de nós. 144 00:06:56,670 --> 00:06:58,030 Pero, entón, a mala noticia é claro. 145 00:06:58,030 --> 00:07:00,550 146 00:07:00,550 --> 00:07:01,880 >> [Xemendo] 147 00:07:01,880 --> 00:07:03,530 >> Pasei unha chea de tempo nestas animacións. 148 00:07:03,530 --> 00:07:04,690 >> [Risas] 149 00:07:04,690 --> 00:07:07,000 >> Haberá unha sesión de avaliación este próximo luns. 150 00:07:07,000 --> 00:07:08,340 Estará en 5:30 PM. 151 00:07:08,340 --> 00:07:11,210 Nós vos fará lembrar de todos estes detalles vía correo electrónico sobre o curso de 152 00:07:11,210 --> 00:07:13,470 web en só un par de días. 153 00:07:13,470 --> 00:07:16,610 Esta será filmado e facilitado pouco despois. 154 00:07:16,610 --> 00:07:19,200 Entón, se non pode facer que o luns slot de noite, non se preocupe. 155 00:07:19,200 --> 00:07:22,270 Seccións a próxima semana tamén concentrarse en revisión para o exame. 156 00:07:22,270 --> 00:07:25,670 Se a súa sección é o luns, que é de feito vacacións da universidade, imos 157 00:07:25,670 --> 00:07:26,920 aínda reunirse en sección. 158 00:07:26,920 --> 00:07:28,890 Se simplemente non pode facelo sección, porque vai 159 00:07:28,890 --> 00:07:29,860 de distancia, iso é bo. 160 00:07:29,860 --> 00:07:33,710 Participar nunha sección de martes ou domingo ou Tune-se para a sección de Jason, que é 161 00:07:33,710 --> 00:07:35,110 dispoñible en liña. 162 00:07:35,110 --> 00:07:37,490 >> Así, unha mala noticia. 163 00:07:37,490 --> 00:07:41,960 Así, de acordo co plan de estudos, temos charla o próximo venres. 164 00:07:41,960 --> 00:07:43,690 Pero a boa nova - 165 00:07:43,690 --> 00:07:44,860 claramente, eu pase moito tempo con iso. 166 00:07:44,860 --> 00:07:45,280 >> [Risas] 167 00:07:45,280 --> 00:07:47,140 >> Imos cancelar seguinte conferencias de venres. 168 00:07:47,140 --> 00:07:50,590 Así que será un agasallo para nós, de xeito que Pode realmente ter un bo descanso en 169 00:07:50,590 --> 00:07:52,990 entre esta semana e dúas semanas de aí. 170 00:07:52,990 --> 00:07:57,460 Polo tanto, non conferencias a próxima semana, só unha pequena pouco quiz, para o que debe ser 171 00:07:57,460 --> 00:07:59,030 ficando cada vez máis animado. 172 00:07:59,030 --> 00:08:03,870 >> Entón, imos agora volver a nosa atención sobre algo que é realmente máis visual 173 00:08:03,870 --> 00:08:06,990 e máis emocionante e para definir o estadio para o que vai estar no horizonte 174 00:08:06,990 --> 00:08:08,420 en só un par de semanas. 175 00:08:08,420 --> 00:08:12,160 Tras a primeira proba, imos converter o foco da nosa conxuntos de problemas a outro 176 00:08:12,160 --> 00:08:16,710 problema específico do dominio, que de forense ou de seguridade en xeral. 177 00:08:16,710 --> 00:08:19,550 >> En realidade, o tractor con este problema conxunto é para min un dos 178 00:08:19,550 --> 00:08:24,850 ensinando compañeiro ou CAs para atravesar campus tirar algunhas fotos 179 00:08:24,850 --> 00:08:29,450 identificables, pero non a xente obvias, lugares ou cousas, así que todo ano eu 180 00:08:29,450 --> 00:08:34,520 de algunha maneira conseguen borrar accidentalmente ou danos na tarxeta multimedia dixital 181 00:08:34,520 --> 00:08:35,720 que está dentro da nosa cámara. 182 00:08:35,720 --> 00:08:36,860 Pero non é gran cousa. 183 00:08:36,860 --> 00:08:39,200 I pode ir adiante e acenda que o meu ordenador. 184 00:08:39,200 --> 00:08:43,010 Eu podo facer unha imaxe forense do mesmo, así para falar, copiando os ceros e 185 00:08:43,010 --> 00:08:46,830 aqueles fóra do que a tarxeta de memoria, sexa é unha tarxeta SD ou tarxeta de memoria flash compacto ou 186 00:08:46,830 --> 00:08:48,100 o que está familiarizado. 187 00:08:48,100 --> 00:08:49,300 E entón podemos entregar iso. 188 00:08:49,300 --> 00:08:53,190 >> E así o reto por diante, entre outros cousas para ti, será para escribir 189 00:08:53,190 --> 00:08:58,630 Código C, que se recupera de unha chea de JPEGs para min e revelou será 190 00:08:58,630 --> 00:09:00,190 estas persoas, lugares ou cousas. 191 00:09:00,190 --> 00:09:03,340 E tamén vou falar, neste problema definir e nos días que virán, sobre 192 00:09:03,340 --> 00:09:04,440 gráficos en xeral. 193 00:09:04,440 --> 00:09:06,140 Usamos eles, un curso, para saír. 194 00:09:06,140 --> 00:09:09,080 Pero especie de dato adquirido existe estas nocións de alto nivel 195 00:09:09,080 --> 00:09:10,680 de rectángulos e ovais. 196 00:09:10,680 --> 00:09:12,450 Pero debaixo do capó hai pixels. 197 00:09:12,450 --> 00:09:14,370 E tiña que comezar pensar sobre iso. 198 00:09:14,370 --> 00:09:18,800 Ou vai á p-set 4 ten que pensar sobre a diferenza entre os ladrillos, como 199 00:09:18,800 --> 00:09:21,990 rápido está balón está movendo a través de a pantalla para saír. 200 00:09:21,990 --> 00:09:24,830 Polo tanto, non hai esa noción de puntos na súa pantalla que se 201 00:09:24,830 --> 00:09:26,290 entran en xogo xa. 202 00:09:26,290 --> 00:09:29,430 >> Agora o que se ve, con todo, é o que chegar a unha pantalla de ordenador. 203 00:09:29,430 --> 00:09:33,680 Se xa asistiu a algún ben ou TV malo, as posibilidades son eles practicamente 204 00:09:33,680 --> 00:09:36,280 tratar o público como technophobes que realmente non 205 00:09:36,280 --> 00:09:37,630 sei moito sobre informática. 206 00:09:37,630 --> 00:09:40,840 E por iso é moi fácil para a policía detective para dicir, non é 207 00:09:40,840 --> 00:09:41,710 limpar isto para min? 208 00:09:41,710 --> 00:09:42,710 Ou mellorar, non? 209 00:09:42,710 --> 00:09:45,550 Mellorar e como a palabra de moda en máis calquera programa relacionado crime. 210 00:09:45,550 --> 00:09:49,240 E a realidade é que se levar moito imaxe borrada dun sospeitoso de facer 211 00:09:49,240 --> 00:09:51,620 algo malo, non pode só melloralo. 212 00:09:51,620 --> 00:09:53,080 Non pode ampliar infinitamente. 213 00:09:53,080 --> 00:09:56,350 Non pode ver o brillo de alguén da ollo que cometeu que 214 00:09:56,350 --> 00:09:59,860 determinado crime, a pesar da prevalencia desta na TV. 215 00:09:59,860 --> 00:10:04,110 >> E así, con que imos motivar que seguinte conxunto de problemas con un reflexo 216 00:10:04,110 --> 00:10:05,765 algúns concertos co que pode estar familiarizado. 217 00:10:05,765 --> 00:10:06,500 >> [REPRODUCIÓN] 218 00:10:06,500 --> 00:10:07,835 >> -Aceptar. 219 00:10:07,835 --> 00:10:09,956 Agora, imos dar unha boa ollada en ti. 220 00:10:09,956 --> 00:10:17,060 221 00:10:17,060 --> 00:10:17,766 >> -Espera. 222 00:10:17,766 --> 00:10:18,658 Correr de volta. 223 00:10:18,658 --> 00:10:19,550 >> -Agarde un minuto. 224 00:10:19,550 --> 00:10:21,580 Desprácese á dereita. 225 00:10:21,580 --> 00:10:21,800 >> -Non. 226 00:10:21,800 --> 00:10:22,690 Conxelar iso. 227 00:10:22,690 --> 00:10:23,692 >> Pantalla completa. 228 00:10:23,692 --> 00:10:23,846 >> -Aceptar. 229 00:10:23,846 --> 00:10:24,154 Conxelar iso. 230 00:10:24,154 --> 00:10:25,140 >> Presione-se sobre iso, si? 231 00:10:25,140 --> 00:10:27,090 >> -Vector na nesa cara pola roda traseira. 232 00:10:27,090 --> 00:10:29,730 >> -Zoom en dereito aquí neste lugar. 233 00:10:29,730 --> 00:10:33,700 >> -Co equipo certo, a fotografada pode ser máis grande e afiadas. 234 00:10:33,700 --> 00:10:34,490 >> -Que é iso? 235 00:10:34,490 --> 00:10:35,870 >> -É un programa de mellora. 236 00:10:35,870 --> 00:10:36,793 >> -Podes aclarar iso calquera? 237 00:10:36,793 --> 00:10:38,560 >> -Non o sei. 238 00:10:38,560 --> 00:10:39,090 Imos melloralo. 239 00:10:39,090 --> 00:10:41,690 >> Sección A-6-Enhancer. 240 00:10:41,690 --> 00:10:43,510 >> -Eu aumentei os detalles e - 241 00:10:43,510 --> 00:10:44,456 >> -Creo que é suficiente para mellorar. 242 00:10:44,456 --> 00:10:45,402 Libera-lo para a miña pantalla. 243 00:10:45,402 --> 00:10:47,300 >> -Mellorar a reflexión nos seus ollos. 244 00:10:47,300 --> 00:10:49,330 >> -Imos facelo a través de perfeccionamento de vídeo. 245 00:10:49,330 --> 00:10:50,340 >> -Edgar, pode mellorar isto? 246 00:10:50,340 --> 00:10:52,320 >> -Manteña-se. 247 00:10:52,320 --> 00:10:54,290 >> -Teño benvida a traballar sobre esta reflexión. 248 00:10:54,290 --> 00:10:55,560 >> -Alguén reflexión de. 249 00:10:55,560 --> 00:10:56,440 >> -Reflexión. 250 00:10:56,440 --> 00:10:57,940 >> -Hai unha reflexión da cara do home. 251 00:10:57,940 --> 00:10:58,860 >> -A reflexión. 252 00:10:58,860 --> 00:10:59,710 >> -Hai unha reflexión. 253 00:10:59,710 --> 00:11:00,900 >> -Dun zoom no espello. 254 00:11:00,900 --> 00:11:03,500 >> -Podes ver unha reflexión. 255 00:11:03,500 --> 00:11:04,700 >> -Pode mellorar a imaxe a partir de aquí? 256 00:11:04,700 --> 00:11:05,700 >> -Pode aumentar el aquí? 257 00:11:05,700 --> 00:11:06,500 >> -Pode mellora-lo? 258 00:11:06,500 --> 00:11:07,380 >> -Pode mellora-lo? 259 00:11:07,380 --> 00:11:08,190 >> -Podemos mellorar isto? 260 00:11:08,190 --> 00:11:08,940 >> -Pode mellora-lo? 261 00:11:08,940 --> 00:11:10,280 >> -Espera un segundo, eu vou mellorar. 262 00:11:10,280 --> 00:11:11,570 >> -Zoom na porta. 263 00:11:11,570 --> 00:11:12,180 >> -X10. 264 00:11:12,180 --> 00:11:13,052 >> -Zoom. 265 00:11:13,052 --> 00:11:13,197 >> [Risas] 266 00:11:13,197 --> 00:11:14,360 >> -Move-se dentro 267 00:11:14,360 --> 00:11:15,100 >> -Espere, pare. 268 00:11:15,100 --> 00:11:15,740 >> -Deter. 269 00:11:15,740 --> 00:11:16,290 >> -Pausa-lo. 270 00:11:16,290 --> 00:11:19,390 >> Xirar en torno de 75 graos por favor, a vertical. 271 00:11:19,390 --> 00:11:19,886 >> [Risas] 272 00:11:19,886 --> 00:11:24,350 >> -Pare, e de volta para a parte sobre a porta de novo. 273 00:11:24,350 --> 00:11:26,330 >> -Ten un intensificador de imaxe que pode bitmap? 274 00:11:26,330 --> 00:11:28,990 >> -Quizais poidamos utilizar o Pradeep Sen método para ver nas fiestras. 275 00:11:28,990 --> 00:11:30,680 >> -Esta aplicación é o estado da arte. 276 00:11:30,680 --> 00:11:31,676 >> -O valor icona está desactivado. 277 00:11:31,676 --> 00:11:34,166 >> -Coa combinación certa de algoritmos. 278 00:11:34,166 --> 00:11:38,399 >> -El levou algoritmos de iluminación para o seguinte nivel e podo usalos para 279 00:11:38,399 --> 00:11:38,648 mellorar esta foto. 280 00:11:38,648 --> 00:11:42,050 >> -Lock e ampliar o eixo z. 281 00:11:42,050 --> 00:11:42,760 >> -Mellorar. 282 00:11:42,760 --> 00:11:43,060 >> -Mellorar. 283 00:11:43,060 --> 00:11:43,760 >> -Mellorar. 284 00:11:43,760 --> 00:11:45,010 >> Conxelación e mellorar. 285 00:11:45,010 --> 00:11:47,470 286 00:11:47,470 --> 00:11:47,910 >> [FIN reprodución de vídeo] 287 00:11:47,910 --> 00:11:51,470 >> DAVID J. Malan: Entón Set Problem 5 é o que está por chegar alí. 288 00:11:51,470 --> 00:11:55,260 Entón, imos en breve ter unha mellor comprensión de cando e por que se pode 289 00:11:55,260 --> 00:11:57,300 ea nosa non pode mellorar nese sentido. 290 00:11:57,300 --> 00:12:00,090 Pero, primeiro, imos voltar a nosa atención para algúns dos bloques de construción imos 291 00:12:00,090 --> 00:12:02,250 que ser capaz de contar esta historia. 292 00:12:02,250 --> 00:12:05,580 >> Entón, lembro que tirei esta foto en Luns e algo a semana pasada. 293 00:12:05,580 --> 00:12:09,970 E iso describe o esquema das cousas na memoria do seu ordenador cando 294 00:12:09,970 --> 00:12:11,000 execución dalgún programa. 295 00:12:11,000 --> 00:12:14,310 O segmento de tecnoloxía encima, aviso, refírese a para os ceros e uns reais 296 00:12:14,310 --> 00:12:16,000 que compoñen o programa. 297 00:12:16,000 --> 00:12:19,340 Hai, a continuación, algúns inicializar ou datos non inicializados, que normalmente 298 00:12:19,340 --> 00:12:22,910 refírese a cousas como constantes ou cadeas ou variables globais que teñen 299 00:12:22,910 --> 00:12:24,200 previamente declarado. 300 00:12:24,200 --> 00:12:26,500 Hai a pila, pero nós imos chegar de volta para que de aquí a pouco. 301 00:12:26,500 --> 00:12:27,410 >> E despois hai a pila. 302 00:12:27,410 --> 00:12:30,660 Moi parecido a unha pila de bandexas no cafetería, este é o lugar onde a memoria queda 303 00:12:30,660 --> 00:12:33,610 en capas e capas sempre fai o que nun programa? 304 00:12:33,610 --> 00:12:36,380 305 00:12:36,380 --> 00:12:37,730 Cal é o uso de pila para? 306 00:12:37,730 --> 00:12:39,320 >> Si? 307 00:12:39,320 --> 00:12:40,000 >> Chamada de función. 308 00:12:40,000 --> 00:12:42,890 Cada vez que chamar a unha función, é dato ao anaco de memoria para a súa 309 00:12:42,890 --> 00:12:45,020 variables locais ou os seus parámetros. 310 00:12:45,020 --> 00:12:48,810 E pictoricamente vemos que cada Función chamada sucesiva, cando a 311 00:12:48,810 --> 00:12:52,520 chamadas B chama C chamadas D, eles se en capas na pila. 312 00:12:52,520 --> 00:12:55,630 E dentro de cada unha das devanditas franxas de memoria é esencialmente unha extensión única 313 00:12:55,630 --> 00:12:58,590 para esa función, o que, evidentemente, é problemático se quere entregar 314 00:12:58,590 --> 00:13:01,850 a partir dunha función a outra Unha peza de datos que queres que 315 00:13:01,850 --> 00:13:03,500 para Mutare ou cambiar. 316 00:13:03,500 --> 00:13:08,060 >> Entón, cal foi a nosa solución de posibilitar Unha función representada por unha pila 317 00:13:08,060 --> 00:13:11,390 marco para cambiar a memoria dentro doutro cadro de pila? 318 00:13:11,390 --> 00:13:14,590 Como os dous falan un ao outro? 319 00:13:14,590 --> 00:13:18,510 Así, a través de punteiros ou enderezos, que, de novo, só describir o lugar onde en 320 00:13:18,510 --> 00:13:22,280 memoria, a través dun específico número mordida, o particular 321 00:13:22,280 --> 00:13:23,830 valor se pode atopar. 322 00:13:23,830 --> 00:13:26,860 Entón lembro da última vez tamén seguimos a historia e mirou a 323 00:13:26,860 --> 00:13:28,280 moi programa de buggy. 324 00:13:28,280 --> 00:13:32,900 E este programa é buggy para poucos motivos, pero o máis preocupante é 325 00:13:32,900 --> 00:13:34,620 porque non pode comprobar o que? 326 00:13:34,620 --> 00:13:39,111 327 00:13:39,111 --> 00:13:40,450 >> Si, non pode verificar a entrada. 328 00:13:40,450 --> 00:13:41,870 Sentímolo? 329 00:13:41,870 --> 00:13:43,880 >> De ser máis de 12 caracteres. 330 00:13:43,880 --> 00:13:47,260 Entón, moi esperta, ao chamar memcopy, que, como o nome indica, só 331 00:13:47,260 --> 00:13:50,630 memoria copias do seu segundo argumento no seu primeiro argumento. 332 00:13:50,630 --> 00:13:54,730 O terceiro argumento, moi esperta, é Comprobarase para asegurarse de que non 333 00:13:54,730 --> 00:13:59,400 copiar máis que, neste caso, a lonxitude de bar, número de caracteres, 334 00:13:59,400 --> 00:14:03,810 ao destino, o que é isto serie C. Pero o problema é que o que 335 00:14:03,810 --> 00:14:07,230 a propia C non é grande abondo para tratar con isto? 336 00:14:07,230 --> 00:14:09,900 Vai pegar o número de bytes que xa foi dado. 337 00:14:09,900 --> 00:14:13,040 Pero o que realmente ten máis bytes que ten espazo para? 338 00:14:13,040 --> 00:14:16,770 >> Ben, este programa moi tolamente só cegamente pasa a ter todo o que é 339 00:14:16,770 --> 00:14:20,650 dado, Ola barra invertida é 0 óptimo se cadea é curto 340 00:14:20,650 --> 00:14:22,040 suficiente, como cinco caracteres. 341 00:14:22,040 --> 00:14:26,470 Pero se é realmente 12 caracteres ou 1200 caracteres, vimos a última vez 342 00:14:26,470 --> 00:14:29,380 que está indo só para totalmente sobreescribir a memoria que 343 00:14:29,380 --> 00:14:30,470 non pertence a vostede. 344 00:14:30,470 --> 00:14:34,390 E o peor caso, se substituír este parte vermella alí que chamamos 345 00:14:34,390 --> 00:14:35,380 enderezo do remitente - 346 00:14:35,380 --> 00:14:38,370 iso é só onde o ordenador automaticamente, para vostede, por tras da 347 00:14:38,370 --> 00:14:43,130 escenas, pregos de distancia un valor de 32 bits que lembra-lo ao enderezo que debería 348 00:14:43,130 --> 00:14:47,080 volver cando foo, esta outra función, está feito de execución. 349 00:14:47,080 --> 00:14:49,320 É unha migas de pan de tipo ao cal ela retorna. 350 00:14:49,320 --> 00:14:52,490 Se substituír o que, potencialmente, se é o cara mal, pode podería 351 00:14:52,490 --> 00:14:54,750 potencialmente asumir ordenador de alguén. 352 00:14:54,750 --> 00:14:58,020 E vai certamente lanzalo na maioría dos casos. 353 00:14:58,020 --> 00:15:01,690 >> Agora, este problema só foi agravado como comezamos a falar sobre a memoria 354 00:15:01,690 --> 00:15:03,010 xestión en xeral. 355 00:15:03,010 --> 00:15:07,150 E malloc, a distribución de memoria, é unha función que podemos utilizar para reservar 356 00:15:07,150 --> 00:15:11,260 memoria cando non se sabe con antelación que pode ter algún. 357 00:15:11,260 --> 00:15:13,960 Así, por exemplo, se eu volver para o dispositivo aquí. 358 00:15:13,960 --> 00:15:21,010 E eu abrir a partir do último hello2.c tempo, recordar este programa, que parecía 359 00:15:21,010 --> 00:15:23,500 un pouco algo así, só tres liñas - 360 00:15:23,500 --> 00:15:27,940 indicar o seu nome, nome cadea, na parte esquerda, é igual a getstring. 361 00:15:27,940 --> 00:15:29,690 E, entón, imprimir-lo, o nome do usuario. 362 00:15:29,690 --> 00:15:31,170 >> Polo tanto, este era un super programa sinxelo. 363 00:15:31,170 --> 00:15:34,870 Para ser claro, déixeme ir adiante e make Ola-2. 364 00:15:34,870 --> 00:15:36,680 Vou facer o punto barra Ola-2. 365 00:15:36,680 --> 00:15:37,750 Diga o seu nome - 366 00:15:37,750 --> 00:15:38,140 David. 367 00:15:38,140 --> 00:15:38,840 Intro. 368 00:15:38,840 --> 00:15:39,540 Ola David. 369 00:15:39,540 --> 00:15:41,060 Parece que funciona OK. 370 00:15:41,060 --> 00:15:43,140 Pero o que realmente está a suceder baixo capo aquí? 371 00:15:43,140 --> 00:15:44,670 Primeiro imos pelar algunhas capas. 372 00:15:44,670 --> 00:15:48,380 Cadea é só un sinónimo temos entender para que? 373 00:15:48,380 --> 00:15:49,110 Estrela Char. 374 00:15:49,110 --> 00:15:52,740 Entón, imos facelo un pouco máis escuro pero técnicamente máis correcto que este 375 00:15:52,740 --> 00:15:55,570 é unha estrela char, o que significa que nome, si, é unha variable. 376 00:15:55,570 --> 00:15:59,920 Pero o que almacena o nome é o enderezo de un char, que se sente un pouco raro 377 00:15:59,920 --> 00:16:01,050 por que eu estou a recibir de volta unha cadea. 378 00:16:01,050 --> 00:16:03,580 Estou volvendo múltiple caracteres non un char. 379 00:16:03,580 --> 00:16:07,400 >> Pero, por suposto, só precisa do primeiro enderezo do char para lembrar de onde o 380 00:16:07,400 --> 00:16:08,870 corda toda é porque por que? 381 00:16:08,870 --> 00:16:12,700 Como descubrir onde está o fin do a cadea é saber o comezo? 382 00:16:12,700 --> 00:16:13,630 A barra invertida cero. 383 00:16:13,630 --> 00:16:17,260 Así, con esas dúas pistas que descubrir antes do comezo e fin da 384 00:16:17,260 --> 00:16:20,280 calquera secuencia son, con tal de que son formada adecuadamente que null 385 00:16:20,280 --> 00:16:22,110 terminador, que invertida cero. 386 00:16:22,110 --> 00:16:24,520 >> Pero iso está chamado getstring. 387 00:16:24,520 --> 00:16:28,020 E verifícase que getstring todo este tempo foi unha especie de 388 00:16:28,020 --> 00:16:28,820 trampas para nós. 389 00:16:28,820 --> 00:16:32,460 Vén facendo este traballo, con certeza, recibindo unha cadea do usuario. 390 00:16:32,460 --> 00:16:34,580 Pero onde é que a memoria vindo? 391 00:16:34,580 --> 00:16:38,440 Se volvemos para a imaxe aquí e aplicar a definición de só un 392 00:16:38,440 --> 00:16:42,610 hai pouco, que a pila é onde memoria ocorre cando as funcións son chamadas, 393 00:16:42,610 --> 00:16:45,370 por esa lóxica, cando chama getstring, e entón eu escribir 394 00:16:45,370 --> 00:16:50,900 D-V bis-I-D Intro, en que é D-A-V-I-D barra invertida a cero almacenado, con base no 395 00:16:50,900 --> 00:16:53,480 historia que nos dixo ata agora? 396 00:16:53,480 --> 00:16:55,190 >> Parece estar en a pila, non? 397 00:16:55,190 --> 00:16:58,120 Cando liga para obter corda ten un pequeno anaco de memoria na pila. 398 00:16:58,120 --> 00:17:01,630 Entón, é lóxico que a D-A-V-I-D invertida cero almacénase 399 00:17:01,630 --> 00:17:02,770 existe na pila. 400 00:17:02,770 --> 00:17:07,680 Pero agarde un minuto, getString retorno esta secuencia, por así dicir, o que significa 401 00:17:07,680 --> 00:17:11,700 é bandexa de cafetería é eliminado da pila. 402 00:17:11,700 --> 00:17:14,560 E dixen a última vez que tan pronto a función retorna, e ter que 403 00:17:14,560 --> 00:17:20,109 taboleiro, por así dicir, fóra da pila, o que pode asumir sobre os restos 404 00:17:20,109 --> 00:17:21,819 que a memoria? 405 00:17:21,819 --> 00:17:25,160 Eu medio que redesenhou os como puntos de interrogación porque efectivamente facer 406 00:17:25,160 --> 00:17:26,250 valores descoñecidos. 407 00:17:26,250 --> 00:17:29,500 Poden ser reutilizados cando algúns seguinte función é chamada. 408 00:17:29,500 --> 00:17:31,870 >> Noutras palabras, se ocorrer o almacenamento - 409 00:17:31,870 --> 00:17:34,350 Vou sacar unha foto rápida aquí do conxunto. 410 00:17:34,350 --> 00:17:38,690 Se ocorrer de estar chegando ao fondo do meu segmento de memoria, e imos dicir 411 00:17:38,690 --> 00:17:42,230 que este é o lugar de memoria ocupado polo principal e quizais arg C e 412 00:17:42,230 --> 00:17:46,790 arg v e calquera outra cousa no programa, getstring cando se chama, 413 00:17:46,790 --> 00:17:51,120 presuntamente getstring queda un bloque de memoria aquí. 414 00:17:51,120 --> 00:17:53,940 E entón D-A-V-I-D dalgún xeito remata nesta función. 415 00:17:53,940 --> 00:17:55,320 E eu vou simplificar. 416 00:17:55,320 --> 00:18:00,050 Pero imos supoñer que o D-A-V-I-D barra invertida cero. 417 00:18:00,050 --> 00:18:03,500 Entón iso moitos bytes se usan en o cadro para getstring. 418 00:18:03,500 --> 00:18:08,270 >> Pero tan pronto volve getString, nos dixo a última vez que esa memoria sobre 419 00:18:08,270 --> 00:18:11,340 aquí todo se fai - Woops! - 420 00:18:11,340 --> 00:18:14,270 todo se fai efectivamente eliminados. 421 00:18:14,270 --> 00:18:17,220 E podemos pensar niso agora como tema marcas porque quen sabe 422 00:18:17,220 --> 00:18:18,720 o que vai facer-se de que a memoria. 423 00:18:18,720 --> 00:18:22,130 En realidade, eu moitas veces chamar funcións agás getstring. 424 00:18:22,130 --> 00:18:24,750 E así que eu chamo algún outro función de getstring, quizais non en 425 00:18:24,750 --> 00:18:28,860 este programa específico que só mirou pero nalgúns outros, certamente algunha outra 426 00:18:28,860 --> 00:18:34,180 función pode acabar sendo dado este punto seguinte na pila. 427 00:18:34,180 --> 00:18:39,410 >> Polo tanto, non pode ser que as tendas getString D-A-V-I-D na pila, porque eu faría 428 00:18:39,410 --> 00:18:41,040 inmediatamente perder acceso a ela. 429 00:18:41,040 --> 00:18:43,720 Pero sabemos que getString só devolve o que? 430 00:18:43,720 --> 00:18:47,220 Non está volvendo a me seis caracteres. 431 00:18:47,220 --> 00:18:51,090 Que realmente volvendo conclúese que a última vez? 432 00:18:51,090 --> 00:18:52,480 O enderezo do primeiro. 433 00:18:52,480 --> 00:18:56,650 Entón, dalgunha forma, cando chamou getstring, é reservar un bloque de memoria para 434 00:18:56,650 --> 00:18:59,620 a corda que o tipo e os usuarios enderezo, a continuación, regresar a ela. 435 00:18:59,620 --> 00:19:02,930 E verifícase que cando quere funciona para reservar memoria neste 436 00:19:02,930 --> 00:19:08,390 camiño e volver para a persoa que chamou esta función, o enderezo 437 00:19:08,390 --> 00:19:11,870 que pedazo de memoria, é absolutamente non pode poñelas na pila no 438 00:19:11,870 --> 00:19:14,750 baixo, porque funcionalmente é só vai facer o seu moi 439 00:19:14,750 --> 00:19:17,800 rapidamente, así que pode ser difícil de adiviñar onde estamos indo probablemente para lanzalo 440 00:19:17,800 --> 00:19:20,130 no seu lugar, a chamada pila. 441 00:19:20,130 --> 00:19:25,290 >> Así, entre o fondo da súa memoria de esquema e do alto da súa memoria do 442 00:19:25,290 --> 00:19:26,820 disposición son unha morea de segmentos. 443 00:19:26,820 --> 00:19:29,270 Unha delas é a pila, e á dereita anterior, é o heap. 444 00:19:29,270 --> 00:19:33,680 E pila é só unha peza diferente de memoria que non se usa para funcións 445 00:19:33,680 --> 00:19:34,770 cando son chamados. 446 00:19:34,770 --> 00:19:38,100 Tamén se usa para a memoria a longo prazo, cando quere unha función para incorporarse algúns 447 00:19:38,100 --> 00:19:42,700 memoria e ser capaz de seguro-la sen perder o control sobre el. 448 00:19:42,700 --> 00:19:45,550 >> Agora podería quizais inmediatamente ver que esta non é 449 00:19:45,550 --> 00:19:48,060 necesariamente un deseño perfecto. 450 00:19:48,060 --> 00:19:51,350 Tal como o seu programa de memoria alocada en a pila, ou como vostedes chaman máis e 451 00:19:51,350 --> 00:19:55,540 máis funcións, ou como reservar memoria na pila con malloc fóra como 452 00:19:55,540 --> 00:20:00,690 getstring está facendo, o que claramente parece ser problema inevitable? 453 00:20:00,690 --> 00:20:00,860 >> Correcto. 454 00:20:00,860 --> 00:20:03,150 Como o feito de que estas frechas están apuntando un para o outro 455 00:20:03,150 --> 00:20:04,380 non augura nada bo. 456 00:20:04,380 --> 00:20:08,630 E, de feito, poderíamos bater moi rápido un programa en calquera número de formas. 457 00:20:08,630 --> 00:20:12,050 En realidade, eu creo que pode ter accidentalmente unha vez feito isto. 458 00:20:12,050 --> 00:20:14,020 Ou se non, imos facelo deliberadamente agora. 459 00:20:14,020 --> 00:20:21,330 Déixeme ir adiante e escribir super-rápida un programa chamado dontdothis.c. 460 00:20:21,330 --> 00:20:26,730 E agora eu vou entrar aquí e non afiada incluír stdio.h. 461 00:20:26,730 --> 00:20:32,620 Imos declarar a función foo leva Sen argumentos, o que é 462 00:20:32,620 --> 00:20:34,040 denotado como ben por nula. 463 00:20:34,040 --> 00:20:37,830 >> E o único foo vai facer é chamada foo, o que probablemente non é o 464 00:20:37,830 --> 00:20:39,100 máis intelixente idea, pero que así sexa. 465 00:20:39,100 --> 00:20:40,490 Ent void main. 466 00:20:40,490 --> 00:20:45,270 Agora o único principal que vai que facer é chamar foo ben. 467 00:20:45,270 --> 00:20:51,050 E, só por diversión, eu vou adiante e dicir printf "Ola dende 468 00:20:51,050 --> 00:20:52,340 foo ". 469 00:20:52,340 --> 00:20:52,890 >> Aceptar. 470 00:20:52,890 --> 00:21:00,160 Entón, se eu non cometer erros, Fai dontdothis dot barra. 471 00:21:00,160 --> 00:21:01,960 E imos facelo nunha fiestra maior - 472 00:21:01,960 --> 00:21:03,210 dot slash, dontdothis. 473 00:21:03,210 --> 00:21:07,590 474 00:21:07,590 --> 00:21:08,840 Imos. 475 00:21:08,840 --> 00:21:10,940 476 00:21:10,940 --> 00:21:11,890 Uh oh. 477 00:21:11,890 --> 00:21:13,100 Ao parecer, pode facelo. 478 00:21:13,100 --> 00:21:15,190 Drogas. 479 00:21:15,190 --> 00:21:16,190 Aceptar. 480 00:21:16,190 --> 00:21:16,580 Espera. 481 00:21:16,580 --> 00:21:17,370 Stand by. 482 00:21:17,370 --> 00:21:18,270 Será que nós - 483 00:21:18,270 --> 00:21:20,110 Fixemos usalo con Make. 484 00:21:20,110 --> 00:21:22,050 >> [Suspira] 485 00:21:22,050 --> 00:21:25,110 >> Eu sei, pero eu creo que nós Acaba de eliminar iso. 486 00:21:25,110 --> 00:21:28,410 Uh, si. 487 00:21:28,410 --> 00:21:30,660 Drogas. 488 00:21:30,660 --> 00:21:32,640 Resolva este Rob. 489 00:21:32,640 --> 00:21:34,678 O que? 490 00:21:34,678 --> 00:21:35,928 É moi sinxelo. 491 00:21:35,928 --> 00:21:43,820 492 00:21:43,820 --> 00:21:47,360 Si, volvemos a optimización off. 493 00:21:47,360 --> 00:21:48,970 OK, stand bye. 494 00:21:48,970 --> 00:21:49,950 Agora síntome mellor. 495 00:21:49,950 --> 00:21:51,390 Aceptar. 496 00:21:51,390 --> 00:21:51,780 Todo ben. 497 00:21:51,780 --> 00:21:53,430 >> Entón, imos recompilar iso - 498 00:21:53,430 --> 00:21:55,880 Faga vostede dontdothis. 499 00:21:55,880 --> 00:22:00,090 Pode ter que cambiar o nome deste para dothis.c en só un momento. 500 00:22:00,090 --> 00:22:00,710 Alí imos nós. 501 00:22:00,710 --> 00:22:01,240 Grazas. 502 00:22:01,240 --> 00:22:02,050 Aceptar. 503 00:22:02,050 --> 00:22:05,480 Así, o feito de que eu estaba imprimindo algo se realmente só 504 00:22:05,480 --> 00:22:08,150 retardando o proceso polo cal nós chegaría a ese punto. 505 00:22:08,150 --> 00:22:08,510 Aceptar. 506 00:22:08,510 --> 00:22:08,870 Uf! 507 00:22:08,870 --> 00:22:11,180 >> Entón, o que está realmente a suceder? 508 00:22:11,180 --> 00:22:14,440 A razón alí, así como un aparte, é facer calquera cousa en canto a entrada e 509 00:22:14,440 --> 00:22:17,270 produción tende a ser máis lento, porque Ten que escribir caracteres ao 510 00:22:17,270 --> 00:22:18,600 pantalla, ten que rodar. 511 00:22:18,600 --> 00:22:21,720 Así, longa historia curta, eu tiña realmente Pasou tan impaciente, teriamos 512 00:22:21,720 --> 00:22:23,260 vin ese resultado final tamén. 513 00:22:23,260 --> 00:22:26,220 Agora que eu teño paseo dos print emerxentes, Vemo-lo inmediatamente. 514 00:22:26,220 --> 00:22:28,410 Entón, por que isto está a suceder. 515 00:22:28,410 --> 00:22:31,300 Pois ben, a explicación simple, claro, foo é que probablemente non debería 516 00:22:31,300 --> 00:22:32,500 ser que se autodenomina. 517 00:22:32,500 --> 00:22:34,470 >> Agora, en termos xerais, esta é a recursividade. 518 00:22:34,470 --> 00:22:36,970 E nós cremos que algunhas semanas atrás recursiva é bo. 519 00:22:36,970 --> 00:22:40,330 Recursividade é desa forma máxica de expresar-se de super sucinta. 520 00:22:40,330 --> 00:22:41,400 E el simplemente funciona. 521 00:22:41,400 --> 00:22:45,060 Pero hai unha característica fundamental de todos os programas recursivos con quen falamos 522 00:22:45,060 --> 00:22:48,260 preto e mirou, ata agora, o que era que eles tiñan o que? 523 00:22:48,260 --> 00:22:52,610 Un caso base, que era un pouco difícil Coded caso de que o referido en algunhas situacións 524 00:22:52,610 --> 00:22:56,210 non chamar foo, o que é claramente non é o caso aquí. 525 00:22:56,210 --> 00:22:58,920 >> Entón, o que está realmente a suceder en termos de esta imaxe? 526 00:22:58,920 --> 00:23:01,790 Ben, cando principal chámase foo, que recibe unha porción de memoria. 527 00:23:01,790 --> 00:23:04,150 Cando chama foo foo, el está unha porción de memoria. 528 00:23:04,150 --> 00:23:06,430 Cando chama foo foo, el recibe unha porción. 529 00:23:06,430 --> 00:23:07,080 Ela recibe unha porción. 530 00:23:07,080 --> 00:23:08,120 Ela recibe unha porción. 531 00:23:08,120 --> 00:23:09,460 Por foo nunca está volvendo. 532 00:23:09,460 --> 00:23:12,160 Nunca está apagando un destes cadros da pila. 533 00:23:12,160 --> 00:23:15,930 Entón, nós estamos golpe a través do conxunto, non mencionar quen sabe o que máis, e 534 00:23:15,930 --> 00:23:19,600 estamos superando os límites do noso o chamado segmento de memoria. 535 00:23:19,600 --> 00:23:21,790 Erro ir segmentación falsa. 536 00:23:21,790 --> 00:23:24,110 >> Polo tanto, a solución hai claramente, non fagas iso. 537 00:23:24,110 --> 00:23:28,830 Pero a maior implicación é que, si, non é absolutamente un límite, 538 00:23:28,830 --> 00:23:32,470 mesmo se non está ben definido, o xeito no que moitas funcións que pode chamar dunha 539 00:23:32,470 --> 00:23:34,970 programa, as veces unha función pode chamar a si mesma. 540 00:23:34,970 --> 00:23:38,430 Así, aínda que fixemos predicar recursão como esa cousa máxica potencialmente un 541 00:23:38,430 --> 00:23:41,870 par de semanas ao sigma función, e cando teñamos os datos 542 00:23:41,870 --> 00:23:45,270 estruturas e CS50, verá outro aplicacións para el, non é 543 00:23:45,270 --> 00:23:46,500 necesariamente o mellor. 544 00:23:46,500 --> 00:23:50,070 Porque se unha función chama a si mesmo, chama-se, mesmo se non hai unha base 545 00:23:50,070 --> 00:23:54,860 caso, se non acertar que no caso de base para 1.000 chamadas ou 10.000 chamadas, por 546 00:23:54,860 --> 00:23:58,800 que o tempo que pode ter executado fóra da sala no seu chamado pila e éxito 547 00:23:58,800 --> 00:24:00,400 algúns outros segmentos de memoria. 548 00:24:00,400 --> 00:24:03,950 Por iso, tamén é un proxecto de trade-off entre elegancia e entre 549 00:24:03,950 --> 00:24:06,920 robustez do seu especial implementación. 550 00:24:06,920 --> 00:24:10,780 >> Polo tanto, non hai outra desvantaxe ou Outra pegadinha co que temos 551 00:24:10,780 --> 00:24:11,720 está a facer ata agora. 552 00:24:11,720 --> 00:24:12,980 Cando chamei getstring - 553 00:24:12,980 --> 00:24:15,120 déixeme volver en Ola-2. 554 00:24:15,120 --> 00:24:18,170 Repare que eu estou chamando getstring, que está retornando un enderezo. 555 00:24:18,170 --> 00:24:20,730 E afirmamos onte que a dirección é dende o heap. 556 00:24:20,730 --> 00:24:24,480 E agora estou imprimindo a cadea nese enderezo. 557 00:24:24,480 --> 00:24:27,000 Pero nós nunca chamou a contrario getstring. 558 00:24:27,000 --> 00:24:30,850 Nós nunca tivemos a calll unha función como ungetstring, onde a man de novo 559 00:24:30,850 --> 00:24:31,610 esta memoria. 560 00:24:31,610 --> 00:24:33,250 Pero, francamente, nós probablemente debería ser. 561 00:24:33,250 --> 00:24:37,390 Porque se segue preguntando o ordenador para a memoria, a través de alguén como 562 00:24:37,390 --> 00:24:40,830 getstring pero nunca devolve-lo, con certeza iso tamén está obrigado a levar a 563 00:24:40,830 --> 00:24:42,970 problemas en que corremos de memoria. 564 00:24:42,970 --> 00:24:46,140 >> E, de feito, podemos ollar para estes problemas coa nova ferramenta, cuxo uso 565 00:24:46,140 --> 00:24:47,640 é un pouco enigmático para escribir. 566 00:24:47,640 --> 00:24:50,960 Pero déixeme ir adiante e peirao-se na pantalla en só un momento. 567 00:24:50,960 --> 00:24:56,940 Eu estou indo a ir adiante e executar Valgrind co parámetro cuxo primeiro mando 568 00:24:56,940 --> 00:25:00,260 argumento de liña é o nome dese programa Ola-2. 569 00:25:00,260 --> 00:25:02,650 E, por desgraza, é saída é atrozmente 570 00:25:02,650 --> 00:25:04,290 complexo sen unha boa razón. 571 00:25:04,290 --> 00:25:06,280 Así, podemos ver toda esa confusión. 572 00:25:06,280 --> 00:25:07,530 David é expoñer o meu nome. 573 00:25:07,530 --> 00:25:09,760 Entón este é o programa realmente funciona. 574 00:25:09,760 --> 00:25:11,180 E agora temos esta saída. 575 00:25:11,180 --> 00:25:13,400 >> Entón Valgrind é semellante en espírito de GDB. 576 00:25:13,400 --> 00:25:14,950 Non é un depurador per se. 577 00:25:14,950 --> 00:25:16,270 Pero é un verificador de memoria. 578 00:25:16,270 --> 00:25:20,140 É un programa que vai realizar o seu programar e dicirlle se preguntase a un 579 00:25:20,140 --> 00:25:23,860 ordenador para a memoria e nunca entregou cara atrás, é dicir, así que ten 580 00:25:23,860 --> 00:25:24,570 un escape de memoria. 581 00:25:24,570 --> 00:25:26,240 Correo perdas de memoria tenden a ser malo. 582 00:25:26,240 --> 00:25:29,120 E é que os usuarios de computadores teñen probablemente sentiu tanto, se ten un 583 00:25:29,120 --> 00:25:30,300 Mac ou PC. 584 00:25:30,300 --> 00:25:33,730 Algunha vez xa usou o ordenador para tempo e non reiniciar en varios 585 00:25:33,730 --> 00:25:36,820 días, ou só ten unha morea de programas en execución, ea cousa maldita 586 00:25:36,820 --> 00:25:42,360 desacelera a unha parada, ou polo menos é super aburrido de usar, porque 587 00:25:42,360 --> 00:25:44,350 todo quedou super lento. 588 00:25:44,350 --> 00:25:46,260 >> Agora que pode ser calquera número de razóns. 589 00:25:46,260 --> 00:25:49,600 Podería ser un loop infinito, un erro no código de alguén, ou, máis simplemente, 590 00:25:49,600 --> 00:25:53,250 pode significar que está a usar máis memoria, ou intentar, que o seu 591 00:25:53,250 --> 00:25:54,920 ordenador realmente ten. 592 00:25:54,920 --> 00:25:57,770 E quizais hai un erro en algún programa que sigo a preguntar para a memoria. 593 00:25:57,770 --> 00:26:02,480 Navegadores hai anos eran notorios por este, pedindo máis e máis memoria 594 00:26:02,480 --> 00:26:03,870 pero nunca entrega-lo de volta. 595 00:26:03,870 --> 00:26:07,220 Por suposto, se ten só un finito cantidade de memoria, non se pode pedir 596 00:26:07,220 --> 00:26:09,990 infinitamente moitas veces para algunha desa memoria. 597 00:26:09,990 --> 00:26:13,070 >> E así, o que ve aquí, aínda que de novo a saída do Valgrind é 598 00:26:13,070 --> 00:26:17,490 innecesariamente complexo para mirar en primeiro lugar, esta é a parte interesante. 599 00:26:17,490 --> 00:26:18,890 Heap - 600 00:26:18,890 --> 00:26:20,060 en uso na saída. 601 00:26:20,060 --> 00:26:22,810 Entón aquí é o que de memoria foi en uso na pila no 602 00:26:22,810 --> 00:26:24,300 tempo meu programa saíu - 603 00:26:24,300 --> 00:26:27,280 parecer seis bytes nun bloque. 604 00:26:27,280 --> 00:26:28,710 Entón eu vou para acenar as mans en que un bloque é. 605 00:26:28,710 --> 00:26:31,270 Pense que é só unha peza, un máis palabra técnica para peza. 606 00:26:31,270 --> 00:26:33,140 Pero seis bytes - 607 00:26:33,140 --> 00:26:36,870 cales son os seis bytes que aínda estaban en uso? 608 00:26:36,870 --> 00:26:37,390 >> Exactamente. 609 00:26:37,390 --> 00:26:41,520 D-A-V-I-D barra invertida cero, cinco letras nome máis o terminador nulo. 610 00:26:41,520 --> 00:26:46,350 Polo tanto, este programa Valgrind notado que eu preguntou por seis bytes parecer por 611 00:26:46,350 --> 00:26:48,950 forma getstring, pero nunca deulles de volta. 612 00:26:48,950 --> 00:26:52,030 E, de feito, iso non pode ser así evidente, se o meu programa non é tres 613 00:26:52,030 --> 00:26:53,590 liñas, pero é 300 liñas. 614 00:26:53,590 --> 00:26:56,920 Así, podemos realmente dar outro comando argumento de liña de Valgrind para 615 00:26:56,920 --> 00:26:58,290 facelo máis detallado. 616 00:26:58,290 --> 00:26:59,760 É un pouco aburrido para lembrar. 617 00:26:59,760 --> 00:27:01,580 Pero se eu fai - 618 00:27:01,580 --> 00:27:01,930 imos ver. 619 00:27:01,930 --> 00:27:03,540 Escape - 620 00:27:03,540 --> 00:27:05,030 Foi el baleirar - 621 00:27:05,030 --> 00:27:07,580 aínda que eu non me lembro o que é fóra de man. 622 00:27:07,580 --> 00:27:08,550 >> - Baleirado de verificación é igual a integral. 623 00:27:08,550 --> 00:27:10,180 Si, grazas. 624 00:27:10,180 --> 00:27:12,520 - Baleirado de verificación é igual a integral. 625 00:27:12,520 --> 00:27:13,800 Intro. 626 00:27:13,800 --> 00:27:14,940 Mesmo programa está a ser executado. 627 00:27:14,940 --> 00:27:16,180 Introduza David de novo. 628 00:27:16,180 --> 00:27:17,660 Agora vexo un pouco máis detalladamente. 629 00:27:17,660 --> 00:27:20,890 Pero a continuación o resumo do heap, que é idéntica á de catro - ah, 630 00:27:20,890 --> 00:27:22,120 iso é ben legal. 631 00:27:22,120 --> 00:27:25,460 Agora Valgrind está realmente a buscar un pouco máis no meu código. 632 00:27:25,460 --> 00:27:29,580 E está dicindo que, ao parecer, malloc en liña - 633 00:27:29,580 --> 00:27:30,580 que diminuír o zoom. 634 00:27:30,580 --> 00:27:31,980 En liña - 635 00:27:31,980 --> 00:27:32,930 non vemos que liña é. 636 00:27:32,930 --> 00:27:35,110 Pero malloc é o primeiro culpable. 637 00:27:35,110 --> 00:27:38,630 Hai un blog en malloc. 638 00:27:38,630 --> 00:27:39,810 >> Todo ben? 639 00:27:39,810 --> 00:27:40,450 OK, non. 640 00:27:40,450 --> 00:27:40,940 Non? 641 00:27:40,940 --> 00:27:42,520 Liguei getString. 642 00:27:42,520 --> 00:27:44,460 getstring parecer chámase malloc. 643 00:27:44,460 --> 00:27:47,800 Entón, cal liña de código é, ao parecer, a culpa por ter 644 00:27:47,800 --> 00:27:49,050 alocados esta memoria? 645 00:27:49,050 --> 00:27:51,560 646 00:27:51,560 --> 00:27:55,540 Imos supor que quen escribiu malloc foi en torno de tempo suficiente para que sexa 647 00:27:55,540 --> 00:27:56,390 non é culpa deles. 648 00:27:56,390 --> 00:27:57,520 Por iso, é probablemente a miña. 649 00:27:57,520 --> 00:28:02,000 getString en cs50.c - o que é unha arquivo en algún lugar no ordenador - 650 00:28:02,000 --> 00:28:05,210 na liña 286 parece ser o culpable. 651 00:28:05,210 --> 00:28:08,140 Agora imos supor que CS50 foi en torno a cantidade razoable de tempo, entón 652 00:28:08,140 --> 00:28:09,720 nós tamén somos infalibles. 653 00:28:09,720 --> 00:28:14,080 E por iso non é, probablemente, en getString que o erro se atopa, senón en 654 00:28:14,080 --> 00:28:17,810 Ola liña-2.c 18. 655 00:28:17,810 --> 00:28:20,670 >> Entón, imos dar un ollo o que que a liña 18 era. 656 00:28:20,670 --> 00:28:21,130 Oh 657 00:28:21,130 --> 00:28:27,130 Dalgún xeito, esta liña non é necesariamente cesta, por si só, pero é a razón 658 00:28:27,130 --> 00:28:28,630 detrás dese escape de memoria. 659 00:28:28,630 --> 00:28:32,140 Tan super sinxelo, o que faría intuitivamente ser a solución aquí? 660 00:28:32,140 --> 00:28:34,710 Se estamos pedindo á memoria, nunca foron dándolle de volta, o que parece ser un 661 00:28:34,710 --> 00:28:37,940 problema, porque co paso do tempo o meu ordenador pode quedar sen memoria, pode diminuír 662 00:28:37,940 --> 00:28:42,110 abaixo, cousas malas poden ocorrer, así, cal é a solución sinxela e intuitiva? 663 00:28:42,110 --> 00:28:43,140 Só ten que darlle de volta. 664 00:28:43,140 --> 00:28:44,770 >> Como liberar esa memoria? 665 00:28:44,770 --> 00:28:49,970 Ben, por sorte, é moi sinxelo só para dicir o nome libre. 666 00:28:49,970 --> 00:28:51,260 E nós nunca fixen iso antes. 667 00:28:51,260 --> 00:28:55,890 Pero pode pensar esencialmente de libre como o contrario do malloc. 668 00:28:55,890 --> 00:28:58,030 libre é o contrario do distribución de memoria. 669 00:28:58,030 --> 00:28:59,540 Entón, agora déixeme recompilar iso. 670 00:28:59,540 --> 00:29:02,050 Fai Ola-2. 671 00:29:02,050 --> 00:29:04,620 Déixeme executa-lo de novo. Ola-2 David. 672 00:29:04,620 --> 00:29:07,290 Así, parece que traballar exactamente da mesma maneira. 673 00:29:07,290 --> 00:29:11,180 Pero se eu volver a Valgrind e re-executar ese mesmo mando no meu recén 674 00:29:11,180 --> 00:29:14,720 compilado programa, escribindo no meu nome como antes - 675 00:29:14,720 --> 00:29:15,370 Niza. 676 00:29:15,370 --> 00:29:16,760 Resumo Heap - 677 00:29:16,760 --> 00:29:17,740 en uso na saída - 678 00:29:17,740 --> 00:29:19,370 cero bytes, en bloques cero. 679 00:29:19,370 --> 00:29:21,840 E iso é super legal, todo bloques de pila foron liberados. 680 00:29:21,840 --> 00:29:23,480 Sen perdas son posibles. 681 00:29:23,480 --> 00:29:27,200 >> Entón, chegando a ser, non con Problema Set 4, pero con Problem Set 5, as forense 682 00:29:27,200 --> 00:29:30,740 e para adiante, iso tamén vai facer un medida da xustiza de súa 683 00:29:30,740 --> 00:29:33,630 programa, se ten ou non ou non ten perdas de memoria. 684 00:29:33,630 --> 00:29:36,900 Pero, por sorte, non só pode razoar a través deles, intuitivamente, que 685 00:29:36,900 --> 00:29:40,430 é, sen dúbida, máis doado para pequenos programas pero máis difícil para programas grandes, 686 00:29:40,430 --> 00:29:43,860 Valgrind, para estes programas máis grandes, pode axudar a identificar 687 00:29:43,860 --> 00:29:45,360 o problema particular. 688 00:29:45,360 --> 00:29:47,500 >> Pero hai outro problema que poida xurdir. 689 00:29:47,500 --> 00:29:51,245 Déixeme abrir este ficheiro aquí, que é, unha vez máis, un exemplo un tanto simple. 690 00:29:51,245 --> 00:29:53,760 Pero imos concentrar no que este programa fai. 691 00:29:53,760 --> 00:29:55,190 Isto chámase memory.c. 692 00:29:55,190 --> 00:29:58,380 Imos publicar máis tarde hoxe no zip do código fonte de hoxe. 693 00:29:58,380 --> 00:30:01,610 E noten que eu teño unha función chamada f que non recibe argumentos e 694 00:30:01,610 --> 00:30:02,800 devolve nada. 695 00:30:02,800 --> 00:30:07,240 Na liña 20, estou parecer declarar unha punteiro para un int e chamando-x. 696 00:30:07,240 --> 00:30:09,570 Estou atribuíndo é o regreso valor de malloc. 697 00:30:09,570 --> 00:30:14,590 E só para quedar claro, cantos bytes son Eu probablemente volvendo de malloc 698 00:30:14,590 --> 00:30:17,080 nesta situación? 699 00:30:17,080 --> 00:30:18,040 >> Probablemente 40. 700 00:30:18,040 --> 00:30:18,840 Onde tirou iso? 701 00:30:18,840 --> 00:30:22,410 Ben, se se lembra que un int é moitas veces 4 bytes, polo menos é na 702 00:30:22,410 --> 00:30:25,110 aparello, 10 veces 4 é, obviamente, 40. 703 00:30:25,110 --> 00:30:28,920 Entón malloc está retornando un enderezo de un bloque de memoria e almacenamento que 704 00:30:28,920 --> 00:30:30,800 resolver en última instancia, x. 705 00:30:30,800 --> 00:30:32,570 Entón, para ser claro, o que entón está a suceder? 706 00:30:32,570 --> 00:30:34,990 Ben, deixe-me volver a nosa imaxe aquí. 707 00:30:34,990 --> 00:30:38,150 Deixe-me só sacar do fondo do meu memoria do ordenador, déixeme ir adiante e 708 00:30:38,150 --> 00:30:42,990 aproveitar todo o rectángulo que representa toda a miña RAM. 709 00:30:42,990 --> 00:30:44,790 >> Digamos que a pila É na parte inferior. 710 00:30:44,790 --> 00:30:47,010 E hai un segmento de texto en os datos non inicializados. 711 00:30:47,010 --> 00:30:49,880 Pero eu só vou abstracto, aquelas outras cousas como punto de distancia, dot dot. 712 00:30:49,880 --> 00:30:53,470 Eu estou indo só para referirse a este como a pila na parte superior. 713 00:30:53,470 --> 00:30:57,070 E, a continuación, na parte inferior da imaxe, para representar o principal, eu vou 714 00:30:57,070 --> 00:30:59,880 para darlle unha memoria franxas na pila. 715 00:30:59,880 --> 00:31:03,150 Para f, eu vou darlle unha porción de memoria na pila. 716 00:31:03,150 --> 00:31:05,140 Agora eu teño que consultar o meu código fonte novo. 717 00:31:05,140 --> 00:31:07,170 Cales son as variables locais para o principal? 718 00:31:07,170 --> 00:31:10,710 Aparentemente nada, entón esa porción é efectivamente baleiro ou nin tan grande 719 00:31:10,710 --> 00:31:11,600 como eu deseño iso. 720 00:31:11,600 --> 00:31:15,730 Pero, en f, eu teño unha variable local, que se chama de x. 721 00:31:15,730 --> 00:31:20,410 Entón, eu estou indo a ir adiante e dar f un bloque de memoria, chamándoo x. 722 00:31:20,410 --> 00:31:24,680 >> E agora malloc de 10 veces 4, Entón malloc 40, onde está o 723 00:31:24,680 --> 00:31:25,430 memoria vén? 724 00:31:25,430 --> 00:31:27,530 Nós non temos sacado unha foto coma este antes. 725 00:31:27,530 --> 00:31:31,140 Pero imos supor que é efectivamente está aquí, entón un, 726 00:31:31,140 --> 00:31:33,170 dous, tres, catro, cinco. 727 00:31:33,170 --> 00:31:34,680 E agora eu teño 40 deles. 728 00:31:34,680 --> 00:31:37,540 Entón eu vou facer punto, punto, punto de suxerir que hai aínda máis memoria 729 00:31:37,540 --> 00:31:39,350 volvendo do heap. 730 00:31:39,350 --> 00:31:40,710 Agora, cal é o enderezo? 731 00:31:40,710 --> 00:31:42,620 Imos escoller o noso arbitraria abordar como sempre - 732 00:31:42,620 --> 00:31:46,310 Ox123, aínda que el probabelmente vai ser algo completamente diferente. 733 00:31:46,310 --> 00:31:50,420 Este é o enderezo do primeiro byte no memoria que eu estou pedindo para malloc. 734 00:31:50,420 --> 00:31:53,630 >> Así, en breve, xa que a liña 20 é executada, o que é literalmente 735 00:31:53,630 --> 00:31:57,170 almacenado dentro de x aquí? 736 00:31:57,170 --> 00:31:58,730 Ox123. 737 00:31:58,730 --> 00:32:00,370 Ox123. 738 00:32:00,370 --> 00:32:01,550 E o boi é desinteressante. 739 00:32:01,550 --> 00:32:03,200 Significa só que aquí está un número hexadecimal. 740 00:32:03,200 --> 00:32:06,490 Pero o que é fundamental é que o que eu teño tenda en x, o que é unha variable local. 741 00:32:06,490 --> 00:32:10,260 Pero o seu tipo de datos, unha vez máis, é un enderezo dun int. 742 00:32:10,260 --> 00:32:12,710 Ben, eu estou indo para almacenar Ox123. 743 00:32:12,710 --> 00:32:16,610 Pero, de novo, se isto é un pouco máis innecesariamente complicado, se eu rolar 744 00:32:16,610 --> 00:32:21,490 cara atrás, podemos abstraerse esta moi lonxe razoable e só dicir que x é un 745 00:32:21,490 --> 00:32:23,910 punteiro para este anaco de memoria. 746 00:32:23,910 --> 00:32:24,070 >> Aceptar. 747 00:32:24,070 --> 00:32:26,230 Agora, a cuestión en apreciado é o seguinte - 748 00:32:26,230 --> 00:32:29,910 liña 21, ao parecer, é buggy. 749 00:32:29,910 --> 00:32:31,160 Por que? 750 00:32:31,160 --> 00:32:34,890 751 00:32:34,890 --> 00:32:36,930 >> Sentímolo? 752 00:32:36,930 --> 00:32:38,640 El non ten - 753 00:32:38,640 --> 00:32:40,390 dicir que unha vez máis. 754 00:32:40,390 --> 00:32:41,240 Ben, iso non acontece balde. 755 00:32:41,240 --> 00:32:42,350 Entón ese é o segundo, pero. 756 00:32:42,350 --> 00:32:45,000 Polo tanto, hai outro, pero especialmente na liña 21. 757 00:32:45,000 --> 00:32:49,480 758 00:32:49,480 --> 00:32:50,040 >> Exactamente. 759 00:32:50,040 --> 00:32:54,980 Este simple liña de código é só unha buffer overflow, unha saturación de buffer. 760 00:32:54,980 --> 00:32:57,050 Un buffer significa só un anaco da memoria. 761 00:32:57,050 --> 00:33:01,520 Pero ese pedazo de memoria é de tamaño 10, 10 enteiros, o que significa que se 762 00:33:01,520 --> 00:33:05,350 índice nel usar o azucre sintático de notación de matriz, a praza 763 00:33:05,350 --> 00:33:09,220 parénteses, ten acceso a x soporte 0 x soporte 1 x, 764 00:33:09,220 --> 00:33:10,390 soporte de punto, punto, punto. 765 00:33:10,390 --> 00:33:13,270 x soporte 9 é o maior deles. 766 00:33:13,270 --> 00:33:17,680 Entón, se eu fai x soporte de 10, onde En realidade, estou indo na memoria? 767 00:33:17,680 --> 00:33:19,120 >> Ben, se eu tivera 10 int - 768 00:33:19,120 --> 00:33:21,070 imos realmente sacar todo destes aquí. 769 00:33:21,070 --> 00:33:22,700 Entón, esta foi a primeira de cinco anos. 770 00:33:22,700 --> 00:33:24,660 Aquí están os outros cinco enteiros. 771 00:33:24,660 --> 00:33:29,580 Entón x 0 soporte está aquí. x soporte 1 é aquí. x soporte 9 é aquí. x soporte 772 00:33:29,580 --> 00:33:37,960 10 está aquí, o que significa que eu estou dicindo, na liña 21, o ordenador de inserir a 773 00:33:37,960 --> 00:33:39,400 número para onde? 774 00:33:39,400 --> 00:33:42,010 O número 0 para onde? 775 00:33:42,010 --> 00:33:43,380 Ben, é 0, si. 776 00:33:43,380 --> 00:33:45,460 Pero só o feito de que a súa 0 é unha especie de coincidencia. 777 00:33:45,460 --> 00:33:47,140 Podería ser o número 50, para todos nós nos importa. 778 00:33:47,140 --> 00:33:50,480 Pero estamos intentando poñelas no soporte x 10, que é o lugar onde esta 779 00:33:50,480 --> 00:33:53,700 punto de interrogação é elaborada, que non é unha cousa boa. 780 00:33:53,700 --> 00:33:57,070 Este programa pode moi ben falla como resultado. 781 00:33:57,070 --> 00:33:59,400 >> Agora, imos adiante e ver se isto é, en realidade, o que pasa. 782 00:33:59,400 --> 00:34:02,600 Facer memoria, xa que o arquivo chámase memory.c. 783 00:34:02,600 --> 00:34:05,950 Imos adiante e executar a memoria do programa. 784 00:34:05,950 --> 00:34:08,239 Entón, tivemos moita sorte, en realidade, ao parecer. 785 00:34:08,239 --> 00:34:09,340 Tivemos sorte. 786 00:34:09,340 --> 00:34:11,060 Pero imos ver se agora executar Valgrind. 787 00:34:11,060 --> 00:34:14,170 A primeira vista, o meu programa pode parece ser perfectamente correcto. 788 00:34:14,170 --> 00:34:18,010 Pero déixeme executar Valgrind co - Baleirado de verificación é igual a plena memoria. 789 00:34:18,010 --> 00:34:20,110 >> E agora, cando executar este - 790 00:34:20,110 --> 00:34:21,030 interesante. 791 00:34:21,030 --> 00:34:26,800 Incorrecto escribir de tamaño 4 a liña 21 do memory.c. 792 00:34:26,800 --> 00:34:29,284 Liña 21 do memory.c é cal? 793 00:34:29,284 --> 00:34:30,340 Oh, interesante. 794 00:34:30,340 --> 00:34:31,080 Pero espera. 795 00:34:31,080 --> 00:34:32,389 Tamaño 4, que é o que se refire? 796 00:34:32,389 --> 00:34:34,969 Eu só fixen unha gravación, pero é do tamaño 4. 797 00:34:34,969 --> 00:34:36,889 Por que é 4? 798 00:34:36,889 --> 00:34:39,280 É porque é un int, que é, de novo, catro bytes. 799 00:34:39,280 --> 00:34:42,510 Entón Valgrind atopado un erro que eu, mirando para o meu código, non o fixeron. 800 00:34:42,510 --> 00:34:45,040 E quizais o TF ía ou non. 801 00:34:45,040 --> 00:34:48,469 Pero o que Valgrind seguramente descubriu que fixemos un erro alí, aínda 802 00:34:48,469 --> 00:34:52,719 aínda que tivemos moita sorte, eo ordenador decidiu, eh, eu non vou fallar 803 00:34:52,719 --> 00:34:57,470 só porque tocou un byte, unha o valor do int de memoria que non fixo 804 00:34:57,470 --> 00:34:58,550 realmente posúe. 805 00:34:58,550 --> 00:35:00,380 >> Ben, o que máis é buggy aquí. 806 00:35:00,380 --> 00:35:01,180 Dirección - 807 00:35:01,180 --> 00:35:03,190 este é un enderezo de vista tolo en hexadecimal. 808 00:35:03,190 --> 00:35:06,890 Isto significa só que en algún lugar na pila é cero bytes despois dun bloque de tamaño 40 809 00:35:06,890 --> 00:35:07,620 é asignado. 810 00:35:07,620 --> 00:35:10,610 Déixeme afastar aquí para ver se iso é un pouco máis útil. 811 00:35:10,610 --> 00:35:11,410 Interesante. 812 00:35:11,410 --> 00:35:15,600 40 bytes son definitivamente perdidos no rexistro de unha perda de 1. 813 00:35:15,600 --> 00:35:17,840 De novo, máis palabras que é útil aquí. 814 00:35:17,840 --> 00:35:21,350 Pero, con base nas liñas destacadas, onde eu debería centrar o meu 815 00:35:21,350 --> 00:35:24,070 atención a outro erro? 816 00:35:24,070 --> 00:35:26,570 Parece que a liña 20 do memory.c. 817 00:35:26,570 --> 00:35:30,990 >> Entón, se nós voltar á liña 20, que é o aquel que identificou previamente. 818 00:35:30,990 --> 00:35:33,030 E iso non é necesariamente buggy. 819 00:35:33,030 --> 00:35:35,160 Pero nós temos este inverteu seus efectos. 820 00:35:35,160 --> 00:35:38,790 Entón, como fago para corrixir polo menos un deses erros? 821 00:35:38,790 --> 00:35:42,240 O que eu podería facer despois liña 21? 822 00:35:42,240 --> 00:35:47,110 Podería facer libre de x, polo que é para darlle a volta esa memoria. 823 00:35:47,110 --> 00:35:49,230 E como fago para corrixir este erro? 824 00:35:49,230 --> 00:35:52,120 Eu sempre debería ir máis lonxe do que 0. 825 00:35:52,120 --> 00:35:53,670 Entón deixe-me probar e re-executar esta. 826 00:35:53,670 --> 00:35:56,080 Sentímolo, definitivamente non máis que 9. 827 00:35:56,080 --> 00:35:57,510 Facer memoria. 828 00:35:57,510 --> 00:36:00,650 Déixeme reprise Valgrind nunha xanela máis grande. 829 00:36:00,650 --> 00:36:01,580 E agora mire. 830 00:36:01,580 --> 00:36:02,250 Niza. 831 00:36:02,250 --> 00:36:03,270 Todos os bloques de heap foron liberados. 832 00:36:03,270 --> 00:36:04,270 Sen perdas son posibles. 833 00:36:04,270 --> 00:36:07,520 E alí enriba aquí, non hai ningunha mención máis do dereito válido. 834 00:36:07,520 --> 00:36:09,820 >> Só para estar ganancioso, e imos ver se outra demostración 835 00:36:09,820 --> 00:36:11,050 non vai tan desexado - 836 00:36:11,050 --> 00:36:12,560 Tiven a sorte de un momento atrás. 837 00:36:12,560 --> 00:36:15,530 E o feito de que este é 0 é posible innecesariamente enganosa. 838 00:36:15,530 --> 00:36:20,650 Imos facer 50 anos, un tanto arbitraria número, facer memoria memoria dot slash - 839 00:36:20,650 --> 00:36:21,410 aínda ter sorte. 840 00:36:21,410 --> 00:36:22,510 Nada está fallando. 841 00:36:22,510 --> 00:36:26,150 Supoñamos que eu simplemente facer algo realmente tolo, e eu fago 100. 842 00:36:26,150 --> 00:36:30,360 Déixeme refacer a memoria, dot memoria slash - 843 00:36:30,360 --> 00:36:31,075 tivo sorte de novo. 844 00:36:31,075 --> 00:36:32,800 Como preto de 1000? 845 00:36:32,800 --> 00:36:35,370 ints ademais de, aproximadamente, onde eu debería estar? 846 00:36:35,370 --> 00:36:37,410 Facer memoria - 847 00:36:37,410 --> 00:36:38,570 caramba. 848 00:36:38,570 --> 00:36:39,920 >> [Risas] 849 00:36:39,920 --> 00:36:41,270 >> Aceptar. 850 00:36:41,270 --> 00:36:43,920 Non imos xogar máis. 851 00:36:43,920 --> 00:36:45,120 Reprise de memoria. 852 00:36:45,120 --> 00:36:45,840 Alí imos nós. 853 00:36:45,840 --> 00:36:46,410 Todo ben. 854 00:36:46,410 --> 00:36:52,500 Entón, ao parecer, ten índice 100.000 ints ademais de onde debería ser en 855 00:36:52,500 --> 00:36:54,410 memoria, cousas malas suceden. 856 00:36:54,410 --> 00:36:56,430 Así, este non é obviamente , Unha regra rápida duro. 857 00:36:56,430 --> 00:36:58,190 Eu era unha especie de utilizar xuízo e erro para chegar alí. 858 00:36:58,190 --> 00:37:02,230 Pero iso é porque, longa historia curta, memoria do ordenador tamén está dividido 859 00:37:02,230 --> 00:37:03,580 para estes segmentos chamados cousas. 860 00:37:03,580 --> 00:37:07,260 E, ás veces, o ordenador de verdade deulle un pouco máis de memoria 861 00:37:07,260 --> 00:37:08,400 do que pedir. 862 00:37:08,400 --> 00:37:12,170 Pero, para a eficiencia, é só máis fácil máis memoria, pero só dicirlle 863 00:37:12,170 --> 00:37:13,780 que está a recibir unha parte del. 864 00:37:13,780 --> 00:37:16,370 >> E se tes sorte, ás veces, polo tanto, pode ser capaz de tocar 865 00:37:16,370 --> 00:37:17,795 memoria que non pertence a vostede. 866 00:37:17,795 --> 00:37:21,860 Non ten ningunha garantía de que o valor pór alí vai estar alí, porque 867 00:37:21,860 --> 00:37:25,080 o equipo aínda pensa que non é seu, pero non é necesariamente vai 868 00:37:25,080 --> 00:37:29,910 para acadar outro segmento de memoria no ordenador e inducir a un erro como 869 00:37:29,910 --> 00:37:31,710 este aquí. 870 00:37:31,710 --> 00:37:32,060 Todo ben. 871 00:37:32,060 --> 00:37:37,240 Todas as preguntas, a continuación, sobre a memoria? 872 00:37:37,240 --> 00:37:37,590 >> Todo ben. 873 00:37:37,590 --> 00:37:40,610 Imos dar un ollo aquí, entón, a algo que vimos tomar para 874 00:37:40,610 --> 00:37:48,361 concedido por algún tempo, o que É neste arquivo chamado cs50.h. 875 00:37:48,361 --> 00:37:49,420 Polo tanto, este é un. 876 00:37:49,420 --> 00:37:51,130 Estes son só unha banda enteiro dos comentarios enriba. 877 00:37:51,130 --> 00:37:53,900 E pode ter ollo para iso vostede remexia no aparello. 878 00:37:53,900 --> 00:37:57,000 Pero parece que o tempo, cando nós costumávamos usar cadea como un 879 00:37:57,000 --> 00:38:01,130 sinónimo, o medio polo cal declaramos que era sinónimo con esta 880 00:38:01,130 --> 00:38:03,990 contrasinal typedef, a definición do tipo. 881 00:38:03,990 --> 00:38:07,500 E nós estamos dicindo esencialmente, facer amarre un sinónimo para a estrela de char. 882 00:38:07,500 --> 00:38:11,190 Que os medios polos que a pila creou esas Rodas pequenas coñecidas como 883 00:38:11,190 --> 00:38:12,040 a cadea. 884 00:38:12,040 --> 00:38:14,830 >> Agora aquí é só un prototipo para getchar. 885 00:38:14,830 --> 00:38:17,350 Poderiamos telo visto antes, pero que é en realidade o que fai. getchar 886 00:38:17,350 --> 00:38:19,070 non ten argumentos, retorna un char. 887 00:38:19,070 --> 00:38:21,340 GetDouble non ten argumentos, retorna un double. 888 00:38:21,340 --> 00:38:24,440 GetFloat non recibe argumentos, regresa unha boia, e así por diante. 889 00:38:24,440 --> 00:38:27,270 getInt está aquí. getlonglong é aquí. 890 00:38:27,270 --> 00:38:28,820 E getstring está aquí. 891 00:38:28,820 --> 00:38:29,420 E é iso. 892 00:38:29,420 --> 00:38:33,080 Esta liña roxa é outro pre-procesador Directiva por mor do 893 00:38:33,080 --> 00:38:35,550 hashtag no inicio da mesma. 894 00:38:35,550 --> 00:38:35,870 >> Todo ben. 895 00:38:35,870 --> 00:38:38,380 Entón, agora déixeme entrar cs50.c. 896 00:38:38,380 --> 00:38:40,400 E non imos falar moito sobre iso. 897 00:38:40,400 --> 00:38:43,280 Pero para darlle un reflexo do que está ven a suceder todo isto 898 00:38:43,280 --> 00:38:46,434 tempo, déixeme ir - 899 00:38:46,434 --> 00:38:48,250 imos facer getchar. 900 00:38:48,250 --> 00:38:51,050 Entón getchar é máis comentarios. 901 00:38:51,050 --> 00:38:52,060 Pero parece que iso. 902 00:38:52,060 --> 00:38:54,800 Polo tanto, esta é a función real getchar que fomos 903 00:38:54,800 --> 00:38:56,055 tendo por seguro existe. 904 00:38:56,055 --> 00:38:59,370 E aínda que non use este que, moitas veces, se algunha vez, polo menos 905 00:38:59,370 --> 00:39:00,470 relativamente simple. 906 00:39:00,470 --> 00:39:02,580 Entón, paga a pena dar unha rápida ollada aquí. 907 00:39:02,580 --> 00:39:06,540 >> Entón getchar ten un loop infinito, deliberadamente de xeito aparentemente. 908 00:39:06,540 --> 00:39:10,050 Logo chama - e este é un tipo de bo reutilización de código que nos escribiu. 909 00:39:10,050 --> 00:39:11,220 El chama getstring. 910 00:39:11,220 --> 00:39:12,460 Porque o que fai significa obter un char? 911 00:39:12,460 --> 00:39:14,730 Ben, así como pode tentar obter unha liña enteira de texto do usuario e 912 00:39:14,730 --> 00:39:16,940 a continuación, pode ollar a un destes caracteres. 913 00:39:16,940 --> 00:39:19,170 Na liña 60, aquí está un pouco pouco máis de unha proba de sanidade. 914 00:39:19,170 --> 00:39:21,610 Se getstring regresou nulo, Non imos continuar. 915 00:39:21,610 --> 00:39:22,820 Algo deu mal. 916 00:39:22,820 --> 00:39:28,120 >> Agora, iso é un pouco aburrido, pero convencional en C. carbonizar max probablemente 917 00:39:28,120 --> 00:39:29,960 o que representa só con base no seu nome? 918 00:39:29,960 --> 00:39:31,670 É unha constante. 919 00:39:31,670 --> 00:39:36,040 É coma se o valor numérico do maior de char pode representar con 920 00:39:36,040 --> 00:39:40,370 unha mordida, o que probablemente é o número 255, que é o maior número que 921 00:39:40,370 --> 00:39:42,720 representan oito bits, desde cero. 922 00:39:42,720 --> 00:39:47,460 Entón eu usar isto, nesta función, cando escribir este código, só porque 923 00:39:47,460 --> 00:39:51,753 se algo sae mal en getchar pero o seu propósito na vida é volver 924 00:39:51,753 --> 00:39:54,830 char, ten que de algunha maneira poder para sinalizar ao usuario que 925 00:39:54,830 --> 00:39:55,840 algo deu mal. 926 00:39:55,840 --> 00:39:56,970 Non podemos volver nulo. 927 00:39:56,970 --> 00:39:58,480 Acontece que nulo é un punteiro. 928 00:39:58,480 --> 00:40:01,030 E, de novo, getchar ten para voltar un char. 929 00:40:01,030 --> 00:40:04,760 >> Así, o convenio, se algo der mal, é vostede, o programador, ou en 930 00:40:04,760 --> 00:40:08,160 Neste caso, me coa biblioteca, eu tiven a só decidir arbitrariamente, se 931 00:40:08,160 --> 00:40:12,230 algo sae mal, eu vou voltar o número 255, o que é verdadeiramente 932 00:40:12,230 --> 00:40:17,240 quere dicir que non pode, o usuario non pode escribir o caracter representado pola 933 00:40:17,240 --> 00:40:21,410 número 255, porque tivemos un roubalo como o chamado valor de sentinela para 934 00:40:21,410 --> 00:40:23,410 representar un problema. 935 00:40:23,410 --> 00:40:27,010 Agora descóbrese que o carácter 255 non é algo que podes escribir no 936 00:40:27,010 --> 00:40:28,380 teclado, polo que non é gran cousa. 937 00:40:28,380 --> 00:40:30,910 O usuario non entende que Eu roubei ese personaxe. 938 00:40:30,910 --> 00:40:34,620 Pero se xa viu nas páxinas de home nunha sistema informático algunha referencia a un 939 00:40:34,620 --> 00:40:38,560 todas as tapas constante como este que di: en casos de erro esta forza constante 940 00:40:38,560 --> 00:40:42,720 ser devolto, iso é todo que algún ser humano fixo anos, se decidiu arbitrariamente 941 00:40:42,720 --> 00:40:45,680 voltar ese valor especial e chamalo dunha constante no caso 942 00:40:45,680 --> 00:40:46,840 algo sae mal. 943 00:40:46,840 --> 00:40:48,580 >> Agora a maxia pasa por aquí. 944 00:40:48,580 --> 00:40:52,600 En primeiro lugar, eu estou declarando na liña 67 dous personaxes, C1 e C2. 945 00:40:52,600 --> 00:40:57,080 E entón, en liña 68, hai realmente unha liña de código que é unha reminiscencia de 946 00:40:57,080 --> 00:41:01,140 noso amigo printf, xa que ten por cento Cs entre comiñas. 947 00:41:01,140 --> 00:41:06,490 Pero teña en conta o que está pasando aquí. sscanf significa pescudas cadea - 948 00:41:06,490 --> 00:41:11,690 significa dixitalizar un formato cadea, sscanf ergo. 949 00:41:11,690 --> 00:41:12,590 O que significa isto? 950 00:41:12,590 --> 00:41:16,310 Isto significa que pasa para sscanf unha cadea. 951 00:41:16,310 --> 00:41:18,420 E liña é o que o usuario escribe Pol 952 00:41:18,420 --> 00:41:23,520 Vostede pasa a sscanf unha secuencia de formato como iso é o que di a scanf cales son 953 00:41:23,520 --> 00:41:25,870 Está esperando que o usuario teña escrito dentro 954 00:41:25,870 --> 00:41:29,730 Vostede, entón, pasar connosco os enderezos de dous anacos de memoria, neste caso, 955 00:41:29,730 --> 00:41:31,150 porque eu teño dous espazos reservados. 956 00:41:31,150 --> 00:41:34,610 Entón eu vou darlle o enderezo de C1 e o enderezo de C2. 957 00:41:34,610 --> 00:41:37,700 >> E lembrar que dá en función da dirección dalgunha variable, o que é 958 00:41:37,700 --> 00:41:38,950 a implicación? 959 00:41:38,950 --> 00:41:41,400 960 00:41:41,400 --> 00:41:45,050 O que pode facer esa función, como resultado de darlle a dirección dun 961 00:41:45,050 --> 00:41:48,170 variable, pola contra a propia variable? 962 00:41:48,170 --> 00:41:49,450 Pode cambia-lo, non? 963 00:41:49,450 --> 00:41:53,250 Se tivese alguén un mapa para a física dirección, poden ir alí e facer 964 00:41:53,250 --> 00:41:54,750 o que queren nese enderezo. 965 00:41:54,750 --> 00:41:55,800 A mesma idea aquí. 966 00:41:55,800 --> 00:41:59,950 Se pasamos a sscanf, a dirección de dous anacos de memoria, mesmo estes pequenos 967 00:41:59,950 --> 00:42:03,585 pequenos anacos de memoria, C1 e C2, pero dicimos que a dirección deles, 968 00:42:03,585 --> 00:42:05,170 sscanf pode cambialo. 969 00:42:05,170 --> 00:42:08,530 >> Así, o propósito de sscanf na vida, se Lerma a páxina principal, é ler o que o 970 00:42:08,530 --> 00:42:13,420 usuario inseriu, esperanza para que o usuario teña escritas nun personaxe e quizais 971 00:42:13,420 --> 00:42:16,470 outro personaxe, e todo o que o usuario ingresaran, o primeiro personaxe vai 972 00:42:16,470 --> 00:42:19,310 aquí, o segundo personaxe vai aquí. 973 00:42:19,310 --> 00:42:22,470 Agora, como un aparte, iso, e se fose só sei que a partir da documentación, 974 00:42:22,470 --> 00:42:25,570 o feito de eu poñer un espazo en branco alí Significa só que eu non me importa se 975 00:42:25,570 --> 00:42:28,440 o usuario preme a barra de espazo un pouco veces antes de que el ou ela ten un 976 00:42:28,440 --> 00:42:30,400 personaxe, eu vou pasar por alto calquera espazo en branco. 977 00:42:30,400 --> 00:42:32,510 De xeito que, sei que dende a documentación. 978 00:42:32,510 --> 00:42:36,570 >> O feito de que hai unha segunda% c seguido de espazo en branco é realmente 979 00:42:36,570 --> 00:42:37,410 deliberada. 980 00:42:37,410 --> 00:42:41,190 Eu quero ser capaz de detectar se o usuario asneira ou non cooperar. 981 00:42:41,190 --> 00:42:45,630 Entón, eu estou esperando que o usuario só ingresaran nun personaxe, polo tanto, eu estou esperando 982 00:42:45,630 --> 00:42:50,640 sscanf que só vai volver valor 1, xa que, unha vez máis, se eu ler 983 00:42:50,640 --> 00:42:55,400 a documentación, o propósito de sscanf en vida é devolver ao número de 984 00:42:55,400 --> 00:42:59,170 As variables que foron cubertos coa entrada do usuario. 985 00:42:59,170 --> 00:43:02,270 >> Pase en dúas variables enderezos, C1 e C2. 986 00:43:02,270 --> 00:43:06,420 Espero, con todo, que unha das deles é morto, porque se sscanf 987 00:43:06,420 --> 00:43:11,130 retorna 2, o que presumiblemente a implicación lóxica? 988 00:43:11,130 --> 00:43:14,600 Que o usuario non só dar-me unha personaxe como eu dixen a el ou ela. 989 00:43:14,600 --> 00:43:17,860 Eles probablemente escrito no menos dous caracteres. 990 00:43:17,860 --> 00:43:22,430 Entón, se eu, no canto non tivo a segunda % C, eu só tiña un, que 991 00:43:22,430 --> 00:43:25,370 francamente, sería máis intuitivo visión, creo que a primeira vista, 992 00:43:25,370 --> 00:43:30,220 non vai ser capaz de detectar O usuario foi dándolle máis 993 00:43:30,220 --> 00:43:31,780 input do que realmente quería. 994 00:43:31,780 --> 00:43:34,100 Polo tanto, esta é unha forma implícita de comprobación de erros. 995 00:43:34,100 --> 00:43:35,640 >> Pero teña en conta que fago aquí. 996 00:43:35,640 --> 00:43:39,970 Xa que eu estou seguro que o usuario me deu un personaxe, eu liberar a liña, facendo 997 00:43:39,970 --> 00:43:44,450 o oposto de getstring, que á súa vez usa malloc, e despois eu volvo 998 00:43:44,450 --> 00:43:51,030 C1, o personaxe que eu esperaba que o seleccionado polo usuario e só indicado. 999 00:43:51,030 --> 00:43:54,680 Entón, un rápido relance só, pero calquera dúbida sobre getchar? 1000 00:43:54,680 --> 00:43:57,450 1001 00:43:57,450 --> 00:43:59,590 Nós imos voltar a algúns dos outros. 1002 00:43:59,590 --> 00:44:03,770 >> Ben, deixe-me ir adiante e facelo - Supoñamos agora, só para motivar o noso 1003 00:44:03,770 --> 00:44:08,910 a discusión dunha semana, máis tempo, este é un arquivo chamado structs.h. 1004 00:44:08,910 --> 00:44:11,440 E, de novo, esta é só unha mostra de algo que está por vir. 1005 00:44:11,440 --> 00:44:13,090 Pero teña en conta que unha morea dicir comentarios. 1006 00:44:13,090 --> 00:44:17,440 Entón déixeme destacar só o parte interesante de momento. 1007 00:44:17,440 --> 00:44:18,020 typedef - 1008 00:44:18,020 --> 00:44:19,700 hai esa mesma contrasinal de novo. 1009 00:44:19,700 --> 00:44:23,100 typedef que usan para declarar cadea como un tipo de datos especial. 1010 00:44:23,100 --> 00:44:27,490 Podes usar typedef para crear nova marca tipos de datos que non existían cando 1011 00:44:27,490 --> 00:44:28,570 C foi inventada. 1012 00:44:28,570 --> 00:44:32,520 Por exemplo, int ven con C. carbón ven con C. dobre ven con C. Mais 1013 00:44:32,520 --> 00:44:34,000 non hai ningunha noción dun estudante. 1014 00:44:34,000 --> 00:44:37,230 E aínda sería moi útil para ser capaz de escribir un programa que almacena 1015 00:44:37,230 --> 00:44:40,440 nunha variable, número de identificación do alumno, seu nome, e súa casa. 1016 00:44:40,440 --> 00:44:42,890 Noutras palabras, tres anacos de datos, como un int e un 1017 00:44:42,890 --> 00:44:44,420 corda e outra cadea. 1018 00:44:44,420 --> 00:44:48,220 >> Con typedef, o que é moi poderoso sobre iso e o seu contrasinal para sturct 1019 00:44:48,220 --> 00:44:53,660 estrutura, ti, o programador en 2013, realmente pode establecer o seu propio 1020 00:44:53,660 --> 00:44:57,530 tipos de datos que non existían anos atrás, pero que atender ás súas finalidades. 1021 00:44:57,530 --> 00:45:01,910 E aquí, en liñas 13 a 19, estamos declarando un novo tipo de datos, como 1022 00:45:01,910 --> 00:45:04,320 un int, pero chamando-o de estudante. 1023 00:45:04,320 --> 00:45:09,310 E dentro desta variable vai ser tres cousas - un int, cadea 1024 00:45:09,310 --> 00:45:09,930 e unha corda. 1025 00:45:09,930 --> 00:45:13,040 Entón pode pensar que é realmente pasou aquí, aínda que este é un 1026 00:45:13,040 --> 00:45:17,160 bit de unha simplificación para hoxe, un alumno é esencialmente indo 1027 00:45:17,160 --> 00:45:19,450 para estar así. 1028 00:45:19,450 --> 00:45:22,580 Que será unha peza de cunha memoria de identificación, un nome 1029 00:45:22,580 --> 00:45:25,580 campo, e un campo de casa. 1030 00:45:25,580 --> 00:45:30,670 E nós imos ser capaces de usar estes anacos de memoria e acceder a eles como segue. 1031 00:45:30,670 --> 00:45:38,870 >> Se eu entrar struct0.c, aquí está unha relativamente longo, pero despois dun 1032 00:45:38,870 --> 00:45:42,630 estándar, de código que usa este novo truco. 1033 00:45:42,630 --> 00:45:45,790 Entón, primeiro, déixeme chamar a atención para as partes interesantes enriba. 1034 00:45:45,790 --> 00:45:49,670 Afiada define tres estudantes, declara un constantes chamadas de alumnos e cessionários 1035 00:45:49,670 --> 00:45:53,450 el arbitrariamente o número 3, só entón eu teño tres alumnos que utilizan 1036 00:45:53,450 --> 00:45:54,830 este programa de momento. 1037 00:45:54,830 --> 00:45:55,960 Aí vén o principal. 1038 00:45:55,960 --> 00:45:58,860 E teña en conta, como fago para declarar unha matriz de estudantes? 1039 00:45:58,860 --> 00:46:00,480 Ben, eu só utilizar a mesma sintaxe. 1040 00:46:00,480 --> 00:46:02,110 O estudante palabra é, obviamente, nova. 1041 00:46:02,110 --> 00:46:04,790 Pero o estudante, clase, os alumnos soporte. 1042 00:46:04,790 --> 00:46:06,720 >> Entón, por desgraza, hai moito de reutilización de termos aquí. 1043 00:46:06,720 --> 00:46:07,660 Este é só un número. 1044 00:46:07,660 --> 00:46:09,040 Entón, iso é como dicir que tres. 1045 00:46:09,040 --> 00:46:11,430 Clase é só o que quero para chamar a variable. 1046 00:46:11,430 --> 00:46:12,840 Podería chamalo alumnos. 1047 00:46:12,840 --> 00:46:15,880 Pero clase, isto non é unha clase nunha orientada a obxectos Java tipo de camiño. 1048 00:46:15,880 --> 00:46:17,220 É só unha clase de alumnos. 1049 00:46:17,220 --> 00:46:20,590 E o tipo de cada elemento de datos nesa matriz é estudante. 1050 00:46:20,590 --> 00:46:23,040 Polo tanto, este é un pouco diferente e de dicir algo 1051 00:46:23,040 --> 00:46:25,250 así, é só - 1052 00:46:25,250 --> 00:46:29,500 Eu digo que me dar tres alumnos e chamar esa clase array. 1053 00:46:29,500 --> 00:46:29,800 >> Todo ben. 1054 00:46:29,800 --> 00:46:30,680 Aquí está unha de catro loop. 1055 00:46:30,680 --> 00:46:33,480 Familiarizado dese cara - iterate de cero a tres, como máximo. 1056 00:46:33,480 --> 00:46:35,160 E aquí está a nova peza de sintaxe. 1057 00:46:35,160 --> 00:46:37,710 O programa vai me pedir, o ser humano, para darlle un estudante 1058 00:46:37,710 --> 00:46:39,200 ID, que é un int. 1059 00:46:39,200 --> 00:46:44,650 E aquí está a sintaxe coa cal pode gardar algo no campo ID en 1060 00:46:44,650 --> 00:46:48,630 localización clase soporte I. Así esa sintaxe non é nova. 1061 00:46:48,630 --> 00:46:51,450 É dicir, só dar-me a oitava alumno da clase. 1062 00:46:51,450 --> 00:46:52,940 Pero este símbolo é nova. 1063 00:46:52,940 --> 00:46:56,320 Ata agora, non se pode usar punto, polo menos nun código coma este. 1064 00:46:56,320 --> 00:47:01,490 Isto significa ir á struct coñecido como un estudante e poñer algo alí. 1065 00:47:01,490 --> 00:47:05,670 Igualmente, nesta liña seguinte, 31, ir adiante e poñer o que o usuario escribe 1066 00:47:05,670 --> 00:47:10,530 un nome aquí eo que fan para casa, o mesmo, vai adiante e 1067 00:47:10,530 --> 00:47:13,230 poñelas. casa. 1068 00:47:13,230 --> 00:47:15,955 >> Entón, o que fai este programa finalmente facer? 1069 00:47:15,955 --> 00:47:17,220 Podes ver un pouco de provocación alí. 1070 00:47:17,220 --> 00:47:24,780 Déixeme ir adiante e forman estruturas 0 dot barra struct 0, ID do alumno 1, 1071 00:47:24,780 --> 00:47:28,250 di David Mather, estudante ID 2. 1072 00:47:28,250 --> 00:47:32,070 Rob Kirkland, estudante ID 3. 1073 00:47:32,070 --> 00:47:35,010 Lauren Leverit - 1074 00:47:35,010 --> 00:47:38,380 eo único que este programa fixo, que é só totalmente arbitrario, é 1075 00:47:38,380 --> 00:47:40,980 Eu quería facer algo con eses datos, agora que eu xa nos ensinou como 1076 00:47:40,980 --> 00:47:43,450 usar estruturas, é que eu só tiña este ciclo extra aquí. 1077 00:47:43,450 --> 00:47:45,260 Eu iterado sobre o conxunto de alumnos. 1078 00:47:45,260 --> 00:47:49,170 Eu usei o noso, amigo quizais agora familiar, Cadea de comparación, a stircomp 1079 00:47:49,170 --> 00:47:53,780 cheque é a casa de 8 estudantes igual a Mather? 1080 00:47:53,780 --> 00:47:56,760 E se é así, só tes que imprimir algo arbitrariamente gusta, si, é. 1081 00:47:56,760 --> 00:47:59,430 Pero, de novo, só me dando oportunidades de utilizar e reutilizar e 1082 00:47:59,430 --> 00:48:02,270 reutilizar esta nova notación de punto. 1083 00:48:02,270 --> 00:48:03,250 >> Entón, quen lle importa, non? 1084 00:48:03,250 --> 00:48:06,270 Chegando-se con un programa de estudante é un tanto arbitraria, pero acontece 1085 00:48:06,270 --> 00:48:09,800 que podemos facer cousas útiles co é dicir, por exemplo, como segue. 1086 00:48:09,800 --> 00:48:14,600 Trátase dunha estrutura moi máis complicada en C. Ten unha ducia ou máis campos, 1087 00:48:14,600 --> 00:48:15,880 un tanto enigmaticamente chamado. 1088 00:48:15,880 --> 00:48:20,110 Pero se xa escoitou falar de unha gráfica formato de ficheiro chamado bitmap, BMP, el 1089 00:48:20,110 --> 00:48:22,830 Acontece que o formato de ficheiro bitmap parécese moito a que este. 1090 00:48:22,830 --> 00:48:24,200 É un pouco cara Smiley estúpido. 1091 00:48:24,200 --> 00:48:27,840 É unha pequena imaxe que teño ampliado en moi grande para que eu puidese ver cada 1092 00:48:27,840 --> 00:48:30,410 dos puntos ou píxeles individuais. 1093 00:48:30,410 --> 00:48:33,800 Agora resulta que pode representar unha punto negro con, digamos, o número 0. 1094 00:48:33,800 --> 00:48:35,520 E un punto branco co número 1. 1095 00:48:35,520 --> 00:48:39,140 >> Polo tanto, noutras palabras, se quere chamar un Rostro sorrinte e gardar a imaxe nun 1096 00:48:39,140 --> 00:48:42,680 ordenador, é suficiente para almacenar e ceros aqueles que se parecen con esta, onde, 1097 00:48:42,680 --> 00:48:45,250 unha vez máis, os son brancos e ceros son negros. 1098 00:48:45,250 --> 00:48:48,290 E xuntos, se efectivamente ten un cingue duns e ceros, ten un 1099 00:48:48,290 --> 00:48:51,030 reixa de píxeles, e se pór Los, ten un bonito 1100 00:48:51,030 --> 00:48:52,560 rostinho Smiley. 1101 00:48:52,560 --> 00:48:58,150 Agora, o formato de ficheiro de mapa de bits, BMP, é efectivamente que, baixo o capó, 1102 00:48:58,150 --> 00:49:00,970 pero con máis píxeles SOT que realmente pode representar as cores. 1103 00:49:00,970 --> 00:49:05,170 >> Pero cando ten máis sofisticado formatos como JPEG e BMP e GIF 1104 00:49:05,170 --> 00:49:09,360 co cal pode estar familiarizado, aqueles arquivos no disco normalmente non só 1105 00:49:09,360 --> 00:49:13,760 ten ceros e uns aos píxeles, pero eles teñen algúns metadatos, así como - 1106 00:49:13,760 --> 00:49:16,960 fito no sentido de que non é realmente datos, pero é útil para ter. 1107 00:49:16,960 --> 00:49:21,370 Entón, eses campos aquí son o que implica, e imos ver iso con máis detalle na I-set 1108 00:49:21,370 --> 00:49:25,810 5, que antes dos ceros e uns que representar os píxeles dunha imaxe, 1109 00:49:25,810 --> 00:49:29,110 hai unha morea de metadatos como o tamaño da imaxe e o 1110 00:49:29,110 --> 00:49:30,250 ancho da imaxe. 1111 00:49:30,250 --> 00:49:32,910 E noten que estou arrincando fóra dalgúns cousas arbitrarias aquí - 1112 00:49:32,910 --> 00:49:34,260 ancho e alto. 1113 00:49:34,260 --> 00:49:36,160 Conta de bits e algunhas outras cousas. 1114 00:49:36,160 --> 00:49:37,840 Polo tanto, hai uns metadatos nun arquivo. 1115 00:49:37,840 --> 00:49:41,470 >> Pero por entender como os arquivos son colocados fóra desta forma, pode realmente 1116 00:49:41,470 --> 00:49:45,890 logo manipular imaxes, recuperar imaxes do disco, redimensionar imaxes. 1117 00:49:45,890 --> 00:49:47,560 Pero non pode necesariamente mellora-los. 1118 00:49:47,560 --> 00:49:48,480 Eu precisaba unha foto. 1119 00:49:48,480 --> 00:49:52,840 Entón eu volvín para RJ aquí, que viu na pantalla hai algún tempo atrás. 1120 00:49:52,840 --> 00:49:57,160 E se eu abrir Keynote aquí, este é o que pasa se tentar ampliar e 1121 00:49:57,160 --> 00:49:59,380 mellorar RJ. 1122 00:49:59,380 --> 00:50:01,480 Non está quedando mellor realmente. 1123 00:50:01,480 --> 00:50:06,240 Agora Keynote é unha especie de esbater-se un pouco, só para encubrir o 1124 00:50:06,240 --> 00:50:11,040 feito de RJ non é especialmente maior cando zoom in 1125 00:50:11,040 --> 00:50:13,310 E se fai dese xeito, ver as prazas? 1126 00:50:13,310 --> 00:50:15,490 Si, pode definitivamente ver os cadrados nun proxector. 1127 00:50:15,490 --> 00:50:17,690 >> Iso é o que comeza cando mellorar. 1128 00:50:17,690 --> 00:50:22,570 Pero no entendemento de como o noso RJ ou o Smiley cara é aplicado déixanos 1129 00:50:22,570 --> 00:50:24,950 realmente escribir o código que manexa estas cousas. 1130 00:50:24,950 --> 00:50:29,970 E eu penso que eu ía acabar con esta nota, con 55 segundo dunha mellorar tanto, 1131 00:50:29,970 --> 00:50:31,230 Atrévome, por exemplo, no canto enganosa. 1132 00:50:31,230 --> 00:50:32,990 >> [REPRODUCIÓN] 1133 00:50:32,990 --> 00:50:34,790 >> -Está mentindo. 1134 00:50:34,790 --> 00:50:38,310 Sobre o que, eu non sei. 1135 00:50:38,310 --> 00:50:41,200 >> -Entón, o que sabemos? 1136 00:50:41,200 --> 00:50:45,280 >> -Iso ás 9:15 Ray Santoya estaba no cadro electrónico. 1137 00:50:45,280 --> 00:50:47,830 >> -Entón, a pregunta é o que que estaba facendo en 9:16? 1138 00:50:47,830 --> 00:50:50,750 >> Tiro-a nove milímetros en algo. 1139 00:50:50,750 --> 00:50:52,615 Quizais el viu o tire. 1140 00:50:52,615 --> 00:50:54,760 >> -Ou foi traballar con el. 1141 00:50:54,760 --> 00:50:56,120 >> -Espera. 1142 00:50:56,120 --> 00:50:57,450 Volva un. 1143 00:50:57,450 --> 00:50:58,700 >> -O que ve? 1144 00:50:58,700 --> 00:51:05,530 1145 00:51:05,530 --> 00:51:09,490 >> -Traer a cara, pantalla completa. 1146 00:51:09,490 --> 00:51:09,790 >> -Os seus lentes. 1147 00:51:09,790 --> 00:51:11,040 >> -Hai unha reflexión. 1148 00:51:11,040 --> 00:51:21,790 1149 00:51:21,790 --> 00:51:23,520 >> -Ese é o equipo de béisbol Neuvitas. 1150 00:51:23,520 --> 00:51:24,530 Ese é o seu logotipo. 1151 00:51:24,530 --> 00:51:27,040 >> -E el está falando con quen queira que estea utilizando aquela chaqueta. 1152 00:51:27,040 --> 00:51:27,530 >> [FIN reprodución de vídeo] 1153 00:51:27,530 --> 00:51:29,180 >> DAVID J. Malan: Isto ser Problem Set 5. 1154 00:51:29,180 --> 00:51:30,720 Imos velo a próxima semana. 1155 00:51:30,720 --> 00:51:32,330 >> Falante masculino: Na seguinte CS50. 1156 00:51:32,330 --> 00:51:39,240 >> [Grilos cantando] 1157 00:51:39,240 --> 00:51:41,270 >> [Música tocando]