>> COLUMNA 1: Hola a todos.
Imos comezar.
Creo que a xente aínda están indo ser filtrando.
Pero, en interese de tempo, para que poidamos obter vostedes aquí a tempo,
imos comezar.
Entón Benvido ao CS50 quiz 0 avaliación.
Para aqueles de vostedes que aínda non entendeu con todo, ten unha pregunta na Mércores.
Woo-hoo.
>> Se aínda non comezou a estudar aínda é non entenderon que isto existe aínda,
quizzes pasadas e toda a información sobre seu cuestionario están no cs50.net/quizzes.
Hai algunhas cousas moi boas por alí, quizzes últimos dos últimos 10
anos, así como información sobre este quiz e temas
que será cuberta.
Entón, imos comezar.
>> Entón vostedes deben lembrar, o primeiro día de clase David tiña esas lámpadas por diante.
Entón, basicamente, todo o que pasa baixo a capa dun ordenador é
feito en binario.
Binario significa o que soa como, 0 e 1 do.
Ten dous valores pode ser representada.
>> Así como o primeiro día de sección cando David acendeu unha luz
lámpada para representar en, ou 1, o noso equipo entende como binario 0 e
1 de, activado ou desactivado.
Nocións básicas de binario.
Cada lugar é representado na base de dous.
Entón engade 2 a 0 ao 1 a 2 por todo o camiño cara arriba.
>> Para calcular o binario é decimal, só tes que seguir esta ecuación
Tipo de cousas.
Se tes un 1 en calquera destes lugares, vostede multiplicala lo por todo o que
basea-lo está, engadir lo para arriba, e comeza a decimal.
Entón é así que contar a 5 en binario.
Así como o que estabamos facendo o último slide, isto é como se fose
representan de 1 a 5.
>> Do mesmo xeito, así como pode engadir e restar en decimal é base 10, ou
realmente algunha base, en pode engadir e restar en binario.
Exactamente o que pode esperar cando engadir os dous para arriba, se é igual a maior
que 1, leva a 1, facelo un 0, e facer a suma desta maneira, só
como sería de esperar con regulares decimal ou calquera outra base.
Legal.
>> Entón, como dixen antes, todo o que continúa baixo a capa do noso ordenador
faise en 0 e 1 do, ou binario.
Entón, como podemos expresar, por exemplo, letras ou números ou caracteres?
E a resposta a iso é ASCII.
>> ASCII é un mapeamento entre os caracteres que normalmente vemos no
Idioma inglés como a, B de, Cs, subliñado, trazos, e
algo así.
E mapea isto para un valor ASCII.
Un valor ASCII é só un número que pode ser entendido polo ordenador.
E, así como pode facer a adición e subtracción con números, pode facer
los con valores ASCII.
>> Polo tanto, neste exemplo, o que iso vai imprimir?
Si, por iso só un espazo B espazo espazo C D. Onde meu rato ir?
Teña en conta que pode definir un int a 65.
E cando imprime que utilizando por cento C, vai interpretar isto como un
carácter e imprimirá A.
>> Do mesmo xeito, pode declarar lo como un char.
E cando imprimir lo usando cento C, que vai interpretar isto como
por cento D. E, así como pode engadir un número, pode engadir personaxes son
Os valores ASCII, neste caso.
>> Entón, algo punteiro para todos.
5, como unha cadea, non en realidade, ser igual a 5.
Entón, como podemos converter o corda 5 ao enteiro 5?
Algunha idea?
Si.
>> Entón, se temos 5 como unha cadea, podemos restar 0.
E iso vai dar 5.
E do mesmo xeito, se temos 5 como un enteiro, engadir que para a secuencia 0.
E iso nos dá a corda 5.
Legal.
>> Agora, lembre de volta a ensinar un onde falamos algoritmos.
Entón, como é que imos realmente quere un ordenador para facer cousas interesantes?
Vostede sabe, só sumar e restar números e imprimir cousas fóra non é
que emocionante.
Normalmente, queremos que o noso ordenador para realizar algún tipo de algoritmo.
Algo un pouco máis complexa que só aritmética simple.
>> Un algoritmo é só un paso a paso conxunto de instrucións sobre como realizar
un certo task--
Así como unha receita.
Debe lembrar do primeiro día de clase onde David tiña nos contar un cuarto
de persoas e cantas persoas no cuarto.
Pode ser usado para conta unha por unha.
1, 2, 3, 4.
Neste caso, un algoritmo de tempo lineal.
>> Pero David introduciu un algoritmo para contar as persoas na sala
onde todo o mundo se levanta, di que o seu número a outra persoa, engadir que
número superior, e unha persoa se senta.
E repetir iso.
Isto é un tipo de algoritmo.
Podemos analizar unha forma eficiente algoritmo baséase no que é tempo de execución.
Pero imos falar un pouco máis sobre iso máis tarde.
>> Así, todos os algoritmos tamén pode ser escritos en pseudocódigo.
Pseudocódigo é só un inglés como sintaxe utilizada para representar
unha linguaxe de programación.
Por exemplo, se quixésemos pedir un usuario adiviñar o meu número favorito, nós
pode ter pseudocódigo como tal.
>> Acadar usuarios adiviñar.
Se o palpite está correcto, diga-lles son correctos, senón dicirlles
eles non están correctos.
Pseudocódigo e é unha forma de facilmente representando unha idea ou un algoritmo.
Entón agora podemos querer realmente escribir isto na linguaxe que o ordenador
pode comprender.
Entón, podemos escribir o noso pseudocódigo e interpretar que o código fonte.
>> Ata agora, o código fonte debe unirse para unha determinada sintaxe
unha linguaxe de programación.
E ata agora, na CS50, temos usado principalmente c.
Polo tanto, este pode ser o código fonte para c.
Posteriormente no curso, noite vén en contacto con outros programas
linguaxes como PHP.
Ou se aínda tomar outras clases, se pode facer Java, Python, ou mesmo OCML.
Pero na nosa linguaxe de programación C, que é como podemos escribir o código fonte
o algoritmo que pseudocódigo Eu só describe anteriormente.
>> Entón como é que o ordenador realmente entender iso?
Como dixen antes, iso só realmente entende ceros e uns.
Entón como é que comeza a partir da fonte código para algo que se pode
comprendidos?
Ben, nós temos algo chamado compilador.
>> Se se lembrar de volta na maior parte do seu Serie de exercicios, que tivo algún tipo de programa
escrito nun ficheiro de punto c.
E entón ten que escribir make.
Entón, o que é facer a facer?
>> Podes escribir make para compilar o seu programa porque someone--
quen escribiu o seu conxunto p; probablemente David--
creou un ficheiro de make.
E que di facer saber para realizar o seu compilador, chamado clang, que a vontade
logo compilar o código fonte para obxecto de código, que é ceros e uns
que o ordenador entende.
Pero un pouco máis tarde, iremos máis en profundidade sobre compiladores.
>> Entón lembro pset 0, onde-- si, Ten unha pregunta?
>> Audiencia: [inaudível]?
>> COLUMNA 1: Si.
Eu creo que realmente debe ser en liña.
Si.
>> Audiencia: É como o [inaudível]?
>> COLUMNA 1: Non é.
O son en cs50.net/quizzes.
>> Audiencia: quizzes Slash, barra de 2013, reducir 0, e só facer clic
quizzes 2013 e proba 0, revisar os diapositivas da sección.
>> COLUMNA 1: Si, por iso, se vostedes queren arrincala la e analiza-la no seu
propio ordenador, todo ben tamén.
Diga iso de novo.
>> Audiencia: [inaudível].
>> COLUMNA 1: Si, [inaudível] é a variable dummy.
Ah, si?
>> Audiencia: [inaudível]?
>> Palestra 1: Non, folgas non están no exame.
Sentímolo, a súa pregunta foi, foi folgas no exame.
E non é.
Entón pset 0, vostedes deben ter todo aplicado algo usando cero.
E aprendemos algunha programación básica bloques de construción que utilizan cero.
>> Entón, imos dar un ollo a algúns destes bloques de construción
que compoñen un programa.
O primeiro é a expresión booleana.
As expresións booleanas son queridos e 0s ou calquera cousa que ten
dous valores posibles.
Neste caso, certas ou falsas, activado ou desactivado, e si ou non.
Un exemplo de un método simple, moi sinxelo, programa que emprega un valor booleano
expresión aquí.
>> Entón, para expresións booleanas para ser útil, temos operadores booleanos.
Estes son os operadores que poden ser utilizados para comparar os valores determinados.
Entón, temos ou non e igual, menos ou igual a, ou maior que
igual a, e menos de ou superior.
Pero estes operadores non son moi útiles salvo que poidamos combina-los en
condicións.
>> Entón vostedes poden lembrar de cero e para a súa p define que
tiña condicións.
Son, esencialmente, como garfos a lóxica do seu programa que
executa consoante unha condición se responde.
Polo tanto, unha das condicións que tiñamos usado moitas veces neste curso é o
se, entón, se, e as condicións de outra persoa.
>> Aquí está un exemplo de como pode usar isto.
Alguén sabe a diferenza entre só usando if todos
o camiño versos if, else, se, e outra cousa combinada?
Si?
>> Audiencia: [inaudível].
>> COLUMNA 1: Exactamente.
Entón, se eu tivese se todo o camiño ata este forma, mesmo se esa condición retorna
realidade, aínda seguirá probar os dous seguintes.
Considerando que, cun-se máis, outra declaración, se o que retorna true,
os outros non son examinados.
Calquera dúbida sobre iso?
Legal.
>> Entón usa un else if-de outra persoa declaración, se sabe que só pode
ser un deses casos.
Entón, nós sabemos, se x é menor que 0, é definitivamente non será
maior que 0.
>> Logo, outro bloque de construción que aprendemos son loops.
Temos tres tipos de loops.
Para loops, while, e facer mentres loops.
E xeralmente, cando se senta para escribir algo, ten que decidir
cal dos tres quere usar.
Entón, como imos decidir cal deles?
>> Xeralmente usan un loop for, si sabemos cantas veces queremos facer unha iteración
por algo ou cantas veces queremos realizar unha tarefa.
Usamos loops while se necesitamos algunha condición para ser verdade para seguir correndo.
E usamos facer mentres moi semellante ao tempo, pero queremos que o noso código sexa executado en
polo menos unha vez.
>> Entón facer mentres, o que está no facer a vontade sempre executado polo menos unha vez.
Considerando que, co tempo, el pode non funcionar en todos, se o
condición non é satisfeita.
Calquera dúbida con isto?
>> Así, a estrutura dun loop for.
Vós xa deben ter visto iso.
Vostede inicializa-lo.
Ten algún tipo de condición.
Así, por exemplo, podemos arrincar como para i é igual a 0.
i é menos que 10.
E i ++.
Unha moi simples que nós fixemos.
>> Para un loop while, do mesmo xeito, ten ter algún tipo de arranque,
algún tipo de condición, e algún tipo de actualización.
Así, podemos aplicar o noso lazo for tamén como un loop while usando iso.
E do mesmo xeito con un loop Do While, poderiamos ter algunha arranque,
realizar algo, actualiza-lo e a continuación, comprobar a condición.
>> Entón agora funcións.
Poñemos todo xunto.
Podemos querer escribir algúns tipo de función.
Función comúns que pode Xa vimos é o principal.
Iniciar é unha función.
Ten un tipo de retorno, int.
Ten un nome de función, a principal.
E ten argumentos, argc e argv.
Entón principal é só unha función.
>> Outras funcións que podería usar, printf printf-- é un function--
GetInt, toupper.
Pero estes ocorrer de ser aplicado por nós
algún tipo de biblioteca.
Se vostedes lembran, incluíndo esta biblioteca ou a CS50.h
E / S estándar da biblioteca.
Si, cuestionar?
>> Audiencia: É principal só inherente c?
Será que só unha especie de [inaudível]?
>> COLUMNA 1: O tema é se principal é inherente en c.
E si, as funcións teñen unha función principal.
É unha especie de necesario para o ordenador para saber por onde comezar
execución do código.
>> Audiencia: Entón non vai [inaudível]?
>> COLUMNA 1: N º
Algunha pregunta?
Legal.
Entón, así como pode utilizar unha función que está escrito para ti, tamén se pode
escribir a súa propia función.
Esta é unha función que alguén pode Escribín para calcular o volume
de q, por exemplo.
Hai un tipo de retorno aquí, neste caso int, a nosa q nome da función e noso
lista de parámetros.
>> E teña en conta que ten que escribir os datos tipo do parámetro que quere
ou entón usar a función non fai saber que tipo de
parámetro que debe ser aceptada.
Entón, neste caso, queremos un número enteiro como o noso contribución.
Entón, por que poderiamos querer usar funcións?
>> Primeiro de todo, óptimo para organización.
Eles axudan a romper o seu código en anacos máis organizado e facer
máis fácil de ler.
Simplificación.
Isto é bo para o proxecto.
Cando estás lendo unha peza de código ea función principal é, en realidade,
moi longo, pode ser máis difícil de razoar sobre o que está pasando.
Entón, se división la en funcións, pode ser máis fácil de ler.
E reutiliza-capacidade.
Se ten unha peza de código que está a ser chamado ou executado varias veces,
no canto de ter que volver escribir este código 10 veces na súa función principal, que pode
quere reutiliza-lo.
E entón, cada vez que precisa para usá- peza de código, chamar a función.
>> Entón, agora, se nos lembrar de volta a cero, nós tamén falou sobre algúns conceptos,
unha das cales é unha rosca.
Tema é o concepto de múltiplo secuencias de código
executando á vez.
Entón, creo que volta a un día no que David tiña vostedes contaren o número de
persoas na sala.
>> En esencia, o que estaba a suceder é sobre todos vostedes foron
executando rutas separados.
E estes temas foron reunindo para obter algún tipo de resposta.
Do mesmo xeito, en perigo, cando ten varios sprites, pode
teño un gato e un can.
E eles serían simultaneamente executando os seus propios scripts.
Isto é un exemplo de segmentación.
>> E o outro concepto que foi foi introducido en cero eventos.
E os eventos cando varias partes do seu código de comunicarse uns cos outros.
En principio, esta foi cando usou o control da transmisión e da Cando
Recibir bloques.
>> E tamén, o Conxunto de problemas 4, vimos un pouco de eventos tamén.
Vostedes poderían usar a biblioteca Gevent.
E non era unha función waitForClick en que estaba esperando
para que o usuario prema.
E o seu clic, neste caso, sería o evento e esperar por click é o seu
manipulador de eventos.
>> E tamén, ao longo de realizar os seus Serie de exercicios e traballar en súas Serie de exercicios, ten
pode entrar en contacto con algúns destes comandos.
Isto é o que escribiu no seu fiestra de terminal ou o que quere que a fiestra
que aparece na súa edición para g, esencialmente, navegar no seu ordenador.
>> Así, por exemplo, LS lista o contido dun directorio.
Fai directorio crea un novo cartafol.
CD, cambie o directorio.
RM, eliminar, eliminar un ficheiro ou algún directorio.
E, a continuación, eliminar o directorio elimina un directorio.
>> Audiencia: [inaudível]?
>> COLUMNA 1: Si, con certeza.
Sentímolo, a pregunta era se suxiro poñer este
sobre a folla de fraude.
Podería axudar.
Se ten espazo, pode poñelas.
Tamén é só xeralmente bo o suficiente de lembrar, porque cando usalo
pode querer só ter memorizado.
Isto vai facer a súa vida moito máis fácil.
Será que eu responder a súa pregunta?
>> Entón, agora, nós falamos un pouco brevemente sobre bibliotecas.
Pero as dúas principais que fomos usando ata agora no curso son
estándar I / O e CS50.
Que tipo de cousas están incluídas na biblioteca estándar I / O?
>> Si, ata agora usamos printf.
En CS50, usan GetInt e GetString.
E a secuencia de tipo de datos tamén acontece sendo declarado nesta biblioteca CS50.
Imos falar un pouco máis en profundidade sobre como as bibliotecas funcionan e como
interactuar co resto do seu código.
Pero estas son as dúas principais que entrar en contacto coa medida en
o curso.
>> Tipos.
Estes son bos para lembrar o que cada tipo está representado por ou como
moitos bytes cada tipo de requires--
int, 4 bytes; char, un byte.
Float é de 4 bytes.
Que é unha parella?
>> Audiencia: [inaudível].
>> COLUMNA 1: É, polo tanto, un flotador pero o dobre do tamaño.
Que tal un tempo?
>> Audiencia: [inaudível].
>> COLUMNA 1: Aceptar.
¿Que é un tempo?
>> Audiencia: [inaudível].
>> COLUMNA 1: Si, o dobre dun int.
Si.
>> Audiencia: [inaudível].
>> COLUMNA 1: Long [inaudível].
E despois dun longo tempo é o dobre diso.
>> Audiencia: Non, non.
Unha longa é só un int.
Depende da arquitectura antes de que o [inaudível]
int e teñen o mesmo tamaño.
[Inaudível].
>> COLUMNA 1: Entón, un longo e un int son os mesmos.
E despois dun longo tempo é o dobre do int.
Legal.
E entón, cal é o último tipo?
>> Audiencia: Pointer.
>> COLUMNA 1: Si, por iso, aprendemos algo sobre punteiros.
E, independentemente do que un punteiro é apuntando para-- podería ser unha estrela de char
ou un int star--
sempre 4 bytes para un punteiro.
Preguntas sobre iso?
Si?
>> Audiencia: [inaudível]?
>> COLUMNA 1: Entón, un longo e un int son mesmo neste aparello CS50.
>> Audiencia: O aparello está completamente intercambiables.
>> COLUMNA 1: Yeah.
Entón, despois dun longo tempo é o dobre dun int.
>> Audiencia: Este é o 32 bits?
>> COLUMNA 1: 32 bits, si.
>> Audiencia: Entón, [inaudível]?
>> COLUMNA 1: Si, se iso non acontecer explicitamente dicir,
debe asumir algo 32.
>> Audiencia: El diría algo como asumindo un
Arquitectura como o aparello.
Para 64 bits, as únicas cousas que cambio son longos e punteiros.
Ambos [inaudível].
>> COLUMNA 1: Si?
>> Audiencia: Pregunta.
Así, nun das probas prácticos, el pregunta sobre un unsigned int.
Entón, como iso sería determinado dende un int [inaudível]?
>> COLUMNA 1: Un unsigned en tamén é 4 bytes.
Pero o que é diferente sobre a sinatura int e un unsigned int?
>> Audiencia: [inaudível].
>> COLUMNA 1: Certo.
Pódese representar os valores negativos.
Pero como facelo?
>> Audiencia: [inaudível].
>> COLUMNA 1: Si, el salva un bit para representar o sinal.
A sinatura ten algo que representa o sinal.
E non asinado só é todos os aspectos positivos.
>> Audiencia: Aceptar.
Entón di que o dúo é dúas veces o tamaño dun flotador?
>> COLUMNA 1: Dobre é dúas veces o tamaño dun flotador, si.
>> Audiencia: Como é que un punteiro para un longo [inaudível]?
>> COLUMNA 1: Entón a pregunta é como é que o punteiro para unha longa long--
como é que só catro bytes cando un longo seus 8 bytes.
Entón recorda que é un punteiro, esencialmente, polo valor moi base.
>> Audiencia: [inaudível].
>> COLUMNA 1: Si, entón un punteiro é só un lugar de memoria.
Por iso, non importa o que de espazo ese punteiro está apuntando.
El só precisa de 4 bytes para seguir de que a localización de memoria.
Algunha pregunta?
Legal.
>> Así, a última cousa que eu teño é a saída estándar.
Debe usalos miúdo abondo para que poida lembrar.
Pero iso é cando usamos printf, por exemplo.
E nós temos estes espazos reservados que foron chamados códigos de formato.
>> Entón por cento c char, i por cento a int, e tamén podemos utilizar por cento d.
É o mesmo.
Pero, en xeral, en que CS50 proba a usar por cento i.
Porcentaxe f para float.
Ld por cento por moito tempo e por cento sa cadea.
>> Do mesmo xeito, temos benvida a empregar algúns desas secuencias de escape.
Por exemplo, barra invertida n para nova liña.
Este é só para cando está formateo seu código para imprimir f.
Si?
>> Audiencia: Cal é a porcentaxe de d?
>> COLUMNA 1: Entón a pregunta é o que é por cento d a?
Porcentaxe d é a Ints.
Porcentaxe d e i por cento son os mesmos.
>> Audiencia: Cal é a diferenza entre barra invertida n e barra invertida r?
>> COLUMNA 1: Entón a pregunta é, cal é o diferenza entre o n e a folga
r reacción?
Creo barra invertida r é--
>> Audiencia: Entón barra invertida r só implica retorna ao comezo da liña
sen realmente ir a unha nova liña.
Entón, se imprimir unha barra invertida r e volver ao principio da liña
a continuación, imprimir máis cousas, sobrescribir o material que xa está no
[Inaudível].
Considerando que, en realidade, n vai a unha nova liña e vai ao [inaudível].
>> COLUMNA 1: Ben, algunha pregunta?
Todo correcto.
Vou entregalo a Dan, que vai continuar.
>> [Aplausos]
>> DAN: Todo ben.
Entón, eu vou estar falando doutro gran gama de ideas da clase que son
aproximadamente representante de dúas semanas e o inicio da terceira semana comezando
con fundición, que é só unha forma de tratamento dun valor dun determinado tipo, como
un valor de un tipo.
Así, podemos facelo con carácteres para Ints, Carrozas para Ints e
Longs longos para o dobre.
>> Todas estas cousas poden ser utilizadas como formas para o tratamento de algún valor numérico
menos de char como algún outro valor numérico.
Polo tanto, hai algunhas cuestións con este, de Por suposto, o que pasa cando xoga
cousas como boia para Ints.
Entón, iso é un pouco raro.
Temos un coche que é de 1,31.
Nós multiplicala lo por 10 mil.
E, entón, imprimir lo como un int.
Que esta saída?
10.000 veces 1,31.
Así 13000, que é a estimación?
>> Audiencia: Creo que é 10.000.
>> DAN: Entón, eu estou multiplicándose o por 10.000 antes de que eu estou lanzando-lo.
>> Audiencia: Oh.
Non habería un 9 e algúns números de 0?
>> DAN: Pode ter algúns díxitos estraños.
Tan seguro, que é 1,3 veces 10.000.
Entón é 13.000.
E este weird-- adicional
>> PÚBLICO: 13.100.
>> DAN: 13.100.
Grazas, Rob.
E este weirdness-- adicional
este 9,9--
é simplemente porque este reparto acabou redondeo onde
non debe ter.
Si.
>> Audiencia: O casting pasa tras algo máis?
>> DAN: Entón por que eu teño iso por escrito, que fai iso antes de multiplicación
fai casting.
>> Audiencia: [inaudível].
>> DAN: Creo que sería lanzado en primeiro lugar, si, o que sería 10.000.
Algo máis?
Legal.
Polo tanto, esta é 13.099.
Por que isto ocorre?
A imprecisión.
>> Coches alegóricos non son perfectos.
Eles só poden representar números a un número de algarismos significativos.
Entón, se nós imprimir 8 figos sig en este float, temos unha especie de
número mirando feo.
E iso é porque 1,31 non pode con precisión ser representados por simple
potencias de dous na máquina.
Por iso, acaba tendo o máis próximo creo que, o que acaba
ser un pouco baixa.
Ten sentido?
Está ben.
>> Agora cambiou son unha forma diferente de facendo declaracións condicionais no que todos os
que nos interesa é a única variable.
Polo tanto, neste exemplo concreto, estamos recibindo un número enteiro do usuario.
E entón, nós estamos mirando para o que este enteiro é.
Presuntamente, é o número entre un e catro.
Iso é o que estamos pedindo.
>> Entón fai un cambio de nome da variable.
A continuación, ten establece os casos de posible valores que podería ser.
Entón caso dun, digo que é baixa.
E entón rompe para saír da condición clave para que
non continuar.
>> Na seguinte caso--
así se dous e caso três--
de ser o caso dous só cae para a primeira liña de código que ve como coa
caso, tres, ata que ve unha pausa.
Polo tanto, a razón que comeza un caso para só impresión baixo é porque eu
ter esa pausa aquí.
Se eu, por exemplo, ignorou esta break-- se eu xoguei este breakaway--
sería imprimir baixa, e entón sería imprimir medio, e, a continuación, el ía romper.
>> Entón breaks son unha parte importante de cambiar as condicións e
eles deben estar alí.
Os casos que non sexan recoñecidos explicitamente son tratados polo estándar
caso no interruptor e debe ser lanzado.
>> Audiencia: So 1, 2, 3, e 4 serían n?
>> DAN: Os valores que n pode ser.
Si.
Si?
>> Audiencia: Entón, cando ten que [inaudível]?
>> DAN: Ía imprimir baixo, e logo sería imprimir medio, e
logo ía romper.
>> Audiencia: Por que ía imprimir medio que [inaudível]?
>> DAN: Entón, todo baixo un caso antes dunha pausa se enmarca.
Así, no caso dunha impresión é caso baixo un como a presente na secuencia de impresión.
Si?
>> Audiencia: [inaudível]?
>> DAN: Entón ese número é só unha especial valor que esta variable
pode tomar, non?
Será que isto ten sentido?
Si.
>> Audiencia: [inaudível]?
>> DAN: Si, se dous ía imprimir medio e, a continuación, romper.
>> Audiencia: [inaudível]?
>> DAN: Creo que calquera?
Que outros tipos de datos pode pasar?
>> Audiencia: Pode cambiar sobre calquera tipo de datos.
Pero iso só significa algo máis caracteres e Ints e cousas así, porque
se está migrando un punteiro que realmente non ten sentido,
conmutación de cargas, se aínda imos fai isto, por mor de punto flotante
en precisión, o que realmente non quero facelo de calquera maneira.
Entón, basicamente, só enteiros e caracteres e cousas así.
>> DAN: Si, é cando ten explícita valores que vostede sabe, eu creo, pode ser
que o cambio é realmente útil.
Boa?
Está ben.
>> O ámbito é o intervalo que a declarada variable estende.
Entón neste pequeno anaco de código que eu teño, sería cheo de erros.
E a razón é que declarei iso int i dentro do ámbito deste loop.
E entón eu estou tentando facer referencia que i fóra dese ámbito de loop.
>> Entón, basicamente, pode pensar sobre o alcance como calquera cousa que declarar
con dentro dun conxunto de chaves só existe dentro destas claves.
E se tentar usar esa variable fóra destas chaves, vostede
obter un erro do compilador.
Si?
>> Audiencia: Entón este non funciona?
>> DAN: Esta función non funciona, si.
Cordas.
Cadea a char *.
Son exactamente o mesmo.
Son só enlaces a caracteres.
E ningún carácter que debe rematar con barra invertida cero, que é só
unha convención c.
>> El é chamado o terminador nulo.
E NULL--
N maiúscula, capital de U, o capital L, o capital eu--
non é o mesmo que o Terminador NULL.
Este é un punteiro.
Este é un personaxe.
Son moi distintas.
Teña en conta que diso.
Será no cuestionario, probabelmente.
Eu non vin o cuestionario.
Si?
>> Audiencia: Entón NULL é, digamos, o punteiro?
>> DAN: Si.
>> Audiencia: Que [inaudível]?
>> DAN: Se, por exemplo, malloc chámase cando non ten memoria suficiente para obter
o tamaño que está pedindo, malloc volverá NULL.
É basicamente cando unha función é debe voltar un punteiro, ten
que comprobar contra NULL porque NULL é un bom-- moi
é, máis ou menos, o valor de lixo.
É un cero na medida en que os punteiros balde.
>> Sempre que chamar a unha función, que retorna un punteiro.
Vai querer comprobar-se Asegúrese de que este punteiro non é NULL
porque NULL é moi común.
É unha especie de retorno lixo.
Entón, se algo non vai ben, só retornan NULL no lugar.
>> Audiencia: [inaudível]?
>> DAN: Si, e iso é iso.
>> Audiencia: [inaudível]?
>> DAN: Spell-lo como esta.
É o terminador NULL.
É minúscula N-K-L-L se vostede deletrear-la.
>> Audiencia: E eu só fun atrás e probou.
E se tentar poñer un punto flotante valor nun switch, que vai berrar contigo
dicir, indicación require expresión do tipo enteiro.
>> DAN: Alí vai vostede.
Pero si, o que era a pregunta?
>> Audiencia: [inaudível]?
>> DAN: Entón o capital N, capital de U, o capital L, L maiúsculo é unha cousa real c.
É o punteiro nulo e só ser tratado como tal.
Vostede non vai deletrear o Carácter NULL para ver calquera
outra forma que non esta.
Si?
>> Audiencia: Entón Voltar a char max ou algo nas notas, sería
encarnan a mesma función como [inaudível]?
>> Audiencia: Entón está referíndose a retornando de char máximo de getchar, ou
sexa o que sexa?
>> Audiencia: Yeah.
>> Audiencia: Si, entón o xeneral prazo para todas esas cousas
son valores sentinela.
Así como volver int max de GetInt e Charlotte máximo de getchar, é
debería ser así, todo ben, se esas cousas están volvendo a nós,
algo deu mal.
>> Para punteiros, que só terá lugar a ter este valor de sentinela que todos
Acepta arriba.
E esta é a cousa que volver cando as cousas van mal.
Entón Char max é o que estamos a usar para representar algo
como NULL ou getchar.
>> Audiencia: Entón, se está probando getchar, podería só poñer NULL?
Tería que facer a diferenza?
>> DAN: Pode non só comprobar NULL.
Vostede tería que comprobar carácter máximo porque o valor de retorno da función é
un carácter non un punteiro.
Si?
>> Audiencia: Esta pregunta ao longo da corda.
Isto inclúe o carácter NULL?
>> DAN: N º
E iso é, en realidade, como lonxitude da corda sabe que deixar porque pasa por
seu conxunto de caracteres ata el ve un personaxe NULL.
E entón como é, todo ben, eu son feito.
>> Audiencia: [inaudível] cinco?
>> DAN: Ola sería cinco.
Yep.
Entón matrices son continuas bloques de memoria.
Teñen acceso instantáneo ao dicir que o nome da matriz e, a continuación, en crespos
tirantes, calquera que sexa índice que quere ir para, están indexados desde cero a
a lonxitude de matriz menos 1.
>> E eles están declarados polo tipo de cousa que está almacenando no
matriz, o nome da matriz, e entón calquera que sexa o tamaño é de que matriz.
Polo tanto, esta é unha matriz de caracteres seis que ten eses valores.
Si?
>> Audiencia: [inaudível]?
>> DAN: Yeah.
>> Audiencia: [inaudível]?
>> DAN: Se ten o que está a suceder para a matriz xa fixo.
Entón, pode especificar que no canto de, digamos, char, calquera que sexa o nome do seu
matriz é, corchetes baleiros igual crespos prepare-H comas por comas E L L coma por comas
O comas carácter NULL e chaveta.
Isto tamén funciona como unha declaración.
>> Audiencia: [inaudível]?
>> DAN: Entón tes que ter o tamaño xa feito.
>> Audiencia: [inaudível]?
>> DAN: Si.
Todo ben.
Argumentos da liña de comandos son unha forma de recibindo entrada do usuario como
argumentos para principal.
Iniciar ten dous argumentos.
Número de argumentos que está a ser pasou ao longo da liña de comandos e un
vector de cadeas ou unha matriz de cadea de todos os argumentos.
>> Entón, se eu, por exemplo, chamada de función, como un punto fóra un espazo, espazo 2, tres,
argc sería 4.
E o argv 0 sería un punto fóra.
Argv1 sería 1.
argv2 sería 2. argv3 sería 3, neste caso particular.
Si?
>> Audiencia: [inaudível]?
>> DAN: O último elemento do array porque a matriz é a lonxitude argc máis
un dos argb, o último elemento é o punteiro NULL.
É argc máis 1.
Así, no caso de que eu acaba de dicir, el sería argv 0 é un punto fóra.
argv 1 é 1, 2 é argv2 argv 3 é 3.
argv 4, que é unha grande argc que sería NULL.
>> E iso é o punteiro NULL.
Si.
E iso é porque cadea é unha estrela char é un punteiro.
Por iso, ten que ser do mesmo tipo.
Si?
>> Audiencia: Dúas preguntas.
Entón, un, cal é a diferenza entre isto e GetString outro que un tipo
no mecanismo de usuario?
E dous, é almacenado dentro súa memoria recente?
Así como, GetString faría ser [inaudível]?
>> DAN: Onde se garda?
Non sei onde está almacenado.
>> Audiencia: Entón, en realidade, xa sabe como calquera función que chamalo de argumentos
almacénanse na pila?
Entón argc e argv son argumentos ao main e están na pila, ou realmente
logo enriba o que pensa como o inicio da pila.
Cal era a outra parte de tema?
>> Audiencia: Entón, cal é o [inaudível]?
>> DAN: Si, é só unha forma diferente de obter a entrada do usuario.
Isto de algo máis eficiente e é máis útil para scripts porque
pode só pasar argumentos para o seu principal función, en vez de ter que esperar
para os usuarios, se non ten calquera usuarios.
>> Audiencia: E si, obter cordas sería [inaudível].
Sería almacenar o material que precisa.
>> DAN: Si?
>> Audiencia: [inaudível]?
>> DAN: Si, argv 0 inclúe sempre o dot barra de chamadas de función.
Si?
>> Audiencia: [inaudível]?
>> DAN: Si, cada un dos argumentos son rematou en carácter NULL porque
son cadeas.
>> Audiencia: [inaudível]?
>> DAN: Si, argv argc é un punteiro NULL.
>> Audiencia: [inaudível]?
>> DAN: Oh yeah.
Si, desculpe.
>> Audiencia: Entón, [inaudível]?
>> DAN: Entón a pregunta é se tivese o liña de comandos dot cortar un punto fóra 1, 2,
sería o número de liña de comandos argumentos ser dous ou sería tres?
>> Audiencia: Eu creo que iso non acontece realmente importa.
Costume dicir, oh, non pasou calquera argumentos de liña de ordes cando,
Obviamente, chamou a función.
Entón, eu tenden a eliminar vocalmente o función a partir da liña de comandos
argumentos, aínda que sexa incluídas na argv.
>> DAN: Pero se fose o test--
yeah-- e tamén se dixo algo argc como é igual a 3,
está en posición segura.
Si?
>> Audiencia: [inaudível]?
>> DAN: Coido que, se en vez de chamar ese en argc e argv cordas soportes
pero mantivo os mesmos tipos e só chama -lles algo diferente, como un
e b, será que aínda funciona?
E seguiría a traballar, vostede só--
en vez de usar argc-- pode usar a e b.
Si?
>> Audiencia: [inaudível]?
>> DAN: Entón a pregunta é GetString é indo para almacenar memoria no heap
porque GetString é char *.
El almacena a memoria na pila porque chama-se agora dentro da malloc real
implantación de GetString.
OK, seguindo adiante.
>> Seguridade.
Así, para ser verdadeiramente seguro, confía en ningún unha e non permitir o acceso a calquera
de información, polo que todo o mundo constrúe as súas propias máquinas,
seus propios sistemas operativos, todo o seu programas a partir de cero, e, obviamente,
non chamar a calquera outra máquina a través da internet.
Así, os ordenadores son inseguros.
Eles realmente son.
Temos que confiar en outras persoas.
>> E a idea de seguridade é que é tentativa de limitar a cantidade de
confianza que necesitas.
E un dos medios de facelo é a través de cifrado.
A criptografía é, esencialmente, temos segredos.
>> Ás veces temos que pasar nosos segredos Xunto con, digamos, a internet ou
outras cousas.
E nós non queremos que a xente coñecer eses segredos.
Entón, nós transferir nosos segredo para unha forma que esperamos que ninguén pode descubrir.
>> Entón, nós used--
a través do curso deste class--
cousas como cifra de César e [Inaudível], que son moi, moi
formas inseguras de cifrar as cousas.
Son fáciles de descubrir o que eles son e cales son os seus segredos son.
O mundo real usa moito máis esquemas de cifrado complicados.
E nós non imos entrar en moito máis que iso.
>> Debugging.
GDB é o mellor.
Vou mencionar de novo.
Use GDB o tempo xa que ten un problema.
As ordes que son útiles en GDB son romper, o que quere pasar unha liña
número, un nome de función, esencialmente onde o seu código queres parar,
e ser capaz de asumir o control.
>> Imprimir leva unha variable e imprime sexa alí o que é variable en que
momento da súa execución.
Logo move súa execución ao longo dunha única etapa.
E paso pasos dentro dunha función na súa execución.
>> Outras cousas están a funcionar, que é como realmente realizar o seu código.
Continúe toma todas as medidas necesarias para chegar ao seguinte punto de parada.
E hai moitos, moitos outros.
Procura-los.
Son óptimos.
Si?
>> Audiencia: [inaudível]?
>> DAN: Si, o que é un depurador.
Así, un depurador é un programa que permite depurar o programa.
Non é un programa que atopa erros para Vostede, con todo, que sería óptimo.
>> E para rematar, para min, é investigación.
Así, os tipos de investigación que falamos sobre esta clase son a investigación lineal,
que é exactamente iso que ollar a través de cada elemento do espazo de procura, un
elemento de cada vez, ata atopar o que está a buscar ou ata alcanzar
o final do seu espazo de procura no que apuntar-lle dicir que non podería atopar
o elemento que busca.
E isto leva tempo a mellor constante, que é de 1 0 e, no peor lineal
tempo, que é de 0 n.
>> Busca binaria, que debe elementos sórdidos.
Vai para o medio dos seus elementos, ver se o elemento que está a buscar
é maior ou menor que o elemento que está no medio.
El é máis grande, di que o fondo da súa investigación o espazo é seu
localización actual, o medio e reiniciar o proceso.
De ser menor, parece dicir o-- que si, o que foi?
>> Audiencia: [inaudível]?
>> DAN: Si.
Calquera tipo de especie que foi ensinado en a clase é un xogo xusto para a proba.
>> [Risas]
>> DAN: E o feito de non ter tido para facelo por un conxunto de problemas, é xusto
xogo para a proba.
>> Audiencia: Podemos pasar por iso como para--
>> DAN: Será ir máis.
>> COLUMNA 2: O código real para [Inaudível] é en study.cs50.net.
Entón, se ollar para o problema práctica na páxina merge sort de
study.cs50.net, existe o código para a posta en marcha de merge sort.
Entón non ten que aplicar it yourself esta noite.
Pero asegúrese de comprende-lo, en vez que só memorización.
>> Audiencia: [inaudível]?
>> COLUMNA 2: A páxina merge sort en study.cs50.net, non é unha práctica
problema que, se fai clic no problema, ao final hai unha
solución, que é a fusión implantación de clasificación.
Pero asegúrese de comprende-lo no canto de só lembra-la
ou copia-lo para abaixo.
>> Audiencia: E un perfectamente válido problema ao exame sería
algo así como aquí está unha lista.
Que esa lista queda despois un paso de seleccións de tipo ou de
tipo de inserción ou o que quere.
Unha iteración completa da lista.
Así, mesmo se non acabar precisando código para el, ten que entendelo lo
abondo para saber como vai sendo modificar esa matriz.
>> DAN: Isto é todo para min.
>> [Aplausos]
>> LUCAS: Hola a todos.
O meu nome é Lucas.
Vou falar recursão, todo tipo que aprendemos, e un
pouco de todo punteiros.
Ok?
Entón, primeiro de todo, a recursividade.
Que significa dicir que unha función é recursiva?
>> Audiencia: Chama-se.
>> LUCAS: OK, chama a si mesmo, si.
Así como esta imaxe, por exemplo.
É coma se a imaxe dentro dunha imaxe e así por diante.
Así, por exemplo, pode have-- como Dan que estaba a falar de busca binaria.
Unha forma en que procura binaria é recursiva é o feito de que é
intentando atopar un número.
Entón vai para o medio.
E despois que comproba as cifras alí na parte esquerda e no dereito.
>> E entón se descubrir o número é será á esquerda, que é a mesma
cousa como facer a busca de novo, pero só na parte esquerda da lista.
Entón é así que soa como é recursiva.
Entón é por iso que vostedes teñen recursiva solución para merge sort.
>> OK, entón aquí está un exemplo.
Entón, digamos que quero escoller todos os números de 1 a n.
Eu pode entender que a suma de n número é n máis n menos 1 ata 1.
Pero entón, se eu ollar para n menos 1 máis n menos 2 máis 1, que é o mesmo
cousa como números sumando ata n menos 1.
Entón eu podo dicir a suma dun importe igual n é igual a, máis a suma de n menos 1.
Será que isto ten sentido?
>> E eu tamén tería algo máis chamou o caso base, que é o
a suma dos números anteriores a cero sería cero.
Entón, así que eu chegar ao número cero, eu deixar de contar.
Será que isto ten sentido?
>> Entón aquí está un exemplo de como Podo aplicar iso.
Entón, eu teño esa función en algúns.
Isto leva un enteiro n.
Entón aquí eu primeiro comprobar se n é inferior ou igual a cero.
Entón, se non é superior a cero, I volver cero, que é o noso caso base.
Se non, eu só podo volver n máis a suma dos números de
un a n menos un.
Ten sentido?
Está ben.
>> Entón aquí está o que parece.
Ten suma de dúas iguais 2 máis a suma de 1.
E algúns de 1 é 1 máis o suma de 0, que é 0.
Ten sentido?
Entón, se miramos a pila de seu programa, este é o que parece.
>> En primeiro lugar, temos a función principal.
E, a continuación, a función principal chamado suma 2.
E, a continuación, suma dous vai dicir, oh, suma 2 é igual a 2, máis a suma de un.
Así que engadir suma de 1 a pila.
E a suma de 1 vai chamar suma de 0, o que tamén será engadida
á pila.
E, a continuación, cada un destes son os que enriba do outro ten que volver
antes que os outros poden continuar.
>> Así, por exemplo, aquí, suma de 0, en primeiro lugar, vai voltar 0.
E a continuación, escolla contía de 1.
Logo, suma de 1 vai volver 1 a suma de 2.
E, finalmente, suma de dous vai para volver 3 a principal.
Será que isto ten sentido?
>> É moi importante entender como a pila funciona e tentar
ver se ten sentido.
OK, entón a clasificación.
Entón, por que é importante a clasificación, en primeiro lugar?
Por que temos que preocuparnos?
Calquera?
Déame un exemplo?
Si?
>> Audiencia: [inaudível].
>> LUCAS: Si, OK.
Entón, pode buscar de forma máis eficiente.
Isto é un bo camiño.
Así, por exemplo, temos unha morea de cousas, en realidade, na nosa vida que
son clasificadas.
Por exemplo, os dicionarios.
>> É moi importante ter todo o palabras algún tipo de orde que
pode acceder facilmente.
Entón, iso é o que estaba dicindo.
Podes buscar de forma máis eficiente.
Debería quão difícil sería ter un dicionario en que as palabras están en
orde aleatoria.
Terá de se ver, moi bonito, cada palabra, ata atopar o
palabra que está a procurar.
>> Se está usando o Facebook tamén, cando está mirando para os seus amigos, está
vai ver que Facebook poñer o seu amigo máis próximo é encima das
que non fale moito.
Se percorrer todo o camiño ata o fondo do súa lista de amigos, vai ver
persoas que probablemente nin sequera Lembre que vostede é amigos con.
E iso é porque os tipos Facebook seus amigos en base a como
está preto deles.
>> Así, organizar os datos.
Tamén Galiza.
Entón ve que todo Pokémons teñen números.
E iso é como un sinxelo forma de acceso aos datos.
>> Audiencia: Acceder Galiza.
>> LUCAS: É.
>> Audiencia: [inaudível].
>> LUCAS: Yep.
OK, entón a selección de clasificación.
Ordenar Selección vai seleccionar o menor valor indiferenciados dunha lista cada
tempo en cada iteración.
É unha especie de como o tipo que fai na súa cabeza cando estás
ordenar unha lista na man.
>> Basicamente, todo o que fai é mirar ao número máis baixo.
Vostede poñelas na lista de clasificación.
E entón mira para o preto menor número.
E entón continuar facendo que e así por diante.
>> Así, a selección tipo é basicamente seleccionar cada vez menor
valor indiferenciados.
Poñer ao final da clasificados parte da lista.
E continuar facendo isto.
Entón, imos ver rapidamente o que este parece.
Entón aquí está o clasificado e lista de indiferenciados.
>> Así, para a ordenada de lista, é inicialmente baleiro.
E entón eu estou indo para seleccionar o menor número aquí, que é 2.
Entón eu recibín o número 2 e engada na parte da fronte da lista.
E entón eu ollo á seguinte menor elemento, o cal é de 3.
Entón, eu poñelas ao final da lista ordenada.
E entón eu continuar facendo isto.
Creo 4 e poñelas ao final.
Atopar 5 e poñelas ao final.
>> E mira como todos aqueles momentos en que Eu digo que poñelas a finais é,
basicamente, intercambiar dous valores.
Ok?
E entón o último, só ter máis dun elemento.
Entón, el xa está clasificada.
>> OK, entón ordenación por inserción.
Inclusión tipo que vai ter tamén esa cousa de ter un ordenado e
unha lista non ordenada.
O único é que cada vez que está engadindo un elemento á clasificadas
lista, é só escoller o elemento que está diante da lista de indiferenciados.
E entón vai atopar o que posición que debe ser clasificada en
parte da lista.
>> Veremos que isto é así iso fai máis sentido.
Así, inicialmente, por exemplo, eu estou tentando para introducir o número tres do
parte clasificada na lista.
Así, a lista non ten nada.
Entón, podo só poñer o número 3.
>> Agora, quero engadir o número 5 para a parte da lista ordenada.
Entón eu ollar para o número 5.
Entendo que é maior que 3.
Entón, sei que ten que ser despois de 3.
Entón eu coloque 3 e 5.
>> Entón eu quero introducir o número 2.
Entendo que o número 2 é, en realidade, durar, entón o 3 eo 5.
Entón, realmente teño que poñer todo o xeito ao principio da lista.
Entón eu teño que, tipo, cambiar toda a elementos da lista ordenada para que eu poida
abrir espazo para o número 2.
>> Entón eu vexo o número 6.
Vexo que debe ser despois de 5.
Entón, eu poñer-lo alí.
E, finalmente, eu ollar para o número 4.
E notei que debería situarse entre 3 e 5.
E entón eu poñelas alí e cambio todos os outros elementos.
Ten sentido?
>> Bubble Sort.
Entón bubble sort é basicamente o que está vai fazer-- chamamos iso de burbulla
tipo, porque atravesa o lista-- é realmente mellor se eu só amosar
desexa isso--
e está indo para comparar números adxacentes.
E vai cambiar a súa posicións se eles non están
na orde correcta.
>> Entón, basicamente, o que vai pasar é aquí, por exemplo,
ten 8 e 6.
Vostede sabe que a orde de clasificación será realmente ser 6 e 5, non?
Entón vai para cambiar as ordes.
Entón eu vexo 8 e 4 aquí.
E fago o mesmo.
Eu cambiar de novo.
E, finalmente, 2 e 8.
Eu tamén trocalos.
>> Chámase Bubble Ordenar por tras cada unha destas interaccións, en realidade,
o maior número na lista queda todo o camiño para a fin da lista.
Será que isto ten sentido?
Porque mantén intercambio-lo e movendo-o para a dereita.
>> OK, entón esta é a segunda iteración.
Iso sería o mesmo.
Vou facer un intercambio e logo o último.
Eu que non hai trocos ea lista é ordenada.
Así, en Bubble Sort, nós basicamente manter atravesar a lista e cambiar
cousas ata que eu entender que eu non fixen calquera swaps facendo a iteración, que
significa que a lista xa está clasificado.
Ten sentido?
>> Imos falar un pouco sobre o tempo de execución.
Polo tanto, vostedes lembran Big O, Omega, e Theta?
Si?
OK, o que é Big O, en primeiro lugar?
>> Audiencia: [inaudível].
>> LUCAS: Si, é chamado de peor caso tempo de execución, o que só significa que é
o que espera que o programa para aproveitar a correr.
Como, en termos de--
neste caso-- n.
Número de elementos na lista, no peor caso.
Como, no peor caso posible.
>> Así, por Bubble Sort, por exemplo, temos Big O de n cadrado.
Por que temos que?
¿Por que Bubble Ordenar Big O n cadrado?
>> Audiencia: [inaudível].
>> LUCAS: Si, entón o peor caso será que eu vou ter que facer n iteracións.
Así, cada unha das iteracións vai traia o maior elemento para o extremo
da lista.
Entón, o peor caso é que eu teño para facer esa cousa n veces.
E para cada unha desas veces, eu teño que facer n swaps porque teño que comparar
cada un de dous elementos.
Entón é por iso que é n ao cadrado porque é n veces n.
>> A continuación, a selección especie tamén é n cadrado porque, para cada iteración, eu teño que
ollar para cada elemento na lista.
E despois atopar o menor, o que significa que eu teño que
ollar a través de n elementos.
E eu teño que facelo n veces por Teño que seleccionar todos os elementos n.
>> Un tipo de inserción é tamén n cadrado porque o peor escenario será
ser, un, teño que introducir n números, non?
Entón, eu xa sei que vou ter n iteracións.
Pero para cada un destes números, se tivese a mirar para todos os números en
a lista ordenada e poñer-lo todo o camiño na parte dianteira, que será n cadrada
que vai ser n veces n novo.
Ten sentido?
E sobre omega?
>> Audiencia: [inaudível].
>> LUCAS: É o mellor escenario.
Entón, é como, en unha morea de veces para clasificación, o mellor escenario é
cando a lista xa está clasificado.
Entón, o que realmente non ten para facer calquera cousa.
Bubble Sort ten o mellor escenario de n.
Vostedes saben por que?
>> Audiencia: [inaudível].
>> LUCAS: Si, se manter o control de se ración de datos tivo calquera swaps ou
non, se ten algo como definido para verdadeiro se hai unha iteración, se o
lista xa está clasificado, basicamente, o que vai ocorrer é que eu vou
tentar cambiar cada dous elementos adxacentes.
Vou ver iso non hai trocos.
E eu só retornar inmediatamente.
>> Entón, isto significa que eu tiña que percorrer a lista xa.
Entón é n porque eu ollo a n elementos.
Por selección tipo n Square?
>> Si, aínda que a lista é ordenada, para cada iteración da selección tipo, eu
Ten que seleccionar o elemento mínimo.
Entón isto significa que eu teño que mirar para fóra en todos os elementos do indiferenciados
lista e atopar o mínimo para cada iteración.
Será que isto ten sentido?
>> E a espada de inserción é n porque o caso que eu estou tentando introducir o
números e os números, cando tentar inserir-los, eu vexo que
están no seu lugar.
Eu non teño que ir comprobar todos os outros números na lista de indiferenciados.
Entón é por iso que será n.
Ten sentido?
E o que é teta?
>> Audiencia: [inaudível].
>> LUCAS: Que, arrepentido?
Diga iso de novo.
>> Audiencia: [inaudível].
>> LUCAS: Exactamente.
Así pode ver que só a selección almacenado en merge sort ten tetas.
E iso é porque ten só theta se ambos Big O e Omega son os mesmos.
Está ben.
E, finalmente, merge sort é no rexistro n.
>> E entón, como Dan estaba dicindo, merge sort é tipo como do mesmo xeito que
fai a procura binaria.
Entón comeza a lista.
E vai cortar á metade.
E entón corte-los en metades menores.
E entón fundín-los.
Vostedes lembrar que, non?
OK, como el dicía.
>> OK, punteiros.
Entón, o que é un punteiro?
>> Audiencia: [inaudível].
>> LUCAS: Un enderezo.
Está ben.
Sei que David mostra un grupo de videos de Binky e cousas que ligan
entre si.
Pero eu gusto de pensar punteiros como só unha dirección.
Polo tanto, é unha variable que está a suceder para almacenar un enderezo.
>> Entón é só esa variable especial que é catro bytes de longo.
Lembre, este punteiro para calquera cousa é sempre catro bytes de lonxitude para o noso 32-bit
máquina de xeito que o caso o aparello.
E só ten a localización dunha variable dentro do mesmo.
>> OK, entón non hai esa memoria, basicamente.
Así, cada bloque de memoria, de feito, ten un etiqueta, o cal é a dirección do
memoria slotty.
Entón isto significa que eu podo ter un punteiro que apunta
calquera destes enderezos.
Así, a razón pola que imos usar punteiros é se eu teño que lembrar a súa localización
que unha variable específica é unha memoria.
>> E vostedes recorda que un dos casos foi se eu tivera unha función
se eu tivera realmente quero que intercambio para reais, realmente
ten que enviar un punteiro.
Non é a variable.
Vostedes se lembra diso?
O between-- diferenza
cal é o nome?
Chamada polo valor e chamando por referencia, non?
>> OK, si.
Entón chame por valor.
Cando acaba de enviar unha variable para funcionar só está enviando un valor.
Entón, en realidade está enviando unha copia da variable.
E o programa non podería me importar menos sobre si mesma variable, en realidade,
fai unha copia.
>> E chamando por referencia significa que De feito, estou enviando unha copia do
punteiro para esa variable.
Entón, isto significa que eu estou enviando a localización desta variable.
Entón, sinto que teño a localización do variable, cando chamar a función
con punteiros, eu son capaz de realmente cambiar os datos que estaban no inicio.
Ten sentido?
>> Aínda que, o punteiro é unha copia, a punteiro aínda ten a dirección real de
a variable que quero cambiar.
Ten sentido?
>> Así, a creación de punteiros.
Lembre, o punteiro sempre do tipo que está apuntando
ao e, a continuación, unha estrela.
E entón pon o nome.
Entón recorda que sempre que ten calquera que sexa estrela, é como un punteiro para
que calquera que sexa variable tipo que tiña.
>> Entón, aquí en estrela, por exemplo, é un punteiro e dun número enteiro.
E despois de char estrela é un punteiro estrela carbón animal e así por diante.
Si?
>> Audiencia: E se temos unha punteiro para n para protagonizar x.
Sei que crea un punteiro para x.
Será que tamén declarar x un número enteiro?
>> LUCAS: OK, entón cando di n estrela x, non está creando un punteiro para unha
x variable.
Está creando un punteiro chamado x.
>> Audiencia: [inaudível].
>> LUCAS: Entón, cando digo n estrela x, eu son dicindo, hey, na memoria, vou
conseguir unha destas tres caixas.
E eu vou dicir que isto será x, que é
Vai ser un punteiro.
E unha cousa interesante sobre punteiros é que nós dicimos que teñen
4 bytes para unha máquina de 32 bits.
E a razón para iso é porque 4 bytes son 32 bits.
>> E máquinas que son de 64 bits, en realidade, teñen enderezos punteiros
que son de 64 bits.
Por iso, só significa que a dimensión da enderezos na máquina é diferente.
>> Entón referenciando e Dereferencing.
Existen dous operadores que Vostedes deben lembrar.
A primeira é comercial.
A segunda é estrela.
Non sexa confuso con esta estrela e este estrela, porque recorda que, en
Neste caso, ten n estrela.
>> É como unha cousa toda en conxunto.
Non hai espazo estrela n.
Entón, isto significa que el é o tipo.
Lembre, que cando ten a estrela variable, está
falando sobre o tipo.
>> Cando ten só estrelas e, a continuación, o nome da variable, isto quere dicir que
está dereferencing o punteiro, que significa que está mirando para o
punteiro, atopar a dirección é apuntando, indo a ese enderezo,
e mirando para sempre ten alí.
Entón, digo aos meus alumnos que cando ten estrela, ten que pensar que é
a abreviatura de contido.
>> Entón se ten un punteiro e facer punteiro estrela, é o
o contido do punteiro.
Entón vai para o que está a apuntar cara e mirar para o contido constante.
E o comercial é a mesma cousa como enderezo.
>> Entón, se eu teño unha variable a-- como, imos dicir que eu fixen un int igual 3--
se eu queira atopar a dirección de que unha memoria variable, eu só podo facer
comercial Unha.
Por iso, é o enderezo de un.
Ten sentido?
>> Entón, aquí está un exemplo.
Isto falta int b e c int.
Entón int un é igual a 3 significa que Eu estou indo a ir á memoria.
E eu vou atopar un slot e poñer o número 3 aquí.
>> E, a continuación, int b é igual a 4.
Vou facer o mesmo.
Ir á memoria e poñer un número 4 nunha das caixas.
E int é igual a 5.
Atopa outra caixa e poñer un número 5.
>> Entón o que é esta liña está facendo? n estrela pa igual a un comercial.
Entón, en primeiro lugar, n estrela aa.
O que está facendo?
>> Audiencia: [inaudível].
>> LUCAS: Si, por iso n estrela pa, en primeiro lugar, declara un punteiro chamado pa.
E el está atribuíndo o valor de punteiro que pode ser o seu enderezo de un.
Entón comercial Unha.
Entón, se eu fai estrela pb, o que é unha estrela pb?
>> Oh, desculpe.
Isto tamén está en falta. n estrela pb.
Quero dicir estrela PC.
Eu sinto moito.
É o mesmo.
Pero agora eu son bo aire creando un punteiro para B e, a continuación, un punteiro para c.
Si?
>> Audiencia: [inaudível]?
>> LUCAS: Si.
Entón, se vai para a memoria e vai para a caixa que é designador para aa,
está realmente indo a vexa a dirección dun.
Ok?
Si?
>> Audiencia: [inaudível]?
>> LUCAS: Si, punteiro é un enderezo.
Nunca se esqueza diso.
É como o máis importante parte sobre punteiros.
Hai almacenar e dirección a algunha variable.
Algo máis?
Algunha pregunta?
Está ben.
>> Entón Punteiros e matrices.
Lembre que cando fago int matriz 3, Basicamente, o que eu estou facendo é que eu son, tipo
de, declarando nun punteiro.
Entón matriz é tipo como un punteiro para un lugar específico na memoria en que eu
alocados tres slots para enteiros.
Será que isto ten sentido?
>> Entón, cando fago int matriz 3, o que eu son facendo basicamente é a creación de tres
slots de memoria.
Entón, eu só atopar tres slots de memoria.
Entón, se eu fai iso, entón, un conxunto de estrelas, basicamente, o contido do array,
o que significa que eu eliminar o punteiro, vou para aquel lugar que está apuntando para,
e engada o número un.
>> E despois, se eu fai matriz estrela máis 1, iso é o mesmo que facer matriz
corchetes un, o que significa só que eu vaia o lugar que está apuntando.
E entón a un marcas me desprazar unha posición.
Entón eu vou a esta posición, de feito, e poñer o número dous.
>> E entón, finalmente, cando fago matriz dous máis, eu vou para onde
enlace de matriz en.
E entón eu paso para os bloques de memoria.
E entón eu coloque o número tres aquí.
Si?
>> Audiencia: array Así estrela é simplemente dicindo que o primeiro punto.
E pode engadir un, só porque estamos realmente só
referenciar que primeiro enderezo.
>> LUCAS: É.
Por que, por exemplo, dicir matriz 0, array 1 e matriz de 2?
Eu digo, por que fai 0, 1, 2, 3, no canto de 1, 2, 3?
Unha das razóns é, un, ordenador programadores prefiren comezar
contando desde 0.
Dous é porque cando fai matriz 0, é o mesmo que facer matriz
plus 0, o que significa que eu vaia esa posición, e non
ignorar calquera bloques de memoria.
Así que non mover todos os bloques de memoria.
Si?
>> Audiencia: [inaudível]?
>> LUCAS: Entón está pregunta o que é a diferenza entre facer
este é facendo malloc.
Unha das diferenzas é que int matriz 3 é a creación dun
matriz na pila.
E cando fago malloc, que crea na pila.
Será que isto ten sentido?
>> Entón como é que malloc realmente funciona?
Entón, por que aínda que empregar malloc?
O seu tipo de compilador descobre todo as variables que declarou.
E crea espazo para todos deles na pila.
Así, as súas variables van estar nalgún lugar na pila.
Entón aquí está as variables de ambiente.
>> Entón, basicamente, o espazo para as variables en memoria é alocada en
tempo de compilación.
Entón, isto significa que o seu ordenador ten saber todas estas variables
antemán.
Non ten que saber que o valor que está indo a poñer neles.
Pero hai que saber como cantidade de memoria que necesitas.
>> Pero agora imos dicir que, por exemplo, está creando unha matriz ou tomar un
cadea que está tomando desde o sitio web.
Non sabe canto tempo a corda será, por exemplo.
Entón non sabe exactamente cantos bloques de memoria que reservar, non?
>> Por iso, non fai moito sentido para quere dicir poñer 100 caracteres.
E entón o que se o usuario escribe 150?
Vai ser parafuso.
>> Entón, basicamente, non pode estar seguro de como cantidade de memoria que precisa reservar
cando compilar o programa.
Só sabe que, en tempo de execución.
É por iso que ten a pila.
Así, a pila terá memoria que está alocando durante o
duración do programa en execución.
>> Entón, basicamente, cando fai malloc, o que está facendo é a distribución de memoria en
tempo de execución, o que significa que está decidir nese momento que
debe ter esa memoria.
Entón é iso, cando está asignación.
Será que isto ten sentido?
>> Entón lembre, a pila ten variables que son creados en tempo de compilación.
E entón, o monte ten variables que son creados como vai
con malloc, por exemplo.
>> Audiencia: [inaudível]?
>> LUCAS: Entón é GetString vai chamar malloc.
Déixeme falar malloc, e Vou explicar GetString.
Entón malloc é o mesmo como distribución de memoria.
Por iso, vai reservar memoria no heap.
E que vai voltar un punteiro para onde esta memoria foi alocada no.
>> Entón, cando fazer--
aquí para example--
n punteiro estrela.
E entón punteiro igual malloc tamaño de 10 polgadas veces.
Estou creando un punteiro.
E entón eu estou atribuíndo este punteiro para o valor do enlace que malloc
está me dando.
>> Entón eu estou pedindo malloc pode reservar espazo para 10 enteiros.
Iso é o que está dicindo.
E malloc me dá de volta a punteiro para aquel lugar.
Ten sentido?
Está ben.
Eu E GetString é basicamente facer un chamar a malloc para podelo reservar
memoria durante a execución.
>> Teña en conta que sempre comprobar a nulidade porque malloc devolverá nulo
se non é posible reservar memoria.
Imos dicir que pedir un ridículo cantidade de memoria.
O seu ordenador non será poder reservar moito.
>> Entón malloc é só ir para volver null.
Entón lembre sempre comprobar se o punteiro que ten de malloc é
nulo ou non, porque, de ser, pode ser referencia un punteiro e
provocando fallos laterais.
E, finalmente, non se esqueza súa memoria libre.
>> Malloc é a creación de memoria no heap.
E ten que liberar a memoria antes de que o programa termine.
OK, iso é todo para min.
Sentímolo, Rob.
Grazas.
>> [Aplausos]
>> LUCAS: Todas as últimas preguntas antes de Rob vén?
Non?
Si?
>> Audiencia: Non vin este en liña.
Cargou-o aínda?
>> LUCAS: Creo que Dave é cargalo en breve.
>> Dave: Vai ser lanzado.
>> LUCAS: El vai estar en liña.
>> Audiencia: É-se.
>> LUCAS: É-se?
Está ben.
Si?
>> Audiencia: [inaudível]?
>> LUCAS: Si, ten que liberar todo o memoria que é colocado na pila.
>> Audiencia: [inaudível]?
>> LUCAS: Si.
Cada vez que ten un malloc cultura, ten que ter unha cultura libre
despois que deixar de usar esta variable.
Entón malloc e free son sempre xuntos.
Os seus mellores amigos.
Si.
Rob?
>> ROB: Vou rapidamente.
E tamén o video será colocado.
Eu teño o micrófono conectado.
>> OK, entón semana de cinco cousas.
O primeiro que temos é a pila.
Entón recorda que só hai unha pila cadro por chamada de función activa.
Vexamos isto en un segundo.
E tamén me acordo do que realmente pasa en cada cadro de pila van ser
as variables locais das nosas funcións, os argumentos que se pasan para o noso
funcións, xunto con un par outras cousas que realmente non
se preocupe.
>> Entón aquí está un exemplo de programa que, aviso, a principal é o retorno printfing
valor de foo 4.
foo só vai volver valor de bar 4 comas 6.
E bar vai establecer algúns locais n variable igual a 4 veces 6.
E a continuación, regresar n.
>> Entón, imos ollar para a pila todo a iteración actual do programa.
Polo tanto, hai o fondo da nosa stack.
Teña en conta que de que a pila crecendo.
Así, na parte inferior da nosa pila, ten un cadro de pila para o principal.
Cando o programa comeza, principal sempre estará no
inferior da nosa pila.
>> E o que está dentro do noso apilar marco para principal?
Así, aínda que non existan locais variables a principal, como dixen antes,
temos argc e RGV ocupando espazo dentro do cadro principal de pila.
Entón principal agora vai chamando a función foo.
E isto significa que foo vai obter o seu propio cadro de pila.
>> Polo tanto, agora estamos dentro a función foo.
E o que precisa para ir en cadro de pila do foo?
Ben, foo ten un argumento n.
E n é igual a 4, pois iso é o que principal é pasar como argumento de foo.
>> Entón agora foo vai chamar bar.
Que é bar terá dentro de seu 'cadro de pila?
Ten igual a 4 x y igual a seis.
Iso non é todo o que nós imos ter no cadro de pila porque bar
ten tamén unha variable local n.
E n imos definir igual a 24.
>> Entón agora bar volverá n.
Entón bar está retornando 24 a o foo cadro de pila.
E por agora barra de retorno, que significa que estamos estourando o cadro de pila
fóra da barra do conxunto.
Así, toda a memoria que bar fora usando agora fóra da pila.
>> Agora, foo tamén para volver 24 a principal.
Polo tanto, agora que foo está retornando, a memoria foo que estaba usando na súa '
cadro de pila tamén está desaparecido.
E agora, o principal vai chamar printf.
Entón printf é só unha outra función.
Cando chamamos printf, que será outro cadro de pila para o printf
chamada de función.
>> O que estamos pasando printf?
Iso é o que está indo a ir no seu cadro de pila.
Como mínimo, estamos pasando que por cento i barra invertida n e
argumento 24.
Podería ter máis na súa estrutura de pila se printf pasa a estar a usar un
variables locais.
Non sabemos.
>> Pero todo o que acontece no printf do apilar cadro.
Vai executar o printf.
Entón printf está feito.
El pode voltar.
Por último, o principal está feito.
Iniciar volverá.
E entón o noso programa está feito.
Si?
>> Audiencia: Está vendo [inaudível]
argumentos [inaudível]
parámetros?
>> ROB: Entón hai unha diferenza sutil entre argumentos e parámetros.
E realmente, o falar común, as persoas tenden só para mestura-los o tempo.
Pero parámetros son os formais nome das cousas.
>> Entón argc e argv son o parámetros para principal.
Os argumentos son o que realmente pasar como eses parámetros.
Entón alí cando chamar foo de 4, 4 é o argumento que estou pasando.
E o parámetro n, dentro foo, asume o valor 4
desde 4 foi o argumento.
>> Audiencia: [inaudível]?
>> ROB: n é unha variable local para untar.
n aínda é lugar para foo, pero é un parámetro para foo.
Non é unha variable local.
Si?
>> Audiencia: [inaudível]?
>> ROB: foo bar é só chamar e retornando Whatever Bar retorno.
>> Audiencia: [inaudível]?
>> ROB: Si, só para ver múltiple apilar cadros.
Si?
>> Audiencia: Por foo chamouse antes printf?
>> ROB: Por que foo chamado antes printf?
Entón, eu podería, en vez diso, fixo algo como int x é igual a foo de 4
e logo, impreso x.
Pero en vez diso, eu combinei a función chamar argumento de printf.
>> Pero teña en conta que non podemos, de feito, realizar a chamada a printf ata nós
descubrir o que foo de 4 é.
Entón nós imos avaliar iso.
E só unha vez feito isto para volver e avaliar iso.
Si?
>> Audiencia: Xa que tanto bar [inaudível]
valor, por que non ten [inaudível]?
>> ROB: Deben ser totalmente int.
Isto non foi capturado máis varios pases.
Así debe ser int bar e int foo xa que ambos
están retornando enteiros.
Baleiro é só no caso de que non van para voltar os valores reais.
Si?
>> Audiencia: Se tivese unha liña enriba o retorno, [inaudível]?
>> ROB: A liña de enriba do retorno?
>> Audiencia: Yeah.
Como se fixo printf e [inaudível] sería imprimir dúas veces?
>> ROB: Entón, dentro foo?
Se tivésemos un printf aquí?
>> Audiencia: Yeah.
>> ROB: Entón, se nós tivésemos un dereito printf aquí, sería imprimir unha vez.
Xa que estamos chamando foo xa dereito aquí, entón imos acertar o printf.
Entón imos chamarlle bar.
E entón foo vai volver.
E é iso.
Nós só atopar sempre printf unha vez.
Si?
>> Audiencia: [inaudível]
printf chamar foo porque estamos en primeiro lugar chamando printf e despois imos pasar
os argumentos.
>> ROB: Entón, en teoría, non é printf chamar foo?
Entón, non.
Só a fin de que c vai realizar estas cousas é, antes que pudermos
chamar unha función, todo argumentos para a función que
ser completamente avaliada.
Entón é iso totalmente avaliado?
Si, é só un fío.
É só un valor.
>> Entón temos que completamente avaliar iso.
Unha vez feito isto, agora todo seus argumentos son avaliados.
E agora podemos facer a chamar para printf.
Si?
>> Audiencia: Unha pregunta.
Se vostede ten unha función void, debe ten retorno punto e coma?
>> ROB: Non fai un punto e coma retorno se ten unha función void.
Está ben.
Entón, agora algunhas cousas heap.
Entón pila é como imos tratar co manexo de memoria dinámica.
E iso contrasta directamente co pila que poderiamos chamar de automático
xestión de memoria.
>> Entón na pila, nunca ten para xestionar o xeito no que as variables locais
están sendo empurrados e bateu fóra todo estes cadros de pila e todas esas cousas.
Non ten que se preocupar con iso.
É automático.
Así, a pila é manual.
E o [inaudível]
vén destas funcións malloc e free.
>> Entón aquí está outro programa.
Todo o que estamos facendo é mallocing un enteiro.
Estamos almacenando o en estrela x.
Por suposto, debemos comprobar a ver se x é nulo.
Entón imos só definir o que x está a apuntar cara a 50.
Imprimir o que está a apuntar cara x, print x, e despois libre x.
>> Entón, como é que isto realmente vai mirar se miramos a nosa pila e pila?
Entón, imos comezar de novo.
A parte inferior da nosa pila como antes.
Lembre que che amontoar directamente oponse a pila de?
Entón, nós imos ter o parte superior da nosa pila alí enriba.
>> Así, o fondo da pila a temos noso cadro de pila para o principal.
Ten o espazo para argc, argv, e nós Agora temos unha variable x local, que
é unha estrela int.
Entón, imos facer unha iteración a través deste programa.
O primeiro que temos é unha chamada para malloc.
>> Entón, nós estamos facendo unha chamada a malloc.
Malloc é unha función.
Vai chegar un cadro de pila.
O que estamos pasando para malloc?
Isto vai entrar do cadro de pila.
Estamos pasando tamaño n, que é 4.
Entón, que é pasado para malloc.
>> Que malloc facer?
El agarra connosco algún espazo no heap.
Entón, nós estamos indo a ir á pila.
E nós imos coller 4 bytes do conxunto.
Entón imos dar este un enderezo arbitrarios.
0x123 Basta finxir que é un dirección que está na pila.
>> Entón, o que en realidade está dentro dese rexión de memoria na páxina Ox123?
Garbage.
Entón, nós non memorizou nada nel.
Así, tanto como sabemos, Podería ser calquera cousa.
Non debe asumir que é cero.
É máis probable que non sexa cero.
>> Retorno Entón agora malloc.
E o que facemos cando malloc retorna?
Montar o que retorna.
Montar x iguais ao que está volvendo.
Entón o que é o regreso?
Está volvendo 0x123 xa que é a dirección do bloque de memoria que
só asignado no heap.
>> Entón retorne 0x123 x agora será definido igual a 0x123 que, pictoricamente,
nós frecuentemente deseñar como x tendo un real frecha que apunta para ese bloque.
Pero x é só almacenar ese enderezo.
Entón, agora temos que comprobar se x é nulo.
Non é nulo.
Finximos que malloc que conseguiu.
>> Entón, agora estrela x é igual a 50.
Así estrela recorda que significa ir a este enderezo.
Entón 0x123 Imos ir a este enderezo.
Entón, iso nos leva ata alí.
O que estamos facendo nese enderezo?
Estamos almacenando 50.
>> Así, tras esta liña, que é o que as cousas están indo opinión.
Entón, agora non é máis lixo alí enriba.
Agora sabemos que o 50 é no que enderezo particular porque
nós configuralo para iso.
Ok?
Entón agora imos imprimir f.
>> Entón, primeiro imos para imprimir estrela x.
Entón, cal é estrela x?
Unha vez máis, a estrela x significa ir á que x está a apuntar.
Entón x é almacenar 0x123 Vaia iso.
Estivemos con 50.
Así que imprimir f.
E iso significa que vai imprimir 50.
E despois que retorna.
>> E despois temos o segundo printf.
Agora estamos por cento p.
Se aínda non viu, esta é só como imprimir un punteiro.
Polo tanto, temos por cento i, cento f, e todos aqueles xa.
Entón por cento p, imprimir un punteiro.
>> Entón x é un punteiro.
Entón, se nós estamos indo para imprimir x si, estamos imprimindo o que en realidade está dentro
x, o cal é 0x123 Así, o primeiro print f vai imprimir 50.
A segunda impresión f vai para imprimir 0x123 Si?
>> Audiencia: Vostede usa por cento x para imprimir un enlace?
>> ROB: Entón usa por cento x para imprimir un enlace?
Entón pode, pero por cento x é xusto, xeral, pois, como se ten algún
enteiro e que quere imprimir lo como un hexadecimal.
Isto é só como facelo.
>> Considerando que, por cento d faría imprimir como decimal.
É aí onde comezan por cento d. i é só enteiro.
por cento p é especialmente para punteiros.
>> Entón x é un punteiro.
Queremos usar por cento p.
Pero por cento x podería traballar.
Si?
>> Audiencia: [inaudível]?
>> ROB: Yeah.
Polo menos para este call-- entón eu non inclúe-lo aquí.
Pero estes dous argumentos son necesariamente dentro deste marco de pila
xunto con calquera variables locais printf pasa a ser utilizado.
E, a continuación, a próxima chamada a printf agora dentro printf cadro de pila é
por cento p barra invertida n e calquera que sexa o valor de x é, cal é 0x123.
Si?
>> Audiencia: [inaudível]?
>> ROB: El vai imprimir algo que se parece con isto.
>> Audiencia: [inaudível].
>> ROB: Entón el imprime-lo en forma de enderezo.
Parece que un enderezo.
Si?
>> Audiencia: [inaudível]?
>> ROB: Por que é o que?
>> Audiencia: [inaudível]?
>> ROB: Por que este punteiro 4 bytes?
Polo tanto, hai unha morea de 0 fronte a este.
Entón, é realmente 0x0000000123.
Nun sistema de 64 bits, non habería unha morea de máis ceros.
Si?
>> Audiencia: [inaudível].
>> ROB: Entón o primeiro printf vai print--
>> Audiencia: [inaudível].
>> ROB: Si, está indo para imprimir que x está a apuntar.
Estrela di o que é iso cousa a apuntar.
Agarre-o.
Entón que é o que está a apuntar?
50.
Agarre-o.
Iso é o que imos imprimir.
Considerando que, o próximo, estamos só imprimir x si.
O que está dentro de f?
0x123.
Está ben.
>> E entón, finalmente, temos o libre.
O que estamos pasando para liberar?
Estamos pasando x.
Naquela época, eu realmente exhibido lo no cadro de pila.
>> Entón, nós estamos pasando o valor 0x123 liberar.
Entón, agora libre sabe, todo ben, Teño que ir ata a pila
e sen que a memoria.
Xa non está a usar o está no enderezo 0x123.
>> Tan libre lanzará que desde o heap.
Agora a nosa pila está baleira de novo.
Non temos perdas de memoria.
Agora libre vai volver.
Teña en conta que x é aínda 0x123.
Pero iso agora non é válido memoria.
Non hai máis desreferenciava x.
Si?
>> Audiencia: É voltar 0 redundante?
>> ROB: É returen 0 redundante?
Si.
Acabamos de poñer que alí porque temos un retorno dun ao aire.
Entón, é como si, permite inclúen o regreso 0.
Si?
>> Audiencia: [inaudível]?
>> ROB: Entón, despois x libres, o que pasa se tratamos cancelar o punteiro?
É posible que nada dea mal.
É posible que aínda recibirá 50.
>> É posible, tamén, que esa memoria é agora está a ser usado para outra cousa.
Polo tanto, é un comportamento indefinido.
E indefinida significa nada pode pasar.
Si?
>> Audiencia: [inaudível]?
>> ROB: Non, por iso, se asignar x para outra cousa.
Entón, aquí dixemos x é igual a algo malloc else--
tamaño malloc event--
entón que bloque orixinal de memoria non é liberar.
E perdemos oficialmente.
Isto é unha perda de memoria.
Perdemos as referencias para este bloque de memoria.
Entón non hai ningunha maneira que podemos nunca liberalo la.
OK, entón, a continuación, regresar 0 significa feito.
>> Todos estourido ben, entón pila.
Cal é a idea aquí?
Entón lembre, pila está indo para abaixo.
Stack está subindo.
Polo tanto, este foi o exemplo da charla, Creo que, onde principal só vai
chamar esta función foo, que vai a chamarse de recursivamente unha e
unha vez máis.
>> Entón apilar cadros van funcionan exactamente do mesmo.
Entón, imos comezar con principal como o cadro de pila inferior.
Entón principal vai chamar foo, que está indo para obter un cadro de pila.
>> Entón foo vai chamar foo de novo, o que se ve
outro cadro de pila.
E entón, de novo, e de novo, e de novo, e de novo, ata que, finalmente, corremos
no heap.
Entón é así que chegamos un estourido de pila.
E, neste punto, SEG culpa.
Ou realmente seg falla antes neste punto, pero si.
>> Audiencia: É núcleo despexar o aínda que culpa seg?
>> ROB: Entón verás segmentación núcleo culpa despexado.
Gañou un dump de memoria cando vostede SEG culpa.
E é como unha reserva de todos os contido da memoria actual
que pode tentar identificarse por que o seg criticado.
Si?
>> Audiencia: [inaudível]?
>> ROB: Entón un medio fallo de segmentación hai un estourido de pila.
Entón, non necesariamente.
O fallo de segmentación significa que está memoria tocar dun xeito
non debe ser.
Polo tanto, unha forma de isto acontecer é que, cando ti estourido de pila, comezan a tocar
memoria dunha forma que non debería ser.
Si?
>> Audiencia: [inaudível]?
>> ROB: Entón, dentro dun loop infinito.
Tipo, iso é como un infinito recursiva loop e entón temos outro
cadro de pila de cada vez.
Pero só dentro dun estándar infinito mentres um--
ben, non imos nin imprimir F--
facer algo.
Calquera que sexa.
>> Non imos estar recibindo outro cadro de pila.
Nós só estamos indo a perder looping sobre esta única instrución.
A pila non está crecendo.
É o feito de que cada recursiva chamada está nos dando un cadro de pila.
É por iso que temos un estourido de pila.
Si?
>> Audiencia: Entón, se dixo para obter o while e despois [inaudível]?
>> ROB: Entón, se dentro do loop while había un printf, aínda
culpa non seg.
Eu só non quero confundir as cousas.
Sería circuíto.
Desexa obter unha única pila enmarcar a printf.
>> Entón printf volvería.
Entón ciclo de novo.
Desexa obter unha única pila enmarcar a printf.
Iria volver.
Cadro único pila.
Entón non está a recibir este infinito empilhado pila de cadros.
>> Audiencia: [inaudível]?
>> ROB: Si.
Entón ese estourido de pila ocorre porque ningún deles
chamadas a foo están volvendo.
Entón, se volvemos, entón teriamos comezar a perder cadros de pila.
E entón nós non estourido de pila.
E é por iso que precisa de un caso base para as súas funcións persoais.
Si?
>> Audiencia: É o tamaño potencial ea pila para a pila a mesma para
todos os programas?
>> ROB: Aproximadamente.
É o tamaño do potencial da pila e a pila a mesma para todos os programas?
Preto.
Hai uns randomização para en que a pila e inicia
onde a pila comeza.
Se ocorrer de ter unha chea de variables globais e as cousas, que pode
sacar dalgún espazo para a súa heap.
>> Nun sistema de 64 bits, ten practicamente ten memoria infinita.
Hai tanta cousa.
Entre 32 bits e 64 bits, que é unha diferenza significativa.
>> Vai ser moito máis pila e heap space nun 64 bits
sistema, xa non é só enderezos que poden usar.
Pero nun sistema individual, será ser máis ou menos a mesma cantidade de pila
e espazo de pila.
Todo correcto.
>> Así último é a compilación.
Entón ten que saber este proceso.
Existen catro grandes etapas.
Así, o primeiro que se ser fácil de lembrar.
Vista procesamento.
Ela ten o prefixo pre nel.
Por iso, vén antes de todo.
>> A cousa a lembrar o hash.
Entón haxix define e haxix inclúe en todo isto.
Estas son todas pre-procesador directivas.
Estas son as cousas que os pre-procesador coida.
>> Entón, o que un pre-procesador de facer?
É unha cousa realmente idiota.
Todo o que é capaz de son todo isto copia e Cortar e Pegar operacións.
>> Así, de hash inclúe estándar i0 punto h.
Que está facendo?
Está agarrando o estándar i0 dot h arquivo e pegalo a arriba
onde queira que el di de hash inclúe estándar dot h i0.
>> E calquera hash de definir que temos ver, que é o que está facendo?
A súa copia o valor que a suma definido defínese como e colando que
onde queira que está a usar o valor.
Así, o pre-procesador só fai realmente operacións baseadas en texto sen formato.
El non fai nada intelixente.
Entón, todo o demais é máis complicado.
>> Polo tanto, agora que é pre-procesador feito, nós realmente compilar.
Entón, o que a compilación significa?
Estamos indo de código c ao código de montaxe.
Si?
>> Audiencia: [inaudível]?
>> ROB: Si, nós pegamos iso.
Entón compilar.
Estamos indo de C para montaxe.
Polo tanto, esta é un cambio de linguaxe real.
Compilar-se significa ir de unha linguaxe de alto nivel para
nunha linguaxe de nivel inferior.
>> E c é unha linguaxe de alto nivel en comparación coa montaxe.
Que é montaxe?
As súas instrucións que, moi moito, feito para o seu CPU.
Pero o equipo aínda non Non entendo montaxe.
El só entende ceros e uns.
Entón, o seguinte paso é a montaxe, que lévanos a estas instrucións que
súa CPU comprende e realmente traduce a eles, para
os uns e ceros.
>> Entón C para montaxe de binario.
Pero eu non teño un executable aínda.
Entón, creo que a biblioteca CS50.
Nós fornecen-lle con un binario para esta biblioteca CS50, que ten GetString
e GetInt e todo iso.
>> Pero o CS50 library--
e de itself-- non é executable.
Non ten unha función principal.
É só unha morea de binario que pode usar.
Entón conexión é así que reunir todos destes ficheiros binarios distintos
nun arquivo executable real.
Un que podes escribir dot cortar un punto fóra.
>> Entón, iso é como o ficheiro que escribiu, - calquera que sexa o seu programa é--
Ceaser punto c.
Pero agora compilouse ata binario.
Así, o punto de Ceaser.
E esta é a nosa CS50 bibliotecas binario.
E eles están sendo combinadas nun único executable.
Si?
>> Audiencia: [inaudível]?
>> ROB: Entón primeiro inclúen, lembre, o hash incluír en realidade é un
paso de pre-procesador.
Pero iso é separado.
Se non está a usar todas as funcións que están fóra do seu arquivo único, a continuación,
Non, non precisa de conexión nada pois ten todo.
>> Dito isto, printf está a ser vinculado en.
Se nunca usar printf, iso é algo que ten que ser conectado en
porque non escribiu isto.
E, de feito, printf automaticamente ligada en.
Vostede sabe como na liña de comandos ou cando insire make, ve que ten
trazo l CS50, que ten conexión na biblioteca CS50?
Printf, e cousas así, vai para ser conectado automaticamente.
Calquera outra dúbida sobre algo?
>> Audiencia: [inaudível]?
>> ROB: Vinculación?
Temos unha morea de diferentes arquivos binarios.
Este é o exemplo canónica que usan é a biblioteca CS50.
Nós compilamos e dado a ti o binaria para esta biblioteca CS50.
>> Quere usar GetString no seu programa.
Entón, vai usar GetString.
Pero sen o meu código binario para GetString, cando compilar o código
abaixo, non pode realmente realizar o seu programa porque GetString cadea é
aínda non totalmente definido.
>> É só cando conectar o meu binario que contén GetString que agora, todo
ben, eu podo realmente realizar GetString.
O meu arquivo está completo.
E podo realizar iso.
Si?
>> Audiencia: Fai ligando converter o binario ao executábel?
Así, mesmo se non ten outra bibliotecas, non sería aínda
necesario para traducir o [inaudível]?
>> ROB: Entón un executable aínda é en binario.
É só combinar un todo banda de binarios.
>> Audiencia: Moitas grazas.
>> ROB: Non hai ningún problema.
Algunha pregunta?
Se non, está todo preparado.
Todo correcto.
Grazas.
>> [Aplausos]
>> Audiencia: Grazas.
>> ROB: Yeah.