1 00:00:00,000 --> 00:00:02,860 [Powered by Google Translate] [Semana 5] 2 00:00:02,860 --> 00:00:04,860 [David J. Malan - Harvard University] 3 00:00:04,860 --> 00:00:07,260 [Esta es CS50. - CS50.TV] 4 00:00:07,260 --> 00:00:09,740 >> Esto es CS50, la Semana 5. 5 00:00:09,740 --> 00:00:12,900 Hoy en día, y esta semana, presentamos un poco del mundo de la ciencia forense 6 00:00:12,900 --> 00:00:14,850 en el contexto del boletín de problemas 4. 7 00:00:14,850 --> 00:00:18,480 Hoy será una lección abreviada porque hay un evento especial en aquí después. 8 00:00:18,480 --> 00:00:21,940 Así que vamos a echar un vistazo y se burlan tanto de los estudiantes como para los padres de hoy en día 9 00:00:21,940 --> 00:00:24,600 con algunas de las cosas que están en el horizonte. 10 00:00:24,600 --> 00:00:29,050 >> Entre ellos, a partir del lunes, tendrá un poco más de sus compañeros de clase. 11 00:00:29,050 --> 00:00:32,980 EDX, Harvard y la nueva iniciativa en línea del MIT OpenCourseWare y para más, 12 00:00:32,980 --> 00:00:36,730 está poniendo en marcha en el campus de Harvard, el lunes, lo que significa venir Lunes 13 00:00:36,730 --> 00:00:40,930 tendrá, a partir del último recuento, 86.000 compañeros de clase adicionales 14 00:00:40,930 --> 00:00:43,680 que estará siguiendo a lo largo de con charlas CS50 y las secciones 15 00:00:43,680 --> 00:00:45,890 y los tutoriales y los conjuntos de problemas. 16 00:00:45,890 --> 00:00:51,870 Y como parte de esto, se convertirán en miembros de la clase inaugural del CS50 y CS50x ahora. 17 00:00:51,870 --> 00:00:56,150 Como parte de esto ahora, se dan cuenta que habrá algunos Upsides también. 18 00:00:56,150 --> 00:01:00,620 Para prepararse para esto, por la enorme cantidad de estudiantes, 19 00:01:00,620 --> 00:01:03,820 baste decir que a pesar de que contamos con 108 TFS y CAS, 20 00:01:03,820 --> 00:01:07,560 no es exactamente el mejor estudiante-maestro una vez que llegamos a 80.000 de los estudiantes. 21 00:01:07,560 --> 00:01:09,830 No vamos a calificar problema para muchos juegos de forma manual, 22 00:01:09,830 --> 00:01:13,050 que hubieran introducido esta semana en el conjunto de problemas será CS50 Check, 23 00:01:13,050 --> 00:01:15,410 que va a ser una utilidad de línea de comandos en el aparato 24 00:01:15,410 --> 00:01:17,880 que obtendrá una vez que lo actualice a finales de este fin de semana. 25 00:01:17,880 --> 00:01:21,030 Usted será capaz de ejecutar un comando, check50, en su propio conjunto de procesadores, 26 00:01:21,030 --> 00:01:24,770 y obtendrá información instantánea sobre si su programa es correcto o incorrecto 27 00:01:24,770 --> 00:01:27,980 de acuerdo con las especificaciones de diseño diferentes que nos han brindado. 28 00:01:27,980 --> 00:01:30,310 Más sobre esto en la especificación de problemas. 29 00:01:30,310 --> 00:01:34,220 Los compañeros de clase CS50x va a utilizar esto también. 30 00:01:34,220 --> 00:01:36,170 >> Boletín de problemas 4 tiene que ver con la medicina forense, 31 00:01:36,170 --> 00:01:38,630 y este conjunto de procesadores fue inspirado realmente por algunas cosas de la vida real 32 00:01:38,630 --> 00:01:41,210 por lo que cuando yo estaba en la universidad me internaron por un tiempo 33 00:01:41,210 --> 00:01:45,270 con la oficina del Fiscal del Condado de Middlesex el distrito está haciendo el trabajo forense 34 00:01:45,270 --> 00:01:47,660 con su investigador forense plomo. 35 00:01:47,660 --> 00:01:50,280 Lo que esto equivale a, como creo que he mencionado un par de semanas pasado, 36 00:01:50,280 --> 00:01:52,720 es la policía estatal de comunicación u otras personas pudieran entrar, 37 00:01:52,720 --> 00:01:56,150 ellos dejan las cosas como discos duros y CD y los disquetes y similares, 38 00:01:56,150 --> 00:01:58,770 y entonces el objetivo de la oficina forense era determinar 39 00:01:58,770 --> 00:02:01,470 si hubo o no evidencia de algún tipo. 40 00:02:01,470 --> 00:02:04,730 Esta fue la Unidad de Investigaciones Especiales, así que era delitos de cuello blanco. 41 00:02:04,730 --> 00:02:10,949 Era algo más preocupante de los delitos, cualquier cosa que implica algún tipo de medios de comunicación digitales. 42 00:02:10,949 --> 00:02:16,450 Resulta que no es que mucha gente escribe un e-mail diciendo: "Yo lo hice". 43 00:02:16,450 --> 00:02:20,490 Así que muy a menudo, estas búsquedas forenses no se presentó todo lo que mucho fruto; 44 00:02:20,490 --> 00:02:22,820 pero a veces la gente iba a escribir dichos correos electrónicos. 45 00:02:22,820 --> 00:02:25,240 Así que a veces, los esfuerzos fueron recompensados. 46 00:02:25,240 --> 00:02:31,210 >> Pero para llevar a este conjunto de procesadores forense, vamos a introducir en pset4 un poco de gráficos. 47 00:02:31,210 --> 00:02:35,410 Es probable que tomar estas cosas por sentado - JPEG, GIF y similares - en estos días. 48 00:02:35,410 --> 00:02:38,320 Pero si usted realmente piensa de él, una imagen, al igual que la cara de Rob, 49 00:02:38,320 --> 00:02:41,270 puede modelarse como una secuencia de puntos o píxeles. 50 00:02:41,270 --> 00:02:43,380 En el caso de la cara de Rob, hay todo tipo de colores, 51 00:02:43,380 --> 00:02:46,760 y empezamos a ver los puntos individuales, conocidos como píxeles, 52 00:02:46,760 --> 00:02:48,610 una vez que empezamos para acercar la imagen 53 00:02:48,610 --> 00:02:54,660 Pero si simplificamos el mundo un poco y decir que esto aquí es Rob en blanco y negro, 54 00:02:54,660 --> 00:02:57,490 para representar en blanco y negro, sólo puede utilizar binario. 55 00:02:57,490 --> 00:03:01,660 Y si vamos a utilizar binario, 1 ó 0, podemos expresar esta misma imagen 56 00:03:01,660 --> 00:03:06,140 de cara sonriente de Rob con este patrón de bits. 57 00:03:06,140 --> 00:03:12,100 11000011 representa el blanco, blanco, negro, negro, negro, negro, blanco, blanco. 58 00:03:12,100 --> 00:03:16,150 Y lo que no es un gran salto después de comenzar a hablar acerca de fotografías a todo color, 59 00:03:16,150 --> 00:03:18,600 cosas que te gustaría ver en Facebook o tomar con una cámara digital. 60 00:03:18,600 --> 00:03:21,410 Pero, ciertamente, cuando se trata de colores, necesita más bits. 61 00:03:21,410 --> 00:03:25,690 Y muy común en el mundo de las fotografías es utilizar no 1-bit color, 62 00:03:25,690 --> 00:03:29,560 ya que esto sugiere, pero de 24-bit color, en el que realmente obtener millones de colores. 63 00:03:29,560 --> 00:03:32,250 Así como en el caso cuando el zoom en el ojo de Rob, 64 00:03:32,250 --> 00:03:36,370 que era cualquier número de millones de posibilidades diferentes colores. 65 00:03:36,370 --> 00:03:39,040 Así que vamos a introducir en este Boletín de problemas 4, así como en el tutorial, 66 00:03:39,040 --> 00:03:43,370 que será hoy a las 3:30 en lugar de las habituales a causa de 2:30 conferencia del viernes aquí. 67 00:03:43,370 --> 00:03:46,620 Pero el video estará en línea como de costumbre mañana. 68 00:03:46,620 --> 00:03:48,820 >> También voy a presentar a otro formato de archivo. 69 00:03:48,820 --> 00:03:51,270 Esto está deliberadamente destinada a parecer intimidante al principio, 70 00:03:51,270 --> 00:03:55,670 pero esto es sólo parte de la documentación para una estructura C. 71 00:03:55,670 --> 00:03:58,940 Resulta que Microsoft hace años ayudó a popularizar este formato 72 00:03:58,940 --> 00:04:05,150 llamado el formato de archivo de mapa de bits, bmp, y esto fue un super formato simple, colorido gráfico de archivos 73 00:04:05,150 --> 00:04:10,150 que se ha utilizado desde hace bastante tiempo ya veces aún para los papeles pintados de escritorio. 74 00:04:10,150 --> 00:04:14,760 Si usted piensa de nuevo a Windows XP y las colinas y el cielo azul, 75 00:04:14,760 --> 00:04:17,170 que era por lo general una imagen de mapa de bits bmp o. 76 00:04:17,170 --> 00:04:19,959 Los mapas de bits son divertidos para nosotros porque tienen un poco más de complejidad. 77 00:04:19,959 --> 00:04:22,610 No es tan simple como esta red de 0s y 1s. 78 00:04:22,610 --> 00:04:27,510 En su lugar, tienen cosas como un encabezado al comienzo de un archivo. 79 00:04:27,510 --> 00:04:31,990 En otras palabras, dentro de un archivo. Bmp es un montón de 0s y 1s, 80 00:04:31,990 --> 00:04:34,910 pero hay algo adicional 0s y 1s en ese país. 81 00:04:34,910 --> 00:04:38,220 Y resulta que lo que probablemente ha dado por sentado durante años - 82 00:04:38,220 --> 00:04:45,170 formatos de archivo como. doc o. xls o. mp3, mp4,. cualesquiera que sean los formatos de archivo 83 00:04:45,170 --> 00:04:48,480 que usted está familiarizado con - ¿qué significa ser incluso un formato de archivo, 84 00:04:48,480 --> 00:04:52,480 porque al fin y al cabo todos estos archivos que utilizamos tiene sólo 0s y 1s. 85 00:04:52,480 --> 00:04:56,810 Y tal vez los 0s y 1s representan ABC a través de ASCII o similares, 86 00:04:56,810 --> 00:04:58,820 pero al final del día, todavía es sólo 0s y 1s. 87 00:04:58,820 --> 00:05:02,100 Así que los humanos sólo de vez en cuando deciden inventar un nuevo formato de archivo 88 00:05:02,100 --> 00:05:06,420 donde estandarizar lo que los patrones de bits realmente significan. 89 00:05:06,420 --> 00:05:09,220 Y en este caso aquí, amigos los que diseñó el formato de archivo de mapa de bits 90 00:05:09,220 --> 00:05:15,620 dijo que en el primer byte en un archivo de mapa de bits, como se denota por 0 Offset allí, 91 00:05:15,620 --> 00:05:18,940 que va a ser un poco crípticamente llamado bfType variable llamada, 92 00:05:18,940 --> 00:05:23,080 que sólo representa el tipo de archivo de mapa de bits, el tipo de archivo de mapa de bits es la siguiente. 93 00:05:23,080 --> 00:05:27,700 Se puede inferir tal vez desde la segunda fila que compensado 2, número 2 byte, 94 00:05:27,700 --> 00:05:33,740 tiene un patrón de 0 y 1 que representa qué? El tamaño de algo. 95 00:05:33,740 --> 00:05:35,310 Y continúa desde allí. 96 00:05:35,310 --> 00:05:37,410 Así que, en conjunto Problema 4, se le atravesó algunas de estas cosas. 97 00:05:37,410 --> 00:05:39,520 No vamos a llegar a preocuparse por todos ellos. 98 00:05:39,520 --> 00:05:47,510 Pero note que empieza a ponerse interesante alrededor byte 54: rgbtBlue, Verde y Rojo. 99 00:05:47,510 --> 00:05:52,110 Si alguna vez has escuchado la sigla RGB - rojo, verde, azul - se trata de una referencia a esa 100 00:05:52,110 --> 00:05:54,610 porque resulta que se puede pintar todos los colores del arco iris 101 00:05:54,610 --> 00:05:58,180 con una combinación de rojo, azul y verde. 102 00:05:58,180 --> 00:06:03,320 Y de hecho, los padres en la habitación puede recordar algunos de los primeros proyectores. 103 00:06:03,320 --> 00:06:05,890 En estos días, usted acaba de ver una luz brillante que sale de una lente, 104 00:06:05,890 --> 00:06:09,800 pero de vuelta en el día en que tuvo la lente de color rojo, la lente azul y verde de la lente, 105 00:06:09,800 --> 00:06:13,380 y juntos dirigida a una pantalla y forman un cuadro de colores. 106 00:06:13,380 --> 00:06:16,270 Y muy a menudo, las escuelas intermedias y secundarias que tienen esos lentes 107 00:06:16,270 --> 00:06:19,720 muy ligeramente ladeado, por lo que eran una especie de ver imágenes dobles o triples. 108 00:06:19,720 --> 00:06:24,100 Pero esa era la idea. Tenías luz roja, verde y azul que pinta un cuadro. 109 00:06:24,100 --> 00:06:26,590 Y ese mismo principio se utiliza en las computadoras. 110 00:06:26,590 --> 00:06:30,230 >> Así que uno de los desafíos a continuación, para que en el Problema 4 van a ser unas cuantas cosas. 111 00:06:30,230 --> 00:06:34,800 Uno de ellos es para redimensionar una imagen, para tomar en un patrón de 0s y 1s, 112 00:06:34,800 --> 00:06:40,200 averiguar qué trozos de 0s y 1s representan lo que en una estructura de este tipo, 113 00:06:40,200 --> 00:06:43,630 y luego encontrar la manera de reproducir los píxeles - los rojos, los azules, los verdes - 114 00:06:43,630 --> 00:06:46,660 dentro, así que cuando una imagen se ve como este principio, 115 00:06:46,660 --> 00:06:49,210 puede parecer que esta vez después de eso. 116 00:06:49,210 --> 00:06:53,640 Entre los otros retos que también va a ser que se le entregó una imagen forense 117 00:06:53,640 --> 00:06:56,030 de un archivo real de una cámara digital. 118 00:06:56,030 --> 00:06:58,960 Y en esa cámara, hace mucho tiempo, eran un montón de fotos. 119 00:06:58,960 --> 00:07:03,760 El problema es que accidentalmente borrados o tenía la imagen dañada de alguna manera. 120 00:07:03,760 --> 00:07:05,750 Las cosas malas suceden con cámaras digitales. 121 00:07:05,750 --> 00:07:09,150 Y por lo que rápidamente copiado todos los de 0s y 1s de esa carta para ti, 122 00:07:09,150 --> 00:07:13,610 salvado a todos en un solo archivo grande, y luego los vamos a entregar a usted en problemas n º 4 123 00:07:13,610 --> 00:07:19,320 de modo que usted puede escribir un programa en C con el que recuperar todos esos archivos JPEG, idealmente. 124 00:07:19,320 --> 00:07:23,330 Y resulta que los archivos JPEG, aunque son algo así como un formato de archivo complejo - 125 00:07:23,330 --> 00:07:26,360 son mucho más complejas que esta cara sonriente aquí - 126 00:07:26,360 --> 00:07:31,160 resulta que cada JPEG comienza con los mismos patrones de 0s y 1s. 127 00:07:31,160 --> 00:07:35,630 Así, utilizando, en definitiva, un bucle while o un ciclo for o similar, 128 00:07:35,630 --> 00:07:38,880 puede iterar sobre todos los 0s y 1s en esta imagen forense, 129 00:07:38,880 --> 00:07:43,150 y cada vez que ves el patrón especial que está definido en la especificación del conjunto de problemas, 130 00:07:43,150 --> 00:07:47,880 se puede asumir aquí es, con una probabilidad muy alta, el inicio de un JPEG. 131 00:07:47,880 --> 00:07:51,230 Y tan pronto como usted encuentra el mismo patrón determinado número de bytes 132 00:07:51,230 --> 00:07:55,430 o kilobytes o megabytes más tarde, se puede asumir que aquí hay una segunda JPEG, 133 00:07:55,430 --> 00:07:57,380 la foto que tomé después de la primera. 134 00:07:57,380 --> 00:08:01,370 Permítanme dejar de leer ese archivo en primer lugar, empezar a escribir este nuevo, 135 00:08:01,370 --> 00:08:06,310 y la salida de su programa para pset4 va a haber hasta 50 imágenes JPEG. 136 00:08:06,310 --> 00:08:09,270 Y si no son 50 imágenes JPEG, tiene un poco de un bucle. 137 00:08:09,270 --> 00:08:12,490 Si usted tiene un número infinito de imágenes JPEG, tiene un bucle infinito. 138 00:08:12,490 --> 00:08:14,910 Así que eso también será un caso bastante común. 139 00:08:14,910 --> 00:08:16,600 Así que eso es lo que está en el horizonte. 140 00:08:16,600 --> 00:08:21,310 >> Concurso 0 a nuestras espaldas, por cuenta de mi correo electrónico que siempre hay personas que son a la vez feliz, 141 00:08:21,310 --> 00:08:23,640 especie de punto muerto, triste y alrededor cuestionario tiempo 0. 142 00:08:23,640 --> 00:08:26,800 Y por favor acercarse a mí, la cabeza TF Zamyla, su propio TF, 143 00:08:26,800 --> 00:08:31,180 o una de las entidades emisoras de certificados que usted sepa si usted quisiera discutir cómo iban las cosas. 144 00:08:31,180 --> 00:08:35,539 >> Así que para impresionar a los padres aquí en la habitación, lo que es la biblioteca CS50? 145 00:08:36,429 --> 00:08:40,390 [Risas] Buen trabajo. 146 00:08:40,390 --> 00:08:48,340 ¿Cuál es la biblioteca CS50? Si. >> [Estudiante] Es un conjunto preescrito de código [inaudible] 147 00:08:48,340 --> 00:08:49,750 Bien, bien. 148 00:08:49,750 --> 00:08:53,240 Es un conjunto preescrito de código que escribió el personal, proporcionamos a usted, 149 00:08:53,240 --> 00:08:55,030 que proporciona parte de la funcionalidad común, 150 00:08:55,030 --> 00:08:59,020 cosas como hacerme una cadena, tráeme un int - todas las funciones que se enumeran aquí. 151 00:08:59,020 --> 00:09:02,260 >> A partir de ahora, empezamos a tomar realmente estas ruedas de entrenamiento apagado. 152 00:09:02,260 --> 00:09:05,050 Vamos a comenzar a llevar una cadena de usted, 153 00:09:05,050 --> 00:09:08,870 recuerdo que era un sinónimo para el tipo de datos real? >> [Varios estudiantes] Char *. 154 00:09:08,870 --> 00:09:12,730 * Char. Para los padres, que probablemente fue [hace sonido de soplido]. Eso es bueno. 155 00:09:12,730 --> 00:09:17,550 * Char vamos a empezar a ver en la pantalla con mayor razón ahora quitamos cadena de nuestro vocabulario, 156 00:09:17,550 --> 00:09:19,730 al menos cuando se trata de realmente escribir código. 157 00:09:19,730 --> 00:09:22,840 Del mismo modo, vamos a dejar de utilizar algunas de estas funciones tanto 158 00:09:22,840 --> 00:09:25,280 ya que nuestros programas se van a poner más sofisticado. 159 00:09:25,280 --> 00:09:28,480 En lugar de escribir programas que sentarse allí con un mensaje parpadeando, 160 00:09:28,480 --> 00:09:31,870 esperando a que el usuario escriba algo adentro, usted recibirá los aportes de otros lugares. 161 00:09:31,870 --> 00:09:35,490 Por ejemplo, usted los reciba de una serie de bits en el disco duro local. 162 00:09:35,490 --> 00:09:38,580 En su lugar, voy a conseguir en el futuro de una conexión de red, 163 00:09:38,580 --> 00:09:40,230 un sitio web en alguna parte. 164 00:09:40,230 --> 00:09:44,110 >> Así que vamos a pelar esta capa, por primera vez y tire hacia arriba del Dispositivo CS50 165 00:09:44,110 --> 00:09:49,010 y el archivo llamado cs50.h, que ha sido incluido # durante semanas, 166 00:09:49,010 --> 00:09:51,140 pero vamos a ver realmente lo que hay dentro de esto. 167 00:09:51,140 --> 00:09:54,430 La parte superior del archivo en azul es sólo un montón de comentarios: 168 00:09:54,430 --> 00:09:57,050 información sobre la garantía y licencia. 169 00:09:57,050 --> 00:09:59,050 Esta es una especie de paradigma común en el software 170 00:09:59,050 --> 00:10:01,580 porque una gran cantidad de software en estos días es lo que se llama código abierto, 171 00:10:01,580 --> 00:10:05,220 lo que significa que alguien ha escrito el código y lo hizo libremente disponible 172 00:10:05,220 --> 00:10:10,470 no sólo para ejecutar y utilizar, sino para realmente leer y modificar e integrar en su propio trabajo. 173 00:10:10,470 --> 00:10:14,660 Así que eso es lo que usted ha estado utilizando software de código abierto, aunque de una forma muy pequeña. 174 00:10:14,660 --> 00:10:18,560 Si me desplazo hacia abajo más allá de los comentarios, sin embargo, vamos a empezar a ver algunas cosas más familiares. 175 00:10:18,560 --> 00:10:25,010 Aviso en la parte superior aquí que el archivo cs50.h incluye una gran cantidad de archivos de cabecera. 176 00:10:25,010 --> 00:10:28,560 La mayoría de ellos, no hemos visto antes, pero uno es familiar. 177 00:10:28,560 --> 00:10:32,270 Cuál de estos hemos visto, aunque brevemente, hasta el momento? >> [Estudiante] Biblioteca estándar. 178 00:10:32,270 --> 00:10:35,810 Sí, la biblioteca estándar. stdlib.h tiene malloc. 179 00:10:35,810 --> 00:10:38,320 Una vez que empezamos a hablar acerca de la asignación de memoria dinámica, 180 00:10:38,320 --> 00:10:41,650 que vamos a volver a la semana siguiente, así, que comenzó a incluir ese archivo. 181 00:10:41,650 --> 00:10:46,640 Resulta que bool y verdadero y lo falso en realidad no existe en C per se 182 00:10:46,640 --> 00:10:49,440 a menos que incluya el archivo aquí. 183 00:10:49,440 --> 00:10:52,710 Hemos estado durante semanas incluso stdbool.h 184 00:10:52,710 --> 00:10:55,620 de modo que usted puede utilizar la noción de una. bool, verdadero o falso 185 00:10:55,620 --> 00:10:58,620 Sin esto, usted tendría que ordenar de fingir y utilizar un int 186 00:10:58,620 --> 00:11:02,610 y sólo arbitrariamente asumir que 0 es falso y 1 es verdadera. 187 00:11:02,610 --> 00:11:07,150 Si nos desplazamos hacia abajo aún más, aquí es nuestra definición de una cadena. 188 00:11:07,150 --> 00:11:11,390 Resulta que, como hemos dicho antes, que esta estrella es donde en realidad no importa. 189 00:11:11,390 --> 00:11:13,720 Usted puede incluso tener espacio a su alrededor. 190 00:11:13,720 --> 00:11:16,740 Tenemos este semestre ha estado promoviendo como esto para dejar claro 191 00:11:16,740 --> 00:11:18,620 que la estrella tiene que ver con el tipo, 192 00:11:18,620 --> 00:11:21,700 pero se dan cuenta tan común, si no un poco más común, 193 00:11:21,700 --> 00:11:24,430 es ponerlo allí, pero funcionalmente es lo mismo. 194 00:11:24,430 --> 00:11:27,720 Pero ahora, si leemos más abajo, vamos a echar un vistazo a getInt 195 00:11:27,720 --> 00:11:32,190 porque hemos utilizado que quizás primero antes que nada este semestre. 196 00:11:32,190 --> 00:11:37,440 Aquí está getInt. Esto es lo que? >> [Estudiante] Un prototipo. >> Esto es sólo un prototipo. 197 00:11:37,440 --> 00:11:41,410 A menudo, hemos puesto prototipos en la parte superior de nuestro. Archivos c, 198 00:11:41,410 --> 00:11:46,690 pero también se puede poner en prototipos archivos de cabecera, archivos. h, como este de aquí 199 00:11:46,690 --> 00:11:50,840 de modo que al escribir algunas de las funciones que desea que otras personas puedan utilizar, 200 00:11:50,840 --> 00:11:53,550 que es exactamente el caso de la biblioteca CS50, 201 00:11:53,550 --> 00:11:57,040 no sólo poner en práctica sus funciones en algo así como cs50.c, 202 00:11:57,040 --> 00:12:02,790 también poner los prototipos no en la parte superior de dicho archivo, pero en la parte superior de un archivo de cabecera. 203 00:12:02,790 --> 00:12:07,170 Luego de que el archivo de cabecera es lo que los amigos y colegas incluir 204 00:12:07,170 --> 00:12:09,760 con # include en su propio código. 205 00:12:09,760 --> 00:12:12,210 Así que todo este tiempo que has estado incluyendo todos estos prototipos, 206 00:12:12,210 --> 00:12:16,580 eficazmente en la parte superior de su archivo, pero a través de este mecanismo # include, 207 00:12:16,580 --> 00:12:20,070 que esencialmente copia y pega este archivo en su cuenta. 208 00:12:20,070 --> 00:12:23,070 Aquí hay alguna documentación muy detallada. 209 00:12:23,070 --> 00:12:25,640 Hemos prácticamente por sentado que getInt recibe un int, 210 00:12:25,640 --> 00:12:27,640 pero resulta que hay algunos casos de esquina. 211 00:12:27,640 --> 00:12:31,810 ¿Qué pasa si el usuario escribe un número que es demasiado grande, un trillón, 212 00:12:31,810 --> 00:12:35,490 que no puede caber dentro de un int? ¿Cuál es el comportamiento esperado? 213 00:12:35,490 --> 00:12:38,020 Lo ideal es predecible. 214 00:12:38,020 --> 00:12:40,280 Así que en este caso, si uno lee la letra pequeña, 215 00:12:40,280 --> 00:12:44,500 que realmente va a ver que si la línea no puede ser leído, este INT_MAX devoluciones. 216 00:12:44,500 --> 00:12:48,320 Nunca hemos hablado de esto, pero en base a su capitalización, lo que es probable que sea? 217 00:12:48,320 --> 00:12:50,640 [Estudiante] Constante. >> Es una constante. 218 00:12:50,640 --> 00:12:54,770 Es una constante especial que probablemente está declarado en uno de los archivos de cabecera 219 00:12:54,770 --> 00:13:00,090 que es más alto en el archivo, y INT_MAX es probablemente algo así como unos 2 millones de dólares, 220 00:13:00,090 --> 00:13:04,990 La idea es que, porque tenemos que indicar de alguna manera que algo salió mal, 221 00:13:04,990 --> 00:13:10,700 nosotros, sí, tenemos 4 millones de números a nuestra disposición: -2 millones de dólares en hasta 2 millones de dólares, más o menos. 222 00:13:10,700 --> 00:13:14,710 Bueno, lo que es común en la programación es que robar uno de esos números, 223 00:13:14,710 --> 00:13:18,920 0 tal vez, tal vez 2 millones de dólares, tal vez -2 mil millones, 224 00:13:18,920 --> 00:13:23,280 para que pase una de sus posibles valores para que pueda comprometerse con el mundo 225 00:13:23,280 --> 00:13:26,820 que si algo sale mal, yo me volveré este valor grande super. 226 00:13:26,820 --> 00:13:31,030 Pero usted no desea que el usuario escriba algo críptico como 234 ..., un número muy grande. 227 00:13:31,030 --> 00:13:34,060 Lo generalizar en cambio, como una constante. 228 00:13:34,060 --> 00:13:38,060 Así que en realidad, si se estaban anal en las últimas semanas, cada vez que se llama getInt, 229 00:13:38,060 --> 00:13:42,900 usted debe haber estado revisando con una condición, si lo hizo el tipo de usuario en INT_MAX, 230 00:13:42,900 --> 00:13:46,590 o, más específicamente, hizo INT_MAX getint retorno, porque si lo hiciera, 231 00:13:46,590 --> 00:13:51,830 que en realidad quiere decir que no lo escriba. Algo salió mal en este caso. 232 00:13:51,830 --> 00:13:56,080 Así que esto es lo que se conoce generalmente como un valor centinela, que sólo significa especial. 233 00:13:56,080 --> 00:13:58,120 >> Pasemos ahora en el archivo. C. 234 00:13:58,120 --> 00:14:01,340 El archivo de C ha existido en el aparato durante algún tiempo. 235 00:14:01,340 --> 00:14:06,840 Y de hecho, el aparato tiene que pre-compilados para usted en esa cosa que se llama código objeto, 236 00:14:06,840 --> 00:14:09,540 pero eso no le importa a usted donde está porque el sistema sabe 237 00:14:09,540 --> 00:14:11,730 en este caso donde es: el aparato. 238 00:14:11,730 --> 00:14:17,400 Vamos ahora a desplazarse hacia abajo y ver cómo getInt getInt ha estado trabajando todo este tiempo. 239 00:14:17,400 --> 00:14:19,460 Aquí tenemos comentarios similares de antes. 240 00:14:19,460 --> 00:14:21,660 Permítanme hacer un zoom sobre sólo la parte del código. 241 00:14:21,660 --> 00:14:23,900 Y lo que tenemos para getInt es la siguiente. 242 00:14:23,900 --> 00:14:25,700 No se necesita entrada. 243 00:14:25,700 --> 00:14:29,510 Se devuelve un int, mientras que (verdad), así que tenemos un bucle infinito deliberada, 244 00:14:29,510 --> 00:14:33,180 pero se supone que vamos a salir de esto de alguna manera o volver desde este. 245 00:14:33,180 --> 00:14:34,870 >> Vamos a ver cómo funciona esto. 246 00:14:34,870 --> 00:14:39,240 Parece que estamos usando GetString en esta primera línea dentro del bucle, 166. 247 00:14:39,240 --> 00:14:43,780 Esto ahora es una buena práctica porque bajo qué circunstancias podría volver GetString 248 00:14:43,780 --> 00:14:47,660 la palabra clave NULL especial? >> [Estudiante] Si algo sale mal. 249 00:14:47,660 --> 00:14:51,630 Si algo sale mal. ¿Y qué podría salir mal cuando se llama algo así como GetString? 250 00:14:54,960 --> 00:14:57,640 Si. >> [Estudiante] Malloc no imponerle los ints. 251 00:14:57,640 --> 00:14:59,150 Si. Tal vez malloc falla. 252 00:14:59,150 --> 00:15:03,190 En algún lugar debajo de la capilla, está llamando a malloc GetString, que asigna la memoria, 253 00:15:03,190 --> 00:15:06,020 que permite a la tienda de informática a todos los personajes 254 00:15:06,020 --> 00:15:07,750 que el usuario escribe en el teclado. 255 00:15:07,750 --> 00:15:11,590 Y supongamos que el usuario tenía un montón de tiempo libre y escribió más, por ejemplo, 256 00:15:11,590 --> 00:15:16,160 de 2 millones de caracteres, más caracteres que el equipo aún tiene RAM. 257 00:15:16,160 --> 00:15:19,250 GetString tiene que ser capaz de indicar que en su caso. 258 00:15:19,250 --> 00:15:22,560 Incluso si se trata de un caso super, super esquina poco común, 259 00:15:22,560 --> 00:15:24,340 tiene que ser de alguna manera capaz de manejar esto, 260 00:15:24,340 --> 00:15:28,750 y así GetString, si nos volvimos y leer su documentación, lo hace en NULL hecho de retorno. 261 00:15:28,750 --> 00:15:34,460 Así que ahora si GetString falla al devolver NULL, getInt va a fallar al volver INT_MAX 262 00:15:34,460 --> 00:15:37,690 así como un centinela. Estos son sólo convenciones humanas. 263 00:15:37,690 --> 00:15:41,450 La única manera de saber que este es el caso es leer la documentación. 264 00:15:41,450 --> 00:15:45,040 >> Vamos a desplazarse hacia abajo para que el int es realmente conseguido. 265 00:15:45,040 --> 00:15:51,160 Si desplácese hacia abajo un poco más lejos, en la línea 170, que tiene un comentario sobre estas líneas. 266 00:15:51,160 --> 00:15:55,100 Declaramos en un int 172, n, y char a, c, y entonces esta nueva función, 267 00:15:55,100 --> 00:15:58,930 que algunos de ustedes han tropezado antes, sscanf. 268 00:15:58,930 --> 00:16:00,870 Esto significa scanf cadena. 269 00:16:00,870 --> 00:16:05,700 En otras palabras, dame una cadena y lo voy a buscar los fragmentos de información de interés. 270 00:16:05,700 --> 00:16:07,360 ¿Qué significa eso? 271 00:16:07,360 --> 00:16:11,800 Supongamos que yo escribir, literalmente, 123 en el teclado y luego pulsa Enter. 272 00:16:11,800 --> 00:16:16,470 ¿Cuál es el tipo de datos de 123 cuando son devueltos por GetString? >> [Estudiante] String. 273 00:16:16,470 --> 00:16:18,380 Obviamente es una cadena, ¿no? Tengo una cadena. 274 00:16:18,380 --> 00:16:23,220 Así que 123 es realmente, entre comillas, 123 con el 0 \ al final de la misma. 275 00:16:23,220 --> 00:16:27,110 Eso no es un int. Eso no es un número. Parece un número, pero no es en realidad. 276 00:16:27,110 --> 00:16:29,080 Entonces, ¿qué getInt tengo que hacer? 277 00:16:29,080 --> 00:16:35,750 Se tiene que explorar esa cadena de izquierda a derecha - 123 \ 0 - y de alguna manera convertir a un entero real. 278 00:16:35,750 --> 00:16:37,850 Usted podría encontrar la manera de hacer esto. 279 00:16:37,850 --> 00:16:41,450 Si piensas en pset2, usted probablemente tiene un poco cómodo con César 280 00:16:41,450 --> 00:16:44,820 o Vigenère, así que usted puede iterar sobre una secuencia, puede convertir caracteres a enteros. 281 00:16:44,820 --> 00:16:46,710 Pero diablos, es un montón de trabajo. 282 00:16:46,710 --> 00:16:49,860 ¿Por qué no llamar a una función como sscanf que hace eso para usted? 283 00:16:49,860 --> 00:16:54,230 Así sscanf espera un argumento - en este caso llamado línea, que es una cadena. 284 00:16:54,230 --> 00:17:01,840 A continuación, especifique entre comillas, muy similar a printf, lo que se espera ver en esta cadena. 285 00:17:01,840 --> 00:17:09,000 Y lo que estoy diciendo aquí es que espero ver un número decimal y tal vez un personaje. 286 00:17:09,000 --> 00:17:12,000 Y vamos a ver por qué este es el caso en un momento. 287 00:17:12,000 --> 00:17:15,869 Y resulta que esta notación es ahora una reminiscencia de cosas que empezamos a hablar de 288 00:17:15,869 --> 00:17:17,619 poco más de una semana. 289 00:17:17,619 --> 00:17:21,740 ¿Cuál es & N y & c haciendo por nosotros aquí? >> [Estudiante] Dirección de n y la dirección de c. 290 00:17:21,740 --> 00:17:25,400 Si. Me está dando la dirección de n y la dirección de c. ¿Por qué es tan importante? 291 00:17:25,400 --> 00:17:30,220 Ustedes saben que con funciones en C, siempre se puede devolver un valor o ningún valor en absoluto. 292 00:17:30,220 --> 00:17:34,530 Usted puede devolver un int, cadena, un flotador, char a, lo que sea, o puede regresar vacío, 293 00:17:34,530 --> 00:17:38,030 pero sólo se puede volver una cosa al máximo. 294 00:17:38,030 --> 00:17:42,760 Pero aquí queremos sscanf para mí volver tal vez un entero, un número decimal, 295 00:17:42,760 --> 00:17:46,220 y también a. char, y voy a explicar por qué el char en un momento 296 00:17:46,220 --> 00:17:51,460 Que efectivamente quiere volver a sscanf dos cosas, pero eso no es posible en C. 297 00:17:51,460 --> 00:17:55,200 Puede evitar que al aprobar en dos direcciones 298 00:17:55,200 --> 00:17:57,370 porque en cuanto te entregan una función de dos direcciones, 299 00:17:57,370 --> 00:18:00,470 lo que puede que la función de hacer con ellos? >> [Estudiante] Escribir a esas direcciones. 300 00:18:00,470 --> 00:18:02,010 Se puede escribir en esas direcciones. 301 00:18:02,010 --> 00:18:05,770 Usted puede utilizar la operación estrella y ir allí, a cada una de esas direcciones. 302 00:18:05,770 --> 00:18:11,260 Es una especie de este mecanismo de la puerta trasera pero muy común para cambiar los valores de las variables 303 00:18:11,260 --> 00:18:14,870 más de un solo lugar - en este caso, dos. 304 00:18:14,870 --> 00:18:21,340 Ahora note que estoy comprobando == 1 y luego regresar n si eso es así, de hecho, se evalúan como true. 305 00:18:21,340 --> 00:18:26,170 Entonces, ¿qué está pasando? Técnicamente, todo lo que realmente queremos que suceda en getInt es esto. 306 00:18:26,170 --> 00:18:30,740 Queremos analizar, por decirlo así, queremos leer la cadena - entre comillas 123 - 307 00:18:30,740 --> 00:18:34,560 y si parece que hay un número allí, lo que estamos diciendo sscanf hacer 308 00:18:34,560 --> 00:18:38,190 es poner ese número - 123 - en esta variable n para mí. 309 00:18:38,190 --> 00:18:42,090 Entonces, ¿por qué entonces tengo realmente esto así? 310 00:18:42,090 --> 00:18:48,220 ¿Cuál es el papel de sscanf diciendo que también puede ser que consiga un personaje aquí? 311 00:18:48,220 --> 00:18:53,470 [Respuesta de los estudiantes inaudible] >> Un punto decimal en realidad podría funcionar. 312 00:18:53,470 --> 00:18:56,330 Vamos a celebrar que pensó por un momento. ¿Qué más? 313 00:18:56,330 --> 00:18:59,270 [Estudiante] Puede ser NULL. >> Buena idea. Podría ser el carácter nulo. 314 00:18:59,270 --> 00:19:01,660 En realidad no es en este caso. Si. >> [Estudiante] ASCII. 315 00:19:01,660 --> 00:19:04,340 ASCII. O deja que me generalizar aún más. 316 00:19:04,340 --> 00:19:06,640 El% c no es sólo para la comprobación de errores. 317 00:19:06,640 --> 00:19:09,300 No queremos que haya un carácter después del número, 318 00:19:09,300 --> 00:19:11,870 pero lo que esto me permite hacer es lo siguiente. 319 00:19:11,870 --> 00:19:18,210 Resulta que sscanf, además de almacenar los valores de N y C en este ejemplo aquí, 320 00:19:18,210 --> 00:19:24,890 lo que también hace es que devuelve el número de variables que poner los valores cm 321 00:19:24,890 --> 00:19:30,260 Así que si sólo escribe en el año 123, sólo el% d va a coincidir, 322 00:19:30,260 --> 00:19:33,880 y sólo se almacena n con un valor como 123, 323 00:19:33,880 --> 00:19:35,640 y nada se pone en c. 324 00:19:35,640 --> 00:19:37,620 C sigue siendo un valor basura, por así decirlo - 325 00:19:37,620 --> 00:19:40,730 basura, ya que nunca se ha inicializado a un valor. 326 00:19:40,730 --> 00:19:45,520 Así que en ese caso, sscanf devuelve 1 porque poblada 1 de los punteros, 327 00:19:45,520 --> 00:19:50,190 en cuyo caso grande, tengo un int por lo que liberar la línea para liberar la memoria 328 00:19:50,190 --> 00:19:54,000 GetString que realmente asignado, y luego vuelvo n, 329 00:19:54,000 --> 00:19:58,500 else if Te has preguntado donde Reintentar declaración que viene, que viene de aquí. 330 00:19:58,500 --> 00:20:04,390 Así que si, por el contrario, de tipo I en 123foo - sólo algunos secuencia aleatoria de texto - 331 00:20:04,390 --> 00:20:08,490 sscanf va a ver el número, número, número, f, 332 00:20:08,490 --> 00:20:16,410 y que va a poner el 123 en n, sino que va a poner en la f c y luego volver 2. 333 00:20:16,410 --> 00:20:20,640 Así que tenemos, simplemente usando la definición básica de la conducta sscanf, una manera muy simple - 334 00:20:20,640 --> 00:20:23,900 así, complejo a primera vista, pero al final de la día mecanismo bastante simple - 335 00:20:23,900 --> 00:20:28,320 de decir que existe un entero y si lo es, que lo único que he encontrado? 336 00:20:28,320 --> 00:20:29,860 Y el espacio en blanco aquí es deliberada. 337 00:20:29,860 --> 00:20:34,000 Si usted lee la documentación de sscanf, le dice que si se incluye una pieza de espacios en blanco 338 00:20:34,000 --> 00:20:38,810 al principio o al final, sscanf también permitirá que el usuario, por cualquier razón, 339 00:20:38,810 --> 00:20:41,860 123 para golpear la barra espaciadora y que será legítimo. 340 00:20:41,860 --> 00:20:44,150 Usted no va a gritar que el usuario sólo porque pulsa la barra espaciadora 341 00:20:44,150 --> 00:20:48,640 al principio o al final, que es sólo un poco más fácil de usar. 342 00:20:48,640 --> 00:20:52,300 >> Cualquier pregunta entonces sobre getInt? Si. >> [Estudiante] ¿Qué pasa si usted acaba de poner en un char? 343 00:20:52,300 --> 00:20:54,030 Buena pregunta. 344 00:20:54,030 --> 00:20:59,890 ¿Qué pasa si usted acaba de escribir en un char como f y pulse Enter sin escribir 123? 345 00:20:59,890 --> 00:21:02,420 ¿Qué te parece el comportamiento de esta línea de código sería entonces? 346 00:21:02,420 --> 00:21:04,730 [Respuesta de los estudiantes inaudible] 347 00:21:04,730 --> 00:21:08,790 Sí, ¿y sscanf puede cubrir eso también, porque en ese caso, no va a llenar n o c. 348 00:21:08,790 --> 00:21:15,310 Va a volver en vez 0, en cuyo caso estoy también ponerse ese escenario 349 00:21:15,310 --> 00:21:18,750 debido a que el valor esperado que quiero es 1. 350 00:21:18,750 --> 00:21:22,000 Sólo quiero una cosa y sólo una parte del utilizador. Buena pregunta. 351 00:21:22,000 --> 00:21:24,290 >> ¿Otros? Está bien. 352 00:21:24,290 --> 00:21:26,250 >> Mejor no ir a través de todas las funciones de aquí, 353 00:21:26,250 --> 00:21:29,500 pero la que parece ser tal vez de interés restante es GetString 354 00:21:29,500 --> 00:21:32,790 porque resulta que GetFloat, getInt, GetDouble GetLongLong 355 00:21:32,790 --> 00:21:36,260 todo punt gran parte de su funcionalidad a GetString. 356 00:21:36,260 --> 00:21:39,750 Así que echemos un vistazo a la forma en que se lleva a cabo aquí. 357 00:21:39,750 --> 00:21:43,630 Éste parece un poco complejo, pero utiliza los mismos fundamentos 358 00:21:43,630 --> 00:21:45,670 que empezamos a hablar de la semana pasada. 359 00:21:45,670 --> 00:21:49,490 En GetString, que toma ningún argumento como por el vacío hasta aquí 360 00:21:49,490 --> 00:21:53,730 y devuelve una cadena, que al parecer estoy declarando una cadena denominada buffer. 361 00:21:53,730 --> 00:21:56,270 Realmente no sé lo que va a ser utilizado para todavía, pero ya veremos. 362 00:21:56,270 --> 00:21:58,390 Parece que la capacidad por defecto es 0. 363 00:21:58,390 --> 00:22:01,350 No estoy seguro de a dónde va esto, no sé lo que n se va a utilizar para, sin embargo, 364 00:22:01,350 --> 00:22:03,590 pero ahora se está poniendo un poco más interesante. 365 00:22:03,590 --> 00:22:06,520 En la línea 243, que declara un int, c. 366 00:22:06,520 --> 00:22:08,800 Esta es una especie de un detalle tonto. 367 00:22:08,800 --> 00:22:15,820 Un char es de 8 bits, y 8 bits puede almacenar cuántos valores diferentes? >> [Estudiante] 256. >> 256. 368 00:22:15,820 --> 00:22:20,730 El problema es que si quieres tener 256 caracteres distintos de ASCII, los cuales hay 369 00:22:20,730 --> 00:22:23,340 si usted piensa de nuevo - y esto no es algo para memorizar. 370 00:22:23,340 --> 00:22:25,710 Pero si piensas en esa tabla ASCII grande que tuvimos semanas atrás, 371 00:22:25,710 --> 00:22:30,600 existían en ese caso, 128 o 256 caracteres ASCII. 372 00:22:30,600 --> 00:22:32,940 Utilizamos todos los patrones de hasta 0s y 1s. 373 00:22:32,940 --> 00:22:36,210 Eso es un problema si usted quiere ser capaz de detectar un error 374 00:22:36,210 --> 00:22:40,190 porque si usted ya está usando 256 valores para sus personajes, 375 00:22:40,190 --> 00:22:43,050 que en realidad no planificar el futuro porque ahora no hay manera de decir: 376 00:22:43,050 --> 00:22:46,270 este no es un carácter de fiar, este es un mensaje erróneo. 377 00:22:46,270 --> 00:22:50,270 Así que lo que el mundo hace es que se utiliza el valor más grande que viene, algo así como un int, 378 00:22:50,270 --> 00:22:54,720 de modo que usted tiene un número loco de bits, 32 por 4 billones de posibles valores 379 00:22:54,720 --> 00:22:58,860 por lo que sólo tiene que terminan usando esencialmente 257 de ellos, 380 00:22:58,860 --> 00:23:01,720 1 de los cuales tiene un significado especial como un error. 381 00:23:01,720 --> 00:23:03,120 >> Así que vamos a ver cómo funciona esto. 382 00:23:03,120 --> 00:23:07,760 En la línea 246, que tengo este bucle while grande que está llamando fgetc, 383 00:23:07,760 --> 00:23:11,090 f significado archivo, por lo getc, a continuación, stdin. 384 00:23:11,090 --> 00:23:15,520 Resulta que esto es sólo la forma más precisa de decirlo leer la entrada desde el teclado. 385 00:23:15,520 --> 00:23:19,300 Teclado estándar medio de entrada, la salida estándar significa pantalla, 386 00:23:19,300 --> 00:23:23,310 y el error estándar, que veremos en pset4, significa que la pantalla 387 00:23:23,310 --> 00:23:27,490 pero una parte especial de la pantalla para que no se confunden con la producción real 388 00:23:27,490 --> 00:23:30,750 que pretende imprimir. Pero más sobre esto en el futuro. 389 00:23:30,750 --> 00:23:34,440 Así fgetc sólo significa leer un carácter del teclado y almacenarlo donde? 390 00:23:34,440 --> 00:23:37,350 Guárdelo en c. 391 00:23:37,350 --> 00:23:41,360 Y a continuación, comprobar - así que estoy usando algunas conjunciones booleanas aquí - 392 00:23:41,360 --> 00:23:46,000 comprobar que no es igual a - \ n, por lo que el usuario ha pulse Enter, queremos dejar en ese momento, 393 00:23:46,000 --> 00:23:49,850 final del bucle - y también queremos comprobar la constante EOF especial, 394 00:23:49,850 --> 00:23:53,610 que si sabe o adivina, ¿qué significa? >> [Estudiante] Final del archivo. >> Final del archivo. 395 00:23:53,610 --> 00:23:56,560 Esto es un poco absurdo porque si estoy escribiendo en el teclado, 396 00:23:56,560 --> 00:23:58,870 no hay realmente ningún archivo involucrados en esto, 397 00:23:58,870 --> 00:24:01,150 pero esto es sólo una especie del término genérico utilizado para referirse 398 00:24:01,150 --> 00:24:04,220 que nada más viene de los dedos del humano. 399 00:24:04,220 --> 00:24:06,460 EOF - final del archivo. 400 00:24:06,460 --> 00:24:09,920 Como acotación al margen, si alguna vez te has golpeado Control D en su teclado, no es que usted tendría todavía - 401 00:24:09,920 --> 00:24:15,230 usted ha golpeado Control C - Control D envía esta constante especial llamada EOF. 402 00:24:15,230 --> 00:24:19,850 Así que ahora sólo nos queda un poco de asignación de memoria dinámica. 403 00:24:19,850 --> 00:24:23,440 >> Así que si (n + 1> capacidad). Ahora voy a explicar n. 404 00:24:23,440 --> 00:24:26,100 N es sólo cuántos bytes se encuentran actualmente en el búfer, 405 00:24:26,100 --> 00:24:28,620 la cadena que se está construyendo en la actualidad por parte del usuario. 406 00:24:28,620 --> 00:24:33,450 Si usted tiene más personajes en el búfer de lo que tiene la capacidad de la memoria intermedia, 407 00:24:33,450 --> 00:24:37,410 intuitivamente lo que tenemos que hacer entonces es asignar más capacidad. 408 00:24:37,410 --> 00:24:43,330 Así que voy a pasar rozando algunas de las operaciones aritméticas aquí y centrarse sólo en esta función aquí. 409 00:24:43,330 --> 00:24:46,070 ¿Sabes lo que es malloc o por lo menos generalmente familiar. 410 00:24:46,070 --> 00:24:48,970 Adivina lo que realloc hace. >> [Estudiante] Añade la memoria. 411 00:24:48,970 --> 00:24:52,920 No es bastante la adición de memoria. Se reasigna la memoria de la siguiente manera. 412 00:24:52,920 --> 00:24:57,220 Si todavía hay espacio en el extremo de la cuerda para que dure más de que la memoria 413 00:24:57,220 --> 00:25:00,000 de lo que originalmente le da, entonces usted conseguirá que la memoria adicional. 414 00:25:00,000 --> 00:25:03,460 Así que usted puede seguir poniendo los personajes de la cadena de vuelta a espalda con espalda con espalda. 415 00:25:03,460 --> 00:25:05,830 Pero si ese no es el caso, ya que esperó demasiado tiempo 416 00:25:05,830 --> 00:25:07,940 y se dejó caer algo al azar quedó en la memoria hay 417 00:25:07,940 --> 00:25:10,290 pero no hay más memoria por aquí, eso está bien. 418 00:25:10,290 --> 00:25:13,100 Realloc va a hacer todo el trabajo pesado para usted, 419 00:25:13,100 --> 00:25:16,750 mover la cadena ha leído hasta ahora de aquí, lo dejó allí, 420 00:25:16,750 --> 00:25:19,460 y luego le dan la pista un poco más en ese punto. 421 00:25:19,460 --> 00:25:22,550 >> Así que con un gesto de la mano, déjame decir que lo que está haciendo GetString 422 00:25:22,550 --> 00:25:26,330 se está comenzando con un buffer pequeño, tal vez un solo carácter, 423 00:25:26,330 --> 00:25:30,820 y si el usuario escribe en dos personajes, GetString termina llamando realloc y dice: 424 00:25:30,820 --> 00:25:33,150 un personaje no era suficiente, dame dos personajes. 425 00:25:33,150 --> 00:25:35,950 Entonces, si usted lee a través de la lógica del circuito, que va a decir 426 00:25:35,950 --> 00:25:39,600 el usuario escribió en 3 caracteres; dame ahora no 2, pero 4 personajes, 427 00:25:39,600 --> 00:25:42,320 entonces dame 8, entonces dame 16 y 32. 428 00:25:42,320 --> 00:25:45,000 El hecho de que estoy doblando la capacidad cada vez 429 00:25:45,000 --> 00:25:48,570 significa que el buffer no va a crecer poco a poco, va creciendo super rápido. 430 00:25:48,570 --> 00:25:51,380 Y lo que podría ser la ventaja de eso? 431 00:25:51,380 --> 00:25:54,600 ¿Por qué estoy doblando el tamaño de la memoria intermedia 432 00:25:54,600 --> 00:25:58,020 aunque el usuario sólo puede ser que necesite un personaje extra del teclado? 433 00:25:58,020 --> 00:26:01,750 [Respuesta de los estudiantes inaudible] >> ¿Qué es eso? >> [Estudiante] Usted no tiene que crecer con tanta frecuencia. 434 00:26:01,750 --> 00:26:03,300 Exactamente. Usted no tiene que crecer con tanta frecuencia. 435 00:26:03,300 --> 00:26:05,510 Y esto es sólo un poco de te de cobertura sus apuestas aquí, 436 00:26:05,510 --> 00:26:10,850 La idea es que usted no desea llamar realloc mucho, ya que tiende a ser lenta. 437 00:26:10,850 --> 00:26:12,910 Cada vez que usted le pide al sistema operativo para la memoria, 438 00:26:12,910 --> 00:26:16,990 como pronto veremos en un futuro conjunto de problemas, tiende a tomar algún tiempo. 439 00:26:16,990 --> 00:26:20,010 Así que minimiza la cantidad de tiempo, incluso si usted está perdiendo algo de espacio, 440 00:26:20,010 --> 00:26:21,900 tiende a ser una buena cosa. 441 00:26:21,900 --> 00:26:24,060 >> Pero si leemos a través de la parte final del GetString aquí - 442 00:26:24,060 --> 00:26:27,950 y otra vez la comprensión de cada línea aquí no es tan importante hoy en día - 443 00:26:27,950 --> 00:26:30,530 cuenta de que finalmente llama a malloc nuevo 444 00:26:30,530 --> 00:26:33,880 y se asigna exactamente tantos bytes como necesita para la cadena 445 00:26:33,880 --> 00:26:38,060 y luego tira a la basura llamando gratis el búfer excesivamente grande 446 00:26:38,060 --> 00:26:40,080 si de hecho he doblado varias veces. 447 00:26:40,080 --> 00:26:42,730 Así que en resumen, así es como GetString ha estado trabajando todo este tiempo. 448 00:26:42,730 --> 00:26:47,060 Todo lo que hace es leer un caracter a la vez una y otra vez y otra vez, 449 00:26:47,060 --> 00:26:50,750 y cada vez que necesita algo de memoria adicional, le pide al sistema operativo para que 450 00:26:50,750 --> 00:26:53,670 llamando realloc. 451 00:26:53,670 --> 00:26:57,890 >> ¿Alguna pregunta? Está bien. 452 00:26:57,890 --> 00:26:59,270 >> Un ataque. 453 00:26:59,270 --> 00:27:04,060 Ahora que entendemos punteros o por lo menos están cada vez más familiarizados con los punteros, 454 00:27:04,060 --> 00:27:06,700 vamos a considerar cómo el mundo entero comienza a derrumbarse 455 00:27:06,700 --> 00:27:10,030 si no alcanzas a defender contra los usuarios contradictorio, 456 00:27:10,030 --> 00:27:11,850 personas que están tratando de cortar en su sistema, 457 00:27:11,850 --> 00:27:16,890 personas que están tratando de robar su software eludiendo un código de registro 458 00:27:16,890 --> 00:27:19,090 que de lo contrario podría tener que escribir pulg 459 00:27:19,090 --> 00:27:22,990 >> Echa un vistazo a este ejemplo aquí, que es sólo el código C que tiene una función principal en la parte inferior 460 00:27:22,990 --> 00:27:26,380 que llama a una función foo. ¿Y qué es lo que pasa a foo? 461 00:27:26,380 --> 00:27:29,680 [Estudiante] Un solo argumento. >> [Malan] Un solo argumento. 462 00:27:29,680 --> 00:27:33,450 Así que argv [1], lo que significa la primera palabra que el usuario escribe en la línea de comandos 463 00:27:33,450 --> 00:27:36,360 después a.out o lo que se denomina el programa. 464 00:27:36,360 --> 00:27:41,680 Así foo en la parte superior lleva en un char *. Pero char * es qué? >> [Estudiante] Una cadena. 465 00:27:41,680 --> 00:27:43,350 [Malan] Una cadena, así que no hay nada nuevo aquí. 466 00:27:43,350 --> 00:27:45,420 Esa cadena es arbitrariamente ser llamado bar. 467 00:27:45,420 --> 00:27:51,430 En esta línea aquí, char c [12], en una especie de semi-Inglés técnico, lo que está haciendo esta línea? 468 00:27:51,430 --> 00:27:55,220 [Estudiante] Matriz de - Array de >>? >> [Estudiante] Caracteres. Caracteres. >> 469 00:27:55,220 --> 00:27:58,870 Dame una matriz de 12 caracteres. Así que podríamos llamar esto un buffer. 470 00:27:58,870 --> 00:28:02,920 Es técnicamente llamado c, pero un amortiguador en la programación sólo significa un montón de espacio 471 00:28:02,920 --> 00:28:04,800 que usted puede poner algunas cosas pulg 472 00:28:04,800 --> 00:28:07,940 A continuación, por último, memcpy no hemos usado antes, pero que es fácil adivinar lo que hace. 473 00:28:07,940 --> 00:28:10,480 Copia de la memoria. ¿Qué hacer? 474 00:28:10,480 --> 00:28:19,270 Aparentemente copia bar, su entrada, en c, pero sólo hasta la longitud de la barra. 475 00:28:19,270 --> 00:28:24,930 Pero hay un error aquí. >> [Estudiante] Se necesita el carácter sizeof. >> Okay. 476 00:28:24,930 --> 00:28:30,860 Técnicamente, deberíamos hacer strlen (bar) * sizeof (char)). Eso es correcto. 477 00:28:30,860 --> 00:28:33,930 Pero en el peor de los casos aquí, vamos a suponer que eso es - 478 00:28:33,930 --> 00:28:35,950 Bien. Entonces hay dos errores. 479 00:28:35,950 --> 00:28:39,160 Así sizeof (char)); 480 00:28:39,160 --> 00:28:41,290 Vamos a hacer esto un poco más. 481 00:28:41,290 --> 00:28:44,910 Así que ahora que todavía hay un error, que es lo que? >> [Respuesta de los estudiantes inaudible] 482 00:28:44,910 --> 00:28:46,990 Compruebe qué? >> [Estudiante] Comprobar valor NULL. 483 00:28:46,990 --> 00:28:50,270 Por lo general, se debe comprobar si NULL porque suceden cosas malas 484 00:28:50,270 --> 00:28:53,200 cuando el puntero es NULL, ya que podría terminar yendo allí, 485 00:28:53,200 --> 00:28:57,630 y no siempre se va a NULL por eliminación de referencias con el operador estrella. 486 00:28:57,630 --> 00:29:01,050 Así que eso es bueno. ¿Y qué más vamos a hacer? Lógicamente, hay una falla aquí también. 487 00:29:01,050 --> 00:29:04,450 [Estudiante] Comprobar si argc es> = a 2. 488 00:29:04,450 --> 00:29:10,550 A fin de comprobar si argc es> = 2. Bien, hay tres errores en este programa. 489 00:29:10,550 --> 00:29:16,630 Estamos comprobando si el usuario realmente escribió en nada en argv [1]. Bueno. 490 00:29:16,630 --> 00:29:20,950 ¿Cuál es el error tercera? Si. >> [Estudiante] C puede no ser lo suficientemente grande. 491 00:29:20,950 --> 00:29:23,320 Bueno. Nos registramos un escenario. 492 00:29:23,320 --> 00:29:29,520 Hemos comprobado implícitamente no copiar más memoria de la que se exceda la longitud de la barra. 493 00:29:29,520 --> 00:29:32,510 Así que si la cadena que el usuario escribió en es de 10 caracteres de longitud, 494 00:29:32,510 --> 00:29:36,020 esto se limitó a decir copiar 10 caracteres. Y eso está bien. 495 00:29:36,020 --> 00:29:39,940 Pero ¿qué pasa si el usuario escribió en una palabra en el indicador como una palabra de 20 caracteres? 496 00:29:39,940 --> 00:29:44,900 Esto es decir copia 20 caracteres de barra en qué? 497 00:29:44,900 --> 00:29:49,750 C, también conocido como nuestro buffer, lo que significa que acabas de escribir datos 498 00:29:49,750 --> 00:29:52,540 a 8 lugares byte que usted no es dueño, 499 00:29:52,540 --> 00:29:54,870 y no los poseen en el sentido de que nunca se les asignan. 500 00:29:54,870 --> 00:30:00,370 Así que esto es lo que se conoce generalmente como el ataque de desbordamiento de búfer o ataque saturación del búfer. 501 00:30:00,370 --> 00:30:05,580 Y es un ataque en el sentido de que si el usuario o el programa que está llamando a su función 502 00:30:05,580 --> 00:30:10,490 está haciendo maliciosamente, lo que realmente sucede a continuación en realidad podría ser muy malo. 503 00:30:10,490 --> 00:30:12,450 >> Así que vamos a echar un vistazo a esta foto aquí. 504 00:30:12,450 --> 00:30:16,060 Este cuadro representa la pila de memoria. 505 00:30:16,060 --> 00:30:19,580 Recuerde que cada vez que se llama a una función recibe este pequeño marco en la pila 506 00:30:19,580 --> 00:30:21,520 y luego otro y luego otro y otro. 507 00:30:21,520 --> 00:30:24,300 Y hasta ahora, tenemos sólo un poco abstraído estos en forma de rectángulos 508 00:30:24,300 --> 00:30:26,290 ya sea en el tablero o en la pantalla aquí. 509 00:30:26,290 --> 00:30:30,580 Pero si nos centramos en uno de esos rectángulos, cuando se llama a una función foo, 510 00:30:30,580 --> 00:30:35,880 resulta que hay más en el interior de la pila que enmarcan en ese rectángulo 511 00:30:35,880 --> 00:30:40,060 que apenas x e y y a y b, como lo hicimos hablando de swap. 512 00:30:40,060 --> 00:30:44,410 Resulta que hay algunos detalles de menor nivel, entre los que remite. 513 00:30:44,410 --> 00:30:49,550 Así que resulta cuando principal llama foo, el principal tiene que informar foo 514 00:30:49,550 --> 00:30:53,520 cuál es la dirección principal está en la memoria del ordenador 515 00:30:53,520 --> 00:30:57,770 porque de lo contrario, tan pronto como foo se hace ejecutar, como en este caso aquí, 516 00:30:57,770 --> 00:31:00,830 una vez que llegue a este corchete cerrado al final del foo, 517 00:31:00,830 --> 00:31:05,310 ¿cómo demonios se foo saber dónde está el control del programa se supone que debe ir? 518 00:31:05,310 --> 00:31:08,970 Resulta que la respuesta a esa pregunta está en este rectángulo rojo aquí. 519 00:31:08,970 --> 00:31:12,670 Esto representa un puntero, y le toca a la computadora para almacenar temporalmente 520 00:31:12,670 --> 00:31:17,030 en la pila de llamada de la dirección principal, de modo que tan pronto como foo se hace ejecutar, 521 00:31:17,030 --> 00:31:21,120 el equipo sabe dónde y qué línea principal para volver. 522 00:31:21,120 --> 00:31:23,940 Puntero salvado Frame refiere de manera similar a esta. 523 00:31:23,940 --> 00:31:26,310 Bar Char * aquí representa qué? 524 00:31:26,310 --> 00:31:31,350 Ahora bien, este segmento azul aquí es el marco de foo. ¿Qué es el bar? 525 00:31:31,570 --> 00:31:35,010 Bar es sólo el argumento de la función foo. 526 00:31:35,010 --> 00:31:37,500 Así que ahora estamos de vuelta en una especie de cuadro familiar. 527 00:31:37,500 --> 00:31:39,850 Hay más cosas y más distracciones en la pantalla, 528 00:31:39,850 --> 00:31:43,380 pero este segmento de color azul claro sólo es lo que hemos estado dibujando en la pizarra 529 00:31:43,380 --> 00:31:45,790 para algo como swap. Ese es el marco para foo. 530 00:31:45,790 --> 00:31:51,490 Y la única cosa en la que ahora mismo es el bar, que es este parámetro. 531 00:31:51,490 --> 00:31:55,220 Pero lo que más debería estar en la pila de acuerdo con este código aquí? 532 00:31:55,220 --> 00:31:57,760 [Estudiante] char c [12]. >> [Malan] char c [12]. 533 00:31:57,760 --> 00:32:02,810 También hay que ver 12 cuadros de memoria asignada a una variable llamada c, 534 00:32:02,810 --> 00:32:04,970 y de hecho tenemos que en la pantalla. 535 00:32:04,970 --> 00:32:08,480 La parte superior hay c [0], y entonces el autor de este diagrama 536 00:32:08,480 --> 00:32:11,850 no se molestó en dibujar todas las plazas, pero en realidad hay 12 hay 537 00:32:11,850 --> 00:32:16,590 porque si nos fijamos en la parte inferior derecha, c [11] si se cuentan desde 0 es el byte tal 12. 538 00:32:16,590 --> 00:32:18,400 Pero aquí está el problema. 539 00:32:18,400 --> 00:32:22,390 ¿En qué dirección se c creciendo? 540 00:32:22,390 --> 00:32:27,080 Ordenar de arriba hacia abajo si comienza en la parte superior y crece hasta el fondo. 541 00:32:27,080 --> 00:32:30,110 No se ve como nos dejó la pista mucho aquí en absoluto. 542 00:32:30,110 --> 00:32:32,090 Hemos clase de nosotros mismos pintado en una esquina, 543 00:32:32,090 --> 00:32:36,940 y que c [11] es justo contra bar, que está justo en contra puntero guardado, 544 00:32:36,940 --> 00:32:39,960 que es justo en contra del remite. No hay más lugar. 545 00:32:39,960 --> 00:32:42,810 ¿Cuál es la implicación entonces si metes la pata 546 00:32:42,810 --> 00:32:46,500 y se intenta leer 20 bytes en un búfer de 12 bytes? 547 00:32:46,500 --> 00:32:50,060 ¿Dónde están esos 8 bytes adicionales va a ir? >> [Estudiante] Inside - 548 00:32:50,060 --> 00:32:53,200 Dentro de todo lo demás, algunos de los cuales es súper importante. 549 00:32:53,200 --> 00:32:57,260 Y lo más importante, potencialmente, es el cuadro rojo allí, Dirección de Retorno, 550 00:32:57,260 --> 00:33:03,560 porque supongo que usted ya sea accidental o de contradicción sobrescribir esos 4 bytes, 551 00:33:03,560 --> 00:33:07,260 que la dirección del puntero, no sólo con la basura pero con un número 552 00:33:07,260 --> 00:33:09,810 que pasa a representar una dirección real en la memoria. 553 00:33:09,810 --> 00:33:13,880 ¿Cuál es la implicación, lógicamente? >> [Estudiante] Función que va a volver a un lugar diferente. 554 00:33:13,880 --> 00:33:15,250 Exactamente. 555 00:33:15,250 --> 00:33:19,170 Cuando regresa foo y éxitos que corchete, el programa se va a proceder 556 00:33:19,170 --> 00:33:25,060 no para volver al menú principal, va a volver a lo que la dirección está en esa caja roja. 557 00:33:25,060 --> 00:33:28,600 >> En el caso del registro de software eludir, 558 00:33:28,600 --> 00:33:32,260 ¿Y si la dirección que está siendo devuelto a es la función que normalmente se llama 559 00:33:32,260 --> 00:33:35,690 después de haber pagado por el software y introduce tu código de registro? 560 00:33:35,690 --> 00:33:39,870 Te puedes engañar al ordenador en no ir aquí, pero en vez de subir aquí. 561 00:33:39,870 --> 00:33:45,100 O si eres realmente inteligente, un adversario realmente puede escribir en el teclado, por ejemplo, 562 00:33:45,100 --> 00:33:50,690 no es una palabra real, los personajes no 20, pero supongo que él o ella actualmente los tipos de 563 00:33:50,690 --> 00:33:52,770 algunos personajes que representan código. 564 00:33:52,770 --> 00:33:55,320 Y no va a ser el código C, en realidad van a ser los personajes 565 00:33:55,320 --> 00:33:59,290 que representan el código binario de máquina, 0s y 1s. 566 00:33:59,290 --> 00:34:01,290 Pero supongamos que eres lo suficientemente inteligente como para hacer eso, 567 00:34:01,290 --> 00:34:06,500 para pegar alguna manera en el símbolo del sistema GetString algo que es esencialmente código compilado, 568 00:34:06,500 --> 00:34:09,980 y los últimos 4 bytes sobrescribir ese remitente. 569 00:34:09,980 --> 00:34:13,360 ¿Y qué dirección quiere que la entrada de hacerlo? 570 00:34:13,360 --> 00:34:18,630 Se almacena realmente en este rectángulo rojo la dirección del primer byte de la memoria intermedia. 571 00:34:18,630 --> 00:34:23,070 Así que hay que ser muy inteligente, y esto es un montón de prueba y error para la gente mala por ahí, 572 00:34:23,070 --> 00:34:25,639 pero si usted puede averiguar qué tan grande es este tampón 573 00:34:25,639 --> 00:34:28,820 de manera que los últimos bytes de la entrada le proporcionará al programa 574 00:34:28,820 --> 00:34:33,540 pasar a ser equivalente a la dirección del inicio de su buffer, que puede hacer esto. 575 00:34:33,540 --> 00:34:39,320 Si decimos hola y normalmente 0 \, eso es lo que termina en el búfer. 576 00:34:39,320 --> 00:34:44,420 Pero si eres más inteligente y llenamos ese búfer con lo que genéricamente llamaremos código de ataque - 577 00:34:44,420 --> 00:34:48,860 AAA, ataque, ataque, ataque - que es sólo algo que hace algo malo, 578 00:34:48,860 --> 00:34:51,820 ¿qué pasa si eres realmente inteligente, es posible hacer esto. 579 00:34:51,820 --> 00:34:58,610 En el cuadro rojo aquí es una secuencia de números - 80, C0, 35, 08. 580 00:34:58,610 --> 00:35:01,610 Tenga en cuenta que que coincide con el número que está aquí arriba. 581 00:35:01,610 --> 00:35:04,430 Está en orden inverso, pero más de eso en otro momento. 582 00:35:04,430 --> 00:35:08,140 Tenga en cuenta que esta dirección de retorno se hayan modificado 583 00:35:08,140 --> 00:35:12,020 para igualar la dirección de aquí, no la dirección de la principal. 584 00:35:12,020 --> 00:35:17,500 Así que si el malo de la película es súper inteligente, él o ella va a incluir en ese código de ataque 585 00:35:17,500 --> 00:35:20,930 algo así como eliminar todos los archivos del usuario o copiar las contraseñas 586 00:35:20,930 --> 00:35:24,680 o crear una cuenta de usuario que puede acceder a - nada en absoluto. 587 00:35:24,680 --> 00:35:26,950 >> Y este es el peligro y el poder de la C. 588 00:35:26,950 --> 00:35:29,840 Debido a que tiene acceso a la memoria a través de punteros 589 00:35:29,840 --> 00:35:32,520 y por lo tanto se puede escribir lo que quiera en la memoria de una computadora, 590 00:35:32,520 --> 00:35:35,080 usted puede hacer que un equipo hacer lo que quieras 591 00:35:35,080 --> 00:35:39,550 simplemente por haberlo saltar dentro de su propio espacio de memoria. 592 00:35:39,550 --> 00:35:44,650 Y así hasta el día de hoy tantos programas y sitios web internacionales de tantos que están en peligro 593 00:35:44,650 --> 00:35:46,200 se reducen a las personas que toman ventaja de esto. 594 00:35:46,200 --> 00:35:50,760 Y esto puede parecer un sofisticado ataque super, pero no siempre comienza de esa manera. 595 00:35:50,760 --> 00:35:53,560 La realidad es que lo que la gente mala suele hacer es, 596 00:35:53,560 --> 00:35:58,200 si se trata de un programa en una línea de comandos o un programa de interfaz gráfica de usuario o una página web, 597 00:35:58,200 --> 00:35:59,940 que acaba de empezar a proporcionar una tontería. 598 00:35:59,940 --> 00:36:03,980 Usted escribe en una palabra muy grande en el campo de búsqueda y pulsar Intro, 599 00:36:03,980 --> 00:36:05,780 y esperar a ver si el sitio web se estrella 600 00:36:05,780 --> 00:36:09,990 o esperar a ver si el programa se manifiesta algún mensaje de error 601 00:36:09,990 --> 00:36:14,330 porque si tienes suerte como el malo de la película y ofrecerle alguna entrada loco 602 00:36:14,330 --> 00:36:18,980 que bloquea el programa, lo que significa que el programador no previó su mal comportamiento, 603 00:36:18,980 --> 00:36:23,630 lo que significa que probablemente puede con bastante esfuerzo, el juicio suficiente y error, 604 00:36:23,630 --> 00:36:26,650 encontrar la manera de librar un ataque más preciso. 605 00:36:26,650 --> 00:36:31,410 Así que una parte tan importante de la seguridad no es sólo evitar estos ataques en conjunto 606 00:36:31,410 --> 00:36:34,100 pero su detección y, de hecho mirando logs 607 00:36:34,100 --> 00:36:36,780 y ver lo que la gente loca entradas tecleadas en su sitio web, 608 00:36:36,780 --> 00:36:38,960 qué términos de búsqueda y la gente escribe en su página web 609 00:36:38,960 --> 00:36:42,870 con la esperanza de algún desbordamiento buffer. 610 00:36:42,870 --> 00:36:45,500 Y todo esto se reduce a lo básico sencillas de lo que es una matriz 611 00:36:45,500 --> 00:36:49,080 y ¿qué significa para asignar y usar la memoria. 612 00:36:49,080 --> 00:36:51,710 >> Relacionado a continuación, que también es esta. 613 00:36:51,710 --> 00:36:54,280 Vamos a echar un vistazo en el interior de un disco duro nuevo. 614 00:36:54,280 --> 00:36:58,440 Usted recordará de una o dos semanas atrás, que al arrastrar archivos a la papelera de reciclaje o bote de basura, 615 00:36:58,440 --> 00:37:03,710 ¿qué pasa? >> [Estudiante] Nada. >> Absolutamente nada, ¿verdad? 616 00:37:03,710 --> 00:37:05,740 Finalmente, si se ejecuta sin espacio en disco, 617 00:37:05,740 --> 00:37:08,190 Windows o Mac OS comenzará a eliminar archivos por usted. 618 00:37:08,190 --> 00:37:10,390 Pero si arrastra algo ahí, eso no es del todo seguro. 619 00:37:10,390 --> 00:37:13,800 Toda su compañero de cuarto o de un amigo o miembro de la familia tiene que hacer es doble clic y, voila, 620 00:37:13,800 --> 00:37:16,310 hay todos los archivos incompletos que intentaron borrar. 621 00:37:16,310 --> 00:37:19,590 La mayoría de nosotros por lo menos saber que usted tiene que hacer clic derecho o control Haga clic en 622 00:37:19,590 --> 00:37:22,310 y vaciar la basura o algo así. 623 00:37:22,310 --> 00:37:25,000 Pero incluso entonces, que no acaba de hacer el truco 624 00:37:25,000 --> 00:37:28,010 porque lo que sucede cuando se tiene un archivo en el disco duro 625 00:37:28,010 --> 00:37:32,770 que representa algún documento de Word o algún JPEG, lo que representa el disco duro, 626 00:37:32,770 --> 00:37:35,350 y digamos que esta astilla aquí representa ese archivo, 627 00:37:35,350 --> 00:37:38,390 y se compone de un montón de 0s y 1s. 628 00:37:38,390 --> 00:37:42,470 ¿Qué sucede cuando usted no sólo arrastrar el archivo a la papelera o papelera de reciclaje 629 00:37:42,470 --> 00:37:48,020 pero también vaciarlo? Una especie de nada. 630 00:37:48,020 --> 00:37:49,640 No hay absolutamente nada ahora. 631 00:37:49,640 --> 00:37:54,290 Ahora sólo es nada porque un poco de algo que ocurre en la forma de esta mesa. 632 00:37:54,290 --> 00:37:58,370 Así que hay una especie de base de datos o tabla dentro de la memoria de una computadora 633 00:37:58,370 --> 00:38:03,850 que esencialmente tiene una columna para los nombres de archivos y una columna para los archivos 'ubicación, 634 00:38:03,850 --> 00:38:07,720 donde esto podría ser la ubicación 123, un número al azar. 635 00:38:07,720 --> 00:38:14,560 Así que podríamos tener algo como x.jpeg y la ubicación 123. 636 00:38:14,560 --> 00:38:18,800 ¿Qué sucede entonces cuando realmente vaciar la papelera? 637 00:38:18,800 --> 00:38:20,330 Que se vayan. 638 00:38:20,330 --> 00:38:23,610 Pero lo que no desaparece es el 0s y 1s. 639 00:38:23,610 --> 00:38:26,270 >> ¿Cuál es entonces la conexión a pset4? 640 00:38:26,270 --> 00:38:31,240 Bueno, con pset4, sólo porque hemos borrado accidentalmente la tarjeta Compact Flash 641 00:38:31,240 --> 00:38:35,750 que tenía todas esas fotos o simplemente porque la mala suerte se corrompió 642 00:38:35,750 --> 00:38:38,000 no quiere decir que el 0 y 1 no están todavía allí. 643 00:38:38,000 --> 00:38:40,410 Tal vez algunos de ellos se han perdido porque algo se corrompe 644 00:38:40,410 --> 00:38:43,320 en el sentido de que algunos 0s y 1s 1s convirtió se convirtió en 0s. 645 00:38:43,320 --> 00:38:47,240 Las cosas malas pueden suceder a causa de software defectuoso o hardware defectuoso. 646 00:38:47,240 --> 00:38:50,370 Pero muchos de esos bits, tal vez incluso el 100% de ellos, todavía están allí. 647 00:38:50,370 --> 00:38:55,050 Es que el ordenador o la cámara no sabe dónde comenzó JPEG1 648 00:38:55,050 --> 00:38:56,910 y donde JPEG2 empezar. 649 00:38:56,910 --> 00:39:01,070 Pero si usted, el programador, saber con un poco de sentido común en esos JPEGs son 650 00:39:01,070 --> 00:39:06,010 o cómo se ven para que pueda analizar el 0 y 1 y dicen JPEG, JPEG, 651 00:39:06,010 --> 00:39:09,440 usted puede escribir un programa con esencialmente un bucle for o while 652 00:39:09,440 --> 00:39:12,820 que se recupera cada uno de esos archivos. 653 00:39:12,820 --> 00:39:16,030 Así que la lección es, pues, para empezar a borrar los archivos de forma segura 654 00:39:16,030 --> 00:39:18,340 si quieres evitar esto por completo. Sí. 655 00:39:18,340 --> 00:39:21,010 >> [Estudiante] ¿Cómo es que dice en su computadora 656 00:39:21,010 --> 00:39:23,550 que tiene más memoria que antes? 657 00:39:23,550 --> 00:39:27,820 Tener más memoria que antes - >> [estudiante] Más memoria disponible. 658 00:39:27,820 --> 00:39:29,630 Oh. Buena pregunta. 659 00:39:29,630 --> 00:39:32,360 Entonces, ¿por qué después de vaciar la basura tiene su ordenador le dirá 660 00:39:32,360 --> 00:39:34,910 que tiene más espacio libre que antes? 661 00:39:34,910 --> 00:39:36,770 En pocas palabras, porque está mintiendo. 662 00:39:36,770 --> 00:39:40,740 Más técnicamente, usted tiene más espacio porque ahora usted ha dicho 663 00:39:40,740 --> 00:39:43,680 puedes poner otras cosas en ese archivo una vez fue. 664 00:39:43,680 --> 00:39:45,450 Pero eso no significa que los bits van a desaparecer, 665 00:39:45,450 --> 00:39:48,590 y eso no significa que los bits están siendo cambiados para todos 0s, por ejemplo, 666 00:39:48,590 --> 00:39:50,150 para su protección. 667 00:39:50,150 --> 00:39:54,640 Así que por el contrario, si bien borrar archivos o destruir físicamente el dispositivo, 668 00:39:54,640 --> 00:39:57,300 que es realmente la única manera a veces alrededor de eso. 669 00:39:57,300 --> 00:40:02,020 >> Así que ¿por qué no nos vamos en esa nota semi-miedo, y nos vemos el lunes. 670 00:40:02,020 --> 00:40:07,000 [Aplauso] 671 00:40:07,780 --> 00:40:10,000 >> [CS50.TV]