JASON HIRSCHHORN: Bienvenido a A5, todo el mundo. Tenemos una semana emocionante por delante de nosotros, sobre todo porque hay muchos nuevos se enfrenta en esta habitación. Es maravilloso. Muchos de ustedes están aquí por accidente, que es aún mejor. Así que espero que usted guardará acompañarnos. Esta semana vamos a gastar el grueso de la sección la preparación para el examen. Así que por nuestro programa, vamos a hablar un poco acerca de los recursos para la clase, pero también para la prueba y, a continuación, de nuevo, pasar la mayor parte de la clase de conversación sobre las preguntas. Una vez que hemos terminado de contestar su preguntas, o si sus preguntas naturalmente nos llevan a algo de código, yo tener problemas de muestra de exámenes parciales pasado que vamos a codificar en directo en la sección juntos que también aparezca algún otro buenos temas a cubrir. Así que en primer lugar, como hemos pasado por el último par de semanas para recordarle chicos, hay un montón de recursos disponible para este curso. Muchos de ellos serán muy útiles a usted como usted continúa estudiar para prueba 0, porque Es martes por la tarde. Así que todos ustedes han sido estudiar un poco. Hay notas de clase y de la fuente código que debe sin duda la salida. Mira los pantalones cortos. Echa un vistazo a study.cs50.net. Y entonces, se enumeran a continuación, un número de otros recursos. Una vez más, el concurso es mañana 0 en uno. Si no lo ha hecho, compruebe Acerca de la Prueba 0 documento sobre la página de inicio del curso para averiguar donde usted está tomando el examen. El concurso comienza a las 1:10 y termina 70 minutos después. Así que si usted se presenta después de la 01:10, eres va a conseguir que muchos menos minutos del 70 para tomar la prueba. Así que asegúrate de que estás a tiempo. Si usted es un estudiante de extensión o tener algunas otras consideraciones de prueba, se podría no estar en una mañana. Pero, de nuevo, compruebe el Quiz 0 documento para asegurarse de que usted sabe cuándo usted está tomando el examen. Escribí 75 minutos aquí. Creo que eso es correcto, no 70. Cubre todo el material de una semana 0 a la conferencia de la semana pasada, el miércoles. Y de nuevo, para este concurso, por que documento, se obtiene una doble cara y 8 1/2 por 11 hoja de papel que se obtiene para utilizar como notas durante el examen. Mucha gente, si no la mayoría de las personas, tienen encontrado que la manera más útil solo para estudiar para el examen es hacer una hoja de estudio, un uno-sider, de los suyos. Así que busque en los últimos si usted ha visto los pasados. Llegar a los amigos para ver lo que que están poniendo en el suyo. Pero, de lejos, la mejor manera posible estudio es ir a través de todo y reducir gradualmente hacia abajo a lo que deben o no pertenece a esa hoja de papel, porque eso es sólo una realidad forma útil para que usted pueda asegurarse usted va a través de todo y tener cierta familiaridad con él. La mayoría de la gente, nos encontramos, a pesar de que tienen la hoja de papel sentado justo junto a ellos en el cuestionario, no encienda a ella, porque, de nuevo, que muy proceso de ir a través de la información ha ayudado a que se lo aprendan. ¿Alguien tiene alguna pregunta sobre concurso de 0? Tiene a todo el mundo - Yo no voy a hacer a mano alzada. No importa. Yo iba a preguntar quién comenzó a estudiar. Pero yo no quiero hacerte todo no levanten la mano. Así que como he dicho - sí, Avi, adelante. AVI: ¿Cuál sería una cosa útil para poner en el de un localizador? ESTUDIANTE: Eso depende de usted. JASON HIRSCHHORN: Usted recibe utilizar su juicio. Cosas útiles para poner en el de un localizador, si usted está confundido acerca de la gran O tiempo de ejecución de diferentes tipos de búsquedas y tipo, que ponen en allí en un gráfica excelente práctico. De esa manera, si se le pide que en el concurso, que no es necesario para tratar de la figura hacia fuera o la razón a través del tiempo de ejecución. Usted puede simplemente copiar hacia abajo. Si nos fijamos en los concursos pasado, una gran cantidad de veces, no está corriendo cuestiones de tiempo. Así que sería un ejemplo de una buena cosa que poner en su uno-pager. Otras cosas buenas de poner, si eres confundidos acerca de cómo declarar una función o lo que las diferentes partes de la declaración de la función son, escribir que allí, una versión genérica y luego tal vez un ejemplo. Si usted está confundido acerca de los punteros, un diagrama de cómo punteros trabajo es probablemente de gran ayuda. Si usted está confundido acerca de la recursividad, un degustar función recursiva allí También podría llegar a ser realmente útil. ¿Eso le da algunas ideas? AVI: Es necesario comprender la proceso de compilación de todo, al igual que cómo funciona todo? JASON HIRSCHHORN: Todo que ha sido cubierto podría aparecer en el cuestionario. Preguntas - pero de nuevo, algunas cosas serán ponderada fuertemente que otros. Algunas cosas han llegado de nuevo y otra vez en clase, en conferencia, y la sección. Otras cosas que no tienen llegar a esa frecuencia. Hemos hablado mucho acerca de # include y -L algo y lo que significa en los el proceso de compilación. Hemos hablado mucho sobre GDB, se aferran, los diferentes indicadores que utilizamos cuando compilamos algo, y lo que make15, por ejemplo, de verdad significa y realmente lo hace. No hemos hablar tanto sobre cada paso individual en el proceso de compilación. Todavía hemos hablado de ello. Así que es algo que todavía le debe estar familiarizado. Pero de nuevo, no vamos a ser - las cosas que se presentan con más frecuencia en la clase tienen más probabilidades de llegar a más a menudo y ser más fuertemente ponderada en el cuestionario. Genial. ¿Alguna otra pregunta sobre concurso 0? Aceptar, por lo que poner una lista de temas en la pizarra. Fui a través del plan de estudios. Fui a través de la sección de revisión de ayer por la noche y los toboganes para llegar con una lista no exhaustiva de temas que hemos cubierto hasta ahora en CS50 y las cosas que podrían aparecer en el cuestionario. Así que no voy a ir a través de todos y cada uno de ellos. Eso tomaría mucho más tiempo de lo que tenemos ahora. Pero pongo esto aquí con la esperanza de jog su memoria en cuanto a las cosas que pueden o no ser tan familiar con usted. Y me encantaría que pasar la mayor parte de sección de responder sus preguntas sobre estos temas, temas que no están cubiertos aquí. Podemos escribir pseudocódigo. Podemos escribir código real para asegurarse de que - Yo puedo responder a su pregunta y ayudar Cualquier persona puede entender fundamentalmente un Muchos de estos temas para que te sientas preparado y cómodo ir en la mañana cuestionario. Así que lea la lista. Usted ojalá haya llegado a la sección de con algunas preguntas. Cuando esté listo, levante la mano y vamos a empezar. Tenga en cuenta, las preguntas que tienen, no hay preguntas estúpidas. Hemos oído hablar mucho de eso. Y las preguntas que tenga, estoy dispuesto apostar, muchas otras personas, tanto aquí sentado y viendo línea tienen también. Por lo que sólo puede ayudar a la gente haciendo preguntas. Marcus. MARCUS: Entre la pila y el montón, ¿hay un pre-asignado porcentaje de memoria que se define como esto es para la pila o en el montón? O ¿cómo funciona eso, exactamente? JASON HIRSCHHORN: Muy buena pregunta. Voy a respaldar rastrear un poco. ¿Tiene todo el mundo - por favor sea honesto aquí. Sé que te estoy pidiendo que levanten la mano delante de sus compañeros. Pero hay personas que se sienten incómodo con la pila y el montón y le gustaría ir otra vez que y lo que los quiere decir? Levanten la mano si - Aceptar. Gracias. Así que vamos a ir a la pila y el montón muy rápidamente y luego pasar a responder a su pregunta. Así que si dibujamos una caja para representar memoria en el equipo, ¿cuáles son algunas cosas que van en este cuadro? Principal. Una función principal. ¿A dónde va principal? ESTUDIANTE: [inaudible]. JASON HIRSCHHORN: Así que vamos a puesto principal aquí. ¿Qué otra cosa va en esta caja? ESTUDIANTE: Las funciones a las que llama. JASON Hirschhorn: Las funciones que llamamos. Y ¿a dónde van? ESTUDIANTE: En la pila. JASON HIRSCHHORN: Ellos ir en la pila. Así que vamos a llamar a este cosa aquí abajo la pila. Y encima de la tapa, tenemos el montón. Así, la memoria no es un cuadro como este. Pero en realidad es bastante similar. Va a haber un montón de cajas de más de y otra, dependiendo de cuán grande es su computadora es o qué tan grande es su memoria. En el entre comillas "de abajo" es la pila. Y hay varias cosas que van a la pila. Y aquellos dependen de las funciones que tiene en su código. Usted siempre tiene una función en su código llama principal, así que siempre hay una sección aquí en el apilar dedicado a la principal. Estas secciones de la pila se llaman marcos de pila. Cuando se llama a otra función, digamos principal llama a una función de búsqueda binaria, ponemos otro marco en la pila. Más concretamente, vamos a donar un trozo de memoria en nuestra equipo para almacenar de búsqueda binaria locales variables y para ejecutar el binario código de búsqueda. Así que llamamos a la búsqueda binaria. En este trozo de memoria, vamos para almacenar sus variables locales. Vamos a almacenar sus llamadas printf. Pase lo que pase, que la función es va a ser almacenado allí. La búsqueda binaria va a ejecutar. Se va a completar la ejecución. ¿Cuál es la palabra en C que significa que una función debe completar su ejecución? ESTUDIANTE: Retorno. JASON HIRSCHHORN: Return. Así que cada vez que vea una sentencia return, los extremos de función cuando llegue a eso. Así que la búsqueda binaria llegará a su devolución. Esta parte de la memoria será esencialmente ser liberado. Y principal volverá a su ejecución. Así principal hará una pausa donde estaba, llame al búsqueda binaria, conseguir algo de valor de retorno, y continuar la ejecución. Este marco de pila se irá. Si llamamos a una función recursiva, que es una función que llama a sí mismo sobre y otra vez, puede ser que consigamos - decimos que hicieron de búsqueda binaria recursiva. Podríamos llegar búsqueda binaria versión uno, búsqueda binaria dos, búsqueda binaria tres, búsqueda binaria cuatro, búsqueda binaria cinco. Y a continuación, esta final de búsqueda binaria de cinco llegará el caso base, y la pila marcos volverán y mantener el cierre hasta que volvamos a principal. Podemos repasar la recursividad en un rato. Pero todo esto es decir, si usted es llamar a múltiples funciones a la vez, habrá múltiples pila marcos de la pila. El montón, por otro lado, hasta aquí, no es para funciones, no para las variables locales. Es para asignar dinámicamente variables. Así que estas son variables que pueden ser inicializado en ya sea principal o una función que principales llamadas. En cualquier parte de su código, que puede ser inicializado. Y para inicializar una forma dinámica la variable asignada. ¿Qué función en C usamos? ESTUDIANTE: Malloc. JASON HIRSCHHORN: Malloc. Usted llama a malloc. Usted obtiene un espacio de memoria. Y que el espacio de memoria está en el montón. Y ese espacio de memoria se queda allí hasta que llame de forma gratuita. Así las variables asignadas dinámicamente en heap existirá durante todo el tiempo que queremos que existan, y no lo harán desaparecerá hasta que explícitamente decirles que se vayan. Puede crearlos en una función. Pila de esa función marco se irá. Pero esa variable seguirá existiendo en el montón hasta que se libera, potencialmente por la función que llamó búsqueda binaria o lo que sea. Así que esas variables montón quedan allí durante el tiempo que usted desea que se queden allí. Y ellos consiguen puestos aquí. Y luego el siguiente se puso en su lugar. Siguen siendo rellenado, y permanecer allí hasta que llame de forma gratuita. Y, esencialmente, la pila y la pila, llegar a la pregunta de Marcus, crecer uno hacia el otro. Y si se encuentran uno al otro, que haya utiliza toda la memoria en su computador, y su programa se cerrará porque usted no tiene más memoria izquierda a utilizar. Entre ellos, hay potencialmente otras cosas. Sin embargo, para el alcance de este curso, no es necesario que te preocupes por eso. Así que esa fue la respuesta a su pregunta. No se preocupe. Pero esa era la respuesta larga. Todo lo que necesitas saber es el heap y la pila va - uno comienza en la parte inferior. La pila de papel no. El montón está ahí arriba. Ellos crecerán más cerca el uno al otro. Y si lo que tocan, eso es un problema. Te has quedado sin memoria. Pero también, además de saber dónde que están, lo que se almacena tanto en el pila y el montón. Curtis. CURTIS: Cuando chocan, es que un desbordamiento de pila? JASON HIRSCHHORN: Cuando chocan, eso no es un desbordamiento de pila. Un desbordamiento de pila es un área diferente que podemos ir si quieres. Bien, vamos a volver a eso en un momento. ESTUDIANTE: ¿Cuál es la palabra llamada cuando chocan entre sí, el pila y el montón? JASON HIRSCHHORN: Por ahora, no te preocupes. Sólo tienes que saber - Voy a responder a esa pregunta después de la clase. Si se encuentran con los demás, que se quedó sin de la memoria, porque no hay más espacio allí. ESTUDIANTE: Lo siento, lo que es un fallo seg? JASON HIRSCHHORN: Un segmento falla puede ser llamado para - depende por qué se llama de la falla seg. A veces, el desbordamiento de pila, que va a decir seg fallo como el error. ESTUDIANTE: ¿Qué hay de eliminación de referencias una variable nula? ¿Es que una falla seg? JASON HIRSCHHORN: Desreferenciar un puntero nulo - OK, así que si usted tiene un puntero que fija igual a null, punteros, el recuerdo, direcciones de memoria store como sus valores. Y un puntero nulo es esencialmente almacenar 0, el 0-th abordar en esa variable. Así 0x, 0, 0, 0, 0, etcétera. Esa dirección 0-th en la memoria que no es en nuestra imagen, eso es allá arriba en algún lugar, que está reservado para el equipo. No se nos permite tocarlo. Así que cuando el programa está ejecutando, si algo está tratando de ir a la memoria dirección 0, sabe que que es un valor vacío. No sabe nada debería estar allí. Así que si usted trata de usar algo allí y tratar algo como allí o tratando de ir a ese lugar, usted es va a obtener un fallo de segmento o un error. ¿Responde esto a su pregunta? Y ahora vamos a volver a desbordamiento de pila. Las cosas en la pila, ya que ustedes tienen visto antes, en - vamos a dibujar una estrecha de un marco de pila. ¿Todos pueden ver eso? Así que tenemos nuestro marco de pila. Estamos ahorrando un array en un local de variable en esta función. Así que decir que nuestra matriz tiene cinco puntos. Los cinco de los que se almacenará en ese marco de pila. Si empezamos a escribir más allá del límites de este conjunto - así que si empezamos a escribir en, digamos que es 0. Esos son los cinco índices de nuestra matriz. Si empezamos a escribir en el índice 5, que no tenemos cuando tengamos la matriz de tamaño 5, empezamos a escribir en índice 6, 7, 8, 9, podemos obtener una pila Error de desbordamiento. Generalmente no es - es probable que se meterá en problemas si usted se pasa por uno. Pero, en general, se llega a la más problemas si usted se pasa por una gran cantidad y te vas hasta la fecha más que escriba sobre la dirección de retorno de esa función, que se encuentra en la parte inferior del marco de pila. Porque, ¿no? Usted - en el - lo siento. No ", porque la derecha." En el marco de pila, que tiene sus variables locales. En la parte inferior de la pila marco es la dirección de retorno. Ahí es donde la función pasa cuando se acaba. Y si sobrescribe ese retorno dirección, y luego cuando este marco de pila, cuando usted va a través de la pila encuadrar y ejecución de cada línea, eres va a ir a su nueva dirección de retorno que está escrito allí en vez de la uno real. Y así es como hemos visto algunos fallos de seguridad puede suceder con los ordenadores. Así desbordamiento de pila, en una palabra, es cuando sobrescribe la parte de la pila se supone que debes usar, lo local variable que se supone que debes usar, y en particular, cuando se inicia la sobrescritura cosas importantes como el remite. Y ahí es donde usted obtendrá un error. O tal vez incluso podría empezar incluso escribir en - dicen búsqueda binaria fue justo encima de principal. Si ha sobrescrito mucho, pudo escribir en el principal. Pero, en general, se produce un error antes de entonces, debido a que el ordenador sabe usted está haciendo algo que te no se debe hacer. Sí. ESTUDIANTE: ¿Cuál es la diferencia entre un desbordamiento de pila y un buffer overflow? JASON HIRSCHHORN: Desbordamiento de búfer es un tipo más genérico de lo que acabo de describir. ESTUDIANTE: Entonces un desbordamiento de pila es un ejemplo de un desbordamiento de búfer. JASON HIRSCHHORN: Exactamente. Este es un arreglo que podemos pensar como un tampón, un espacio para que las cosas salgan pulg Se trata de un desbordamiento del búfer de pila. Podríamos tener un desbordamiento del búfer de pila. Si había un tampón, que hay a menudo es una matriz del montón, y nosotros sobrescribía esos límites, entonces lo haríamos tener un desbordamiento del búfer de pila. Y más allá del alcance de este curso, que están detectaron un poco diferente. El compilador tiene especial formas de detectar cada uno. Pero un desbordamiento de buffer es una más genérica tipo de lo que he descrito, que era un desbordamiento del búfer de pila. ¿Eso responde a su pregunta? Sweet. ¿Hubo alguna otra pregunta relacionada a la pila o el montón? Sí. ESTUDIANTE: Sé que tienes en cadenas gratuitas porque están en el montón y usted no quiere perder memoria. ¿Pero usted tiene que liberar a las variables globales y cosas por el estilo? ¿O son liberados de forma automática? JASON HIRSCHHORN: Buena pregunta. Así que en CS50.H, creamos esta cosa para que usted llamó una cadena. Una cadena es realmente lo que? ESTUDIANTE: Carácter estrellas. JASON HIRSCHHORN: Una estrella de char, un puntero a un carácter, un puntero a una matriz de caracteres. Eso es lo que la cadena es. Así que tenemos que liberarlo, porque getString, que utilizamos mucho - nombre de la cadena es igual a getString - que mallocs para nosotros algo de memoria en la amontonarán y luego devuelve un puntero a la primer carácter de ese cadena, una estrella caracteres. Así que aparentemente, si no ha sido escrito libre en cualquiera de sus cadenas que usted ha llamado hasta ahora, usted tiene estado filtrando algo de memoria. Por supuesto que no hemos hablado de que, por lo que nadie ha metido en problemas para hacerlo. Pero en el futuro, sí. Cuando se llama a getString, eres mallocing algo de espacio en el montón. Y si usted no llama libre después de que cadena, tiene una pérdida de memoria. Eso responde a su pregunta? Sí ESTUDIANTE: Así que para hacer eso, usamos derecho libre antes del regreso? Al igual que, en el marco de, supongo que si decimos, como, int principal, dentro de la alcance del código que está dentro de los llaves, justo antes - usted sabe el lugar donde quiere suele poner de retorno. ¿Pones libre antes de eso? JASON HIRSCHHORN: Así que usted puede poner libre dondequiera que usted quiere poner libre. Debido a que estos se asignan de forma dinámica las variables, ya que pueden vivir más allá del alcance de un particular, función, si se llama a malloc en un función separada, por ejemplo, getString, puede llamar gratis en main. No es necesario llamarlo en la función específica donde se llama malloc. Pero sí es necesario llamar antes de principales retornos. Y lo que realmente depende. Depende de por qué malloced que espacio en el primer lugar. Algunas personas le llame liberar muy rápidamente. Algunas personas no llamar gratis hasta el final de su programa. Y van a ir a través de y todo de forma gratuita. Depende de qué llamaste malloc. ESTUDIANTE: ¿Y qué le dirías si se llama uso getString? Dirías libre, ¿qué? JASON HIRSCHHORN: Así que la sintaxis de forma gratuita es simplemente libre, paren abiertas, cerca Paren, y el nombre del puntero. Así que si usted escribe name cadena es igual a getString, pones el nombre aquí. Ese es el nombre del puntero. Y sabe que para liberar memoria. ESTUDIANTE: Así que cuando se libera esa memoria, el puntero sigue apuntando a ese lugar en la memoria? ¿O es el puntero también vaciada de la dirección que apunta. JASON HIRSCHHORN: Debemos tratar de que. Debemos codificar eso. Volvamos al llegar a codificación, y vamos a código que. Y si quieres descubrir la respuesta a esto, también se puede código que en el ínterin. Pero esa es una gran pregunta. ESTUDIANTE: ¿Es posible algo libre demasiado pronto? Así que todavía lo necesita para su programa, y te liberarás de ese espacio de memoria? JASON HIRSCHHORN: Si. Es posible, si algo gratis y después de usarlo de nuevo, lo harás encontrarse con un error. Pero eso es en ti, porque tú liberaste algo y luego lo llamó más tarde. Así que ese fue el error de un programador. Pero sí. Se puede escribir eso. ¿Alguna pregunta más sobre - Sí. ESTUDIANTE: Entonces, si se supone que sólo liberarlo en general antes de la programa termina, ¿significa que si el programa termina y no liberarlo, que la memoria todavía está asignado? JASON HIRSCHHORN: Si el programa termina y se olvida de liberar algo, entonces que la memoria se asignó a lo largo la vida útil de su programa. Cuando el programa se cierra completamente, que la memoria no se va quedarse allí para siempre. El equipo es lo suficientemente inteligente como para saber que cuando el programa se cierra, se debe deshacerse de toda la memoria que se asoció con ese programa. Sin embargo, hay herramientas que se pueden ejecutar en un programa para detectar si, cuando el programa terminado, se le olvidó para liberar algo de memoria. Y para su próximo conjunto de problemas donde que va a utilizar y el uso de malloc punteros, usted va a correr este programar en el programa para ver si, cuando los principales retornos, tenías cierta cosas que quedaron unfreed. Así que no van a permanecer malloced siempre en el equipo. Eso sería un desperdicio, porque muy rápidamente, los ordenadores se quede sin memoria. Pero si se quedan hasta el final de su programar y no están liberados y su programa sale, eso sigue siendo un problema que esta herramienta le ayudará a tratar. ESTUDIANTE: ¿Eso es Valgrind? JASON HIRSCHHORN: Es llamado Valgrind. Y estarás - ESTUDIANTE: Pero no tenemos que saber que durante la prueba, sin embargo? Quiero decir, se habló de un poco en la conferencia. JASON HIRSCHHORN: Así Valgrind es el nombre de esa herramienta. Saber lo que hace es suficiente para resolver el cuestionario. Pero usted no ha utilizado todavía en su conjunto de problemas porque no hemos tenido una conjunto de problemas que ha tratado de forma explícita con malloc o usando malloc. Así que usted no ha utilizado Valgrind aún. Pero lo va a usar antes que tarde. ESTUDIANTE: ¿Puede repetir lo Valgrind es? JASON HIRSCHHORN: ¿Lo sientes? ESTUDIANTE: ¿Puede repetir lo que el propósito de Valgring es? JASON HIRSCHHORN: Valgrind es el nombre - como GDB ayuda a depurar el programa, Valgrind ayuda a determinar si las cosas no han sido liberados cuando el programa se cierra. Por lo que usted ejecuta en su programa. Y su programa sale, y que va a decir su programa llamado malloc esto muchos veces para esta cantidad de bytes, y que sólo llaman libre muchas veces. Y así lo dejó estos muchos bytes si no son liberados. O va a decir que has liberado todo. Buen trabajo. ESTUDIANTE: OK. Y se llama Valgring? JASON HIRSCHHORN: V-A-L-G-R-Me-N-D. ESTUDIANTE: Una pregunta acerca de los punteros. Así que digamos que n han star x es igual a algo. Eso equivale, lo que usted está poniendo allí, es que lo que está siendo puesta en el interior lo que x hace referencia, o el puntero de x? JASON HIRSCHHORN: ¿Puede usted repetir la pregunta? ¿Podemos extraer mientras se dice? ESTUDIANTE: En el cuestionario, en realidad, la uno que nos envió, fue como, carbón de leña verdad estrellas es igual a rocas CS50, ¿verdad? ¿Significa eso que que mece CS50 es lo que la verdad está señalando? JASON HIRSCHHORN: Así que usted está hablando sobre una estrella del caracter en una cadena, ¿cómo eso funciona? Sí. Aceptar. Dibujemos esto aquí. [CONVERSACIÓN SIDE] JASON HIRSCHHORN: Así que esta variable va a ser de tipo char estrellas. ¿Qué tan grande es una variable de la estrella de tipo char? ¿Cuántos bytes? ESTUDIANTES: Cuatro. JASON HIRSCHHORN: Son cuatro bytes. ¿Cuántos derechos es una variable de tipo int estrella? ESTUDIANTES: Cuatro. JASON HIRSCHHORN: Cuatro bytes. Si se trata de un puntero, entonces siempre es cuatro bytes, ya que los punteros, su valor es una dirección de memoria. Y las direcciones de memoria en el CS50 aparato son cuatro bytes de longitud. Así que cuando llamamos a getString, o cuando digamos, stringname es igual, y luego en comillas dobles pusieron una cadena, estamos poniendo - bueno, eso es un poco diferente. Qué vamos a getString como el ejemplo. O estrellas Char algo es igual a la cadena. Lo sentimos, dame el ejemplo que lea? ESTUDIANTE: la verdad estrellas caracteres es igual "rocas CS50" en comillas dobles. JASON HIRSCHHORN: Así que esta estrella, esta llamaremos a esta variable x para nuestra fines genéricos. Hemos creado una variable llamada x. Es tipo char estrellas. Es un puntero a una serie de caracteres. Así que aquí abajo - Así que así es como esta haría trabajar en la memoria. Esto almacenar una dirección de memoria. Sería almacenar la dirección de memoria de el primer carácter de la matriz. Y luego, cuando seguiste el puntero, lo haría obtener el primer carácter. Y si estás leyendo esto como una cadena, el equipo es inteligente basta con saber, leer todo esto hasta que llega a una reacción 0. Pero si estás leyendo un carácter en un tiempo, así que estás iteración a través de esta cadena, a continuación, sólo leerá un carácter a la vez hasta que llegue a barra invertida 0. Eso no pudo responder a su pregunta, sin embargo. ESTUDIANTE: Sí, pero no lo ha hecho malloced que el espacio sin embargo, para ese puntero. JASON HIRSCHHORN: Así que no estoy muy seguro de exactamente lo que estás viendo, porque yo no hice ese examen. Se suponía que iba a ser un útil recursos de otro TF. Si va a crear una cadena en la apilar o como una variable local, que va a acaba de ser gama de cargas en lugar de en general, una estrella carbón señalando otra cadena. Pero yo no lo sé. Eso podría ser un puntero a otra cadena en la pila también. Sí. ESTUDIANTE: Sé que usted necesita asignar memoria si el puntero está siendo declarada dentro de otra función. ¿Es necesario hacer lo mismo si se trata de está declarada dentro del principal, usted lo está utilizando en el interior del principal? JASON HIRSCHHORN: Así que sí. Puede declarar un puntero a cualquier dirección de memoria en la memoria. Puede ser la dirección de memoria de un local de variables, aunque muchas veces, personas no declaran las direcciones de memoria a las variables locales, ya que van desaparecer una vez que la función devuelve, que es por ello que generalmente malloc cosas. Pero sí, se podía declarar un puntero a otra variable local. Es que por lo general no se hace. Pero puedo echar un vistazo a que cosa específica después de la clase. Sí. ESTUDIANTE: Creo que esto es una especie de lo que se le pide. Parece extraño estar inicializar un puntero no como un dirección, sino como lo parece como un valor. Parece que el CS50 es lo que hay dentro lo que se apunta y no la dirección real, ¿verdad? JASON HIRSCHHORN: Así que eso es no es el caso, sin embargo. Eso no es lo que está pasando. Cuando se declara una estrella char, es una dirección de memoria. Los punteros son todas las direcciones de memoria apuntando a otra cosa. Ese algo más podría estar en el pila, pero casi siempre se encuentra en la amontonarán en el camino veremos lo que solía. Pero stringname es igual de comillas dobles "GetString", podemos ver que y nos puede mirar a través de eso y codificar eso. cadena getString no se está guardando en esa variable, o lo que sea la cadena nombre no se está guardando en ese variables, no porque así es como punteros funcionan. ¿Eso tiene sentido? ESTUDIANTE: Sí. JASON HIRSCHHORN: OK. Con suerte, eso no era confuso para cualquier persona. Pero si lo fuera, podemos mirar de nuevo en un poco, porque en realidad estamos pasando para codificar algo que se espera que trabajar con cadenas y ayudarle a sentirse más cómodo con ellos. Cualquier otra pregunta relacionada con estos temas u otros temas que Voy a poner una copia de seguridad? Y - en estos momentos. Sí, Alden. ALDEN: Así que esto es totalmente sin relación, pero ¿podemos ir más muy rápidamente lo que necesitamos saber sobre la diferencia entre un 32 y Equipo de 64 bits? JASON HIRSCHHORN: Si. Así que 32 bits es la cantidad de bytes? ALDEN: Son cuatro bytes. JASON HIRSCHHORN: Son cuatro bytes. Y 64 bits es la cantidad de bytes? ESTUDIANTE: Ocho. JASON HIRSCHHORN: Ocho bytes. Así que de nuevo, ocho bits es un byte. Su aparato CS50 es una máquina de 32 bits. Así que las direcciones de memoria son cuatro bytes de longitud. Hay 2 al 32 direcciones de memoria. 0 a 2 a la 32 menos 1. Y yo no soy positivo, pero eso es probablemente el alcance de lo que usted necesita sé que es un equipo de 32 bits, que la memoria direcciones son, de nuevo, cuatro bytes de longitud, y esa es la cantidad máxima de direcciones de memoria. Además, los tipos de datos - esto podría ser algo tan bueno eso es digno de mención. El tamaño de un tipo de datos depende la máquina que usted está trabajando. Así que un char, un solo carácter, es como muchos bytes en nuestro dispositivo CS50? Un byte. Y en realidad es un byte como bien en una máquina de 64 bits. Y la mayoría de los tipos de datos son el mismo número de bytes en ambas máquinas. Sin embargo, algunos tipos de datos serán diferentes en ambas máquinas. Así que sería potencialmente la Lo único que usted necesita saber. Pero incluso eso, creo, está más allá de los límites - Estoy casi seguro, si uno mira hacia atrás en concursos de edad, dice, para asumir problemas que está usando la codificación de una máquina de 32 bits. Pero hay, para ir junto con el de Por si te interesa, hay tipos de datos que son los mismos tamaño en todas las máquinas. Si has visto algo así uint32_t, que puede o no ser no he visto eso. Eso es un tipo de datos. Eso dice, será de 32 bits sin importar qué máquina es el. Así que cuando la gente está escribiendo portátil código, probablemente no utilizarán ints. Lugar Usarán estos otros datos tipos que saben que serán los mismos El tamaño de cada máquina. Madhu. MADHU: Yo tenía una pregunta sobre el proceso de compilación. Así que si usted está escribiendo un programa que utiliza una biblioteca como CS50 o algo así, yo sé que esa biblioteca tiene que, en algún momento, ser compilado y vinculado pulg Pero, ¿cuánto de eso ocurre durante la elaboración de su programa? ¿Qué parte de ese proceso biblioteca ocurre cuando estás compilar su propio programa? JASON HIRSCHHORN: Así que vamos a repasar en general los pasos de este proceso. Usted escribe su columna c.. En el archivo de c., Que incluye su # bibliotecas de encabezado, por ejemplo, cs50.h. ¿Qué tiene eso aguda incluyen line hagas a tu programa? Akchar. AKCHAR: Añade los prototipos de las funciones de la cabecera los archivos de las bibliotecas. JASON HIRSCHHORN: Exactamente. Añade los prototipos de funciones a su código. Así que cuando se está compilando el código en las primeras etapas, el compilador sabe que realmente existen estas funciones, y que en alguna parte que se han definido. Los archivos. H no incluyen el definiciones para estas funciones o cómo trabajan realmente. Cs50.h sólo incluye algo que dice getString es una cosa real que puede suceder. Y standardio.h dice printf es una cosa real que le puede pasar. Por lo que su lenguaje c con esto. Cabecera archivo se convirtió en algo de código legible por la máquina, lo que finalmente consigue convertido en binario código, de 0 y 1. Y ese es el código que en última instancia se ejecuta. El CS50-l línea - por ejemplo, cuando estás escribiendo Clang - y luego de incluir-l CS50, escribe que pulg Y ves eso. Cuando escribes hacer, usted ver que la línea aquí. Y veremos que en un segundo cuando codificamos o más adelante, cuando el código. Pero eso-l línea CS50 hace algo un poco diferente a los # include cs50.h. ¿Qué hace la línea que-l CS50? Avi? AVI: Quiero decir que se vincula la biblioteca a la función llamar, al igual que los archivos. o. JASON HIRSCHHORN: Así que es muy cerca, si no es el lugar. El CS50-l toma el archivo binario y se fusiona con el archivo binario. Así cs50.h, no tiene sentido en la transformación de cs50.h del lenguaje C a binario cada una sola vez se está utilizando. Eso sería una tontería, porque eso se pierde mucho tiempo. Por lo tanto, ya se ha compilado y se convirtió en un ejecutable. Y ahora que va a combinar con su archivo al final. Así que los de 1 y 0 de van fusionarse con sus seres y 0 en el extremo. Así que ahora que usted realmente tiene el real 1 y 0 del que definen cómo getString, por ejemplo, las obras, o como printf, por ejemplo, las obras. Y para más información, hay una compiladores cortos que Nate da que usted debe comprobar que va a través de estos pasos. Pero - Sí. ESTUDIANTE: ¿Son siempre los archivos o. cuando están en forma de biblioteca, listo para combinarse, vinculado - como que están en el código binario? JASON HIRSCHHORN: OK. Lo que - ESTUDIANTE: ¿Eso es siempre el caso para las bibliotecas cuando se vinculan? JASON HIRSCHHORN: Si. Así que hay. S archivos, que serán código de máquina, que también será críptica a usted. Usted no tiene que preocuparse por eso. Pero en general, sí, van a estar en formato. o archivos listos para ir. ESTUDIANTE: Entonces, cuando usted envía a una biblioteca, no sólo se envía la. h y. o? No envíe el. Co el. S. JASON HIRSCHHORN: So - y esto es en este corto y, si esta información parece estar llegando a poco rápido. Sin embargo, el corto de compiladores habla de esto también. Cuando usted envía una biblioteca, si usted envía la. h, el archivo de cabecera, los prototipos de funciones, y el 1 de y De 0, eso es todo lo que tiene para dar. No es necesario para dar forma en que el La opción funciona, el archivo c.. Debido a que el punto de extracción, o la señalar las API, el punto en el SPL, la biblioteca portátil de Stanford, es para que usted no se preocupe por cómo las nuevas GRect funciona, o cómo se mueven las obras, o cómo añadir obras. Todo lo que necesitas saber es que añadir es una función que pueda utilizar, y lo hace. Así que realmente no necesita saber cómo está escrito en C. Sólo necesitas saber, aquí están las funciones, lo que hacen, y aquí están las de 1 y 0 cuando usted realmente desea utilizarlos. Genial. ¿Alguna pregunta más sobre los compiladores u otros temas del foro? ESTUDIANTE: Tengo una pregunta de la implementación de las funciones recursivas. Una pregunta acerca de la recursividad. Tuve la sensación de que se van a plantear. Así que vamos a ir rápidamente a través de recursividad con una específica ejemplo, una función factorial. Debido a que este es un ejemplo que surge con frecuencia o que se utilicen para ilustrar la recursión. Así "4!" se lee como 4 factorial. ¿Y qué significa 4 factorial? ¿Qué quiere hacer? ¿Cómo se calcula 4 factorial? 4 veces 3 veces 2 veces 1. Así que otra manera de escribir 4 factorial es escribir esto. 4 Tiempos 3 factorial. Debido 3 factorial es 3 veces 2 veces 1. Así que 4 veces 3 factorial es 4 veces 3 veces 2 veces 1. Esta es la razón factorial es una gran candidato a la recursividad, porque es claro que hay algo que sucede una y otra y otra vez en un menor número de cosas hasta llegar a la final. Al llegar a 1, 1 factorial es 1. Usted no puede ir mucho más allá. 0 factorial también se define como 1. Así que cuando se llega a 1 o 0, eres al final, y que pueda empezar a ir hacia arriba. Así que si queríamos escribir una recursiva función para calcular un factorial, vamos a escribir algunas pseudocódigo para eso ahora. Antes de que escribimos que pseudocódigo - Voy a dar ustedes un par de minutos para escribir el código de pseudo o simplemente pensar en ello - hay dos cosas cada función recursiva necesita. ¿Cuáles son esas dos cosas? JACK: Tiene que llamarse a sí misma. JASON HIRSCHHORN: Noé? Oh, Jack. Adelante. JACK: Tiene que llamarse a sí misma. JASON HIRSCHHORN: Así que un recursivo función necesita una llamada recursiva, una llamar a sí mismo. Esa es una. ¿Y cuál es la otra cosa? JACK: Un caso base. JASON HIRSCHHORN: un caso base. Un caso base es, aquí es cuando nos detenemos. Por lo que su función se llama. El caso base es lo primero. ¿Quieres saber si eres al final. Y si no estás en la final, hacer su llamada recursiva. Y usted va a través de esta función de nuevo, comprobar su hipótesis de base de nuevo. Si usted no es el final, se hace otra llamada recursiva, et cetera, et cetera. Es por eso que las funciones recursivas siempre necesitar esos casos base y los llamadas recursivas. Si usted no tiene una llamada recursiva, se no sería una función recursiva. Si usted no tiene un caso base, usted iría para siempre y no habría final. Y el caso base es siempre lo primero, porque siempre se quiere comprobar si estás al final primera. Así que antes de hacer un poco de pseudocódigo, ¿por qué Por qué no te tomas un minuto para pensar en cómo una función factorial recursiva se escribiría? Además, todas las que están haciendo, por escrito hacia fuera en una hoja de papel es lo que vas a tener que hacer en el examen de mañana. Así que probablemente una buena práctica hacer Asegúrese de que el código que está escribiendo hacia abajo en la hoja de papel - o se puede hacer eso. ¿Sabes dónde están los puntos y comas. ¿Te acuerdas de la sintaxis. Porque usted no está capaz de tener una compilador dice que usted hizo un error. También, a lo largo de esas líneas, mañana, cuando que haya problemas de codificación, si se precipitó por el tiempo, o si usted es muy confundido en cuanto a cómo se supone que debes escribir la cosa particular en C, le tocaría escribir pseudo-código y escribir comentarios en también. Porque no hay crédito parcial para un Muchas de las preguntas en el cuestionario. Así que usted puede estar apurado, o usted sólo podría ser confundido. Escribiendo en los comentarios o pseudo-código a menudo son maneras que usted puede obtener crédito parcial. Así que no deje algo en blanco en el cuestionario. No hay sanciones por poner las cosas pulg De hecho, poniendo en pseudo-código o comentarios va a ayudar a la motoniveladora averiguar si realmente sabe lo que que está hablando, y quizás premio que algo de crédito parcial para eso. También a lo largo de esas líneas, escribir con claridad. Si no podemos realmente lo que estamos escribiendo, no vamos a llamar a la medianoche de mañana con la figura lo que escribiste. Sólo vamos a despegar puntos. Escribir con claridad para que podamos escuchar, o mejor dicho, podemos leer lo que escribiste. Y si dice dos frases, no escriba un párrafo. Siga las instrucciones. Escribir con claridad. Y escribir en estos comentarios o pseudocódigo para las preguntas que podrían concesión de crédito parcial. OK, vamos a ir a factorial. Así que tenemos una función factorial. Si tuviera que escribir realmente esto en C, ¿qué tengo que poner delante del nombre de la función? El tipo de retorno, que, en este caso, vamos a darle int. Y luego, dentro de las llaves, es lo que pasa dentro de las llaves para una función? ESTUDIANTES: Tipo de argumento. JASON HIRSCHHORN: sus argumentos. Así factorial probablemente tener una discusión. Va probablemente sólo tienen un argumento. Y vamos a decir que va a tomar un número entero llamado x. Y de nuevo, al escribir el prototipo de una función o escribir la función en el código antes de definirla, se escribir el tipo de datos y el nombre de esa variable sólo para esa función. Así que usted puede pasar algún número en esta función, que va a ser referido como x internamente. Tenemos nuestra función factorial. Necesitamos dos cosas, un caso base y una llamada recursiva. ¿Cuál es el caso base para el factorial? Alguien que lo escribió y que no tiene todavía se habla, ¿cuál es la base caso de factorial? ESTUDIANTE: Si n es menor de 2, devuelve 1. JASON HIRSCHHORN: Si n es menos de 2, devuelve 1. Me gusta eso, porque eso se encarga de 0 y 1. Así que vamos a hacer x <2, devuelve 1. Si nos cruzamos 0, si conseguimos pasado 1, esta función se volver inmediatamente 1. Si nos pasamos un número mayor que o igual a 2, vamos a tener nuestra llamada recursiva. Y entonces, ¿cómo es que va a funcionar? ¿Puede alguien que trabajó en este que no ha hablado todavía me dan la llamada recursiva para esta función en pseudocódigo? Si nos pasamos de un número x y es mayor que 2, lo Qué queremos hacer? También hemos de ejemplo escrito en la secundario que le podría dar una pista. ESTUDIANTE: Llame x veces el factorial de x menos 1? JASON HIRSCHHORN: Exactamente. Vamos a volver x veces el factorial de x menos 1. Y eso, a pesar de que he escrito arriba, básicamente, lo que dijo en Inglés, esta función factorial se llamará de nuevo. Se va a ejecutar en x menos 1. Va a volver con algún entero, y entonces va a multiplicar estos dos juntos, y ese valor será vuelto a lo que sea llamado a este función factorial, lo que podría ser otro ejemplo de esta función factorial. Así que es un ejemplo de un recursiva función, una muy función recursiva simple. Pero la mayoría de ellos será así. Si quieres un buen recursiva luchar por la prueba, trate de codificación búsqueda binaria recursiva. Porque si lo hicieras de búsqueda binaria para problema fijó tres, probablemente lo hizo iterativa en un bucle while. Pero también puede ser escrito de forma recursiva. Vas a tener que escribir su propia función separada que lleva algún diferentes argumentos de línea de comandos - o no los argumentos de línea de comandos, algunos diferentes argumentos sólo regular. Pero se podría escribir de búsqueda binaria de forma recursiva así. ESTUDIANTE: ¿Así que también podría haber escrito, en vez de x menos 1, que también podría haber escrito x menos menos, ya que podría tener escrito minus minus x. ¿Puedes explicar muy rápidamente por qué esas serían las cosas diferentes, como cuál es la diferencia entre x menos menos y menos menos x? JASON HIRSCHHORN: No, no estoy va a entrar en eso. Pero voy a hablar con usted acerca de él después de clase. x menos menos, menos, menos x disminuir x en 1. Pero lo hacen un poco diferente. Pero yo no quiero entrar en eso. Otras preguntas sobre la recursividad o esta función? Eso no es realmente incluso pseudocódigo. Eso es básicamente el código en C usted escribiría para esto. OK, cualquier otra pregunta acerca de los temas hasta aquí? Sí. ESTUDIANTE: Tengo un pequeño repaso a la punto y flotante de precisión. JASON HIRSCHHORN: Flotante punto y precisión. ¿Puede alguien realmente rápido me da un resumen de punto flotante y precisión? Todos ustedes que tenías que hacer esto para su problema establecido, por lo que estamos todos familiarizado con él. O tal vez no todos ustedes. ¿Alguien? Dadme un punto de empezar. Punto flotante y precisión. ¿Cuál es el problema? Sí. Victoria? VANESSA: Vanessa. JASON HIRSCHHORN: Vanessa. Lo siento. VANESSA: Sólo hay un número finito de números que pueden ser representados porque estás en una, en nuestra caso, un sistema de 32 bits. Así que tipo de tener que compensar algunos números. JASON HIRSCHHORN: Así que eso es exactamente correcto. Hay sólo una cierta cantidad de números que pueden ser representados. Si se multiplican dos números muy grandes, podría desbordarse la cantidad de los espacios que tiene que representar un número entero. Es por eso que a veces se utiliza un long long en lugar de un int. Eso tiene más espacios. Que puede contener un número mayor. Punto flotante de precisión tiene que ver con eso, sino que también tiene que ver con la hecho de que los números decimales son no siempre representado. Lo siento. Permítanme decirlo de esta copia de seguridad. El número decimal 1.0 no es siempre representado como es de esperar, 1,000000000. A veces se representa como 1,000000001 0,999999999 o. Se podría incluso 89 lanzado en alguna parte. Así que los números decimales no son representado exactamente igual que lo haría esperamos que sean representados. Así que en conjunto de problemas - fue dos? - problema fijó dos, donde nos topamos con Los números de punto flotante, cuando queríamos que representan exactamente lo que queríamos que representan, el número de monedas de un centavo, o el número de centavos, multiplicamos por 100 de ellos. Les rodeamos. Y luego le cortamos todo detrás del punto decimal. Eso era para asegurarse de que lo harían realidad es igual exactamente lo que queríamos que igualan. Porque cuando se toma algo que es Un flotador y convertirlo en un int, que cortar todo a la derecha de la coma decimal. Debido a que hay un poco de punto flotante imprecisión, 100.000 podrían ser representados como 99,999999999. Y si lo que cortó todo para la derecha de inmediato, vamos a obtener el número equivocado. Sí. ESTUDIANTE: Yo tenía una pregunta sobre el casting. ¿En qué orden se le ocurre entrar? Si lo hace flotar, soportes, 1 divididos por 10, es lo que hace 1 dividido por 10, a continuación, obtener 0,1, luego gire en un flotador? JASON HIRSCHHORN: Si lo hace flotar 1 dividido por 10 - ESTUDIANTE: Sí, y entonces es igual a - así, lo haría normalmente tenerlo igual - Sí. ¿Quieres hacer un flotador, ¿verdad? JASON HIRSCHHORN: OK, así que vamos a utilizar eso para ramificarse en averiguar las respuestas a estas preguntas a través de la codificación. Debido a que es probable que tenga una gran cantidad de estas preguntas minutos, y una buena manera para resolverlos es a través de la codificación. Así que vamos a codificar esto en este momento, y luego vamos a volver atrás y codificar la pregunta que tenía. Así que la primera línea - No debí haber escrito - lo que es lo primero que queremos hacer cuando abrir un nuevo archivo en gedit? ESTUDIANTE: Include. JASON HIRSCHHORN: Incluya qué? ESTUDIANTE: biblioteca CS50. JASON HIRSCHHORN: OK. ¿Qué más debemos incluir? Sólo vamos a comprobar lo que sucede cuando lanzas algo a un flotador. Pero, ¿qué necesitamos para incluir si estamos va a escribir un programa en C? ESTUDIANTE: E / S estándar JASON HIRSCHHORN: stdio.h. En realidad no necesitamos, para este programa, cs50.h, aunque es Siempre es útil incluirlo. Pero nosotros siempre necesitamos stdio.h. ESTUDIANTE: Cuando se codifican en C? JASON HIRSCHHORN: Al programar en C. Así que me lo guardo como el archivo c.. Tengo algunas buenas resaltado de sintaxis. Escribí vacío interior principal. ¿Qué significa el vacío? ESTUDIANTE: No tomar ninguna argumentos de la línea de comandos. JASON Hirschhorn: medio vacío, en este caso, el principal no se hace argumentos de la línea de comandos. En otros casos, significa que la función no toma argumentos de la línea de comandos. O la función, si yo tuviera que escribir void main (void), que dirían principales no devolver nada. Así vacío sólo significa nada. ¿Qué haría yo escribo si tuviera que tomar argumentos de línea de comandos? ESTUDIANTE: int c arco arco cadena de v JASON HIRSCHHORN: int argc argv cadena. ¿Es eso cierto? ESTUDIANTE: Es corchetes argv estrella carac. JASON HIRSCHHORN: Así que usted podría escribir soportes argv cadena o argv estrellas caracteres corchetes, pero que necesita los corchetes. Debido argv es un array de cadenas, recuerda. No es sólo una cadena. Así argv cadena es, aquí está una cadena llama argv. Soportes argv cadena es, aquí está una matriz de cadenas. Soportes argv cadena argc Así int sería algo que me probablemente escribir. Así que quería guardar en un entero? ESTUDIANTE: Sí, entero. O en un flotador. JASON HIRSCHHORN: En un flotador? Al igual que, float x es igual a 1 dividido por 10. JASON HIRSCHHORN: OK. ¿Cómo puedo imprimir un flotador en printf? ¿Qué? ESTUDIANTE:% f. JASON HIRSCHHORN:% f. ¿Qué es un número entero? d o i. ¿Qué es una cadena? ESTUDIANTE: s. JASON HIRSCHHORN: s. ¿Cómo puedo obtener una nueva línea? ESTUDIANTE: Backslash n. JASON HIRSCHHORN: ¿Qué debo hacer para devolver si se ejecuta correctamente principales? ESTUDIANTE: 0. ¿Tengo que escribir esa línea, sin embargo? ESTUDIANTE: No. Bueno, no vamos a escribir, entonces. ¿Todos pueden leer eso? Se parece un poco pequeña. ¿Todos pueden ver, o debería Lo hago más grande? Creo que para la cámara, vamos a hacer es un poco más grande, sin embargo. JASON HIRSCHHORN: Si quiero convertir este . C presentar en un archivo ejecutable, lo que Por qué escribo? ESTUDIANTE: Haga la prueba. JASON HIRSCHHORN: ¿Lo sientes? ESTUDIANTE: Haga la prueba. JASON HIRSCHHORN: Haga la prueba. Estábamos hablando de esta línea antes. Clang. ¿Qué hay sonido metálico? El nombre del compilador. ¿Cuál es esta línea? ESTUDIANTE: Establece que para la utilización de GDB. JASON Hirschhorn: Conjuntos para arriba para uso de GDB. Esta línea, ¿qué es eso? ESTUDIANTE: El código fuente. JASON HIRSCHHORN: Ese es el archivo de origen, el archivo c.. ¿Qué hacen estas dos líneas? O estos dos no líneas. ESTUDIANTE: Nombra lo prueba. JASON HIRSCHHORN: Así que el guión o dice, nombrarlo algo diferente. Y aquí estás llamándolo prueba. Si yo no tengo que, ¿cuál sería el nombre de esta? ESTUDIANTE: a.out. JASON HIRSCHHORN: a.out. ¿Qué hace esto? ESTUDIANTE: Vincula la biblioteca matemática. JASON HIRSCHHORN: Vincula en la biblioteca de matemáticas. No incluimos la biblioteca matemática, pero ya que es tan común, que han make escrito para incluir siempre la biblioteca matemática. Y del mismo modo, lo que incluye la biblioteca CS50. Aceptar, por lo que si enumeramos, ahora tenemos un ejecutable llamado prueba. Para ejecutarlo, escribo prueba. Veo que mi punto flotante, como era de esperar, es igual a 0. ¿Eso - por lo que - ESTUDIANTE: Entonces, si usted pone flotar ahora, como lo lanzas como float - JASON HIRSCHHORN: Cast la 1 a un flotador? ESTUDIANTE: No, tire la cosa completa - sí. Si usted acaba de hacer eso, ¿ Eso lo hace un 0,1? JASON HIRSCHHORN: OK, así que muy rápido, 1 dividido por 10, esos son enteros se dividen. Así que cuando se divide números enteros, son 0, y que está ahorrando que 0 en un flotar, porque la barra es sólo la división entera. Así que ahora estamos convirtiendo algo en un flotador. Vamos a ver qué pasa. Vamos a hacer la prueba. Así que ahora vemos que esa barra no era división entera, que estaba flotando división de coma. Debido a que uno de sus argumentos había sido echado a un flotador. Así que ahora que estaba diciendo, el tratamiento de esta división como que estamos tratando con puntos flotantes, no con números enteros. Y así obtenemos la respuesta que esperamos. Vamos a ver lo que pasa - ¡Uy. Si quisiera imprimir más decimales lugares, ¿cómo podría hacerlo? Punto f Point, o como muchos: ESTUDIANTE decimales que desee. JASON HIRSCHHORN: Así que imprimo 10 lugares decimales. Y ahora vemos que estamos recibiendo algunas cosas raras. Y eso va volviendo a tu pregunta acerca de coma flotante imprecisión. Hay cosas raras almacenado aquí. Bien, ¿eso responde a tu pregunta? ¿Qué más quieres para codificar rápidamente? ESTUDIANTE: Yo sólo quería ver si No, si te liberas un poco de puntero, si ese puntero todavía había almacenado en que la dirección de lo que había sido señalando previamente. JASON HIRSCHHORN: OK, por lo que vamos a hacer eso. Carácter ptr estrella, esto crea una variable llamado ptr de tipo char estrellas. ¿Cómo escribo malloc? Alden? ALDEN: Just malloc. Pero entonces tiene que ser el tamaño de, y en este caso, supongo que se había estar apuntando a char. Así que sería caracteres. JASON HIRSCHHORN: OK, así que más genéricamente, Inside - vamos a editar. Malloc Dentro, desea que el número de bytes en el montón. En general, lo que hemos visto que somos haciendo es que vamos a malloc cadenas, por ejemplo, o matrices de enteros. Así que si queremos 10 enteros, o el 10 caracteres, 10 nos dará 10. Y a continuación, el tamaño de los caracteres daría nos que el tamaño de caracteres, que en este caso es de 1 byte. Tenemos 10 bytes. Si tuviéramos que escribir el tamaño de int, eso nos daría 40 bytes. Así que más genéricamente, en el interior de malloc es el número de bytes que desea. En este caso, estamos recibiendo 1 byte. Lo que parece como un uso extraño de malloc, pero para nuestro propósitos tiene sentido. Así que hay que. Vamos a llamar gratis. Nos deshacemos de ella y usamos ptr nuevo. ¿Y qué desea comprobar? ESTUDIANTE: Yo sólo quería comprobar si o no había nada dentro de ella. JASON HIRSCHHORN: Así que si apuntaba a algo? ESTUDIANTE: Sí, exactamente, si todavía tenía una dirección de memoria. JASON HIRSCHHORN: ¿Así que quieres para comprobar el valor de ptr? ESTUDIANTE: Sí, exactamente. JASON HIRSCHHORN: ¿Qué es lo que escribo aquí si quiero comprobar el valor de la punto - lo que es, Jordania dijo, el valor? O lo que se almacena dentro de ptr? ESTUDIANTE: Dirección de la memoria. JASON HIRSCHHORN: Dirección de la memoria. Así que si yo escribo sólo esto, que va a dame el valor de PTR. ¿Y cómo puedo imprimir a cabo una dirección de memoria? ¿Cuál es la cadena de formato para una dirección de la memoria? ESTUDIANTE:% p. JASON HIRSCHHORN:% p. % S es una cadena. % P para el puntero. ¿Es eso cierto? Eso es correcto. Así ptr es igual a - que todavía tiene algo en ella. Esta es probablemente una más pregunta interesante. ¿Qué hace esa línea? ESTUDIANTE: fallas Seg. JASON HIRSCHHORN: ¿Qué? ESTUDIANTE: Creo que SEG faltas. JASON HIRSCHHORN: Hm? ESTUDIANTE: Creo que va a SEG culpa. JASON HIRSCHHORN: Así que esta línea de ptr código, estrella, lo que Qué significa la estrella? ESTUDIANTE: El contenido de. JASON HIRSCHHORN: Si. Ir a sacar el contenido de. Así que esto va a ir a la memoria abordar allí y darme eso. Solía% c aquí porque hay son caracteres almacenados allí. Así que vamos a ir a esa dirección nos Acabo de ver - o probablemente va a ser un poco diferente este vez que ejecutamos el programa. Pero vamos a ir a esa dirección que sabemos que todavía existe y ver lo que hay allí. Así que no SEG culpa. Simplemente no nos ha dado nada. Puede ser que haya en realidad nos ha dado algo, simplemente no lo puede ver. Y eso va de nuevo a esta idea - y nosotros no vamos a tener demasiado en esto, porque eso es más allá de la alcance de este curso. Pero hemos hablado aquí, si nos fue más allá de los límites de la matriz por 1, podríamos no tener problemas. A veces, cuando te vas fuera por 1, que estás haciendo algo mal, y usted podría meter en problemas. Pero no siempre se meten en problemas. Depende de cuánto de algo malo que Qué, te vas a meter en problemas. Lo cual no quiere decir, ser descuidado con su código. Pero es decir, el programa no se siempre dejar de fumar, incluso si vas en algún lugar que no debes ir. Un buen ejemplo de esto es, una gran cantidad de personas en su problema conjunto 3, que tenía 15 años, no comprobó la límites de la junta. Así que miró a la izquierda, miró a la derecha, miró a lo alto, se veía a la parte inferior. Pero usted no comprobó para ver si la parte superior fue en realidad va a estar en el consejo. Y un montón de gente que hizo eso y resultó que en, su programa funcionó perfectamente, porque donde estaba ese tablero almacenada en la memoria, si usted fue uno por encima de ella o comprobado que la memoria dirección, no había nada particularmente horrible de que, por lo que su programa no era va a gritar a usted. Pero seguiríamos despegar puntos si que no compruebe que, debido a que estaban haciendo algo que no estabas supone que debe hacer, y usted podría tener metido en problemas. Las probabilidades son, sin embargo, es probable que no lo hiciste. Así que esto es para demostrar que, sí, todavía podemos ir a ella. Y no vamos a entrar en problema en este caso. Si tratamos de hacer leer el próximos 100 caracteres, habíamos probablemente meterse en problemas. Y usted puede codificar la lectura de la siguiente 100 caracteres si quiere haciendo algunas especie de bucle. Sí. ESTUDIANTE: Desde que nos asignaron que espacio de un valor real, no lo haríamos realmente será capaz de ver nada. ¿Hay que probarlo con el ajuste que igual a como C o algo? JASON HIRSCHHORN: Muy buena pregunta. ¿Cómo se configura el valor - qué línea de código Cómo puedo escribir en la línea siete para hacer lo que dijiste? ESTUDIANTE: Star ptr es igual a un solo cita c Extremo comilla simple. JASON HIRSCHHORN: Así que eso es poner un carácter, c, en ese lugar, porque una vez más, esa estrella significa ir a allí. Y cuando se usa en el lado de la mano izquierda de un operador de asignación, que es igual a firmar, que no vamos a conseguir que la valor tanto como establece ese valor. Ahora vamos a ver qué pasa. Ponemos algo allí y fue allí. Llamamos libre. Algunas cosas que probablemente sucedió en el montón. Por lo tanto, ya no está allí. Pero de nuevo, no estamos obteniendo en problemas por ir allí. Estoy haciendo esto en el código para ilustrar que muchos de estos preguntas que usted tiene, que son muy interesante responde a una gran cantidad de tiempo. Y ellos son realmente buenas preguntas. Y usted puede calcular hacia fuera en su cuenta si, por ejemplo, ya no estamos en la sección. Sí. ESTUDIANTE: Debido a que usted no va a enviar el puntero en cualquier lugar, es lo que necesita utilizar malloc? JASON HIRSCHHORN: Así que esto se remonta a su pregunta inicial. [? ?] ¿Es sólo una variable local? Malloc aquí no es que convincente. El uso de malloc aquí no es que convincente porque es sólo una variable local. ESTUDIANTE: Entonces podrías hacer carbón ptr estrellas es igual a saludar? JASON HIRSCHHORN: Oh. Así que vamos a volver ahora a su pregunta inicial. Creo que usted no está satisfecho con mi respuesta. ¿De acuerdo? Al igual que? ESTUDIANTE: Sí. Espere. JASON HIRSCHHORN: ¿Y dónde Qué quieres imprimir? Así que vamos a imprimir una cadena de esa manera? ESTUDIANTE: Interesante. JASON HIRSCHHORN: Esto dice esto argumento tiene el tipo de un carácter. Así que esto debe ser un carácter. ESTUDIANTE: Apenas toma la primera. JASON HIRSCHHORN: Así que esta es lo que dije antes. Como he dicho, no es el almacenamiento de la cadena dentro de puntero variable. Es el almacenamiento - ESTUDIANTE: El primer valor de la cadena. JASON HIRSCHHORN: La dirección de el primer valor de la cadena. Si nos vamos a imprimir esto, estamos obtener el valor dentro de puntero. Y veremos que es, de hecho, una dirección de memoria. ¿Eso tiene sentido? Lo siento. Espera, ¿eso responde a tu pregunta, sin embargo? ESTUDIANTE: Sí. JASON HIRSCHHORN: Esta línea de código es la creación de una cadena y luego otro puntero variable que se apunta de esa cadena, de la matriz. Sí. ESTUDIANTE: Entonces, si nos fuimos un recuerdo seguir haciendo frente, sacaríamos el h? Se ha almacenado como una cadena? JASON HIRSCHHORN: Al igual que, lo hicimos - así que esto es valioso hacer. Esta es la aritmética de punto, que ustedes han visto antes y debe ser relativamente cómodo. Esto es similar a la escritura - si tuviéramos que escribir esta línea de código, hemos visto la notación de matriz antes. Esto nos debe dar la segunda valor en este array, h. Si hiciéramos esto, esto también debe dar nosotros el segundo valor en ese array. Debido a que no va a la memoria dirección de la primera hora, pero el dirección de memoria de la cosa de una vez. Y entonces los desreferencias operador estrellas ese puntero. Y de nuevo, vamos a ver. Recibimos h de nuevo. ESTUDIANTE: ¿Qué significa exactamente dereference significa eso? JASON HIRSCHHORN: Dereference es una palabra elegante para ir a. Ir a eso y lo que hay es eliminar la referencia de un puntero. Es sólo una palabra elegante para eso. ESTUDIANTE: Si quisiéramos imprimir toda la cadena, podríamos hacer puntero signo? JASON HIRSCHHORN: OK, estamos va a hacer una pausa aquí. Vamos a terminar aquí. Ampersand le da la dirección de un ubicación, así que cuando usted hace signo de una variable, que te da la dirección donde se almacena esa variable. Puntero Ampersand le dará la Dirección de ptr ptr donde está en la memoria. No vamos a ir en con este ejemplo. Usted puede averiguar estos cosas por su cuenta. Pero de nuevo, esto podría incluso ser un Rayando poco más allá de lo que necesita saber para el alcance de esta mitad de período - o este cuestionario, más bien. Lo siento. Vamos a seguir adelante, porque lo haría gustaría hacer un problema de codificación antes de tiempo se ha acabado. Y vamos a codificar lo que pienso es la más convincente de estas ejemplos, atoi. Así que esto era una cuestión sobre un concurso hace dos años. Y yo tengo en el tablero aquí. La gente se les preguntó en el cuestionario - se les dio un poco más tesxt en la pregunta, pero he eliminado la texto, porque no era necesario para nuestro propósito ahora. Era sólo algunos antecedentes en lo atoi hizo. Pero todos ustedes saben y son muy familiarizados con atoi. Le sugiero que codifica esta en una hoja de papel. También le sugiero que utilice la estrategia que hemos repasado mucho en nuestra sección. En primer lugar, asegúrese de que entiende lo atoi está haciendo. Haz un dibujo o llegar a algún imagen mental de él en su cabeza. A continuación, escriba el pseudocódigo para esto. En el cuestionario, si lo único que consigue es pseudocódigo, por lo menos poner algo abajo. Y luego asignar ese pseudocódigo en C. Si usted tiene un cheque en su pseudocódigo, como comprobar si algo es 1, que asigna a un caso condiciones y así sucesivamente. Y, por último, el código del programa en C. Así que volver a atoi y tardar cinco minutos codificar esto en una hoja de papel, que es probablemente el cantidad de tiempo que le llevará en un cuestionario para atoi código. De cinco a 15 minutos, de cinco a 12, de cinco a 10 minutos, se trata de la cantidad de tiempo que le dedica a esa pregunta de la prueba. Así tardar cinco minutos, por favor. Y si usted tiene alguna pregunta, levante la mano y voy a entrar en razón. [conversaciones paralelas] JASON HIRSCHHORN: OK, así que que era de cinco minutos. Ese fue probablemente por la cantidad de tiempo que pasaría en ese en un concurso, tal vez la parte baja de la época. Vamos a recapitular un poco. Comencemos codificar esta. Y si no llegamos hasta el final, las respuestas a esta y esta pregunta de examen están disponibles, una vez más, El otoño de 2011 es cuando esta pregunta aparecido en el cuestionario. Y valió la pena ocho puntos en el cuestionario a continuación. Ocho puntos está en el extremo superior de la cantidad de puntos algo vale la pena. La mayoría de preguntas están en el rango de uno a seis puntos. Así que esta es una más desafiante pregunta, seguro. ¿Puede alguien ayudarme a empezar? En general, ¿qué vamos a querer hacer con esta funcionar atoi, lógicamente? ¿Qué queremos hacer? Así que vamos a escribir algunos pseudocódigo. ESTUDIANTE: Convertir caracteres en enteros. JASON HIRSCHHORN: Convertir caracteres en enteros. Aceptar. Entonces, ¿cuántos caracteres estamos va a tener que ir a través de? ESTUDIANTE: Todos ellos. ESTUDIANTE: Todos los personajes en la cadena. JASON HIRSCHHORN: Todos los de la caracteres de la cadena. Así que si queríamos ir a través de cada carácter de una cadena, lo que es una cosa en C que hemos visto que ha permitido nosotros ir a través de cada carácter de una cadena? ESTUDIANTES: Un bucle for. JASON HIRSCHHORN: Un bucle for. Así que vamos a recorrer todos los personajes en s. Entonces, ¿qué vamos a querer hacer cuando lleguemos a un personaje en concreto? Digamos que estamos consiguiendo pasamos por un 90. Obtenemos el 9. Es un personaje. ¿Qué queremos hacer con que el carácter 9? ESTUDIANTE: restarlo de carácter 0? ESTUDIANTE: Agrega 0? JASON HIRSCHHORN: Reste desde 0 personaje? ESTUDIANTE: Sí. JASON HIRSCHHORN: ¿Por qué que quieres hacer eso? ESTUDIANTE: [inaudible] valor. Su valor int. JASON HIRSCHHORN: OK, así que nos tomamos el carácter 9, restarlo de carácter 0 para obtener una número entero real 9. Sweet. Y, ¿cómo saber que el carácter 9 menos 0 caracteres es 9? ¿Qué gráfica qué nos fijamos en? ESTUDIANTE: Hay lógicamente nueve lugares entre 9 y 0. O usted podría mirar a la tabla ASCII. JASON HIRSCHHORN: tabla ASCII. Pero sí, tiene usted razón también. Entonces restamos 0. Así que ahora tenemos el entero 9. ¿Y qué es lo que queremos hacer con eso? Si tenemos 90, es el primer entero tenemos, lo que queremos hacer? ESTUDIANTE: Me pongo en un número entero temporal matriz, y luego hacer las matemáticas para que después de convertirlo en un fin. JASON HIRSCHHORN: OK. ESTUDIANTE: Usted puede comenzar a finales de la matriz y luego avanzar de manera que cada vez que se mueve hacia adelante, lo multiplicas por 10. JASON HIRSCHHORN: OK. Eso suena como una muy idea convincente. Podemos empezar por el final de nuestra serie, y podemos usar strleng. Podemos utilizar strleng aquí. Conseguiremos la duración de nuestra cadena. Partimos al final. Y + la primera, sólo tomamos que entero, y tal vez creamos como un nueva variable entera hasta la parte superior donde estamos almacenando todo. Así el ciclo que recorre todos los caracteres en s de atrás hacia adelante, restamos 0, y entonces lo tomamos, y en función de donde está, lo multiplicamos por una potencia de 10. Debido a que la primera de ellas, ¿qué hacemos multiplicar el carácter más a la derecha por el camino? ESTUDIANTE: 10 al 0. JASON HIRSCHHORN: 10 a 0. ¿Qué es lo multiplicamos el segundo carácter más a la derecha por el camino? ESTUDIANTE: [inaudible]. JASON HIRSCHHORN: ¿Qué? ESTUDIANTE: 10 a la 1. JASON HIRSCHHORN: 10 a la 1. El carácter tercio más a la derecha-? ESTUDIANTE: 10 a la 2. JASON HIRSCHHORN: 10 a la 2. ESTUDIANTE: Lo siento, no lo entiendo lo que estamos haciendo aquí. JASON HIRSCHHORN: OK, Volvamos, entonces. Así que vamos a obtener aprobada en una cadena. Debido a que estamos escribiendo atoi. Así que van pasando de una cadena. Digamos que estamos consiguiendo pasamos en la cadena 90. Lo primero que vamos a hacer es establecer una nueva variable de tipo entero que somos sólo va a crear como nuestro nuevo entero. Eso es lo que vamos para volver al final. Tenemos que ir a través de todos los personajes en la cadena porque hemos determinado que tenemos que tocar cada uno y a continuación, agregarlo a nuestro nuevo entero. Pero no podemos agregarlo como un número. No podemos tomar 9 y añadir 9 a nuestro número entero. Depende de qué lugar es en la cadena. Vamos a tener que multiplicar que por una potencia de 10. Porque así es como base de 10 obras. Así que vamos a obtener el real carácter, o el número entero real número, restando carácter 0 de carácter 9 como hicimos con restando calidad capital A partir de cualquiera que sea el carácter que hemos tenido en una de esos problemas. Así que vamos realmente obtenemos un número de 0 a 9 guardan como un número real, y vamos a se multiplica por una potencia de 10, dependiendo en donde estamos en la cadena. Y luego vamos a agregarlo de nuevo en nuestra nueva variable entera. Así que lo que esto se vería como lo haría BE - dibujaremos aquí. Si nos pasamos en la cadena de 90 - ESTUDIANTE: [inaudible]. JASON HIRSCHHORN: Pero atoi toma una cadena. Así que vamos a ir a través de la explotación. Le daremos pasamos en el 90. Vamos de nuevo a la parte delantera. Tomamos el 0. ESTUDIANTE: Lo siento. Tal vez esto es una estupidez. Si nos vamos a aprobamos en una cadena, por qué es 90 lo que estamos conseguir pasar en? Debido a que 90 es un número entero. JASON HIRSCHHORN: Porque atoi toma cadena y la convierte en el número entero representación de esa cadena. Pero la cadena 90 no es el número entero 90 o el número 90. La cadena 90 es un conjunto de dos, o tres personajes, más bien, el 9 carácter, el carácter 0, y la barra invertida 0 caracteres. Y estamos escribiendo atoi porque, por ejemplo, cuando se toma el comando argumento de la línea, y se guarda en argv, se guarda como una cadena. Pero si usted quiere tratar como un número, que necesita para convertirlo en un número entero real. Lo cual hicimos uno de nuestros boletines de problemas. Lo que hicimos en una serie de nuestros boletines de problemas. Todo el mundo que tuvo un entero como un argumento de línea de comandos. Así que por eso nuestra función atoi toma una cadena. Así que de nuevo, en nuestro ejemplo, estamos Va a tomar la última. Vamos a restar el carácter 0 de él, porque los personajes 0 restado por el carácter 0 le da el número real 0, según las matemáticas ASCII que hacemos. Dado que los caracteres se representan como diferente de su real - la un carácter, por ejemplo, minúscula es 97. No es - ¡Uy! No es todo lo que se puede esperar que sea, 0, por ejemplo. Así que hay que restar el carácter para conseguir un 0. Así que vamos a hacer eso aquí para obtener el número real. Y luego vamos a multiplicarlo por una potencia de 10 dependiendo de donde se se encuentra en la cadena, y luego tomar ese y agregarlo a nuestro marcador de posición variable, de manera que podemos llegar a nuestro nuevo entero final. ¿Eso tiene sentido para todo el mundo? Así que no vamos a codificar esta en este momento, porque estamos consiguiendo corto de tiempo. Pido disculpas por el tiempo de eso. Pero esto es lo que, con suerte, lo haría ser capaz de hacer en el concurso - en el lo menos, conseguir este pseudocódigo en escrito. Y luego, si tuviéramos que escribir la pseudocódigo, en realidad, podríamos hacer esto con bastante rapidez. Cada línea de comentarios que escribimos aquí se traduce en alrededor una línea de código C. Declarar una nueva variable, la escritura un bucle, algunos resta, algunos multiplicación y alguna asignación. Nos gustaría probablemente también queremos escribir una línea de retorno. También puede ser que desee poner algunas comprobaciones en aquí. Sí. ESTUDIANTE: Entonces, ¿podemos tratar s como la cadena real? Porque yo sé que es sólo una dirección. Al igual que, ¿cómo obtener la longitud de la cadena que se pasa a través de? JASON HIRSCHHORN: Entonces, ¿cómo la longitud de una cadena? Strlen. ESTUDIANTE: strlen, sí. Pero se puede poner s como el argumento para eso? JASON HIRSCHHORN: Así strlen lleva una estrella de carbón. Y resulta que la estrella char, y sigue contando hasta que llega a un barra invertida 0. strlen era en realidad uno de los otros programas que iban a código. Esa es otra buena para el código. Que uno es un poco más fácil, ya que si usted va a pensar en eso conceptualmente - Que acabo de decir en voz alta - strlen sigue un puntero y mantiene en marcha y contar y hacer el seguimiento hasta llegar a una barra invertida 0. ESTUDIANTE: OK, lo tengo. JASON HIRSCHHORN: Así que lo mejor de suerte en concurso 0 de mañana. Si usted tiene alguna pregunta, voy a estar fuera después de esto. No dude en enviarme un correo electrónico. Llegar a su propio TF si eres no en mi sección, o que mi por correo electrónico si usted lo desea. Si quieres flipar y acaba de enviar me un correo electrónico, un correo electrónico freakout, voy a le enviará de vuelta, como, una cara sonriente, o, como, una broma o algo así. Así que no dude en hacer eso también. Buena suerte otra vez, y lo voy a hacer nos vemos la semana que viene.