Section 4

Section 4

>> JASON HIRSCHHORN: Bienvenidoa la semana cuatro, cada uno. Tenemos una semana de mucho trabajo por delante. El lunes de esta semana y el miércolesla semana pasada, que ha sido introducido en punteros, y así que espero que tengasoplado su mente, pero esperemos que no te hizo demasiado confundido. Si es así, vamos a ir más que ensección de hoy, así como vamos hacer punteros. Vamos a ir a la pila, lo quelo que hemos hablado en la conferencia ya, y vamos a hacer alusión alo que vendrá el miércoles y más allá en términos de gestión de la memoria. Y, por último, vamos a hablar un pocosobre la Lengua Portable Stanford, que es la biblioteca de ustedes sonutilizando esta semana para poner en práctica el establece problema. >> Como he mostrado toda la semana pasada - Quería poner esta diapositiva de nuevo,porque se trata de una lista de la recursos que están disponiblesa usted CS50. Esto es lo que le damos fuera de lacaja, y estos son increíblemente importante para lo que eldiapositiva siguiente mostrará. Pero antes de llegar a la siguiente diapositiva,Quiero entrar en esto de nuevo. >> Para cada conferencia, haynotas que se toman. Es un resumen de la conferencia, perotambién tiene fragmentos de código y útil consejos y trucos. Así que si usted desea revisar la conferencia -espero que no te perdiste la conferencia, pero si lo has hecho, deberías rewatch - perocuando se quiere revisar conferencia, definitivamente echa un vistazo a losapuntes de clase. También hay código fuente en líneade cada conferencia. >> cs50.net/shorts son cortos,Entre 6 y 12 videos de un minuto. Ustedes han visto a muchos de ellos. También hay videos no asignamosa usted, pero cubren temas que son cubierto de conferencia en este curso. Así que si usted desea actualizar en lostemas, se echa un vistazo a estos pantalones cortos. >> study.cs50.net tiene cebadoressobre un montón de temas. Tiene videos. Tiene problemas de práctica. Es un recurso fantástico. Ven alguna pregunta, perotambién interrogar a tiempo. >> Un par de más recursos. Existe el comando man en elterminal que le da una cierta información sobre una determinadafunción o comando. Hay Google, mi recurso favorito -uno de mis recursos favoritos. Mi recurso favorito es el último,que vamos a llegar a en un segundo. Hay cs50.net/discuss. Ese es nuestro foro de clases. Hay horas de oficina de lunes aLos jueves, de 8:00 a 11:00. También hay horas de oficina en líneapara los estudiantes de extensión. >> Y, por último, si necesitas algo,tiene preguntas, comentarios o preocupaciones, usted tiene miinformación de contacto. Póngase en contacto conmigo, por favor. >> Así que como he insinuado, el próximo miércoles, unsemanas a partir de mañana, es su primera concurso, concurso de cero, ya que en la computadoraciencia empezamos a contar desde cero. Más información será proporcionada endar una conferencia de mañana, y una mano que se ser publicado finalmente en línea, con másdetalles específicos, en particular, la ubicación de prueba cero. Pero va a tener lugar el próximo miércolesen lugar de la conferencia. No hay conferencia el próximo lunesporque es un día de fiesta. >> La prueba incluirá todo el materialdesde la semana cero y la semana cinco, por lo que a través de esta semana, a través dedar una conferencia mañana. Material incluye las conferencias. Material incluye secciones. Material incluye los conjuntos de problemas, yespecialmente aquellas partes que comienzan de los boletines de problemas donde te paseabasa través de alguna información básica sobre lo que está a punto de cubrir. No mirar a través de los boletines de problemas. >> Para ayudar a todos con el cuestionario, juntoLunes, a pesar de ser un día de fiesta, el curso será el anfitrión de unasesión de revisión de todo el curso. Video de la sesión de revisión de todo el cursoserá publicado en línea si no son capaces de hacerlo. Además, el próximo martes en la secciónvamos a estar haciendo un montón de prueba revisar y espero jugar algunospeligro también, pero vamos a puede pasarse de responder a todas suspreguntas, pero voy a venir con una gran cantidad de preguntas útilesy la información basada en 10 años de pruebas. Tengo una idea bastante buena de lo que esva a aparecer y cómo preguntas son va a pedir, así que vamos a repasarlos de la sección el próximo martes. >> Además, yo no he puesto esta diapositiva hastala semana pasada, pero esto es algo que lo hizo la semana pasada. Así es como nos acercamos muchode los problemas de codificación que hicimos. Quería destilar nuestro enfoqueen algunos pasos simples que pueden ayudar a que con la solución de un problema de codificación. >> Recuerde que la semana pasada, codificamos binariobúsqueda, y lo primero que hicimos cuando queríamos código binario de búsquedaes que pensamos acerca de nuestro encabeza cómo funcionaba. Nosotros no sacamos una foto en la clase, peroLe pregunté a todo el mundo para ver el corto vídeo, que no tiene una imagenrepresentación de cómo búsqueda binaria funcionó. El primero y realmente queríamos hacerentender algo se haga un foto de entender su lógica,para asegurarse de que sepamos cómo funciona esta cosa. >> La siguiente cosa que usted hizo en la secciónLa semana pasada fue que tomamos nuestra salud mental modelo, y nos convertimosen algunos pseudocódigo. Pseudocódigo, una vez más, la programación-comosintaxis en palabras, pero no el código C. Ni siquiera específica para C. Nos tomamos nuestroideas y tomó el Inglés que utilizamos para expresarlo, y lo escribió enalgún tipo de programa de modo parecido. Así que eso es sólo la parte de la lógica. Nos ocupamos de nuestra lógica primero. Rompimos esta programación duraproblema en dos partes, y tomamos cuidar de la parte de la lógica de primer. >> Y luego nos acercamosla parte de sintaxis. Recuerde que después trazamos lapseudocódigo, escogimos partes del pseudocódigo que sabíamos hace corresponder conelementos específicos en C. Por ejemplo, para los bucles, si las condiciones, o una mayoro igual a los operadores. Y finalmente, la última cosa que hicimos,la última cosa que hicimos, fue realmente codificar este programa en C. >> Vamos a pasar por este procesohoy de nuevo en un tiempo relativamente grande problema de codificación que tendrá elmayor parte de la segunda mitad de la sección, pero yo quería poner este marcoaquí para ustedes. Es la forma en que hemos estado acercandoproblemas en clase, y como probablemente usted ha estado acercando a estos problemaspor su cuenta fuera de la sección. Así que voy a dejar esto aquí,y nos referiremos de nuevo a esto cuando estamos de codificación más tarde hoy y vayasistemáticamente a través de los siguientes pasos. >> Por último, la retroalimentación. Si usted tiene alguna reacción para mí, lasitio web es en la parte superior de esta diapositiva, sayat.me/cs50. Dame un poco de retroalimentación. Tengo algunos comentarios fantásticosde ustedes la semana pasada. Dijiste que te gustaba lapseudocoding y codificación que hicimos. También alguien me dio un enlace a un estudioque se ha demostrado que la espera seis y cincuenta y siete segundos después de preguntar sialguien tiene preguntas es la óptima tiempo para esperar. Así que si usted tiene sus cronómetros a cabo,hoy voy a tratar de esperar siete segundos después de que me pregunte si alguien tienecualquier pregunta antes de continuar. >> Así que antes de seguir adelante, ¿alguientiene alguna pregunta hasta ahora? >> Sala de control me dio siete segundos. Bien, nadie tenía alguna pregunta, perono dude en preguntar si lo haces. >> En primer lugar, esta semana vamos a cubrirpunteros, como ya insinuamos en el orden del día al inicio de la clase. Punteros que has visto en clase. Probablemente han fundido su mente. Eso está bien, eso es lo que han hecho concientos de estudiantes CS50 antes que tú. Así que en los próximos 10 a 30 minutos,van a ir a través de estos indicadores lenta y sistemáticamente. Si en algún momento usted tiene algunapreguntas, por favor, me pregunta. Te garantizo que sus compañeros en estasección y viendo en casa tienen la mismas preguntas. >> Vamos a hablar en general, en primer lugar, antes de quesumergirse en punteros, sobre las variables y los datos, que hemosestado usando antes. Además de tener estas cosashasta en un portaobjetos, voy llamar a cabo. >> Como esta diapositiva dice, los datos en la memoria tieneun valor y una dirección, por lo que estamos va a representar algoen la memoria. Recuerde que la semana pasada, o cuando has vistomatrices están elaborando, por lo general, dibujamos como serie de cajas, así que vamos asimplemente dibujar una variable como una caja en algún lugar de la memoria. Este cuadro, en este ejemplo, vamos allamarlo X, y tiene un valor. En este caso, estamos inicializandola variable a un valor de 50. >> También te darás cuenta de que además desólo el valor, la variable x tiene un ubicación en la memoria. De hecho, como usted es probablemente un pococonscientes de, la memoria tiene un cantidad limitada de espacios. Sólo hay tantas cajas dentro de suequipo en el que puede almacenar cosas. Y mejor aún, para que sepa que las cosasse almacenan, cada caja tiene un dirección específica, un número específicodonde se puede encontrar. Al igual que todos los estudiantes de primer año tienen sudirección postal en el Centro de Ciencias, cada caja en la memoria tieneuna dirección específica. Cuando vaya a esa dirección, quepuede obtener lo que encuentra allí. >> Yo voy a ser totalmente arbitraria conla dirección de esta variable, pero estoy va a decir que la dirección es 123. Ahora, no me acaba de escribir 1-2-3. Escribí 0x123. La parte 0x significa esto esun número hexadecimal. Y no vamos a hablar dehexadecimal mucho hoy, pero tenga en cuenta que cuando nos referimos a las direcciones de memoria,nos referimos a ellos en hexadecimal. Así que cada vez que estoy hablando de undirección, voy a poner que 0x, y eso es Sólo digo 123 es unnúmero hexadecimal. Está en la base 16. No está en la base 10. >> ¿Alguien tiene algunapreguntas hasta ahora? >> Perfect. Así que esa es una variable. Hemos visto esto antes, pero ahora estamosempezando a ir bajo el capó y ver lo que está sucediendo realmente. >> Así, los punteros. Lo bueno de los punteros es quea diferencia de una variable normal que tiene algún valor, algún entero, algunoscarácter, tal vez una serie de caracteres, si estamos hablando de unmatriz, el valor que tiene un puntero es una dirección. Hasta en la pantalla, tenemos la int xes igual a 50 que hemos creado antes. Yo ya he dibujado esa caja. >> También vamos a dibujar un cuadro. Esto va a ser - ¡oh, Dios mío. Necesitamos un nuevo marcador. No es mucho mejor. >> Pero vamos a llamar a este cuadro - estose llama la variable puntero. Pointer también tiene una dirección. Está en una dirección diferente. Es una variable diferente. No va a estar enla parte superior de la primera. No se puede tomar puso dos cosasdentro de un buzón de correo. No se puede sobrescribir el inicialuno, por lo que vamos a dirección diferente aquí. Vamos a darle la dirección 456. Pero el valor del puntero va a ser undirección, y en este caso, se va ser abordado de la variable x. Así puntero dentro, estamos almacenandola dirección 123. >> Y la sintaxis que utilizo para escribirlo - estamosva a ir sobre la sintaxis de una segundo, pero sabe que la sintaxis de estediapositiva es la sintaxis que usaría para establecer esta situación hasta - antes de llegar a la sintaxis, sin embargo, mequiero dejar claro a todo el mundo y asegúrese de que todo el mundo entiende quepunteros a diferencia de las variables tener una dirección como su valor,no es un entero o un char. >> Hasta aquí todo bien? >> Generalmente también, cuando estamos dibujando estoscosas, no sólo voy a señalar a la dirección aquí. Me voy a tomar una flecha de estecaja a la otra variable que es que apunta a dar la sensación de que si yofuera a mirar en la dirección 123, si Yo fuera a utilizar este puntero de encontrar loque está señalando, me gustaría tener esta caja aquí. Me gustaría conseguir el número 50. >> Sí, la pregunta? >> ESTUDIANTE: Si el puntero almacena una dirección,entonces, ¿cómo elegimos matrices, e INT estrella, o como un charestrella, o lo que sea? >> JASON HIRSCHHORN: ¿Puede ustedrepetir la parte media? Te perdí. >> ESTUDIANTE: ¿Cómo se elige arrays,como una estrella o una estrella int char, o lo que sea, si siemprealmacena una dirección? >> JASON HIRSCHHORN: Buena pregunta. ¿Cómo elegimos lo que en realidad esseñalando si se siempre almacena una dirección? Si en vez de derecho escrito int estrellasaquí, escribí estrella char, sería señalando - eso es lo que escribiríamos si queríamosque apunte a un personaje. Profundo, profundo de los unos y cerosmundo, que int, que char, no realmente importa. Pero en términos de C, no quiero queser muy específico en términos de la tipo de cosa que usted está señalando. En el nivel en el que estamos programando,vamos a escribir la tipo de cosas que estamos a punto dea pesar de que siempre es un abordar dentro de esta caja. ¿Usted tiene una pregunta? Aceptar. >> Ahora vamos a miraruna sintaxis para los punteros. La primera línea en esta diapositiva - int estrella, espacio, puntero - inicializa y genera - no inicializa, más bien. No establezca su valor a nada,pero crea este puntero. Así que en términos de mi diagrama - vamos a ir a este lado - esa primera línea, int estrellaspuntero, crea un cuadro. Este cuadro es la variable puntero,y está en una dirección. Vamos a darle una diferentedirección, 999. >> Eso es todo lo que hace la línea. Hemos visto esto antes. Eso es como cualquier momento, si yo tuviera que acabaescribir int x allí, lo haría exactamente lo mismo, crearuna caja llamada x. En este caso, estamos dandoque un tipo diferente. Así que no va a ser un int. Va a ser un int estrella, ypor lo que este cuadro es un poco diferente que si fuera simplementeser un char, por ejemplo. >> Debido caracteres, memoria, sonsólo un byte en la memoria. Los punteros son cuatro bytes. Así que este cuadro se verá un pocodiferente si escribimos int estrellas como oposición a la charla. Pero aparte de eso, estamos creando uncaja, y es en una dirección específica. Eso es todo lo que la primera línea hace. >> La segunda línea de código, int x es igual a50, de nuevo crea otro cuadro de x en una diferente ubicación. Le daremos la dislocación 111. Y esto es en realidad inicializandoel puntero además de la creación de la caja. Estamos poniendo un 50 dentro de esta caja. >> La tercera línea de código, punteroes igual a la dirección x. Eso significa que los operadores de direccionesuna cosa muy específica. Siempre ponemos el signo delantede un nombre de variable, estamos diciendo dar me la dirección de esa variable. Así que cuando escribo signo x, eso esdiciendo dame la dirección de x, en este caso, 111. >> ¿Sí? >> ESTUDIANTE: ¿Sería aceptable sipasar a conocer la dirección de este particular, la variable sólodecir puntero es igual 0x111? >> JASON HIRSCHHORN: Así que si usted sabía queesto fue en el 111, se puede escribir puntero x es igual a esta hexadecimalnúmero, pero no puedo ver un camino que sabría nunca lo que es, de manera que espor qué usamos esta sintaxis. Pero, de nuevo, de que signo x, signoestá diciendo dame la dirección de este variables, y al igual que cualquier igualdadsigno no, eso es el almacenamiento que valor dentro de puntero. >> Así que cada vez que vea que signo,creo que esto me está dando la dirección de esta cosa. Ampersand x me está dando laDirección de esta caja de x. Una vez más, si lo hiciéramos puntero signo,lo puedo obtener? >> ESTUDIANTE: Dirección del puntero. >> JASON HIRSCHHORN: La direccióndel puntero. Específicamente, ¿qué? >> ESTUDIANTE: 0x999. >> JASON HIRSCHHORN: 999. Puntero Ampersand daríame 999 en este caso. Ampersand frente a cualquiervariable que da la dirección de esa variable. Por supuesto, realmente no me importala dirección de este puntero. Me importa mucho más sobre eldirección de esta variable. >> Finalmente, el último símbolo que vamospara ver en realidad es el mismo símbolo, que asterisco. Pero en esta última línea, esutilizado un poco diferente. Observe cómo en esta última líneaestá al lado de la variable. Como antes de que fuera al lado del tipo, sefue parte de este tipo, estamos creando este puntero tipo entero, ahorala estrella significa algo un poco diferente. Significa ir a tratar el valor - int puntero - tratar el valor de esta variable comouna dirección, vaya a esa dirección, y dame ese valor. >> Así que significa que la estrella, de nuevo, trate lavalor y el puntero como una dirección, vaya a esa dirección, y devolverá ese valor. En este caso, ese valor es 50,por lo que esta línea printf 50. ¿Sí? >> ESTUDIANTE: Entonces, si tratamos de hacerlo enalgo que no fue declarado como un puntero, como en x, y el valor es de 50,habría que tratar de ir para hacer frente a 50, o sería sólo nos dan un error? >> JASON HIRSCHHORN: Si lo hiciéramos estrella x,y trató a printf que, lo que el compilador hacer, o lo que el programalo haría cuando se estaba ejecutando, es trataría 50 como una dirección y vaya aabordar el número 50 en su programa. Generalmente, cuando vas a estosdirecciones al azar, no se van a ir a una dirección donde algoes agradable allí. Vas a ir a una muy maladirección que no se supone que vaya a, y su programase va a estrellar. >> Así que sí, tienes toda la razón. Haría exactamente lo mismo, perocuando tratamos de ir a las direcciones que nos no hayan solicitado o no tenerdeclarada, o que son simplemente al azar direcciones, casi siempre ponemos enproblemas y nuestros errores en el programa. >> ¿Eso responde a su pregunta? >> ESTUDIANTE: Sí, supongoTengo otro. Así que si tienes frío hacer eso y seríair a esa dirección, ¿cuál es el punto de declarar un puntero como unpuntero si pudiéramos decir un puntero igual cosa ampersand? Y entonces sería como una significativadirección, y podíamos ir allí, ¿verdad? >> JASON HIRSCHHORN: ¿Puede ustedrepetir la pregunta? >> ESTUDIANTE: ¿Por qué tenemos que declarar lapuntero como un int estrella si lo haría trabajar sólo declararemos como como unint regular, debido a que aún lo haría tener una cosa que podría serentonces dereferenced, ¿verdad? >> JASON HIRSCHHORN: ¿Por qué estamosdeclarándolo como un int estrellas en vez que al igual que un entero yahorro de este número en ella? >> ESTUDIANTE: Sí. >> JASON HIRSCHHORN: Porquecuando usamos las cosas - gran pregunta - cuando usamos las cosas, cada vez que estamos usandoun puntero y vamos a tratar algo como punteros, otrosvan las cosas en que yo no voy ir a ahora que ayudasi el programa sabe que esta cosa es un puntero. Se tratará de manera diferente en algunosotras maneras en que es irrelevante para nosotros, pero vamos a utilizarlo como unpuntero, debemos decir que vamos a estar usando esto como un puntero. >> Así que es básicamentecómo funcionan los punteros. No es mucho más complicado de lo queeso, pero por desgracia, se convierte en un cuando mucho más complicadolo ponemos en práctica. >> A continuación, vamos a haceralgo bastante grande. En lugar de simplemente tirar un par de líneasde código en línea, me pongo un 4, 5, 6, 7, 8 9, 10 líneas de código. Y en lugar de la codificación de estos fuera de suordenador o ejecutar este programa en el equipo, quiero que saquesuna hoja de papel y un lápiz o un pluma, y ​​averiguar lo que cada uno delas líneas de estos códigos hacen. Comience con la columna de la izquierda, trabajando desdearriba a abajo, que inicializa hay una gran cantidad de estas variables, yy luego ir a través de cada línea de código en la columna y la figura de la derechalo que sucede. Voy a dar a todo el mundo tres minutos paracomenzar por su cuenta, y luego vamos a pasa este como un grupo. >> Vamos a empezar yendosobre esto como un grupo. Está bien si no ha terminado. Voy a comenzar con la mano izquierdalado de la columna, y luego me voy invitar a ustedes aquí, los valientesque entre ustedes aquí, para ejecutar una línea de código en el lado derechola columna y, a continuación, vamos a trabajar nuestro camino a través. >> Así que en primer lugar, que la primera línea de código, intx es igual a 2 coma y es igual a 8 coma z es igual a 12, crea tres variables. Lo hice todo en una sola línea. Esa es una sintaxis muy útil para crearmúltiples cosas del mismo tipo en una línea. >> Así que tenemos tres cajas. ¿Todos pueden ver a los tres,o es que es demasiado baja? Aceptar. >> Tenemos x, y, z. Y en x, obtenemos 2. In y, obtenemos 8. y en z, obtenemos 12. Bastante estándar hasta ahora. >> Siguiente estamos creando otrocaja, otra variable. Se trata de un puntero de int. Se llama puntero x. Vamos a dibujar que aquí. >> ¿Y qué estamos almacenandodentro puntero x? >> ESTUDIANTE: La dirección de x. >> JASON HIRSCHHORN: la dirección de x. En este caso, no séla dirección de x. Podría ser cualquier cosa, pero yo voy ahacer algo ahora para que sea más fácil para nosotros. Pondremos x en 111. Así que ahora se pone 0x111, y vamos a darun agradable flecha para significar está apuntando a x. >> Del mismo modo, tengo punteroy y z puntero. Consiguen valores. Le daremos a esta 0x222, 0x333. >> Esa es nuestra configuración inicial en ellado izquierdo de la columna. Hemos creado tres enteros yhemos creado tres punteros. Dentro de cada indicador, ahorramos la direcciónde uno de los tres inicial las variables que hemos creado. >> Ahora, en el lado derecho de lacolumna, estamos usando ese asterisco símbolo en un número de maneras diferentes,no todos los cuales son para utilizarlo para eliminar la referencia de algo o de ira una dirección específica y devolver el valor allí. >> ¿Puede alguien decirme cuál es elprimera línea de código hace? Alguien levantar la manoque aún no ha hablado. Usted? >> ESTUDIANTE: Establecer z a 16. >> JASON HIRSCHHORN: Está ambientada z a 16. Así que z es igual a x por y. En ese caso, es sólo la multiplicaciónque estamos haciendo. Así que z es igual a x por y,2 veces 8 es 16. Perfect. Así que vamos a actualizar esto. Z = 16. >> Esa segunda línea de código x espacioestrellas es igual a espacio y. ¿Qué hace esa línea de código? Jeff. >> ESTUDIANTE: x es igual a x veces y? >> JASON HIRSCHHORN: Exactamente. Esa es la notación abreviadapara x es igual a x por y. Usted probablemente ha visto las cosascomo x más iguales y? Eso es x es igual ax más y. En este caso, estamos haciendo algo unpoco diferente, x es igual a x por y. >> Entonces, ¿qué necesito para actualizar esta lista? >> ESTUDIANTE: x es 16. >> JASON HIRSCHHORN: x es 16. >> Cambios en el color verde son los queque hemos hecho hasta ahora. A continuación, tenemos y igual estrellas puntero x. ¿Puede alguien caminar a través de lo queesta línea de código hace? ¿Qué hace esta línea de código? Caminar a través de mí desde el principio. >> ESTUDIANTE: Se necesita lo que sea puntero x esseñalando, el valor que se está señalado por que, ylo almacena en y. >> JASON HIRSCHHORN: Excelente. Voy a repetir eso de nuevo. Usted hizo un trabajo fantástico, pero por lo que podemosenfatizarlo, esa estrella significa tratar la cosa en esa variable comouna dirección e ir a ella. Por lo tanto, el tratamiento de la cosa en puntero x como undirección, vaya a ella, tomar ese valor 16, y luego sólo estamos ahorrandoen la variable y. Así que ahora y se sobrescribe,y es ahora de 16. >> La siguiente línea de código, indicador de la estrellasubrayar x es igual a x por y. ¿Qué hace esa línea de código? De nuevo, si usted es un poco perdido aquí,evaluarla de derecha a izquierda. Así Mondo, lo que hace la derechaparte de eso? >> ESTUDIANTE: El lado derecho justomultiplica lo que está en el cuadro es xe y. >> JASON HIRSCHHORN: Y eso es 16y 16, por lo que es eso igual? >> ESTUDIANTE: 256. >> JASON HIRSCHHORN: 256. ¿Y dónde estamos ahorrando 256? >> ESTUDIANTE: Usted está ahorrando en lo que seapuntero x hace referencia, que es el cuadro de x. Así que ahora se convierte en x 256. >> JASON HIRSCHHORN: Así que la estrella,de nuevo, significa ir a. Vamos a lo que el punteroX está apuntando a. Se apunta a x, y hayestamos ahorrando el valor 256. >> ¿Una pregunta sobre que uno específico? No hemos visto a la estrella utilizada ena mano izquierda, sin embargo, de un operador de asignación. >> Así que esa es la cuarta línea de código. La quinta línea de código, puede alguienque no ha hablado todavía me dan la quinta línea de código, o caminara través de ella conmigo? Annie, ¿qué hace? >> ESTUDIANTE: Cambie el valor del punterox para el valor de puntero y. >> JASON HIRSCHHORN: Eso esexactamente correcto. El valor de puntero y es esta direcciónaquí, y estamos almacenando que en el puntero variable x. Así que esto se convierte en 222. Y me voy a mover la flecha,también, para indicar que ahora tiene una dirección diferente. >> Así que ahora puntero subrayado xy el puntero de subrayado y tener el mismo valor. Eso es lo que hace esa línea. Así que, esencialmente, sontanto que apunta a y. Si sólo teníamos nuestros punteros, y nosotrosrealmente no sabíamos las variables, se habría perdido x. Pero, por suerte, hemos salvado xen esta función, por lo que todavía saber donde x es. Pero vamos a ver ese problema vienemás adelante, que si perdemos un puntero a algo, no podríamos saber realmentedonde es o ser capaz de recuperarlo. Pero eso es para el futuro. Así que por ahora, eso estoda la razón, Annie. >> Y, por último, que la última línea de código. ¿Puede alguien darme lo que elúltima línea de código hace? ¿Sí? >> ESTUDIANTE: Se multiplica lo que está enpuntero y, por lo que 16 veces 16 - >> JASON HIRSCHHORN: 16 esno en el puntero y. >> Estudiante: Bueno, va a esa dirección,lo encuentra, y luego se multiplica que por lo mismo - lo hace ello mismo con el puntero de z, se multiplica los valores y la almacena en x. >> JASON HIRSCHHORN: Exactamente. Entonces, ¿qué tengo que actualizar? ¿Cuál debe ser x? >> ESTUDIANTE: La parte superior izquierda, 256. >> JASON HIRSCHHORN: ¿Y quéCómo puedo cambiar a? Lo sentimos, pero vamos a ir hacia arriba. >> ESTUDIANTE: Se debe seguir siendo el mismo. >> JASON HIRSCHHORN: Sí, en realidadtodavía es igual a 256. Pero eso es exactamente correcto. Vamos a descomponerlo. Vamos a ver aquí, esto enparéntesis, indicador de la estrella y, que trata a lo que hay en el puntero y comouna dirección, va a ese dirección, toma la 16. Así que ahora tenemos un 16, y estamosmultiplicando por el que lo mismo en z. El ir a esa dirección, tomando un 16. 16 veces 16 es 256, y estamos almacenandoque dentro de x. x ya pasa a igual 256, así que no estamosva a hacer el cambio. >> Usted no tiene este archivo en este momento,pero en el código fuente de este sección que se publicará en línea encs50.net/sections, he escrito todo de esto, exactamente lo que hicimos. Y de hecho incluido alguna otrainformación aquí, que estamos va a pasar en un segundo. >> Hacemos estas operaciones, como se puede veraquí mismo y, a continuación, imprima la valor resultante de la variable específicaque ha sido cambiado. Ya se ha escrito este código. Voy a ejecutar este código. >> Y ahora vamos a caminar a través de la salida. Vamos a empezar por el principio. El valor de x es igual a 2. Eso debería tener sentido. Eso fue lo que inicialmenteinicializado a. >> Dirección de x es esta locura. Una vez más, vemos, sin embargo, a pesar de queparece un poco loco al primero inspección, vemos que0x allí. Este es un número hexadecimal. >> Y luego vemos todosestas cosas locas. Hay una b y una f, ytambién una c en ese país. Ninguno de los que son normales cero anueve dígitos, pero debido a hexadecimal es base 16, que realmente necesitaun par de otros símbolos para representar cada dígito. Así que de nuevo, no vamos a hablar dehexadecimal demasiado, pero sabe que cuando estás escribiendo hexadecimalnúmeros, verás algo de cero a través de 9 cosas mása partir de una F a través de. Así que, aunque no todos son ceroa través de nueve números, este es un número, esta es una dirección. Y podría ser expresada enbase 10 si queríamos. >> El valor de puntero de x aquí esTambién un número hexadecimal, y lo que es Es el mismo de? ¿Qué es este número el mismo que? >> Dirección de x, ¿verdad? La línea derecha por encima de él, esos dosdirecciones son idénticas, y eso es lo que esperamos. La dirección de x es elvalor del puntero a x. >> A continuación, tenemos la dirección depuntero x, y que es, de nuevo, algunos de números aleatorios. Si vamos a inspeccionarlo, notamosque comparte una gran parte del mismos números que los otros. Es diferente, pero comparteuna gran cantidad de los mismos números. Se acuerden hablando de búfererrores de desbordamiento? Cuando usted puede escribir sobre las cosas que sonCerca de ti en la memoria, si vas más allá de los límites de una matriz. Una vez más, no vamos a hablar deque en este momento, pero para aquellos de ustedes curioso, estas cosas son en realidadbastante cerca uno del otro. Estas cajas están muy cercael uno al otro en la memoria. >> Y, por último, puntero x puntos a lavalor, y por supuesto, es 2. Hice esa estrella. Seguimos la dirección de punterox inicialmente, y devuelto un valor de x. >> Por último, vemos exactamentelo que acabamos de hacer. Primera z es 16, entonces xes 16, entonces y es 16. x eventualmente se convierte en 256 aquí. Y de nuevo, x no se cambiapor esa última línea de código. Sigue siendo un 256. >> Si desea repetir esto por su cuentauna vez más, o ir a través de él, o cambiar algunos de estos valores, me heya se ha escrito el código. Usted puede hacer los cambios en el códigoy ver cómo esos cambios realmente jugar en la vida real. >> Antes de continuar con los punteros, lo haceAlguien tiene alguna pregunta? >> Aceptar. ¿Todos pueden tener un lado, ylo puso en el aire, y - cierra los ojos - pon tu mano derecha en el aire como unpuño, y me da un pulgar arriba, pulgar abajo, pulgares medio, lo cómodoestás con punteros hasta ahora. Cierra los ojos. >> Aceptar. Usted puede poner sus manos hacia abajoy abre los ojos. Gracias. >> Vamos a seguir adelante. Vamos a seguir hablando depunteros, pero vamos a hablar sobre ellos en un pocode un contexto diferente. Vamos a hablar dearrays y punteros. Y recuerda que la semana pasadaSoplé sus mentes? Cerebro de alguien, se fueronaquí en el suelo. Yo estaba bastante seguro soplóla mente de esa persona. Esa fue una mala broma. >> [Risas] >> JASON HIRSCHHORN: Voya trabajar en eso. Pero de todos modos, las cadenas que encontramosfuera eran arrays. Las matrices son realmente punteros. >> ¿Qué quiero decir con eso? Bueno, si creamos una serie de seispersonajes, que esta línea de código hace aquí - char, arreglo, soporte abierto, seis, cercasoporte, punto y coma - de nuevo, crea un serie de seis caracteres. Llenarlo. >> Tengo una foto de ella aquí. Estas cajas, vemos que la empapócon algunos personajes y la nula terminador en el extremo. Y abajo, aquí es donde me gustaríaa dirigir su atención. La primera caja - que hemos hecho esto antes. De hecho, hemos hecho estoen cada conjunto de problemas. Puede referirse a la primera caja enesta matriz como soporte de matriz cero. Lo hemos hecho un millón de veces. >> Puedo referir realmente a lamismo cuadro de otra manera. Puedo referirme a ella como variedad estrella. Debido a la matriz, si fuéramos realmenteimprimir lo que es igual a la matriz, la matriz es una dirección, y es una dirección deel primer cuadro de esta matriz. Para que el operador estrellas trata lo que esalmacenada en el arreglo como una dirección, va a esa dirección, y regresael valor allí. Array estrella volverá f igualsoporte de matriz cero devuelve f. >> Una vez más, todos los lugares que hemos estado escribiendocero soporte matriz, array estrella haría han hecho exactamente lo mismo. De hecho, el soporte de matriz cero essólo nuestra capa de azúcar de lo que realmente ocurrió. Es realmente variedad estrella es la másforma correcta, si no es correcta manera, pensar en lo que essucediendo realmente. >> Así que eso es todo bien y bueno, peroaquí es donde se pone fantástico. Vamos al segundo carácteraquí, este cero. En caso de ser un O, pero vamos adarle un cero. Estamos referimos a que, antes, lasegundo cuadro en una matriz, como un array soporte de uno cada vez que nos hemos iteradoa través de una matriz. >> Hay otra manera de referirse aél, y eso es abajo. Esa estrella, paren abiertas, arraymás 1, paren cerrado. Así que debido a las matrices se colocan - estoscajas están uno al lado del otro en la memoria - array estrella va a la primera. Así que si vamos a tomar matriz quedirección, añadir 1 a la misma, y ​​luego ir a que la nueva dirección, que vaser lo correcto al lado la dirección original. >> ¿Sí? >> ESTUDIANTE: Entonces, si array era, en lugar desiendo caracteres, sería enteros, a continuación, habría que incrementarpor 4 cada vez? >> JASON HIRSCHHORN: eso esuna gran pregunta. Permítanme llamar algo primero, entonces estoyva a responder a su pregunta. >> Para dibujar esta en la pantalla realmenterápidamente antes de llegar a su pregunta, tenemos nuestra matriz - y se va, pero yo sólo voy acentrarse en el primer par de unos. En la memoria, hay una cajaque creamos cuando nos inicializado esta matriz. Esta es la variable de la matriz,y es una dirección. Es, de hecho, la dirección de laLo primero, la primera casilla. Así que este cuadro está en alguna parte. Estas seis cajas están en otra parte. >> Cuando hacemos el soporte de matriz cero, estamosva a conseguir lo primero aquí. Y cuando lo hacemos variedad estrella, vamospara conseguir exactamente lo mismo, el valor esa matriz está señalando. >> Cuando hacemos matriz soporte 1, vamospara obtener el segundo cuadro, sino también, porque el puntero está fuera de losparéntesis, primero vamos a añadir 1 a esta dirección, y luego nos vamosseguir ese y nos la dará segunda casilla. Y así sucesivamente y así sucesivamente. >> Matriz más 2 va a añadir 2 del presenteabordar aquí, porque una vez más, las direcciones están representados sólo númeroscomo hexadecimal, a menudo. Así que añadir 2 a la misma, y ​​para continuar, a latercera caja, que pasa a ser, como usted puede ver, dos espacios de distanciaen el primer cuadro. >> Con suerte, eso lo hizo menos confusoen lugar de más confuso. Pero, ¿que hacen que sea más confuso? Una vez más, voy a llegar a supregunta en un segundo. ¿Eso es más confuso paranadie, o ¿alguien tiene alguna preguntas acerca de esta ideade matrices como punteros? >> Fantástico. También sería fantásticosi tuviera preguntas. Pero pasar a su pregunta. >> La pregunta era enteros en la memoriatomar hasta cuatro bytes, por lo que cuatro cajas. Si pensamos en una cajas como un byte,enteros ocupan cuatro cajas. >> Así que dicen que estos son números enteros ahora. Este es un arreglo int aquí. Voy a hacer un poco dedirecciones aleatorias. Así que si se trataba de un arreglo int, elprimero podría ser un 10. El próximo uno cuatro cajas más porqueenteros son cuatro cajas grandes. Hay esté 10, 11, 12, 13, por lo queéste sería un 14. Éste sería un 18. Éste sería un 22, y así sucesivamente. >> Así que de nuevo, son caracteres de un byte. Están justo al lado del otro,por lo que este mapa hablábamos antes de que funciona perfectamente. >> Pero usted acaba de traer para arribael caso de enteros. Bueno, si he añadido 1 de la presente,se iría a 11. Sería en el medio de estaint si he seguido realmente específicamente por el estilo. En realidad estaba cuadro ibapor la caja en la memoria. >> Lo bueno de este tipo dearitmética de punteros es el programa es lo suficientemente inteligente como para saber lo que quieres decir. Cuando usted está agregando 1 a una memoriadirección que apunta a un número entero, no es en realidad vaañadir una manzana. Se va a añadir cuatro cuadras. Se va a escalar ese númeropara que usted compre el tamaño. >> Y esto se remonta a la pregunta de Curtis,¿por qué hacemos int estrellas en vez de estrellas Char? ¿Era eso a tu pregunta? Alguien le preguntó que antes, ¿no? Por qué lo hacemos int estrellas en vez de carbónestrella, si se va a tratar no importa qué? Y eso es para que nos ayude con estetipo de aritmética de punteros. Si declaramos algo como una estrella de carbónpero que realmente va a través de enteros, cuando añadimos 1, sólo semover una caja en lugar de la cuatro que lógicamente esperamosque se mueva otra vez. >> Así que de nuevo, en la aritmética de punteros, cuandoestamos tratando a estas cosas como direcciones, a continuación, añadiendo o restandoa ellos y luego siguiendo a averiguar lo que está pasando en la memoria,el número le sumamos a ellos se redujo por el tamaño del tipo de cosasestán señalando. >> Así que si están apuntando a un entero - Sé que me repito - pero si son un número entero, que estáen realidad va a pasar cuatro cajas más cada vez. Si son un char, eresva a mover una caja. Si son mucho, mucho, que es de ochobytes, usted va a mover ocho cajas más. Cualquiera que sea el tamaño de latipo de datos, ¿quién sabe? Realmente no importapara nuestros propósitos. Todo lo que tenemos que saber es, en realidad,esta matemática aquí, sólo añadir 1 a nosotros llegar a la segunda casilla con independenciade qué tipo de cosa es en que la segunda caja. >> Espero que haya algún tipo de preguntasaquí, porque era mucho, y yo no podría haber hecho una perfectatrabajo en explicar eso. ¿En serio? No hay preguntas? Para el público en su casa -ahí vamos. >> ESTUDIANTE: Si se va a realizar una serieen una función, y usted quiere que devolver esa matriz a otra cosa,¿cómo devolverlo? >> JASON HIRSCHHORN: Excelente pregunta. Así que si quería hacer una matriz en unafunción y, a continuación, devolver esa matriz - así que vamos a decir vamos a hacer una serieen una función llamada por el principal. Main llama esta función, y estofunción crea la matriz, entonces la devuelve al principal. >> Ahora que hemos visto algosimilar a esto antes. ¿Dónde hemos visto algo similardonde principal crea la matriz, y luego la función que manipula dicha información? ¿Qué hemos escrito anteseso se hace eso? >> ESTUDIANTE: Clasificación? >> JASON HIRSCHHORN: Clasificaciónha hecho eso. Juego de 15 también ha hecho eso. En la clasificación, pasamos de la matriz, lapajar, y luego nos lo arreglaron por destructivamente actualización diferentepartes en esa matriz. Así que tomamos nuestra matriz original -recuerde, uno de los parámetros a la función de clasificación fue array - >> ESTUDIANTE: ¿No es eso una matriz global? >> JASON HIRSCHHORN: Así es. Sí, vamos a volver allí. Pero si hubiera sido creada en - ¿fue un mundial, o fuecreado en la función? Echemos un vistazo. Podemos responder a eso. >> Parece que no es un array global. Se ha creado aquí mismo en esta líneauna matriz de enteros, y entonces es pasado a nuestra función de clasificación. Así que no es un arreglo global. Se creó en principal, aprobadaa nuestra función de clasificación. Nuestra función de clasificación destructivamentelo actualiza, y lo devuelve. Como podemos ver hacia arriba, más o menos - oh, Dios mío, lo siento. >> ESTUDIANTE: Ordenar simplemente devuelve sio no la encuentra? >> JASON HIRSCHHORN: Así es. Lo siento. Ordenar realidad - vamos a abrir eso. Ordenar es nula. Ordenar no devuelve nada porqueactualiza especie destructiva de la matriz, la matriz original. >> Así que eso es lo que hemos visto antes, perosu pregunta era ¿qué pasa si una especie en realidad crea la matriz? >> ESTUDIANTE: Consulte devuelve la actualizaciónarray, o algo así. >> JASON HIRSCHHORN: Otra cosa quese podría haber hecho fue principal llamado la función. Trabajo de esa función es la de crear ungama de algo, una serie de enteros, y luego regresan quearray es creado a principal. >> Así como hemos visto antes al hablaralrededor de la pila, lo que vamos a hablar un poco más tarde hoy, una vez aldevuelve la función, todo lo que era creado en esa función, todossus variables locales, desaparecen. Hemos visto que la idea del alcance antes. Es por eso que hemos creado mundialvariables que en algún momento, para escapar de esta problema de las cosas va a desaparecer cuandosus funciones devuelven. >> Lo que se puede hacer en ese caso es lafunción sería crear la matriz no como una variable local en la pila. Crearía en una parte diferentede memoria que permite que las cosas sean guardan incluso cuando las funciones se han vueltoy el marco de la función, el apilar marco, ha dejado la pila. >> Voy a utilizar algunosterminología aquí. No vas a conocer a estahasta mañana, pero esa zona de memoria se llama el montón, yYo no quiero entrar en eso. Pero lo que esa función podría hacer, de nuevosimplificar en exceso potencialmente, es crear esa matriz en un espacio diferente enmemoria que en realidad se queda allí por siempre y cuando usted quiere que permanezca allí,y que va a pasar de nuevo a un puntero principal a esa matriz guardada en queotra parte de la memoria. Así que tiene unas cajas en otro lugarque no se deje destruidos cuando el función devuelve y pasa de nuevo a principaluna dirección a ese conjunto de cajas. >> Esto probablemente no es una suficienteresponder a su pregunta, pero que se estudiarán más mañanacuando ustedes habláis sobre el montón de conferencia. >> Pasemos - oh, Dios mío! Eso es un delfín! ¿Cómo adorable es eso? Dios! Ellos son mi animal preferido, por loque son realmente adorables. Tengo tres animales delfín de peluche. Pero basta de mí. >> Todos ustedes tienen sus ordenadoresabrir delante de usted. Aquí está tu tarea de codificación. Vamos a comenzar con pseudocódigo,sin embargo, así que no te emociones demasiado. >> Usted tiene que escribir un programa que tomauna y sólo una línea de comandos argumento, y eso es el númerode delfines para ser entrenados. Ese número debe ser mayor que 0. >> A continuación, vamos a permitir que elentrenador para entrar en una era de cada uno de estos delfines. Cada era, de nuevo, en caso deser mayor que 0. Y todas estas edades debeser almacenados en una matriz. >> Para tener una edad, sin embargo, es necesariollamar a una función con la siguiente prototipo - int estrella, espacio, getAge, paréntesis,vacío, cerrar paréntesis, punto y coma. >> Por último, quiero que la imprimanla edad del delfín más viejo. Así que de nuevo, antes de empezar a escribir encódigo, tener una hoja de papel o tener gedit abierto si lo desea, y escribiralgunos pseudocódigo para este. En tres minutos, vamospara repasar el pseudocódigo. Vas a tener otros tres minutos aque el código y, a continuación vamos a repasar la codificación juntos. >> Y si usted tiene alguna pregunta, porqueesto no está claro, levanta la mano y Voy a venir alrededor, y estoy felizpara responder a su pregunta. Pero para empezar, tomar tres minutosescribir pseudocódigo para asegurarse de que entender la lógica de este problema. >> Vamos a tomar una puñalada en elpseudocódigo como un grupo. Voy a escribir esto en la pizarracomo usted me da el pseudocódigo. ¿Quién quiere daryo la primera línea? En primer lugar de la línea tal vez la más fácil,así que si no tienes sin embargo participado, comience aquí. ¿Cuál es la primera línea de pseudocódigo. >> ESTUDIANTE: Primera línea es comprobar que lanúmero de argumentos que reciba. >> JASON HIRSCHHORN: Exactamente. Compruebe el número de argumentos, primeroLo que tenemos que hacer. Siguiente? >> ESTUDIANTE: Compruebe que ese comando, elprimer argumento, es mayor que 0? >> JASON HIRSCHHORN: Compruebe que el primerargumento es mayor que 0, sí. La siguiente línea, adelante. >> ESTUDIANTE: Entonces usted probablemente querráalmacenar ese argumento de la línea de comandos en una variable, o usted podríair a la siguiente etapa. >> JASON HIRSCHHORN: Sí, una vez más, vamos atener una cadena de aquí, pero queremos una entero porque es un número,por lo que necesitamos para hacer el cadena en un entero. >> ESTUDIANTE: x, y. >> JASON HIRSCHHORN: Eso es correcto. Por lo tanto, vamos a escribir eso. String - Whoa, mira a ese marcador. Esa es la segunda cosa que necesitamoshacer, tomar la cuerda y convertirlo en un int. ¿Qué sigue? >> ESTUDIANTE: Crear una matriz de enteros conel tamaño de la primera línea de comandos argumento que no está programado? >> JASON HIRSCHHORN: ¿Lo sientes? >> ESTUDIANTE: Basta con crear una matriz de enteros,y hacer que el tamaño del comando argumento de la línea que tienes. >> JASON HIRSCHHORN: Crearmatriz de tamaño - haremos arg, cualquiera que seaese argumento era. ¿De acuerdo? ¿Qué sigue? >> Así que tenemos la matriz, permiteel entrenador para entrar en un edad para cada delfín. Para tener una edad, llamar a una funcióncon el siguiente prototipo. Así que tenemos nuestra matriz. ¿Qué necesitamos hacer? >> ESTUDIANTE: Para n delfines? >> JASON HIRSCHHORN: OK. Voy a escribir para cada uno. Para cada una de delfines, lo queQué tenemos que hacer? Vaya por delante? >> ESTUDIANTE: Llame a la función. >> JASON HIRSCHHORN: Callla función, en Aceptar. >> ESTUDIANTE: En pseudocoding, debe usteddefinir funciones como en un aparte bloque de pseudocódigo? >> JASON HIRSCHHORN: Así que, sí. Vamos a hacer una caja separada de pseudocódigoaquí, pseudocódigo para getAge. Así que esta función, para cada delfínque llamamos getAge y getAge devuelve algo. Entonces, ¿dónde deberíamos poner elLo que estamos volviendo? Devuelve un puntero int, ¿verdad? Ese es el tipo de retorno, de acuerdoa que prototipo de función. Entonces, ¿dónde estamos poniendoque int puntero. >> ESTUDIANTE: En la matriz. >> JASON HIRSCHHORN: En la matriz. Eso suena muy bien. Llame getAge, puso de retornovalor en la matriz. >> Hagamos una pausa getAge por un segundo. Volveremos a eso. Y voy a dejar de empezarconmigo en eso, Marcus. Pero hemos llegado a cada edad. A todos ellos les hemos puesto en la matriz. ¿Qué hacemos al final? ¿Cómo nos terminamos principal? ¿Cuál es la última cosa que necesitamos hacer? Alden? >> ESTUDIANTE: Podríamos clasificarlos, ya continuación, imprimir el hallazgo más grande. >> JASON HIRSCHHORN: Podríamosclasificarlos, sí. Entonces, ¿cómo resolvemos? >> ESTUDIANTE: Podríamos igual que - >> JASON HIRSCHHORN: ¿Necesitamospara ordenar aquí, sin embargo? >> ESTUDIANTE: Supongo que no. >> JASON HIRSCHHORN: OK. Has hecho esto antes. ¿Cuál fue la primera formausted escribió búsqueda? >> ESTUDIANTE: Podríamos comprobar cadauno contra el otro uno. >> JASON HIRSCHHORN: Vamos a hacer eso. Vamos a buscar a través de cada uno y sólorealizar un seguimiento de la edad antigua. Buscar más antiguo, y entonces, ¿qué hacertenemos que ver con el antiguo? >> ESTUDIANTE: devolverlo. Imprimirlo, lo siento. >> JASON HIRSCHHORN: Eso es. Exactamente derecha. Imprima más antigua. >> Aceptar. Marcus? >> ESTUDIANTE: Realizar un seguimiento de lamás antiguo a medida que los agrega? >> JASON HIRSCHHORN: OK,buscar más antigua. Así podríamos seguir la pista de los más antiguoscomo los sumamos allí. Llame getAge, poner el valor de retorno en lamatriz, y luego ver si este es el actual más antigua, tal vez salvaren una variable diferente? Eso funcionaría también. Eso podría en realidad nos ahorrará unviaje, pero esto es fantástico. Voy a dejar estehasta aquí por ahora. Pero si usted quiere en suaplicación tome ese paso aún más, eso sería genial. >> Marcus? Vamos a hacer getAge aquí. >> MARCUS: OK. Preguntar al usuario para una edad. >> JASON HIRSCHHORN: Askel usuario de una era. Aceptar. ¿Todos pueden ver eso? Por aquí? Aceptar, pide al usuario una edad. Sigue adelante, tienes esto. >> MARCUS: Supongo que realmente no entiendo por quées mejor devolver un int estrella de lo que sólo un int, como entonces sólodevolver la edad para almacenarlo. >> JASON HIRSCHHORN: No es necesariamentemejor volver. Sería funcionar igual de bien en regresar,pero quiero que regreses int estrellas. >> MARCUS: OK. Realmente no sé qué - >> JASON HIRSCHHORN: OK. ¿Alguien tiene alguna idea? Pedimos usuario para una edad. Estamos recibiendo un número entero. >> Aceptar. Entonces, ¿por qué no nos detenemos aquí. Vamos a ir a nuestro próximo paso enla lógica, el mapa estas cosas en ver, y después de que ustedes se codificar ese primerparte, y código bien todo eso juntos, pero un getAge en particular. Y vamos a averiguar lo que está pasandocon ese int estrellas. >> Pero antes de hacer eso, antes de saltaren código C, se puede señalar a alguien algunas cosas que ven en nuestro pseudocódigoeso mapa en código normal? En C? Por lo que algunas cosas en pseudocódigo, algunas palabrasves, algunos de sangrado que haya ver, algunas cosas que le dan un poco depistas sobre cómo codificar esto en C? >> ESTUDIANTE: Para lazo. >> JASON HIRSCHHORN: ¿Dónde? >> ESTUDIANTE:. Porque "para cada" delfín " >> JASON HIRSCHHORN: OK. Eso es. Tenemos un lazo allí. ¿Qué más? Mondo? >> ESTUDIANTE: La cadena a intcosa sería una de i >> JASON HIRSCHHORN: OK. Así hemos visto que la función anterior. Otras cosas que vemos? >> ESTUDIANTE: Printf. >> JASON HIRSCHHORN: Exactamente. No, obviamente, pero espero que tengamosfamiliarizado ahora con printf. ¿Qué más? ¿Sí? >> ESTUDIANTE: Lectura de un array essimplemente declarando una matriz? >> JASON HIRSCHHORN: OK. Así, de tamaño arg. Eso es correcto. No sé qué escribir quecomo, pero sí, declarando una. Otra palabra para crearlo. Cualesquiera otras cosas que vemos aquí? Estructuras que conocemos? ¿Qué pasa con esa línea de "búsquedapor mayor? "¿Qué tipo de estructura puede que utilizar? Alden, se lo sugirió. >> ESTUDIANTE: Sólo tienes que buscar. así como sólo un bucle. >> JASON HIRSCHHORN: Un bucle. Así, buscan. Probablemente se esté hablando de linealbuscar aquí, así que es probable que simplemente usando un bucle estándar de pasar portodo, por lo que Curtis sugirió que podría poneren el bucle anterior. >> Cualesquiera otras cosas que vemos? Compruebe el número de argumentos. ¿Cómo comprobamos algo? >> ESTUDIANTE: Si los estados. Y >> JASON HIRSCHHORN: Eso essi una condición. >> Así que, ¿por qué no empezarcodificación de este programa. Usted tiene el pseudocódigo aquí. Comience a escribir y en el código C. Una vez más, vamos a averiguar lo que espasa con eso int estrella y cómo realmente podemos escribir este programapara que se ajuste a la especificación que te he dado. Si lo desea, sin embargo, comenzarcon sólo int quedaría invalidada. Simplemente devuelve un entero. >> Eso ayuda a ponerse en marcha. Sólo codificar que. Código sólo como el tipo de retornocomo un int, no como un int estrellas. Pero entonces vamos a convertirlo enint estrella otra vez para que podamos cumplir con la especificación. También explorará cómo uno podría realmentellegar a lo que era Jeff hablando antes. Así que toma tres a cinco minutospara codificar este. >> Vamos a ir a través deeste código juntos. Pido disculpas si hubo una falta declaridad en algunas partes de este. Pero lo que vamos a mirar a la derechaahora es que ya he escrito todo el código de lo que se verá comosi sólo estamos devolviendo un entero con getAge. Y vamos a ir a través de ese código, yentonces vamos a ver cómo podemos realmente conseguir que se alinean con lo que eranos pide devolver un int estrellas. >> Aquí está el código. Y de nuevo, me disculpo que no podemoscodificar esta como un grupo, pero quiero para asegurarse de que superaremos. >> Por la parte superior, tenemos nuestra funciónprototipo, getAge. Hemos visto eso antes. Vuelva tipo primero, y luegonombrar, entonces los parámetros. >> Hasta aquí, hemos incluidotres bibliotecas. ¿Puede alguien decirme quéesta línea 12 lo hace? De Sharp incluye live.h estándar? ¿Qué hace esa línea? Si yo le preguntara esto en un concurso, yLe pedí que me das la respuesta en dos frases, ¿qué le dirías? >> ESTUDIANTE: [inaudible] le permite utilizar todas las funcionesalmacenado en ese archivo. >> JASON HIRSCHHORN: Eso esuna buena respuesta. Es la función de cabecera que tiene elprototipos de un número de funciones, y si usted va a utilizar los desu biblioteca, esto está diciendo estos existen funciones. ¿Qué más tengo que hacer si soyincluyendo, por ejemplo, la biblioteca CS50? ¿Qué más tengo que hacer cuandoPuedo compilar mi programa? >> ESTUDIANTE: [inaudible] incluirutilizando el tablero l. Así que tenemos que vincular en aquellos biblioteca CS50con tablero l de pie para el enlace. Enlaces tablero l CS50 en los reales yceros, la ejecución real de, por ejemplo, obtener cadena o conseguir int. >> Así que estamos en principal. Asegúrese de usuario introdujo una y sóloun argumento de línea de comandos. Al igual que nuestro pseudocódigo, tenemosque si condicionar aquí. Esperemos que los chicos están muy familiarizadoscon esta línea y es capaz de escribir este código con bastante rapidez,comprobar argc. >> A continuación, lo estamos haciendo a un i LINE. Una vez más, has visto eso antes. Eso es convertir una cadenaa un entero. >> Lo siguiente que hago es que tengootra condición if. Me estoy asegurando de que entraron en una positivanúmero de delfines por la especificaciones, comprobar sidelfines es menor que 1. Así que de nuevo, esta primera parte de lacódigo, estas tres cosas - comprobar el número de argumentos, si nes mayor que cero - que ha escrito el código mucho,validar la entrada del usuario. Usted debe estar bastante familiarizado conescribir el código y ser capaz de escribir bastante rápido. >> A continuación, vamos inicializar un nuevo array. ¿Qué tipo de cosas estamosponiendo en esta matriz? Los enteros por esta primeratres personajes. >> A continuación, estamos recibiendo las edades, y una normal,bucle for itera a través de una matriz, y estamos llamando a esta función getAge,almacenar el valor de retorno de getAge en la matriz. Una vez más, usted ha escrito código comoesto mucho antes, también. Una de las cosas que esperamos que pueda espigarde pasar por su pasado problemas de esta prueba es que una gran cantidad delo que vas a seguir haciendo son cosas que ya has hecho. Es muy importante ver a lospatrones para que usted no va a hacer su trabajo muy duro para usted en elfuturo, pensando que nunca he hecho esto antes. Usted ha hecho todas estas cosas antes. >> A continuación, nuestras últimas líneas de código. Estamos manteniendo un registro de la edad antigua,pasando a través de cada edad, al igual que lo sugerido, Alden. Y si la edad de la cosa actualestamos iteración a través de es mayor que el número más antiguo que hemos almacenado,actualizamos el número más antiguo. >> Y, por último, al final, es la impresión deel número más antiguo. Una vez más, usted ha hecho esto antes. En realidad se ha escrito búsqueda lineal. Usted ha escrito eso. Fue un poco diferente. Buscabas un número específico,no es el mejor, pero que ha escrito el código anterior. >> Y, por último, en Int. getAge,usted ha visto esto antes. Tenemos un bucle do-while pidiendopara la entrada del usuario hasta que cumple una determinada condición. Y, por último, sólo estamos volviendoque entero. >> Así que todo el código que has vistoantes y por escrito antes. Nada es nuevo aquí. Por supuesto, me he presentado en undiferente manera, y tal vez era demasiado confundiendo con mis instrucciones,pero usted ha visto esto antes. Esta lógica eres 100% capaz. Y si nos encontramos con este programamuy rápido - Yo ya he hecho, por lo quevamos a correr. / entrenador. >> ¿Qué pasó? >> ESTUDIANTE: [inaudible]. >> JASON HIRSCHHORN: No lo hicedar ningún argumento. Vamos a entrenar cinco delfines. Esa sería una de dos, tres,cuatro, cinco años de edad. Y como se puede ver a la derecha aquí,impreso el de mayor edad. Así que vamos a ir de nuevo en gedit. >> Pero por supuesto, esto no era lo que elespecificación estaba pidiendo. Se pide al prototipo. No los rendimientos en número entero, perolos retornos en int estrellas. Así que si me voy a cambiar hasta allíen el prototipo que será mejor cambiarlo aquí. >> Y ahora vamos a trabajar a través deesto, aquí mismo. Vamos a comenzar en la parte inferior. La edad no es un int estrellas. La edad es el tipo de variable? >> ESTUDIANTE: Un entero. >> JASON HIRSCHHORN: Así que la línea 63, la edadno debe ser un número entero. Debe ser un int estrellas. ¿Cómo puedo hacer que un int estrella? >> ESTUDIANTE: [inaudible]. >> JASON HIRSCHHORN: Ponga una estrella allí. Y ahora vamos a ver aquí abajo. 67, getInt devuelve un entero, y estamosel almacenamiento de número entero que en la edad. Pero si estamos tratando a la edad comopuntero ahora, ¿qué necesitamos actualizar esta línea? >> ESTUDIANTE: Ponga una estrella. >> JASON HIRSCHHORN: Pongauna estrella antes de la edad. ¿Es eso lo que dijiste? >> ESTUDIANTE: Sí. >> JASON HIRSCHHORN: Así es. Debido getInt devuelve un entero. Queremos ir a la ubicación dada anosotros en la edad y ponemos un entero allí. Si lo hemos hecho esta línea de código, que iríamosvolver a lo que Curtis estaba hablando anterior, el ahorro de una edad, un loconúmero entero, tal vez el entero 5. Con el tiempo tratamos de ir a la ubicación 5en la memoria, y nos metemos en una gran cantidad de problemas por eso. >> Así que necesitamos esa estrellaallí, y la línea 69? Una vez más, la edad, es en la memoriaabordar aquí. Entonces, ¿qué tenemos que actualizar esta línea? Alguien más? ¿Cómo tenemos que actualizar esta línea? >> ESTUDIANTE: Ponga un asterisco allí. >> JASON HIRSCHHORN: Exactamente. Añadir un poco de estrellas ahí. Ahora estamos llegando al valor señaladoa la edad en lugar de la edad. >> Así que de nuevo, vimos este código vadesde un entero hasta el punto final. Bastante similar. Tenemos que mirar por todos esos lugares quetenía la edad, y tenemos que cambiarlas un poco, porque no queremos queLa caja del cambio de la edad tanto como la edad está señalando. >> Y volviendo la edad, ¿es correcto? Eso es correcto, porquela edad es un puntero int. Sí, la pregunta? >> ESTUDIANTE: ¿Podemos mantenerlo int edaden todo y, a continuación, al final, poner un signo delante de la edad? >> JASON HIRSCHHORN: Ydevolver su dirección? Esa es una excelente pregunta. Usted puede hacer eso, pero vamos a llegar aque en un segundo y la respuesta que pregunta en un segundo. Pregunta fantástico. >> Hasta aquí, si nos estamos convirtiendo un intpuntero, ¿qué tipo de cosas es edades de delfines almacenar en ella? Si estamos devolviendo un puntero int derechoaquí, qué tipo de cosa es edades de delfines almacenar en ella? Int punteros, así que la línea 37debe ser int estrellas. Ese es el tipo de esta matriz. No es el almacenamiento de enteros más. Ha almacenar int punteros. >> Y finalmente, aquí abajo, edades de delfinessoporte de i, que nos va a dar, de nuevo, y int puntero. No queremos que un puntero de int. Queremos que el valor apuntadoque por ese int. Así Hassan, ¿cómo podemoscambiar esta línea? >> ESTUDIANTE: Ponga una estrella? >> JASON HIRSCHHORN: Exactamente,poner una estrella allí. Eso nos dará un valor. ¿Qué pasa con la línea 51? >> ESTUDIANTE: Otra de las estrellas. >> JASON HIRSCHHORN: Otra de las estrellas. Eso es exactamente correcto. Así que estamos tratando, de nuevo ahora, estoscosas como int punteros. >> ESTUDIANTE: ¿es un problema en absoluto que, engetAge, edad int estrellas está nunca dada ubicación e? >> JASON HIRSCHHORN: Es un problema queedad int estrella nunca se le da un ubicación, y que va a ser un parecidoproblema de lo que eras hablando con sólo volveredad y comercial y mantenerlo como un int. Pero quiero ejecutar este código primeroy ver qué pasa. >> Aceptar. Así edad variable no inicializadocuando se utiliza aquí. Por lo tanto, dice, "inicializar la variable"Edad" para silenciar a esta advertencia, "y sugiere darle nulo. Vamos a darle un valor nulo. Así que debemos deshacernos de advertencia tha. Debemos ser capaces de compilar. >> ¿Qué edad es el delfín? Digamos, 1. Culpa Seg. >> Así que me gustaría ir a través de GDB, y yoanimo a ir a través de GDB en su cuenta para averiguar por qué estaprograma sólo SEG criticado. Yo no voy a dejar esto como unmelodrama, sin embargo, y me voy a abrir esta función. Vamos a entender por quéeste programa seg criticado. Así que como todo en la pila, cuando unfunción se llama, una bandeja se añade a la pila proverbial donde localesse almacenan las variables. Cuando una función devuelve,esa bandeja se va. Esas variables locales desaparecen también. >> Edad estrella Int. equivale nulo es un local devariable guardada en ese marco de pila. Cuando esta función se va, estevariables desaparece también. Así que pasamos en la direcciónde lo que sea. Pasamos de edad. Es una dirección, pasamos por eso en. Pero en última instancia, nosotros - >> Lo siento, me estoy adelantando a mí mismo. ¿Por qué este programa realmente SEG fallo eneste caso fue porque la edad apuntaba en null, que es un lugar específico,y nulo es un lugar que no está permitido tocar. Y así cuando tratamos de escribir esta líneade código, va a envejecer y hacer algo allí, nos dieron en problemas,y ahí es donde nos segùn criticado. Debido a que la edad de la estrella, la edad de nuevoestá apuntando a null. Queremos en null, que es una zona mala. Intentamos getInt allí, 1 en nuestro caso,y ahí es donde nos segùn criticado. >> Pero decir que un caso de opt-in, decir que noshabía dado esta una dirección legítima aquí, como bf4ac, algovimos antes. Aun así, cuando este programa regresó,se correría en un problema porque que la dirección hubiera ido. La dirección de variable localhabría desaparecido. Independientemente de la edad se señaló que no lo haríahaber existido nunca más. >> La forma en que arreglar eso esalgo que has visto antes, la función malloc. Y usted ha sido introducido enque la función malloc antes. Usted ha visto esto? Malloc te da un poco de memoria queno desaparece cuando el marco de pila se va. Así que escribir esta línea de código - y yo voy a dara usted por ahora - malloc. Y ya que estamos almacenando un int, estamosva a malloc de suficiente espacio. Vamos a decir que darme una caja del tamaño de int. Malloc devuelve una dirección, y estamosahorro de esa dirección en la edad. >> Ahora cuando ejecutamos este programa - no vamos a SEG culpa porquelos bloques de memoria que conseguimos a través de malloc no desaparecen cuando elmarco de pila desaparece. Viven hasta que queramospara deshacerse de ellos. >> Y esto se remonta a su pregunta,Jeff, de antes. ¿Cómo puedo crear cosas dentro de mifunciones que quiero utilizar más tarde en principal o en diferentes funciones? Yo uso malloc, y pasosus direcciones alrededor. >> Eso era mucho, lo admito,para cubrir en este momento. Así que por favor, si usted tiene cualquierduda, consulte a distancia. >> ESTUDIANTE: Entonces malloc no está enLa pila más, entonces? >> JASON HIRSCHHORN: Eso esexactamente correcto. El malloc caja te dano está en la pila. Se está dando a usted en esta otra partede la memoria que vamos a hablar en la conferencia el miércoles. El nombre es el montón, pero no quierohablar demasiado sobre él con excepción Es este otro lugar que no recibeborrados cuando la función se va. >> ¿Alguna otra pregunta? >> ESTUDIANTE: Yo creo que si no ha utilizado unfunción separada y se pone todo esto código en principal, que todavíanecesitará utilizar malloc? >> JASON HIRSCHHORN: Muy buena pregunta. Esto probablemente no es el más eficienteforma de escribir este programa. Se podría haber hecho fácilmente este do-whilebucle principal y guardado a ti mismo un montón de problemas. La razón por la que quería hacerlo comoesto se debe a que quería que todo el mundo ser capaz de ver cómo, en principal,podemos crear una gran variedad de punteros, punteros int. Podemos inicializar los punterosen otro lugar, los puso en este otro área de la memoria que se mantiene durante el tiempo quequeremos que se quede, y entonces podemos acceder a ellos más tarde. >> Por ejemplo, aquí se hicieron búsquedasa través de ellos. Podríamos haber hecho otracosas a ellos. Podríamos haber llegado ay encontró la media. Podríamos haber hecho un montón de cosas. El punto es que usted puede no perderde algunas cosas en medio principal una matriz, crear esas cosas en algún lugarotra cosa, y luego seguir utilizando ellos más adelante. >> Y esta idea, lo que estamos haciendo ahora,va a llegar a mucho en el futuro P-series y los problemas que quiere resolver. Es por eso que lo hicimos como éste inclusoaunque hay que admitir que es enrevesado bit en este contexto. >> ESTUDIANTE: [inaudible] si usted puede mantener todas las edades como intvalores reales en lugar de punteros, podrías usar la edad ampersand ahora? >> JASON HIRSCHHORN: ¿Lo sientes? >> ESTUDIANTE: Si usted sacó las estrellas entodas las edades, y sólo arrojó edad signo, al final,funcionaría eso? >> JASON HIRSCHHORN: Así mallocdevuelve una dirección. >> ESTUDIANTE: OK, a la derecha. >> JASON HIRSCHHORN: Devuelve una dirección,por lo que la edad tiene que ser un int puntero, porque va aser almacenados en una dirección. >> Tenemos seis minutos para el final. Voy a saltar de hablaralrededor de la pila por ahora. Voy a entrar en tres minutosbrevemente en SPL, la más importante cosas que creo que necesitassaber para el conjunto de problemas. >> Sin embargo, antes de llegar aquí, porque estees lo que vamos a terminar en, dos recordatorios finales. Uno, la verdad es que pasó por cosasbastante rápido en esta sección. Pido disculpas por ese ritmo. Si usted tiene alguna pregunta acerca dealgo de lo que fuimos, por qué algo funcionado de la manera que lo hizo, o algo queno explican tan claramente como pude haber, por favor, me tira un correo electrónico o hablara mí después de clases, y voy a ser feliz para explicar a usted más en profundidad. Así que por favor llegar sitiene preguntas. >> Una vez más, el sitio web de la retroalimentación también. Tome un poco de tiempo después de clase si usted tieney dame un poco de retroalimentación. Te lo agradezco mucho. Como se vio al principio de la clase,He leído a través de ellos, responder a ellas si quieres una respuesta, y yote tomas muy a pecho. Eso significa mucho para mí. >> Vamos a terminar la clase hablando dela biblioteca que va a estar usando esta semana. Usted probablemente ha visto un código como lo quetener en la pantalla antes, GRect paleta es igual newGRect, (x,y, ancho, alto). Ustedes tienen probablemente a través de la lecturaa través de la especificación se sentía bastante cómodo con esto, pero para aquellosque eran menos cómodo, para que usted chicos así, quiero volver a pasar por encima de estelínea y vea cómo es similar a lo que hemos utilizado antes. >> Al igual que con cualquier variable - se trata de un objeto, pero al igual que concualquier variable, tenemos el primer tipo y sobre todo aquí, GRect. >> A continuación tenemos el nombre del objeto, ypor último tenemos la función que inicializa, nos dala paleta que queremos. A veces escribimos int x es igual a 5, yinicializamos algo directamente. A veces escribimos cadenanombre es igual a conseguir cuerda. Utilizamos una función para obtener algo,y tomamos su valor de retorno, y ese es nuestro nuevo valor. >> Así que hemos visto esta idea antes, dondefunciones que pueden o no necesitar entrada crea realmente la cosapara nosotros, en lugar de crearnos directamente. Así que hemos visto este código antes. Esperemos que esta idea de un objeto, o almenos la creación de un objeto, no es tan abrumadora si se puede conceptualizarcomo apenas muy similar a las cosas que hemos visto antes. >> Sin embargo, lo bueno de los objetos comodistinta de las variables es que puede hacer cosas con ellos. No es posible cambiar el color de unvariable, pero que de hecho puede cambiar el color de un objeto, o al menosen SPL puede cambiar la color de los objetos. >> No se puede mover una variable enuna ventana, pero se puede mover un objeto en una ventana. Usted puede obtener la ubicación de un objeto. Realmente no se puede obtener unaLa ubicación de variable. Eso es lo bueno deobjetos en esta biblioteca. >> Sin embargo, estas funciones puedenser un poco confuso. Realmente no hemos utilizado las funciones oobjetos antes, así que me pareció que era útil para entender de forma genérica paraexpresar o hacer cosas con los objetos, o entender objetos. Y como te darás cuenta, tengo dosfunciones escritas aquí, funciones que haya visto antes - añadir, ventanacoma paddle, y el color establecido paddle negro coma. En estos dos casos, tenemos una funciónque toma dos argumentos y hace algo. >> Ahora más genéricamente, todos estosfunciones que vas a escribir que tener que lidiar con los objetostomar un lugar y un qué. A dónde está el objeto que deseahacer algo para, en este caso, una ventana o panel. Y el qué es lo que quiereshacerlo o dar a la misma. >> Cuando se está configurando el coloralgo, ¿dónde están que el establecimiento del color? Con el objeto de paddle. Y de qué color se le ajuste? Negro. Con la función de complemento, dondehaces algo? Con el objeto de ventana. Y lo que le están dando a ella? Usted está dando la paleta. >> Se dará cuenta de que las funciones que leuso, color set, ubicación establecida, et etc, etc, todoseguir este patrón. Toman algo que quieres haceralgo, el objeto que desea hacer algo para, y lo que quierenhacer con él, o lo que usted quiere tener cambiado, o lo que usted quiere teneragregado, o el color específico usted quiere que sea. O si no está lleno, ¿quiereshacen que sea llena, et cetera, et cetera. >> Es cierto que una breve discusiónde la Stanford - ¿qué es? Biblioteca Programación Stanford? Biblioteca Portable, es cierto! Gracias, clase. Stanford Biblioteca Portable. Pero una vez más, mucha más informacióndada en la especificación conjunto de problemas, pero espero que esto hace que sea un pocomás fácil de entender objeto, especialmente en lo que han sido relativas a loscosas que hemos visto y hecho antes. >> Así que con eso, es la cuarta semana. Disfrutar aprendiendo sobrela mañana montón. Buena suerte en tu examen la próxima semana, peropor supuesto, voy a ver antes de esa fecha, esperemos que en la sección del próximo martes. Pero también, si usted tiene alguna pregunta,comentarios, inquietudes, no dude en para llegar. Y después de la clase, voy a caminar a otro lado siusted quiere hablar acerca de su problema establecer o tener algunas preguntas.

Noticias relacionadas