>> JASON HIRSCHHORN: Bienvenido, todo el mundo, hasta la semana 6.
Estoy feliz de verlos a todos vivos y bien después Cuestionario 0, porque sé que
era un poco áspero.
Pero, por suerte, gracias a todos hizo increíblemente bien.
Y lo que es maravilloso.
Si estás en mi sección, le he dado más de hacer una copia de sus exámenes ya.
>> Un par de ustedes, me voy a encontrar con después de la clase.
Y si usted es un estudiante de la extensión y la usted no ha recibido su concurso de nuevo
sin embargo, el TF está probablemente trabajando en ello y clasificación, y lo recuperará
a la brevedad.
Así que mis estudiantes de extensión que son viendo ahora mismo - en vivo con suerte -
Voy a conseguir sus cuestionarios poco así.
>> Nuestra agenda para hoy es el siguiente.
En primer lugar, vamos a repasar algunos recursos que CS50 proporciona.
Vamos a repasar Cuestionario 0 siguiente, y Voy a responder a cualquier pregunta que nadie
tiene alrededor de problemas concretos.
Y luego, vamos a ir más de / S de archivos y problemas 5.
Estos dos últimos temas se llevarán a el grueso de la sección actual.
>> Pongo esta lista cada semana como un recordatorio a todos ustedes, pero de núcleo
sección, sólo tenemos 90 minutos - que no son capaces de cubrir todo lo que yo
le encantaría cubrir para ustedes.
Pero tenemos un montón de recursos para dibujar sobre como se llega a saber
el material y el trabajo a través de su problema se pone.
>> Un recordatorio de que tengo en línea un texto cuadro, creado para que usted pueda llenar si
tener ninguna reacción para mí, tanto positivos como
constructiva, sobre la sección.
Esa URL se encuentra aquí abajo.
Así que por favor, tome un momento si usted tiene cualquier retroalimentación, ya sea durante la sección,
o después, o después de ver el video en línea, para darme su reacción.
Realmente aprecio todos y cada uno de ellos.
>> Así que he estado teniendo conversaciones pequeñas con una gran parte de mi
estudiantes durante toda la semana - lo entrego pruebas de espalda, hablando de la
Por supuesto, al ver cómo lo está haciendo.
Y un tema ha surgido una y más de hablar de - en
en particular -
boletines de problemas.
Y he encapsulado ese tema en el tablero en este momento.
>> En esencia, hay una diferencia entre el encendido en algo que es
se hace correctamente y algo lo que se hace bien.
La mayoría de la gente ha estado haciendo fantástico en términos de corrección -
De 5 o 4 de sobre todos los conjuntos de procesadores.
La mayoría de la gente se está aquellos todo el tiempo.
>> Sin embargo, sólo porque usted ha hecho algo bien no significa que has
hecho algo tan elegante, o de manera eficiente, o la forma más limpia que
podría haber hecho.
Y eso es lo que el diseño -
y, en menor grado, el estilo -
ejes son para.
Así que todos ustedes estoy presionando, y otros FF están empujando ustedes, no sólo a su vez
en lo que es correcto, pero a su vez en las cosas que son codificadas también.
>> Si no lo hace innecesario que los bucles, No volver a calcular las variables si
usted no tiene que hacerlo.
Por ejemplo, mirando de nuevo a conjunto de problemas 4, cuando la colocación de los ladrillos en la
pantalla, cada fila - todos los ladrillos en una fila dada tiene la misma coordenada y -
la misma altura de coordenadas.
>> De modo que la coordenada y no necesitaban se calculará en el interior del interior
anidado bucle FOR que probablemente utilizó poner los ladrillos en la pantalla.
Sólo hay que calcular cada vez que encendió una fila, o
movido hacia abajo una fila.
Así que decir que si hay 10 ladrillos en una fila, cada ladrillo puede tener el mismo
coordenada, y que la coordenada sólo se puede calcular
una vez para todos aquellos.
>> No necesita ser calculado 10 tiempos, ni tampoco esa necesidad cálculo
a ocurrir en el actual función de llamada -
la nueva llamada a la función gracked.
Así que si eso fue un poco confuso para usted, más genéricamente, las cosas que
no es necesario que suceda cada vez vas a través de un lazo para no deberían ser
poner dentro del bucle FOR, y no debe suceder cada vez que vaya
a través del bucle FOR.
>> Otro buen ejemplo de diseño que vimos en la semana 3 por 15, usted podría mantener
pista del cero.
Así que al inicializar el tablero, save - en una variable global, tal vez -
la x y coordenada y del cero.
Y entonces cada vez que -
en su función de movimiento, cada vez que hagas un movimiento acertado, se actualiza la
ubicación de la cero.
>> Eso le ahorrará el tener que hacer bucles for anidados para mirar a través de la
abordar cada vez que en su función de desplazamiento y encontrar el cero, o encontrar la baldosa,
a continuación, compruebe lo que hay al lado.
En su lugar, usted tiene la ubicación de la cero, usted puede simplemente mirar arriba, abajo,
y a la izquierda y derecha de la misma, para encontrar la baldosa que estaba buscando.
>> Así que en términos de los programas que estamos escritura, nunca son lo suficientemente grandes
que algunas de estas decisiones de diseño son realmente va a obstaculizar su
programa o hacer que se ejecute más lentamente, o tal vez se quede sin memoria.
Pero seguimos empujando ustedes escribir tan elegante y
código eficiente posible.
>> Así que si usted termina de escribir las cosas que tienen una significativamente mayor
ámbito de aplicación, que se escribirá con buena diseñar además de ser correcta.
Así que algunos de ustedes tiene traído eso.
Eso es algo que estamos buscando - algo que vamos a seguir
empujarte chicos en.
>> Si alguna vez tiene alguna pregunta acerca de la diseño de su programa, no dude en
para llegar a mí, y estoy feliz de caminar a través de su programa con usted,
y señalar algunos de los diseños decisiones que tomó, y le dará un poco de
sugerencias sobre cómo hacer que incluso mejores decisiones de diseño.
>> Así que vamos a seguir adelante a hablar de Prueba 0.
Antes de hacer eso, ¿alguien tiene alguna pregunta acerca de lo que
He cubierto hasta ahora?
>> [Crujido]
>> JASON HIRSCHHORN: Siete segundos.
Aceptar.
Vamos a hablar de Prueba 0 para un poco.
La mayoría de ustedes tienen su concurso espalda de 0.
Si no lo hace, es de esperar recuerdas un poco.
Pero si usted ha tomado Cuestionario 0, entonces También tendrá acceso al PDF en línea en
las soluciones de muestra.
>> ¿Alguien tiene alguna pregunta antes de nos lanzamos en el material de la semana sobre
un problema particular en el concurso 0 -
¿por qué la respuesta es lo que es?
¿Hay alguien confundido acerca de algo?
Incluso si usted tiene el problema de la derecha, pero simplemente le gustaría que le explique un poco
más, estoy feliz de hacerlo ahora.
>> Así que le he pedido a ustedes para venga preparado con un poco de
pensamientos acerca del concurso 0.
Entonces, ¿quién le gustaría que nos comenzó con una pregunta
comentar acerca del concurso 0?
>> [Crujido PAPEL]
>> JASON HIRSCHHORN: No todo el mundo hizo perfectamente.
Así que sé [risas]
tiene que haber algunas preguntas Cuestionario sobre 0.
Aceptar.
Sí.
Ompica.
>> OMPICA: Número 10.
>> JASON HIRSCHHORN: Número 10.
¿Cuál era el número 10?
>> OMPICA: The -
>> JASON HIRSCHHORN: I haven't -
>> OMPICA: include -
>> JASON HIRSCHHORN: Número 10 era de ocho para i - i escribir ocho a?
>> OMPICA: Si.
>> JASON HIRSCHHORN: OK.
Así que otra pregunta que podría tener preguntó fue premonitorio estoy?
La respuesta es sí.
En la sección antes de la prueba, le pregunté ustedes para codificar tanto Sterling y
ocho a i.
Ambos se pasó a aparecer en el cuestionario.
Así que espero, que pagó atención a eso.
>> Y si lo hubieras hecho, entonces usted tendría que probablemente hecho bien en los dos.
Pero ocho a i, en realidad no nos Código en clase, pero fue, de nuevo,
preguntó en el cuestionario.
Así que un par de cosas a tener señalar al codificar ocho a i.
Lo primero, por la pregunta, era que usted necesita para comprobar si la cadena
era igual a nulo.
>> Un par de personas trataron de comprobar más adelante en el programa si s abrazadera i era -
por lo que un carácter específico en que string - era igual a nulo.
Pero recuerde, que es esencialmente nula - Es bueno pensar en
null como un puntero cero - un puntero a cero -
en algún lugar de la memoria donde nunca se puede tener acceso.
>> Así que si algo es igual a null, sabemos que no se ha inicializado,
o no hay nada allí.
Así que s es una estrella char, s soporte de i es un char.
Así que tiene sentido comparar s en null, pero no s abrazadera i en null.
Pero una vez más - así que eso fue lo primero que que se suponía que hacer -
asegúrese de que usted realmente tiene una cadena real.
>> A continuación, te quería ir a través de cada carácter de la cadena.
Y así, eso sería como un soporte de s i, por ejemplo, si i es el iterador.
Y dar ese carácter, y obtener su valor real.
Usted lo tiene almacenado como un char, pero el valor ASCII para el cero -
cero como un personaje -
no es en realidad el número entero cero.
Es algún otro número que pueda mirar hacia arriba en la tabla ASCII.
>> Así que una manera de corregir para que - probablemente la mejor manera para corregir
que - se resta de él el valor del carácter -
cero como un carácter.
Comilla simple Así que menos, cero otra comilla simple.
Eso llevará el número que tiene como char, y hacerlo igual a
el número como un número entero real.
>> Y que es muy similar al enfoque mucha gente tomó en el
problema conjunto 2, con César y Viginere -
esas cifras, cuando se ellos fueron rotando.
Así que después de que lo tienes como un número del cero a nueve, a continuación, - dependiendo
a dónde va en el número final - que necesita para multiplicarlo
por una potencia de 10.
>> Algunas personas se trasladaron de nuevo a la frente, y multiplicado el individuo
número por una potencia de 10.
Algunas personas se trasladaron de el frente hacia atrás -
y así se llevó el más alto ordenar números primero -
y salvaría los de un variable de contador global.
Y entonces cada vez que a través de la DE lazo, multiplique ese gigante mundial
contrarrestar variable 10, para hacer espacio para el siguiente carácter.
>> Así que fue un poco confuso y sin yo escribiendo en la pizarra.
Pero la solución de la muestra está disponible para usted.
Pero esas eran las cosas grandes que estábamos buscando.
También una comprobación para asegurarse de que cada carácter individual era de hecho un
carácter entre cero y nueve años, y no algún otro personaje, al igual que una A,
por ejemplo.
>> Esas eran las cosas que estábamos buscando en esa pregunta.
¿Responde esto a su pregunta?
>> OMPICA: Si.
>> JASON HIRSCHHORN: OK.
¿Hay otras preguntas Cuestionario sobre 0?
¿Qué pasa con la compilación?
Todo el mundo la compilación correcta?
No.
Había un -
[Risas]
¿Una pregunta sobre la proceso de compilación?
Wow.
>> [Crujido PAPEL]
>> JASON HIRSCHHORN: Si.
Michael.
>> MICHAEL: ¿Es el número 7 - al azar?
>> JASON HIRSCHHORN: Número 7.
Número 7 era obtener un número entero aleatorio.
Excelente.
Así que te dan un número entero a y un b entero, y quieres un azar
número entero entre a y b.
De hecho, podemos escribir éste en el tablero, porque éste
Era una línea de código -
una manera de hacerlo.
>> Así que se nos da como un Drand función que podría utilizar.
¿Y qué hace Drand -
suponiendo que ha sido cabeza de serie -
lo que no Drand volver?
>> MICHAEL: Un flotador entre 0,0 y 1,0.
>> JASON HIRSCHHORN: Varios - sí.
Un número entre 0 y 1.
Y así hemos B y A.
Y luego tenemos nuestro número aleatorio entre 0 y 1 que nos ha dado Drand.
Algunas personas trataron de poner b, o b menos a, o algo dentro de los
paréntesis.
Eso significaría que son argumentos de esta función.
>> Drand no toma ningún argumento - como getString hace
No tome ningún argumento.
Así que es sólo paren abiertas, cerca Paren - y que, en sí, es
la llamada de función.
Y eso le da un número entre 0 y 1.
Por supuesto, tenemos toda una gama que los números pueden estar adentro
>> Digamos, si b es 10 y es 5, que realmente quiero un número con un rango de 5.
Así que lo siguiente que tenemos que hacer es multiplique esto por el rango b, menos una.
Así que suponiendo que eso multiplicado.
Y eso nos dará un número dentro de un rango dado.
Y ese rango específico de ser el diferencia entre B menos una.
>> Y, por último, que sólo voy a dar desde - decir el rango entre b, menos una
es 5, eso nos da una número de 0 a 5.
Pero si a es en realidad 5, tenemos que impulsar este rango hasta donde es
en realidad supone que, mediante la adición de una.
Así que tiene la derecha de la lógica.
Y entonces, ¿tendría otra pregunta?
>> MICHAEL: No.
Me siento muy tonto en estos momentos.
[Risas]
>> JASON HIRSCHHORN: No.
No se sienta realmente tonto.
Un número de personas que luchó con esta pregunta.
Y luego, la otra pregunta es, Drand, usted ha dicho, le da un flotador -
devuelve un float.
Pero esta función realmente pidió para un entero sea devuelto.
>> Usted no tiene que jugar esta carta de forma explícita a un número entero, porque estos
operaciones se tratan como un todo flotar - como un número de punto flotante.
¿Te gusta esta voluntad - incluso si esto es un número entero, esta voluntad
debe multiplicarse correctamente.
Toda la multiplicación funcionará.
No es necesario para lanzarlo aquí.
De hecho, usted no debe lanzarlo.
>> Eso lo haría -
si usted desea emitir un número eso es entre 0 y 1 -
un número al azar, un punto flotante -
entonces o bien ser sólo 0 o 1, de modo si no se pierden todos los que la precisión.
Pero al final, cuando regrese, se pone automáticamente
envió como un entero.
Así que usted no tiene que hacer que echando a ti mismo.
>> Así que esta era la respuesta a que se trate, el número 7.
¿Alguna otra pregunta sobre Cuestionario 0?
Sí, Annie.
>> ANNIE: ¿Cuándo usamos recursivo -
cuando usamos bucles iterativos?
>> JASON HIRSCHHORN: Cuando usted utiliza recursivo - de modo más general, la
pros y los contras de la recursividad frente un enfoque iterativo.
¿Alguien puede ofrecer un profesional o una estafa?
¿Por favor?
No puede nadie.
¿Quién puede ofrecer un profesional o una estafa?
>> [Crujido PAPEL]
>> ESTUDIANTE 1: recursiva es menos codificación - teclear menos?
>> JASON HIRSCHHORN: Así que en general, recursividad en especial, una función -
o un algoritmo como fusión tipo - que se presta
a un enfoque recursivo -
podría ser más sencillo para codificar de forma recursiva.
Y así más sentido hacerlo de forma recursiva.
Así que sería un profesional de la recursividad.
¿Otros?
¿Sí?
>> Estudiante 2: Con para la recursividad -
Utiliza más memoria.
>> JASON HIRSCHHORN: Entonces, ¿la derecha.
Una función recursiva mantendrá añadiendo marcos de pila a la pila.
Así que si usted está trabajando en un montón de números, y tienen que llamar a este
funcionar mucho, entonces sin duda ocupan más memoria, mientras que
un enfoque iterativo pondrá solamente un marco de pila en la pila, porque
todo sucede dentro de una función.
>> Cualquier otro pros y los contras?
Sí.
>> ESTUDIANTE 3: Pros de la recursividad.
Usted no tiene que determinar en avanzar en el número de veces que el
código tenía que ser repetido.
Usted puede tener un número predeterminado de veces que usted tiene que repetir, entonces
recursividad es mejor, porque que se necesita ese resultado.
>> JASON HIRSCHHORN: Creo que eso es cierto.
Pero creo que en ambos casos lo haría nunca -
usted probablemente obtener alguna entrada del usuario.
O esta función tendría alguna entrada que determinaría el número de veces que
debe ejecutar.
Así que en general, no lo harías codificar - incluso en un enfoque iterativo - how
muchas veces que bucle debería correr.
>> ¿Tuviste otra eras pensando, Annie?
Aceptar.
Así que estos son probablemente los dos -
el mayor pro y el mayor Con para una recursiva frente
un enfoque iterativo.
Aceptar.
Algo más sobre Cuestionario 0?
>> Vamos a pasar.
File I / O. Hay un maravilloso corto esta semana en el archivo de E / S que se espera
usted ha visto múltiples veces, y admirado.
Una gran cantidad de trabajo fue en eso, y no tengo oído es increíblemente servicial.
También incluí el enlace en esta diapositiva, en caso de que usted no ha tenido un
oportunidad de verlo 10 veces.
>> Por lo tanto, vamos a repasar brevemente la principales pasos para abrir y trabajar
con los archivos y, a continuación vamos a sumergirse en un problema de codificación antes de
examinando el conjunto de problemas.
Así que de nuevo, me voy a poner esto en la pantalla, pero yo voy a hablar de
sólo un minuto acerca de lo que estamos hace aquí con el archivo I/O--
¿Qué significa eso?
>> Eso significa que podemos crear nuestra programas y, a continuación, tener nuestros programas
salida, y no han hecho ningún impacto en el mundo exterior de nuestro programa.
Pero cuando empezamos a trabajar con archivos - tanto su lectura y la creación de
ellos - podemos tener algún efecto sobre la mundo exterior de nuestro programa.
>> Al igual que si Microsoft Word no pudo para que todos los documentos de Word, a continuación,
una vez que Microsoft Word dejar de fumar, la totalidad de su trabajo se ha ido, y sería
realmente inútil.
Nosotros, en última instancia queremos ser capaces de escribir programas que pueden afectar a la
mundo que les rodea, tanto mediante la adopción de entradas complejas - en términos de archivos y
a través de archivos, y también la creación interesante y salidas de peso -
en cuanto a los diferentes tipos de archivos.
>> Así que es por eso que estamos empezando a aprender a trabajar con los archivos.
Más específicamente, ¿qué lo que hacemos es la siguiente.
Es muy simple.
Sólo hay un par de pasos, y que se enumeran aquí en este código.
Así que vamos a ir a través de este código línea por línea.
>> En primer lugar, se ve resaltado -
cuando se trabaja con un archivo, independientemente del tipo de archivo se trata,
usted necesita para abrirlo.
Y es que con una llamada a fopen -
aquí mismo.
Incluya el nombre del archivo.
Si el archivo no está en el directorio, o la carpeta donde este programa
vida, entonces también tienen que incluir una ruta en la que archivo es.
>> Vamos a suponer que esta archivo llamado "text.txt" -
un documento de texto simple - se encuentra en la misma carpeta que este programa es.
Así que esa es otra cosa a tener en mente - que si desea abrir un archivo
en otro lugar, que realmente necesita para incluir su ubicación.
>> En segundo lugar, usted puede pasar un argumento a fopen, y eso es lo que quieres hacer
con el archivo.
Hay tres argumentos principales que usted va a pasar a fopen.
¿Quién me puede dar los tres?
¿Quién me puede dar uno de ellos?
Sí.
>> Estudiante 4: El nombre del archivo?
>> JASON HIRSCHHORN: Lo siento.
Tres argumentos principales que se pueden pasar como segundo argumento a fopen.
Tienes razón - el nombre del archivo es el primer argumento.
Pero el segundo argumento a fopen son generalmente tres cuerdas, y - sí.
Aleja.
>> ALEJA: A para anexados.
>> JASON HIRSCHHORN: A, si quieres anexar a un archivo que ya existe.
>> ESTUDIANTE 5: R para leer.
>> JASON HIRSCHHORN: R, si quiera leer desde un archivo.
>> ESTUDIANTE 6: W para escritura.
>> JASON HIRSCHHORN: Y w, si quiero escribir en un archivo.
Así que en este caso, estamos escribiendo al archivo, por lo que tenemos w.
Lo abres, usted también tiene que guardar el archivo en algún lugar, y eso es con la
código para el lado de la mano izquierda de el operador de asignación -
Estoy creando un puntero a un archivo llamado, en este caso, el archivo.
>> Nosotros no nos vamos a preocupar de lo esta todo en mayúsculas cosa FILE es.
Baste decir, que es un largo corriente de ceros y unos.
Y así es como vamos a operar y entenderlo.
>> Lo siguiente que tenemos que hacer - y esto es muy importante -
cada vez que abra un archivo -
de hecho, cada vez que se llama a malloc, por ejemplo, y conseguir un poco de memoria y tratar de
y guardarlo en un puntero, siempre que desee comprobar para asegurarse de que de que
función no volvió nulo.
>> Así que en este caso, estamos comprobando que hacer Asegúrese de que realmente abrió la
archivo correctamente, y había ningún error en nuestro programa.
A continuación, una vez que hemos comprobado para asegurarse que tenemos un archivo de trabajo, podemos
escribir o leer, o agregar en el archivo.
En este caso, simplemente estoy imprimiendo una línea a este archivo.
>> ¿Cómo lo sé?
Bueno, estoy usando esta función llamada fprintf.
Todas las funciones que va a utilizar al escribir o leer desde o
la manipulación de archivos será similar al funciones que has visto antes, pero
comenzar con la letra F, de pie para archivo.
Y fprintf, a diferencia de nuestra normal de impresión aplicación, toma un argumento adicional,
y que es el archivo donde se que desee imprimir esta línea.
>> Yo no tengo nada que el derecho de los ohai.
Yo no tengo la tercera argumento de printf -
o el segundo argumento de printf, el tercer argumento a fprintf, porque
no tienen los marcadores de posición aquí.
No estoy incluyendo cualquier variable.
Pero, de nuevo, fprintf y todos estos archivos funciones que operan con archivos
en general se va a necesitar el archivo en la que están operando.
>> Finalmente, la última cosa importante a hacer es cerrar el archivo, al igual que
con - siempre que malloc algo, queremos liberar algo, no sea que nos
tener una pérdida de memoria - que queremos para cerrar nuestro archivo.
Si este programa salió sin cerrar el archivo, las probabilidades son nada iría
mal, especialmente si se era un pequeño archivo.
>> Pero sin duda es un buen estilo de codificación y practicar siempre cierre su archivo
cuando haya terminado de utilizarlo.
Así que eso es lo básico de archivo de E / S. Usted probablemente ha visto esto antes, o
vimos que en ese fantástico corto.
¿Alguien tiene alguna pregunta, antes de entramos en una cierta codificación práctica
problemas, sobre archivo de E / S o el pasos yo nos fuimos de nuevo?
>> [PULSA SOUNDS]
>> JASON HIRSCHHORN: ¿Tiene usted tiene una pregunta, Avi?
>> AVI: No.
>> JASON HIRSCHHORN: OK.
Voy a esperar otro Siete segundos.
[Risas]
Esa es una muy buena propina.
Ustedes simplemente no les gusta haciendo preguntas.
Eso está bien.
Aceptar.
Así que nuestro problema es la primera práctica, estamos va a duplicar la función de
una herramienta de línea de comandos que probablemente utilizado antes - copia -
la herramienta de copia.
Si escribe cp y luego pasarlo dos argumentos en su terminal, puede
copiar un archivo.
Y eso es lo que vamos para escribir en estos momentos.
>> Así que de nuevo, la lectura fuera de esta diapositiva, me a escribir un programa que toma
dos y sólo dos de línea de comandos argumentos -
un archivo de origen y un archivo de destino -
y copia el contenido de la fuente presentar al archivo de destino
un byte a la vez.
Así que eso es mucho pedir.
>> Una vez más, un buen método para esto es No ir directamente al código C, pero
descomponerlo en un par de pasos.
En primer lugar, pensar en la lógica - exactamente lo que te estoy pidiendo que hagas -
y comprender la totalidad de la pasos a este problema.
No se encuentra en C, sólo en algunos pseudocódigo, o incluso un modelo mental de
¿qué está pasando.
>> A continuación, una vez que tenga el pseudocódigo abajo, averiguar cómo el pseudocódigo
mapas en las herramientas y las cosas que hemos aprendido a usar en C.
>> Y, por último, una vez que tenga todo lo que juntos, puede codificar el problema.
Tome 5 a 10 minutos a trabajar en este problema.
Voy a poner las instrucciones una copia de seguridad en un segundo.
Y luego vamos a ir más el pseudocódigo, y el código
que viven como un grupo.
>> Si usted tiene alguna pregunta mientras estás trabajando en esto, no dude en plantear
tu mano, y vendré alrededor y responderlas.
>> ESTUDIANTE 7: ¿Puedo deslizar un pedazo de papel?
>> JASON HIRSCHHORN: ¿Qué pasa?
>> [PULSA SOUNDS]
>> JASON HIRSCHHORN: OK.
Vamos a repasar el pseudocódigo primero, y entonces yo te voy a dar un par más
minutos para terminar la codificación.
>> ¿Quién quiere empezar me off con la primera línea de
pseudocódigo para esta función?
>> ESTUDIANTE 8: Revise para asegurarse de que le dieron dos archivos.
>> JASON HIRSCHHORN: OK.
Y si no lo somos?
>> ESTUDIANTE 8: Yo regresaría 0.
>> JASON HIRSCHHORN: Si volvemos 0?
>> ESTUDIANTE 8: Regreso a -
supresión.
Lo siento.
>> JASON HIRSCHHORN: Si.
Probablemente no es 0.
Debido a 0 significa que todo estaba bien.
Aceptar.
Así que esa es la primera línea de pseudocódigo.
¿Quién tiene la segunda línea de pseudocódigo?
>> ESTUDIANTE 9: Abierto tanto a los archivos?
>> JASON HIRSCHHORN: Abra ambos archivos.
¿De acuerdo?
>> ESTUDIANTES 10: Compruebe si el archivo es NULL?
>> JASON HIRSCHHORN: Compruebe de que ni son NULL.
Como acotación al margen -
slash 0 -
es que NULL?
>> ESTUDIANTES 11: No.
>> JASON HIRSCHHORN: Eso no es NULL.
Eso se llama el terminador NULL.
En realidad se escribe con una sola l.
Así que comprobar algo en contra de eso - eso es en realidad un personaje -
así que el revisar algo en contra de que se no es igual que la comprobación para ver si
es igual a NULL.
>> Y algunas personas -
en sus pruebas y su problema juegos - tienen la
dos de los confundidos.
Pero los dos de ellos son de hecho diferentes.
Uno termina una cadena -
uno es un puntero a 0.
>> ESTUDIANTES 12: ¿Por qué no le echa a asegurarse de que los archivos no son NULL
antes de abrirlos?
>> Así ahorra abierta: JASON HIRSCHHORN algo en ese archivo.
Y si vuelves aquí -
por lo que esta línea - fopen -
le dará una dirección y tienda esa dirección en archivo si funciona.
Si no funciona, almacenará NULL -
>> ESTUDIANTES 12: Oh.
Aceptar.
Te tengo.
>> JASON HIRSCHHORN: En el archivo.
Así que no puedes comprobar NULL antes de que usted los haya abierto.
NULL significa algo que no hizo trabajar correctamente.
Aceptar.
Así que asegúrese de no decir?
¿O?
¿Qué pensamos?
Vamos a ir con eso.
>> ESTUDIANTES 13: Es.
>> JASON HIRSCHHORN: ¿Es?
Tampoco es?
>> ESTUDIANTES 13: Es.
>> JASON HIRSCHHORN: OK.
Parece que tenemos un poco de consenso sobre eso.
Tampoco es NULL.
Bueno, la próxima línea de pseudocódigo.
¿Quién no me ha dado una línea todavía?
Vamos a esperar para usted.
Sí.
>> ESTUDIANTES 14: Hay que leer desde el primer archivo?
>> JASON HIRSCHHORN: OK.
>> ESTUDIANTES 14: O utilizamos fscanf o algo así como que el primer archivo?
>> JASON HIRSCHHORN: Así que queremos leer desde el primer archivo y -
vamos a poner que justo aquí.
Leer desde el archivo de origen.
Y entonces, ¿qué hacemos después de que leer desde el archivo de origen?
Alguien más?
>> ESTUDIANTES 15: Escribir en el archivo de destino?
>> JASON HIRSCHHORN: Le escribimos para el archivo de destino, y -
Aceptar.
¿Qué más nos falta?
Alguien más que no me ha dado un línea de código sin embargo - de pseudocódigo.
Sí.
>> ESTUDIANTES 16: Tal vez siempre se puede comprobar si hay algo que leer para,
como la siguiente línea?
Que son como la línea siguiente, ver si existe.
>> [ELECTRÓNICA BEEP]
>> JASON HIRSCHHORN: Vaya.
Esa es mi software de diario.
¿Sí?
>> ESTUDIANTES 16: Así es.
>> JASON HIRSCHHORN: Así que dar a mí una vez más.
>> ESTUDIANTES 16: Compruebe si hay siendo una próxima línea de la
archivo de fuente para leer.
>> JASON HIRSCHHORN: OK.
Así que no estamos leyendo las líneas - estaban leyendo bytes aquí -
pero estás en lo correcto.
Queremos leer y escribir hasta no existen más bytes.
Aceptar.
Y lo que estos deben ser realmente sangría un poco, porque están ahí abajo.
¿Cierto?
Hasta que no estamos fuera de bytes, que vamos a leer desde el archivo de origen y escribir
al archivo de destino.
>> Y entonces, ¿qué es lo último línea de pseudocódigo?
Alguien que no es dado mí algo todavía.
>> ESTUDIANTES 17: Cierre los archivos?
>> JASON HIRSCHHORN: Exactamente.
Cierre los archivos.
Así que ahí está nuestro pseudocódigo.
Voy a poner el pseudocódigo en gedit, y en un par de minutos que
cifrará esto juntos.
>> Aceptar.
Vamos a empezar como un grupo.
Nishant, tengo mi nuevo archivo.
Acabo de abrir esto.
Untitled document 1.
¿Qué es lo primero que debo hacer?
>> NISHANT: Incluya las bibliotecas?
>> JASON HIRSCHHORN: OK.
¿Qué bibliotecas?
>> NISHANT: stdio.h, stdlib.h, creo?
>> JASON HIRSCHHORN: OK.
¿Qué es stdlib para?
>> NISHANT: se me olvidó.
>> JASON HIRSCHHORN: OK.
Así incluir stdio.
¿Qué debo hacer antes incluso de Empiezo codificación?
>> NISHANT: Escribe un encabezado?
>> JASON HIRSCHHORN: ¿Cómo Qué debo hacer para que color?
>> [VOCES interponiendo]
>> NISHANT: ¿Cómo conseguir que color?
>> JASON HIRSCHHORN: ¿Cómo Qué debo hacer para la codificación de colores?
>> NISHANT: No sé.
Oh.
Guardar.
>> JASON HIRSCHHORN: Save.
Sí.
Debería guardarlo como un archivo. C.
Así que guardarlo en el escritorio como cp.c.
Sweet.
Y si quiero conseguir el estilo completo puntos, lo que habría de hacerlo
incluir en la parte superior?
>> NISHANT: Se puede escribir su nombre, nombre del programa, y ​​el propósito
del programa así?
>> JASON HIRSCHHORN: Tiene buena pinta.
Excelente.
Así que nos has empezado perfectamente.
# Include -
nosotros también vamos a escribir -
Aceptar.
Así que creo que todo lo que estoy listo para ir.
¿Quién tiene la primera línea de código para mí - o las primeras líneas de código que
que se necesita para satisfacer nuestra primera comentar en pseudocódigo?
Usted.
>> ESTUDIANTES 18: ¿No debería ser int argc, y luego char * argv?
>> JASON HIRSCHHORN: Creo que tienes razón.
Vamos a cambiarlo a int principales, paren abiertas, int argc, coma, char * argv?
Al igual que?
>> ESTUDIANTES 18: Soportes.
>> JASON HIRSCHHORN: Soportes.
Soporte Abrir, cerrar el paréntesis, cerca de los padres.
Perfect.
Ahora puedo tomar argumentos de línea de comandos.
Aceptar.
Asegurarnos de que nos dan dos archivos.
Usted me puede dar eso también.
>> ESTUDIANTES 18: Si argc -
éste no es igual a 3.
>> JASON HIRSCHHORN: Si paren abiertas argc no es igual a 3?
>> ESTUDIANTES 18: Sí, regrese 1 ni nada.
>> JASON HIRSCHHORN: Lo siento.
>> ESTUDIANTES 18: Retorno 1 ni nada.
>> JASON HIRSCHHORN: Vuelta 1.
¿De acuerdo?
Grande.
Abra ambos archivos.
¿Quién puede ayudarme a abrir ambos archivos?
¿Quién no me ha dado el código todavía?
Kurt?
>> KURT: Así que todas las tapas de origen estrella F-I-L-E.
>> JASON HIRSCHHORN: Voy para sacar las vocales.
Esos son cool.
Es como Tumblr.
>> ESTUDIANTES 18: igual a fopen -
>> JASON HIRSCHHORN: igual a fopen?
>> ESTUDIANTES 18: paren Abiertas, argv, soporte abierto.
>> JASON HIRSCHHORN: Espera.
Lo siento.
Paren en Abrir.
Aceptar.
>> ESTUDIANTES 18: Así es.
Argv sub 1.
>> JASON HIRSCHHORN: Sub 1?
>> ESTUDIANTES 18: Así es.
Argv paréntesis abierto 1 -
Sí.
Y luego coma y haga doble abierta cita, r, comillas dobles,
cerca paren, y coma.
>> JASON HIRSCHHORN: Sweet.
Y ¿qué pasa con el otro?
>> ESTUDIANTES 18: Muy similar, pero en lugar de S-R-C, que se dice que D-S-T.
>> JASON HIRSCHHORN: Oo!
Me gusta eso.
>> ESTUDIANTES 18: Sólo D-S-T. Sí.
Y entonces argv, soporte abierto, 2.
Sí.
Y entonces w en lugar de r.
Sí.
>> JASON HIRSCHHORN: Muy bien.
Siguiente par de líneas.
Además, si alguien tiene cosas que añadir a líneas que hemos hecho, no dude en
añadir esos también.
Asegúrese de que no es NULL.
¿Quién me puede dar el código que necesito satisfacer esa línea de pseudocódigo?
Archer.
>> ARQUERO: Si el original es igual a los iguales NULL o dst es igual a los iguales
NULL, entonces regresa -
>> JASON HIRSCHHORN: ¿Qué?
>> ARQUERO: Return 2?
>> JASON HIRSCHHORN: Return 2.
Así que si src paren abierto es igual a es igual a NULL, o -
lo que thing's - pipa?
Pipe?
Lo llamaremos tubería.
Tubería, tubería, dst es igual a los iguales NULL, devuelve 2.
¿De acuerdo?
Hasta que no estamos fuera de bytes -
que tipo de saltamos este paso de la parte pseudocódigo para ir a aquí.
>> Pero hasta que estemos fuera de bytes - lo que hace que el sonido tiene?
¿Qué tipo de estructura C -
pero yo no uso la palabra estructura, porque vamos a empezar a utilizar
que en otros casos -
pero la herramienta C suena eso?
>> ESTUDIANTES 19: Un bucle.
>> JASON HIRSCHHORN: Un bucle.
Suena como un bucle.
Entonces, ¿quién me puede dar la primera línea del código del bucle aquí?
También puede elegir qué tipo de bucle que desea, si me das
esta línea de código.
Hay tres tipos.
Te dan a elegir.
Yo sugeriría una de esas.
Avi.
¿Qué quieres?
>> AVI: FOR.
>> JASON HIRSCHHORN: FOR.
>> AVI: int i es igual a cero.
>> JASON HIRSCHHORN: OK.
>> AVI: Esta parte no estoy seguro.
Pero i es menor que el tamaño de la fuente de estrella?
No estoy seguro de eso.
>> JASON HIRSCHHORN: OK.
>> AVI: Debido a que usted desea que el tamaño de un archivo, ¿no?
>> JASON HIRSCHHORN: Así que esto probablemente no lo hará nos dan el tamaño de la actual
archivo en bytes.
Entonces, ¿qué otra cosa podíamos hacer?
¿Qué otro tipo de bucle?
¿O debemos seguir con el bucle PARA?
>> ESTUDIANTES 20: ¿Puedes un bucle WHILE?
Y entonces, lo que haría es you'd -
porque tenemos un char * para el archivo.
Así que si sólo seguimos incrementando que hasta que nos íbamos a encontrar el carácter NULL en
Al final de la misma?
O no, es que no se como funcionan los archivos?
>> JASON HIRSCHHORN: Así podemos mantener incrementando el char *
hasta que encontremos el NULL -
>> ESTUDIANTES 20: mantener Esencialmente ir carácter a carácter hasta que llegamos a
el final del archivo.
>> JASON HIRSCHHORN: Si.
Así que eso es lo que queremos hacer.
Queremos seguir leyendo, carácter por su carácter, hasta llegar a
el final del archivo.
>> ESTUDIANTES 20: Así es.
Encontrar -
¿cuál es el fin o la señal de stop al final de un archivo de texto.
>> JASON HIRSCHHORN: OK.
Así que cuando llegamos al final del archivo - ¿cómo sabemos que hemos llegado
el final de un archivo?
Si estoy llamando -
así que vamos a dar un paso atrás.
¿Qué es una función?
Vamos a ir a esta línea aquí.
Leer desde el archivo de origen.
¿Quién me puede dar esa línea de código?
>> ESTUDIANTES 21: fscanf?
>> JASON HIRSCHHORN: fscanf.
Aceptar.
¿Qué pasa si quiero leer, muy específicamente, un byte?
>> ESTUDIANTES 21: No sé.
>> JASON HIRSCHHORN: OK.
Incluso más simple que fscanf - lo que es una -
Quiero leer de un archivo de origen?
Leer de un archivo de origen.
¿Qué es una función - sí.
>> ESTUDIANTES 22: Es fread?
>> JASON HIRSCHHORN: Fread.
Creo que vamos a seguir con que uno por ahora.
¿Qué tipo de argumentos embargo, toma fread?
>> ESTUDIANTES 22: Probablemente el tipo de archivo, y luego ubicación en el archivo?
>> JASON HIRSCHHORN: ¿Qué puedo escribir aquí para averiguar qué tipo de argumentos
fread necesita?
>> ESTUDIANTES MÚLTIPLES: Hombre fread.
>> JASON HIRSCHHORN: Hombre fread y fwrite.
Parece que pasar el rato juntos.
Así fread toma cuántos argumentos?
>> ESTUDIANTES 23: Cuatro.
>> JASON HIRSCHHORN: Se necesita cuatro argumentos.
Se necesita un puntero, un tamaño, y que cosa, lo cual es raro, y algunos archivos.
¿De acuerdo?
Vamos a leer sobre ello aquí.
"La función fread lee n memb elementos de datos, cada uno de bytes de tamaño
de longitud, desde el flujo apuntado por transmitir, almacenándolos en la ubicación
dada por el puntero ".
>> Así que cuatro argumentos.
¿Por qué no puedo simplemente copiar esto, y pegarlo aquí.
Aceptar.
Entonces, ¿quién puede empezar a llenar estos argumentos para mí?
Avi.
>> AVI: Saque el vacío.
Ponga simplemente src.
Saque puntero y la estrella.
Coloque el original.
Entonces -
>> JASON HIRSCHHORN: Así que voy a dejar de Estás ahí, porque eso es incorrecto.
Tienes razón con el original, pero donde src debería ir?
>> [VOCES interponiendo]
>> JASON HIRSCHHORN: debe ir por aquí.
Ese es el src - nuestra src es un tipo.
Echemos un vistazo aquí.
Esto es pedir para un tipo FILE *, que en realidad suele verlos así.
Así que esto es pedir un argumento de Tipo de archivo * llamado arroyo que es el original.
¿De acuerdo?
>> ¿Qué tamaño de las cosas hacen queremos leer?
Yo te di esto en el descripción del problema.
>> ESTUDIANTES 24: Un byte a la vez.
>> JASON HIRSCHHORN: Un byte.
¿Qué tan grande es un byte?
Su tamaño es en bytes, así que lo que puedo poner ahí?
>> ESTUDIANTES 25: Primero.
>> JASON HIRSCHHORN: Primero.
Derecha.
Su tamaño se encuentra en la unidad de bytes, de modo 1 es de 1 byte.
¿Cuántos no quiero leer a la vez.
>> ESTUDIANTES 26: One?
>> JASON HIRSCHHORN: Una de las cosas.
Quiero leer una cosa de tamaño 1, un bocado a la vez.
¿Y dónde lo pongo, una vez que lo leo?
>> ESTUDIANTES 27: Destino?
>> JASON HIRSCHHORN: Así que no puedo poner en línea recta en destino.
>> ESTUDIANTES 28: Eres a poner en un tercer puntero?
>> ESTUDIANTES 27: Para el destino.
>> JASON HIRSCHHORN: OK.
Sí.
>> ESTUDIANTES 29: Se puede declarar algo que actuar como un almacenamiento temporal anterior.
>> JASON HIRSCHHORN: OK.
Dame eso.
>> ESTUDIANTES 29: Otro archivo puntero, tal vez?
>> JASON HIRSCHHORN: OK.
Así que esta es nula estrellas -
que es un tipo void estrella, por lo que no hace tiene que ser un apuntador de archivo.
Y si estoy leyendo un byte, donde sería un buen lugar
para almacenar un byte?
>> ESTUDIANTES 29: Una matriz?
>> JASON HIRSCHHORN: Una matriz.
Aceptar.
¿Y qué otra cosa es algo que es sólo el tamaño de un byte?
>> ESTUDIANTES 30: Un char *?
>> ESTUDIANTES 29: Así es.
>> JASON HIRSCHHORN: Un char * no es de un byte.
>> ESTUDIANTES 29: A car.
>> JASON HIRSCHHORN: Un char es un byte.
¿Cierto?
Así que vamos a llamar a este buffer es un genérico nombre usado para estas cosas que almacenar
algo temporal.
Así que creo un búfer.
¿Cierto?
Pero hace falta ser un void *.
Así que tal vez tienes razón, que debe ser un tampón de tamaño 0.
Así que almacena uno -
derecha.
>> Debido a que esta aquí - Char buffer es un personaje, pero
esto toma un void * -
un puntero.
Así que yo podía hacer esto y ahora tampón es un puntero.
¿Qué otra cosa podía hacer?
>> ESTUDIANTES 31: Ponga una estrella junto a char.
>> JASON HIRSCHHORN: pude han creado char *.
Aceptar.
¿Cuál es otra cosa que podía hacer?
¿O vamos a ir con éste.
Char * buffer, así que lo que Cómo puedo poner aquí?
>> ESTUDIANTES 31: Buffer.
>> JASON HIRSCHHORN: Buffer.
Buffer es un puntero a un char.
Y en ese lugar, estamos poniendo un byte de algo que hemos leído.
Sí.
Avi.
>> AVI: Sólo una pregunta rápida.
¿Quieres malloc tampón?
>> JASON HIRSCHHORN: ¿Quién puede responder a esa pregunta?
>> ESTUDIANTES 32: Bueno, en realidad no punto a nada en este momento, por lo que -
>> JASON HIRSCHHORN: Pero hacer queremos malloc él?
>> ESTUDIANTES 32: Si se va a hacer de esa manera, supongo, sí, porque lo que se necesita
un lugar para que apunte a.
>> JASON HIRSCHHORN: ¿Tenemos que malloc él?
>> ESTUDIANTES 33: Si usted va a usarlo fuera del bucle.
>> JASON HIRSCHHORN: ¿Vamos a utilizarlo fuera del bucle?
>> ESTUDIANTES 34: Si.
>> ESTUDIANTES 35: Espera.
¿Queremos declarar en el bucle hasta más allá?
>> JASON HIRSCHHORN: Así que supongo que tenemos algunos seudo bucle WHILE aquí donde estamos
tratando de averiguar, que no hemos llegado a todavía.
No necesitamos a malloc ella.
Estamos operando en el principal, que sólo va para ser utilizado dentro de este bucle.
No tiene por qué existir , fuera de esta.
>> Así que puede ser una variable local.
Usted tiene un puntero a una variable local.
>> ESTUDIANTES 36: Pero no es apuntando a nada.
>> JASON HIRSCHHORN: No, no lo es inicializado a nada.
Pero no vamos a utilizarlo también.
Vamos a poner algo en es la primera vez que lo utilizan.
Así que parece que está bien.
Así que no necesitamos malloc aquí.
Y creo que está bien como está.
Aceptar.
Tenemos la línea fread.
Vamos a hacer la siguiente línea.
>> Si queremos escribir en un archivo, lo que es una buena función a utilizar para hacer eso?
>> ESTUDIANTES 37: fwrite?
>> ESTUDIANTES 38: fprintf?
>> JASON HIRSCHHORN: fprintf es uno.
¿Qué otro?
>> ESTUDIANTES 39: fwrite.
>> JASON HIRSCHHORN: fwrite.
Y para nuestros propósitos, fwrite, que hemos visto aquí, es
probablemente la mejor opción.
Lleva cuatro argumentos también.
Nishant, le puede dar me los argumentos?
>> NISHANT: El primer curso de una ser sólo tampón.
>> JASON HIRSCHHORN: OK.
>> NISHANT: El segundo de sólo va a ser 1.
En tercer lugar uno va a ser 1.
Y el cuarto va a ser el horario de verano.
>> JASON HIRSCHHORN: ¿Alguien tiene alguna pregunta acerca de esa línea?
Eso se ve bien.
Aceptar.
Así que ahora parece que lo único que estamos faltante - en realidad, vamos a escribir
esta última línea.
Cierre los archivos.
¿Quién puede acabar con nosotros a la escritura estas dos últimas líneas?
Sí.
Lo sentimos, ¿cómo te llamas?
>> LUCY: Lucy.
>> JASON HIRSCHHORN: Lucy.
>> LUCY: src fclose y luego destino fclose.
>> JASON HIRSCHHORN: fclose, paren abierta, src, cerca paren, punto y coma.
Y fclose -
¿si?
>> LUCY: Abrir paréntesis, dst y luego por punto y coma.
>> JASON HIRSCHHORN: Muy bien.
¿Y qué tengo que incluir al final?
>> LUCY: Devuelve 0.
>> JASON HIRSCHHORN: Devuelve 0.
¿Tengo que hacerlo?
Sólo una pregunta.
¿Tenemos que incluir la rentabilidad 0?
>> ESTUDIANTES MÚLTIPLES: No.
>> JASON HIRSCHHORN: No.
Principal lo hace automáticamente si se llega a la final.
Pero creo que es bueno incluir de forma explícita.
Sobre todo cuando estamos volviendo otra cosas a lo largo del programa.
Aceptar.
Esto es lo que nos falta -
MIENTRAS qué?
¿Quién puede pensar en alguna -
tiene un cierto sentido de lo que las cosas podría entrar ahí?
Incluso si es sólo en algunos pseudocódigo como el lenguaje?
>> ¿Qué somos en realidad - lo que Qué queremos ir hasta?
Sí, Lucy.
>> LUCY: El final del archivo.
>> JASON HIRSCHHORN: El final del archivo.
Entonces, ¿qué quiere usted decir con fines de archivo?
>> LUCY: Una vez que llegue a la final del archivo, para.
>> JASON HIRSCHHORN: OK.
Así que una vez que lleguemos al final del archivo.
¿Cómo sabemos si hemos llegado el final del archivo?
>> ESTUDIANTES 40: Creo búfer se establecerá en NULL.
>> ESTUDIANTES 41: Buffer se declara dentro del bucle.
>> JASON HIRSCHHORN: Así que usted piensa búfer se establece en NULL.
¿Por qué habría de búfer se establece en NULL?
>> ESTUDIANTES 40: Porque cuando fread, usted está tratando de poner
nada en la memoria tampón.
>> JASON HIRSCHHORN: OK.
Así que usted está pensando fread -
cuando hemos llegado al final de la archivo, lo que se fread va a hacer?
Creo que esa es la cuestión lo que tenemos que averiguar.
¿Qué hace fread?
¿Pone NULL en tampón o Qué hacer otra cosa?
¿Cómo podemos averiguar lo que hace?
>> ESTUDIANTES 42: Hombre.
>> JASON HIRSCHHORN: Hombre.
Así que echemos un vistazo por aquí.
Valor de retorno.
En caso de éxito, fread y fwrite devolver el número de artículos leídos o escritos.
Este número es igual al número de bytes transferido sólo cuando el tamaño es 1.
Si se produce un error, o el extremo de la se alcanza archivo, el valor de retorno es un
número de elementos a corto o 0.
>> Así que para nuestros propósitos, si alcanza fread el final del archivo, y lee desde
al final del archivo, no hay nada a la izquierda para leer, ¿qué va a volver?
>> ESTUDIANTES 43: Zero?
>> JASON HIRSCHHORN: ¿Qué?
>> ESTUDIANTES 43: Zero?
>> JASON HIRSCHHORN: Zero.
Se va a volver a cero.
Así que sabemos que fread, cuando hemos alcanzado el final del archivo, que está pasando
para volver a cero.
¿Cómo podemos usar eso a nuestro favor?
>> AVI: Puede declarar una variable fuera del bucle de llamada de verificación.
Si el control es igual a -
por ahora - uno.
>> JASON HIRSCHHORN: OK.
>> AVI: Y entonces usted puede poner un IF declaración de la derecha después de fread diciendo que si
fread es igual a cero -
No.
>> JASON HIRSCHHORN: ¿Quién puede ayudar a Avi?
>> AVI: ¿Cuál es el valor devuelto por fread?
>> JASON HIRSCHHORN: Acabamos se fue por arriba de eso.
>> AVI: ¿Cómo se representa esto?
>> JASON HIRSCHHORN: Así que regresa - vamos a mirar hacia arriba aquí - devuelve una
size_t, que es esencialmente un número entero.
Por lo tanto, devuelve un entero.
Y en nuestro caso, lo hará devuelve 1 o 0 -
1 si dijera una cosa - un byte, y 0 si hemos llegado al final.
Así que si fread -
¿si?
>> ESTUDIANTES 45: No se puede simplemente poner la plena fread (tampón, 1, 1, SRC) en el
while?
>> JASON HIRSCHHORN: Así que usted propone haciendo esto en allí?
>> [VOCES interponiendo]
>> JASON HIRSCHHORN: Espera.
Así que estamos librando de eso.
Así que usted está proponiendo poner fread en allí?
¿Qué debemos también mover si quieres hacer eso?
>> ESTUDIANTES 45: El buffer exterior.
>> JASON HIRSCHHORN: Deberíamos también mover esto hacia fuera aquí.
>> ESTUDIANTES 45: ¿Pero que constantemente moverlo hacia adelante?
>> [VOCES interponiendo]
>> JASON HIRSCHHORN: OK.
Así que esto es lo que Okshar propuso.
Creamos nuestro buffer.
Nos fread MIENTRAS, entonces llamemos fwrite.
Los pensamientos sobre esto?
>> ESTUDIANTES 46: Mi única pregunta es, ¿lo haría que en realidad ejecuta el comando fread?
>> JASON HIRSCHHORN: Muy buena pregunta.
Cuando usted está poniendo una llamada a la función en el interior de una condición, que hace
llamada a la función ejecutar?
Hemos visto ejemplos de esto antes.
¿Cierto?
>> ESTUDIANTES 46: OK.
Sí.
Así lo hace ejecutar.
>> JASON HIRSCHHORN: Hemos visto cosas así antes, donde tenemos una
llamada de función dentro de una condición.
¿Se ejecuta dicha llamada de función?
Sí.
Así que la respuesta es sí.
Esta llamada a la función se ejecutará.
Pero de nuevo, ¿es lo que queremos?
>> ¿Cuál es una manera de que pudiéramos averiguar si eso es lo que queremos?
>> ESTUDIANTES MÚLTIPLES: Ejecutar esto?
>> JASON HIRSCHHORN: Podríamos ejecutarlo.
Pero antes de hacer eso, podríamos También razonar a través de este.
Si -
digamos que tenemos un byte en nuestra archivo, vamos a llegar a aquí,
vamos a llegar a este código.
Esto ejecutará.
fread devolverá un byte y almacenarlo en la memoria intermedia.
Y esto va a evaluar a 1, derecho, después de su regreso 1.
>> Así, mientras que 1.
¿Significa eso que el código dentro El bucle while se ejecutará?
>> ESTUDIANTES 47: Así es.
Es cierto.
>> JASON HIRSCHHORN: Si.
1 es verdadera.
No es 0.
Así que el código dentro de aquí se ejecutará.
Así que vamos a escribir eso.
Vamos a pasar de nuevo a este línea una vez más.
Ahora que tenemos -
estamos en el final de nuestro archivo.
Leemos en el final de nuestro archivo, porque sólo tenía un byte en el mismo.
>> Fread devuelve 0, tiendas algo en tampón.
Sinceramente, no sé qué almacena en la memoria intermedia.
Probablemente podríamos mirar hacia arriba para ver lo que hace.
Eso, sinceramente, no lo sé.
No sabemos a quién le importa lo que almacena en tampón?
Pero no devolverá 0.
Y se MIENTRAS 0 ejecutar?
>> MIENTRAS 0 no se ejecute.
Así que vamos a pasar por aquí.
Así que vamos a tener una votación a mano alzada si este es el código que debemos correr, o si
debe hacer cambios primero.
Así que si usted piensa - tienes que votar.
Si crees que debemos ejecutar este código como es, por favor, levanten la mano.
>> Aceptar.
Hay uno -
¿tienes una pregunta, preocupación?
Sí.
>> ESTUDIANTES 48: Después de que nos movemos búfer fuera del bucle, ¿nos
que malloc él?
>> JASON HIRSCHHORN: Muy buena pregunta.
Después nos movemos búfer fuera de la lazo, tenemos para malloc él?
Esta es una pregunta alcance.
Si inicializamos amortiguar fuera de este bucle, va a existir
en el interior del bucle?
>> ESTUDIANTES MÚLTIPLES: Si.
>> JASON HIRSCHHORN: Si.
Su ámbito de aplicación abarca el interior del bucle, y, en definitiva, cualquier cosa por debajo de ella en el interior
de este código, incluyendo el dentro de las cosas aquí.
Así que no necesitamos a malloc ella.
Es una variable local, y su alcance todavía incluye el bucle.
>> ESTUDIANTES 49: ¿Es necesario para liberarlo?
>> JASON HIRSCHHORN: ¿Tenemos necesitar búfer libre?
>> ESTUDIANTES 49: Sí, si no lo hacemos malloc.
>> JASON HIRSCHHORN: ¿Tenemos necesitar búfer libre?
No lo sabemos.
De nuevo, es una variable local, así que no tenemos que liberarla.
Aceptar.
Vamos a ver qué pasa.
Por lo que es sin inicializar.
Eso era lo que algo que Marcus propuso anteriormente.
Así tenemos que el error, variable buffer no está inicializado cuando se utiliza aquí.
>> ¿Cómo podemos solucionar este problema?
>> ESTUDIANTES 50: malloc él?
>> ESTUDIANTES 51: igual a NULL?
>> ESTUDIANTES 52: Di búfer es igual NULL.
>> JASON HIRSCHHORN: OK.
Se ve bien.
Tenemos ahora.
Vamos a crear algo para tratar de copiar.
Así que tenemos nuestro archivo de texto.
¿Cómo podemos ejecutar este programa?
Sí.
>> ESTUDIANTES 53: Puedes hacer punto slash cp, test.txt.
Y entonces usted puede nombrar a otro archivo el cual se almacenan en.
>> JASON HIRSCHHORN: OK.
Lo llamaremos out.txt.
¿De acuerdo?
Culpa Seg.
Reflexiones sobre el fallo seg?
Esto es genial.
¿Cómo podemos averiguar dónde el fallo segmento es?
¿Qué?
>> ESTUDIANTES 54: Gdb.
>> JASON HIRSCHHORN: Gdb.
Corremos gdb escribiendo slash dot gdb, el nombre de nuestro programa.
No hay argumentos de línea de comandos allí.
Vamos a establecer un punto de ruptura en principal.
Si quiero empezar gdb, ¿qué hago?
>> ESTUDIANTES 55: R.
>> JASON HIRSCHHORN: R. ¿Y luego qué?
>> ESTUDIANTES 55: Los argumentos?
>> JASON HIRSCHHORN: Entonces el argumentos de la línea de comandos.
Vamos a caminar a través.
N es sólo me lleva línea por línea.
Yo voy a ir hasta que Me sale mi culpa seg.
No es mi culpa seg.
Parece fread causado mi culpa seg.
Sé fread causó mi culpa seg, porque esa era la
la línea que acabamos de ejecutar.
>> Y la única cosa que era pasando en esa línea -
dos cosas estaban sucediendo.
Fread iba, y luego nos quedamos haciendo algunas comprobaciones WHILE.
Estoy dispuesto a apostar que la MIENTRAS comprobación no estaba causando mi culpa seg.
Lo más probable era fread causando mi culpa seg.
También veo algo aquí, memcopy.
>> Copia de la memoria.
Suena como la mudanza de memoria de un lugar a otro.
Suena como algo que ocurriría en fread, tal vez un poco de memoria
pasar de aquí hasta aquí.
Vamos a pasar por esto otra vez.
¿Cómo comienzo a lo largo y ejecutarlo de nuevo?
Sí.
>> ESTUDIANTES 56: ¿Es necesario poner un símbolo de unión antes de búfer?
>> JASON HIRSCHHORN: Así ampersand antes búfer me daría la dirección del
buffer, que es un char *.
Repasemos esto una vez más.
¿Cómo se ejecuta a través de él una vez más?
>> ESTUDIANTES 57: ¿Puede usted acaba Escriba Ejecutar de nuevo?
>> JASON HIRSCHHORN: Sólo tienes que escribir run nuevo.
Así que no vamos a ejecutar esta línea.
Así buffer es un puntero NULL.
Corrija?
Está apuntando a - vamos a ver.
Si tenemos nuestra -
hacer un dibujo rápido de esto.
¿Todos pueden ver si Yo escribo por aquí?
>> Así que en la pila, tenemos un local de variable y se llama buffer, y
que es un puntero a un char.
¿Qué es esta dirección en caracteres?
>> ESTUDIANTES 58: 0x0.
>> JASON HIRSCHHORN: Así es.
Eso es lo que es esto.
Aquí, en el interior de amortiguamiento, se almacena 0x0.
Eso es lo que tenemos - el configuración que tenemos en estos momentos.
Así que esta línea, fread, pone algo desde la fuente de dónde?
Dentro de esta caja, o de esta caja?
¿Qué caja?
Caja o cuadro de la derecha, dejando?
Este cuadro de la derecha.
>> De ello se sigue el puntero, y lo pone en aquí.
Cuando tratamos y la memoria táctil en ubicación 0, ¿qué obtenemos?
Un fallo de segmentación.
Ese es el error que tenemos en estos momentos.
Sí.
>> ESTUDIANTES 59: ¿No tienes poner búfer estrella?
¿O no?
Para fread?
>> JASON HIRSCHHORN: Así fread toma un puntero.
Por lo tanto, pasa en tampón.
Y entonces va a de-referencia que en algún lugar dentro fread.
Pero, de nuevo, vimos, se necesita un puntero.
No necesitamos pasarlo búfer estrellas.
Eso sería pasando él lo que está aquí.
Y eso probablemente nos daría un error porque estamos de-referencia a ella.
>> ¿Cierto?
Cuando nos de-referencia este puntero, cuando tratamos de acceder a este lugar,
estamos llegando a un error - nuestro fallo de segmentación.
Por lo tanto -
¡Uy.
Vamos a salir de gdb.
Nuestra línea -
nuestro problema - que es correcto aquí en esta línea.
Y es un problema porque de esta línea.
>> ¿Cómo podemos crear un cuadro que es accesible en fread.
¿Cierto?
Tenemos que crear un cuadro que es uno byte grande, el tamaño de un char.
Pero necesitamos que la caja sea accesible Cuando esta función se ejecuta.
Entonces, ¿dónde -
sí.
¿Alguna idea?
>> ESTUDIANTES 60: Sólo tienes que configurar como cualquier carácter aleatorio.
Sólo hacer iguales char buffer el carácter.
Y luego, cuando hayas amortiguar allí -
>> JASON HIRSCHHORN: Espera.
Carácter tampón?
Así que no hay estrellas?
>> ESTUDIANTES 60: Así es.
Saque la estrella.
Igual a un personaje al azar.
>> JASON HIRSCHHORN: OK.
Así que dame una.
>> ESTUDIANTES 60: Al igual que un o algo así.
Y luego, cuando usted tiene búfer allí, se utiliza un -
>> ESTUDIANTES 61: Star?
¡Oh, no, el signo.
>> ESTUDIANTES 60: Utilice el signo.
>> JASON HIRSCHHORN: OK.
¿Y qué hay en fwrite?
>> ESTUDIANTES 60: Utilice el signo más.
>> JASON HIRSCHHORN: Muy bien.
Así que su idea es, creamos un char y poner algo en él, y luego
grabar en ese carbón.
>> ESTUDIANTES 60: Así es.
>> JASON HIRSCHHORN: ¿Qué Qué piensa la gente?
>> ESTUDIANTES 62: Ha enrevesado.
>> JASON HIRSCHHORN: OK.
Dibujemos a cabo.
Así que esta vez, voy a sacar esto en rojo en la pila de aquí, y luego
tendrá -
ooh!
Lo siento.
Así que esta vez tenemos algo que se llama tampón, y es en la pila.
Corrija?
Y estamos ahorrando en ella un principio.
>> Entonces tenemos nuestra llamada a fread.
¿Qué fread hace es que toma un byte de nuestro archivo y lo pone en alguna parte.
Se pone en cualquiera que sea el lo está señalando.
Bueno, antes de que tuviéramos esta dirección -
0x0.
Ahora, ¿qué dirección tenemos?
>> ESTUDIANTES 63: Lo que sea buffer de dirección es.
>> JASON HIRSCHHORN: Lo que sea buffer de dirección es.
Probablemente va a ser algo así.
Probablemente va a comenzar con una b y una f, y luego tiene otros seis
dígitos hexadecimales.
No tiene importancia.
Algunos de direcciones.
Y estamos de paso, que la dirección pulg
>> Y vamos a poner nuestro único Lo byte en esa dirección.
Así que vamos a poner nuestro único Lo byte aquí dentro.
Y luego vamos a escribir desde lo que es siempre aquí dentro.
¿Alguien tiene alguna pregunta acerca de eso?
¿Quién piensa que este código va a funcionar?
>> Levante su mano si usted piensa Este código funcionará.
Usted tiene que tomar una postura.
¿Y quién cree que este código no funcionará?
Levanten la mano.
Todo el mundo debe ser levantando la mano.
Aceptar.
Michael, ¿dónde estás parado?
>> MICHAEL: No puedo decidir.
Tipo de en medio.
>> JASON HIRSCHHORN: Eres en el medio.
Elige una.
>> MICHAEL: Voy a tener fe y dicen que va a funcionar.
>> JASON HIRSCHHORN: OK.
Vas a tener fe y dicen que funciona?
¿Qué pasó?
>> [VOCES interponiendo]
>> JASON HIRSCHHORN: Sin culpa seg.
¿Cómo se puede comprobar que para ver si dos cosas son iguales?
Dos archivos son iguales.
>> ESTUDIANTES 64: Diff.
>> JASON HIRSCHHORN: Diff.
Cheques de diferencias para las diferencias entre dos archivos, y si devuelve
nada, son idénticos.
Y si abrimos, tenemos nuestro archivo.
Así que esa era la solución correcta.
Echemos un vistazo hacia atrás en ella una vez más.
En realidad, ni siquiera necesitará inicializarlo.
>> Sería probablemente un aspecto un poco limpio si usted no puso
algo al azar en ese país.
El punto es, que necesita crear un un poco de espacio para almacenar algo de
fread y tomar algo de fwrite.
Y eso tenía que ser un local de variables en la pila - que
podría haber malloc'd algo de espacio.
>> Así que en realidad podría tener malloc escrito aquí, y
eso habría funcionado.
Y entonces habríamos estado almacenando nuestras cosas en algún lugar en el montón.
Pero esto es en realidad, probablemente, la solución más elegante.
Basta con crear un poco de espacio en la pila para que estas cosas pasan.
>> Me gustaría tener otros dos comentarios.
Si usted fuera a tomar a su vez en esto, y entonces quedan marcados en esto, mis comentarios
sería de la siguiente manera.
Estos 1 es aquí, para mí, mirar como números mágicos.
Este 1, en términos de fread, tiene sentido.
Ese es el número de cosas para leer o escribir.
>> Pero esta de aquí debe Probablemente sea algo más.
Entonces, ¿qué es una solución?
>> ESTUDIANTES 65: Tamaño de byte.
>> JASON HIRSCHHORN: ¿Así?
>> ESTUDIANTES 65: Tamaño de caracteres.
>> JASON HIRSCHHORN: Tamaño de caracteres.
Sí, el byte no es un tipo.
Así que el tamaño de las obras carac.
Podríamos tener, en la parte superior de nuestro código, # define que.
Llamado algo BYTE y es realmente un char.
En realidad, un enfoque aún mejor que podría haber sido este -
uint.
¿Alguien sabe lo que es eso?
>> Lo siento.
Lo tengo al revés.
Espera, no.
Por dónde se va?
¿Alguien sabe lo que es eso?
Sí.
>> ESTUDIANTES 67: Se supone que ayudará a estandarizar a través de los sistemas de las cosas que
tener - como enteros sin signo que tiene 8 bytes?
>> JASON HIRSCHHORN: Eso es exactamente correcto.
En diferentes máquinas, el tamaño de un char -
no generalmente un char.
Chars suelen ser un byte.
Pero el tamaño de otros tipos de datos son diferentes tamaños en una máquina de 32 bits
frente a un equipo de 64 bits.
A uint8_t es siempre de 8 bits -
siempre un byte.
>> Y tengo que incluir esa archivo de cabecera estándar int.
Así que ahora, esto habría sido probablemente la mejor manera de escribir este código.
Así que me libro de los números mágicos.
Y también tengo un más lógico tipo de búfer.
No es simplemente un char, es un byte, que es lo que esperamos que sea.
>> Y hasta aquí, hemos hecho sido un poco más robusto.
No vamos a llamar a un char, que -
tal vez, quién sabe - podría ser una diferente tamaño en diferentes máquinas.
En realidad estamos diciendo que esto es exactamente un byte, siempre, no importa qué.
Y si miramos aquí, hacemos cp.
Uh-oh.
¿Qué pasó?
>> ESTUDIANTES 68: Podría estar encendido.
>> JASON HIRSCHHORN: ¿Qué?
>> ESTUDIANTES 69: ¿Lo es?
>> ESTUDIANTES 70: Usted no lo hizo lo definen como un tipo.
>> ESTUDIANTES 71: Pero lo que debería ser definido en la norma.
>> ESTUDIANTES 72: ¿Qué está pasando?
>> ESTUDIANTES 73: En caso de definir estar todo en mayúsculas?
>> JASON HIRSCHHORN: Así que no es # define.
En realidad, en este caso, estoy va a utilizar typedef.
Debido a que estamos usando como un tipo en un solo lugar.
Así que en este caso, en realidad queremos typedef que estamos imprimiendo un nuevo tipo
byte, y es, esencialmente, este.
Es un poco diferente a # define.
>> Y ahora, nuestro código funciona perfectamente.
Así que, de nuevo, # define toma algo, reemplaza todas partes
con lo otro.
Es sólo una macro -
taquigrafía para deshacerse de números mágicos.
Pero en este caso, porque estamos utilizando como un tipo -
aquí -
para que eso funcione, necesitamos typedef a lo byte es.
>> Y estamos definiendo aquí mismo.
No es una estructura, en realidad es simplemente un entero sin signo.
Es un byte de longitud.
Este código estará disponible en línea, y todos deben tener ahora mismo.
>> Así que tenemos -
perfecto -
13 minutos a la izquierda para ir problema por set 5.
Quiero caminar por copy.c juntos, y entonces hablaremos brevemente
sobre las otras partes del conjunto de problemas.
Así que permítanme levanto copy.c.
Y lo bueno es que hemos hecho ya se ha escrito mucho de este código.
>> El código que escribimos, literalmente, sólo salió de aquí cuando era
escribiendo esto en mi cuenta.
Pero esto es copy.c, constituye la base para las dos primeras partes de
el problema establecido para whodunit.c, que que necesita para escribir, y resize.c.
Recover.c, que es el tercero y último parte del conjunto de problemas, no es
con sede fuera de este archivo.
>> Vas a tener que escribir ese archivo, te damos una plantilla para que
presentar, pero no tiene nada que ver con copy.c.
Pero debido copy.c es la base para las dos primeras partes, vamos
caminar a través de él ahora, para que tenga un buen sentido de lo que hace.
>> Y los comentarios dan de parte de ella.
Ya hemos escrito algo de esto.
En primer lugar, nos estamos asegurando de tenemos tres argumentos.
A continuación, estamos recordando el nombre del archivo.
Así que nos saltamos este paso cuando codificamos lo nuestro -
cuando nuestro cp.
Pero aquí, están haciendo un poco más limpio.
>> Están vigilando para asegurarse ambos archivos son buenas, en
Además de la apertura de ellos.
Se escribió todo este código en este momento, así que estoy No voy a detenerme en este código.
El siguiente es un poco de materia que es específico para los tipos de archivos que estamos utilizando, que
son archivos de mapa de bits.
Archivos de mapa de bits tienen algunos metadatos asociado con ellos.
>> Así que el primer par de bytes le informará sobre el archivo.
Ellos no son los colores de el píxel en esa imagen.
Te dicen sobre el archivo.
Y si usted lee a través del conjunto de problemas, usted tendrá mucha más información
sobre qué tipos de estructuras de metadatos se incluyen con los mapas de bits.
>> Pero es por eso que tenemos esta primera conjunto de - el código aquí.
Estamos leyendo los metadatos -
dos piezas de metadatos - el archivo encabezado y el encabezado de información.
Y estamos revisando algunas partes del mismo a asegúrese de que es un archivo de mapa de bits verdadera
antes de continuar.
>> Y una vez más, estos son los detalles que no es necesario ir a ahora.
Si usted lee a través del conjunto de problemas, usted entenderá esto.
Larga historia corta, estos son sólo diciendo, Este es un archivo de mapa de bits y
confirmando que.
>> A continuación, vamos a escribir los al archivo de salida.
Vemos que aquí.
Estamos escribiendo al puntero fuera.
A continuación, estamos determinando relleno.
Así que de nuevo, ya que es la particularidad con un archivo de mapa de bits, algunas líneas incluyen
relleno en el extremo.
Y si usted lee a través del conjunto de problemas, usted aprenderá más sobre el relleno.
Esta es la fórmula para encontrar relleno.
>> Importante recordar -
cuando se cambia el tamaño de un mapa de bits archivo, los cambios de relleno.
Cuando se cambia el tamaño de un archivo, los cambios de relleno.
Nunca va a ser mayor que 3 -
que va a ser de 0 a 3, inclusive.
Pero cuando se cambia el tamaño de algo, los cambios de relleno.
>> Si sólo tengo un píxel en la fila, me necesita tres bytes de relleno, porque
cada fila tiene que ser múltiplos de cuatro bytes de longitud en un archivo de mapa de bits.
Pero si me doblo, para ir de un pixel a dos píxeles, cada uno de los cuales,
digamos, es un byte, entonces necesito dos bytes de relleno para hacer
que igual a cuatro.
>> Así que cuando se cambia el tamaño de algo, Tengo que cambiar la cantidad
de relleno de lo que tengo.
¿Eso tiene sentido para todo el mundo?
A continuación, iterar sobre cada fila, o a través de todas las filas.
Y luego iterar a través cada columna en cada fila.
Estamos tratando a este mapa de bits como una cuadrícula, como hemos tratado
el tablero en 15.
>> Como tratamos los ladrillos cuando nosotros los imprimimos en la pantalla.
Una cuadrícula de filas y columnas.
Entonces - vimos esto.
En realidad solo codificamos esto.
Hemos creado algunos de almacenamiento temporal.
Leemos allí, y luego escribimos a cabo.
Esto es exactamente lo que acabamos de hacer.
>> A continuación, porque dije: cada línea termina en algo de relleno, que
pasar por alto que el relleno -
el viejo relleno.
Y luego añadimos ti.
En este caso, estamos creando exactamente el mismo archivo.
Estamos copiarlo.
Así que esta línea es un poco tonto.
Podríamos literalmente sólo poner el relleno pulg
>> Pero si cambia el tamaño del archivo, ¿Todavía quieres esta línea?
Así que si queremos cambiar el tamaño de un archivo, Por qué seguimos queriendo saltar
sobre el viejo acolchado?
>> ESTUDIANTES 74: Si.
>> JASON HIRSCHHORN: Así que lo que hacemos.
Debido a esto, de nuevo, ofertas con el archivo de origen.
Nosotros no nos preocupamos por el relleno desde el archivo de origen.
Queremos ir a la línea siguiente.
Pero no nos limitamos a poner de nuevo la vieja cantidad de relleno.
Tenemos que volver a poner el nueva cantidad de relleno.
>> Así que cuando estamos cambiando el tamaño de una archivo, todavía queremos pasar por alto el
relleno en el archivo antiguo - lo estamos leyendo desde.
Pero lo que estamos escribiendo a, vamos a necesitar volver a poner un poco diferente
número de relleno que hemos determinado.
Sí.
>> ESTUDIANTES 75: El orden de los dos líneas no importa, ¿verdad?
Debido a que usted está manejando diferentes archivos.
>> JASON HIRSCHHORN: Exactamente.
El orden de estas dos líneas no importa.
Escribimos esta línea.
Esto está aquí para el archivo estamos escribiendo a.
Eso es importante, por lo que tenemos la cantidad correcta de relleno.
Esto tiene que ver con el archivo en formato.
Queremos pasar directamente sobre el relleno.
>> No queremos leer -
si estamos leyendo un byte a la vez, nos no se preocupan por los bytes de relleno.
Queremos pasar a la siguiente línea.
Por último al igual que Lucy le dio para nosotros, cerramos los archivos y volvemos 0.
Así que esto es copy.c.
Y que en realidad escribió - que pasamos la mayor parte de sección de escribir esto, en esencia.
>> Usted ha hecho esto.
Así que espero que usted tiene un buen sentido de lo que está pasando aquí.
La gran diferencia, la verdad, es sólo esta primera parte que se ocupa de
peculiaridades de los archivos de mapa de bits.
Así que tengo como mi siguiente diapositiva, ¿Qué necesitamos hacer?
Bueno, vamos a pensar en quién lo hizo.
>> Y para alguien que lee a través de establecer el problema, ¿qué hacemos
que tenga que hacer en novela policíaca?
Simplemente.
Aleja.
>> ALEJA: ¿Se puede sacar la parte de cada píxel que denota rojo.
Y entonces -
tipo de?
>> JASON HIRSCHHORN: OK.
Así que sacar la parte de cada píxel que denota rojo.
Eso es cerca, pero no todos de la misma.
>> ESTUDIANTES 76: Bueno, hay diferentes maneras de hacerlo.
>> JASON HIRSCHHORN: OK.
Dame una manera.
>> ESTUDIANTES 76: Saque todo el rojo, y a continuación, hacer hincapié en el azul y el verde.
>> JASON HIRSCHHORN: OK.
Así que teniendo en cuenta estos dos sentidos -
suena como que le damos un píxel, que tiene un nivel de color rojo, azul y verde.
Queremos cambiar los niveles relativos de el rojo, azul, y verde, dependiendo
en ese píxel.
Cuando en este código debemos cambiar el familiar color rojo, azul y verde
los niveles de un píxel dado.
Después de que hemos leído -
antes de escribir esto?
Dame el número de línea.
>> ESTUDIANTES MÚLTIPLES: 83.
>> JASON HIRSCHHORN: 83.
Así que aquí.
Para quién lo hizo, el código es necesario escribir todos deben ir a la derecha allí.
Y eso es el único código que necesita para escribir.
Porque, como hemos escuchado, todo lo que necesita hacer es cambiar estos azul relativa,
niveles de rojo y verde de cada píxel.
>> Usted ha leído todo, y ahora que está va a escribirlo.
¿Cómo puedo conseguir - si tengo esta cosa llama triple, justo aquí, y es de
escriba RGBTRIPLE -
bien, si nos fijamos en bmp.h, ¿cuál es RGBTRIPLE?
>> ESTUDIANTES 77: Es una estructura.
>> JASON HIRSCHHORN: RGBTRIPLE es una estructura.
Vemos que aquí abajo.
Y así, si quería acceder, por ejemplo, la nivel rojo de la estructura, ¿cómo puedo
acceder al nivel rojo de esta estructura?
>> [CLASE SOPLOS]
>> ESTUDIANTES 78: RGBTRIPLE.rgbtred?
>> JASON HIRSCHHORN: ¿Eso es correcto?
>> ESTUDIANTES 79: Debe ser el triple punto, en lugar de RGBTRIPLE punto?
>> JASON HIRSCHHORN: Triple.
Triple es la variable local, por lo que aquí, no hay punteros aquí.
Entonces sólo tiene que utilizar la notación de puntos.
Esto me dará el nivel de rojo.
Si quiero cambiar, me acaba de establecer que iguala a algo diferente.
Así que de nuevo, esta línea de código tiene acceso a esta variable dentro de esta estructura, y
podemos configurarlo para que algo nuevo.
>> Así que para quién lo hizo, de nuevo, esto es, en esencia, lo que tenemos que hacer.
Muy simple.
Sólo tienes que cambiar algunos niveles relativos y aquí es donde ese código va.
Cambiar el tamaño, por otra parte, es un poco más complicado.
De hecho, el cambio de tamaño es probablemente el más difícil parte de este problema establece.
Tenemos tres minutos para el final del mismo.
>> Pero una vez más, ya hemos escrito la mayor parte de este código, por lo que
debe ser bastante familiar.
¿Cuáles son algunas cosas que queremos hacer en cambiar el tamaño, si usted ha leído sobre el
establece problema?
Si usted les da a mí, que se puede hablar de ellos.
¿Cuáles son algunas cosas que queremos hacer?
>> ESTUDIANTES 80: Verticalmente -
lo que tiene que cambiar su tamaño en sentido horizontal, pero verticalmente cambiar su tamaño, así?
>> JASON HIRSCHHORN: Así que una si se nos da pixel, y queremos cambiar su tamaño por un
factor de dos, ahora tiene que ser cambiar de tamaño horizontal y cambiar de tamaño
verticalmente.
¿Eso tiene sentido?
Sí.
Así que esa es probablemente la mayor desafío.
Y hablaremos de eso en un segundo.
Sí.
>> ESTUDIANTES 81: La forma en que pensaba de ella eras tú necesitabas imprimirlo -
>> JASON HIRSCHHORN: Espera.
No nos digan lo que hiciste.
Vamos a hablar de la lógica.
>> ESTUDIANTES 81: OK.
¿Cuál era la pregunta?
>> JASON HIRSCHHORN: Usted acaba de levantado la mano.
No había duda.
Permítanme presentarles ella.
Permítanme discutir esto brevemente.
Así que hemos un píxel, queremos replicarlo, tanto horizontales como
verticalmente.
Así que lo ideal lo que hacemos aquí es, que leer en nuestro pixel, lo escribimos
sin embargo muchos de los tiempos.
>> Pero entonces tenemos nuestro truco aquí, porque entonces queremos pasar a la
siguiente línea y escribir en el a partir de la siguiente línea.
Así que si queremos replicar tanto horizontal y verticalmente, lo que es
una buena manera de hacer eso -
uno bueno, aunque para hacer eso?
Así que no necesitamos buscar constantemente alrededor de nuestro archivo a colocar las cosas.
>> Esa pregunta podría no tener tenía sentido, pero creo que una
responder a ella le ayudará.
>> ESTUDIANTES 82: Crear una matriz?
>> JASON HIRSCHHORN: Así que vamos a pensar de cada archivo como una fila.
Vamos a pensar en términos de filas.
Si tenemos nuestra primera fila de nuestra pequeña foto, podemos hacer esa fila
en una gran fila de una imagen grande, y luego replicar esa fila sin embargo
muchas veces que necesita para replicarse, en lugar de ir pixel por pixel,
que se pone confuso cuando tratar con archivos.
>> Porque si hemos tenido -
Me estoy quedando sin espacio.
Si este es nuestro archivo, y tenemos que un píxel allí, y queremos ponerlo
justo ahí, todavía tenemos algunas cosas esa necesidad de ir allí cuando estamos
la escritura y la creación de nuestro nuevo archivo -
nuestro archivo que es el doble de grande.
>> Pero es realmente difícil con funciones de archivo saltar en torno a las nuevas líneas
de esa manera y, a continuación, volver aquí y poner las cosas en ese país.
Es casi imposible hacer algo así, si eso tiene sentido.
Así que si pensamos en términos de filas, podemos tomar nuestra fila y, a continuación, poner -
replicar filas verticalmente.
>> Y así fue como abordamos el cambio de tamaño verticalmente en lugar de horizontalmente.
Eso fue un poco rápido, y un poco confuso.
Desafortunadamente nuestro tiempo se ha acabado.
Voy a estar fuera para aquellos de ustedes aquí que tenga preguntas sobre la
conjunto de problemas, incluyendo la recuperación.
>> Así que vamos a levantar la sesión por ahora.
Y de nuevo, si usted tiene cualquier pregunta, podemos charlar exterior.