>> [Música tocando]
>> DAVID J. Malan: Todo ben.
>> [Risas]
>> Benvido de volta.
É dicir CS50.
E este fin de semana cinco.
E ata agora temos practicamente tomado como certo que hai
existe este compilador Clang, que ten foi invocar por medio deste
outra ferramenta chamada Comprobe que dalgún xeito Magic transforma o seu código fonte
en código obxecto, os ceros e uns que o seu CPU de ordenadores, centrais
unidade de procesamento, realmente entende.
Pero resulta que hai un número que se suceder debaixo do capó en
entre a entrada ea saída.
>> E gustaríame propoñer que a carne que en algo máis de detalle en
estas catro etapas, ten unha cousa chamada pretratamento, algo
chámase compilación, o que vimos, algo chamado montaxe e
algo chamado de conexión.
Entón, ata agora, en algúns dos nosos programas, tiñamos afiado inclúe.
Máis recentemente tivemos algúns sharp define a constantes.
Así, verifícase que as cousas que son prefixados co símbolo de hash ou
o símbolo da libra son pre-procesador directivas.
Isto é só un xeito elegante de dicir que é unha liña de código que é realmente
convertido noutra cousa antes do ordenador ata tentar converter o seu
programa en ceros e uns.
>> Por exemplo, afiado inclúe por defecto I / O. H, practicamente significa só ir
á cabeza, tome o contido dos arquivos Stdio.h e cola-los alí mesmo.
Polo tanto, non ceros e uns nese punto aínda.
É realmente só unha substitución.
E iso está feito durante a chamada fase de pre-procesamento, cando
realmente executada Clang ou especificamente Facer na maioría dos casos.
Entón, todo o que ven a suceder primeiro automáticamente ata o momento.
>> A continuación, vén a etapa de compilación.
Pero fomos simplificada compilación.
Compilar un programa realmente significa levalo de algo así como C, o
o código fonte que teño escrito, abaixo a algo chamado montaxe.
Linguaxe assembly é un nivel inferior linguaxe que, por sorte, non imos
teñen moita oportunidade de escribir este semestre.
Pero é no nivel máis baixo da sensación de que, literalmente, comezar a escribir
sumar e restar e multiplicar e cargar da memoria e gardar a memoria, o
instrucións moi básicas que un ordenador, debaixo do capó,
realmente entende.
>> Para rematar, a montaxe leva esa lingua para os ceros e uns que fomos
describindo así lonxe.
E, de feito, por último, hai o chamado conectando fase, que imos
ver en só un momento, que combina os ceros e uns con ceros e
as outras persoas antes que creou.
>> Por iso, considero este programa super sinxelo.
Foi da Semana 1.
El só dixo: Ola Mundo, na pantalla.
Nós rodamos este través Clang.
Ou corremos través Facer que tivo lugar Clang.
Se transmite no momento en que algúns ceros e uns.
Pero resulta que hai un paso intermedio.
Se eu pasar por aquí - oops, non quero velo aínda.
Se eu pasar por aquí para o meu dispositivo e eu abrir hello.c, aquí
é o mesmo programa.
E o que eu vou facer o meu terminal xanela é aquí que eu vou
realizar Clang ao contrario de facer, que automatizar as catro
estes pasos para nós.
E eu vou facer clang-S e entón hello.c e despois entrar.
>> E eu fico un prompt chiscando de novo, o que é bo.
E agora nunha fiestra un pouco maior, Vou abrir gedit aquí.
E eu vou abrir un arquivo que, Ocorre, chámase hello.s esta
que contén linguaxe assembly Me referín anteriormente.
E iso é o que se chama de montaxe lingua, nivel moi baixo
instrucións que o seu procesador Intel ou sexa o que sexa que está dentro
entende.
Mov e é para o movemento. chamada para chamando unha función de nivel moi baixo.
sub é para restar.
>> Entón, cando ten un determinado CPU dentro do seu ordenador, o que o fai
distintas, contra outro CPUs no mercado, é que as instrucións que
entende e moitas veces o quão eficaz el é, o quão rápido é a execución dalgúns
destas instrucións.
Agora, para saber máis sobre iso, pode que preto CS61 caída na facultade.
Pero aquí temos, por exemplo, algúns identificadores que pode parecer familiar.
ola.c é o nome do programa.
>> . Texto -
non hai moito interese alí agora, lembre que o texto
segmento, de luns, e cando en memoria do seu programa realmente acaba.
Entón é iso, polo menos vagamente familiarizado alí.
Aquí, por suposto, é unha mención da nosa función principal.
Desprazamento para abaixo, estes refírense a cousas chamados rexistros, moi pequenos anacos de
memoria dentro da súa CPU actual.
E se rodar mesmo Por outra banda, vexo algún tipo
mención indirecta de ASCII.
E hai, de feito, é que a cadea, Ola, coma mundo.
>> Así, longa historia curta, esta foi pasando para ti, automaticamente,
debaixo da capa de todo este tempo.
E o que está pasando realmente é xa executar Clang, ou por medio de
Faga, está quedando en primeiro lugar, a partir do código fonte, o
así chamado en linguaxe ensambladora.
Entón Clang é converter esta asemblea linguaxe de abaixo para ceros e uns.
E esta é a foto que comezamos nosa discusión a Semana 0 en -
e logo, nunha semana.
E entón, finalmente, os ceros e uns son combinados cos ceros e uns
a partir desas librerías que vimos tomar para concedida como defecto E / ou a
Biblioteca de corda ou mesmo a biblioteca de CS50.
>> Entón, para pintar o cadro máis visual, temos hello.c.
E, por suposto, utiliza o printf funciona a dicir, Ola mundo.
A etapa de compilación leva-lo ata o arquivo que acabamos de ver hello.s, aínda
A pesar de que é normalmente suprimido automaticamente para ti.
Pero este é o código de montaxe no paso de medio.
E entón, cando nos montes a montaxe linguaxe, por así dicir, que é cando
obter os ceros e uns.
Entón, temos ampliado de forma eficaz hoxe en o que temos que chegou a tomar para concedida,
significa pasar o código fonte do código obxecto.
>> Pero, finalmente, agora que mesmo cadro - imos empurra-la para
o lado esquerdo.
E teña en conta que na parte superior hai Mencionen stdio.h.
Isto é un arquivo que nós temos en case todos os
programas que escribiu.
E ese é o ficheiro cuxo contido Obter copia pegado,
eficazmente sobre o seu código.
Pero parece que, nun computador sistema en algún lugar, hai probablemente un
ficheiro stdio.c que alguén escribiu anos hai que aplica as
funcións que foron declaradas en stdio.h.
>> Agora, en realidade non é, probablemente, en Mac ou PC ou incluso no
CS50 aparello é un código C cru.
Alguén xa compilou e incluíu . O ficheiro de código obxecto ou. Unha
arquivo, que refírese a unha biblioteca compartida que foi pre-instalado e
precompilados para ti.
Pero supoña que hai de feito existe no noso stdio.c ordenador en paralelo
con Clang.
O seu código está a ser feita e montado.
código stdio.c 's está a ser compilado e montado, de xeito que este último
paso, aquí temos que dalgunha forma ligazón, por así dicir, os ceros e uns
con seus ceros e uns nunha programa sinxelo que finalmente se
Ola chamado só.
>> Así que esta é toda a maxia que se vén acontecendo ata agora.
E seguirá a tomar estes procesos de concesión, pero entender
hai unha morea de detalles suculentos suceder debaixo alí.
E iso é o que fai que o seu ordenador con Intel Inside
particularmente distinta.
>> Entón, con esta nota, se quere unirse a nós para o xantar deste venres, facer ir
ao lugar cs50.net/rsvp habitual, 13:15 deste venres.
E agora algúns anuncios.
Polo tanto, temos unha boa nova.
E nós temos unha mala noticia.
Comece unha boa noticia aquí.
>> [Xemendo]
>> Todo ben.
Ben, é tecnicamente unha festa, así non é tanto un agasallo de nós.
Pero, entón, a mala noticia é claro.
>> [Xemendo]
>> Pasei unha chea de tempo nestas animacións.
>> [Risas]
>> Haberá unha sesión de avaliación este próximo luns.
Estará en 5:30 PM.
Nós vos fará lembrar de todos estes detalles vía correo electrónico sobre o curso de
web en só un par de días.
Esta será filmado e facilitado pouco despois.
Entón, se non pode facer que o luns slot de noite, non se preocupe.
Seccións a próxima semana tamén concentrarse en revisión para o exame.
Se a súa sección é o luns, que é de feito vacacións da universidade, imos
aínda reunirse en sección.
Se simplemente non pode facelo sección, porque vai
de distancia, iso é bo.
Participar nunha sección de martes ou domingo ou Tune-se para a sección de Jason, que é
dispoñible en liña.
>> Así, unha mala noticia.
Así, de acordo co plan de estudos, temos charla o próximo venres.
Pero a boa nova -
claramente, eu pase moito tempo con iso.
>> [Risas]
>> Imos cancelar seguinte conferencias de venres.
Así que será un agasallo para nós, de xeito que Pode realmente ter un bo descanso en
entre esta semana e dúas semanas de aí.
Polo tanto, non conferencias a próxima semana, só unha pequena pouco quiz, para o que debe ser
ficando cada vez máis animado.
>> Entón, imos agora volver a nosa atención sobre algo que é realmente máis visual
e máis emocionante e para definir o estadio para o que vai estar no horizonte
en só un par de semanas.
Tras a primeira proba, imos converter o foco da nosa conxuntos de problemas a outro
problema específico do dominio, que de forense ou de seguridade en xeral.
>> En realidade, o tractor con este problema conxunto é para min un dos
ensinando compañeiro ou CAs para atravesar campus tirar algunhas fotos
identificables, pero non a xente obvias, lugares ou cousas, así que todo ano eu
de algunha maneira conseguen borrar accidentalmente ou danos na tarxeta multimedia dixital
que está dentro da nosa cámara.
Pero non é gran cousa.
I pode ir adiante e acenda que o meu ordenador.
Eu podo facer unha imaxe forense do mesmo, así para falar, copiando os ceros e
aqueles fóra do que a tarxeta de memoria, sexa é unha tarxeta SD ou tarxeta de memoria flash compacto ou
o que está familiarizado.
E entón podemos entregar iso.
>> E así o reto por diante, entre outros cousas para ti, será para escribir
Código C, que se recupera de unha chea de JPEGs para min e revelou será
estas persoas, lugares ou cousas.
E tamén vou falar, neste problema definir e nos días que virán, sobre
gráficos en xeral.
Usamos eles, un curso, para saír.
Pero especie de dato adquirido existe estas nocións de alto nivel
de rectángulos e ovais.
Pero debaixo do capó hai pixels.
E tiña que comezar pensar sobre iso.
Ou vai á p-set 4 ten que pensar sobre a diferenza entre os ladrillos, como
rápido está balón está movendo a través de a pantalla para saír.
Polo tanto, non hai esa noción de puntos na súa pantalla que se
entran en xogo xa.
>> Agora o que se ve, con todo, é o que chegar a unha pantalla de ordenador.
Se xa asistiu a algún ben ou TV malo, as posibilidades son eles practicamente
tratar o público como technophobes que realmente non
sei moito sobre informática.
E por iso é moi fácil para a policía detective para dicir, non é
limpar isto para min?
Ou mellorar, non?
Mellorar e como a palabra de moda en máis calquera programa relacionado crime.
E a realidade é que se levar moito imaxe borrada dun sospeitoso de facer
algo malo, non pode só melloralo.
Non pode ampliar infinitamente.
Non pode ver o brillo de alguén da ollo que cometeu que
determinado crime, a pesar da prevalencia desta na TV.
>> E así, con que imos motivar que seguinte conxunto de problemas con un reflexo
algúns concertos co que pode estar familiarizado.
>> [REPRODUCIÓN]
>> -Aceptar.
Agora, imos dar unha boa ollada en ti.
>> -Espera.
Correr de volta.
>> -Agarde un minuto.
Desprácese á dereita.
>> -Non.
Conxelar iso.
>> Pantalla completa.
>> -Aceptar.
Conxelar iso.
>> Presione-se sobre iso, si?
>> -Vector na nesa cara pola roda traseira.
>> -Zoom en dereito aquí neste lugar.
>> -Co equipo certo, a fotografada pode ser máis grande e afiadas.
>> -Que é iso?
>> -É un programa de mellora.
>> -Podes aclarar iso calquera?
>> -Non o sei.
Imos melloralo.
>> Sección A-6-Enhancer.
>> -Eu aumentei os detalles e -
>> -Creo que é suficiente para mellorar.
Libera-lo para a miña pantalla.
>> -Mellorar a reflexión nos seus ollos.
>> -Imos facelo a través de perfeccionamento de vídeo.
>> -Edgar, pode mellorar isto?
>> -Manteña-se.
>> -Teño benvida a traballar sobre esta reflexión.
>> -Alguén reflexión de.
>> -Reflexión.
>> -Hai unha reflexión da cara do home.
>> -A reflexión.
>> -Hai unha reflexión.
>> -Dun zoom no espello.
>> -Podes ver unha reflexión.
>> -Pode mellorar a imaxe a partir de aquí?
>> -Pode aumentar el aquí?
>> -Pode mellora-lo?
>> -Podemos mellorar isto?
>> -Pode mellora-lo?
>> -Espera un segundo, eu vou mellorar.
>> -Zoom na porta.
>> -X10.
>> -Zoom.
>> [Risas]
>> -Move-se dentro
>> -Espere, pare.
>> -Deter.
>> -Pausa-lo.
>> Xirar en torno de 75 graos por favor, a vertical.
>> [Risas]
>> -Pare, e de volta para a parte sobre a porta de novo.
>> -Ten un intensificador de imaxe que pode bitmap?
>> -Quizais poidamos utilizar o Pradeep Sen método para ver nas fiestras.
>> -Esta aplicación é o estado da arte.
>> -O valor icona está desactivado.
>> -Coa combinación certa de algoritmos.
>> -El levou algoritmos de iluminación para o seguinte nivel e podo usalos para
mellorar esta foto.
>> -Lock e ampliar o eixo z.
>> -Mellorar.
>> Conxelación e mellorar.
>> [FIN reprodución de vídeo]
>> DAVID J. Malan: Entón Set Problem 5 é o que está por chegar alí.
Entón, imos en breve ter unha mellor comprensión de cando e por que se pode
ea nosa non pode mellorar nese sentido.
Pero, primeiro, imos voltar a nosa atención para algúns dos bloques de construción imos
que ser capaz de contar esta historia.
>> Entón, lembro que tirei esta foto en Luns e algo a semana pasada.
E iso describe o esquema das cousas na memoria do seu ordenador cando
execución dalgún programa.
O segmento de tecnoloxía encima, aviso, refírese a para os ceros e uns reais
que compoñen o programa.
Hai, a continuación, algúns inicializar ou datos non inicializados, que normalmente
refírese a cousas como constantes ou cadeas ou variables globais que teñen
previamente declarado.
Hai a pila, pero nós imos chegar de volta para que de aquí a pouco.
>> E despois hai a pila.
Moi parecido a unha pila de bandexas no cafetería, este é o lugar onde a memoria queda
en capas e capas sempre fai o que nun programa?
Cal é o uso de pila para?
>> Si?
>> Chamada de función.
Cada vez que chamar a unha función, é dato ao anaco de memoria para a súa
variables locais ou os seus parámetros.
E pictoricamente vemos que cada Función chamada sucesiva, cando a
chamadas B chama C chamadas D, eles se en capas na pila.
E dentro de cada unha das devanditas franxas de memoria é esencialmente unha extensión única
para esa función, o que, evidentemente, é problemático se quere entregar
a partir dunha función a outra Unha peza de datos que queres que
para Mutare ou cambiar.
>> Entón, cal foi a nosa solución de posibilitar Unha función representada por unha pila
marco para cambiar a memoria dentro doutro cadro de pila?
Como os dous falan un ao outro?
Así, a través de punteiros ou enderezos, que, de novo, só describir o lugar onde en
memoria, a través dun específico número mordida, o particular
valor se pode atopar.
Entón lembro da última vez tamén seguimos a historia e mirou a
moi programa de buggy.
E este programa é buggy para poucos motivos, pero o máis preocupante é
porque non pode comprobar o que?
>> Si, non pode verificar a entrada.
Sentímolo?
>> De ser máis de 12 caracteres.
Entón, moi esperta, ao chamar memcopy, que, como o nome indica, só
memoria copias do seu segundo argumento no seu primeiro argumento.
O terceiro argumento, moi esperta, é Comprobarase para asegurarse de que non
copiar máis que, neste caso, a lonxitude de bar, número de caracteres,
ao destino, o que é isto serie C. Pero o problema é que o que
a propia C non é grande abondo para tratar con isto?
Vai pegar o número de bytes que xa foi dado.
Pero o que realmente ten máis bytes que ten espazo para?
>> Ben, este programa moi tolamente só cegamente pasa a ter todo o que é
dado, Ola barra invertida é 0 óptimo se cadea é curto
suficiente, como cinco caracteres.
Pero se é realmente 12 caracteres ou 1200 caracteres, vimos a última vez
que está indo só para totalmente sobreescribir a memoria que
non pertence a vostede.
E o peor caso, se substituír este parte vermella alí que chamamos
enderezo do remitente -
iso é só onde o ordenador automaticamente, para vostede, por tras da
escenas, pregos de distancia un valor de 32 bits que lembra-lo ao enderezo que debería
volver cando foo, esta outra función, está feito de execución.
É unha migas de pan de tipo ao cal ela retorna.
Se substituír o que, potencialmente, se é o cara mal, pode podería
potencialmente asumir ordenador de alguén.
E vai certamente lanzalo na maioría dos casos.
>> Agora, este problema só foi agravado como comezamos a falar sobre a memoria
xestión en xeral.
E malloc, a distribución de memoria, é unha función que podemos utilizar para reservar
memoria cando non se sabe con antelación que pode ter algún.
Así, por exemplo, se eu volver para o dispositivo aquí.
E eu abrir a partir do último hello2.c tempo, recordar este programa, que parecía
un pouco algo así, só tres liñas -
indicar o seu nome, nome cadea, na parte esquerda, é igual a getstring.
E, entón, imprimir-lo, o nome do usuario.
>> Polo tanto, este era un super programa sinxelo.
Para ser claro, déixeme ir adiante e make Ola-2.
Vou facer o punto barra Ola-2.
Diga o seu nome -
David.
Intro.
Ola David.
Parece que funciona OK.
Pero o que realmente está a suceder baixo capo aquí?
Primeiro imos pelar algunhas capas.
Cadea é só un sinónimo temos entender para que?
Estrela Char.
Entón, imos facelo un pouco máis escuro pero técnicamente máis correcto que este
é unha estrela char, o que significa que nome, si, é unha variable.
Pero o que almacena o nome é o enderezo de un char, que se sente un pouco raro
por que eu estou a recibir de volta unha cadea.
Estou volvendo múltiple caracteres non un char.
>> Pero, por suposto, só precisa do primeiro enderezo do char para lembrar de onde o
corda toda é porque por que?
Como descubrir onde está o fin do a cadea é saber o comezo?
A barra invertida cero.
Así, con esas dúas pistas que descubrir antes do comezo e fin da
calquera secuencia son, con tal de que son formada adecuadamente que null
terminador, que invertida cero.
>> Pero iso está chamado getstring.
E verifícase que getstring todo este tempo foi unha especie de
trampas para nós.
Vén facendo este traballo, con certeza, recibindo unha cadea do usuario.
Pero onde é que a memoria vindo?
Se volvemos para a imaxe aquí e aplicar a definición de só un
hai pouco, que a pila é onde memoria ocorre cando as funcións son chamadas,
por esa lóxica, cando chama getstring, e entón eu escribir
D-V bis-I-D Intro, en que é D-A-V-I-D barra invertida a cero almacenado, con base no
historia que nos dixo ata agora?
>> Parece estar en a pila, non?
Cando liga para obter corda ten un pequeno anaco de memoria na pila.
Entón, é lóxico que a D-A-V-I-D invertida cero almacénase
existe na pila.
Pero agarde un minuto, getString retorno esta secuencia, por así dicir, o que significa
é bandexa de cafetería é eliminado da pila.
E dixen a última vez que tan pronto a función retorna, e ter que
taboleiro, por así dicir, fóra da pila, o que pode asumir sobre os restos
que a memoria?
Eu medio que redesenhou os como puntos de interrogación porque efectivamente facer
valores descoñecidos.
Poden ser reutilizados cando algúns seguinte función é chamada.
>> Noutras palabras, se ocorrer o almacenamento -
Vou sacar unha foto rápida aquí do conxunto.
Se ocorrer de estar chegando ao fondo do meu segmento de memoria, e imos dicir
que este é o lugar de memoria ocupado polo principal e quizais arg C e
arg v e calquera outra cousa no programa, getstring cando se chama,
presuntamente getstring queda un bloque de memoria aquí.
E entón D-A-V-I-D dalgún xeito remata nesta función.
E eu vou simplificar.
Pero imos supoñer que o D-A-V-I-D barra invertida cero.
Entón iso moitos bytes se usan en o cadro para getstring.
>> Pero tan pronto volve getString, nos dixo a última vez que esa memoria sobre
aquí todo se fai - Woops! -
todo se fai efectivamente eliminados.
E podemos pensar niso agora como tema marcas porque quen sabe
o que vai facer-se de que a memoria.
En realidade, eu moitas veces chamar funcións agás getstring.
E así que eu chamo algún outro función de getstring, quizais non en
este programa específico que só mirou pero nalgúns outros, certamente algunha outra
función pode acabar sendo dado este punto seguinte na pila.
>> Polo tanto, non pode ser que as tendas getString D-A-V-I-D na pila, porque eu faría
inmediatamente perder acceso a ela.
Pero sabemos que getString só devolve o que?
Non está volvendo a me seis caracteres.
Que realmente volvendo conclúese que a última vez?
O enderezo do primeiro.
Entón, dalgunha forma, cando chamou getstring, é reservar un bloque de memoria para
a corda que o tipo e os usuarios enderezo, a continuación, regresar a ela.
E verifícase que cando quere funciona para reservar memoria neste
camiño e volver para a persoa que chamou esta función, o enderezo
que pedazo de memoria, é absolutamente non pode poñelas na pila no
baixo, porque funcionalmente é só vai facer o seu moi
rapidamente, así que pode ser difícil de adiviñar onde estamos indo probablemente para lanzalo
no seu lugar, a chamada pila.
>> Así, entre o fondo da súa memoria de esquema e do alto da súa memoria do
disposición son unha morea de segmentos.
Unha delas é a pila, e á dereita anterior, é o heap.
E pila é só unha peza diferente de memoria que non se usa para funcións
cando son chamados.
Tamén se usa para a memoria a longo prazo, cando quere unha función para incorporarse algúns
memoria e ser capaz de seguro-la sen perder o control sobre el.
>> Agora podería quizais inmediatamente ver que esta non é
necesariamente un deseño perfecto.
Tal como o seu programa de memoria alocada en a pila, ou como vostedes chaman máis e
máis funcións, ou como reservar memoria na pila con malloc fóra como
getstring está facendo, o que claramente parece ser problema inevitable?
>> Correcto.
Como o feito de que estas frechas están apuntando un para o outro
non augura nada bo.
E, de feito, poderíamos bater moi rápido un programa en calquera número de formas.
En realidade, eu creo que pode ter accidentalmente unha vez feito isto.
Ou se non, imos facelo deliberadamente agora.
Déixeme ir adiante e escribir super-rápida un programa chamado dontdothis.c.
E agora eu vou entrar aquí e non afiada incluír stdio.h.
Imos declarar a función foo leva Sen argumentos, o que é
denotado como ben por nula.
>> E o único foo vai facer é chamada foo, o que probablemente non é o
máis intelixente idea, pero que así sexa.
Ent void main.
Agora o único principal que vai que facer é chamar foo ben.
E, só por diversión, eu vou adiante e dicir printf "Ola dende
foo ".
>> Aceptar.
Entón, se eu non cometer erros, Fai dontdothis dot barra.
E imos facelo nunha fiestra maior -
dot slash, dontdothis.
Imos.
Uh oh.
Ao parecer, pode facelo.
Drogas.
Aceptar.
Espera.
Stand by.
Será que nós -
Fixemos usalo con Make.
>> [Suspira]
>> Eu sei, pero eu creo que nós Acaba de eliminar iso.
Uh, si.
Drogas.
Resolva este Rob.
O que?
É moi sinxelo.
Si, volvemos a optimización off.
OK, stand bye.
Agora síntome mellor.
Aceptar.
Todo ben.
>> Entón, imos recompilar iso -
Faga vostede dontdothis.
Pode ter que cambiar o nome deste para dothis.c en só un momento.
Alí imos nós.
Grazas.
Aceptar.
Así, o feito de que eu estaba imprimindo algo se realmente só
retardando o proceso polo cal nós chegaría a ese punto.
Aceptar.
Uf!
>> Entón, o que está realmente a suceder?
A razón alí, así como un aparte, é facer calquera cousa en canto a entrada e
produción tende a ser máis lento, porque Ten que escribir caracteres ao
pantalla, ten que rodar.
Así, longa historia curta, eu tiña realmente Pasou tan impaciente, teriamos
vin ese resultado final tamén.
Agora que eu teño paseo dos print emerxentes, Vemo-lo inmediatamente.
Entón, por que isto está a suceder.
Pois ben, a explicación simple, claro, foo é que probablemente non debería
ser que se autodenomina.
>> Agora, en termos xerais, esta é a recursividade.
E nós cremos que algunhas semanas atrás recursiva é bo.
Recursividade é desa forma máxica de expresar-se de super sucinta.
E el simplemente funciona.
Pero hai unha característica fundamental de todos os programas recursivos con quen falamos
preto e mirou, ata agora, o que era que eles tiñan o que?
Un caso base, que era un pouco difícil Coded caso de que o referido en algunhas situacións
non chamar foo, o que é claramente non é o caso aquí.
>> Entón, o que está realmente a suceder en termos de esta imaxe?
Ben, cando principal chámase foo, que recibe unha porción de memoria.
Cando chama foo foo, el está unha porción de memoria.
Cando chama foo foo, el recibe unha porción.
Ela recibe unha porción.
Por foo nunca está volvendo.
Nunca está apagando un destes cadros da pila.
Entón, nós estamos golpe a través do conxunto, non mencionar quen sabe o que máis, e
estamos superando os límites do noso o chamado segmento de memoria.
Erro ir segmentación falsa.
>> Polo tanto, a solución hai claramente, non fagas iso.
Pero a maior implicación é que, si, non é absolutamente un límite,
mesmo se non está ben definido, o xeito no que moitas funcións que pode chamar dunha
programa, as veces unha función pode chamar a si mesma.
Así, aínda que fixemos predicar recursão como esa cousa máxica potencialmente un
par de semanas ao sigma función, e cando teñamos os datos
estruturas e CS50, verá outro aplicacións para el, non é
necesariamente o mellor.
Porque se unha función chama a si mesmo, chama-se, mesmo se non hai unha base
caso, se non acertar que no caso de base para 1.000 chamadas ou 10.000 chamadas, por
que o tempo que pode ter executado fóra da sala no seu chamado pila e éxito
algúns outros segmentos de memoria.
Por iso, tamén é un proxecto de trade-off entre elegancia e entre
robustez do seu especial implementación.
>> Polo tanto, non hai outra desvantaxe ou Outra pegadinha co que temos
está a facer ata agora.
Cando chamei getstring -
déixeme volver en Ola-2.
Repare que eu estou chamando getstring, que está retornando un enderezo.
E afirmamos onte que a dirección é dende o heap.
E agora estou imprimindo a cadea nese enderezo.
Pero nós nunca chamou a contrario getstring.
Nós nunca tivemos a calll unha función como ungetstring, onde a man de novo
esta memoria.
Pero, francamente, nós probablemente debería ser.
Porque se segue preguntando o ordenador para a memoria, a través de alguén como
getstring pero nunca devolve-lo, con certeza iso tamén está obrigado a levar a
problemas en que corremos de memoria.
>> E, de feito, podemos ollar para estes problemas coa nova ferramenta, cuxo uso
é un pouco enigmático para escribir.
Pero déixeme ir adiante e peirao-se na pantalla en só un momento.
Eu estou indo a ir adiante e executar Valgrind co parámetro cuxo primeiro mando
argumento de liña é o nome dese programa Ola-2.
E, por desgraza, é saída é atrozmente
complexo sen unha boa razón.
Así, podemos ver toda esa confusión.
David é expoñer o meu nome.
Entón este é o programa realmente funciona.
E agora temos esta saída.
>> Entón Valgrind é semellante en espírito de GDB.
Non é un depurador per se.
Pero é un verificador de memoria.
É un programa que vai realizar o seu programar e dicirlle se preguntase a un
ordenador para a memoria e nunca entregou cara atrás, é dicir, así que ten
un escape de memoria.
Correo perdas de memoria tenden a ser malo.
E é que os usuarios de computadores teñen probablemente sentiu tanto, se ten un
Mac ou PC.
Algunha vez xa usou o ordenador para tempo e non reiniciar en varios
días, ou só ten unha morea de programas en execución, ea cousa maldita
desacelera a unha parada, ou polo menos é super aburrido de usar, porque
todo quedou super lento.
>> Agora que pode ser calquera número de razóns.
Podería ser un loop infinito, un erro no código de alguén, ou, máis simplemente,
pode significar que está a usar máis memoria, ou intentar, que o seu
ordenador realmente ten.
E quizais hai un erro en algún programa que sigo a preguntar para a memoria.
Navegadores hai anos eran notorios por este, pedindo máis e máis memoria
pero nunca entrega-lo de volta.
Por suposto, se ten só un finito cantidade de memoria, non se pode pedir
infinitamente moitas veces para algunha desa memoria.
>> E así, o que ve aquí, aínda que de novo a saída do Valgrind é
innecesariamente complexo para mirar en primeiro lugar, esta é a parte interesante.
Heap -
en uso na saída.
Entón aquí é o que de memoria foi en uso na pila no
tempo meu programa saíu -
parecer seis bytes nun bloque.
Entón eu vou para acenar as mans en que un bloque é.
Pense que é só unha peza, un máis palabra técnica para peza.
Pero seis bytes -
cales son os seis bytes que aínda estaban en uso?
>> Exactamente.
D-A-V-I-D barra invertida cero, cinco letras nome máis o terminador nulo.
Polo tanto, este programa Valgrind notado que eu preguntou por seis bytes parecer por
forma getstring, pero nunca deulles de volta.
E, de feito, iso non pode ser así evidente, se o meu programa non é tres
liñas, pero é 300 liñas.
Así, podemos realmente dar outro comando argumento de liña de Valgrind para
facelo máis detallado.
É un pouco aburrido para lembrar.
Pero se eu fai -
imos ver.
Escape -
Foi el baleirar -
aínda que eu non me lembro o que é fóra de man.
>> - Baleirado de verificación é igual a integral.
Si, grazas.
- Baleirado de verificación é igual a integral.
Intro.
Mesmo programa está a ser executado.
Introduza David de novo.
Agora vexo un pouco máis detalladamente.
Pero a continuación o resumo do heap, que é idéntica á de catro - ah,
iso é ben legal.
Agora Valgrind está realmente a buscar un pouco máis no meu código.
E está dicindo que, ao parecer, malloc en liña -
que diminuír o zoom.
En liña -
non vemos que liña é.
Pero malloc é o primeiro culpable.
Hai un blog en malloc.
>> Todo ben?
OK, non.
Non?
Liguei getString.
getstring parecer chámase malloc.
Entón, cal liña de código é, ao parecer, a culpa por ter
alocados esta memoria?
Imos supor que quen escribiu malloc foi en torno de tempo suficiente para que sexa
non é culpa deles.
Por iso, é probablemente a miña.
getString en cs50.c - o que é unha arquivo en algún lugar no ordenador -
na liña 286 parece ser o culpable.
Agora imos supor que CS50 foi en torno a cantidade razoable de tempo, entón
nós tamén somos infalibles.
E por iso non é, probablemente, en getString que o erro se atopa, senón en
Ola liña-2.c 18.
>> Entón, imos dar un ollo o que que a liña 18 era.
Oh
Dalgún xeito, esta liña non é necesariamente cesta, por si só, pero é a razón
detrás dese escape de memoria.
Tan super sinxelo, o que faría intuitivamente ser a solución aquí?
Se estamos pedindo á memoria, nunca foron dándolle de volta, o que parece ser un
problema, porque co paso do tempo o meu ordenador pode quedar sen memoria, pode diminuír
abaixo, cousas malas poden ocorrer, así, cal é a solución sinxela e intuitiva?
Só ten que darlle de volta.
>> Como liberar esa memoria?
Ben, por sorte, é moi sinxelo só para dicir o nome libre.
E nós nunca fixen iso antes.
Pero pode pensar esencialmente de libre como o contrario do malloc.
libre é o contrario do distribución de memoria.
Entón, agora déixeme recompilar iso.
Fai Ola-2.
Déixeme executa-lo de novo. Ola-2 David.
Así, parece que traballar exactamente da mesma maneira.
Pero se eu volver a Valgrind e re-executar ese mesmo mando no meu recén
compilado programa, escribindo no meu nome como antes -
Niza.
Resumo Heap -
en uso na saída -
cero bytes, en bloques cero.
E iso é super legal, todo bloques de pila foron liberados.
Sen perdas son posibles.
>> Entón, chegando a ser, non con Problema Set 4, pero con Problem Set 5, as forense
e para adiante, iso tamén vai facer un medida da xustiza de súa
programa, se ten ou non ou non ten perdas de memoria.
Pero, por sorte, non só pode razoar a través deles, intuitivamente, que
é, sen dúbida, máis doado para pequenos programas pero máis difícil para programas grandes,
Valgrind, para estes programas máis grandes, pode axudar a identificar
o problema particular.
>> Pero hai outro problema que poida xurdir.
Déixeme abrir este ficheiro aquí, que é, unha vez máis, un exemplo un tanto simple.
Pero imos concentrar no que este programa fai.
Isto chámase memory.c.
Imos publicar máis tarde hoxe no zip do código fonte de hoxe.
E noten que eu teño unha función chamada f que non recibe argumentos e
devolve nada.
Na liña 20, estou parecer declarar unha punteiro para un int e chamando-x.
Estou atribuíndo é o regreso valor de malloc.
E só para quedar claro, cantos bytes son Eu probablemente volvendo de malloc
nesta situación?
>> Probablemente 40.
Onde tirou iso?
Ben, se se lembra que un int é moitas veces 4 bytes, polo menos é na
aparello, 10 veces 4 é, obviamente, 40.
Entón malloc está retornando un enderezo de un bloque de memoria e almacenamento que
resolver en última instancia, x.
Entón, para ser claro, o que entón está a suceder?
Ben, deixe-me volver a nosa imaxe aquí.
Deixe-me só sacar do fondo do meu memoria do ordenador, déixeme ir adiante e
aproveitar todo o rectángulo que representa toda a miña RAM.
>> Digamos que a pila É na parte inferior.
E hai un segmento de texto en os datos non inicializados.
Pero eu só vou abstracto, aquelas outras cousas como punto de distancia, dot dot.
Eu estou indo só para referirse a este como a pila na parte superior.
E, a continuación, na parte inferior da imaxe, para representar o principal, eu vou
para darlle unha memoria franxas na pila.
Para f, eu vou darlle unha porción de memoria na pila.
Agora eu teño que consultar o meu código fonte novo.
Cales son as variables locais para o principal?
Aparentemente nada, entón esa porción é efectivamente baleiro ou nin tan grande
como eu deseño iso.
Pero, en f, eu teño unha variable local, que se chama de x.
Entón, eu estou indo a ir adiante e dar f un bloque de memoria, chamándoo x.
>> E agora malloc de 10 veces 4, Entón malloc 40, onde está o
memoria vén?
Nós non temos sacado unha foto coma este antes.
Pero imos supor que é efectivamente está aquí, entón un,
dous, tres, catro, cinco.
E agora eu teño 40 deles.
Entón eu vou facer punto, punto, punto de suxerir que hai aínda máis memoria
volvendo do heap.
Agora, cal é o enderezo?
Imos escoller o noso arbitraria abordar como sempre -
Ox123, aínda que el probabelmente vai ser algo completamente diferente.
Este é o enderezo do primeiro byte no memoria que eu estou pedindo para malloc.
>> Así, en breve, xa que a liña 20 é executada, o que é literalmente
almacenado dentro de x aquí?
Ox123.
E o boi é desinteressante.
Significa só que aquí está un número hexadecimal.
Pero o que é fundamental é que o que eu teño tenda en x, o que é unha variable local.
Pero o seu tipo de datos, unha vez máis, é un enderezo dun int.
Ben, eu estou indo para almacenar Ox123.
Pero, de novo, se isto é un pouco máis innecesariamente complicado, se eu rolar
cara atrás, podemos abstraerse esta moi lonxe razoable e só dicir que x é un
punteiro para este anaco de memoria.
>> Aceptar.
Agora, a cuestión en apreciado é o seguinte -
liña 21, ao parecer, é buggy.
Por que?
>> Sentímolo?
El non ten -
dicir que unha vez máis.
Ben, iso non acontece balde.
Entón ese é o segundo, pero.
Polo tanto, hai outro, pero especialmente na liña 21.
>> Exactamente.
Este simple liña de código é só unha buffer overflow, unha saturación de buffer.
Un buffer significa só un anaco da memoria.
Pero ese pedazo de memoria é de tamaño 10, 10 enteiros, o que significa que se
índice nel usar o azucre sintático de notación de matriz, a praza
parénteses, ten acceso a x soporte 0 x soporte 1 x,
soporte de punto, punto, punto.
x soporte 9 é o maior deles.
Entón, se eu fai x soporte de 10, onde En realidade, estou indo na memoria?
>> Ben, se eu tivera 10 int -
imos realmente sacar todo destes aquí.
Entón, esta foi a primeira de cinco anos.
Aquí están os outros cinco enteiros.
Entón x 0 soporte está aquí. x soporte 1 é aquí. x soporte 9 é aquí. x soporte
10 está aquí, o que significa que eu estou dicindo, na liña 21, o ordenador de inserir a
número para onde?
O número 0 para onde?
Ben, é 0, si.
Pero só o feito de que a súa 0 é unha especie de coincidencia.
Podería ser o número 50, para todos nós nos importa.
Pero estamos intentando poñelas no soporte x 10, que é o lugar onde esta
punto de interrogação é elaborada, que non é unha cousa boa.
Este programa pode moi ben falla como resultado.
>> Agora, imos adiante e ver se isto é, en realidade, o que pasa.
Facer memoria, xa que o arquivo chámase memory.c.
Imos adiante e executar a memoria do programa.
Entón, tivemos moita sorte, en realidade, ao parecer.
Tivemos sorte.
Pero imos ver se agora executar Valgrind.
A primeira vista, o meu programa pode parece ser perfectamente correcto.
Pero déixeme executar Valgrind co - Baleirado de verificación é igual a plena memoria.
>> E agora, cando executar este -
interesante.
Incorrecto escribir de tamaño 4 a liña 21 do memory.c.
Liña 21 do memory.c é cal?
Oh, interesante.
Pero espera.
Tamaño 4, que é o que se refire?
Eu só fixen unha gravación, pero é do tamaño 4.
Por que é 4?
É porque é un int, que é, de novo, catro bytes.
Entón Valgrind atopado un erro que eu, mirando para o meu código, non o fixeron.
E quizais o TF ía ou non.
Pero o que Valgrind seguramente descubriu que fixemos un erro alí, aínda
aínda que tivemos moita sorte, eo ordenador decidiu, eh, eu non vou fallar
só porque tocou un byte, unha o valor do int de memoria que non fixo
realmente posúe.
>> Ben, o que máis é buggy aquí.
Dirección -
este é un enderezo de vista tolo en hexadecimal.
Isto significa só que en algún lugar na pila é cero bytes despois dun bloque de tamaño 40
é asignado.
Déixeme afastar aquí para ver se iso é un pouco máis útil.
Interesante.
40 bytes son definitivamente perdidos no rexistro de unha perda de 1.
De novo, máis palabras que é útil aquí.
Pero, con base nas liñas destacadas, onde eu debería centrar o meu
atención a outro erro?
Parece que a liña 20 do memory.c.
>> Entón, se nós voltar á liña 20, que é o aquel que identificou previamente.
E iso non é necesariamente buggy.
Pero nós temos este inverteu seus efectos.
Entón, como fago para corrixir polo menos un deses erros?
O que eu podería facer despois liña 21?
Podería facer libre de x, polo que é para darlle a volta esa memoria.
E como fago para corrixir este erro?
Eu sempre debería ir máis lonxe do que 0.
Entón deixe-me probar e re-executar esta.
Sentímolo, definitivamente non máis que 9.
Facer memoria.
Déixeme reprise Valgrind nunha xanela máis grande.
E agora mire.
Niza.
Todos os bloques de heap foron liberados.
Sen perdas son posibles.
E alí enriba aquí, non hai ningunha mención máis do dereito válido.
>> Só para estar ganancioso, e imos ver se outra demostración
non vai tan desexado -
Tiven a sorte de un momento atrás.
E o feito de que este é 0 é posible innecesariamente enganosa.
Imos facer 50 anos, un tanto arbitraria número, facer memoria memoria dot slash -
aínda ter sorte.
Nada está fallando.
Supoñamos que eu simplemente facer algo realmente tolo, e eu fago 100.
Déixeme refacer a memoria, dot memoria slash -
tivo sorte de novo.
Como preto de 1000?
ints ademais de, aproximadamente, onde eu debería estar?
Facer memoria -
caramba.
>> [Risas]
>> Aceptar.
Non imos xogar máis.
Reprise de memoria.
Alí imos nós.
Todo ben.
Entón, ao parecer, ten índice 100.000 ints ademais de onde debería ser en
memoria, cousas malas suceden.
Así, este non é obviamente , Unha regra rápida duro.
Eu era unha especie de utilizar xuízo e erro para chegar alí.
Pero iso é porque, longa historia curta, memoria do ordenador tamén está dividido
para estes segmentos chamados cousas.
E, ás veces, o ordenador de verdade deulle un pouco máis de memoria
do que pedir.
Pero, para a eficiencia, é só máis fácil máis memoria, pero só dicirlle
que está a recibir unha parte del.
>> E se tes sorte, ás veces, polo tanto, pode ser capaz de tocar
memoria que non pertence a vostede.
Non ten ningunha garantía de que o valor pór alí vai estar alí, porque
o equipo aínda pensa que non é seu, pero non é necesariamente vai
para acadar outro segmento de memoria no ordenador e inducir a un erro como
este aquí.
Todo ben.
Todas as preguntas, a continuación, sobre a memoria?
>> Todo ben.
Imos dar un ollo aquí, entón, a algo que vimos tomar para
concedido por algún tempo, o que É neste arquivo chamado cs50.h.
Polo tanto, este é un.
Estes son só unha banda enteiro dos comentarios enriba.
E pode ter ollo para iso vostede remexia no aparello.
Pero parece que o tempo, cando nós costumávamos usar cadea como un
sinónimo, o medio polo cal declaramos que era sinónimo con esta
contrasinal typedef, a definición do tipo.
E nós estamos dicindo esencialmente, facer amarre un sinónimo para a estrela de char.
Que os medios polos que a pila creou esas Rodas pequenas coñecidas como
a cadea.
>> Agora aquí é só un prototipo para getchar.
Poderiamos telo visto antes, pero que é en realidade o que fai. getchar
non ten argumentos, retorna un char.
GetDouble non ten argumentos, retorna un double.
GetFloat non recibe argumentos, regresa unha boia, e así por diante.
getInt está aquí. getlonglong é aquí.
E getstring está aquí.
E é iso.
Esta liña roxa é outro pre-procesador Directiva por mor do
hashtag no inicio da mesma.
>> Todo ben.
Entón, agora déixeme entrar cs50.c.
E non imos falar moito sobre iso.
Pero para darlle un reflexo do que está ven a suceder todo isto
tempo, déixeme ir -
imos facer getchar.
Entón getchar é máis comentarios.
Pero parece que iso.
Polo tanto, esta é a función real getchar que fomos
tendo por seguro existe.
E aínda que non use este que, moitas veces, se algunha vez, polo menos
relativamente simple.
Entón, paga a pena dar unha rápida ollada aquí.
>> Entón getchar ten un loop infinito, deliberadamente de xeito aparentemente.
Logo chama - e este é un tipo de bo reutilización de código que nos escribiu.
El chama getstring.
Porque o que fai significa obter un char?
Ben, así como pode tentar obter unha liña enteira de texto do usuario e
a continuación, pode ollar a un destes caracteres.
Na liña 60, aquí está un pouco pouco máis de unha proba de sanidade.
Se getstring regresou nulo, Non imos continuar.
Algo deu mal.
>> Agora, iso é un pouco aburrido, pero convencional en C. carbonizar max probablemente
o que representa só con base no seu nome?
É unha constante.
É coma se o valor numérico do maior de char pode representar con
unha mordida, o que probablemente é o número 255, que é o maior número que
representan oito bits, desde cero.
Entón eu usar isto, nesta función, cando escribir este código, só porque
se algo sae mal en getchar pero o seu propósito na vida é volver
char, ten que de algunha maneira poder para sinalizar ao usuario que
algo deu mal.
Non podemos volver nulo.
Acontece que nulo é un punteiro.
E, de novo, getchar ten para voltar un char.
>> Así, o convenio, se algo der mal, é vostede, o programador, ou en
Neste caso, me coa biblioteca, eu tiven a só decidir arbitrariamente, se
algo sae mal, eu vou voltar o número 255, o que é verdadeiramente
quere dicir que non pode, o usuario non pode escribir o caracter representado pola
número 255, porque tivemos un roubalo como o chamado valor de sentinela para
representar un problema.
Agora descóbrese que o carácter 255 non é algo que podes escribir no
teclado, polo que non é gran cousa.
O usuario non entende que Eu roubei ese personaxe.
Pero se xa viu nas páxinas de home nunha sistema informático algunha referencia a un
todas as tapas constante como este que di: en casos de erro esta forza constante
ser devolto, iso é todo que algún ser humano fixo anos, se decidiu arbitrariamente
voltar ese valor especial e chamalo dunha constante no caso
algo sae mal.
>> Agora a maxia pasa por aquí.
En primeiro lugar, eu estou declarando na liña 67 dous personaxes, C1 e C2.
E entón, en liña 68, hai realmente unha liña de código que é unha reminiscencia de
noso amigo printf, xa que ten por cento Cs entre comiñas.
Pero teña en conta o que está pasando aquí. sscanf significa pescudas cadea -
significa dixitalizar un formato cadea, sscanf ergo.
O que significa isto?
Isto significa que pasa para sscanf unha cadea.
E liña é o que o usuario escribe Pol
Vostede pasa a sscanf unha secuencia de formato como iso é o que di a scanf cales son
Está esperando que o usuario teña escrito dentro
Vostede, entón, pasar connosco os enderezos de dous anacos de memoria, neste caso,
porque eu teño dous espazos reservados.
Entón eu vou darlle o enderezo de C1 e o enderezo de C2.
>> E lembrar que dá en función da dirección dalgunha variable, o que é
a implicación?
O que pode facer esa función, como resultado de darlle a dirección dun
variable, pola contra a propia variable?
Pode cambia-lo, non?
Se tivese alguén un mapa para a física dirección, poden ir alí e facer
o que queren nese enderezo.
A mesma idea aquí.
Se pasamos a sscanf, a dirección de dous anacos de memoria, mesmo estes pequenos
pequenos anacos de memoria, C1 e C2, pero dicimos que a dirección deles,
sscanf pode cambialo.
>> Así, o propósito de sscanf na vida, se Lerma a páxina principal, é ler o que o
usuario inseriu, esperanza para que o usuario teña escritas nun personaxe e quizais
outro personaxe, e todo o que o usuario ingresaran, o primeiro personaxe vai
aquí, o segundo personaxe vai aquí.
Agora, como un aparte, iso, e se fose só sei que a partir da documentación,
o feito de eu poñer un espazo en branco alí Significa só que eu non me importa se
o usuario preme a barra de espazo un pouco veces antes de que el ou ela ten un
personaxe, eu vou pasar por alto calquera espazo en branco.
De xeito que, sei que dende a documentación.
>> O feito de que hai unha segunda% c seguido de espazo en branco é realmente
deliberada.
Eu quero ser capaz de detectar se o usuario asneira ou non cooperar.
Entón, eu estou esperando que o usuario só ingresaran nun personaxe, polo tanto, eu estou esperando
sscanf que só vai volver valor 1, xa que, unha vez máis, se eu ler
a documentación, o propósito de sscanf en vida é devolver ao número de
As variables que foron cubertos coa entrada do usuario.
>> Pase en dúas variables enderezos, C1 e C2.
Espero, con todo, que unha das deles é morto, porque se sscanf
retorna 2, o que presumiblemente a implicación lóxica?
Que o usuario non só dar-me unha personaxe como eu dixen a el ou ela.
Eles probablemente escrito no menos dous caracteres.
Entón, se eu, no canto non tivo a segunda % C, eu só tiña un, que
francamente, sería máis intuitivo visión, creo que a primeira vista,
non vai ser capaz de detectar O usuario foi dándolle máis
input do que realmente quería.
Polo tanto, esta é unha forma implícita de comprobación de erros.
>> Pero teña en conta que fago aquí.
Xa que eu estou seguro que o usuario me deu un personaxe, eu liberar a liña, facendo
o oposto de getstring, que á súa vez usa malloc, e despois eu volvo
C1, o personaxe que eu esperaba que o seleccionado polo usuario e só indicado.
Entón, un rápido relance só, pero calquera dúbida sobre getchar?
Nós imos voltar a algúns dos outros.
>> Ben, deixe-me ir adiante e facelo - Supoñamos agora, só para motivar o noso
a discusión dunha semana, máis tempo, este é un arquivo chamado structs.h.
E, de novo, esta é só unha mostra de algo que está por vir.
Pero teña en conta que unha morea dicir comentarios.
Entón déixeme destacar só o parte interesante de momento.
typedef -
hai esa mesma contrasinal de novo.
typedef que usan para declarar cadea como un tipo de datos especial.
Podes usar typedef para crear nova marca tipos de datos que non existían cando
C foi inventada.
Por exemplo, int ven con C. carbón ven con C. dobre ven con C. Mais
non hai ningunha noción dun estudante.
E aínda sería moi útil para ser capaz de escribir un programa que almacena
nunha variable, número de identificación do alumno, seu nome, e súa casa.
Noutras palabras, tres anacos de datos, como un int e un
corda e outra cadea.
>> Con typedef, o que é moi poderoso sobre iso e o seu contrasinal para sturct
estrutura, ti, o programador en 2013, realmente pode establecer o seu propio
tipos de datos que non existían anos atrás, pero que atender ás súas finalidades.
E aquí, en liñas 13 a 19, estamos declarando un novo tipo de datos, como
un int, pero chamando-o de estudante.
E dentro desta variable vai ser tres cousas - un int, cadea
e unha corda.
Entón pode pensar que é realmente pasou aquí, aínda que este é un
bit de unha simplificación para hoxe, un alumno é esencialmente indo
para estar así.
Que será unha peza de cunha memoria de identificación, un nome
campo, e un campo de casa.
E nós imos ser capaces de usar estes anacos de memoria e acceder a eles como segue.
>> Se eu entrar struct0.c, aquí está unha relativamente longo, pero despois dun
estándar, de código que usa este novo truco.
Entón, primeiro, déixeme chamar a atención para as partes interesantes enriba.
Afiada define tres estudantes, declara un constantes chamadas de alumnos e cessionários
el arbitrariamente o número 3, só entón eu teño tres alumnos que utilizan
este programa de momento.
Aí vén o principal.
E teña en conta, como fago para declarar unha matriz de estudantes?
Ben, eu só utilizar a mesma sintaxe.
O estudante palabra é, obviamente, nova.
Pero o estudante, clase, os alumnos soporte.
>> Entón, por desgraza, hai moito de reutilización de termos aquí.
Este é só un número.
Entón, iso é como dicir que tres.
Clase é só o que quero para chamar a variable.
Podería chamalo alumnos.
Pero clase, isto non é unha clase nunha orientada a obxectos Java tipo de camiño.
É só unha clase de alumnos.
E o tipo de cada elemento de datos nesa matriz é estudante.
Polo tanto, este é un pouco diferente e de dicir algo
así, é só -
Eu digo que me dar tres alumnos e chamar esa clase array.
>> Todo ben.
Aquí está unha de catro loop.
Familiarizado dese cara - iterate de cero a tres, como máximo.
E aquí está a nova peza de sintaxe.
O programa vai me pedir, o ser humano, para darlle un estudante
ID, que é un int.
E aquí está a sintaxe coa cal pode gardar algo no campo ID en
localización clase soporte I. Así esa sintaxe non é nova.
É dicir, só dar-me a oitava alumno da clase.
Pero este símbolo é nova.
Ata agora, non se pode usar punto, polo menos nun código coma este.
Isto significa ir á struct coñecido como un estudante e poñer algo alí.
Igualmente, nesta liña seguinte, 31, ir adiante e poñer o que o usuario escribe
un nome aquí eo que fan para casa, o mesmo, vai adiante e
poñelas. casa.
>> Entón, o que fai este programa finalmente facer?
Podes ver un pouco de provocación alí.
Déixeme ir adiante e forman estruturas 0 dot barra struct 0, ID do alumno 1,
di David Mather, estudante ID 2.
Rob Kirkland, estudante ID 3.
Lauren Leverit -
eo único que este programa fixo, que é só totalmente arbitrario, é
Eu quería facer algo con eses datos, agora que eu xa nos ensinou como
usar estruturas, é que eu só tiña este ciclo extra aquí.
Eu iterado sobre o conxunto de alumnos.
Eu usei o noso, amigo quizais agora familiar, Cadea de comparación, a stircomp
cheque é a casa de 8 estudantes igual a Mather?
E se é así, só tes que imprimir algo arbitrariamente gusta, si, é.
Pero, de novo, só me dando oportunidades de utilizar e reutilizar e
reutilizar esta nova notación de punto.
>> Entón, quen lle importa, non?
Chegando-se con un programa de estudante é un tanto arbitraria, pero acontece
que podemos facer cousas útiles co é dicir, por exemplo, como segue.
Trátase dunha estrutura moi máis complicada en C. Ten unha ducia ou máis campos,
un tanto enigmaticamente chamado.
Pero se xa escoitou falar de unha gráfica formato de ficheiro chamado bitmap, BMP, el
Acontece que o formato de ficheiro bitmap parécese moito a que este.
É un pouco cara Smiley estúpido.
É unha pequena imaxe que teño ampliado en moi grande para que eu puidese ver cada
dos puntos ou píxeles individuais.
Agora resulta que pode representar unha punto negro con, digamos, o número 0.
E un punto branco co número 1.
>> Polo tanto, noutras palabras, se quere chamar un Rostro sorrinte e gardar a imaxe nun
ordenador, é suficiente para almacenar e ceros aqueles que se parecen con esta, onde,
unha vez máis, os son brancos e ceros son negros.
E xuntos, se efectivamente ten un cingue duns e ceros, ten un
reixa de píxeles, e se pór Los, ten un bonito
rostinho Smiley.
Agora, o formato de ficheiro de mapa de bits, BMP, é efectivamente que, baixo o capó,
pero con máis píxeles SOT que realmente pode representar as cores.
>> Pero cando ten máis sofisticado formatos como JPEG e BMP e GIF
co cal pode estar familiarizado, aqueles arquivos no disco normalmente non só
ten ceros e uns aos píxeles, pero eles teñen algúns metadatos, así como -
fito no sentido de que non é realmente datos, pero é útil para ter.
Entón, eses campos aquí son o que implica, e imos ver iso con máis detalle na I-set
5, que antes dos ceros e uns que representar os píxeles dunha imaxe,
hai unha morea de metadatos como o tamaño da imaxe e o
ancho da imaxe.
E noten que estou arrincando fóra dalgúns cousas arbitrarias aquí -
ancho e alto.
Conta de bits e algunhas outras cousas.
Polo tanto, hai uns metadatos nun arquivo.
>> Pero por entender como os arquivos son colocados fóra desta forma, pode realmente
logo manipular imaxes, recuperar imaxes do disco, redimensionar imaxes.
Pero non pode necesariamente mellora-los.
Eu precisaba unha foto.
Entón eu volvín para RJ aquí, que viu na pantalla hai algún tempo atrás.
E se eu abrir Keynote aquí, este é o que pasa se tentar ampliar e
mellorar RJ.
Non está quedando mellor realmente.
Agora Keynote é unha especie de esbater-se un pouco, só para encubrir o
feito de RJ non é especialmente maior cando zoom in
E se fai dese xeito, ver as prazas?
Si, pode definitivamente ver os cadrados nun proxector.
>> Iso é o que comeza cando mellorar.
Pero no entendemento de como o noso RJ ou o Smiley cara é aplicado déixanos
realmente escribir o código que manexa estas cousas.
E eu penso que eu ía acabar con esta nota, con 55 segundo dunha mellorar tanto,
Atrévome, por exemplo, no canto enganosa.
>> [REPRODUCIÓN]
>> -Está mentindo.
Sobre o que, eu non sei.
>> -Entón, o que sabemos?
>> -Iso ás 9:15 Ray Santoya estaba no cadro electrónico.
>> -Entón, a pregunta é o que que estaba facendo en 9:16?
>> Tiro-a nove milímetros en algo.
Quizais el viu o tire.
>> -Ou foi traballar con el.
>> -Espera.
Volva un.
>> -O que ve?
>> -Traer a cara, pantalla completa.
>> -Os seus lentes.
>> -Hai unha reflexión.
>> -Ese é o equipo de béisbol Neuvitas.
Ese é o seu logotipo.
>> -E el está falando con quen queira que estea utilizando aquela chaqueta.
>> [FIN reprodución de vídeo]
>> DAVID J. Malan: Isto ser Problem Set 5.
Imos velo a próxima semana.
>> Falante masculino: Na seguinte CS50.
>> [Grilos cantando]
>> [Música tocando]