1 00:00:00,000 --> 00:00:10,970 >> [REPRODUCCIÓN DE MÚSICA] 2 00:00:10,970 --> 00:00:12,536 >> DAVID J. MALAN: Muy bien. 3 00:00:12,536 --> 00:00:13,392 >> [Risas] 4 00:00:13,392 --> 00:00:14,240 >> Bienvenido de nuevo. 5 00:00:14,240 --> 00:00:14,990 Este es CS50. 6 00:00:14,990 --> 00:00:16,890 Y este el final de la quinta semana. 7 00:00:16,890 --> 00:00:20,020 Y hasta ahora, tenemos más o menos estado tomando por sentado que hay 8 00:00:20,020 --> 00:00:23,480 existe este compilador, Clang, que has se invoca a través de esta 9 00:00:23,480 --> 00:00:27,100 otra herramienta llamada Haga que de alguna manera mágicamente convierte el código fuente 10 00:00:27,100 --> 00:00:31,350 en código objeto, los ceros y unos que los equipos de la CPU, centrales 11 00:00:31,350 --> 00:00:33,410 unidad de procesamiento, en realidad entiende. 12 00:00:33,410 --> 00:00:36,770 Pero resulta que hay un número que es pasando por debajo de la campana en 13 00:00:36,770 --> 00:00:38,690 entre entrada y salida. 14 00:00:38,690 --> 00:00:41,800 >> Y me gustaría proponer que la carne que en un poco más detalle en 15 00:00:41,800 --> 00:00:45,130 estos cuatro pasos, tienen algo llamado pre-procesamiento, algo 16 00:00:45,130 --> 00:00:48,300 Llamamos la compilación, lo que hemos visto, algo que se llama el montaje, y 17 00:00:48,300 --> 00:00:49,420 algo que se llama de enlace. 18 00:00:49,420 --> 00:00:53,270 Así, hasta ahora, en algunos de nuestra programas, hemos tenido incluye agudo. 19 00:00:53,270 --> 00:00:56,650 Más recientemente hemos tenido algunos fuerte define para las constantes. 20 00:00:56,650 --> 00:01:00,660 Así resulta que las cosas que llevan el prefijo con el símbolo de hash o 21 00:01:00,660 --> 00:01:04,150 el símbolo de la libra son pre-procesador directivas. 22 00:01:04,150 --> 00:01:07,960 Eso es sólo una forma elegante de decir que es una línea de código que en realidad es 23 00:01:07,960 --> 00:01:12,280 convertido en algo más antes de que el ordenador, incluso tratar de convertir su 24 00:01:12,280 --> 00:01:13,800 programar en ceros y unos. 25 00:01:13,800 --> 00:01:19,000 >> Por ejemplo, agudo incluye estándar E / S. H, prácticamente sólo significa ir 26 00:01:19,000 --> 00:01:24,010 por delante, agarra el contenido de los archivos stdio.h y pegarlas allí mismo. 27 00:01:24,010 --> 00:01:25,880 Así que no hay ceros y unos en ese punto todavía. 28 00:01:25,880 --> 00:01:27,470 No deja de ser una sustitución. 29 00:01:27,470 --> 00:01:30,790 Y eso se hace durante la llamada etapa de pre-procesamiento, cuando se 30 00:01:30,790 --> 00:01:34,230 En realidad correr Clang o específicamente Hacer en la mayoría de los casos. 31 00:01:34,230 --> 00:01:36,950 Así que todo esto ha estado sucediendo primero de forma automática hasta el momento. 32 00:01:36,950 --> 00:01:38,800 >> Luego viene el paso de compilación. 33 00:01:38,800 --> 00:01:40,920 Pero hemos estado muy simplificada compilación. 34 00:01:40,920 --> 00:01:45,060 Compilar un programa realmente significa tomarlo de algo así como C, el 35 00:01:45,060 --> 00:01:48,430 código fuente que hemos estado escribiendo, abajo a algo llamado montaje. 36 00:01:48,430 --> 00:01:52,900 El lenguaje ensamblador es un nivel más bajo lenguaje que, por suerte, no lo haremos 37 00:01:52,900 --> 00:01:55,480 tienen muchas ocasiones de escribir este semestre. 38 00:01:55,480 --> 00:01:59,100 Pero es en el nivel más bajo de la sentido de que, literalmente, empezar a escribir 39 00:01:59,100 --> 00:02:04,270 sumar y restar y multiplicar y cargar de la memoria y guardar en la memoria, el 40 00:02:04,270 --> 00:02:08,259 instrucciones muy básicas que un ordenador, debajo de la capucha, 41 00:02:08,259 --> 00:02:09,639 realmente entiende. 42 00:02:09,639 --> 00:02:14,930 >> Por último, el montaje tiene ese idioma a los ceros y unos que hemos estado 43 00:02:14,930 --> 00:02:16,190 que describe hasta ahora. 44 00:02:16,190 --> 00:02:19,270 Y en verdad, por último, hay el llamado fase de vinculación, que vamos a 45 00:02:19,270 --> 00:02:22,360 ver en un momento, que combina los ceros y los unos con los ceros y 46 00:02:22,360 --> 00:02:24,870 queridos otras personas antes que ha creado. 47 00:02:24,870 --> 00:02:26,660 >> Así que considere esto super simple programa. 48 00:02:26,660 --> 00:02:27,560 Fue a partir de la semana 1. 49 00:02:27,560 --> 00:02:29,610 Simplemente dijo, Hello World, en la pantalla. 50 00:02:29,610 --> 00:02:30,920 Corrimos a través de este Clang. 51 00:02:30,920 --> 00:02:33,200 ¿O nos encontramos a través de Make que se desarrolló Clang. 52 00:02:33,200 --> 00:02:36,170 Y emitida en el momento donde algunos ceros y unos. 53 00:02:36,170 --> 00:02:38,100 Pero resulta que hay un paso intermedio. 54 00:02:38,100 --> 00:02:40,460 Si me voy de aquí - ¡Uy, no lo hice quiero verlo todavía. 55 00:02:40,460 --> 00:02:44,800 Si voy por aquí a mi aparato y abro hello.c, aquí 56 00:02:44,800 --> 00:02:46,160 es ese mismo programa. 57 00:02:46,160 --> 00:02:48,600 Y lo que voy a hacer en mi terminal ventana de aquí es que voy a 58 00:02:48,600 --> 00:02:51,430 ejecutar Clang en lugar de hacer, lo que automatiza los cuatro 59 00:02:51,430 --> 00:02:52,870 los pasos a seguir para nosotros. 60 00:02:52,870 --> 00:02:58,620 Y yo voy a hacer ruido metálico-S y entonces hola.c y luego entrar. 61 00:02:58,620 --> 00:03:00,590 >> Y tengo un mensaje parpadeante nuevo, lo que es bueno. 62 00:03:00,590 --> 00:03:05,280 Y ahora en una ventana un poco más grande, Voy a abrir gedit aquí. 63 00:03:05,280 --> 00:03:09,610 Y voy a abrir un archivo que, Resulta, se llama hello.s este 64 00:03:09,610 --> 00:03:11,870 contiene ese lenguaje ensamblador Me he referido antes. 65 00:03:11,870 --> 00:03:15,060 Y esto es lo que se llama el montaje idioma, nivel bastante bajo 66 00:03:15,060 --> 00:03:18,470 instrucciones que el CPU Intel o lo que sea que hay dentro 67 00:03:18,470 --> 00:03:19,350 entiende. 68 00:03:19,350 --> 00:03:24,480 Y es para mov movimiento. llamado es para llamando, una función muy bajo nivel. 69 00:03:24,480 --> 00:03:26,380 sub es para restar. 70 00:03:26,380 --> 00:03:30,370 >> Así que cuando usted tiene una CPU en particular dentro de su equipo, lo que lo hace 71 00:03:30,370 --> 00:03:34,300 distintas, frente a las CPUs de la mercado, es que las instrucciones que 72 00:03:34,300 --> 00:03:39,460 entiende y muchas veces lo eficiente que es, lo rápido que es en la ejecución de algunos 73 00:03:39,460 --> 00:03:40,380 de esas instrucciones. 74 00:03:40,380 --> 00:03:45,150 Ahora para obtener más información, puede tomar siguiente CS61 Otoño en el colegio. 75 00:03:45,150 --> 00:03:48,170 Pero aquí tenemos, por ejemplo, unos pocos identificadores que pudieran parecer familiar. 76 00:03:48,170 --> 00:03:50,150 hola.c es el nombre del programa. 77 00:03:50,150 --> 00:03:51,070 >> . Texto - 78 00:03:51,070 --> 00:03:54,190 no hay mucho de interés no en este momento, recordar que el texto 79 00:03:54,190 --> 00:03:59,190 segmento, a partir del lunes, es donde en la memoria de su programa de realidad termina. 80 00:03:59,190 --> 00:04:01,330 Así que eso es lo menos vagamente familiarizado allí. 81 00:04:01,330 --> 00:04:03,730 Aquí, por supuesto, es una mención de nuestra función principal. 82 00:04:03,730 --> 00:04:07,220 Desplazamiento hacia abajo, estos se refieren a las cosas llamados registros, muy pequeños trozos de 83 00:04:07,220 --> 00:04:09,190 memoria dentro de la CPU real. 84 00:04:09,190 --> 00:04:12,930 Y si me desplazo hacia abajo hasta aún más, veo una especie 85 00:04:12,930 --> 00:04:14,240 mención indirecta de ASCII. 86 00:04:14,240 --> 00:04:17,120 Y allí, en efecto, es que la cadena, hola, coma, mundo. 87 00:04:17,120 --> 00:04:20,079 >> Así que cuento largo, esto ha sido pasando por usted, de forma automática, 88 00:04:20,079 --> 00:04:22,140 debajo de la capucha de todo este tiempo. 89 00:04:22,140 --> 00:04:26,450 Y lo que está sucediendo realmente es, una vez se le han acabado Clang, o por medio de 90 00:04:26,450 --> 00:04:29,150 Asegúrese, de que está recibiendo en primer lugar, a partir del código fuente, la 91 00:04:29,150 --> 00:04:30,700 llamado lenguaje ensamblador. 92 00:04:30,700 --> 00:04:35,210 Entonces Clang es convertir esta asamblea idioma a ceros y unos. 93 00:04:35,210 --> 00:04:38,340 Y esta es la diapositiva que empezamos nuestra discusión en la semana 0 a - 94 00:04:38,340 --> 00:04:39,840 y luego Semana 1 en. 95 00:04:39,840 --> 00:04:44,030 Y, finalmente, esos ceros y unos se combinan con los ceros y unos 96 00:04:44,030 --> 00:04:47,190 de aquellas bibliotecas que hemos estado tomando por sentado, como E / S estándar o el 97 00:04:47,190 --> 00:04:50,010 Biblioteca de cuerdas o incluso la biblioteca CS50. 98 00:04:50,010 --> 00:04:54,200 >> Así que para pintar este cuadro más visualmente, tenemos hello.c. 99 00:04:54,200 --> 00:04:57,220 Y, por supuesto, utiliza el printf funcionar decir hola mundo. 100 00:04:57,220 --> 00:05:01,810 El paso de compilación toma hacia abajo para ese archivo que acaba de ver hello.s, incluso 101 00:05:01,810 --> 00:05:04,290 aunque eso es eliminada normalmente automáticamente. 102 00:05:04,290 --> 00:05:06,050 Pero ese es el código de la asamblea en el paso intermedio. 103 00:05:06,050 --> 00:05:09,750 Y luego, cuando nos reunimos la asamblea lenguaje, por así decirlo, que es cuando se 104 00:05:09,750 --> 00:05:10,830 conseguir esos ceros y unos. 105 00:05:10,830 --> 00:05:13,920 Así que hemos has en forma efectiva hoy en lo que hemos estado dando por sentado, 106 00:05:13,920 --> 00:05:16,430 significa ir código fuente código objeto. 107 00:05:16,430 --> 00:05:18,850 >> Pero en fin, ahora esa misma imagen - vamos a meterlo a 108 00:05:18,850 --> 00:05:20,020 el lado izquierdo. 109 00:05:20,020 --> 00:05:22,880 Y tenga en cuenta que en la parte superior hay Mencioné stdio.h. 110 00:05:22,880 --> 00:05:25,030 Eso es un archivo que hemos incluido en casi todo el 111 00:05:25,030 --> 00:05:26,250 programas que hemos escrito. 112 00:05:26,250 --> 00:05:28,830 Y eso es el archivo cuyo contenido obtener copia pegada, 113 00:05:28,830 --> 00:05:30,350 efectivamente lo alto de su código. 114 00:05:30,350 --> 00:05:34,170 Pero resulta que, en un ordenador sistema en alguna parte, hay probablemente un 115 00:05:34,170 --> 00:05:39,150 archivo stdio.c que alguien escribió años Hace que implementa toda la 116 00:05:39,150 --> 00:05:41,870 funciones que fueron declaradas en stdio.h. 117 00:05:41,870 --> 00:05:45,465 >> Ahora, en realidad, probablemente no sea el su Mac o su PC o incluso en el 118 00:05:45,465 --> 00:05:47,660 Aparato CS50 es un código C cruda. 119 00:05:47,660 --> 00:05:52,710 Alguien ya lo recopiló e incluyó . Archivo o de código objeto o. Un 120 00:05:52,710 --> 00:05:56,020 archivo, el cual se refiere a una biblioteca compartida eso ha sido pre-instalado y 121 00:05:56,020 --> 00:05:57,240 pre-compilado para usted. 122 00:05:57,240 --> 00:06:01,950 Pero supongamos que existe de hecho en nuestro 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 Siendo compilado de su código y montados. 125 00:06:04,960 --> 00:06:09,200 Código stdio.c 's se está recopilando y montado, de manera que este último 126 00:06:09,200 --> 00:06:13,730 paso, aquí abajo, tenemos que de alguna manera vincular, por así decirlo, sus ceros y unos 127 00:06:13,730 --> 00:06:18,430 con sus ceros y unos en una sola sencillo programa que en última instancia es 128 00:06:18,430 --> 00:06:20,540 llamado simplemente Hola. 129 00:06:20,540 --> 00:06:23,340 >> Así que eso es todo lo de la magia que es venido sucediendo hasta ahora. 130 00:06:23,340 --> 00:06:26,430 Y va a seguir tomando estos procesos por sentado, pero se dan cuenta 131 00:06:26,430 --> 00:06:28,750 hay un montón de detalles jugosos pasando por debajo de allí en. 132 00:06:28,750 --> 00:06:31,920 Y esto es lo que hace que su ordenador con Intel inside 133 00:06:31,920 --> 00:06:33,940 particularmente distinto. 134 00:06:33,940 --> 00:06:37,020 >> Así que en esa nota, si usted desea únete a nosotros para el almuerzo de este viernes, no vaya 135 00:06:37,020 --> 00:06:41,570 al lugar cs50.net/rsvp habitual, 13:15 de este viernes. 136 00:06:41,570 --> 00:06:43,400 Y ahora algunos anuncios. 137 00:06:43,400 --> 00:06:44,670 Así que tenemos buenas noticias. 138 00:06:44,670 --> 00:06:45,970 Y tenemos una mala noticia. 139 00:06:45,970 --> 00:06:47,260 Comience con una buena noticia aquí. 140 00:06:47,260 --> 00:06:52,038 141 00:06:52,038 --> 00:06:54,510 >> [GEMIDO] 142 00:06:54,510 --> 00:06:54,710 >> Está bien. 143 00:06:54,710 --> 00:06:56,670 Bueno, es técnicamente un día de fiesta, por lo que no es tanto un regalo de nosotros. 144 00:06:56,670 --> 00:06:58,030 Pero la mala noticia, por supuesto. 145 00:06:58,030 --> 00:07:00,550 146 00:07:00,550 --> 00:07:01,880 >> [GEMIDO] 147 00:07:01,880 --> 00:07:03,530 >> Me pasé un montón de tiempo en las animaciones. 148 00:07:03,530 --> 00:07:04,690 >> [Risas] 149 00:07:04,690 --> 00:07:07,000 >> Habrá una sesión de revisión el próximo lunes. 150 00:07:07,000 --> 00:07:08,340 Va a ser a las 5:30 AM. 151 00:07:08,340 --> 00:07:11,210 Le recuerdan a todos estos detalles a través de correo electrónico en el curso de 152 00:07:11,210 --> 00:07:13,470 sitio web en tan sólo un par de días. 153 00:07:13,470 --> 00:07:16,610 Será filmado y puesto a disposición poco después. 154 00:07:16,610 --> 00:07:19,200 Así que si usted no puede hacer que el lunes ranura para la noche, no te preocupes. 155 00:07:19,200 --> 00:07:22,270 Secciones esta semana que viene será también centrarse en la revisión del cuestionario. 156 00:07:22,270 --> 00:07:25,670 Si su sección es el lunes, que es vacaciones de hecho la universidad, lo haremos 157 00:07:25,670 --> 00:07:26,920 sin dejar de cumplir en la sección. 158 00:07:26,920 --> 00:07:28,890 Si usted simplemente no puede hacer que sección porque vas 159 00:07:28,890 --> 00:07:29,860 lejos, eso está bien. 160 00:07:29,860 --> 00:07:33,710 Asistir a una sección de domingo o martes o puesta a punto en la sección de Jason, que es 161 00:07:33,710 --> 00:07:35,110 disponible en línea. 162 00:07:35,110 --> 00:07:37,490 >> Por lo tanto, más malas noticias. 163 00:07:37,490 --> 00:07:41,960 Así que de acuerdo con el plan de estudios, tenemos conferencia el próximo viernes. 164 00:07:41,960 --> 00:07:43,690 Pero la buena noticia - 165 00:07:43,690 --> 00:07:44,860 claramente, he pasado demasiado tiempo en esto. 166 00:07:44,860 --> 00:07:45,280 >> [Risas] 167 00:07:45,280 --> 00:07:47,140 >> Nosotros cancelaremos las conferencias del próximo Viernes. 168 00:07:47,140 --> 00:07:50,590 Así que va a ser un regalo para nosotros, por lo que realmente puede tener un agradable respiro en 169 00:07:50,590 --> 00:07:52,990 entre esta semana y dos semanas, por lo tanto. 170 00:07:52,990 --> 00:07:57,460 Así que no hay conferencias de la próxima semana, sólo una pequeña pequeño cuestionario, para lo cual debe ser 171 00:07:57,460 --> 00:07:59,030 consiguiendo cada vez más excitado. 172 00:07:59,030 --> 00:08:03,870 >> Así que ahora vamos a centrar nuestra atención en algo que es de hecho más visual 173 00:08:03,870 --> 00:08:06,990 y más emocionante y para sentar las bases para lo que va a ser en el horizonte 174 00:08:06,990 --> 00:08:08,420 en sólo un par de semanas. 175 00:08:08,420 --> 00:08:12,160 Después de la primera prueba, vamos a convertir el foco de nuestro problema pone a otro 176 00:08:12,160 --> 00:08:16,710 dominio específico problema, que de forenses o de la seguridad de manera más general. 177 00:08:16,710 --> 00:08:19,550 >> De hecho, la tradición con este problema juego es para mí uno de los 178 00:08:19,550 --> 00:08:24,850 compañero de enseñanza o entidades emisoras de caminar a través de campus de tomar algunas fotografías de 179 00:08:24,850 --> 00:08:29,450 identificables, pero no personas obvias, lugares o cosas, a continuación, cada año me 180 00:08:29,450 --> 00:08:34,520 de alguna manera logran borrar accidentalmente o corruptos tarjeta de los medios de comunicación digitales 181 00:08:34,520 --> 00:08:35,720 eso es dentro de nuestra cámara. 182 00:08:35,720 --> 00:08:36,860 Pero no es gran cosa. 183 00:08:36,860 --> 00:08:39,200 Puedo seguir adelante y conectar que en mi computadora. 184 00:08:39,200 --> 00:08:43,010 Yo puedo hacer una imagen forense de la misma, por lo que a hablar, copiando los ceros y 185 00:08:43,010 --> 00:08:46,830 en bajar de esa tarjeta de memoria, ya sea es una tarjeta SD o tarjeta de memoria flash compacta o 186 00:08:46,830 --> 00:08:48,100 lo que sea que está familiarizado. 187 00:08:48,100 --> 00:08:49,300 Y luego podemos entregar eso. 188 00:08:49,300 --> 00:08:53,190 >> Y así, el reto por delante, entre otros cosas para ti, serán para escribir 189 00:08:53,190 --> 00:08:58,630 Código C que se recupera de un montón de JPEG para mí y revelado serán 190 00:08:58,630 --> 00:09:00,190 esas personas, lugares o cosas. 191 00:09:00,190 --> 00:09:03,340 Y también hablaremos, en este problema establecido y en los días por venir, sobre 192 00:09:03,340 --> 00:09:04,440 gráficos en general. 193 00:09:04,440 --> 00:09:06,140 Nosotros los hemos utilizado, un curso, para estallar. 194 00:09:06,140 --> 00:09:09,080 Pero has especie de darse por sentado existe estas nociones de alto nivel 195 00:09:09,080 --> 00:09:10,680 de rectángulos y óvalos. 196 00:09:10,680 --> 00:09:12,450 Pero debajo de la capucha hay píxeles. 197 00:09:12,450 --> 00:09:14,370 Y usted ha tenido que comenzar pensando en ellos. 198 00:09:14,370 --> 00:09:18,800 O usted para p-set 4 tener que pensar sobre la brecha entre sus ladrillos, cómo 199 00:09:18,800 --> 00:09:21,990 rápido eres pelota se mueve a través de la pantalla para salir. 200 00:09:21,990 --> 00:09:24,830 Así que hay esta noción de la puntos en la pantalla es 201 00:09:24,830 --> 00:09:26,290 entran en juego ya. 202 00:09:26,290 --> 00:09:29,430 >> Ahora lo que se ve, sin embargo, es lo que se obtiene en una pantalla de ordenador. 203 00:09:29,430 --> 00:09:33,680 Si alguna vez has visto algún bien o mala televisión, las probabilidades son que prácticamente 204 00:09:33,680 --> 00:09:36,280 tratar al público como tecnófobos que en realidad no 205 00:09:36,280 --> 00:09:37,630 saber mucho de computación. 206 00:09:37,630 --> 00:09:40,840 Y lo que es muy fácil para la policía detective de decir, ¿verdad 207 00:09:40,840 --> 00:09:41,710 limpiar eso para mí? 208 00:09:41,710 --> 00:09:42,710 O mejorar, ¿no? 209 00:09:42,710 --> 00:09:45,550 Mejorar es como la palabra de moda en la mayoría de cualquier programa de los delitos relacionados. 210 00:09:45,550 --> 00:09:49,240 Y la realidad es que si usted toma una muy imagen borrosa de un sospechoso de hacer 211 00:09:49,240 --> 00:09:51,620 algo malo, no se puede simplemente mejorarla. 212 00:09:51,620 --> 00:09:53,080 No se puede hacer un zoom infinito. 213 00:09:53,080 --> 00:09:56,350 No se puede ver en el reflejo de alguien ojo que cometió que 214 00:09:56,350 --> 00:09:59,860 particular la delincuencia, a pesar de la prevalencia de esta en la televisión. 215 00:09:59,860 --> 00:10:04,110 >> Y así, con que vamos a motivar a que próximo conjunto de problemas con una visión a 216 00:10:04,110 --> 00:10:05,765 algunos programas con el que podría ser familiar. 217 00:10:05,765 --> 00:10:06,500 >> [REPRODUCCIÓN DE VÍDEO] 218 00:10:06,500 --> 00:10:07,835 >> -OK. 219 00:10:07,835 --> 00:10:09,956 Ahora, vamos a tener una buena mirada a ti. 220 00:10:09,956 --> 00:10:17,060 221 00:10:17,060 --> 00:10:17,766 >> -Un momento. 222 00:10:17,766 --> 00:10:18,658 Ejecute lo dicho. 223 00:10:18,658 --> 00:10:19,550 >> -Espera un minuto. 224 00:10:19,550 --> 00:10:21,580 Ir a la derecha. 225 00:10:21,580 --> 00:10:21,800 >> -No. 226 00:10:21,800 --> 00:10:22,690 Congele eso. 227 00:10:22,690 --> 00:10:23,692 >> -Full pantalla. 228 00:10:23,692 --> 00:10:23,846 >> -OK. 229 00:10:23,846 --> 00:10:24,154 Congele eso. 230 00:10:24,154 --> 00:10:25,140 >> -Apretar hasta en eso, ¿quieres? 231 00:10:25,140 --> 00:10:27,090 >> -Vector en el que ese tipo por la rueda trasera. 232 00:10:27,090 --> 00:10:29,730 >> -Acercar aquí en este lugar. 233 00:10:29,730 --> 00:10:33,700 >> -Con el equipo adecuado, el fotografiado puede ser ampliado y agudizado. 234 00:10:33,700 --> 00:10:34,490 >> ¿Qué es eso? 235 00:10:34,490 --> 00:10:35,870 >> -Se trata de un programa de mejora. 236 00:10:35,870 --> 00:10:36,793 >> -Puede que claro que cualquier? 237 00:10:36,793 --> 00:10:38,560 >> -No lo sé. 238 00:10:38,560 --> 00:10:39,090 Vamos a mejorarlo. 239 00:10:39,090 --> 00:10:41,690 >> -Mejorar la sección A-6. 240 00:10:41,690 --> 00:10:43,510 >> -Aumenté el detalle y - 241 00:10:43,510 --> 00:10:44,456 >> -Creo que hay suficiente para mejorar. 242 00:10:44,456 --> 00:10:45,402 Suelte a mi pantalla. 243 00:10:45,402 --> 00:10:47,300 >> -Potenciar la reflexión en su ojo. 244 00:10:47,300 --> 00:10:49,330 >> -Vamos a correr esto a través de mejora de vídeo. 245 00:10:49,330 --> 00:10:50,340 >> -Edgar, ¿puedes mejorar esto? 246 00:10:50,340 --> 00:10:52,320 >> -Espera. 247 00:10:52,320 --> 00:10:54,290 >> -He estado trabajando en esta reflexión. 248 00:10:54,290 --> 00:10:55,560 >> -Alguien de reflexión. 249 00:10:55,560 --> 00:10:56,440 >> -Reflexión. 250 00:10:56,440 --> 00:10:57,940 >> -Hay una reflexión de la cara del hombre. 251 00:10:57,940 --> 00:10:58,860 >> -La reflexión. 252 00:10:58,860 --> 00:10:59,710 >> -Hay una reflexión. 253 00:10:59,710 --> 00:11:00,900 >> -Acérquese al espejo. 254 00:11:00,900 --> 00:11:03,500 >> -Se puede ver un reflejo. 255 00:11:03,500 --> 00:11:04,700 >> -Puede usted mejorar la imagen de aquí? 256 00:11:04,700 --> 00:11:05,700 >> -Puede usted mejorar aquí? 257 00:11:05,700 --> 00:11:06,500 >> -Puedes mejorarla? 258 00:11:06,500 --> 00:11:07,380 >> -Puedes mejorarla? 259 00:11:07,380 --> 00:11:08,190 >> -Podemos mejorar esto? 260 00:11:08,190 --> 00:11:08,940 >> -Puedes mejorarla? 261 00:11:08,940 --> 00:11:10,280 >> -Espera un segundo, voy a mejorar. 262 00:11:10,280 --> 00:11:11,570 >> -Zoom en la puerta. 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 >> -Entrar a vivir 267 00:11:14,360 --> 00:11:15,100 >> -Espera, detente. 268 00:11:15,100 --> 00:11:15,740 >> -Stop. 269 00:11:15,740 --> 00:11:16,290 >> -Pausa ella. 270 00:11:16,290 --> 00:11:19,390 >> -Gire a 75 grados alrededor la vertical, por favor. 271 00:11:19,390 --> 00:11:19,886 >> [Risas] 272 00:11:19,886 --> 00:11:24,350 >> -Stop, y de nuevo a la parte sobre la puerta de nuevo. 273 00:11:24,350 --> 00:11:26,330 >> -Tienes una mejora de imagen que puede mapa de bits? 274 00:11:26,330 --> 00:11:28,990 >> -Tal vez podamos usar la Pradeep Sen método de ver en las ventanas. 275 00:11:28,990 --> 00:11:30,680 >> -Este software es el estado actual de la técnica. 276 00:11:30,680 --> 00:11:31,676 >> -El valor de icono está apagado. 277 00:11:31,676 --> 00:11:34,166 >> -Con la combinación correcta de algoritmos. 278 00:11:34,166 --> 00:11:38,399 >> -Ha tomado algoritmos de iluminación para al siguiente nivel y que pueden utilizarlas para 279 00:11:38,399 --> 00:11:38,648 mejorar esta fotografía. 280 00:11:38,648 --> 00:11:42,050 >> -Bloqueo en y ampliar el eje z. 281 00:11:42,050 --> 00:11:42,760 >> -Mejorar. 282 00:11:42,760 --> 00:11:43,060 >> -Mejorar. 283 00:11:43,060 --> 00:11:43,760 >> -Mejorar. 284 00:11:43,760 --> 00:11:45,010 >> -Congelar y mejorar. 285 00:11:45,010 --> 00:11:47,470 286 00:11:47,470 --> 00:11:47,910 >> [VIDEO PLAYBACK FIN] 287 00:11:47,910 --> 00:11:51,470 >> DAVID J. MALAN: Así que de problemas 5 es lo que nos espera allí. 288 00:11:51,470 --> 00:11:55,260 Así que pronto vamos a tener una mejor comprensión de cuándo y por qué puede 289 00:11:55,260 --> 00:11:57,300 y nuestra no se puede mejorar de ese modo. 290 00:11:57,300 --> 00:12:00,090 Pero primero, vamos a volver nuestra atención a algunos de los componentes básicos que vamos a 291 00:12:00,090 --> 00:12:02,250 necesitan poder contar esa historia. 292 00:12:02,250 --> 00:12:05,580 >> Así recordamos que elaboramos esta imagen en Lunes y un poco la semana pasada. 293 00:12:05,580 --> 00:12:09,970 Y esto describe la disposición de las cosas en la memoria de su computadora cuando 294 00:12:09,970 --> 00:12:11,000 la ejecución de algunos programas. 295 00:12:11,000 --> 00:12:14,310 El segmento de alto tech, memoria, se refiere a los ceros reales y los 296 00:12:14,310 --> 00:12:16,000 que componen el programa. 297 00:12:16,000 --> 00:12:19,340 Hay, por debajo de eso, algunos inicializado o datos sin inicializar, que normalmente 298 00:12:19,340 --> 00:12:22,910 se refiere a cosas como constantes o cadenas o variables globales que tienen 299 00:12:22,910 --> 00:12:24,200 sido declarado de antemano. 300 00:12:24,200 --> 00:12:26,500 Ahí está el montón, pero vamos a venir atrás para que en un rato. 301 00:12:26,500 --> 00:12:27,410 >> Y luego está la pila. 302 00:12:27,410 --> 00:12:30,660 Al igual que una pila de bandejas en el cafetería, aquí es donde se pone la memoria 303 00:12:30,660 --> 00:12:33,610 capas y capas cada vez haces lo que en un programa? 304 00:12:33,610 --> 00:12:36,380 305 00:12:36,380 --> 00:12:37,730 ¿Cuál es el uso de la pila para? 306 00:12:37,730 --> 00:12:39,320 >> ¿Sí? 307 00:12:39,320 --> 00:12:40,000 >> Llamada de función. 308 00:12:40,000 --> 00:12:42,890 Cada vez que se llama a una función, es dado a astilla de memoria para su 309 00:12:42,890 --> 00:12:45,020 las variables locales o de sus parámetros. 310 00:12:45,020 --> 00:12:48,810 Y gráficamente, vemos que con cada función de llamada sucesiva, cuando A 311 00:12:48,810 --> 00:12:52,520 Llamadas B C llama D, que conseguir capas en la pila. 312 00:12:52,520 --> 00:12:55,630 Y dentro de cada una de esas porciones de memoria es esencialmente un alcance único 313 00:12:55,630 --> 00:12:58,590 para esa función, que, por supuesto, es problemático si se quiere entregar 314 00:12:58,590 --> 00:13:01,850 de una función a otra pieza Un de datos que desea que 315 00:13:01,850 --> 00:13:03,500 para mutar o cambiar. 316 00:13:03,500 --> 00:13:08,060 >> Entonces, ¿qué fue de nuestra solución para permitir Una función representada por una pila 317 00:13:08,060 --> 00:13:11,390 enmarcar cambiar la memoria en el interior de otro marco de pila? 318 00:13:11,390 --> 00:13:14,590 ¿Cómo lo hacen los dos hablan el uno al otro? 319 00:13:14,590 --> 00:13:18,510 Así que a través de punteros o direcciones, que, de nuevo, simplemente describir el lugar donde en 320 00:13:18,510 --> 00:13:22,280 la memoria, por medio de una específica morder número, lo particular 321 00:13:22,280 --> 00:13:23,830 valor puede ser encontrado. 322 00:13:23,830 --> 00:13:26,860 Así que recordar la última vez también hemos continuado la historia y miró a un 323 00:13:26,860 --> 00:13:28,280 programa bastante buggy. 324 00:13:28,280 --> 00:13:32,900 Y este programa está libre de errores para unos pocos razones, pero la más preocupante es 325 00:13:32,900 --> 00:13:34,620 porque no puede comprobar qué? 326 00:13:34,620 --> 00:13:39,111 327 00:13:39,111 --> 00:13:40,450 >> Sí, no logra comprobar la entrada. 328 00:13:40,450 --> 00:13:41,870 ¿Lo sientes? 329 00:13:41,870 --> 00:13:43,880 >> Si se trata de más de 12 caracteres. 330 00:13:43,880 --> 00:13:47,260 Así que muy inteligentemente, al llamar memcopy, que, como su nombre indica, sólo 331 00:13:47,260 --> 00:13:50,630 copias de la memoria a partir de su segundo argumento en su primer argumento. 332 00:13:50,630 --> 00:13:54,730 El tercer argumento, muy inteligentemente, es revisado para asegurarse de que usted no lo hace 333 00:13:54,730 --> 00:13:59,400 copiar más de, en este caso, la longitud de barras, número de caracteres, 334 00:13:59,400 --> 00:14:03,810 en el destino, que es este array C. Pero el problema es que lo que 335 00:14:03,810 --> 00:14:07,230 si sí C no es lo suficientemente grande a manejar eso? 336 00:14:07,230 --> 00:14:09,900 Usted va a copiar el número de bytes que se te ha dado. 337 00:14:09,900 --> 00:14:13,040 Pero, ¿qué es lo que realmente tiene más bytes que tienes espacio para el? 338 00:14:13,040 --> 00:14:16,770 >> Pues bien, este programa muy tontamente justo procede ciegamente a tomar lo que es 339 00:14:16,770 --> 00:14:20,650 da, hola barra invertida es 0 genial si cadena es corta 340 00:14:20,650 --> 00:14:22,040 suficiente, como cinco caracteres. 341 00:14:22,040 --> 00:14:26,470 Pero si en realidad es 12 caracteres o 1.200 caracteres, vimos la última vez 342 00:14:26,470 --> 00:14:29,380 que sólo vas a por completo sobrescribir memoria que 343 00:14:29,380 --> 00:14:30,470 no pertenece a usted. 344 00:14:30,470 --> 00:14:34,390 Y peor de los casos, si sobrescribe que porción roja hay que llamamos a la 345 00:14:34,390 --> 00:14:35,380 remite - 346 00:14:35,380 --> 00:14:38,370 esto es sólo el que el ordenador de forma automática, para ti, detrás de la 347 00:14:38,370 --> 00:14:43,130 escenas, se pliega un valor de 32 bits que le recuerda a lo que hacer frente a lo que debería 348 00:14:43,130 --> 00:14:47,080 Volveré cuando foo, esta otra función, está hecho de ejecución. 349 00:14:47,080 --> 00:14:49,320 Es una miga de pan de tipo a la que devuelve. 350 00:14:49,320 --> 00:14:52,490 Si sobrescribe que, potencialmente, si usted es el malo de la película, se pudo 351 00:14:52,490 --> 00:14:54,750 potencialmente hacerse cargo hay alguien del equipo. 352 00:14:54,750 --> 00:14:58,020 Y lo más seguro estrellarlo en la mayoría de los casos. 353 00:14:58,020 --> 00:15:01,690 >> Ahora bien, este problema sólo se agravó como empezamos a hablar de la memoria 354 00:15:01,690 --> 00:15:03,010 gestión en general. 355 00:15:03,010 --> 00:15:07,150 Y malloc, para la asignación de memoria, es un función que se puede utilizar para asignar 356 00:15:07,150 --> 00:15:11,260 memoria cuando no sabemos de antemano que podríamos necesitar algo. 357 00:15:11,260 --> 00:15:13,960 Así, por ejemplo, si regreso al aparato aquí. 358 00:15:13,960 --> 00:15:21,010 Y abro desde hello2.c última vez, recordar este programa aquí, que parecía 359 00:15:21,010 --> 00:15:23,500 un poco de algo como esto, sólo tres líneas - 360 00:15:23,500 --> 00:15:27,940 Diga su nombre, entonces el nombre de cadena, a la izquierda, es igual a getString. 361 00:15:27,940 --> 00:15:29,690 Y luego imprimirlo, el nombre del usuario. 362 00:15:29,690 --> 00:15:31,170 >> Así que este era un programa muy simple. 363 00:15:31,170 --> 00:15:34,870 Para que quede claro, déjame ir por delante y hacer hola-2. 364 00:15:34,870 --> 00:15:36,680 Yo voy a hacer slash dot hola-2. 365 00:15:36,680 --> 00:15:37,750 Diga su nombre - 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 Hola David. 369 00:15:39,540 --> 00:15:41,060 Parece que funciona bien. 370 00:15:41,060 --> 00:15:43,140 Pero lo que realmente está pasando debajo de la campana en esta lista? 371 00:15:43,140 --> 00:15:44,670 Primero vamos a pelar algunas capas. 372 00:15:44,670 --> 00:15:48,380 String es simplemente un sinónimo que hemos se dio cuenta de qué? 373 00:15:48,380 --> 00:15:49,110 Estrella de Char. 374 00:15:49,110 --> 00:15:52,740 Así que vamos a hacerlo un poco más arcano pero técnicamente más correcta que esta 375 00:15:52,740 --> 00:15:55,570 es una estrella char, lo que significa que nombre, sí, es una variable. 376 00:15:55,570 --> 00:15:59,920 Pero, ¿qué nombre de las tiendas es la dirección de un char, que se siente un poco extraño 377 00:15:59,920 --> 00:16:01,050 porque me estoy volviendo una cadena. 378 00:16:01,050 --> 00:16:03,580 Estoy volviendo múltiple no chars un char. 379 00:16:03,580 --> 00:16:07,400 >> Pero, por supuesto, usted necesita solamente la primera Dirección de char a recordar dónde la 380 00:16:07,400 --> 00:16:08,870 toda cadena es porque ¿por qué? 381 00:16:08,870 --> 00:16:12,700 ¿Cómo se puede averiguar dónde está el final de la cadena es saber el principio? 382 00:16:12,700 --> 00:16:13,630 El cero barra invertida. 383 00:16:13,630 --> 00:16:17,260 Así que con esos dos pistas que averiguar antes del comienzo y el final de 384 00:16:17,260 --> 00:16:20,280 cualquier cadena son, siempre y cuando estén adecuadamente formado con que nulo 385 00:16:20,280 --> 00:16:22,110 terminador, que el cero barra invertida. 386 00:16:22,110 --> 00:16:24,520 >> Pero esto está llamando getString. 387 00:16:24,520 --> 00:16:28,020 Y resulta que getString todo este tiempo ha sido una especie de 388 00:16:28,020 --> 00:16:28,820 trampa para nosotros. 389 00:16:28,820 --> 00:16:32,460 Lo ha estado haciendo este trabajo, para estar seguro, Obtención de una cadena desde el usuario. 390 00:16:32,460 --> 00:16:34,580 Pero ¿dónde está la memoria se viene? 391 00:16:34,580 --> 00:16:38,440 Si nos remontamos a la imagen aquí y aplicar la definición de sólo un 392 00:16:38,440 --> 00:16:42,610 Hace momento, de que la pila es donde memoria va cuando se llama a funciones, 393 00:16:42,610 --> 00:16:45,370 por esa lógica, cuando se llama a getString, y luego escribo en 394 00:16:45,370 --> 00:16:50,900 D-A-V-I-D Enter, donde es D-A-V-I-D barra invertida cero almacenado, sobre la base de la 395 00:16:50,900 --> 00:16:53,480 historia que nos hemos dicho a la fecha? 396 00:16:53,480 --> 00:16:55,190 >> Parece estar en la pila, ¿no? 397 00:16:55,190 --> 00:16:58,120 Cuando se llama cadena get obtiene un pedacito de la memoria en la pila. 398 00:16:58,120 --> 00:17:01,630 Así que es lógico pensar que la D-A-V-I-D se almacena cero barra invertida 399 00:17:01,630 --> 00:17:02,770 hay en la pila. 400 00:17:02,770 --> 00:17:07,680 Pero espere un minuto, getString retornos esa cadena, por así decirlo, lo que significa 401 00:17:07,680 --> 00:17:11,700 que es la bandeja de la cafetería se toma de la pila. 402 00:17:11,700 --> 00:17:14,560 Y dijimos la última vez que tan pronto como función devuelve, y que te lleve 403 00:17:14,560 --> 00:17:20,109 la bandeja, por así decirlo, de la pila, lo que puede asumir sobre los restos de 404 00:17:20,109 --> 00:17:21,819 que la memoria? 405 00:17:21,819 --> 00:17:25,160 Que tipo de ellos volvió a dibujar como signos de interrogación porque se vuelven efectivamente 406 00:17:25,160 --> 00:17:26,250 valores desconocidos. 407 00:17:26,250 --> 00:17:29,500 Ellos pueden ser reutilizados cuando algunos siguiente función es llamada. 408 00:17:29,500 --> 00:17:31,870 >> En otras palabras, si nos toca a almacenar - 409 00:17:31,870 --> 00:17:34,350 Voy a dibujar una imagen rápida aquí de la pila. 410 00:17:34,350 --> 00:17:38,690 Si llegamos a ser el dibujo de la parte inferior de mi segmento de memoria, y lo diremos 411 00:17:38,690 --> 00:17:42,230 que este es el lugar de memoria ocupada por C y principal y tal vez arg 412 00:17:42,230 --> 00:17:46,790 arg v y cualquier otra cosa en el programa, cuando GetString se llama, 413 00:17:46,790 --> 00:17:51,120 presumiblemente getString obtiene un trozo de memoria aquí. 414 00:17:51,120 --> 00:17:53,940 Y entonces D-A-V-I-D de alguna manera termina en esta función. 415 00:17:53,940 --> 00:17:55,320 Y yo voy a simplificar en exceso. 416 00:17:55,320 --> 00:18:00,050 Pero vamos a suponer que su D-A-V-I-D barra invertida cero. 417 00:18:00,050 --> 00:18:03,500 Así que esta cantidad de bytes se utilizan en el marco para getString. 418 00:18:03,500 --> 00:18:08,270 >> Pero tan pronto como getString vueltas, dijo la última vez que esta memoria sobre 419 00:18:08,270 --> 00:18:11,340 aquí todo se hace - woops - 420 00:18:11,340 --> 00:18:14,270 todo queda borrado con eficacia. 421 00:18:14,270 --> 00:18:17,220 Y podemos pensar en esto ahora como cuestión marca porque quién sabe 422 00:18:17,220 --> 00:18:18,720 lo que va a pasar con ese recuerdo. 423 00:18:18,720 --> 00:18:22,130 De hecho, muy a menudo llaman a funciones que no sea getString. 424 00:18:22,130 --> 00:18:24,750 Y tan pronto como lo llamo alguna otra función que getString, tal vez no en 425 00:18:24,750 --> 00:18:28,860 este programa en particular que acabamos de ver a, pero algunos otros, sin duda alguna otra 426 00:18:28,860 --> 00:18:34,180 función podría llegar a ser dado este próximo punto en la pila. 427 00:18:34,180 --> 00:18:39,410 >> Así que no puede ser que las tiendas GetString D-A-V-I-D en la pila, ya que lo haría 428 00:18:39,410 --> 00:18:41,040 perderá inmediatamente el acceso a la misma. 429 00:18:41,040 --> 00:18:43,720 Pero sabemos que getString sólo devuelve lo que? 430 00:18:43,720 --> 00:18:47,220 No es volver a Me seis caracteres. 431 00:18:47,220 --> 00:18:51,090 ¿Qué es lo verdaderamente regresando hizo llegamos a la conclusión última vez? 432 00:18:51,090 --> 00:18:52,480 La dirección de la primera. 433 00:18:52,480 --> 00:18:56,650 Así que de alguna manera, cuando llamaste getString, que es la asignación de una parte de la memoria para 434 00:18:56,650 --> 00:18:59,620 la cadena que los usuarios escriben y a continuación, la dirección de vuelta del mismo. 435 00:18:59,620 --> 00:19:02,930 Y resulta que cuando se quiere función para asignar memoria en este 436 00:19:02,930 --> 00:19:08,390 camino y vuelta a la persona que llama esa función, la dirección de 437 00:19:08,390 --> 00:19:11,870 que parte de la memoria, a pesar de todo no puede ponerlo en la pila en la 438 00:19:11,870 --> 00:19:14,750 inferior, ya que funcionalmente es sólo no va a ser suyo muy 439 00:19:14,750 --> 00:19:17,800 rápidamente, por lo que probablemente puede adivinar dónde probablemente vamos a tirar 440 00:19:17,800 --> 00:19:20,130 en cambio, el llamado montón. 441 00:19:20,130 --> 00:19:25,290 >> Así que entre el fondo de la memoria de diseño y la parte superior de la memoria de 442 00:19:25,290 --> 00:19:26,820 diseño son un montón de segmentos. 443 00:19:26,820 --> 00:19:29,270 Una de ellas es la pila, y la derecha anteriormente, es el montón. 444 00:19:29,270 --> 00:19:33,680 Y el montón es sólo un pedazo diferente de memoria que no se utiliza para las funciones de 445 00:19:33,680 --> 00:19:34,770 cuando se les llama. 446 00:19:34,770 --> 00:19:38,100 Se utiliza para la memoria a largo plazo, cuando que desea una función que consigan unas 447 00:19:38,100 --> 00:19:42,700 memoria y ser capaz de aferrarse a ella sin perder el control del mismo. 448 00:19:42,700 --> 00:19:45,550 >> Ahora usted podría tal vez inmediatamente ver que esto no es 449 00:19:45,550 --> 00:19:48,060 necesariamente un diseño perfecto. 450 00:19:48,060 --> 00:19:51,350 A medida que su programa asigna memoria en la pila, o como se llama cada vez 451 00:19:51,350 --> 00:19:55,540 más funciones, o como asignar memoria en el montón con malloc apagado como 452 00:19:55,540 --> 00:20:00,690 getString está haciendo, lo que claramente parece ser inevitable problema? 453 00:20:00,690 --> 00:20:00,860 >> Derecha. 454 00:20:00,860 --> 00:20:03,150 Al igual que el hecho de que estas flechas están apuntando el uno al otro 455 00:20:03,150 --> 00:20:04,380 no presagia nada bueno. 456 00:20:04,380 --> 00:20:08,630 Y, de hecho, podríamos fallar muy rápidamente un programa en cualquier número de maneras. 457 00:20:08,630 --> 00:20:12,050 De hecho, creo que podríamos tener una vez hecho esto accidentalmente. 458 00:20:12,050 --> 00:20:14,020 O si no, vamos a hacerlo deliberadamente ahora. 459 00:20:14,020 --> 00:20:21,330 Déjenme seguir adelante y escribir muy rápidamente un programa llamado dontdothis.c. 460 00:20:21,330 --> 00:20:26,730 Y ahora voy a ir aquí y Qué agudo incluyen stdio.h. 461 00:20:26,730 --> 00:20:32,620 Vamos a declarar la función foo toma Sin argumentos, que es 462 00:20:32,620 --> 00:20:34,040 denotado así por vacío. 463 00:20:34,040 --> 00:20:37,830 >> Y lo único foo va a hacer es llamar a foo, que probablemente no es el 464 00:20:37,830 --> 00:20:39,100 muy inteligente, pero que así sea. 465 00:20:39,100 --> 00:20:40,490 Ent void main. 466 00:20:40,490 --> 00:20:45,270 Ahora la única cosa principal va que hacer es llamar foo también. 467 00:20:45,270 --> 00:20:51,050 Y, sólo por diversión, me voy a ir por delante y decir printf "Hola desde 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 Así que si yo no he cometido ningún error, Hacer dontdothis slash dot. 471 00:21:00,160 --> 00:21:01,960 Y vamos a hacerlo en una ventana más grande - 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 Vamos. 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 Al parecer, usted puede hacer esto. 478 00:21:13,100 --> 00:21:15,190 Maldita sea. 479 00:21:15,190 --> 00:21:16,190 Aceptar. 480 00:21:16,190 --> 00:21:16,580 Espere. 481 00:21:16,580 --> 00:21:17,370 En espera. 482 00:21:17,370 --> 00:21:18,270 ¿Hemos - 483 00:21:18,270 --> 00:21:20,110 Hicimos uso con Marca. 484 00:21:20,110 --> 00:21:22,050 >> [Suspira] 485 00:21:22,050 --> 00:21:25,110 >> Lo sé, pero creo que acaba de eliminar eso. 486 00:21:25,110 --> 00:21:28,410 Uh, sí. 487 00:21:28,410 --> 00:21:30,660 Maldita sea. 488 00:21:30,660 --> 00:21:32,640 Resuelva este Rob. 489 00:21:32,640 --> 00:21:34,678 ¿Qué? 490 00:21:34,678 --> 00:21:35,928 Es muy simple. 491 00:21:35,928 --> 00:21:43,820 492 00:21:43,820 --> 00:21:47,360 Sí, nos volvimos optimización off. 493 00:21:47,360 --> 00:21:48,970 Aceptar, stand bye. 494 00:21:48,970 --> 00:21:49,950 Ahora me siento mejor. 495 00:21:49,950 --> 00:21:51,390 Aceptar. 496 00:21:51,390 --> 00:21:51,780 Está bien. 497 00:21:51,780 --> 00:21:53,430 >> Así que vamos a volver a compilar este - 498 00:21:53,430 --> 00:21:55,880 Hacerte dontdothis. 499 00:21:55,880 --> 00:22:00,090 Puede que tenga que cambiar el nombre de este a dothis.c en un momento. 500 00:22:00,090 --> 00:22:00,710 Eso es. 501 00:22:00,710 --> 00:22:01,240 Gracias. 502 00:22:01,240 --> 00:22:02,050 Aceptar. 503 00:22:02,050 --> 00:22:05,480 Así que el hecho de que yo era la impresión algo era en realidad sólo 504 00:22:05,480 --> 00:22:08,150 ralentizar el proceso por el cual habría llegado 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 >> Entonces, ¿qué está pasando en realidad? 508 00:22:11,180 --> 00:22:14,440 La razón allí, tal como un aparte, es hacer nada en términos de entrada y 509 00:22:14,440 --> 00:22:17,270 salida tiende a ser más lenta porque que escribir caracteres a la 510 00:22:17,270 --> 00:22:18,600 pantalla, tiene que desplazarse. 511 00:22:18,600 --> 00:22:21,720 Así que cuento largo, me había hecho sucedido tan impaciente, tendríamos 512 00:22:21,720 --> 00:22:23,260 visto este resultado final también. 513 00:22:23,260 --> 00:22:26,220 Ahora que tengo paseo de los impresos-ups, lo vemos de inmediato. 514 00:22:26,220 --> 00:22:28,410 ¿Entonces por qué está pasando esto. 515 00:22:28,410 --> 00:22:31,300 Bueno, la explicación simple, por supuesto, es que foo probablemente no debería 516 00:22:31,300 --> 00:22:32,500 se hace llamar. 517 00:22:32,500 --> 00:22:34,470 >> Ahora, en términos generales, esta es la recursión. 518 00:22:34,470 --> 00:22:36,970 Y pensamos que un par de semanas recursivo hace es bueno. 519 00:22:36,970 --> 00:22:40,330 La recursividad es la forma mágica de expresarse muy sucinta. 520 00:22:40,330 --> 00:22:41,400 Y simplemente funciona. 521 00:22:41,400 --> 00:22:45,060 Pero hay una característica clave de todos los programas recursivos que hemos hablado 522 00:22:45,060 --> 00:22:48,260 y mirando al hasta ahora, lo que era que no tenían qué? 523 00:22:48,260 --> 00:22:52,610 Un caso base, que fue un poco difícil codificado caso de que dicho en algunas situaciones 524 00:22:52,610 --> 00:22:56,210 no llame foo, que es claramente no es el caso aquí. 525 00:22:56,210 --> 00:22:58,920 >> Entonces, ¿qué está sucediendo realmente en términos de esta imagen? 526 00:22:58,920 --> 00:23:01,790 Bueno, cuando las llamadas principales foo, se consigue un trozo de memoria. 527 00:23:01,790 --> 00:23:04,150 Cuando llama a foo foo, se pone una rebanada de memoria. 528 00:23:04,150 --> 00:23:06,430 Cuando llama a foo foo, se pone una rebanada. 529 00:23:06,430 --> 00:23:07,080 Se pone una rebanada. 530 00:23:07,080 --> 00:23:08,120 Se pone una rebanada. 531 00:23:08,120 --> 00:23:09,460 Debido foo nunca regresa. 532 00:23:09,460 --> 00:23:12,160 Nunca vamos borrando uno de los marcos de la pila. 533 00:23:12,160 --> 00:23:15,930 Así que estamos soplando a través de la pila, no hablar de quién sabe qué más, y 534 00:23:15,930 --> 00:23:19,600 estamos sobrepasando los límites de nuestra llamado segmento de la memoria. 535 00:23:19,600 --> 00:23:21,790 Go Error falsa segmentación. 536 00:23:21,790 --> 00:23:24,110 >> Así que la solución no es claramente, no lo hagas. 537 00:23:24,110 --> 00:23:28,830 Pero la implicación más grande es que, sí, no hay absolutamente cierto límite, 538 00:23:28,830 --> 00:23:32,470 incluso si no está bien definida, en cuanto a cómo muchas de las funciones que puede llamar en un 539 00:23:32,470 --> 00:23:34,970 programa, ¿cuántas veces una función puede llamar a sí mismo. 540 00:23:34,970 --> 00:23:38,430 Así que a pesar de que hicimos la recursividad predican como esta cosa mágica potencialmente un 541 00:23:38,430 --> 00:23:41,870 Hace un par de semanas para que el sigma función, y cuando tengamos los datos 542 00:23:41,870 --> 00:23:45,270 estructuras y CS50, verás otra aplicaciones para él, no es 543 00:23:45,270 --> 00:23:46,500 necesariamente lo mejor. 544 00:23:46,500 --> 00:23:50,070 Porque si una función se llama a sí mismo, llama a sí mismo, incluso si no hay una base de 545 00:23:50,070 --> 00:23:54,860 caso, si usted no golpea que el caso base para 1000 las llamadas o 10.000 llamadas, por 546 00:23:54,860 --> 00:23:58,800 ese momento es posible que haya quedado sin espacio en su llamada pila y exitosa 547 00:23:58,800 --> 00:24:00,400 algunos otros segmentos de la memoria. 548 00:24:00,400 --> 00:24:03,950 Por lo tanto, también es un diseño de trade-off entre la elegancia y entre 549 00:24:03,950 --> 00:24:06,920 robustez de su especial aplicación. 550 00:24:06,920 --> 00:24:10,780 >> Así que no hay otro inconveniente o otra de gotcha a lo que hemos 551 00:24:10,780 --> 00:24:11,720 estado haciendo hasta ahora. 552 00:24:11,720 --> 00:24:12,980 Cuando llamé a getString - 553 00:24:12,980 --> 00:24:15,120 déjame ir nuevamente dentro de Hello-2. 554 00:24:15,120 --> 00:24:18,170 Observe que estoy llamando getString, que está devolviendo una dirección. 555 00:24:18,170 --> 00:24:20,730 Y decimos hoy que la dirección es del montón. 556 00:24:20,730 --> 00:24:24,480 Y ahora estoy imprimiendo el cadena en esa dirección. 557 00:24:24,480 --> 00:24:27,000 Pero nunca hemos llamado la opuesto de getString. 558 00:24:27,000 --> 00:24:30,850 Nunca hemos tenido a calll una función como ungetstring, donde usted da vuelta 559 00:24:30,850 --> 00:24:31,610 ese recuerdo. 560 00:24:31,610 --> 00:24:33,250 Pero, francamente, es probable que debería haber sido. 561 00:24:33,250 --> 00:24:37,390 Porque si seguimos pidiendo al ordenador para la memoria, a través de alguien como 562 00:24:37,390 --> 00:24:40,830 getString pero nunca darle la espalda, seguramente que también está obligado a llevar a 563 00:24:40,830 --> 00:24:42,970 problemas con lo que nos quedamos sin memoria. 564 00:24:42,970 --> 00:24:46,140 >> Y, de hecho, podemos buscar estos problemas con la nueva herramienta cuyo uso 565 00:24:46,140 --> 00:24:47,640 es un poco críptico al tipo. 566 00:24:47,640 --> 00:24:50,960 Pero déjame ir adelante y salpico arriba en la pantalla en un momento. 567 00:24:50,960 --> 00:24:56,940 Voy a seguir adelante y ejecutar Valgrind con parámetro cuyo primer comando 568 00:24:56,940 --> 00:25:00,260 argumento de la línea es el nombre de ese programa hola-2. 569 00:25:00,260 --> 00:25:02,650 Y lamentablemente es salida es atrozmente 570 00:25:02,650 --> 00:25:04,290 compleja sin una buena razón. 571 00:25:04,290 --> 00:25:06,280 Vemos, pues, todo ese lío. 572 00:25:06,280 --> 00:25:07,530 David es el estado de mi nombre. 573 00:25:07,530 --> 00:25:09,760 Así que ese es el programa actualmente en funcionamiento. 574 00:25:09,760 --> 00:25:11,180 Y ahora tenemos esta salida. 575 00:25:11,180 --> 00:25:13,400 >> Así Valgrind es similar en espíritu a GDB. 576 00:25:13,400 --> 00:25:14,950 No es un depurador per se. 577 00:25:14,950 --> 00:25:16,270 Pero es un comprobador de memoria. 578 00:25:16,270 --> 00:25:20,140 Es un programa que ejecutará el programa y le dirá si le preguntas a un 579 00:25:20,140 --> 00:25:23,860 equipo para la memoria y nunca se lo entregó de nuevo, el sentido de lo que usted tiene 580 00:25:23,860 --> 00:25:24,570 una pérdida de memoria. 581 00:25:24,570 --> 00:25:26,240 Y las pérdidas de memoria tienden a ser malo. 582 00:25:26,240 --> 00:25:29,120 Y es que los usuarios de computadoras tienen Probablemente sintió esto, si usted tiene un 583 00:25:29,120 --> 00:25:30,300 Mac o un PC. 584 00:25:30,300 --> 00:25:33,730 ¿Alguna vez ha utilizado el ordenador para tiempo y no reiniciado en varios 585 00:25:33,730 --> 00:25:36,820 día, o sólo tienes una gran cantidad de programas en ejecución, y la maldita cosa 586 00:25:36,820 --> 00:25:42,360 disminuye a un punto muerto, o al menos es super molesto de usar, porque 587 00:25:42,360 --> 00:25:44,350 todo acaba super lento. 588 00:25:44,350 --> 00:25:46,260 >> Ahora que puede haber cualquier número de razones. 589 00:25:46,260 --> 00:25:49,600 Podría ser un bucle infinito, un error en de alguien de código, o, más simplemente, que 590 00:25:49,600 --> 00:25:53,250 podría significar que usted está usando más memoria, o tratando, de su 591 00:25:53,250 --> 00:25:54,920 equipo en realidad tiene. 592 00:25:54,920 --> 00:25:57,770 Y tal vez hay un error en algún programa que seguir preguntando por la memoria. 593 00:25:57,770 --> 00:26:02,480 Navegadores de años eran conocidos por esto, pidiendo más y más memoria 594 00:26:02,480 --> 00:26:03,870 pero nunca lo devolvió. 595 00:26:03,870 --> 00:26:07,220 Seguramente, si sólo tiene un número finito cantidad de memoria, no se puede pedir 596 00:26:07,220 --> 00:26:09,990 infinitamente muchas veces para algo de esa memoria. 597 00:26:09,990 --> 00:26:13,070 >> Y así, lo que se ve aquí, a pesar de que de nuevo la salida de Valgrind es 598 00:26:13,070 --> 00:26:17,490 innecesariamente complejo para mirar a en primer lugar, esta es la parte interesante. 599 00:26:17,490 --> 00:26:18,890 Heap - 600 00:26:18,890 --> 00:26:20,060 en uso en la salida. 601 00:26:20,060 --> 00:26:22,810 Así que aquí está cómo era la cantidad de memoria en uso en el montón en el 602 00:26:22,810 --> 00:26:24,300 vez que mi programa salió - 603 00:26:24,300 --> 00:26:27,280 aparentemente seis bytes en un bloque. 604 00:26:27,280 --> 00:26:28,710 Así que voy a agitar mis manos a lo que un bloque es. 605 00:26:28,710 --> 00:26:31,270 Piense en ello es sólo una parte, una mayor palabra técnica para trozo. 606 00:26:31,270 --> 00:26:33,140 Pero seis bytes - 607 00:26:33,140 --> 00:26:36,870 ¿cuáles son los seis bytes que todavía 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 nombrar más el terminador nulo. 610 00:26:41,520 --> 00:26:46,350 Así que este programa Valgrind cuenta de que yo pidió seis bytes, al parecer, por 611 00:26:46,350 --> 00:26:48,950 modo de getString, pero nunca les dio la espalda. 612 00:26:48,950 --> 00:26:52,030 Y de hecho, esto podría no ser tan obvio si mi programa no es de tres 613 00:26:52,030 --> 00:26:53,590 líneas, pero es 300 líneas. 614 00:26:53,590 --> 00:26:56,920 Así que en realidad podemos dar otro comando argumento de la línea de Valgrind para 615 00:26:56,920 --> 00:26:58,290 hacerlo más detallado. 616 00:26:58,290 --> 00:26:59,760 Es un poco molesto para recordar. 617 00:26:59,760 --> 00:27:01,580 Pero si lo hago - 618 00:27:01,580 --> 00:27:01,930 veamos. 619 00:27:01,930 --> 00:27:03,540 Leak - 620 00:27:03,540 --> 00:27:05,030 ¿Fue fugas - 621 00:27:05,030 --> 00:27:07,580 aunque no me acuerdo lo que está fuera de la mano. 622 00:27:07,580 --> 00:27:08,550 >> - Fugas cheque equivale completo. 623 00:27:08,550 --> 00:27:10,180 Sí, gracias. 624 00:27:10,180 --> 00:27:12,520 - Fugas cheque equivale completo. 625 00:27:12,520 --> 00:27:13,800 Intro. 626 00:27:13,800 --> 00:27:14,940 El mismo programa se está ejecutando. 627 00:27:14,940 --> 00:27:16,180 Escriba David de nuevo. 628 00:27:16,180 --> 00:27:17,660 Ahora veo un poco más de detalle. 629 00:27:17,660 --> 00:27:20,890 Pero a continuación el resumen montón, la cual es idéntica a la de cuatro - ah, 630 00:27:20,890 --> 00:27:22,120 esto es un poco agradable. 631 00:27:22,120 --> 00:27:25,460 Ahora Valgrind está buscando realmente un poco más difícil en mi código. 632 00:27:25,460 --> 00:27:29,580 Y está diciendo que, al parecer, malloc en línea - 633 00:27:29,580 --> 00:27:30,580 nos alejamos. 634 00:27:30,580 --> 00:27:31,980 En la línea - 635 00:27:31,980 --> 00:27:32,930 no vemos qué línea es. 636 00:27:32,930 --> 00:27:35,110 Pero malloc es el primer culpable. 637 00:27:35,110 --> 00:27:38,630 Hay un blog en malloc. 638 00:27:38,630 --> 00:27:39,810 >> ¿De acuerdo? 639 00:27:39,810 --> 00:27:40,450 Bueno, no. 640 00:27:40,450 --> 00:27:40,940 ¿Cierto? 641 00:27:40,940 --> 00:27:42,520 Llamé getString. 642 00:27:42,520 --> 00:27:44,460 getString llama aparentemente malloc. 643 00:27:44,460 --> 00:27:47,800 Entonces, ¿qué línea de código es aparentemente la culpa por haber 644 00:27:47,800 --> 00:27:49,050 asignado esta memoria? 645 00:27:49,050 --> 00:27:51,560 646 00:27:51,560 --> 00:27:55,540 Vamos a suponer que quien escribió malloc ha existido el tiempo suficiente como para que sea 647 00:27:55,540 --> 00:27:56,390 no es su culpa. 648 00:27:56,390 --> 00:27:57,520 Así que es probable que sea la mía. 649 00:27:57,520 --> 00:28:02,000 getString en cs50.c - así que es un presentar en algún lugar en el equipo - 650 00:28:02,000 --> 00:28:05,210 en línea 286 parece ser el culpable. 651 00:28:05,210 --> 00:28:08,140 Ahora vamos a suponer que CS50 ha sido alrededor por cantidad decente de tiempo, por lo que 652 00:28:08,140 --> 00:28:09,720 nosotros también somos infalibles. 653 00:28:09,720 --> 00:28:14,080 Y por lo que probablemente no está en getString de que el error se encuentra, sino más bien en 654 00:28:14,080 --> 00:28:17,810 hola-2.c línea 18. 655 00:28:17,810 --> 00:28:20,670 >> Así que echemos un vistazo a lo que era que la línea 18. 656 00:28:20,670 --> 00:28:21,130 Oh. 657 00:28:21,130 --> 00:28:27,130 De alguna manera, esta línea no es necesariamente con errores, per se, sino que es la razón 658 00:28:27,130 --> 00:28:28,630 detrás de esa pérdida de memoria. 659 00:28:28,630 --> 00:28:32,140 Así que muy sencilla, lo que haría de manera intuitiva ser la solución a este problema? 660 00:28:32,140 --> 00:28:34,710 Si estamos pidiendo memoria, nunca fueron dándole la espalda, y que parece ser un 661 00:28:34,710 --> 00:28:37,940 problema, ya que con el tiempo mi equipo podría quedarse sin memoria, se reducirá la velocidad 662 00:28:37,940 --> 00:28:42,110 abajo, las cosas malas pueden pasar, así, ¿cuál es la solución simple e intuitiva? 663 00:28:42,110 --> 00:28:43,140 Sólo tienes que darle la espalda. 664 00:28:43,140 --> 00:28:44,770 >> ¿Cómo se puede liberar esa memoria? 665 00:28:44,770 --> 00:28:49,970 Bueno, por suerte es muy sencillo sólo decir el nombre de forma gratuita. 666 00:28:49,970 --> 00:28:51,260 Y nosotros nunca hemos hecho esto antes. 667 00:28:51,260 --> 00:28:55,890 Pero usted puede pensar esencialmente en libre como el opuesto de malloc. 668 00:28:55,890 --> 00:28:58,030 libre es lo opuesto a la la asignación de memoria. 669 00:28:58,030 --> 00:28:59,540 Así que ahora déjame a compilar esto. 670 00:28:59,540 --> 00:29:02,050 Hacer hola-2. 671 00:29:02,050 --> 00:29:04,620 Déjame correr de nuevo. hola-2 David. 672 00:29:04,620 --> 00:29:07,290 Así que parece que funciona en exactamente de la misma manera. 673 00:29:07,290 --> 00:29:11,180 Pero si vuelvo a Valgrind y repetición ese mismo comando en mi recién 674 00:29:11,180 --> 00:29:14,720 compilado programa, mecanografía en mi nombre como antes - 675 00:29:14,720 --> 00:29:15,370 agradable. 676 00:29:15,370 --> 00:29:16,760 Resumen Heap - 677 00:29:16,760 --> 00:29:17,740 en uso en la salida - 678 00:29:17,740 --> 00:29:19,370 cero bytes en cero bloques. 679 00:29:19,370 --> 00:29:21,840 Y esto es muy agradable, todo bloques montón fueron liberados. 680 00:29:21,840 --> 00:29:23,480 Sin fugas son posibles. 681 00:29:23,480 --> 00:29:27,200 >> Así que viene, no con problemas n 4, pero con problemas 5, los forenses 682 00:29:27,200 --> 00:29:30,740 y en adelante, esto también se convertirá en un medida de la exactitud de su 683 00:29:30,740 --> 00:29:33,630 programa, si usted tiene o no o no tienen pérdidas de memoria. 684 00:29:33,630 --> 00:29:36,900 Pero, por suerte, no sólo se puede razonar a través de ellos de forma intuitiva, que 685 00:29:36,900 --> 00:29:40,430 es, sin duda, más fácil para pequeños programas pero es más difícil para los programas más grandes, 686 00:29:40,430 --> 00:29:43,860 Valgrind, para aquellos programas de mayor envergadura, puede ayudarle a identificar 687 00:29:43,860 --> 00:29:45,360 el problema particular. 688 00:29:45,360 --> 00:29:47,500 >> Pero hay otro problema que puedan surgir. 689 00:29:47,500 --> 00:29:51,245 Permítanme abrir este archivo aquí, que es, de nuevo, un ejemplo algo simple. 690 00:29:51,245 --> 00:29:53,760 Pero vamos a centrarnos en lo que este programa lo hace. 691 00:29:53,760 --> 00:29:55,190 Esto se llama memory.c. 692 00:29:55,190 --> 00:29:58,380 Vamos a publicar esta tarde hoy en el zip del código fuente de la actualidad. 693 00:29:58,380 --> 00:30:01,610 Y note que tengo una función llamada f que no toma argumentos y 694 00:30:01,610 --> 00:30:02,800 no devuelve nada. 695 00:30:02,800 --> 00:30:07,240 En la línea 20, que estoy al parecer se declara una puntero a un int y decir que es x. 696 00:30:07,240 --> 00:30:09,570 Estoy asignando es el retorno valor de malloc. 697 00:30:09,570 --> 00:30:14,590 Y para que quede claro, ¿cuántos bytes am Probablemente volver de malloc 698 00:30:14,590 --> 00:30:17,080 en esta situación? 699 00:30:17,080 --> 00:30:18,040 >> Probablemente 40. 700 00:30:18,040 --> 00:30:18,840 ¿De dónde sacaste eso? 701 00:30:18,840 --> 00:30:22,410 Bueno, si usted recuerda que un int es a menudo 4 bytes, por lo menos es en el 702 00:30:22,410 --> 00:30:25,110 aparato, 10 veces 4 es, obviamente, 40. 703 00:30:25,110 --> 00:30:28,920 Así malloc devuelve una dirección de un trozo de memoria y almacenamiento que 704 00:30:28,920 --> 00:30:30,800 abordar en última instancia en x. 705 00:30:30,800 --> 00:30:32,570 Así que para ser claros, lo que entonces está sucediendo? 706 00:30:32,570 --> 00:30:34,990 Bueno, déjame cambia de nuevo a nuestra imagen aquí. 707 00:30:34,990 --> 00:30:38,150 No me dejes solo trazo la parte inferior de mi la memoria del ordenador, deja que me vaya por delante y 708 00:30:38,150 --> 00:30:42,990 dibujar todo el rectángulo que representa toda mi RAM. 709 00:30:42,990 --> 00:30:44,790 >> Vamos a decir que la pila está en la parte inferior. 710 00:30:44,790 --> 00:30:47,010 Y hay un segmento de texto en los datos sin inicializar. 711 00:30:47,010 --> 00:30:49,880 Pero yo sólo voy a los abstracta otras cosas de distancia como punto, punto, punto. 712 00:30:49,880 --> 00:30:53,470 Yo sólo voy a hacer referencia a este como la pila en la parte superior. 713 00:30:53,470 --> 00:30:57,070 Y luego en la parte inferior de esta imagen, para representar principal, me voy 714 00:30:57,070 --> 00:30:59,880 para darle una memoria rebanadas en la pila. 715 00:30:59,880 --> 00:31:03,150 Para f, voy a darle una rebanada de memoria en la pila. 716 00:31:03,150 --> 00:31:05,140 Ahora, tengo que consultar con mi código fuente de nuevo. 717 00:31:05,140 --> 00:31:07,170 ¿Cuáles son las variables locales para el principal? 718 00:31:07,170 --> 00:31:10,710 Aparentemente nada, así que corte es efectivamente vacío o ni siquiera tan grande 719 00:31:10,710 --> 00:31:11,600 como he dibujado él. 720 00:31:11,600 --> 00:31:15,730 Pero en f, tengo una variable local, que se llama x. 721 00:31:15,730 --> 00:31:20,410 Así que voy a seguir adelante y dar f un trozo de memoria, que calificó de x. 722 00:31:20,410 --> 00:31:24,680 >> Y ahora malloc de 10 veces 4, Así malloc 40, ¿dónde está ese 723 00:31:24,680 --> 00:31:25,430 memoria viene? 724 00:31:25,430 --> 00:31:27,530 Nosotros no hemos dibujado una imagen como esto antes. 725 00:31:27,530 --> 00:31:31,140 Pero vamos a suponer que es efectivamente que viene de aquí, por lo que uno, 726 00:31:31,140 --> 00:31:33,170 dos, tres, cuatro, cinco. 727 00:31:33,170 --> 00:31:34,680 Y ahora necesito 40 de estos. 728 00:31:34,680 --> 00:31:37,540 Así que voy a hacer punto, punto, punto de sugerir que incluso hay más memoria 729 00:31:37,540 --> 00:31:39,350 al volver de la pila. 730 00:31:39,350 --> 00:31:40,710 Ahora, ¿qué es la dirección? 731 00:31:40,710 --> 00:31:42,620 Elijamos nuestro arbitraria abordar como siempre - 732 00:31:42,620 --> 00:31:46,310 Ox123, a pesar de que probablemente va ser algo completamente diferente. 733 00:31:46,310 --> 00:31:50,420 Esa es la dirección del primer byte en memoria que lo que estoy pidiendo para malloc. 734 00:31:50,420 --> 00:31:53,630 >> Así que en resumen, una vez que la línea 20 se ejecuta, lo que es, literalmente, 735 00:31:53,630 --> 00:31:57,170 almacenado en el interior 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 Y el buey es poco interesante. 739 00:32:01,550 --> 00:32:03,200 Sólo significa que aquí hay un número hexadecimal. 740 00:32:03,200 --> 00:32:06,490 Pero lo fundamental es que lo que he store en x, que es una variable local. 741 00:32:06,490 --> 00:32:10,260 Pero su tipo de datos, una vez más, es una dirección de un int. 742 00:32:10,260 --> 00:32:12,710 Bueno, me voy a guardar Ox123. 743 00:32:12,710 --> 00:32:16,610 Pero, de nuevo, si eso es un poco demasiado complicado innecesariamente, si me desplazo 744 00:32:16,610 --> 00:32:21,490 hacia atrás, podemos abstraer esta distancia bastante razonable y justo decir que x es un 745 00:32:21,490 --> 00:32:23,910 puntero a ese trozo de memoria. 746 00:32:23,910 --> 00:32:24,070 >> Aceptar. 747 00:32:24,070 --> 00:32:26,230 Ahora la pregunta que nos ocupa es la siguiente - 748 00:32:26,230 --> 00:32:29,910 la línea 21, que resulta, está libre de errores. 749 00:32:29,910 --> 00:32:31,160 ¿Por qué? 750 00:32:31,160 --> 00:32:34,890 751 00:32:34,890 --> 00:32:36,930 >> ¿Lo sientes? 752 00:32:36,930 --> 00:32:38,640 No tiene por qué - 753 00:32:38,640 --> 00:32:40,390 decir que una vez más. 754 00:32:40,390 --> 00:32:41,240 Bueno, no lo hace de forma gratuita. 755 00:32:41,240 --> 00:32:42,350 Así que ese es el segundo, pero. 756 00:32:42,350 --> 00:32:45,000 Así que hay otra, pero específicamente en la línea 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 Esta simple línea de código es sólo una desbordamiento de búfer, una saturación del búfer. 760 00:32:54,980 --> 00:32:57,050 Un buffer sólo significa un trozo de memoria. 761 00:32:57,050 --> 00:33:01,520 Pero ese trozo de memoria es de tamaño 10, 10 enteros, lo que significa que si 762 00:33:01,520 --> 00:33:05,350 índice en ella utilizando el azúcar sintáctico de la notación de matriz, la plaza 763 00:33:05,350 --> 00:33:09,220 soportes, usted tiene acceso a x soporte de 0 x 1 soporte de x, 764 00:33:09,220 --> 00:33:10,390 dot soporte, punto, punto. 765 00:33:10,390 --> 00:33:13,270 x soporte 9 es el más grande. 766 00:33:13,270 --> 00:33:17,680 Así que si lo hago x soporte 10, donde De hecho voy en la memoria? 767 00:33:17,680 --> 00:33:19,120 >> Bueno, si tengo 10 int - 768 00:33:19,120 --> 00:33:21,070 vamos realmente atraer a todos de ellos aquí. 769 00:33:21,070 --> 00:33:22,700 Así que esa fue la primera de cinco. 770 00:33:22,700 --> 00:33:24,660 Aquí están los otros cinco ints. 771 00:33:24,660 --> 00:33:29,580 Así x soporte 0 está aquí. x soporte 1 es aquí. x soporte 9 está aquí. x soporte 772 00:33:29,580 --> 00:33:37,960 10 está aquí, lo que significa que estoy diciendo, en la línea 21, el equipo para poner el 773 00:33:37,960 --> 00:33:39,400 número donde? 774 00:33:39,400 --> 00:33:42,010 El número 0 donde? 775 00:33:42,010 --> 00:33:43,380 Bueno, es 0, sí. 776 00:33:43,380 --> 00:33:45,460 Pero sólo el hecho de que su 0 es una especie de coincidencia. 777 00:33:45,460 --> 00:33:47,140 Podría ser el número 50, a todos nos importa. 778 00:33:47,140 --> 00:33:50,480 Pero estamos tratando de ponerlo en x soporte 10, que es donde este 779 00:33:50,480 --> 00:33:53,700 signo de interrogación se dibuja, que no es una buena cosa. 780 00:33:53,700 --> 00:33:57,070 Este programa podría muy bien estrellarse como resultado. 781 00:33:57,070 --> 00:33:59,400 >> Ahora, vamos a seguir adelante y ver si esto es, de hecho, lo que sucede. 782 00:33:59,400 --> 00:34:02,600 Hacer memoria, ya que el archivo se llama memory.c. 783 00:34:02,600 --> 00:34:05,950 Vamos a seguir adelante y ejecutar la memoria de programa. 784 00:34:05,950 --> 00:34:08,239 Así que tuvimos suerte, en realidad, lo que parece. 785 00:34:08,239 --> 00:34:09,340 Tuvimos suerte. 786 00:34:09,340 --> 00:34:11,060 Pero vamos a ver si ahora corremos Valgrind. 787 00:34:11,060 --> 00:34:14,170 A primera vista, mi programa podría parecen ser perfectamente correcta. 788 00:34:14,170 --> 00:34:18,010 Pero déjame correr Valgrind con el - Fuga de verificación es igual completa en la memoria. 789 00:34:18,010 --> 00:34:20,110 >> Y ahora cuando ejecuto esto - 790 00:34:20,110 --> 00:34:21,030 interesante. 791 00:34:21,030 --> 00:34:26,800 Escritura no válido de tamaño 4 en línea 21 de memory.c. 792 00:34:26,800 --> 00:34:29,284 Línea 21 de memory.c es cuál? 793 00:34:29,284 --> 00:34:30,340 Ah, interesante. 794 00:34:30,340 --> 00:34:31,080 Pero espere. 795 00:34:31,080 --> 00:34:32,389 Tamaño 4, ¿cuál es el que se refiere a? 796 00:34:32,389 --> 00:34:34,969 Sólo hice una escritura, pero es de tamaño 4. 797 00:34:34,969 --> 00:34:36,889 ¿Por qué es 4? 798 00:34:36,889 --> 00:34:39,280 Es porque es un int, que es, de nuevo, cuatro bytes. 799 00:34:39,280 --> 00:34:42,510 Así Valgrind encontró un error que yo, echar un vistazo a mi código, no lo hizo. 800 00:34:42,510 --> 00:34:45,040 Y tal vez su TF sería o no sería. 801 00:34:45,040 --> 00:34:48,469 ¿Qué Pero Valgrind con seguridad encontró que que hemos cometido un error allí, incluso 802 00:34:48,469 --> 00:34:52,719 aunque tuvimos suerte, y el ordenador decidió, eh, yo no voy a chocar 803 00:34:52,719 --> 00:34:57,470 sólo porque usted tocó un byte, una el valor de la memoria que no lo hiciste de int 804 00:34:57,470 --> 00:34:58,550 en realidad poseer. 805 00:34:58,550 --> 00:35:00,380 >> Bueno, ¿qué más hay errores aquí. 806 00:35:00,380 --> 00:35:01,180 Dirección - 807 00:35:01,180 --> 00:35:03,190 esta es una dirección de mirada loco en hexadecimal. 808 00:35:03,190 --> 00:35:06,890 Eso sólo significa que en algún lugar de la pila es cero bytes después de un bloque de tamaño 40 809 00:35:06,890 --> 00:35:07,620 se asigna. 810 00:35:07,620 --> 00:35:10,610 Permítanme Alejar aquí y ver si esto es un poco más útil. 811 00:35:10,610 --> 00:35:11,410 Interesante. 812 00:35:11,410 --> 00:35:15,600 40 bytes están definitivamente perdidos en el registro de la pérdida de 1 de 1. 813 00:35:15,600 --> 00:35:17,840 Una vez más, más palabras que es útil en este caso. 814 00:35:17,840 --> 00:35:21,350 Pero en base a las líneas resaltadas, donde debería probablemente centrar mi 815 00:35:21,350 --> 00:35:24,070 atención para otro bug? 816 00:35:24,070 --> 00:35:26,570 Se parece a una línea 20 de memory.c. 817 00:35:26,570 --> 00:35:30,990 >> Así que si nos remontamos a la línea 20, que es la uno que ha identificado previamente. 818 00:35:30,990 --> 00:35:33,030 Y no es necesariamente erróneo. 819 00:35:33,030 --> 00:35:35,160 Pero hemos invertido esta sus efectos. 820 00:35:35,160 --> 00:35:38,790 Entonces, ¿cómo puedo corregir, al menos, uno de esos errores? 821 00:35:38,790 --> 00:35:42,240 ¿Qué podía hacer después de la línea 21? 822 00:35:42,240 --> 00:35:47,110 Que podía hacer libre de x, por lo que es de devolver esa memoria. 823 00:35:47,110 --> 00:35:49,230 Y ¿cómo puedo solucionar este error? 824 00:35:49,230 --> 00:35:52,120 Definitivamente debería ir a no más de 0. 825 00:35:52,120 --> 00:35:53,670 Así que voy a tratar y volver a hacer éste. 826 00:35:53,670 --> 00:35:56,080 Lo sentimos, pero sin duda alguna a no más de 9. 827 00:35:56,080 --> 00:35:57,510 Hacer memoria. 828 00:35:57,510 --> 00:36:00,650 Permítanme volver a ejecutar Valgrind en una ventana más grande. 829 00:36:00,650 --> 00:36:01,580 Y ahora mira. 830 00:36:01,580 --> 00:36:02,250 Niza. 831 00:36:02,250 --> 00:36:03,270 Todos los bloques de almacenamiento dinámico fueron liberados. 832 00:36:03,270 --> 00:36:04,270 Sin fugas son posibles. 833 00:36:04,270 --> 00:36:07,520 Y por encima de aquí, no hay mención como tampoco del derecho válido. 834 00:36:07,520 --> 00:36:09,820 >> Sólo para obtener codiciosos, y vamos a ver si otra demostración 835 00:36:09,820 --> 00:36:11,050 no va según lo previsto - 836 00:36:11,050 --> 00:36:12,560 Yo tuve la suerte hace un momento. 837 00:36:12,560 --> 00:36:15,530 Y el hecho de que esto es 0 es quizás innecesariamente engañosa. 838 00:36:15,530 --> 00:36:20,650 Vamos a hacer 50 años, un tanto arbitraria número, marca de memoria slash dot memoria - 839 00:36:20,650 --> 00:36:21,410 todavía tenga suerte. 840 00:36:21,410 --> 00:36:22,510 Nada ha estrellarse. 841 00:36:22,510 --> 00:36:26,150 Supongamos que yo acabo de hacer algo realmente tonto, y lo hago 100. 842 00:36:26,150 --> 00:36:30,360 Deja rehacerme memoria, dot slash memoria - 843 00:36:30,360 --> 00:36:31,075 tuvimos suerte de nuevo. 844 00:36:31,075 --> 00:36:32,800 ¿Qué hay de 1000? 845 00:36:32,800 --> 00:36:35,370 ints allá, más o menos, donde debería estar? 846 00:36:35,370 --> 00:36:37,410 Hacer memoria - 847 00:36:37,410 --> 00:36:38,570 maldita sea. 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 No vamos a perder el tiempo ya. 851 00:36:43,920 --> 00:36:45,120 Vuelva a ejecutar la memoria. 852 00:36:45,120 --> 00:36:45,840 Eso es. 853 00:36:45,840 --> 00:36:46,410 Está bien. 854 00:36:46,410 --> 00:36:52,500 Así que al parecer se indexa 100.000 ints más allá de donde debería haber estado en 855 00:36:52,500 --> 00:36:54,410 la memoria, las cosas malas suceden. 856 00:36:54,410 --> 00:36:56,430 Así que esto no es, obviamente, una regla fija duro. 857 00:36:56,430 --> 00:36:58,190 Yo estaba un poco usando el juicio y error para llegar allí. 858 00:36:58,190 --> 00:37:02,230 Pero esto se debe a que, cuento largo, la memoria del equipo también se divide 859 00:37:02,230 --> 00:37:03,580 en estas cosas denominadas segmentos. 860 00:37:03,580 --> 00:37:07,260 Y a veces, la computadora en realidad te ha dado un poco más de memoria 861 00:37:07,260 --> 00:37:08,400 de lo que pides. 862 00:37:08,400 --> 00:37:12,170 Sin embargo, para la eficiencia, es simplemente más fácil obtener más memoria, pero sólo le dirá 863 00:37:12,170 --> 00:37:13,780 que usted está recibiendo una parte de ella. 864 00:37:13,780 --> 00:37:16,370 >> Y si tienes suerte a veces, Por lo tanto, usted podría ser capaz de tocar 865 00:37:16,370 --> 00:37:17,795 memoria que no le pertenece a usted. 866 00:37:17,795 --> 00:37:21,860 Usted no tiene ninguna garantía de que lo que el valor que puso en su lugar se quedará allí, porque 867 00:37:21,860 --> 00:37:25,080 el equipo aún piensa que no es la suya, pero no es necesariamente va 868 00:37:25,080 --> 00:37:29,910 para golpear otro segmento de la memoria en la equipo e inducir un error como 869 00:37:29,910 --> 00:37:31,710 este de aquí. 870 00:37:31,710 --> 00:37:32,060 Está bien. 871 00:37:32,060 --> 00:37:37,240 Cualquier pregunta entonces sobre la memoria? 872 00:37:37,240 --> 00:37:37,590 >> Está bien. 873 00:37:37,590 --> 00:37:40,610 Vamos a echar un vistazo aquí, entonces, en algo que hemos estado dando por 874 00:37:40,610 --> 00:37:48,361 concedida desde hace bastante tiempo, que está en este archivo llamado cs50.h. 875 00:37:48,361 --> 00:37:49,420 Así que este es un archivo. 876 00:37:49,420 --> 00:37:51,130 Estos son sólo un montón de los comentarios arriba. 877 00:37:51,130 --> 00:37:53,900 Y usted puede ser que haya mirado a esto si que hurgó en el aparato. 878 00:37:53,900 --> 00:37:57,000 Pero resulta que todo el tiempo, cuando solíamos usar cadena como una 879 00:37:57,000 --> 00:38:01,130 sinónimo, el medio por el cual nos declaramos que era sinónimo con esta 880 00:38:01,130 --> 00:38:03,990 typedef palabra clave, para el tipo de definición. 881 00:38:03,990 --> 00:38:07,500 Y estamos diciendo esencialmente, hacer cadena sinónimo de estrellas caracteres. 882 00:38:07,500 --> 00:38:11,190 Que los medios por los cuales la pila creado estas ruedas de entrenamiento conocidos como 883 00:38:11,190 --> 00:38:12,040 la cadena. 884 00:38:12,040 --> 00:38:14,830 >> Ahora aquí es sólo un prototipo para getchar. 885 00:38:14,830 --> 00:38:17,350 Puede ser que hayamos visto antes, pero eso es de hecho lo que hace. getchar 886 00:38:17,350 --> 00:38:19,070 no toma ningún argumento, devuelve un char. 887 00:38:19,070 --> 00:38:21,340 GetDouble no toma ningún argumento, devuelve un doble. 888 00:38:21,340 --> 00:38:24,440 getFloat no tiene argumentos, declaraciones un flotador, y así sucesivamente. 889 00:38:24,440 --> 00:38:27,270 getint está aquí. getlonglong hay aquí. 890 00:38:27,270 --> 00:38:28,820 Y getString está aquí. 891 00:38:28,820 --> 00:38:29,420 Y eso es todo. 892 00:38:29,420 --> 00:38:33,080 Esta línea morada es otro preprocesador directiva, debido a la 893 00:38:33,080 --> 00:38:35,550 hashtag en el comienzo de la misma. 894 00:38:35,550 --> 00:38:35,870 >> Está bien. 895 00:38:35,870 --> 00:38:38,380 Así que ahora me dejes ir en cs50.c. 896 00:38:38,380 --> 00:38:40,400 Y no vamos a hablar demasiado tiempo en esto. 897 00:38:40,400 --> 00:38:43,280 Pero para darle una idea de lo que es estado sucediendo todo esto 898 00:38:43,280 --> 00:38:46,434 tiempo, déjame ir a - 899 00:38:46,434 --> 00:38:48,250 hagámoslo getchar. 900 00:38:48,250 --> 00:38:51,050 Así getchar es en su mayoría comentarios. 901 00:38:51,050 --> 00:38:52,060 Pero parece que esto. 902 00:38:52,060 --> 00:38:54,800 Así que esta es la función real getchar que hemos sido 903 00:38:54,800 --> 00:38:56,055 dando por sentado que existe. 904 00:38:56,055 --> 00:38:59,370 Y a pesar de que no hemos utilizar éste que muchas veces, o nunca, que es por lo menos 905 00:38:59,370 --> 00:39:00,470 relativamente simple. 906 00:39:00,470 --> 00:39:02,580 Así que vale la pena tomar un rápido vistazo aquí. 907 00:39:02,580 --> 00:39:06,540 >> Así getchar tiene un bucle infinito, deliberadamente para parecer. 908 00:39:06,540 --> 00:39:10,050 A continuación, llama - y esto es una especie de agradable reutilización de código que nos escribió. 909 00:39:10,050 --> 00:39:11,220 Llama getString. 910 00:39:11,220 --> 00:39:12,460 Porque lo que lo hace significar para obtener un char? 911 00:39:12,460 --> 00:39:14,730 Bueno, puede ser que también tratar de conseguir un toda la línea de texto del usuario y 912 00:39:14,730 --> 00:39:16,940 a continuación, sólo tiene que buscar en un de esos personajes. 913 00:39:16,940 --> 00:39:19,170 En la línea 60, aquí hay un poco de poco de una comprobación de validez. 914 00:39:19,170 --> 00:39:21,610 Si getString volvió nulo, no vamos a proceder. 915 00:39:21,610 --> 00:39:22,820 Algo salió mal. 916 00:39:22,820 --> 00:39:28,120 >> Ahora bien, esto es algo molesto, pero convencional en C. caracteres máx probablemente 917 00:39:28,120 --> 00:39:29,960 representa lo que acaba basándose en su nombre? 918 00:39:29,960 --> 00:39:31,670 Es una constante. 919 00:39:31,670 --> 00:39:36,040 Es como el valor numérico de la mayor carbón puede representar con 920 00:39:36,040 --> 00:39:40,370 un bocado, que es probablemente el número 255, que es el mayor número que 921 00:39:40,370 --> 00:39:42,720 representar a ocho bits, a partir de cero. 922 00:39:42,720 --> 00:39:47,460 Así que he uso este, en esta función, escribir este código, sólo porque 923 00:39:47,460 --> 00:39:51,753 si algo va mal en getchar pero su propósito en la vida es volver a 924 00:39:51,753 --> 00:39:54,830 char, usted necesita ser capaz de alguna manera para indicar al usuario que 925 00:39:54,830 --> 00:39:55,840 algo salió mal. 926 00:39:55,840 --> 00:39:56,970 No podemos devolver null. 927 00:39:56,970 --> 00:39:58,480 Resulta que es un puntero nulo. 928 00:39:58,480 --> 00:40:01,030 Y de nuevo, getchar tiene para devolver un char. 929 00:40:01,030 --> 00:40:04,760 >> Así que la convención, si algo sale mal, es usted, el programador, o en 930 00:40:04,760 --> 00:40:08,160 este caso, yo con la biblioteca, que tenía un solo decidir arbitrariamente, si 931 00:40:08,160 --> 00:40:12,230 algo va mal, voy a devolver el número 255, que es verdaderamente 932 00:40:12,230 --> 00:40:17,240 significa que podemos no ser así, el usuario no puede escribir el carácter representado por la 933 00:40:17,240 --> 00:40:21,410 número 255, porque teníamos un robarlo como un valor llamado centinela para 934 00:40:21,410 --> 00:40:23,410 representar un problema. 935 00:40:23,410 --> 00:40:27,010 Ahora resulta que el carácter 255 no es algo que se pueda escribir con 936 00:40:27,010 --> 00:40:28,380 el teclado, por lo que no es gran cosa. 937 00:40:28,380 --> 00:40:30,910 El usuario no se da cuenta de que Yo he robado este personaje. 938 00:40:30,910 --> 00:40:34,620 Pero si alguna vez se ve en las páginas de manual en un sistema informático alguna referencia a una 939 00:40:34,620 --> 00:40:38,560 todas las tapas de constantes como este que dice, en los casos de error que esto podría constante 940 00:40:38,560 --> 00:40:42,720 ser devuelto, es todo un humano hizo Hace años se decidió arbitrariamente 941 00:40:42,720 --> 00:40:45,680 devolver este valor especial y llamarlo una constante en el caso 942 00:40:45,680 --> 00:40:46,840 algo va mal. 943 00:40:46,840 --> 00:40:48,580 >> Ahora, la magia sucede aquí abajo. 944 00:40:48,580 --> 00:40:52,600 En primer lugar, estoy declarando en la línea 67 dos personajes, C1 y C2. 945 00:40:52,600 --> 00:40:57,080 Y luego, en la línea 68, hay realmente una línea de código que es una reminiscencia de 946 00:40:57,080 --> 00:41:01,140 nuestra printf amigo, dado que se tiene ciento Cs entre comillas. 947 00:41:01,140 --> 00:41:06,490 Pero darse cuenta de lo que está pasando aquí. sscanf significa escaneo cadena - 948 00:41:06,490 --> 00:41:11,690 medios escanear una formateada cadena, sscanf ergo. 949 00:41:11,690 --> 00:41:12,590 ¿Qué significa eso? 950 00:41:12,590 --> 00:41:16,310 Esto significa que se pasa a sscanf una cadena. 951 00:41:16,310 --> 00:41:18,420 Y la línea es lo el usuario escribe pulg 952 00:41:18,420 --> 00:41:23,520 Se pasa a sscanf una cadena de formato como esto que dice scanf cuáles son 953 00:41:23,520 --> 00:41:25,870 usted esperando que el usuario ha escrito pulg 954 00:41:25,870 --> 00:41:29,730 A continuación, pasa en las direcciones de los dos trozos de la memoria, en este caso, 955 00:41:29,730 --> 00:41:31,150 porque tengo dos marcadores de posición. 956 00:41:31,150 --> 00:41:34,610 Así que voy a dar la dirección de C1 y C2 de la dirección. 957 00:41:34,610 --> 00:41:37,700 >> Y recuerdan que usted da en función de la dirección de una variable, lo que es 958 00:41:37,700 --> 00:41:38,950 la implicación? 959 00:41:38,950 --> 00:41:41,400 960 00:41:41,400 --> 00:41:45,050 ¿Qué puede hacer esa función como resultado de darle la dirección de un 961 00:41:45,050 --> 00:41:48,170 variable, frente a la propia variable? 962 00:41:48,170 --> 00:41:49,450 Se puede cambiar, ¿verdad? 963 00:41:49,450 --> 00:41:53,250 Si tuvieras a alguien un mapa a un físico dirección, pueden ir allí y hacer 964 00:41:53,250 --> 00:41:54,750 lo que quieran en esa dirección. 965 00:41:54,750 --> 00:41:55,800 La misma idea aquí. 966 00:41:55,800 --> 00:41:59,950 Si pasamos a sscanf, la dirección de dos fragmentos de memoria, incluso estos pequeños 967 00:41:59,950 --> 00:42:03,585 pequeños trozos de memoria, C1 y C2, pero les decimos que la dirección de ellos, 968 00:42:03,585 --> 00:42:05,170 sscanf puede cambiarlo. 969 00:42:05,170 --> 00:42:08,530 >> Así que el propósito de sscanf en la vida, si leemos la página de manual, es leer lo que el 970 00:42:08,530 --> 00:42:13,420 usuario escribió en la esperanza de que el usuario tenga escrito en un personaje y tal vez 971 00:42:13,420 --> 00:42:16,470 otro personaje, y lo que el usuario escrito, el primer personaje pasa 972 00:42:16,470 --> 00:42:19,310 aquí, el segundo personaje va aquí. 973 00:42:19,310 --> 00:42:22,470 Ahora, en un aparte, esto y lo haría Sólo sé esto de la documentación, 974 00:42:22,470 --> 00:42:25,570 el hecho de que me puse un espacio en blanco que hay Sólo quiere decir que no me importa si 975 00:42:25,570 --> 00:42:28,440 el usuario pulsa la barra espaciadora algunos veces antes de que él o ella toma un 976 00:42:28,440 --> 00:42:30,400 carácter, voy a ignorar cualquier espacio en blanco. 977 00:42:30,400 --> 00:42:32,510 Así que, sé por la documentación. 978 00:42:32,510 --> 00:42:36,570 >> El hecho de que hay un segundo% c seguido de un espacio en blanco es en realidad 979 00:42:36,570 --> 00:42:37,410 deliberada. 980 00:42:37,410 --> 00:42:41,190 Quiero ser capaz de detectar si el usuario estropeado o no cooperar. 981 00:42:41,190 --> 00:42:45,630 Así que espero que el usuario sólo escribe en uno de los personajes, por lo tanto, estoy esperando 982 00:42:45,630 --> 00:42:50,640 sscanf que sólo se va a devolver el valor 1, ya que, de nuevo, si leo 983 00:42:50,640 --> 00:42:55,400 la documentación, el propósito de sscanf en la vida es para volver a la número de 984 00:42:55,400 --> 00:42:59,170 las variables que se llenaron con la entrada del usuario. 985 00:42:59,170 --> 00:43:02,270 >> Pasé con dos variables direcciones, C1 y C2. 986 00:43:02,270 --> 00:43:06,420 Espero, sin embargo, que sólo uno de ellos es asesinado porque si sscanf 987 00:43:06,420 --> 00:43:11,130 devuelve 2, ¿cuál es, presumiblemente, la implicación lógica? 988 00:43:11,130 --> 00:43:14,600 Que el usuario no sólo me dan una personaje como yo le dije. 989 00:43:14,600 --> 00:43:17,860 Probablemente escriben en menos dos caracteres. 990 00:43:17,860 --> 00:43:22,430 Así que si yo no tuviera lugar la segunda % C, acabo de tener una, que 991 00:43:22,430 --> 00:43:25,370 francamente sería más intuitivo enfoque, creo que un primer vistazo, 992 00:43:25,370 --> 00:43:30,220 usted no va a ser capaz de detectar si el usuario le ha estado dando más 993 00:43:30,220 --> 00:43:31,780 entrada de lo que realmente quería. 994 00:43:31,780 --> 00:43:34,100 Así que esta es una forma implícita de comprobación de errores. 995 00:43:34,100 --> 00:43:35,640 >> Pero noto lo que hago aquí. 996 00:43:35,640 --> 00:43:39,970 Una vez que esté seguro de que el usuario me dio una carácter, libero a la línea, haciendo 997 00:43:39,970 --> 00:43:44,450 lo contrario de getString, que a su vez utiliza malloc, y luego vuelva 998 00:43:44,450 --> 00:43:51,030 C1, el personaje que esperaba el proporcionado por el usuario y sólo se dispensará. 999 00:43:51,030 --> 00:43:54,680 Así que una rápida vislumbrado sólo, pero cualquier pregunta sobre getchar? 1000 00:43:54,680 --> 00:43:57,450 1001 00:43:57,450 --> 00:43:59,590 Volveremos a algunos de los otros. 1002 00:43:59,590 --> 00:44:03,770 >> Bueno, déjame seguir adelante y hacer esto - Supongamos ahora, sólo para motivar a nuestra 1003 00:44:03,770 --> 00:44:08,910 discusión en una semana, más tiempo, este es un archivo llamado structs.h. 1004 00:44:08,910 --> 00:44:11,440 Y de nuevo, esto es sólo una muestra de algo que está por venir. 1005 00:44:11,440 --> 00:44:13,090 Pero nótese que muchos de esto es comentarios. 1006 00:44:13,090 --> 00:44:17,440 Así que permítanme destacar sólo el parte interesante por ahora. 1007 00:44:17,440 --> 00:44:18,020 typedef - 1008 00:44:18,020 --> 00:44:19,700 hay esa misma palabra clave de nuevo. 1009 00:44:19,700 --> 00:44:23,100 typedef se utiliza para declarar cadena como un tipo especial de datos. 1010 00:44:23,100 --> 00:44:27,490 Puede usar typedef para crear nuevo tipos de datos que no existían cuando 1011 00:44:27,490 --> 00:44:28,570 C fue inventado. 1012 00:44:28,570 --> 00:44:32,520 Por ejemplo, int viene con C. caracteres viene con C. doble viene con C. Pero 1013 00:44:32,520 --> 00:44:34,000 no hay ninguna noción de un estudiante. 1014 00:44:34,000 --> 00:44:37,230 Y, sin embargo, sería muy útil tener la capaz de escribir un programa que almacena 1015 00:44:37,230 --> 00:44:40,440 en una variable, el número de identificación del estudiante, su nombre, y su casa. 1016 00:44:40,440 --> 00:44:42,890 En otras palabras, tres piezas de los datos, como un int y un 1017 00:44:42,890 --> 00:44:44,420 cuerda y otra cadena. 1018 00:44:44,420 --> 00:44:48,220 >> Con typedef, lo que es bastante potente sobre esto y la palabra clave para sturct 1019 00:44:48,220 --> 00:44:53,660 estructura, usted, el programador en el año 2013, realmente puede definir su propio el 1020 00:44:53,660 --> 00:44:57,530 los tipos de datos que no existían años hace pero que se adapte a sus propósitos. 1021 00:44:57,530 --> 00:45:01,910 Y aquí, en las líneas 13 a 19, estamos declarando un nuevo tipo de datos, como 1022 00:45:01,910 --> 00:45:04,320 un int, pero llamándolo estudiante. 1023 00:45:04,320 --> 00:45:09,310 Y dentro de esta variable va a tres cosas - un int, una cuerda, 1024 00:45:09,310 --> 00:45:09,930 y una cadena. 1025 00:45:09,930 --> 00:45:13,040 Así que usted puede pensar en lo que es realmente ha pasado aquí, a pesar de que este es un 1026 00:45:13,040 --> 00:45:17,160 poco de una simplificación para hoy, un estudiante es esencialmente va 1027 00:45:17,160 --> 00:45:19,450 a tener este aspecto. 1028 00:45:19,450 --> 00:45:22,580 Su va a ser un pedazo de memoria con una identificación, un nombre 1029 00:45:22,580 --> 00:45:25,580 campo, y un campo de casa. 1030 00:45:25,580 --> 00:45:30,670 Y vamos a ser capaces de utilizar los trozos de memoria y acceder a ellos de la siguiente manera. 1031 00:45:30,670 --> 00:45:38,870 >> Si entro en struct0.c, aquí hay una relativamente largo, pero después de un 1032 00:45:38,870 --> 00:45:42,630 patrón, de código que utiliza este nuevo truco. 1033 00:45:42,630 --> 00:45:45,790 Así que en primer lugar, permítanme llamar su atención a las partes interesantes hasta la parte superior. 1034 00:45:45,790 --> 00:45:49,670 Afilado define a los estudiantes 3, declara una constantes llamados estudiantes y cesionarios 1035 00:45:49,670 --> 00:45:53,450 arbitrariamente el número 3, justo así que tengo tres estudiantes que utilizan 1036 00:45:53,450 --> 00:45:54,830 este programa por el momento. 1037 00:45:54,830 --> 00:45:55,960 Aquí viene Principal. 1038 00:45:55,960 --> 00:45:58,860 Y fíjense, ¿cómo me declaro una gran variedad de estudiantes? 1039 00:45:58,860 --> 00:46:00,480 Bueno, acabo de utilizar la misma sintaxis. 1040 00:46:00,480 --> 00:46:02,110 La palabra estudiante es obviamente nueva. 1041 00:46:02,110 --> 00:46:04,790 Pero los estudiantes, la clase, los estudiantes del soporte. 1042 00:46:04,790 --> 00:46:06,720 >> Así que por desgracia hay mucho de reutilización de los términos aquí. 1043 00:46:06,720 --> 00:46:07,660 Esto es sólo un número. 1044 00:46:07,660 --> 00:46:09,040 Así que esto es como decir tres. 1045 00:46:09,040 --> 00:46:11,430 Class es justo lo que quiero llamar a la variable. 1046 00:46:11,430 --> 00:46:12,840 Yo podría llamarlo estudiantes. 1047 00:46:12,840 --> 00:46:15,880 Pero clase, esto no es una clase en un orientado a objetos Java tipo de vía. 1048 00:46:15,880 --> 00:46:17,220 Es sólo una clase de estudiantes. 1049 00:46:17,220 --> 00:46:20,590 Y el tipo de datos de cada elemento en esa matriz es estudiante. 1050 00:46:20,590 --> 00:46:23,040 Así que esto es un poco diferente y de decir algo 1051 00:46:23,040 --> 00:46:25,250 como éste, es sólo - 1052 00:46:25,250 --> 00:46:29,500 Estoy diciendo dame tres estudiantes y llamar a esa clase de arreglo. 1053 00:46:29,500 --> 00:46:29,800 >> Está bien. 1054 00:46:29,800 --> 00:46:30,680 Ahora aquí está un bucle de cuatro. 1055 00:46:30,680 --> 00:46:33,480 Este tipo familiar - iterate de cero en un máximo de tres. 1056 00:46:33,480 --> 00:46:35,160 Y aquí está la nueva pieza de la sintaxis. 1057 00:46:35,160 --> 00:46:37,710 El programa va a pedir confirmación, el ser humano, para darle un estudiante 1058 00:46:37,710 --> 00:46:39,200 ID, que es un int. 1059 00:46:39,200 --> 00:46:44,650 Y aquí está la sintaxis con la que se puede almacenar algo en el campo de identificación en 1060 00:46:44,650 --> 00:46:48,630 ubicación del soporte de clase I. Así esta sintaxis no es nueva. 1061 00:46:48,630 --> 00:46:51,450 Esto sólo significa dame la octava estudiante en la clase. 1062 00:46:51,450 --> 00:46:52,940 Pero este símbolo es nueva. 1063 00:46:52,940 --> 00:46:56,320 Hasta ahora, hemos utilizado no podemos punto, al menos en código como este. 1064 00:46:56,320 --> 00:47:01,490 Esto significa ir a la estructura conocida como un estudiante y poner algo allí. 1065 00:47:01,490 --> 00:47:05,670 Del mismo modo, en esta línea siguiente, el 31, vaya adelante y poner lo que el usuario escribe 1066 00:47:05,670 --> 00:47:10,530 para un nombre aquí y lo que hacen para ganarse casa, lo mismo, seguir adelante y 1067 00:47:10,530 --> 00:47:13,230 lo puso en. casa. 1068 00:47:13,230 --> 00:47:15,955 >> Así que lo que hace este programa en última instancia, hacer? 1069 00:47:15,955 --> 00:47:17,220 Se puede ver un poco bromista allí. 1070 00:47:17,220 --> 00:47:24,780 Déjame ir por delante y no hago estructuras 0 dot slash struct 0, ID del estudiante 1, 1071 00:47:24,780 --> 00:47:28,250 decir David Mather, identificación del estudiante 2. 1072 00:47:28,250 --> 00:47:32,070 Rob Kirkland, carnet de estudiante 3. 1073 00:47:32,070 --> 00:47:35,010 Lauren Leverit - 1074 00:47:35,010 --> 00:47:38,380 y lo único que hizo este programa, que es algo completamente arbitrario, es 1075 00:47:38,380 --> 00:47:40,980 Yo quería hacer algo con estos datos, ahora que nos he enseñado cómo 1076 00:47:40,980 --> 00:47:43,450 utilizar estructuras, es que me acabo de tener este bucle adicional aquí. 1077 00:47:43,450 --> 00:47:45,260 Iterar sobre el conjunto de los estudiantes. 1078 00:47:45,260 --> 00:47:49,170 He utilizado nuestro, amigo quizás ahora familiar, string comparar stircomp a 1079 00:47:49,170 --> 00:47:53,780 cheque es la casa octava del estudiante igual a Mather? 1080 00:47:53,780 --> 00:47:56,760 Y si es así, simplemente imprimir algo arbitrariamente como, sí, lo es. 1081 00:47:56,760 --> 00:47:59,430 Pero, de nuevo, me acaba de dar oportunidades de usar y reutilizar y 1082 00:47:59,430 --> 00:48:02,270 reutilizar esta nueva notación de puntos. 1083 00:48:02,270 --> 00:48:03,250 >> Así que a quién le importa, ¿verdad? 1084 00:48:03,250 --> 00:48:06,270 El subir con un programa de estudiantes es algo arbitrario, pero resulta 1085 00:48:06,270 --> 00:48:09,800 que podemos hacer cosas útiles con esta, por ejemplo, como sigue. 1086 00:48:09,800 --> 00:48:14,600 Esta es una estructura mucho más complicado en C. Tiene una docena o más campos, 1087 00:48:14,600 --> 00:48:15,880 de manera algo críptica llamada. 1088 00:48:15,880 --> 00:48:20,110 Pero si alguna vez has oído hablar de una gráfica formato de archivo llamado mapa de bits, BMP, que 1089 00:48:20,110 --> 00:48:22,830 Resulta que el formato de archivo de mapa de bits casi parece como que este. 1090 00:48:22,830 --> 00:48:24,200 Es un poco estúpido rostro sonriente. 1091 00:48:24,200 --> 00:48:27,840 Es una pequeña imagen que he acercaste en bastante grande para que yo pudiera ver cada 1092 00:48:27,840 --> 00:48:30,410 de los puntos o píxeles individuales. 1093 00:48:30,410 --> 00:48:33,800 Ahora, resulta que podemos representar un punto negro con, por ejemplo, el número 0. 1094 00:48:33,800 --> 00:48:35,520 Y un punto blanco con el número 1. 1095 00:48:35,520 --> 00:48:39,140 >> Así que en otras palabras, si desea dibujar un Cara sonriente y guardar esa imagen en un 1096 00:48:39,140 --> 00:48:42,680 ordenador, basta con almacenar los ceros y los que se ven como este, donde, 1097 00:48:42,680 --> 00:48:45,250 de nuevo, los son de color blanco y ceros son de color negro. 1098 00:48:45,250 --> 00:48:48,290 Y juntos, si usted tiene efectivamente un ceñidor de unos y ceros, tiene una 1099 00:48:48,290 --> 00:48:51,030 rejilla de píxeles, y si usted pone a cabo, que tienen una linda 1100 00:48:51,030 --> 00:48:52,560 carita sonriente. 1101 00:48:52,560 --> 00:48:58,150 Ahora, el formato de archivo de mapa de bits, BMP, es efectivamente que debajo del capó, 1102 00:48:58,150 --> 00:49:00,970 pero con más píxeles sot que en realidad puede representar los colores. 1103 00:49:00,970 --> 00:49:05,170 >> Pero cuando usted tiene más sofisticado formatos de archivo como BMP y JPEG y GIF 1104 00:49:05,170 --> 00:49:09,360 con el cual usted puede estar familiarizado, los archivos en el disco típicamente no sólo 1105 00:49:09,360 --> 00:49:13,760 tener ceros y unos de los píxeles, pero que tienen algunos metadatos, así - 1106 00:49:13,760 --> 00:49:16,960 meta en el sentido de que no es realmente datos, pero es útil tener. 1107 00:49:16,960 --> 00:49:21,370 Así que estos campos aquí están implicando y vamos a ver esto con más detalle en el P-set 1108 00:49:21,370 --> 00:49:25,810 5, que antes de los ceros y unos que representar los píxeles de una imagen, 1109 00:49:25,810 --> 00:49:29,110 hay un montón de metadatos como el tamaño de la imagen y el 1110 00:49:29,110 --> 00:49:30,250 ancho de la imagen. 1111 00:49:30,250 --> 00:49:32,910 Y noto que estoy arrancando algunos cosas arbitrarias aquí - 1112 00:49:32,910 --> 00:49:34,260 anchura y altura. 1113 00:49:34,260 --> 00:49:36,160 Conteo de bits y algunas otras cosas. 1114 00:49:36,160 --> 00:49:37,840 Así que hay algunos metadatos en un archivo. 1115 00:49:37,840 --> 00:49:41,470 >> Pero para entender cómo se ponen los archivos de esta manera, en realidad se puede 1116 00:49:41,470 --> 00:49:45,890 a continuación, manipular imágenes, recuperar imágenes desde el disco, cambiar el tamaño de imágenes. 1117 00:49:45,890 --> 00:49:47,560 Pero no se puede necesariamente mejorarlos. 1118 00:49:47,560 --> 00:49:48,480 Necesitaba una fotografía. 1119 00:49:48,480 --> 00:49:52,840 Así que volví a RJ aquí, que te vio en la pantalla hace bastante tiempo. 1120 00:49:52,840 --> 00:49:57,160 Y si abro Keynote aquí, esto es lo que sucede si se intenta acercar y 1121 00:49:57,160 --> 00:49:59,380 mejorar RJ. 1122 00:49:59,380 --> 00:50:01,480 Él no está mejorando realmente. 1123 00:50:01,480 --> 00:50:06,240 Ahora Keynote es una especie de desdibujando un poco, sólo para pasar por alto el 1124 00:50:06,240 --> 00:50:11,040 hecho de que RJ no consigue especialmente mejorado al hacer zoom in 1125 00:50:11,040 --> 00:50:13,310 Y si hacerlo de esta manera, ver las plazas? 1126 00:50:13,310 --> 00:50:15,490 Sí, definitivamente se puede ver los cuadrados de un proyector. 1127 00:50:15,490 --> 00:50:17,690 >> Eso es lo que pasa cuando a mejorar. 1128 00:50:17,690 --> 00:50:22,570 Pero en la comprensión de cómo nuestro RJ o el La cara sonriente es implementado nos permitirá 1129 00:50:22,570 --> 00:50:24,950 realmente escribir código que manipula estas cosas. 1130 00:50:24,950 --> 00:50:29,970 Y yo que pensaba que iba a terminar con esta nota, con 55 segundos de una realzan eso es, 1131 00:50:29,970 --> 00:50:31,230 Me atrevo, digo algo engañoso. 1132 00:50:31,230 --> 00:50:32,990 >> [REPRODUCCIÓN DE VÍDEO] 1133 00:50:32,990 --> 00:50:34,790 >> -Está mintiendo. 1134 00:50:34,790 --> 00:50:38,310 Acerca de qué, no lo sé. 1135 00:50:38,310 --> 00:50:41,200 >> -Entonces, ¿qué sabemos? 1136 00:50:41,200 --> 00:50:45,280 >> -Que a las 9:15 Ray Santoya estaba en el cajero automático. 1137 00:50:45,280 --> 00:50:47,830 >> -Así que la pregunta es ¿qué estaba haciendo a las 9:16? 1138 00:50:47,830 --> 00:50:50,750 >> -El rodaje de la nueve milímetros en algo. 1139 00:50:50,750 --> 00:50:52,615 Tal vez vio al francotirador. 1140 00:50:52,615 --> 00:50:54,760 >> -O estaba trabajando con él. 1141 00:50:54,760 --> 00:50:56,120 >> -Espera. 1142 00:50:56,120 --> 00:50:57,450 Retroceder un. 1143 00:50:57,450 --> 00:50:58,700 >> -Qué es lo que ves? 1144 00:50:58,700 --> 00:51:05,530 1145 00:51:05,530 --> 00:51:09,490 >> -Traiga su rostro hacia arriba, pantalla completa. 1146 00:51:09,490 --> 00:51:09,790 >> -Sus gafas. 1147 00:51:09,790 --> 00:51:11,040 >> -Hay una reflexión. 1148 00:51:11,040 --> 00:51:21,790 1149 00:51:21,790 --> 00:51:23,520 >> -Ese es el equipo de béisbol Neuvitas. 1150 00:51:23,520 --> 00:51:24,530 Esa es su logotipo. 1151 00:51:24,530 --> 00:51:27,040 >> -Y él está hablando con quien sea que esté llevando esa chaqueta. 1152 00:51:27,040 --> 00:51:27,530 >> [VIDEO PLAYBACK FIN] 1153 00:51:27,530 --> 00:51:29,180 >> DAVID J. MALAN: Esta voluntad ser problemas 5. 1154 00:51:29,180 --> 00:51:30,720 Nos vemos la semana que viene. 1155 00:51:30,720 --> 00:51:32,330 >> Hombre: En la próxima CS50. 1156 00:51:32,330 --> 00:51:39,240 >> [Grillos] 1157 00:51:39,240 --> 00:51:41,270 >> [REPRODUCCIÓN DE MÚSICA]