[Música tocando] ROB Boden: Todo ben. Entón, o primeiro en primeiro lugar, de vídeo dende un rostro familiar. [REPRODUCIÓN] -Todo ben. Este é CS50, e este é o inicio da semana tres. Me desculpe, eu non podería estar alí con vostede hoxe, pero permítame presentar Propio Rob Boden do CS50. [FIN reprodución de vídeo] [Aplausos e exclamacións] ROB Boden: A filmografía en este vídeo é fantástico. Todo ben. Entón, primeiro, hai outro xantar. É mañá ás 1:15. Non hai xantar venres. É con Quora. E Tommy non está aquí aínda, pero unha das a xente de alí é o ex CF cabeza, Tommy McWilliam. Entón, el é un cara divertido. Debe vir. Todo ben. Entón, a semana pasada, comezamos dobres sobre o que unha secuencia realmente é. Nós nos coñecemos desde o principio que é unha secuencia de caracteres. Pero a semana pasada, que investigou o feito que o que é realmente unha secuencia de caracteres, ben, agora temos arrays de caracteres. E sabemos que unha secuencia, é unha matriz de carácteres, ao final, temos este byte especial nulo, este invertida 0, que indica o final de a corda. E así unha cadea é un array de caracteres, pero podemos ter máis que só unha matriz de caracteres, que pode ter unha matriz de calquera tipo de cousas que queremos. Entón, se se lembra da semana pasada, o Programa Idade que David introduciu moi rapidamente. Entón o primeiro que imos facer é pedir ao usuario un número enteiro, o número de persoas na sala. Unha vez que temos ese enteiro, estamos declarando un array. Teña en conta esta sintaxe soporte. Vai acostumar con iso. Entón, nós estamos declarando un array de enteiros chamado idades, e existen n enteiros nesa matriz. Polo tanto, este estándar aquí, este 4 int i é igual a 0, i é menos que n, i aló plus, que tamén será un estándar que comeza moi acostumado. Por iso é moi fermoso como está sempre vai iterado sobre matrices. Así lembrar que non é o lonxitude da nosa matriz. E aquí, estamos pedindo repetidamente para a idade da persoa i na sala. Despois diso, nós imos para abaixo, e por calquera razón arbitraria, que, a continuación, imprimir cantos anos van ser un ano a partir de agora. E correr este programa, imos facer as idades, dot idades Slash. Así, o número de persoas na sala, digamos que hai tres. E din, a primeira persoa é de 13, logo é 26, e o último é 30. Entón el vai interactuar sobre os tres persoas, imprimir 14, 27 e 31. Entón recorda que, cando se declara un matriz de tamaño n, en que os índices matriz, a matriz ten valores e índices de 0, 1, 2, todo o camiño ata n menos 1. Así, cando nos dixo que había tres persoas na sala, e poñemos aquí a primeira iteración través desta loop, i será 0. Así, no índice 0. Estamos asignando o primeiro idade que o usuario escribe. Entón, a próxima, estamos entrando na segundo n o usuario escribe, e en xunto a dous, os últimos n. Entón entender que unha matriz de tamaño tres non ten nada no índice de tres. Este non é válido. Todo ben. Entón, imos voltar aquí. Polo tanto, agora que lidou con matrices, temos algunha familiaridade. Agora imos pasar ao mando argumentos de liña, que van ser moi relevante para este conxunto de problemas. Entón, ata agora, sempre que ten declarou a súa principal función, temos dixo void main int. Entón baleiro significa só que non estamos pasando calquera argumentos para esta función. Agora imos ver que o principal pode levar algúns argumentos. Aquí imos chamalos int argc e cordas soportes argv. Os soportes, unha vez máis, o que indica que estamos lidando con matrices. Entón, aquí, soportes de corda argv, estamos xestionar un conxunto de cordas. Entón argc, que vai indicar cantos argumentos temos pasado para este programa. E a ver que iso significa, imos pechar iso. Aceptar. Entón, ata agora, nós funcionan todos programa como idades de barra de puntos. Podemos tamén, na liña de comandos, o pasado pasar argumentos, así, a prazo, de comandos argumentos de liña. Así, o primeiro argumento, Ola mundo. Entón, aquí, argc sería tres. É a conta dos argumentos na liña de comandos. Argc sempre polo menos un, xa que desde o punto reducir as idades, en si, é considerada como unha das os argumentos de liña de comandos. Entón Ola é o primeiro. Se as idades barra de puntos é o zeroth, entón Ola é o primeiro, e é o mundo segundo argumento da liña de comandos. Así, o argv corda, imos ver, contén a corda, barra dot idades, Ola, e do mundo. E, á petición de David, imos para reproducir un vídeo introducindo iso. [REPRODUCIÓN] -Ata o momento, en programas que xa escrito, declaramos principal void main como int. E todo ese tempo, ese baleiro ten simplemente foi especificando que a programa non tomar calquera Argumentos da liña de comandos. Noutras palabras, cando un usuario executa un programa, el ou ela pode ofrecer ordes argumentos de liña escribindo adicional palabras ou frases despois do programa nome na liña. Ben, se quere que o seu programa para ter argumentos de liña de comandos, un ou máis desas palabras, necesitamos substituír anular con un par de argumentos. Entón, imos facelo. Incluír CS50.h. Incluír io.h. defecto Int principal. E agora, en vez de baleiro, eu vou especificar un int argc chamado, e un matriz de cadeas chamado argv. Agora, argc e argv son simplemente convencións. Poderiamos chamar estes argumentos máis calquera cousa que queiramos. Pero o que é importante é que argc é un int porque, por definición, é indo a conter o número de argumentos, a número de palabras en total, que o usuario escribiu no seu alerta. argv, con todo, o argumento do vector, é vai realmente ser unha matriz almacenar todas as palabras que o usuario ten ingresaran no seu alerta. Seguiremos a facer algo agora cunha ou máis destas Argumentos da liña de comandos. En particular, imos adiante e imprimir calquera palabra que o usuario escribe despois do nome do programa na liña. Abrir soporte. Pechar soporte. Por cento printf s barra invertida e coma. E agora eu teño que dicir que valor printf para conectar a ese espazo reservado. Eu quero que a primeira palabra que o usuario ten ingresaran despois do nome do programa, e entón eu vou para especificar argv soporte 1, preto parénteses, punto e coma. Agora, por un soporte e non o soporte 0? Ben, ao parecer, gardados automaticamente en argv 0 será o nome real do programa. Así, a primeira palabra que o usuario escribe despois do nome do programa é, polo convención, será almacenado en argv 1. Imos agora compilar e executar este programa. Fai argv 0, punto barra argv 0. E agora unha palabra como Olá Intro. E aí temos que, Olá [FIN reprodución de vídeo] ROB Boden: Todo ben. Peche esa. Entón, dando un ollo ao que o programa que nós só presentado a nós, así, só para mostrar, se imprimir argv 0, facer, agora o que é iso, argv 0, punto barra argv 0. Entón, como sería de esperar, está imprimindo a nome do programa, xa que argv 0 é sempre será o nome do programa. Pero imos facer algo un pouco máis interesante. Así, no conxunto de problemas, será introducida para esta función, atoi. Entón o que imos usar atoi a? Isto vai converter un cadea para un enteiro. Entón, se eu pasar a corda, un, dous, tres, para atoi, que vai converter ese ao número enteiro, un, dous, tres. Entón, nós estamos indo a converter o primeiro argumento da liña de comandos para un enteiro, e despois é só imprimir este enteiro. Entón, basicamente, somos tipo de reimplementar getInt, só o enteiro insírese ao mando liña, en vez de no programa interactivamente. Entón, facendo argv 0, faremos el aquí, e pechar iso. Entón, correndo argv 0, e imos entrar no enteiro, un, dous, tres, catro, un, dous. Entón, que vai imprimir o número enteiro, un dous, tres, catro, un, dous. Hai algunhas sutilezas para que atoi que vai deixar de se preocupar de nada alén dun carácter numérico válido, pero iso non importa. Entón, o que pensas que pasa se eu fai iso? Fallo de segmento. Entón, por que isto? Se ollar cara atrás, o noso programa, estamos converténdose argv 1, o primeiro argumento despois do nome do programa, a un enteiro. Pero non hai ningún argumento pasado despois do nome do programa. Entón, aquí vemos que este é un buggy programa, xa que, se tentar executa-lo sen ningún argumento, ela só vai fallar. Entón, outro estándar común verás é algo así como, se argc é menos que dous, o que indica que non houbo , Polo menos, o nome do programa e unha primeiro argumento, entón imos facer algo como printf, non o suficiente Argumentos da liña de comandos. Iso probablemente non é unha boa para imprimir, probablemente é algo, como ten que escribir un número enteiro na liña de comandos. Vou acabar con ela alí. E, a continuación, regresar 1. Entón recorda que ao final da nosa programa, se voltar 0, este tipo de indica éxito. E principal tamén automaticamente Devolve 0 se non o fai. Entón, aquí, estamos afinado novo 1 para indicar que iso non é éxito. E pode devolver o que queira, só, 0 indica éxito, e calquera outra cousa que indica falla. Entón, imos realizar esta versión das cousas. Entón, agora, se non entrar nunha liña de comandos argumento, que vai dicir correctamente nós, non é suficiente liña de comandos. Non rematou a frase. Outra cousa, se realmente pasar un, pode completar o programa. Entón é así que usaría en argc Para validar o número de argumentos de liña de comandos que son realmente pasou. Entón, imos facer este programa un pouco máis complicado, e ollar para a segunda iteración das cousas. Entón, agora, non estamos só a impresión do primeiro argumento da liña de comandos. Aquí, nós estamos interactuar de iguais i int 0, i é menos argc, i aló plus, e impresión argv, o índice i. Polo tanto, este estándar, unha vez máis, que é o mesmo estándar como antes, excepto en vez de chamar a variable n, estamos usando argc. Polo tanto, esta é a iteración sobre cada índice na matriz, e imprimindo cada elemento desta matriz. E así, cando executar este programa, así como, Non entrar en calquera liña de comandos argumentos, polo que só impresións o nome do programa. Se eu entrar en unha morea de cousas, que vai imprimir un, cada un na súa propia liña. Aceptar. Entón, imos dar un paso adiante. E en vez de imprimir cada argumento na súa propia liña, imos imprimir cada carácter de cada argumento na súa propia liña. Entón lembre que é argv unha matriz de cadeas. Entón, o que é unha cadea, mais un xogo de caracteres? Entón iso significa que argv é realmente unha dunha matriz de caracteres. Entón, aproveitando que, imos ignorar isto de momento. Imos considerar só a cadea argv 0. Polo tanto, se queremos levar cada personaxe de argv 0 na súa propia liña, entón eu quero de facer o estándar que estamos afeitos, i é menos que a lonxitude da matriz, que aquí, é de strlen, iso é non o que quero facer, corda s é igual a 0 argv. Así, i é inferior á lonxitude do noso matriz, que neste caso é unha matriz de caracteres, i plus plus. E así, como vimos a semana pasada, é ideal moverse que strlen fóra da condición, xa que non vai engadir o strlen de s cada vez que imos a través do lazo, e é non vai estar cambiando. Entón, imos define-lo igual a n aquí. Aceptar. Entón, agora, estamos interactuar sobre cada índice do array. E así, se queremos imprimir cada carácter nese array, cento c é bandeira que queremos usar para os personaxes. E agora eu soporte será o corda, personaxe índice i, polo que, se o corda foron Olá entón s 0 será h, s soporte 1 e será, e así por diante. Entón, agora queremos combinar estas dúas cousas. Queremos imprimir cada personaxe de cada argumento de liña de comandos. Entón, nós imos ter un aniñados para loop. E convencionalmente, o primeiro contador é i, o seguinte será j, n será o strlen de argv i, i é menor que n, i, máis aló. E agora en vez de imprimir argv i, entón argv soporte i vai ao índice - que será a liña de comandos i-th argumento, argv i, j vai ser o personaxe de jth argumento de i-th. Vou me librar dese aquí agora xa que poñelas que loop. Entón, é equivalente a iguais cadea s argv i, e, a continuación, s soporte j. Ben, non precisa declarar este s variable. Pola contra, imos combinar estes dous en o que tiñamos, argv i, j. COLUMNA 1: [inaudível]. ROB Boden: Boa chamada. Polo tanto, este é roto. Se realmente foi, teriamos xa entenderon iso. Así, o contador que me interesa neste particular, para loop é j, o iterador. Entón tería corrido en cuestións, probablemente un loop infinito, se nós Non tiña fixado que. É por iso que tamén estamos a falar sobre a depuración de hoxe. Aceptar. Entón, imos realizar este programa. E imos realmente engadir un printf separado aquí que só vai imprimir outra liña, xa que iso significa que cando executar o programa, haberá un espazo en branco liña entre cada personaxe do cada argumento de liña de comandos. Ben, imos ver o que iso significa. OOP. Ten algún erro. Erro implicitamente declarando función de biblioteca strlen. Entón, volvendo para o noso programa, eu esquezo de botar inclúen string.h. Entón string.h será o arquivo de cabeceira que declara a función strlen. OK, el compila. Agora, imos executalo. Entón, só iso. Vai imprimir a nosa nome do programa, Ola mundo. Vai imprimir cada cousa, cada un personaxe, na súa propia liña. Aceptar. Entón, imos realmente tomar esta un paso adiante. E en vez de usar string.h, imos pensar sobre como iríamos aplicar a nosa propia función strlen. Entón, eu vou dar inmediatamente sinatura da función. Entón, imos chamar my_strlen, e é vai levar unha cadea como argumento, e esperamos para volver lonxitude desta corda. Entón, onde é esa cara? Si Aceptar. Entón lembre-se a partir do foto anterior que Foi tamén a partir da semana pasada, que un array de caracteres, así, unha cadea, entón imos dicir que esta é a nosa cadea s. Polo tanto, se s é a cadea, Ola, entón, H-E-L-L-O, na memoria, que vai ser, a continuación, esta barra invertida 0 carácter. Entón, como podemos obter a lonxitude de s? Ben, o truco é mirar para este repercutiría 0 personaxe, este nulo Terminator. Así, o algoritmo Vai para ser algo así como uns caracteres suficientes que - imos ter a man representan algúns contador, imos chamar iso de lonxitude int. Así, a partir de aquí, somos vai interactuar sobre a nosa cadea. Así, o primeiro personaxe, é H, e non está de volta reducir 0, polo tanto, a lonxitude é 1. Iterate ao seguinte carácter, E, e non é barra invertida 0. A lonxitude é 2. G, 3. L, 4. Ó, 5. E, finalmente, chegamos a barra invertida 0, e así que iso significa, tamén, esta cadea é longo. Entón, imos volver 5. Entón, en realidade, a posta en marcha que, en primeiro lugar, meu lonxitude n é igual a 0, a miña man dereita. E imos facer unha iteración - COLUMNA 1: [inaudível] ROB Boden: Oh, tirar. Boa chamada. Lanza. Así, a lonxitude n igual a 0. Entón, agora, lonxitude, mentres S non igual e, a continuación, barra invertida 0. Entón lembre, esta barra invertida 0, é unha personaxe real, e indica o fin da cadea. Así como, tamén, de barra invertida n é un personaxe real. Barra invertida 0 vai para indicar o fin da nosa cadea. Eu non quero poñer isto alí. E mentres s indexados pola lonxitude non é igual ao terminador nulo, entón nós só estamos indo para incrementar lonxitude. Entón, ao final do noso programa, lonxitude é, finalmente, vai 5 ser neste caso. E nós imos lonxitude basta voltar. Aceptar. Entón, agora aquí, eu non facer my_strlen. Imos recompila-lo para asegurarse de todo corra ben. Eu estaba facendo en 2? Ou foi un? Isto debe facer. Todo ben. Polo tanto, esta é argv 2. Funciona como previsto, aínda que foi a de que o que eu fixen iso en? Si Aceptar. Esta versión das cousas que non tiña a nova liña printf despois, pero non fai calquera diferenza. Aceptar. Así funcionou como se esperaba. Agora podemos ata combinar un paso máis lonxe, onde aviso aquí, ben, primeiro, estamos collendo o strlen de argv i, e entón nós estamos iterando cada personaxe nesa cadea. Entón, en vez de facelo, o que se só combinar esa lóxica de esperar ata chegar barra invertida 0 dereito neste loop for? Entón iteración mentres argv i, j fai non coincide barra invertida 0. Entón, imos executa-lo por primeira vez. Todo ben. Entón, aquí, esta condición está dicindo - imos aclarar iso. Entón, agora, que este sexa o noso argv. Entón, cando eu só corrín este programa antes, argv é unha matriz de cadeas. E así, se eu executa-lo con un punto argv barra 2, Ola mundo, entón o argv si é lonxitude 3, para argv cero, Ola, e mundo. E no interior de cada un destes índices é, tamén unha matriz, onde esta será punto, iso vai ser barra, eu non sei se esa era a dirección correcta, eu Non creo que era. A-N-V trazo, precisa de máis espazo. Imos cortar a esta matriz. Trazo 0 e barra invertida 0 A-R-V. E entón en desorde será Olá Digamos, H-E barra invertida 0. E, finalmente, o W-O invertida 0. Así, o algoritmo que acaba de escribir, o aniñados para loops, o que están facendo é, primeiro temos o contador i e logo, j. Isto sería máis doado co código do pantalla, Imos volver a iso. Aceptar. Entón entender que i é o iterador que é iteración sobre cada comando argumento de liña. E xa é a iteración iterador sobre cada personaxe no que argumento de liña de comandos. Entón, o que este printf íntimo está facendo é, temos printf argv 0 0, printf argv 0 1, printf argv 0 2 0 3 0 4 0 5, 0 6, pero agora, argv 0 7 vai igual barra invertida 0. Entón saímos para que loop, e agora eu repite a 1. E agora nós estamos indo para imprimir argv 1 0, argv 1 1 - ben, agora, xa que eu corte Ola definitiva, argv 1 2 é de novo será barra invertida 0. E así, incrementar i e seguir, e así por diante, ata que imprimir mundo, e estas son tres de liña de comandos argumentos, e nós imos saír do o circuíto externo, e rematar noso programa. Aceptar. Entón, imos voltar aquí. Entón, vai gañar algunha familiaridade con argumentos de liña de comandos neste determinado conxunto de problemas. Agora, a depuración. Entón, probablemente xa tivo que facer algunha depuración co seu anterior conxunto de problemas. E un xeito moi sinxelo de depuración, en primeiro lugar, imos ollar para un programa de buggy. Ben, andando por este programa, imos pedir ao usuario a un enteiro, tome ese enteiro, e logo arbitrariamente, temos un loop while que é só ir a diminuír i ata que sexa igual a 10. Supoñamos que eu estou entrando un número enteiro maior que 10. Entón diminuír i ata que sexa igual a 10. E entón temos outro loop while que, a pesar de i non é igual a 0, estamos vai diminuír i por 3. Entón, se ves a intención do erro aquí, é que iso vai diminuír i para ser 10, e despois esta vontade loop while decremento i de 10, a 7, a 4, a 1, a 2 negativo, para negativo 5, e así por diante, ao infinito negativo, xa que eu vou en realidade, nunca igual a 0. E despois, a finais do presente programa, que teñen a función foo que se pasando impresión que eu. Polo tanto, este é un programa curto e trivial, eo erro sexa obvio, especialmente despois de eu dixo que o erro era. Pero a intención aquí é, así, este pode realmente parecido con algunhas das súas solucións de ávida da última problema definido, e quizais ten algún loop infinito no seu programa, e non ten idea o que está causando tanto. Así, unha técnica de depuración moi útil é só engadir printfs todo o seu código. Entón, aquí eu quero un printf fóra primeiro loop while. E aquí quero un printf, e eu vou imprimir i. Eu mesmo vou facer en primeiro lugar, mentres loop, i. Aí, segundo loop while. Unha vez máis, imprimir dentro aquí, o valor i. E imos realizar este. Debug barra Así punto. Insira un número enteiro. Imos facer 13. E boom. Vemos que estamos loop infinito dentro do segundo circuíto, mentres. Polo tanto, agora sabemos cal é o erro. Pero printf depuración é perfectamente grande, pero xa que os seus programas de obter máis longo e complicado, hai solucións máis sofisticadas para facer as cousas funcionando. Polo tanto, imos eliminar todas esas printfs. E imos ter seguro que eu non fixen romper nada. Aceptar. Así, o programa que imos introducir chámase GDB, para o GNU Debugger. Ben, en realidade, imos eliminar depuración un segundo, e facer debug de novo. Ben, en realidade, en primeiro lugar, unha boa lección en argumentos de liña de comandos. Teña en conta que esta orde Clang que é compilando todo está a ser pasado na liña de comandos, estes Argumentos da liña de comandos. Entón, exactamente como está indo estar usando argumentos de liña de comandos, como nós fixo antes, e como vai en PSET 2, que é como Clang é usalos. Entón, teña en conta que esta primeira bandeira, trazo ggdb3, o que está dicindo é que, Clang, ten que compilar este ficheiro co intención que acabará Debe depurá-lo. Entón, mentres ten esa bandeira, entón podemos GDB depuración. E vai abrir o depurador GNU. Polo tanto, hai unha morea de comandos que precisa para se acostumar. Primeiro que probablemente vai inmediatamente necesitamos é Executar. Entón o que está Executar vai facer? Comezará o noso programa. Entón execute o programa de partida, o programa de pídenos a un enteiro de 13. E entón é infinito looping como espera, excepto eu eliminar o printfs, polo que nin sequera ver iso. Saíu normalmente. Oh É posible que implica toda a volta, volta a - ignorando iso. Supoña que non saír normalmente. Hai unha resposta complicada para iso. Así que agora, que non é moi útil. Entón, só tes que executar o programa no interior este depurador non nos axuda en calquera forma, xa que podería ter feito dot cortar depuración de fóra GDB. Así, a orde que probablemente vai - e eu vou saír desta. Control-d ou saír, tanto traballo. Entón, imos abri-lo de novo. Outro comando que, probablemente, quere inmediatamente para habituar-se é Break. Entón, imos romper a principal, polo momento, e entón eu vou explicar isto. Ben, aquí vemos que definir un punto de interrupción nesta liña en debug.c. Entón, o que significa rompe é que cando eu tipo de execución, o programa vai seguir funcionando ata Eu bati un punto de interrupción. Entón, cando bati prazo, o programa iníciase, e despois se rompe, logo que el entra a función principal. Rompe principal será algo vostede moi comunmente fan. E agora, para presenta-lo para algúns comandos. Teña en conta aquí, que está dicindo que romperon na liña 11, que se printf, introduza un número enteiro. Así, a orde seguinte será como imos á seguinte liña de código. Isto vai permitir-nos para a etapa a través da nosa liña de programa por liña. Así, na seguinte. Agora a liña 12, nós imos para obter o número enteiro. Seguinte. E se só prema Intro novo, que vai refacer a última cousa que fixo. Entón eu non teño escribir xunto de cada vez. Entón, introduza un número enteiro de 13. Entón, agora, liña 14, mentres que i é maior de 10, e eu vou facer a continuación. E vemos que imos diminuír i. Entón, nós estamos indo a diminuír i novo. Entón, agora, outra utilidade comando é Imprimir. Así Imprimir vai a imprimir o valor da variable. Imos levar o valor i variable. Imos imprimir i. Vai dicir que eu é 11. Agora nós Seguinte de novo mentres i é maior que 10. Entón, eu aínda é maior que 10, xa que ten 11 anos. i menos menos. Imos imprimir i novo. Como esperaba, ten 10 anos. Entón, agora, ao lado. El vai volver para a condición, i é superior a 10, pero agora é i 10, de xeito non é maior que 10, por iso, esperamos que caia fóra do loop while. E agora estamos por baixo desa liña de código. E outro mando, List, é só ir para mostrar o anterior eo seguinte par de liñas de código, en No caso de se perdeu. Entón nós só saíu este loop while, e agora nós entramos neste mentres loop, liña 18. Así, mentres i non é igual a 0. E, a continuación, i é igual a I menos 3, e nós imos notar, este só vai continuar. E podemos imprimir i. Cada orde ten unha especie de atallos. Entón p é curto para Imprimir. Entón podemos p i. Só ten que manter sostendo n, ou continuar facendo Seguinte. Imprimir i novo. Ve agora é negativo 167. Entón, que vai durar para sempre, pero non realmente para sempre, xa que acaba de ver, é vai realmente acabar en algún momento. Así que comeza GDB. Pero imos facer unha cousa en GDB. Uh, depuración. Así, neste caso particular, o loop infinito pasou a ser dentro a función principal. E, polo de agora, só aceptar que que eu son vai mover o ciclo infinito en a función foo. Basta lembrar que, ao final do presente programa, ben, este era orixinalmente chamar foo, que era só indo para imprimir i. Pero agora estamos chamando foo, que é vai diminuír i ata que sexa 0, e a continuación, imprimir esa variable. Aceptar. Garde iso. Fai depuración. E agora, gdb depuración. Aceptar. Entón, se eu só correr, entón eu non vou ser capaz de realmente pasar pola miña liña por liña do programa. Entón, imos romper a principal, e escriba prazo. Entón, pasar por iso, printf, introduza un enteiro, conseguir o número enteiro de 13. Entón, nós estamos indo a perder decremento ata i é maior que 10. Entón imos a caer ata o while, e chegar á liña - Imos abrilo nunha ventá separada. Entón, nós diminuída ata que eu xa non era superior a 10, e entón nós chamou a función, foo. Entón o que pasou así que eu bati función foo, ben, eu chamei a foo, e entón eu non tiña máis control sobre o GDB. Así, logo que eu bati continuación nesta liña, cousas continuou ata que iso aconteceu, onde a programa saíu cando - asumir que non existía eventualmente. Viu unha pausa para un pouco aínda. Entón, por que eu perda o control sobre o programa en que punto? Ben, cando eu tecleo seguinte, que vai a a seguinte liña de código que literal se levará a cabo. Así, tras a liña 21, a seguinte liña de código que será realizada é a liña 22, que é, saíndo da principal. Entón, eu non quero só ir á seguinte liña de código. Quero ir á función, foo, e despois tamén percorrer esas liñas de código. Entón, para iso, temos unha alternativa. Imos parar con iso de novo. Rompe principal. Uh, 1, next, next, 13, ao lado, next, next, con coidado, antes de bater liña foo. Aceptar. Entón, agora, estamos na liña 21, onde chamamos foo. Non queremos que escribir próximo, xa que só vai chamar a función foo, e ir á seguinte liña de código. O que queremos empregar é Step. Polo tanto, hai unha diferenza entre a Paso e no seguinte, onde paso os pasos para o funciona, e no próximo vai sobre a función. El só executa a totalidade de a función e segue indo. Entón Paso traerá connosco en función, foo. E vemos aquí, agora, estamos de volta ao ese loop while que é, en teoría, seguirá para sempre. E se bater Step, cando non o é unha función para chamar, entón é idéntica á seguida. Entón, é só cando está nunha liña que está chamado unha función que o paso vai diferir en Seguinte. Entón Paso vai traer aquí. Paso, paso, paso, paso, paso, paso, e imos Infinite Loop para sempre. Entón, pode se acostumar con iso como a súa forma de identificar loops infinitos, é só sostendo esta tecla Intro para ver onde queda preso. Hai xeitos mellores de facelo, pero polo de agora, iso é perfectamente suficiente. E estilisticamente, conforme Estilo 50, eu debería ter feito isto. Aceptar. Entón, un último comando a introducir. Ben, imos gdb depuración dentro Entón, en vez de romper a principal, se eu coñecer a función foo é tamén o problema, entón eu podería só dixo, romper a foo, no seu lugar. Imos dicir que eu rompe a ambos inicio e foo. Así, pode definir como moitos puntos de interrupción como quere. Cando eu tecleo prazo, que vai deixar na - ooh, imos recompilar, sempre Eu mudei as cousas. Verá esta liña, Aviso fonte ficheiro é máis recente do que executable. Entón iso significa que eu só fun aquí e cambiou a eles para estar de acordo con Estilo 50, pero eu non recompilar o programa. Entón GDB me fai consciente diso. Vou deixar de fumar, facer debug de novo, bater gdb depuración. Aceptar. Entón, agora, volver ao que eu estaba facendo. Rompe principal, foo pausa. Agora, se eu executar o programa, polo que é vai continuar ata que alcanza unha breakpoint. Esta interrupción pasa a ser o primeiro en principal. Agora, en vez de facer next, next, next, next, next, ata que eu bati foo, eu pode escribir seguir, que continuará ata chegar ao seguinte punto de interrupción. Teño que entrar no primeiro número enteiro. Continuar continuará ata que eu bati o seguinte punto de interrupción, que é o que función de foo. Entón Run levará a cabo ata que bata un breakpoint, pero só escribir run cando está empezando o programa, e logo a partir de entón, é continuar. Se eu só fixen romper principal e logo foi, que vai romper a principal, e logo continuar. Dende que eu non teño un punto de ruptura en foo, introducir o número enteiro, entón agora eu estou non vai romper a foo. É só ir ao infinito loop ata que. Aceptar. Entón, iso é Introdución á GDB. Ten que comezar a usalo nos seus conxuntos de problemas. Pode ser moi útil para identificar erros. Se realmente só, liña por liña, vaia a través do seu código, e comparar o que é realmente a suceder co que espera acontecer, entón é moi difícil perder os seus erros. Aceptar. Entón, a semana pasada, David trouxo presente cousas cifrado de clave secreta para o primeira vez, onde nós non queremos contrasinais só ser almacenado na nosa ordenador en algún arquivo de texto simple, onde alguén pode vir e só abrilo e le-los. Ideal, eles serían criptografía dalgún modo. E o conxunto de problemas 2, estará lidando con un método de criptografia, ou, ben, dous métodos, pero eles non son tan grandes. Se fai a edición hacker, está Tamén vai estar lidando con descifrar algunhas cousas. Así, a cuestión agora é, así, aínda que temos o cifrado máis forte algoritmo do mundo, se escolle un particularmente pobre contrasinal, polo que non vai axudar moito, pois a xente aínda será capaz de descubrir iso. Mesmo a ver a cadea cifrada el se parece unha confusión de lixo que non significa nada para eles, se eles aínda só precisa probar algunhas claves para descubrir iso, entón non son moi seguros. Entón, a asistir a un vídeo que fai ese punto. [REPRODUCIÓN] -Helmet, vostede demo. O que está a suceder? O que está facendo a miña filla? -Permítame presentar o brillante novo cirurxián plástico, Dr Phillip Schlotkin, o maior nariz home do traballo en todo o universo, e Beverly Hills. -A súa Alteza. -Nariz traballo? Non estou entendendo. Ela xa tiña unha plástica no nariz. Era un doce dezaseis presente. -No. Non é o que pensa. É moi, moito peor. Se non me der a combinación de o escudo do aire, Dr Schlotkin vontade dar a súa filla de volta o seu antigo nariz. -No. De onde tirou iso? -Todo ben. Eu vou che dicir. Eu vou che dicir. Non, papá. Non, non debe. -Está ben, miña querida. Vou sentir falta do seu novo nariz. Pero eu non vou dicir-lle a combinación, non importa o que. -Moi ben. Dr Schlotkin, faga o peor. -O pracer é meu. [TOOLS ser afiadas] -No. Espera. Espera. Eu vou che dicir. Eu vou che dicir. -Sabía que ía traballar. Todo ben. Dáme iso. -A combinación é un. -One. -One. -Two. -Two. -Two. -Tres. -Tres. -Tres. -Catro. -Catro. -Catro. -Five. -Five. -Five. -Así, a combinación é un, dous, tres, catro, cinco. Esta é a combinación máis estúpida Que eu xa oín na miña vida. Ese é o tipo de cousas que un idiota tería na súa equipaxe. -Grazas, a súa Alteza. -O que fixo? -Eu apaguei a parede. -Non, non fixo. Vostede desconectou a película enteiro. -Debo ter axustado o botón errado. -Ben, colocar-lo de novo. Pon a película de novo. -Si, señor. Si, señor. -Imos, Arnold. Veña, Gretchen. Claro, vostede sabe que eu vou ten que cobre-lo por iso. [FIN reprodución de vídeo] ROB Boden: Todo ben. Polo tanto, agora que xa estamos falando de seguridade, de certa forma, agradable pouco poster da película, polo tanto, en última día, estas cuestións co NSA vixían todo. Pode ser difícil de se sentir como ter algún tipo de protección de datos en mundo en liña, aínda que eu non podería dicir te a maioría dos detalles de Prism. Entón, indo alén Prism, nós non imos estar falando sobre iso, agora pensar sobre o seu portátil. Entón, aquí, quero cambiar para a miña conta real, co meu pequeno pingüín. Entón, eu teño un conxunto de contrasinal, e que contrasinal é o que quere que sexa. Pero lembre-se de que o que eu estou entrando con, así que este usuario alerta, é algún programa. É un programa que foi escrito por unha persoa. E por iso, que a persoa, se se particularmente mal intencionado, que puideron xa dixen, todo ben, por iso, se o contrasinal que eu entro coincide co meu contrasinal real, ou é igual para algunha contrasinal especial - David é incrible, ou algo así - logo deixalos dentro Así, un programador mal intencionado podería acceso a todos os seus Macs, ou De Windows, ou calquera cousa. De xeito que non é moito dunha preocupación, xa que, Quero dicir, que é programa de inicio de sesión que se inclúe co OS X, centos ou miles de persoas teñen Revisei este código. E así, si, o seu código nalgún lugar, dicir que esta cadea é igual a igual David é incrible, login, entón alguén está será, tipo, esperar. Iso non é certo. Isto non debería estar aquí. Entón, iso é un xeito de facer as cousas para ser unha especie de seguro. Pero pense mesmo programas que escribe. Imos dicir que escribiu o programa de inicio de sesión. Polo tanto, este programa de inicio de sesión que escribiu, entón, obviamente, é un bo programador. Non vai poñer calquera mal intencionado se x é igual a igual David é incrible no seu código. Pero este programa, o que fai empregar para compilar este programa? Algo así como Clang. Así que se a persoa que pasou a escribir Clang especial casetonado en Clang algo así como, se estou compilando o sesión do programa, a continuación, escriba o código para o programa de inicio de sesión que di que, se x é igual a igual David é incrible? Polo tanto, non moito aínda, pero temos o mesmo emitir aquí, onde Clang, ben, miles, se non decenas de miles de persoas, ter ollo para Clang, teñen ollou para as súas liñas de código, e dixo: todo ben, non hai nada de malo aquí. Obviamente, ninguén está a facer algo esta mal intencionado. Pero o que é propio bumbum, como, e se eu compilar Clang? E se eu tivera algún compilador que compila Clang que inserir Clang este truco especial que di, todo ben, cando compilar Clang, entón o executable Recibe debe sobre todo ollar dentro do programa de inicio de sesión e inserción esta contrasinal, é igual a igual Dave é impresionante? Entón lembre de que o seu propio compilador ten que ser feita nalgún momento. Polo tanto, se o que escoller para compilar Clang con, en si é mal intencionado, entón pode ser aparafusada a todo camiño para abaixo da liña. Entón, aquí temos Ken Thompson e Dennis Ritchie. Polo tanto, esta é unha foto iconas. Dennis Ritchie está á dereita. El é un gran - practicamente escribiu C. Así, pode agradece-lo por esta clase. Ken Thomson é do lado esquerdo. Os dous basicamente escribiu UNIX. Ben, eles foron grandes contribuíntes en UNIX. Había algúns outros. Entón, Ken Thompson, nalgún momento, el gañou o Premio Turing. E o premio Turing, eu sempre escoitei el referenciada deste xeito, é o Premio Nobel de ciencia da computación. Entón, o Premio Turing, ten que dar o seu discurso de aceptación. E dá esta moi famoso discurso agora, chamado Reflexións sobre Confianza Trust, que temos conectados na páxina web do curso. E, neste discurso, el di, todo ben, entón escribín UNIX, e agora todos vostede a xente está usando UNIX. Agora, lembre-se, hoxe, que Linux é un descendente directo do UNIX. X usa directamente UNIX. Windows non fai moito, pero moito de ideas foron tiradas de UNIX. Así, el vai ata o escenario e di: todo ben, eu escribín UNIX. E só así vostede sabe, eu son capaz de facer sesión en cada un único dos seus ordenadores. Dende que eu poñer un destes especial se x é igual a igual Ken Thomson é incrible, entón eu teño permiso para entrar. Entón, as persoas son como, ben, Como fai iso? Miramos para o programa de inicio de sesión e nada está aí. El é como, ben, eu modifiquei o compilador para entrar no programa de inicio de sesión para que o programa de inicio de sesión terá agora que x é igual a igual Ken Thompson é incrible. E din, ben, iso non é verdade. Estamos mirando para o compilador, eo compilador carece liñas de código coma este. El é como, OK, pero o que está a compilar o compilador con? E eles pensan, e el é, como, así, Eu son o único que lle deu o compilador que está a usar para compilar o compilador, polo que está compilando un compilador, que en si é mal intencionado, e ganas romper o programa de inicio de sesión. Entón, basicamente, nese punto, non hai ningunha maneira que podes ollar para a fonte código do programa de inicio de sesión para ver o que está mal. Non podía nin mirar de código fonte do compilador para ver o que está mal. Ten que ollar para a máquina de código, o binario efectivo da compilado compilador para ver, esperar, estes liñas de código non debería estar aquí. Pero Ken Thompson deu un paso máis lonxe e dixo, ben, hai estes programas especiais que efectivamente axudar a ler o binario de programas, e por iso, se alguén usou ese programa para ler o binario, verían estes liñas de código. El cambiou estes programas para dicir, todo o ben, se está mirando para o compilador, non mostran este particular conxunto de binario. Entón, entón tes que dar un paso aínda máis e, basicamente, que podería tomadas varios niveis de erro, e nalgún momento, ninguén é realmente estará alomenos. Así, a moral da historia é, vostede é non vai ser escrito Clang nesta clase. Vai estar a usar escalada Tinido moito nesta clase. Para todos saben, Clang é un malicioso programa que está sabotando cada único programa que xa compilado. E para deixar aquel mesmo sinistro notar, velo na Mércores. [Aplausos] COLUMNA 2: Na seguinte CS50. COLUMNA 3: Non se atreve a dicilo. Podes facelo. Xa o fixo antes, pode facelo hoxe en día, pode facelo mañá. Ten feito isto hai anos. Só tes que ir ata alí e facelo. Podes facelo. [Música tocando]