>> [REPRODUCCIÓN DE MÚSICA]
>> DAVIN: Muy bien, chicos.
Así que esta es la opinión para la primera prueba.
Es todo el mundo listo para la prueba del miércoles?
ALLISON: Woo!
ESTUDIANTE: Woo!
DAVIN: Sí.
ALLISON: ¡Sí!
DAVIN: está listo Ese chico.
Ese tipo, dos manos, agradable.
Así opinión concurso hoy, va en alrededor de una hora y media.
Vamos a repasar todos los grandes conceptos que usted debe saber para el examen.
Vamos a repasar algunos de codificación por ejemplos de la mano, que están en cada concurso.
Y si usted tiene preguntas, no dude en a levantar la mano y todo
de esa manera.
Bueno, la logística sobre la prueba está en línea.
Así que vamos a dividir la gente hasta en diferentes habitaciones.
Se basa en su nombre.
Así que si usted tiene alguna pregunta acerca de dónde ir o acerca de qué material es, como,
la palabra oficial sobre lo que está pasando para estar en el concurso, comprobar en línea.
Y eso es todo hasta la fecha.
Así que si no hay más preguntas a empezar, vamos a empezar.
Y aquí está Allison.
>> [CLAPS]
>> ALLISON: OK, gracias, Rob.
Apreciarlo.
Davin debería haber volteado a esto.
Esta es la lista no exhaustiva de temas, como siempre, como acaba de decir Davin.
Consulte la documentación en línea sobre concurso cero.
Pero esto es bastante mucho-- que está en el plan de estudios
es todo lo que hemos repasado hasta el momento.
Aquí todo es juego limpio, así como cualquier otra cosa
que pueden haber sido mencionado en la conferencia.
>> Mi sección, aquí, es sólo un montón de revisión.
Hay un par de ejercicios que ustedes podrían trabajar.
Pero en su mayor parte, de verdad quieren llegar a Davin con los código
por ejercicios de manos.
>> Así que me voy a volar a través de este.
Si usted tiene alguna pregunta, por detenerme.
Levante su mano.
Te prometo probablemente veré.
Si no, sólo agitarlo alrededor.
Voy a estar hablando rápido.
Espero que todo el mundo está de acuerdo con eso.
>> Aceptar, palabra especial, Davin, obviamente, se olvidó de dar la vuelta a través de estas diapositivas.
[Risas] Usted está en problemas, el hombre.
Así consejos para concurso cero, practicar la codificación en el papel.
Ustedes van a conseguir un poco de practicar con que ahora con Davin,
por lo que no estará completamente por sí mismo.
Creo que estamos en realidad va a través de estas dos funciones.
Así que usted estará bien preparado allí.
>> Estar familiarizado con los conjuntos de problemas.
Ha habido preguntas en concursos anteriores
que le pedirá que, por ejemplo, para codificar algo muy similar a Mario.
Así que estar muy familiarizado con su problema se pone, así
como las preguntas le pedimos en un principio en el formulario
que llene, voluntad servirle muy bien.
>> Haga una prueba previa bajo las limitaciones de tiempo.
Estas pruebas son largas.
El tiempo pasa muy rápido.
Y, a menudo, no se dan cuenta de cómo rápido se va hasta que realmente
ponerse bajo esas restricciones.
Así que si usted puede tallar, ya sabes, De 75 minutos, ya sea esta noche o mañana
a tomar uno de estos exámenes bajo que, usted estará en mucha mejor forma.
>> Y también, la creación de su hoja de referencia.
Recuerde, usted consigue uno página delantera y trasera
como referencia para su examen el miércoles.
Creación que es una gran manera de estudiar.
Cualquier cosa que usted está teniendo problemas para con que desea incluir en allí.
Cualquier cosa que sus TFS han sido, como, esto es realmente importante.
Usted debe saber esto, son tal vez las cosas que tienen allí
si no los tiene memorizado.
Incluso si usted sabe que realmente así, a veces teniendo que allí
es sólo un poco de comodidad para usted, que sé que pruebas son estresantes.
Así que cualquier comodidad se obtiene puede ayudar.
Muy bien, también, conseguir el sueño y comer y gustar las cosas normales
que les decimos a los cuestionarios.
>> Así que a partir de fácil, tipos y tamaños de datos.
Como ya he dicho, esto es sólo va ser yo tirando un montón de cosas
hasta aquí que usted debe saber.
Así que tenemos nuestros caracteres que son un byte, enteros
que son cuatro bytes, a largo de largo, que son ocho bytes.
Básicamente, es sólo usted que desee mantener enteros grandes.
Carrozas, que son cuatro, dobles, que son ocho.
Una vez más, sólo le da más espacio para sus carrozas.
Y a continuación, escriba la estrella, por lo que cualquier puntero en una máquina de 32 bits,
que es todo lo que ustedes necesitan a saber, es de cuatro bytes.
>> Así que todas las cosas que usted debe sé, tal vez las cosas
usted quiere tener en su hoja de referencia.
Aceptar, la conversión binario a binario, la conversión
a hexadecimal, de ida y vuelta, todas las cosas que usted debe saber.
Así de binario a decimal.
¿Quieren tomar un minuto rápida y tratar de averiguar cada uno de estos
y luego me dicen lo que son?
>> También tengo caramelos en el bolso, por lo que cualquiera quien responde consigue dulces, por cierto.
Y tengo mucha.
Permítanme aprovechar esta.
Yo voy a dar esto a Gabe.
Así que usted puede repartir caramelos a el que es agradable y cooperativo.
>> OK, yo vi una mano que hay en la parte posterior.
>> ESTUDIANTE: Sí, el primero es 42.
>> ALLISON: Sí, primero es 42, correcto.
ESTUDIANTE: [inaudible].
[Risas]
ALLISON: Segunda uno, allí en amarillo?
ESTUDIANTE: 110010.
ALLISON: Así es, y esto último, aquí en la parte inferior?
También, sí, usted sabe que quiere?
Simplemente tirar caramelos.
¿Qué hay de caramelos para todos?
>> ESTUDIANTE: [inaudible] cuando hayamos terminado.
>> ALLISON: Shh.
Y luego la última.
¿Quién quiere contestar?
Justo ahí.
>> ESTUDIANTE: 11100.
>> ALLISON: 11100, mira eso.
Felicitaciones, gran trabajo, todo el mundo.
Aceptar, todos tipo de comprender el proceso para hacer esto?
Has, al pasar de binario a decimal la manera en que yo tiendo a hacerlo, está escribiendo a
las potencias de 2.
Por eso digo, OK, 0 veces 2 a 0, por lo que que es 0, 1 2 veces a la primera,
2 es ir adelante de esa manera.
¿Alguien me quiere explícitamente ir a través de un ejemplo de binario?
Aceptar, fresco.
>> Decimal a binario es muy similar.
Tiendo a escribir las potencias de 2.
Comience con el que es el más grande, pero no va más allá de la decimal
que usted está buscando.
Y a continuación, tipo de su forma de trabajo añadiendo al revés las cosas como sea necesario.
>> Y a continuación, con la adición, es Además como normal.
Si alguna vez tienes el caso de que usted es añadiendo dos 1s, es obvio que se convierte en 2.
2 en binario es ahora 1 0 por lo que necesita para llevar su 1 en la siguiente columna.
Enfriar.
>> Hexadecimal, esto podría ser algo que es ligeramente menos familiarizados.
Así como Rob simplemente me estaba diciendo de antemano, su truco para este
es simplemente dividirlo en cuatro trozos de bytes, ¿de acuerdo?
Bits, lo siento.
¿Ven?
Gracias Rob.
Esto es por qué estás aquí. [RUIDO] Aceptar, por lo que acaba de romper para arriba
en cuatro trozos bits.
Así que con los binarios a hexadecimal, nos fijamos en los primeros 4,
que es si tenemos cuatro 1s en un fila, ¿qué número ¿eso simbolizan?
>> ESTUDIANTE: F.
>> ALLISON: Así que en este caso, lo que es 11111111 o-- sí?
ESTUDIANTE: FF.
ALLISON: Perfecto, FF.
Tan grande, caramelo para usted.
Ahora, por la forma en hexadecimal a binario, que sólo pensar en que tipo de a la inversa.
Para cada número o letra que que tenemos en nuestra hexadecimal,
simplemente convertirlo a sus cuatro bits [Risas] para su conversión de cuatro bits.
Así que 5, en este caso, lo que es 5 si estamos representando con cuatro bits?
>> ESTUDIANTE: 010?
Mm-hm.
Y entonces A, que es en realidad 10, que sería?
1010.
Así tenemos que, aquí.
Así que la conversión entre hexadecimal y binarios en realidad no es tan malo.
Si nos fijamos en que en cuatro bits trozos, van a ser de oro.
Everyone-- sí?
>> ROB: Esto es una tontería, pero yo siempre recuerdo
A, ya que A supone que es 10.
Y binario sólo 10 10, así que--
>> ALLISON: Ah, ahí vamos.
>> ROB: Hey.
>> ALLISON: Hey, dulces para Rob.
Hay cosas que no es chocolate en allí.
Así que usted puede tener alguna.
Así matemáticas ASCII.
Comportarse.
Así matemáticas ASCII, como ustedes probablemente bien recordar
P puesto 2 con Visioneer y César, que hizo mucho de esto.
Recuerde, los personajes son fundamentalmente sólo números.
Así que podemos hacer operaciones matemáticas con ellos, al igual que hacemos matemáticas con enteros.
>> Así que tenemos un poco cosa simple aquí.
Tenemos algunos en A eso es inicializado a 65.
Y B igual al valor ASCII de A más 1, char C igual a D menos 1,
y Char D igual a 68.
Así que vamos a imprimir todos ellos, como vemos aquí.
Y puede alguien decirme lo que esto va a imprimir?
ESTUDIANTE: [inaudible].
ALLISON: Exactamente, así que Una cosa a notar es
que estamos imprimiendo a cabo caracteres cada vez, aquí.
Nosotros designamos a pesar de que A y B son enteros cuando les declaramos anteriormente.
Les estamos imprimiendo como caracteres por el porcentaje de C y nuestra declaración de printf,
por lo que todos se imprimirán como personajes.
Y, por supuesto, la voluntad valor ASCII 65 imprimir como A. El valor ASCII de A más 1
sería 66, lo que haría orgullosos de B. Así que, de hecho, nos
llegar A B C D Todo el mundo bien allí?
¿Alguna pregunta?
Impresionante.
>> Aceptar, ámbito de aplicación.
Así es obviamente un alcance muy Lo importante de entender, aquí.
Muchos de ustedes, si tiene errores de compilación,
y dice que no tiene el acceso a alguna variable,
es probable que sea porque usted definido dentro de un bucle
y luego trató de acceder a ella fuera de él, o viceversa.
>> Así que alcance en su núcleo, sólo determina dónde
decimos que existe una variable, en el que puede cambiarlo, en el que podemos acceder a ella.
Es sólo un poco de decir estos son los únicos lugares donde se tiene acceso
a esta variable.
>> Así que los dos ámbitos que hablamos durante la clase son globales y locales.
Así que las variables globales que hablamos cuando usted los está definiendo por encima de principal.
Esto significa que toda su programa tiene acceso a ella,
y existe durante el tiempo como se ejecuta el programa, ¿de acuerdo?
Local significa que es más confinado a una región.
Así que cada vez que tenga funciones específicas como swap, que siempre hablamos.
Siempre hablamos de swap con A y B. A y B existen dentro de esa función.
No existen en ningún otro lugar.
>> Además, cuando se tiene si declaraciones o para bucles.
Siempre que tenemos, por ejemplo, en un bucle for tenemos int I es igual a 0.
Tenemos un poco de condición y lo actualizamos.
Yo sólo existe dentro de la llaves de ese bucle.
Si intenta acceder a él en otro lugar, su compilador sería gritar a usted.
Sería como, ¿qué estás tratando de hacer?
Esto no existe.
Así que ese es el dos diferentes tipos de alcance.
¿Eso tiene sentido para todo el mundo?
>> Así, por ejemplo, aquí, esta es sólo un programa simple.
¿Qué piensan ustedes es va a pasar en cada punto
que tratamos de imprimir?
Así que este de aquí, lo que va a pasar?
ESTUDIANTE: Se imprimirá tres.
ALLISON: Derecho.
Se va a imprimir tres.
¿Qué pasa aquí?
ESTUDIANTE: No funcionará.
ALLISON: No funcionará.
Usted está fuera de alcance, ¿no?
No existe la variable local fuera de estos apoyos, ¿de acuerdo?
Y entonces ¿qué pasa aquí?
>> ESTUDIANTE: [inaudible].
>> ALLISON: ¿Qué?
Rob, vaya.
>> ROB: Me acaba de decir.
Las variables globales deben ser variables subrayado mundial.
>> ALLISON: Ah, sí, lo siento.
Gracias, Rob.
Rob es como nuestro compilador residente.
Él sólo va a gritar a nosotros cuando nos necesitarlo. [Risas] Sí, que
debe ser variable de subrayado global.
Así que asumiendo que fue subrayado mundial
variables, lo que va a pasar aquí?
ESTUDIANTE: Eso va a trabajar.
ALLISON: Se va a trabajar.
Así que va a imprimir, por lo que sólo un ejemplo muy simple.
Aceptar, prototipos.
Así que, obviamente, realmente resaltar para ustedes
para hacer funciones si tener sentido en sus programas.
Pero, por supuesto, cuando usted hacer sus propias funciones,
normalmente se le define después de principal.
Y usted intenta llamar a ellos en principal.
Y si usted no utiliza un prototipo, su compilador gritarte.
>> Prototype es básicamente simplemente decirle a su compilador
que tengo esta función por debajo principal.
Voy a llamarlo antes de que yo lo defino.
Sólo espera.
Te prometo que está definido, y que tendrá todo lo que necesita.
>> Así que la forma en que hacemos es sólo su declaración tipo, el nombre de la función, su entrada
lista.
Se trata básicamente de la primera línea de su declaración de la función.
Es realmente todo lo que es.
Pero esto es sólo una tipo general de formato.
>> Así que en nuestro ejemplo aquí, que ustedes deben
han visto en la sección en algún momento, tenemos
int cubo que algunos toma algún int de entrada.
Y tenemos nuestra principal función, que llama cubo.
Y cubo se define después de los hechos.
>> Así que si no teníamos entrada int cubo en la parte superior, cuando llamamos cubo
dentro de principal, nuestro compilador se enoje con nosotros.
Sería como, lo que De que estas hablando?
Cube no existe.
No sé lo que estás pidiendo.
Y yo sólo voy parada.
>> Pero debido a que hicimos nuestro prototipo en la parte superior, lo hemos dicho,
ya sabes, cuando ves cubo, no se preocupe por ello.
Te prometo que está definido más adelante.
Y te dejaré hacer lo que quiera.
Así que si alguna vez tiene una función que se declara después de que usted le llama
por primera vez, es necesario lo tiene un prototipo en la parte superior.
>> ¿Sí?
>> ROB: Se cuadró, no cubicación.
>> ALLISON: Oh mi Dios.
Yo no tener-- Gabe, pensé usted era nuestro corrector de pruebas.
OK chicos, tengan paciencia conmigo, aquí.
Espero que todo el mundo está haciendo a la idea.
Aceptar, por lo que este debe tener sido ajustado, no en cubos.
Pero la idea sigue siendo la misma.
Cualquier función que estamos llamando después el hecho debe tener un prototipo.
Todo el mundo bien con eso?
Cualesquiera otros errores tipográficos?
Okay.
Cualquier errores tipográficos aquí antes de empezar, Rob?
[Risas] OK, así estructuras.
Básicamente, estructuras que permiten para crear su propio tipo de datos.
Tanto como un int o un char o un flotador, es sólo otro tipo.
Me gusta pensar en ello como, como, crear su propio tipo de datos.
Por lo tanto, le permite hacer eso.
Y tiene diferentes tipos de datos.
>> Así que si usted recuerda, en una matriz, que sólo puede contener las cosas de tipo similar.
Las estructuras nos permiten contener múltiples cosas de diferentes tipos.
Así que en este caso aquí, tener una estructura denominada Estudiante,
llamado aquí en la parte inferior.
Y tenemos algunas Identificación del int y algún nombre de la cadena.
Así que este es sólo otro tipo de datos.
Ahora tenemos un tipo de datos llamado Student.
>> Así que ya podemos pensar en como otro tipo de datos,
podemos declarar variables como lo haría con cualquier otro.
Así que en lugar de sólo tener, al igual que, una int estudiante, sólo tenemos un estudiante,
1 estudiante.
Oh, mira.
Es Rob.
Así que aquí estamos declarando una estructura, o una variable
llamado estudiante 1 de tipo estudiantil.
Así que va a tener identificación y el nombre asociado con él.
>> Y la forma en que el acceso de estas elementos dentro de nuestra struct
es con el operador punto, aquí.
Así que en este caso, declarado algún estudiante 1.
Asignamos el ID que es 1.
Y hemos asignado el nombre a ser Rob.
Bueno, todo el mundo bueno con eso?
Utilice sólo como-- sí?
>> ESTUDIANTE: Sí, cuando typedef-- Por qué tenemos que usar typedef?
>> ALLISON: Así typedef sólo dice que-- Rob,
me puede corregir en este caso estoy wrong-- pero en realidad es sólo typedef declarar
como un tipo que se puede utilizar, ¿verdad?
>> ROB: Sí, es básicamente, por lo que acaba de crear
un alias o un apodo para un tipo.
Así que usted puede escribir que [inaudible].
Así que [inaudible] existe, y ahora sólo tenemos
[Inaudible] medios exactamente la misma cosa.
Así que aquí estamos con tipo, creo yo, alguna estructura de tipo 2 [inaudible].
Así que es sólo un apodo para un tipo dado.
>> ESTUDIANTE: String biblioteca [inaudible] fue escrito para arriba como estrella Char.
>> ALLISON: Para nuestros propósitos aquí, si usted está declarando una estructura,
sólo hacer typedef struct.
Aceptar, por lo que de antemano, esto es sólo una variable normal aquí.
Accedemos a ella con un punto.
si tenemos un puntero a una estructura, podemos realmente
utilizar una flecha, que está muy bien.
>> Así que en este caso, tenemos un puntero a un estudiante que es un tipo de estudiante.
Recuerde que con su construcción puntero,
quieres lo escriba su puntero está apuntando a ser al principio.
Así que tenemos algún estudiante 1, aquí.
Y puesto que este estudiante 1 es ahora una punta,
en realidad podemos ir estudiante nombre 1 flecha en lugar de puntos, porque es un puntero,
y asignar Rob.
Y ahora si queremos Rob cambiar a Davin,
esto se acaba demostrando que una manera diferente de hacerlo.
>> Así que en vez de usar la flecha, que puede También-- voy a terminar esto y después
tomar esa pregunta-- pudieras También hacer referencia 1 estudiante.
Eso es mucho decir, como ir a lo que esté a estudiante 1, que
sería nuestra estructura estudiante.
Acceder a ella con un punto y el elemento que desea, y luego se reasigna.
No era una pregunta.
ESTUDIANTE: Sí, así que ¿cómo es que usted tiene utilizar [inaudible] cuando estás
haciendo estrella estudiante sin [Inaudible] de los estudiantes?
ALLISON: Debido a que este es la creación de un puntero.
ROB: Vamos a hablar de ello.
ALLISON: Vamos a hablar sobre esto más adelante en la revisión.
Así que aferrarse a ese pensamiento.
Si todavía te molesta en la fin, venir a hablar con uno de nosotros.
>> Así que estos hacen exactamente lo mismo.
Estamos mostrando que dos diferentes maneras de hacerlo.
Estudiante 1 es ahora un puntero, por lo que se puede acceder al elemento de Nombre
dentro de la estructura con una flecha.
O usted puede eliminar la referencia el puntero, y luego acceder a ella como lo haría normalmente.
¿Eso tiene sentido para cada uno?
Si el conjunto de las cosas son un poco puntero confuso, Gabe será hablar de eso,
y entonces tal vez este tendrá más sentido.
¿Sí?
>> ESTUDIANTE: Sí, así que ¿cómo es esto diferente de la?
ALLISON: La anterior?
Así que el estudiante 1 en este caso no es un puntero.
Es sólo su estructura real.
>> ESTUDIANTE: OK.
>> ALLISON: Considerando que el presente uno es un puntero a una estructura.
>> ESTUDIANTE: OK, pero lo hace tipo de terminar trabajando de la misma [inaudible].
>> ALLISON: Funciona de manera efectiva la misma.
Su sintaxis es simplemente diferente.
ESTUDIANTE: OK.
>> ALLISON: Sí, ellos son efectivamente el mismo.
Es sólo en función del contexto, es posible que desee una sobre la otra.
¿Sí?
>> ESTUDIANTE: Cuando usted hace las referencias a la 1--
ALLISON: Mm-hm?
ESTUDIANTE: ¿Por qué usted tener los paréntesis?
ALLISON: Debido a estudiante 1 es el puntero.
Así que hay que asegurarse de que está sólo dereferencing el puntero.
>> ESTUDIANTE: OK.
>> ALLISON: Así que en este caso aquí, los paréntesis alrededor de él
significa que estés dereferencing estudiante 1.
Así que vas a donde el estudiante 1 puntos, que es su estructura.
Así que ahora usted puede pensar en ello como que struct,
así que podemos usar nuestro funcionamiento normal de puntos.
¿Alguna otra pregunta?
Fresco, impresionante.
>> Así que lo último, creo que es mi última diapositiva, woo!
Aceptar, por lo que flota punto imprecisión.
Hablamos brevemente sobre esto durante la conferencia.
Básicamente, tenemos un número infinito de números reales.
Y si alguno de ustedes amar las matemáticas, hay
todo tipo de cosas interesantes con nosotros.
>> Pero hay infinitamente muchos números reales.
Pero son sólo finito muchos bits que tenemos.
Así que siempre vas a tiene imprecisión, es todo.
Y es que es sólo un poco de como algo que usted debe saber.
Eso como que se puede preguntar por qué lo hace imprecisión existe punto flotante?
Así que algo que deberías saber.
Y con eso, me estoy convirtiendo la vuelta a los punteros.
>> BINKY: Hola, chicos.
Binky de mi nombre.
Voy a hablar de los punteros.
Sí, por lo que es en realidad punteros mi parte favorita en este curso.
Así que para aclarar lo que Allison estaba hablando aquí, por lo que la razón
qué-- la única diferencia aquí, la gran diferencia era la manera
declaramos cosas.
Así que esto significa estrella estudiante es un puntero a un estudiante.
Mientras que la diapositiva anterior, es un estudiante estructura real, como un estudiante real,
contiene ninguna de esas cosas.
>> Y la razón por la que querer a-- sí, Davin?
>> DAVIN: ¿Qué significa la flecha?
>> BINKY: Los medios de flecha exactamente la misma que esto.
Así que usted realmente no necesita la flecha.
Al igual que, si usted es único programa en C, sólo puede utilizar este.
Lo sentimos, no hago lo que quiero decir.
Usted sólo puede utilizar esta sintaxis.
>> Pero algunas personas, cuando estaban diseñando C,
se dieron cuenta de que la gente utilizado esa sintaxis tanto,
que le va a gustar simplemente llegar con una estructura de sintaxis para ello.
Y esto se llevó a cabo en la forma de esta flecha.
Y es muy agradable, porque simboliza algo
como en realidad estamos siguiendo esta flecha, este puntero,
hacia un poco de espacio en la memoria.
Y cuando lleguemos allí, queremos mirar hacia el nombre de ese estudiante,
si eso tiene sentido.
¿De acuerdo?
>> Así que esto es exactamente lo mismo.
Esto es exactamente lo mismo que este.
Ellos se compilan exactamente lo mismo, ¿de acuerdo?
Y la razón por la que aquí malloc algo, es porque en este caso,
nuestra variable es en realidad sólo una variable puntero.
Así que sólo nos queda un poco de espacio en memoria que está sosteniendo un puntero.
Nosotros realmente no tenemos ningún espacio que contiene la struct real.
>> Así que esto tiene que hacerse en dos etapas.
Tenemos que crear la memoria para poner el struct en.
Y tenemos que crear el memoria para poner el puntero en.
Por lo que son, básicamente, dos diferentes variables, aquí.
Uno de ellos es de tipo estudiantil, excepto que en realidad no tienen un nombre.
Y el otro es de tipo estrella de los estudiantes.
Y luego estudiantiles 1 puntos allí, si eso tiene sentido.
¿De acuerdo?
>> Así que la razón por la que utilizamos punteros es porque todo
en un ordenador, todas las variables en un equipo que tiene dos cosas.
Tiene su valor.
Y tiene su dirección.
Y una buena manera de conceptualizar esto es que hay
muchos problemas cuando tratar de utilizar las funciones.
Y vamos a tratar de mirar en uno de esos.
A saber, que va a pensar en la memoria como cajas.
>> Siempre se pensó de variables cuando dices na iguales 5.
Se piensa en poner 5 en una caja.
¿Y qué si usted desea pasar que int en una función?
Sólo pass-- no lo hago sabes-- x en una función.
Pero lo que pasa es normalmente como seres humanos, que
pensaría algo así como que soy pasando la caja a una persona.
Y en realidad no suceder en los ordenadores.
Lo que pasa es que copia el valor de la caja de caja de la persona.
>> Así que lo que estoy tratando de decir es que si usted tiene una function-- sorry-- aquí,
si tenemos una función como de cinco hasta allí, si intenta pasar una variable,
que sólo va a copiar.
Si un nx initialize es igual a 3, que va para copiar este valor a la variable de un
hasta allí.
Aceptar, y esto es una especie de la razón Por eso queremos utilizar punteros.
Porque en lugar de dando sólo el valor,
en lugar de sólo pasar sólo el valor a una función,
queremos pasar por referencia.
Lo que llamamos pase por referencia es una especie de dar a la casilla de la función,
por lo que la función también puede cambiar los valores dentro de esa caja.
>> Aceptar, por lo que sólo algunas puntero básica cosas es crear punteros,
que acaba de declarar que un tipo, y poner una estrella justo después de ella.
Y el tipo es sólo lo que usted está apuntando a.
Así que si es un int estrella, usted está apuntando a un int.
Si se trata de una estrella char, usted está apuntando a un gráfico.
Y si se trata de una estrella de los estudiantes, usted está apuntando a un estudiante.
¿De acuerdo?
>> Y son los 4 bytes de longitud.
Dado que esta variable En realidad, no
necesitará tener un char, un int, o un estudiante.
Sólo se necesita para mantener una dirección.
Es por eso que son los 4 bytes de largo en una máquina normal de 32-bit.
¿De acuerdo?
Así que aquí, x es una variable que apunta a un int. Y apunta a un char. puntos z
a un flotador.
Cualquier pregunta aquí?
Enfriar.
Y hay dos diferentes símbolos que tienen
a tener en cuenta a la hora viniendo al puntero.
Así referencia y eliminación de referencias son los grandes.
Así que el signo de la nombre de la variable que la da?
ESTUDIANTE: Dirección.
BINKY: Dirección.
Así que si se declara un int es igual a 5, entonces ampersand
de una va a darle la dirección.
Y en realidad se puede tratar imprimir y ver que
lo que la dirección en la memoria su variable tiene.
Y luego dereferencing-- por lo que se refería a,
conseguir la desreferencia address-- es exactamente lo contrario.
Bien, al igual que los tiempos es el opuesto de una división,
estrella es lo contrario de signo.
Así que los medios de eliminación de referencias van allí.
Así que si le das me star-- no sabes-- 50, que es
va a tratar de ir a la dirección de número 50 en el interior de su equipo.
Aceptar y, ¿por qué nos vemos que son los opuestos?
Porque lo que pasa si lo hace algo así como una estrella Ampersand?
Bueno, un signo que da la dirección de una variable, la dirección de una.
Pero la estrella significa ir allí.
>> Entonces, ¿qué pasa si usted ir a la dirección de una?
Usted acaba de llegar a una, ¿verdad?
Así que ir a la dirección de una es la misma cosa que una.
Es por eso que son por lo general a que se refiere el presente same--
y esto se hace referencia a operadores como opuestos.
¿De acuerdo?
So cool.
>> Bajo el capó, por ejemplo, si declaramos int x es igual a 5,
tenemos una variable.
Y recuerdo que dije cada variable-- y esto es una buena cosa
para mantener en mente-- tiene dos diferentes cosas asociado con.
Tiene una abordado y un valor.
¿De acuerdo?
>> Así que el valor en este caso es 5.
Y la dirección de es-- digamos, estoy hacer algo up-- es 0x04.
Y la única razón por la que por lo general representar direcciones en hexadecimal
es uno, porque es como bueno.
Va bien con el binario.
Es fácil para convertir desde y hacia binario.
Y no se ponga demasiado grande si usted tiene un número muy grande.
Así que nos gusta usar hexadecimal en las direcciones de impresión.
Pero podría representar esto como un entero.
Está bien.
>> Y por lo que tiene una dirección 4 y un valor de 5.
Y entonces me dije puntero int estrellas.
Así que este es un tipo diferente, previo aviso.
Puntero estrella Int es igual la dirección de x.
Entonces, ¿qué va a ser el valor de ptr?
Va a ser el dirección de x, aquí abajo.
Aceptar, por lo que el valor se va a ser la misma que la dirección.
Esa es la asignación de operar que estoy haciendo.
Y entonces PTR se va a tener su propia dirección, que resulta,
en este caso, el 8, ¿de acuerdo?
>> Y entonces puedo crear una nueva copia entero.
Y digo int copia es igual a ir allí.
Así que ir a lo que ptr apunta a.
Bueno, ¿qué tiene este ptr?
Ptr tiene 0x04.
¿Qué sucede si trato de ir allí?
Voy a encontrar el tipo que tiene dirección x y que tiene la dirección 4.
¿Y quién tiene la dirección cuatro es x.
¿Eso tiene sentido?
¿Sí?
>> ESTUDIANTE: En este caso, es el puntero en una pila?
>> BINKY: En este caso, es-- buena pregunta.
Yo realmente no pienso en esto al hacer estas direcciones.
Pero si esto es, como, todo estos son variables locales,
entonces x se va a vivir en-- todo va a vivir en la pila.
Así que todo va estar apuntando a la pila.
Sólo se llega a la pila cuando usted comienza a usar malloc, ¿verdad?
>> Así que si usted recuerda pila es cada vez se llama a una función en su programa,
como, por ejemplo principal, o cualquier otra función, al igual que printf.
Todas las variables locales son va a conseguir poner en un marco de pila.
Y ellos van a conseguir como apilados en la pila.
Eso es lo que se llama una pila.
Y todas esas variables locales van a estar allí.
Y el heap-- y vamos a hablar más sobre este tarde--
el montón es donde todos asignada dinámicamente vidas de memoria.
Fresco?
>> Vamos a esta diapositiva.
¿Sí?
>> ESTUDIANTE: ¿Por qué no se int copia de regresar 0x04?
>> BINKY: ¿Por qué no se int copia de regresar 0x04?
>> ESTUDIANTE: ¿Por qué no es que [inaudible]?
>> BINKY: Porque lo que es un valor de ptr?
>> ESTUDIANTE: 0x04.
>> BINKY: 0x04.
¿Qué pasa si usted va a 0x04?
¿Qué se obtiene?
>> ESTUDIANTE: Oh, OK.
BINKY: ¿Lo ves?
ESTUDIANTE: Sí.
BINKY: Así que usted obtenga un 5.
Entonces copia va a tener 5, si eso tiene sentido.
¿Sí?
>> ESTUDIANTE: ¿Podríamos haber conseguido 5 en el cuadro de valores [inaudible]
si ponemos int copia [inaudible].
>> BINKY: Int-- lo haríamos, si.
Eso habría hecho más o menos la misma cosa.
Pero de esta manera, nos puede pasar abordar a las funciones.
Y eso es lo bueno que vamos a hacer en este momento.
>> Así que este tipo de ejercicio siempre viene en-- muy habitualmente aparece en los concursos.
Así que es muy bueno para tratar de hacer ese tipo de cosas a ti mismo.
Así que trate de no perder de vista lo que la dirección de que es y quiere que los valores de las variables
son en cada punto.
Así que esto es exactamente lo que vamos a hacer.
Aquí, tenemos pasos, uno, dos, tres, cuatro, cinco.
Uno, dos, tres, cuatro, cinco.
Y vamos a seguir la pista de los valores de x y a.
>> Entonces, ¿qué está haciendo esto, si se trata de un código con errores, que estamos tratando de hacer a cinco.
Así que estamos tratando de conseguir en un variable y cambie su valor a 5.
Y recuerde mi analogía de tener un caja y la entrega de la caja a alguien?
Así principal tiene esta caja llamada x.
Y contiene el valor 3.
Y yo estoy tratando de entregar este cuadro de a cinco.
>> Y quiero cinco a cambiar el valor de este cuadro a 5.
Y entonces me acaba de imprimir el valor de x.
Esto es lo que mi function-- esto es lo que estoy tratando de hacer.
Sólo estoy tratando de actualizar el valor de x a 5.
¿Está claro lo que hace la función?
>> OK, así que lo que va a ser el los valores de x y un derecho aquí,
la primera línea, justo antes de la primera line-- me decir-- del programa?
>> ESTUDIANTE: Probablemente basura.
>> BINKY: Sólo cosas basura.
Así que sólo hay que poner N / A. Así que no se sabe muy bien.
Al igual que, una ni siquiera existe todavía, porque no hemos llamado a cinco.
Int un no se declara.
Y x va a existir aquí, pero no lo hemos hecho realmente
asignado ningún valor a la misma, por lo que está bien?
>> Y entonces, ¿qué va a ser el los valores de x y una en el número dos?
>> ESTUDIANTE: [inaudible].
>> BINKY: Así que x va a ser 3.
Eso es fácil, porque estamos asignando 3 a la misma.
Y una aún no existe porque un sólo vive en a cinco.
Así que voy a tener 3 y nada.
o como basura, lo que sea, realmente no definido.
Y ahora, esta es la línea importante.
Aquí, vamos a en realidad llamar a cinco.
Y recuerdo lo que dije.
Nunca pase en el cuadro.
Simplemente copiamos el valor de la caja a otra caja.
Eso es todos los ordenadores, fotocopiadoras cosas de un lugar a otro.
>> Así que a cinco, lo que realmente hace es copia el valor de x para una.
Entonces, ¿qué va a estar aquí?
Los valores de x y a.
3 y 3, sólo tendremos que copiamos por encima de x a a.
Enfriar.
>> Ahora que estamos aquí.
Y ahora vamos para actualizar a es igual a 5.
¿Qué va a pasar en la línea de cuatro?
>> ESTUDIANTE: [inaudible].
>> BINKY: una se actualiza, pero x no se actualizan.
Debido x sigue viviendo en principal, que es un completamente diferente bloque de memoria.
Es una variable diferente.
una es otra variable.
Ellos sucede que tiene la mismo valor porque
copiado sobre el valor de x a a.
Pero ahora, cuando hago una es igual a 5, que en realidad no efecto X de ninguna manera.
Esta es la parte más difícil.
¿Tiene sentido para todo el mundo?
¿Sí?
ESTUDIANTE: Una pregunta más, usted tiene 3.
¿Por qué es un ya-- oh, no, es 3.
Lo sentimos, pero no importa.
Leí 5.
>> BINKY: Sí, 3, 3.
>> ESTUDIANTE: [inaudible], sí.
BINKY: Y luego asignar a 5 una, pero en realidad no cambia x.
Buena?
ESTUDIANTE: Sí.
BINKY: Sí?
¿Puede explicar más cómo se copia un [inaudible]?
>> BINKY: OK, así que cuando usted llama a cinco de x, por lo que esta línea de código aquí.
a cinco de x, lo que es x?
x está a sólo 3 en este punto, ¿no?
Así que usted podría pensar en poner un 3 por aquí y olvidarse de x.
Sólo hay que poner un 3 aquí.
Al igual, vamos a copiar el valor de x para el int a que está allá arriba.
¿De acuerdo?
>> Así que el valor de x es 3.
Vamos a copiar 3 a una.
Y todo esto otro bloque de memoria, esta otra variable
llamado tendrá 3, también.
¿Eso tiene sentido?
¿Sí?
>> ESTUDIANTE: Si le das a cinco como tiene como número entero x en lugar de una,
habría que arreglar todo?
>> BINKY: Si se trata de un integer-- no, eso no sería arreglar todo.
Así que eso es una muy buena pregunta.
Realmente no importa lo que se llama a esas variables.
Una vez más, será una cuestión de alcance, porque no son el mismo x.
Son completamente diferentes espacios en la memoria.
ESTUDIANTE: [inaudible].
BINKY: Así que en realidad no importa cómo los llamemos.
Eso no soluciona las cosas, ¿de acuerdo?
Más preguntas?
¿Sí?
>> ESTUDIANTE: ¿Cómo es volver a número cinco [inaudible]?
BINKY: OK, no hemos hecho todavía.
Vamos a ir hasta el número cinco, entonces.
>> ESTUDIANTE: [inaudible]?
>> BINKY: ¿Qué?
>> ESTUDIANTE: ¿Tiene un retorno en absoluto?
BINKY: No tenemos un retorno, no de principal.
Pero principales devuelve 0 automáticamente si usted no devuelve nada.
¿Sí?
>> ESTUDIANTE: ¿Podría usted hacer main-- o podría usted hacer para cinco regreso una?
>> BINKY: Podríamos tener a cinco devolver una, sí.
Pero entonces tendríamos que asignar x es igual al valor de retorno de a cinco,
que sería un poco diferente del programa.
Se iba a funcionar.
Pero lo que queremos hacer es lo que es llamado cambio algo en su lugar.
Así que queremos en realidad cambiar ese cuadro y no te preocupes
por tener que regresar valores o cualquier cosa.
¿De acuerdo?
>> Esto es igual que la función de intercambio David mostró en la conferencia, salvo que soy
sólo se trata de una variable.
Y él utilizó dos, así int a y b y entonces la variable temporal y otras cosas.
¿De acuerdo?
¿Cuál es la última línea?
Después de cinco vueltas, es simplemente la una va a desaparecer.
No vamos a tener una más, y solo x todavía vivirá.
>> Y ¿adivinen qué? x no cambió su valor,
después de todo, porque somos sólo cambiando el valor de a.
Es por eso que fue x 3 partes.
¿De acuerdo?
Bueno.
Así que este programa no conseguimos lo que queríamos.
Ahora vamos a arreglarlo.
>> Y el programa de solución es el uso de punteros.
Lo que hacemos es que tenemos tres líneas que son diferentes.
Los primeros es que no estamos pasando x.
Estamos pasando la dirección de x.
Así que en lugar de copiar lo largo el valor de la caja,
Todavía voy a copiar algo.
Pero estoy copiando la dirección de la caja.
>> Así que si paso la dirección de la caja de a cinco, luego a cinco
será capaz de encontrar que en la memoria y cambiar su valor.
>> Así y luego allí, tengo que no es un int más.
a es un entero de estrellas.
Es un puntero a un entero.
Y luego, porque estoy pasando el dirijo aquí, y entonces lo que hago
no es igual a un 5, porque una es la celebración de una dirección.
Así que lo que quiero hacer es ir allí y actualizar los contenidos de esta dirección
con 5.
>> OK, así que vamos a ir a través de todas las líneas de uno por uno.
Así que cuando me pongo aquí, todavía tienen N / D, N / D, N / A
para todo en la primera línea, porque yo no tengo realmente
declarado cosas todavía.
Y a continuación, la línea dos, tengo x es igual a 3.
Un int estrella un no existen, lo mismo que antes.
>> Ahora se pone interesante.
Así que voy a pasar.
Y vamos a suponer que la dirección de x es 12 en hexadecimal.
Vamos a suponer esto.
Yo lo inventé.
Así que lo que estoy pasando aquí es una a cinco.
Estoy pasando 12.
>> Entonces, ¿qué valor tiene una tienen?
>> ESTUDIANTE: [inaudible].
>> BINKY: Lo siento?
>> ESTUDIANTE: [inaudible].
BINKY: Sí, como, a dejar de Suponemos que estamos aquí, ahora.
Me estoy preguntando.
>> ESTUDIANTE: [inaudible].
>> BINKY: Se ha iniciado.
>> ESTUDIANTE: [inaudible].
BINKY: Debido a que pasamos algo a la función.
¿Sí?
>> ESTUDIANTE: Dirección de x.
BINKY: Se va a tener la dirección de x.
Y la dirección de x es 12, bueno.
Así que x va a ser 3, porque en realidad no hemos cambiado x todavía.
Y luego una va a ser 0x12, por lo la dirección de x, porque eso es
lo pasamos de a cinco.
>> Y entonces lo que ocurre si tratamos de ir allí?
¿Qué vamos a encontrar?
Así que si usted intenta imprimir una estrella, vamos a seguir esta dirección
y obtener el valor en el interior.
Y el valor es sólo el mismo valor que x
tiene porque esa es la dirección de x, que será 3.
¿Estamos bien?
>> Aceptar y, a continuación, ahora, en realidad nos vamos allí.
Y lo actualizamos es en esta dirección 12.
Ahora es 5.
Así que ahora tanto x como una estrella son 5.
>> Porqué es eso?
Debido a que la dirección de x es 12.
Y también tiene un 12 como su valor.
Así que si seguimos a 12, estamos sólo va a encontrar x.
Así que cualquier cosa que hagamos con una estrella que va a pasar
a x, porque contiene una la dirección de x.
¿De acuerdo?
>> Y esto es como el punto crucial de la solución.
Así que ahora estamos en condiciones, de a cinco, en realidad
acceso a la memoria que vivió en principal.
Así que esta memoria no vive en a cinco, al igual que antes, esta dirección 12.
Y hemos sido capaces de ir allí y cambiar su valor a 5.
>> Y luego, cuando volvamos, nos olvidamos de una.
Nos olvidamos de una estrella.
Y X es todavía cinco.
Así que si usted quiere implementar una función de intercambio,
usted acaba de hacer exactamente lo mismo, excepto que usted necesita a int estrellas aquí,
y así sucesivamente y así sucesivamente.
¿De acuerdo?
¿Estamos bien?
Enfriar.
>> Así puntero aritmética.
Este es un tema un poco complicado.
Así que resulta que punteros son sólo números enteros.
Usted puede pensar en ellos como números enteros.
Debido a que en la memoria, que tiene como dirección cero, uno, dos, tres memoria,
cuatro, cinco.
Así que podemos resumir las direcciones de memoria.
>> Y eso es por lo general lo que haces cuando estás en y matriz, por ejemplo.
Una matriz es como un contiguo bloque de memoria, de los lotes de caracteres,
por ejemplo, un montón de enteros.
Así que si quieres ir a la segundo int o al tercer int,
que sólo puede sumar algo a la primera dirección, y usted va a llegar allí.
Así que esto es realmente útil para eso.
>> Y la cosa a tener en cuenta, sin embargo, es
que no es justo como aritmética normal en el sentido
que si usted está tratando con, digamos, un int estrella, y se agrega 1 a la misma,
entonces no vas añadir 1 a la dirección,
usted va a añadir 4 a la dirección.
Debido a un int es de 4 bytes.
>> Así que esto es como caminando en una matriz.
Si tenemos un conjunto de gran cantidad de enteros y entonces tratamos de ir a la segunda,
que es básicamente sólo sumando los dirección de la primera uno más 1.
Pero eso no va a ser: simplemente digamos que la dirección de la primera es 4.
Aquí, en este caso.
Y si sumamos, por lo que este es lo que está pasando.
Tenemos un int.
Int x es igual a 5.
X tiene un valor 5.
Y inicializamos este puntero, int y int estrella y es igual a la dirección de x.
>> Vamos a asumir la dirección de x es 4.
¿Qué va a suceder ahora si me suma añadir 1 a Y?
Se va a realidad suma 4 en lugar de sólo 1.
Así que añado un 1, pero en realidad añadido 4, porque es inteligente ordenador.
Así que va a añadir en realidad por i veces el tamaño del tipo de puntero.
¿De acuerdo?
>> Así que si se tratara de un char, por ejemplo, si esto fuera una estrella carbón y,
y si añadimos 1 entonces esto ser 5, porque char es un byte de longitud.
Buena?
>> Y, por último, llegamos a punteros y matrices.
Resulta que cada vez usted está tratando con una matriz,
en realidad estás tratando con un puntero.
El muy buen razón conceptual para esto es que las matrices son muy grandes.
Así que recuerdo que le dije que cada vez que pasa cosas de un lado,
copiar todo.
Así que si usted tiene una matriz eso es muy, muy grande,
usted realmente no quiere copiar todo cada vez que
se pasa a su alrededor a otro función, porque eso es sólo
cantidades masivas de trabajo.
Así que lo que haces es un poco más allá la dirección del primer byte.
Y a continuación, la función tendrá acceso a todos los elementos en la matriz.
Así que usted pasó la matriz por su dirección, por lo que la dirección del primer byte.
>> Así que si declaramos int matriz de 3, aquí, sabemos
cómo acceder al primer elemento utilizando la notación soporte.
Si usted recuerda el soporte notación, matriz soporte 0 es igual a 1.
Bueno, esto sería exactamente el mismo que sólo tiene que ir allí y poner 1.
Bueno, es exactamente lo mismo.
Así que la notación de corchetes en aquí será el mismo que esta línea.
>> Y supongo que lo que la notación de corchetes para soporte de matriz 1 será?
Sólo será lo mismo que este.
Así que añadir una a la matriz.
Mueva uno a lo largo de la memoria.
Ve allí, y poner un 2.
¿De acuerdo?
Y esta línea es la misma cosa.
Queremos ir a la tercera caja, de modo conjunto más 2.
Ve allí, y poner un 3.
Así que en la memoria, lo que es que va a pasar es que estamos
va a tener 1, 2, y 3 como la tres elementos de esta matriz.
>> Podríamos haber hecho esto utilizando nuestra notación soporte familiar.
Sólo quiero que ustedes saben que son la misma cosa.
Aceptar, preguntas acerca de esto?
Niza.
Ahora, voy a entregar que a Hannah,
>> HANNAH: Yay, yee-haw.
>> BINKY: Hablando de la memoria y el artículo cosas.
[Aplausos]
>> HANNAH: Hola, fresco, por lo que estamos va a hablar un poco más
acerca de la memoria, que acabamos de abordado el uso de punteros.
Así que hay dos partes principales de memoria que estamos preocupados con.
Tenemos la pila, que crece en la parte inferior, y el montón, que
va hacia abajo desde la parte superior.
Y la pila se va a celebrar todas nuestras variables de instancia.
Así que cada uno llama a una función se pone su propio pequeño marco en la pila.
Así como Gabe se mencionó anteriormente, si llamar a la función una y otra vez,
vamos a apilar cosas para arriba en la pila.
>> Y de manera similar, el montón, que comienza en la parte superior
se va a celebrar toda la memoria que asignamos dinámicamente.
Y así como nosotros de forma dinámica asignar memoria,
esto vendrá abajo hacia la parte inferior.
Un par de cosas a tener en cuenta cuando estamos usando la pila y el montón,
con la pila, si tenemos demasiado many-- vamos a decir-- llamadas recursivas,
y estamos llamando a una función de nuevo, y otra vez, y otra vez, y otra vez,
y se está acumulando, acumulando, acumulando.
Y va a chocar contra el montón.
Vamos a quedarse sin memoria.
Eso va a causar un problema para el equipo.
Y eso se llama el desbordamiento de pila.
Así que eso es definitivamente algo que usted debe tener en cuenta y tratar de evitar.
Y el montón, tiene que recordar para no escaparse accidentalmente de memoria.
Cada vez que usted utiliza malloc, no lo hacen se olvide de liberar esa memoria.
De lo contrario, sólo tendremos que estar en el montón desperdiciado,
y el equipo no sabrá que es libre de utilizar esa memoria.
Así que estos son un par de cosas que tener mucho cuidado con cuando
usted está tratando con la pila y el montón.
Cualquier pregunta con esto?
Impresionante.
>> Aceptar, fresco.
Así que este tipo de cuenta con el mismo idea como desbordamiento de pila, donde
vamos más allá de la límites de lo que la memoria
está se supone que debemos ser capaces de utilizar.
Así que toma, por ejemplo, un tampón, o sólo podía pensar en ella como una matriz.
Y nosotros dijimos, OK, vamos a crear este pequeño arsenal agradable.
Va a ser una cadena.
O se va a almacenar caracteres.
Y sólo va a decir hola.
Y es indeterminado.
Eso es todo.
>> Pero si yo fuera alguien mal y quería hacer algo malo con esta matriz, lo que
Yo podría hacer es tratar de escribir más allá del final de la cadena.
Y como verás, si Escribo lo suficientemente lejos,
Puedo afectar en realidad la dirección de retorno.
Y si me pongo a afectar la dirección de retorno,
Me afectan al modo en el programa se ejecuta en realidad.
Y en lugar de regresar, que saber, una cadena feliz como hola, yo
podría hacer algo malo, como ir a en otro lugar en el equipo, todavía
memoria, cambiarla, todo lo que yo quiero hacer.
Así que eso es lo que esto se vería como es si yo sólo tipo de llené hasta
con valor de basura al azar, en este caso, sólo una.
Y luego, cuando en realidad llegó a la dirección de memoria,
Empecé a llenarlo con algo que hice lo que quería que hiciera.
Cualquier pregunta con desbordamiento de búfer?
Impresionante, volando a la derecha a través de estas cosas.
>> OK, así que hablamos mucho de acerca de puntero con Gabe.
¿Cómo podemos realmente obtenemos un puntero?
¿Cómo obtener una dirección en la memoria?
Bueno, podemos utilizar este agradable función malloc convocatoria, que
se va a conseguir un pequeño pedazo de la memoria,
específicamente en el montón, como hemos comentado,
y que va a darle la espalda un puntero a esa dirección en la memoria.
Y el argumento de que tiene que dar a malloc
es la cantidad de espacio en la memoria que queremos.
>> Así que usted puede ver el tamaño en bytes.
Digamos, por ejemplo, o en realidad, en este ejemplo,
destinamos suficiente espacio para 10 números enteros.
Así que probablemente lo que vamos a querer poner aquí es una matriz de 10 enteros.
Así que le damos el tamaño de enteros, lo que que aprendimos fue cómo muchos bytes?
ESTUDIANTE: 4.
HANNAH: 4, hermoso, y nos quiera de los 10 en una fila,
por lo que tenemos el espacio suficiente para almacenar todos los 10 números enteros, en este caso.
Algo muy importante, cualquier momento usted llama malloc,
usted tiene que comprobar por nulo.
Si usted no marca por nula, así, malloc si se queda sin espacio
y ya no puede darle ninguna más memoria, devolverá nulo.
Así que si usted no marca, malloc puede devolver null.
Y entonces si tratamos de referencia a un puntero nulo,
vamos a obtener un fallo de segmentación, que vamos a hablar en este momento.
Impresionante.
>> Aceptar, preguntas con malloc?
¿Sí?
>> ESTUDIANTE: ¿El control de nula [Inaudible] no lo haga en el cuestionario?
>> HANNAH: Claro, la pregunta era Qué matter-- en el concurso,
va a conseguir puntos fuera de si usted no marca para nula?
Sí, obtendrá puntos fuera si usted no marca por nulo.
Cada vez que se llama a malloc, tanto en el concurso y sus conjuntos de procesadores y en la vida real,
usted tiene que comprobar por nulo.
Buena pregunta.
>> GABE: ¿Qué pasa si no es libre?
HANNAH: Gabe quiere saber ¿qué pasa si no lo hacemos gratis.
Entonces tendremos una pérdida de memoria en nuestro acervo.
¿Alguna otra pregunta?
¿Sí?
>> ESTUDIANTE: ¿Puede usted-- repasar desbordamiento de búfer de nuevo muy rápido?
>> HANNAH: Claro.
La pregunta era ¿podemos repasar desbordamiento de búfer realmente rápido.
Volvamos a esos toboganes.
Así que un tampón, sólo puede pensar en ella como una matriz, ¿no?
Usted tiene un poco de espacio en la memoria.
Y cuando nos creamos nuestra matriz, sabemos matrices han fijado tamaño,
o nuestro buffer tiene un tamaño fijo.
>> Así que digamos que en este caso, tenemos sólo espacio suficiente para escribir la cadena hola.
Si vamos más allá de que atado, si vamos más allá lo que nuestra gama nos dijo que podría tener,
podríamos realmente empezar escribir en la memoria
que el equipo no quiere que escribir en.
Y específicamente, si nos golpeó algo así como el retorno
dirección de la función, la cual, al igual que cualquier otra pieza de la memoria,
es simplemente un lugar en su ordenador, en realidad se puede
cambiar eso y empezar a hacer cosas malas.
Respuesta a su pregunta?
Impresionante, todo lo demás?
¿Sí?
>> ESTUDIANTE: Así apilar [inaudible], que dicha ir desde el fondo subiendo.
Dentro del rango de pila, lo hace la memoria van de, como,
de arriba hacia abajo correspondiente a cada descanso?
>> HANNAH: ¿Cómo hacer usted-- aplazar a Rob en este caso.
>> ROB: Crecerá en la misma dirección que la pila crece.
HANNAH: OK.
ROB: Así me confundo.
Esta va a ser la abstracción.
HANNAH: OK.
ROB: Esto es correcto.
Así que si la pila está creciendo arriba, a continuación, se generally--
no tiene por qué ser así. pero se puede declarar int x.
A continuación, usted declara int y.
Entonces int x serán generalmente inferior en la pila de int y.
Pero eso es sólo un hecho.
Eso no es propio de una cosa importante semilla.
>> ROB: Así que la pregunta de nuevo era sólo lo que sucede cada fotograma se acumula.
Así que cada función para crear una pequeño pedazo de la pila.
Y a medida que avanza hacia arriba, dentro de ese pedacito, dentro de ese marco,
diremos que las variables dentro de ese marco también se mueven hacia arriba.
Pregunta?
>> ROB: Sólo para estar en el mic.
HANNAH: Oh, sí.
ROB: Voy a hablar en usted.
HANNAH: Oh, sí, en Aceptar.
ROB: La excepción es para arrays y estructuras,
donde arrays, un menor índice de la matriz,
y en estructuras de mayor campo en las estructuras
se garantiza que sea en las direcciones inferiores que un valor más tarde en la matriz.
Así que estos están garantizados.
Pero las variables particulares dentro, como int x e int y dentro de una función,
no hay relación necesaria entre sus direcciones.
HANNAH: Otra pregunta aquí?
ESTUDIANTE: ¿Entonces en tampón flujo, sólo desbordamiento del búfer
sólo pasó cuando haber, como, asignado
una cantidad de un array que a continuación es mayor?
Al igual, ¿verdad?
Así que si usted está pidiendo algo de la user--
>> HANNAH: Mm-hm.
ESTUDIANTE: ¿Puede que la fuerza que dar algo a cambio
eso es más grande que cualquier cosa que ha asignado para ellos?
HANNAH: Claro, por lo que el pregunta era, básicamente,
el usuario puede darle más de lo que pides?
ESTUDIANTE: Sí.
HANNAH: Bueno, usted podría evitar el usuario de hacer eso.
Usted podría decir específicamente no hacer me daría más de x número de bytes
Yo sólo le he dado lugar a un número x de bytes, x número de caracteres.
Así que eso es algo que quieres evitar.
¿Sí?
¿Cuál es la diferencia entre desbordamiento de pila y buffer overflow?
>> HANNAH: OK, por lo que la pila overflow-- oh, qué
es la diferencia entre la pila desbordamiento y desbordamiento de búfer?
Por eso queremos pensar en desbordamiento de pila sucede cuando estamos en realidad
acumulando estas llamadas a función.
Digamos que usted tiene una función recursiva, porque sabemos que cada vez que
llamar a una función, que es consigue su propio marco en la pila.
>> Así que apilar hasta demasiado alto, y entonces empezamos a desbordarse.
Y utilizamos demasiada memoria, Y no nos hemos dejado en cualquier lugar.
Recibimos ese error.
>> Desbordamiento de búfer está dentro de un programa.
Queremos que no podría necesariamente ejecutar fuera de la memoria de la misma manera
que podríamos si estamos apilando tantas llamadas a funciones,
pero escribimos más allá de la memoria que sabemos que podemos usar.
Y eso nos permite hacer cosas malas.
¿Sí?
>> ROB: Sí, es posible que desee que sólo tiene que repetir este,
pero también se puede pensar de un desbordamiento de pila
como como un tipo específico de desbordamiento de búfer.
O simplemente piensa en su apilar como un tampón muy grande.
Luego, cuando se desborde apilar, que es algo así como un desbordamiento de búfer.
Pero un desbordamiento de pila es sólo un término específico utilizado cuando la pila
sí desborda.
>> HANNAH: Derecho, por lo que repetir para el vídeo,
que usted puede pensar en desbordamiento de pila como un tipo específico de desbordamiento de búfer.
Fresco?
¿Alguna pregunta más antes de que salgan a la?
Impresionante.
>> Aceptar, fresco, por lo que vamos a hablar de algunos mensajes de error comunes.
Esto es algo que tiene aparecido en varios concursos,
así que algo que vale la pena tomar un segundo vistazo.
Estoy seguro de que ha encontrado al menos algunos de estos
como usted está haciendo su problema establece.
Así que asegúrese de que puede hablar sobre ellos en el cuestionario.
>> Así que la primera es un fallo de segmentación.
Y eso es cada vez que tratar de acceder a la memoria
que no se nos permite el acceso.
Así que usted ha visto este migh, por ejemplo, en ruptura.
Si la detección de colisiones devolver nulo, y entonces usted
tratado de hacer algo con ese valor nulo,
el equipo daría que un fallo de segmentación.
Así que uno, una cosa importante a hacer con el fin de tratar de evitar este
es comprobar siempre por nulo.
>> Es posible que haya visto también declaración implícita de la función.
Así que esto es lo que sucede cuando Allison le mostró
cómo hacemos un prototipo, ¿verdad?
Así que vamos a decir que tenemos algunos función que definimos.
Digamos cubo.
Y eso va en la parte inferior de nuestra función, en virtud principal.
>> Si nos olvidamos de decirle a la computadora acerca de cubo, cuando principal intenta llamar cubo,
el equipo será, como, oh, Dios mío.
No tengo idea de lo que eso significa.
No sé qué hacer, aquí.
Así que el prototipo dice que no se preocupe.
Voy a decirte.
>> Va a venir.
No me grites.
No me vengas con un implícito declaración de función.
Así que si usted consigue este error, uno Lo vas a querer hacer
es asegurarse de que usted tiene su prototipo.
¿De acuerdo?
>> Y por último pero no menos importante, identificador no declarado
es esencialmente cuando intenta utilizar un variable que no se ha declarado.
Así que, de repente, empiezas diciendo como n plus plus.
Y el equipo dice lo que es n?
Nunca me dijiste n era una cosa.
>> Así que una cosa que usted tiene que asegurarse de que usted hizo es decirle a la computadora qué es n.
Así, por ejemplo, n puede ser un número entero.
Y entonces usted evitará este error.
Cualquier pregunta sobre los errores comunes?
¿Sí?
>> ESTUDIANTE: Por lo implícito declaración de función,
podría ser también que usted omite uno de las bibliotecas que se suponía
para incluir, en lugar de el prototipo?
>> HANNAH: Derecho, por lo que el pregunta era, ¿verdad
también obtener este error si se olvidó de incluir una biblioteca.
>> ESTUDIANTE: Sí.
>> HANNAH: Absolutamente, porque de la misma manera
que queremos poner nuestros prototipos antes de la función principal,
si tenemos una biblioteca, los que se van para incluir esencialmente los prototipos,
incluir las definiciones de las funciones.
Muy buena pregunta.
>> ESTUDIANTE: Para una segmentación criticar, sería que también
sucedería si, al igual que, intentamos acceder a una variable,
como, en una diferente [inaudible] de lo que fue declarado en?
HANNAH: Claro, lo que haría que conseguir un fallo de segmentación
si intentamos acceder a una variable de fuera de alcance?
¿Era eso una pregunta?
ESTUDIANTE: Sí.
HANNAH: Beautiful.
Así que probablemente, usted va a obtener una error no declarado identificador lugar.
Así que sólo va a decir No sé lo que es eso.
Enfriar, cualquier otra cosa?
Sí, bien, hermosa.
>> Todo diestro, por lo que la recursividad.
Así que he mencionado un par de veces que podríamos conseguir un desbordamiento de pila
porque estamos llamando a nuestro función recursiva tantas veces.
Estamos recibiendo todos estos pila marcos, bla, bla, bla.
Lo que aún es una función recursiva?
Bueno, una función recursiva es cualquier función que llama a sí mismo.
>> Algunas cosas a tener en cuenta cuando se están implementando función recursiva,
no se olvide de incluir un caso base.
Un caso base es el punto en el que terminamos.
Así, por ejemplo, si estamos de codificación, , Decir, de Fibonacci de forma recursiva,
queremos asegurarnos de que cuando lleguemos a la o el primer número 0 de Fibonacci,
esos dos números tienen estos casos, porque los que no son dependientes
en las cosas que vinieron antes.
Los que tienen sus propios valores.
>> Algunos profesionales de la recursividad, que es un cuestión que hemos visto en las pruebas anteriores.
Pueden dar lugar a más concisa, código elegante.
Y una gran cantidad de funciones, una montón de diferentes algoritmos,
en realidad se prestan a la recursividad.
Su definición podría ser recursivas en sí mismo.
Así Fibonacci es uno.
Factorial es uno.
Ordenamiento por mezcla es uno-- todo cosas que usted puede ver.
Aceptar, alguna pregunta?
¿Sí?
>> ESTUDIANTE: ¿Es un caso de esquina similar a un caso base?
¿O es que por alguna otra tipo de [inaudible]?
>> HANNAH: Claro, por lo que un caso esquina es tan any--
es el caso de la misma esquina como caso base?
Un caso esquina es algo que su código podría comportarse de manera un poco diferente.
Caso base es una especie de relación, en que son como casos particulares
que desea mirar.
Pero la idea de un caso base es que usted quiere que su función recursiva
para detener en algún momento.
No puede seguir llamando a sí mismo para siempre.
Tiene que parar en algún momento.
>> ROB: Sí, con frecuencia, sus casos base podría ser ejemplos de bases de esquina.
>> HANNAH: Derecho, fresco, cualquier cosa?
>> ESTUDIANTE: ¿Podría explicar basa un poco más?
Yo no entiendo muy bien [Inaudible] casos base.
>> HANNAH: De los casos de base?
>> ESTUDIANTE: Base casos, sí.
>> HANNAH: Ah, sí, seguro.
Vamos a ver.
¿Tenemos la tiza por aquí?
Sí, lo hacemos.
OK, así que muy rápido, voy a tratar de escribir lo suficientemente grande
para que pueda ver en la pantalla.
Vamos a hablar de, realmente rápidamente, de Fibonacci.
Así que te voy a dar la secuencia de Fibonacci.
Usted puede buscar la definición.
>> Esencialmente, cada número en la secuencia es la suma de los dos números anteriores.
Aceptar, por lo que la forma en que yo se acaba de describir Fibonacci,
se podía oír la recursividad, ¿verdad?
Cuando le dije que cada número es la suma de los dos números anteriores,
podríamos decir en Aceptar.
Bueno, la enésima Fibonacci number-- así que vamos a
decir que tenemos esta función llamada fib fib-- de n
va a ser igual a fib de n menos 1 plus-- lo siento,
vamos a pasar a la siguiente línea sobre fib aquí-- de n menos 2.
>> OK, así que esto funciona muy bien si estás mirando, por ejemplo, el cero, uno,
dos, tres, cuatro, quinto número de Fibonacci,
donde se puede decir que 5 es igual a 2, más 3.
Pero lo que si usted está en el principio?
¿Qué pasa si usted está golpeando estos dos primeros valores?
>> Para obtener este 1, no se puede decir añadir los dos anteriores,
porque ese cero y- yo no lo sé.
Así que en algún momento, tenemos que dejar.
En algún momento, tenemos que decir que estos dos sólo tienen sus propias definiciones.
El número 0 de Fibonacci es 0.
Y el primer número de Fibonacci es 1.
>> Así que la manera en que yo podría codificar esto, diría que si n es menor que dos,
a continuación, sólo volver n.
Y eso sería mi caso base.
Así es como yo sé que parar con una función recursiva.
¿Está claro?
Impresionante.
Cualquier otra cosa en la recursividad?
Hermosa.
>> Vamos a hablar de forma rápida búsqueda y tiempos tipo de ejecución.
Y luego voy a dar un poco de Davin tiempo para hablar de ejemplos de codificación.
Así que aquí están la búsqueda principal y tipo que usted debe saber acerca de.
Guarantee-- no puedo garantizar, porque no he visto la quiz--
pero esto viene a concurso después cuestionario después de dejar de fumar.
Así que sin duda utilizar esta tabla.
Al igual, tomar esta tabla.
Póngalo en su hoja de trucos.
Serás una persona feliz.
>> Esto nos dice que los tiempos de ejecución de cada uno de estos algoritmos de ordenación y búsqueda.
Así que la búsqueda lineal, se puede ver de ejecución tiempo, y lo mismo con la búsqueda binaria.
Repase lo que estos algoritmos hacer, la idea general.
Mira algunos pseudocódigo, si no propio código.
>> Vas a ver que tipo de burbuja tiene un superior atado en el peor de los casos de n al cuadrado.
Así que si nuestra matriz estaba completamente hacia atrás antes de que queríamos arreglarlo,
diríamos que eso es Va a tomar pasos n al cuadrado.
Pero en el mejor de los casos, por lo que la límite inferior para el mejor de los casos
va a ser si es ya perfectamente ordenados.
Entonces todo lo que tenemos que hacer es compruebe que está ordenada.
¿Hay una pregunta aquí?
>> ESTUDIANTE: ¿Cuándo que desea utilizar especie?
La especie.
Tengo curiosidad.
>> HANNAH: ¿Cuándo que desee utilizar la selección especie?
Este uno?
El que está n cuadrado en ambos casos?
>> ESTUDIANTE: [inaudible].
>> HANNAH: Así que es muy diferente.
Si usted hace que el específico requisitos para el programa,
como cosas como si sólo nos dijimos implementar un sorry-- search--
implementar una especie, podrás probablemente quiera ir
para uno de los que tiene un mejor caso de n,
o un límite inferior en el mejor de los casos de n.
Pero puede haber ciertas cosas como, por ejemplo,
swaps son realmente caro por alguna razón.
Entonces usted querría hacer ordenamiento de burbuja, porque
tener que hacer tantos swaps, cosas por el estilo.
Cualquier sí otro--?
>> ESTUDIANTE: ¿Sería [inaudible] decir que [inaudible]?
HANNAH: Eso es una cosa que te contarían
si lo que buscas en la implementación.
La forma en que lo haría en realidad pensar en qué es n
cuadrado es que tenemos que correr a través de nuestra gama de longitud n,
cada vez que hacer en la mayoría de los swaps, n.
Y que tenemos que hacer este proceso n veces.
>> Así que cuando usted tiene que hacer a lo sumo, n swaps y para n corre a través de la matriz,
No va a ser n al cuadrado.
Pero sí, esto será revelado a través de este doble bucle for,
como la cuestión asked-- o anidado de bucle, debo decir.
¿De acuerdo?
>> Y luego fusionar especie, que es el tipo más rápido que ahora,
o que hemos cubierto en CS50, sabe que el algoritmo principal es
esta idea de irrumpir en piezas ordenadas y luego
fusionando juntos estos bits ordenados.
Y nos llevará log n log n.
Cualquier pregunta sobre búsquedas y tipo antes de que yo lo transmiten?
Vamos a ver.
>> ¡Oh, las listas enlazadas.
Lo sentimos, no tengo un tema más.
Aceptar, impresionante, vinculado listas.
Problema con las matrices, que tienen un tamaño fijo.
Así que si usted no sabe lo grande su entrada va a ser,
usted no desea crear una matriz.
Porque si creamos un matriz que es demasiado pequeño,
podríamos correr en desbordamiento de búfer.
>> Así que en vez, podríamos hacer algo con listas enlazadas, que
permite que tengamos una forma dinámica estructura de datos de tamaño
que nos permitirá almacenar una cantidad más flexible de los datos.
Así que dentro de cada nodo en nuestra lista enlazada, tenemos dos piezas.
Tenemos el valor real que se almacena.
Así que eso es justo lo que haría ver en la matriz, por ejemplo.
Y entonces también un seguimiento de un puntero a la siguiente cosa en la memoria.
>> A diferencia de las matrices, las cuales sabemos que todos vamos
a ser: elementos de la matriz son todos uno después de otras en memory-- vinculado
listas podrían estar en cualquier lugar en la memoria.
Son lugares arbitrarios.
Así que si tuviéramos que en realidad ir a buscar a ellos,
que hacer un seguimiento de la siguiente cosa en nuestra lista.
>> Y a continuación, con el fin de saber donde esa lista en su conjunto es,
todo lo que tenemos para no perder de vista es el primer elemento en nuestra lista enlazada.
Y eso va a permitir que sigamos a través.
>> Así que así es como se puede definir un modo.
Esta es una gran oportunidad para aprovechar las estructuras.
Debido a que usted tiene esta idea, así, para un nodo dado, tengo dos piezas.
Tengo el valor real en sí.
Y luego tengo un puntero a la siguiente elemento en la lista enlazada.
Así que ya ves, tenemos un entero n, que va a ser el valor real,
y luego un puntero a un nodo, llamado siguiente.
Así que va a ser el próximo elemento en nuestra lista enlazada.
ESTUDIANTE: Sí?
¿Tiene que especificar que la estrella es como una estructura?
>> HANNAH: Sí, por lo que desde este es casi como una especie de,
parece un recursivo definición en la que
necesita saber lo que es un nodo en el interior para encontrar un nodo.
Dado que no hace en realidad Sabe lo que es un nodo es completamente
hasta que lleguemos al final de esto-- y después de esto sólo podemos llamarlo
un node-- dentro de esta definición, tenemos que llamar a un nodo de estructura.
Muy buena pregunta.
Algo más?
¿Sí?
>> ESTUDIANTE: ¿Por qué nosotros tengo que decir nodo dos veces?
Porque cuando estábamos en [inaudible] sólo teníamos que hacerlo en punto y coma,
pero ahora tenemos que encontrar que struct nodo? [Inaudible].
HANNAH: Así que creo en el último ejemplo,
estábamos creando en cualquier momento que querido utilizar un estudiante después de eso, usted
tuvo que utilizar struct node-- Estoy sorry-- struct estudiante.
Esto nos ha permitido, después de los hechos, sólo nodo uso agregar un nuevo tipo, esencialmente.
Eso tiene sentido?
Así que tendríamos que volver atrás y mirar el código antes.
Pero me imagino que no usamos typedef.
Y le pedimos a la pregunta, ¿por qué tenemos que usar typedef?
Typedef nos permite evitar la palabra estructura en el principio.
¿Sí?
ESTUDIANTE: ¿Qué tipo de preguntas vendrían hasta
en cuanto en términos de nodos y listas enlazadas?
>> HANNAH: Así que una cosa es que podríamos decir cómo podrías buscar a través de una lista enlazada?
Bien, porque es un poco más complicado
que si estamos buscando a través de una matriz.
Sólo podemos mirar elemento cero, elemento uno, elemento dos, bla, bla,
bla.
Si queremos buscar a través de una lista enlazada,
que en realidad tendríamos que seguir este pequeño laberinto de punteros.
Así que vamos a ir en realidad a través de este muy rápido.
Lo que podríamos hacer en ordenar a-- digamos nosotros
querer simplemente recorrer nuestra lista totalmente vinculado.
Nos gustaría empezar por la cabeza.
Y a continuación, con el fin de pasar al siguiente elemento,
en lugar de simplemente incrementar por uno como podríamos en ir a través de una matriz,
en realidad estamos yendo a seguir el siguiente puntero,
por lo que podemos encontrar en qué parte memoria el siguiente elemento es.
Así que sé que no es suficiente para tomar todo esto en este momento,
pero tendrás que estas diapositivas.
Así que usted puede ir a través de esto un poco más lentamente.
Pero, en esencia, lo que queremos que hacer es seguir estos consejos
a través de la totalidad de la lista enlazada.
Así que esta es una pregunta se le puede pedir.
>> Algo a notar con inserción, digamos
hemos querido poner un nuevo elemento en la parte delantera de nuestra lista enlazada.
Tenemos que ser muy cuidadosos sobre el orden en el que se
reasignado los punteros.
Porque digamos que acabo de decir en Aceptar.
Hacer punto la cabeza a este nuevo elemento.
Sólo asegúrese de que apunte a continuación, 1, tenemos esencialmente perdido el resto de nuestra lista,
porque no me acuerdo donde 2 vidas.
>> Así que tenemos que hacer en un orden muy específico.
En primer lugar, hacemos la nueva elemento de punto a la cabeza.
Y luego hacemos la cabeza que apunte al nuevo elemento.
Así que vamos a ver lo que parece con arrows-- así como así.
Así que al principio tiene el nuevo elemento de punto a la vieja cabeza.
Y ahora, tenemos la cabeza que apunte al nuevo primer elemento.
Cualquier pregunta con esto?
>> Aceptar aquí hay un código nuevo, algo a mirar un poco más tarde.
Y ahora voy a darle la vuelta a Davin para GDB y un poco de práctica
codificación en el papel.
Hermosa.
>> ROB: Y Rob.
>> HANNAH: Oh, Davin y Rob.
Lo siento.
>> ESTUDIANTE: Woo!
>> ROB: Gracias.
>> DAVIN: ¿Usted quiere decir todo muy rápido?
ROB: Sí, sí.
DAVIN: Una vez que estoy arriba.
Aceptar, mientras que Rob pone el micrófono, así que cuál es GDB?
Todo el mundo debería haber visto en GDB clase y también en horario de oficina.
Y usted debe ser el uso de la misma.
Entonces, ¿qué es GDB?
¿Alguien?
>> ESTUDIANTE: Es un depurador.
>> DAVIN: Es un depurador.
Y ¿qué se le permite hacer?
Al igual que, ¿por qué nos gusta el BGF?
ESTUDIANTE: Para retrasar el programa.
DAVIN: Derecho, para que pueda caminar a través de ella como un ritmo humano.
Y así, ¿cuáles son algunas comandos que puede hacer?
Bueno, es probable ruptura su comando favorito.
Debido a que le permite romper el programa y, de hecho caminar a través de él
línea por línea.
>> Ejecutar le permite ejecutar la misma.
A continuación, como caminar a través.
¿Cuál es la próxima y entre paso?
Espere, decir eso en voz alta.
Fue correcta.
>> ESTUDIANTE: [inaudible].
>> DAVIN: Sí, impresionante.
Así como, el próximo paso y, si you're-- digamos que usted tiene una función que
definir.
Digamos que algunos en su función principal, y estás golpeando siguiente, siguiente,
siguiente.
Usted está en realidad va a ejecutar esa función,
pero usted va a saltar por encima de ella.
Si golpeas a paso, o s o lo que sea, usted es
va a saltar en realidad en esa función,
y entonces usted puede golpear próximo para ver las distintas llamadas
dentro de esa función en particular.
¿Sí?
>> ESTUDIANTE: ¿Hay una manera saltar, como, echarse atrás?
DAVIN: Finalizar, sí, terminar con usted saltar.
Así que va a terminar ese función, y entonces estás
va a estar de vuelta en principal, por ejemplo.
Imprimir imprimirá a cabo una vez.
Algo que siempre uso es pantalla.
La pantalla imprimirlo constantemente a lo largo de la totalidad
de su programa.
>> Por ejemplo, si usted es en un bucle for, y usted
quiero ver cómo está cambiando algo, y usted no quiere, como, constantemente
estar haciendo como impresión, impresión, impresión, visualización
mostrará esa variable continuamente, cada vez que se golpeó en Siguiente.
Y continuar.
Así GBD, eso es GDB.
>> ESTUDIANTE: ¿Cuál es el uno donde [inaudible]?
DAVIN: ¿Qué es?
>> ESTUDIANTE: ¿Cuál es el-- las variables locales.
ROB: No es algo que en realidad como la gente o algo así.
Yo can't--
>> DAVIN: Podría ser algo así, sí.
>> HANNAH: En los locales?
>> DAVIN: Eso es todo.
Ese es el uno.
ROB: Beautiful.
>> DAVIN: Sí.
>> ESTUDIANTE: ¿Qué significa seguir hacer?
>> DAVIN: Se continues-- por lo que es justo va a continuar con sus programas.
Así que si se rompe y golpeas continuar, va
a tan sólo ejecute ese programa hasta que llegue ese descanso de nuevo.
Así, por ejemplo, si usted se rompió en una función,
y que vas a hacer, como para bucle o algo por el estilo,
y de llegar a continuar, que va a continuar y volver a ese descanso.
O no hay ruptura, que va a continuar y terminar el programa.
>> ROB: Así que al igual que las paradas ejecutar en el primer punto de interrupción
golpeas, si luego hit continuar, va a mantener
ir hasta que sea el siguiente punto de interrupción.
Y luego continuar irá al siguiente punto de interrupción.
DAVIN: ¿Alguna otra pregunta sobre GDB?
Así que creo que en el pasado, nosotros le hemos pedido lo
BGF es y dar una ejemplo de algunas cosas que usted
puede hacer con el BGF, por lo realmente simple, pero sí.
Hay que ir.
Y nodos?
>> ROB: Sí, por lo que la dirección era?
ESTUDIANTE: Eso fue todo.
DAVIN: Espera.
ROB: Este chico?
DAVIN: Que uno.
ROB: Este chico, oh, no me di cuenta.
Así que no estábamos claros en lo que el-- no lo hago
sabía quién era-- pero la pregunta.
No sabemos exactamente lo que estaban preguntando por él, por lo que sólo
para aclarar algo.
Así que en primer lugar, como he dicho antes, typedef siempre estás usando sólo
crear un apodo para un tipo.
Así que aquí, el apodo que estamos crear es para este nodo struct tipo.
>> Así que primero, haciendo caso omiso de este nodo en la typedef, por lo que esta estructura rizado nodo
prepararse hasta el próximo rizado corsé es el tipo de nodo estructura.
Y necesitamos a ese nodo allá arriba, porque nosotros
que tenga que hacer referencia a los nodos de aquí.
Así que con este tipo de estructura recursiva, que necesita para dar este struct un nombre,
o de lo contrario no podría decir nodo struct aquí.
Mientras que antes con el estudiante cuando nos escribimos, creo,
nosotros no tenemos que decir estudiante allí, porque nosotros
no tenía que decir struct estudiante dentro de la propia estructura.
Así que es el recursivo que nos obliga a decir nodo allí.
>> Este nodo es simplemente el nombre que estamos dando nodo para el typedef.
Así que el nodo no es el mismo que el nodo.
Pero este nodo es el struct mismo que el nodo struct.
DAVIN: Así que cuando usted llama, como, el nodo en su función principal,
usted no va a tengo que decir nodo estructura.
Usted sólo puede decir nodo, porque nodo es un diferente-- es básicamente
que dices, OK.
En lugar de tener que llamar struct nodo en mi código,
Sólo quiero cambiarle el nombre como nodo para que sea más fácil.
>> ROB: Si siempre utilizar typedef, entonces esto
es el único lugar que vas a tener para declarar una variable con el nodo de estructura
estrella, sí.
>> DAVIN: OK, por lo que la última parte es difícil de enseñar porque--
ROB: ¿Qué?
>> DAVIN: Debido a que está en el papel de codificación.
Así que cada año tenemos código de preguntas de papel.
Así que creo que el año pasado, 12 de los 80 puntos fueron código en el papel.
Año antes de eso, 10 de 80, años antes de que, el 20 de cada 100,
por lo que un buen número de ellos.
Así que vas a tener que ser capaz de para codificar estas funciones con la mano.
>> Así que pensé que podríamos ir a través de un par de ellos y ver cómo la gente hace,
tipo de caminar a través de poco a poco con la gente.
Así que en general, y strlen atoi haber sido muy popular.
El año pasado, creo que tuvimos GetPositiveInt y randomInt.
Pero prisionero de guerra, por lo que el poder, también una positiva también.
Vamos a ir a través de lo mejor uno o dos de ellos juntos.
¿Qué es lo que la gente quiere ver?
>> ESTUDIANTE: Atoi.
ESTUDIANTE: Sí.
DAVIN: Atoi?
ESTUDIANTE: [inaudible].
DAVIN: OK, voy hacerlo en el tablero.
¿Usted tiene una preferencia si lo hago aquí o allá?
Allí, Gabe dice allí.
>> ROB: Y esto es pensamientos generales sobre estas cuestiones de codificación.
Trate de escribir algo.
No lo deje en blanco.
>> DAVIN: Sí.
ROB: Si usted puede conseguir el volver tipo correcto,
o tal vez podríamos darle a usted, pero si se puede, al igual que,
escribir la función general de la firma, Si usted puede conseguir los casos base correcta,
o casos de esquina, o recordando cheque por nula,
siempre y cuando usted tiene un poco de cosas, entonces tal vez
le puede dar un par puntos para el problema.
No se limite a dejar en blanco.
>> DAVIN: Sí, y si son sólo completamente
perplejo en cómo en realidad convertirse en código.
Si usted escribe pseudocódigo, eso es bastante bueno también.
Así es como, es una cuestión de seis puntos, y escribir el pseudocódigo correcta,
que obtendrá al menos dos puntos.
Así que no sólo dejarlos en blanco.
Trate de poner algo.
>> ROB: Tiene que ser el pseudocódigo correcta, sin embargo.
>> DAVIN: Sí.
ROB: Así que son por lo general son menos indulgente con los errores en pseudocódigo.
DAVIN: OK, así que ustedes querido ver atoi.
Aceptar, por lo que sólo realmente-- así que lo que quiere hacer
es que usted va a estar dado algún tipo de número.
Pero este número no es va a ser un int, ¿verdad?
¿Qué va a ser?
>> ESTUDIANTE: [inaudible].
>> DAVIN: Va a ser una cadena, ¿no?
Así que si le dieron un string-- vamos a decir--
>> ROB: ¿Debo levantar un editor?
Puedo tirar up--
>> DAVIN: Oh, usted quiere hacerlo en--
>> ROB: ¿Prefiere la junta?
>> DAVIN: ¿Qué quieres hacer?
Quiero decir, ¿quieres hacerlo a mano?
¿O es que quiere hacerlo por computadora?
>> ROB: hacerlo a mano.
>> DAVIN: [Risas]
ROB: hacerlo a mano.
>> DAVIN: OK, así que va a ser atoi.
Entonces, ¿qué es it-- Quiero decir, vamos a probablemente te diera esto.
Pero lo que te va a volver?
>> ESTUDIANTE: Int.
>> DAVIN: Se va a volver int, ¿verdad?
Así que-- Yo no quiero hacerlo allí.
Voy a hacer aquí.
>> ROB: Usted puede tirar de él hacia abajo y luego empuje hacia arriba en él.
>> DAVIN: sí.
[Risas] El cambio de juego.
OK, así que va a ser int atoi, y ¿cómo se va a tomar?
Una estrella de carbón, por lo que sólo una cadena, estrella s, al igual que.
>> ROB: Estrella agradable, agradable.
DAVIN: Esto podría no estar allí, en Aceptar.
ROB: Sí.
DAVIN: OK, así que la primera cosa que quiere hacer-- I
no sé si alguien miró en la práctica solutions--
pero lo que vas a querer hacer es que eres
va a querer tener un bucle, porque eres
va a querer en realidad paso a través de esta cadena.
Así helpful-- así que digamos vamos a un bucle for,
y vamos al paso a través de cada elemento de la cadena.
¿Por cuánto tiempo es eso?
¿Cuántas veces vamos para recorrer en ese bucle for?
ESTUDIANTE: Sterln?
DAVIN: Sterln, sí.
Así que digamos que es igual a la longitud int sterln s.
Y sólo curiosidad, ¿por qué es siempre amable de mejor hacer esto fuera de los bucles?
Al igual que, ¿por qué es mejor llamar esta función fuera de un bucle?
Sólo comprobar una cordura rápida?
¿Sí?
ESTUDIANTE: ¿Así que usted no lo hace tiene que mantener el control de la misma.
Usted puede simplemente [inaudible].
>> DAVIN: Exactamente, así que sí, exactamente lo que dijo.
Así que no tenemos que mantener el control de la misma.
Así, por ejemplo, si yo estoy llamando esta función dentro de un bucle,
entonces voy a seguir llamando esta función varias veces.
Y eso va a disminuir la eficacia de su programa.
Así que es siempre útil para declarar fuera.
>> ROB: Eso se dijo, en alguno de estos problemas,
más o menos el tiempo que se obtiene una solución de trabajo, se obtiene el crédito completo.
Así que no se preocupe si su diseño es absolutamente terrible.
Podría hacernos malestar la lectura de su código.
Pero siempre y cuando funciona, obtendrá los puntos.
>> DAVIN: Sí.
Aceptar, por lo que a continuación voy a declarar alguna variable.
Es sólo va a llamar a int suma.
Y yo voy a establecer este igual a cero, al igual que.
Y eso es sólo ir ser un marcador de posición.
Así que va a ser lo que voy a volver.
Así que me voy a la larga devolver la suma de este programa.
Así que tengo estas dos variables.
Tengo longitud.
Tengo suma.
Y ahora vamos a saltar en nuestra cadena.
>> Así que vamos a tener nuestro bucle for.
Así cuatro int I es igual a 0 w, mientras I es menor que la longitud I más ventaja.
Y ahora--
ROB: Niza.
DAVIN: OK, y ahora aquí viene la carne de nuestro código.
Así que en realidad se puede hacer Esto, básicamente, en una sola línea.
Así que ¿Alguien tiene una idea de lo que vamos a hacer a continuación?
OK, así que eso está bien.
Así que estamos haciendo para decir suma equals-- déjame Scoot esta suma over--
es igual a la suma de 10 plus-- que estamos Va a tomar s yo menos uno
cita una cita 0 hace, así.
ROB: Muy intuitivo.
>> DAVIN: lo aplastó.
OK, así que alguien-- lo tengo, lo tengo.
OK, así que esto va claramente hacia arriba.
¿Qué quiere decir esto?
Así que ¿alguien sabe lo que esto significa?
¿Todos pueden ver esto?
No, nadie puede ver esto, en Aceptar.
Voy a--
>> ROB: Voy a escribir la fórmula justo aquí.
DAVIN: OK, Rob va a hacerlo en el equipo, lo cual es divertido.
ROB: Oh mi Dios.
¿O no lo haré.
DAVIN: En espera.
ESTUDIANTE: Tengo una pregunta.
DAVIN: Sí, claro.
ESTUDIANTE: [inaudible]?
DAVIN: OK, por lo que en realidad, como, simplemente, en general,
si usted fuera a poner, como, en esta declaración int
I es igual a la longitud 0 comas iguales sterln, que--
>> ESTUDIANTE: [inaudible].
>> DAVIN: Eso está bien, porque que-
ESTUDIANTE: ¿Por qué usted incluso que tenga que utilizar la longitud?
¿Por qué no podía simplemente [inaudible] sterln s, al igual que todo el tiempo [inaudible]?
>> DAVIN: ¿Quieres decir aquí?
>> ESTUDIANTE: Sí.
DAVIN: Porque cada este tiempo para tiradas de bucle,
que va a evaluar esta afección.
ESTUDIANTE: Derecho.
DAVIN: Y si usted tiene sterln allí, entonces es
va a tener que llamar a realidad esa función cada vez.
Así que en lugar de simplemente comparándolo con un int,
usted va a estar llamando a un función y luego comparándolo
para el valor de retorno.
Sí, por lo que es justo, sí.
>> Niza, OK, por lo que ahora todo el mundo puede verlo.
¿Qué does-- esto es como, eso es todo.
Este es el atasco, aquí mismo.
Qué significa eso?
¿Qué estoy haciendo?
Sí, una idea?
¿Sí?
>> Estudiante: Bueno, por lo que cuando usted está entrando en una matriz,
te vas a ir de izquierda a derecha,
por lo que vamos a ir en decimal de abajo de la [inaudible].
DAVIN: Exactamente.
ESTUDIANTE: Así que cada uno hay que multiplicar
lo que vio como el valor de la int por el tiempo se llega a mover que más de una.
>> DAVIN: Perfecto, perfecto, así por ejemplo, vamos a
digo yo di usted-- estoy va a escribir por aquí.
No, no lo soy.
Voy a escribir aquí.
Digamos que te di 76, ¿no?
Digamos que yo te doy 76.
Eso es una cadena, para empezar, ¿de acuerdo?
>> Así que la longitud es qué?
2, ¿verdad?
Suma es 0.
Entonces nos lanzamos en nuestro bucle for.
Bien, la primera iteración de esto, ¿qué va a ser?
Va a ser la suma es 0.
Así que resumir veces 10 0.
Eso es de sentido.
Entonces, ¿qué hace esto?
ESTUDIANTE: [inaudible].
>> DAVIN: Se va a convertir ese carácter en un entero, ¿no?
Es un poco como con su problema definido-- este luz--
que es algo así como con problema ajustado a Visioneer.
Usted está tratando con valores ASCII.
Así que si te doy, como, un siete, pero es un personaje,
y usted quiere saber, Aceptar, lo dígitos es eso?
Sí, usted podría, sí.
Entonces, ¿qué dígito es eso?
Usted podría restar 0 de él, pero que restar 0, el carácter.
>> Y donde algunas personas conseguir disparado hacia arriba, son
como, OK, bueno, tengo que saber los valores ASCII de este concurso?
No, definitivamente no lo hace Necesitamos saber el ASCII
valores de, al igual que, en minúsculas una, mayúsculas A, cero.
>> ROB: No hay ninguna razón para nunca poner esto en la hoja de trucos.
>> DAVIN: Definitivamente no hacer pierda su espacio con este.
Puede literally-- solo lugar de decir 48, como hasta
allí, que es equivalente a diciendo uno, un apóstrofe,
así, exactamente lo mismo.
>> ROB: Usted podría casi pensar en ella como si: Dios, necesito mi,
oops-- casi se podía pensar en ello como si tuviéramos algo así de hash
definir 0 como 48.
Eso no funcionará.
Pero pensar en ello como única cita 0 comilla simple, y para todos los personajes.
Piense en ello como una constante que representa que el valor ASCII.
>> DAVIN: Sí.
Aceptar, por lo que la primera vez a través de, por lo 76-- con lo que la primera vez a través de,
esto es sólo el carácter 7 menos el carácter 0,
y esos son siete integers-- bien, los
son siete espacios de distancia de cada otra en la tabla ASCII o lo que sea.
Así que va a devolver un int de 7.
Así que ahora, suma igual a 7.
>> OK, bueno, vamos a saltar en este bucle de nuevo.
Bien, ahora que es suma 10 veces.
Así que usted es efectivamente mover el 7 a la izquierda.
¿Eso tiene sentido?
Usted es efectiva mover hacia la izquierda.
>> Y entonces usted add-- este va a ser menos 6 0.
Eso es 6.
Así que va a ser el 70 más 6.
76, que es su número.
Así que, independientemente de lo que el número Yo te di, es lentamente justo
va a cambiar los valores más grandes a la izquierda, 1 factor de 10
cada vez en el bucle for, y luego añadir según sea necesario.
>> En la parte de atrás?
ESTUDIANTE: No tenemos que hacer ninguna comprobación en el programa?
>> ROB: Así que en cuanto a la comprobación va para el programa,
nos dirá bastante mucho lo que hay que comprobar.
Si no le decimos a usted nada, entonces generalmente
asumir que usted tiene que comprobar la mayoría de las cosas.
Al igual que usted puede ser que, sólo para estar seguro, probablemente debería comprobar bueno, es s nula?
Entonces tengo ni idea de lo que volver.
Pero nos dirá este tipo de cosas.
0, no lo sé.
>> DAVIN: Y ¿por qué querrías para volver a comprobar si s es igual a nula?
ESTUDIANTE: [inaudible].
DAVIN: Debido estrellas Char.
Es un puntero.
Así que un perfectamente aceptable declaración, yo podría decir, OK,
s es igual a un valor nulo, porque podría ser un puntero a null.
Así que cuando usted tiene punteros en su camino en como este,
probablemente debería comprobar.
Porque si usted no marca que, y a continuación, a continuación, entra en tu bucle for,
y que estés doing-- scoot abajo.
Scoot hacia abajo.
>> ROB: Lo siento, eso es todo.
>> DAVIN: Y así, al igual que, si es nulo, y entonces usted
hacer esto, ¿qué error vas a conseguir?
ESTUDIANTE: ¿Vas obtener un fallo conjunto.
DAVIN: Vas a establecer criticar, derecho, porque eres
tratando de índice en nulo.
Así que vamos a tratar de índice en la memoria que usted no posee.
Así que este, si esto es nulo, y usted hace esto, usted ciclo.
>> ROB: Yo también creo en el examen en el que pedimos a esta pregunta, te contamos
que sólo puede asumir que es un número positivo.
Debido a que también se espera atoi para manejar números negativos,
por lo que tendría que caso especial.
Hey, es el primer personaje un guión, en cuyo caso, OK,
ahora es un entero negativo.
Le diremos que este tipo de cosas.
Le diremos lo que usted necesita para manejar.
DAVIN: Sí.
Así que estoy seguro de que algunas personas podrían tener-- si usted comenzó a mirar a los exámenes viejos,
Usted ha visto sterln.
Eso es muy popular.
Y creo que en sterln, había que hacer este cheque por nulo, el retorno
0 o algo por el estilo.
Al igual, había que comprobar si hay nula.
Y si no lo hizo, que fue el punto de descuento en el cuestionario.
Así que de todos modos, lo hace todo el mundo sentirse bien con atoi?
¿Alguien quiere repasar las piezas de nuevo?
ROB: Ah, sí, creo que nosotros también decimos que
puede asumir que todo lo que es-- en realidad están introduciendo un número,
que usted no tiene que preocuparse, como, cartas estar en la cadena, de modo.
DAVIN: Sí.
¿Sí?
ESTUDIANTE: ¿Puedes ir más de una vez más cuando
utiliza comillas dobles y comillas simples?
>> DAVIN: Claro, por lo que entre comillas dobles, muy simplemente, es entre comillas dobles son cadenas.
Así que si usted dobla cotización nada, eso es una cadena.
Así, al igual que, si tuviera este 0 por aquí, y me hizo esto, esto es una cadena.
Eso ya no es un personaje.
Así que no puedo encontrar este valor en mi ASCII carta, porque es una cadena, sí.
>> Aceptar, alguna otra pregunta?
¿Sí?
>> ESTUDIANTE: ¿Así que tienes ya respondido a esta,
pero al igual que, cuando estamos en realidad escribiendo esto en el cuestionario,
Qué quieres que escribamos con barras inclinadas ceros [inaudible]?
DAVIN: No.
La cuestión era que debería poner una raya vertical a través de los ceros
para indicar si son ceros?
No, nosotros lo averiguaremos.
Sí, gracias, que son buenos.
Bien, todo lo demás?
¿Quiere alguien a-- así que creo nos hemos quedado un poco en el tiempo.
¿Quieres ver otra, o?
ESTUDIANTE: randomInt.
>> DAVIN: randomInt, OK, exactamente.
Así que vamos a hacer randomInt.
Lo voy a hacer por aquí.
Así randomInt es en realidad mucho más simple.
Creo atoi es probablemente el más difícil que hemos pedido en los años anteriores.
ESTUDIANTE: [inaudible].
>> DAVIN: ¿Qué?
ROB: Estoy viendo si es una especie de ver desde aquí.
DAVIN: ¿Lo es?
ROB: No creo que sea going-- Creo que va a correr a la derecha.
DAVIN: OK, así que voy a hacer esto.
Y entonces usted acaba de poner en la pantalla.
>> ROB: Muy bien.
>> DAVIN: ¿Quieres ser mi escribano?
>> ROB: Sí.
>> DAVIN: Niza.
Bien, puedo borrar esto?
>> ESTUDIANTE: Sí.
>> DAVIN: Eso es muy duro.
(CANTO) Lo estás haciendo lo que estás haciendo.
Y hacer lo que no lo hace.
Bien.
>> Bien, si no recuerdo mal, en el concurso de la randomInt era como,
OK, yo te voy a dar dos números, como un un y un b.
Y quiero que me des un RandomInt entre esos números.
Así randomInt va tomar dos numbers--
así RandomInt-- y es va a devolver un int.
>> Así que ¿cuál es el valor de retorno?
Me acabo de decir.
Int, ¿verdad?
Al igual que este, y entonces es va a tomar dos enteros.
Así que va a tomar int y un int b, así.
Entonces, ¿qué es randomInt vamos a hacer es que va
volver algún valor aleatorio entre estos dos valores.
Así que va a ser mayor que a, menor que b.
Así que creo que, probablemente, se puede asumir que a es el menor de los dos valores.
Así que si estamos tratando con aleatoriedad, lo que la función
hemos visto que nos da las cosas al azar?
ESTUDIANTE: Drand.
DAVIN: Drand, exactamente.
Así que vas a probablemente desee utilizar su Drand.
Así que usted puede decir int azar, y vamos a sólo decir que es igual a 0 en este momento.
Y están que van a decir, Aceptar, iguales al azar Drand 48.
¿Y qué hace volver esto?
¿Qué hace esta función le dará?
>> ESTUDIANTE: Entre 0 y 1.
>> DAVIN: Sí, entre 0 y 1.
Así que va a ser:
>> ROB: Y esto es-- Creo nos gustaría decirte esto.
Al igual, puede utilizar Drand 48.
Usted puede verificar esto en el examen pasado.
Pero es probable que dirías puede utilizar Drand 48, que
devuelve un flotador entre 0 y 1.
>> DAVIN: Sí, sí, estoy bastante seguro de que en el examen
que usted dice, probablemente desee utilizar Drand, sí.
Así que va a volver algún valor entre 0 y 1.
Y entonces, ¿qué es usted va a querer hacerlo?
Bueno, usted quiere multiplicar por-- espero, creo que es así, lo siento.
Voy a hacer esto.
No lo sé.
>> Así que B menos una.
Entonces, ¿por b menos una?
Así que digamos que Drand le da la espalda Aceptar un int--, sólo voy a hacer el resto,
de modo más una.
Entonces, ¿qué does-- y es B menos una.
Así que digamos que Drand le da la espalda el valor máximo que podía, posiblemente,
darle.
¿Qué es eso va a ser?
ESTUDIANTE: 1.
>> DAVIN: 1, ¿no?
Así que si esto es 1, y ya está multiplicándolo por b menos una,
Bueno, eso es sólo el diferencia entre menos A.
Y si a continuación, agrega que de nuevo en una, eso es lo que?
Se trata básicamente de b.
¿Eso tiene sentido?
>> ESTUDIANTE: Sí.
>> DAVIN: Así que si este es el máximo valoran que podría ser,
que va a ser 1.
Y entonces esto es sólo el diferencia entre los dos.
Añadir a una, por lo que este es va a regresar al azar.
Y en el caso de que la esquina Drand te devuelve 1,
al azar sólo será efectivamente ser b.
Pero ese es el máximo que puede ser.
Así que si va a ser inferior a que, por lo que vamos a decir que es como 0.9,
por lo que a continuación, 0,9 veces menos b una va a ser menos
que la diferencia entre b, menos una.
>> Y a continuación, si se agrega que a una, entonces ese valor es
va a ser mayor que una, porque va a añadir algo sobre ella,
pero va a ser menor que b.
Así que vas a conseguir un azar número, porque estás llamando Drand.
Y eso rand, ese número es aleatorio va a ser en algún lugar entre un
y b.
¿Eso tiene sentido?
>> ROB: Sólo para poner en números concretos, por lo
digamos que queremos recoger una número aleatorio entre 7 y 10.
Así que B menos una es nuestra gama.
Así que hay una gama de tres números que quieren elegir.
Y luego multiplicando que entre 0 y 1 1,
si eso entonces nos da some-- digamos que nos da 1.5.
>> Luego 1.5, queremos pasar de 7 a 10.
Así que 1.5 más 7 nos lleva de nuevo en nuestra gama de 7 a 10.
Y entonces estamos almacenarlo dentro de un número entero, por lo que trunca a 8.
Y entonces nos volvemos eso.
Así que B menos una es nuestra gama.
una se desplaza hacia arriba en los números que queremos que dentro de ese rango.
Así que entre el 7 y el 10, y luego nos puede devolver lo que terminamos con.
>> DAVIN: Sí, muy bien.
>> ROB: Gracias.
>> DAVIN: Sí, ¿qué pasa?
>> ESTUDIANTE: ¿Corremos a cualquier tipo de Errores ASCII cuando we're-- si es Drand
devolver un flotador [inaudible].
>> ROB: Así como dijo Rob, debido al azar no es un int,
así Drand será un flotador.
Así que a continuación, se multiplica a cabo.
Y usted puede ser que consiga un poco de tipo de números de coma flotante.
Y luego se va a truncar.
>> ESTUDIANTE: OK.
DAVIN: Sí.
ROB: ¿Y si el compilador fueron para advertir usted acerca de, como, pérdida de precisión,
simplemente tirado en un int allí, y entonces es bueno.
DAVIN: Sí?
>> ESTUDIANTE: ¿Tendría la misma probabilidad de obtener,
como, b o un [inaudible]?
>> ROB: Así que estoy realmente es-- wondering-- es randomInt supone
ser un número de una a menos de b?
Al igual que, si es entre 7 y 10, ¿cuáles son las posibilidades?
7, 8, y 9, o 7, 8, 9, 10?
DAVIN: me olvide.
En la definido-- problema
>> ROB: Yo creo que es 7, 8, 9.
>> DAVIN: Dice específicamente de uno inclusiva y uno de exclusiva.
>> ROB: Sí.
>> DAVIN: Pero yo no-- Estoy no--
>> ROB: Así que creo que estos es no está incluido, en cuyo caso,
hay un igual probabilidad de 7, 8, y 9.
No hay probabilidad de 10.
DAVIN: Sí?
ESTUDIANTE: Tengo una pregunta.
Queremos definir una función devuelve no un valor, sino una matriz.
Entonces ¿cuál sería el sintaxis después de regresar?
>> DAVIN: OK, por lo que entonces usted would-- después del regreso?
Así que digamos que usted había declarado una matriz en algún lugar allá arriba.
Entonces usted acaba de regresar el nombre de la matriz.
>> ESTUDIANTE: OK, gracias.
A continuación, sólo volver con A--
DAVIN: Oh, espera, lo siento.
La cuestión era cómo Cómo se devuelve un array.
>> ROB: A pesar de que no podía ser un array declarado
en la pila ni nada de eso.
Tendría que ser algo malloced, porque malloc
es la forma de moverse asignación de memoria automática.
>> DAVIN: Sí.
ROB: ¿Cómo se obtiene alrededor de ámbito local.
>> DAVIN: Pero lo haría simplemente devolver su nombre--
>> ESTUDIANTE: [inaudible] no es uno valor, por ejemplo, dos números, por lo
[Inaudible].
>> DAVIN: Usted no puede regresar número múltiple.
No se puede, como, return--
>> ESTUDIANTE: Hablé de regresar una matriz o algo por el estilo.
>> DAVIN: Sí, así que la pregunta es puedo devolver múltiples valores.
No puedes devolver múltiples valores.
No se puede, como, a continuación, devolver un b volver o algo por el estilo.
Porque después de que regrese, que volverán de la función.
Y entonces la función se lleva a cabo, y como Rob dijo, está en la pila.
>> Así que todo lo que la memoria sólo se pone devuelto a la computadora.
Todo se olvida, básicamente.
Así que si desea volver múltiple valores, que tienen que devolver una matriz,
Y la forma de hacer que es mallocing.
Y entonces te volverías x el estilo.
Básicamente, sólo devuelve el nombre.
Y cuando regrese algo como esto, usted es
en realidad no devolver el valor.
>> Así que digamos que usted almacenó los valores en una matriz.
Usted no es en realidad devolver esos valores.
Al igual que, si volviese un int, estoy realmente devolver las copias de los valores.
Pero si tuviera que volver algo como esto,
Me estoy volviendo una referencia a esos valores.
Así que me estoy volviendo, básicamente, un dirección de memoria a los valores.
¿Eso tiene sentido?
ESTUDIANTE: Sí.
DAVIN: Niza.
¿Sí?
>> ESTUDIANTE: Cuando estás utilizando Drand por aquí,
Qué tienes que poner srand antes de eso?
>> DAVIN: No, no, yo no lo creo.
>> ROB: Sí, así que tienes a decir nada sobre srand?
El valor por defecto de ustedes nunca diciendo srand en absoluto es sólo hacer srand de null.
Así Drand sobre su propio trabajo voluntad.
Y será automáticamente con semillas la hora actual, es lo que se utiliza.
DAVIN: Sí?
ESTUDIANTE: ¿Te [inaudible] con los números?
DAVIN: Sí, se puede.
ESTUDIANTE: ¿Así que podría decir, como, 4 veces 2.
La cosa es que usted no puede asumir a continuación, un int es de cuatro bytes.
El only--
>> DAVIN: Quiero decir, para la prueba que pueda.
[Risas]
>> ROB: Mm, no.
DAVIN: Sí, sí se puede.
Si te preguntan qué tan grande es un int, no puede ser, como, cuatro u ocho.
ROB: Oh, así que si la pregunta es específicamente,
como, si es un problema de codificación, usted debe decir el tamaño de int.
Si se trata de una tabla, o que dice cuántos bytes,
usted no debe rellenar el tamaño de enteros.
>> ESTUDIANTES: [Risas]
>> DAVIN: Correcto, entonces ¿por qué es tamaño de int importante aquí?
Así como, si vamos a 32 bits procesador o algo por el estilo,
entonces va a ser de cuatro bytes.
Pero en algunos de los más nuevos cosas, podría ser qué?
Podría ser de ocho, ¿no?
Así esto-- si sólo dura código de cuatro, a continuación, en algunas máquinas, funcionará.
Algunas máquinas, no va a funcionar.
Pero si en el cuestionario que estamos como qué tan grande es un int?
Ponga cuatro.
ROB: Derecho.
DAVIN: ¿Sí?
ESTUDIANTE: ¿Entonces porque estamos declarando [Inaudible] dentro de una función,
debemos poner 3 dentro de esa función?
¿O podemos usar fuera?
DAVIN: Usted puede usarlo fuera de esa función.
Así que él está pidiendo de forma gratuita.
>> ESTUDIANTE: perder la pista de donde [inaudible].
>> ROB: Oh, la libre no happen-- eso es parte de la magia de malloc
es que usted no está restringido a ámbito local.
Usted tiene el control total sobre tiempo durante el que las variables viven.
Así que llamamos malloc aquí, podría ser una función completamente separados.
Podría ser de 10 horas más tarde que finalmente llamamos gratis.
>> DAVIN: Así, por ejemplo, al igual que, un par semanas a partir de ahora cuando finalmente
hacer su corrector ortográfico diccionario conjuntos de procesadores, vas
tener alguna función que crea toneladas de nodos.
Así que usted está mallocing toneladas de nodos en esta función.
Y más tarde en una función separada, eres
va a querer liberar a todos los nodos.
Así que usted puede, literalmente, sólo tiene que pasar a liberar un puntero, por lo que una dirección de memoria
a lo que malloced.
Y eso va a estar bien.
Usted no tiene que liberar, como, en la misma función.
¿Sí?
>> ESTUDIANTE: Así que un malloc variable [inaudible] afuera?
¿Es eso lo que estás diciendo?
DAVIN: Espere, decir eso?
Lo siento.
>> ESTUDIANTE: Si una variable malloc puede ser libre en cualquier parte del código,
entonces pueden ser accedidos en cualquier lugar en el código?
¿Puedes mantener local?
>> DAVIN: Oh, ella le preguntó: como, la variable, como--
>> ROB: Así que usted todavía necesita tener algún tipo de referencia
al bloque de la malloc de la memoria.
Así que aquí, estamos volviendo x.
ESTUDIANTE: Oh.
ROB: Si no nos volvemos x aquí, y esto fuera sólo vacío,
entonces no tendríamos acceso a el puntero que se malloced,
y se filtró la memoria.
>> ESTUDIANTE: OK.
>> DAVIN: Así como, digamos que usted tener presente, al igual que, aquí mismo.
ROB: No.
DAVIN: En mi función principal, no puedo simplemente llame a este X y ser, como, OK,
en esta función, lo hice.
>> ROB: Derecho.
>> DAVIN: Así que voy a llamar en x, como, principal o algo por el estilo.
Usted no puede hacer eso.
Usted va a devolver algo.
Pero, ¿qué vas a volver?
Usted va a devolver una dirección de memoria.
Y debido a que regrese una memoria dirección, que se puede acceder en otra parte.
¿Alguna pregunta más?
¿Sí?
>> ESTUDIANTE: ¿Es la función anterior siendo de verificación de [inaudible]?
>> DAVIN: ¿Por qué yo no necesito hacer eso?
ESTUDIANTE: [inaudible].
DAVIN: Porque eres no mallocing nada.
Así que ha no-- sí, es no como una cadena s.
Es un puntero a alguna parte.
Estos son sólo valores.
ESTUDIANTE: OK.
DAVIN: Sí.
Algo más?
ROB: Sí?
ESTUDIANTE: Pero cuando usted [inaudible]?
>> ROB: Así que con el fin de liberar a la memoria, diríamos aquí.
Así que x es nuestro puntero a el bloque de memoria.
Nos liberamos ese puntero.
Y nosotros no necesariamente hacerlo aquí.
Podemos hacerlo en cualquier lugar.
Pero sólo llamar gratis en algo que malloc regresa.
Así malloc, aquí, devuelto lo que se está almacenando en x.
Por lo que podemos llamar gratis en x.
Alguna última pregunta?
>> DAVIN: Alguna última pregunta?
¿Sí?
>> ESTUDIANTE: Lo sentimos, se puede volver a explicar por las que se liberará en allí?
¿Por qué [inaudible]?
>> DAVIN: Por aquí?
>> ESTUDIANTE: Sí, como justo después.
DAVIN: Probablemente No quiero una gratis aquí.
ROB: Es probable que no lo haría.
DAVIN: Sí, que este no haría nada.
Esto, como, crear memoria, hacer cosas a ella,
y luego inmediatamente olvidarse de él, sí.
>> ROB: Pero podríamos hacer, como, aquí por alguna razón.
Podríamos decir int estrella y es igual a return array.
Hacer algunas cosas con y, tal vez imprimir el contenido.
Y entonces, por fin, hemos terminado.
Podemos liberar y.
ESTUDIANTE: [inaudible].
DAVIN: ¿Debo desplácese hacia abajo?
Gracias.
ROB: Niza.
>> DAVIN: OK, eso es todo.
ROB: Muy bien, bueno.
Buena suerte.
>> DAVIN: Si tiene alguna pregunta, envíenos un correo electrónico.
Buena suerte.