1 00:00:00,000 --> 00:00:00,487 2 00:00:00,487 --> 00:00:11,210 >> [Música tocando] 3 00:00:11,210 --> 00:00:12,100 >> ROB Boden: Todo ben. 4 00:00:12,100 --> 00:00:15,620 Entón, o primeiro en primeiro lugar, de vídeo dende un rostro familiar. 5 00:00:15,620 --> 00:00:22,080 6 00:00:22,080 --> 00:00:22,560 >> [REPRODUCIÓN] 7 00:00:22,560 --> 00:00:23,370 >> -Todo ben. 8 00:00:23,370 --> 00:00:27,150 Este é CS50, e este é o inicio da semana tres. 9 00:00:27,150 --> 00:00:29,980 Me desculpe, eu non podería estar alí con vostede hoxe, pero permítame presentar 10 00:00:29,980 --> 00:00:32,880 Propio Rob Boden do CS50. 11 00:00:32,880 --> 00:00:33,872 >> [FIN reprodución de vídeo] 12 00:00:33,872 --> 00:00:39,340 >> [Aplausos e exclamacións] 13 00:00:39,340 --> 00:00:41,277 >> ROB Boden: A filmografía en este vídeo é fantástico. 14 00:00:41,277 --> 00:00:47,280 15 00:00:47,280 --> 00:00:47,770 Todo ben. 16 00:00:47,770 --> 00:00:50,960 Entón, primeiro, hai outro xantar. 17 00:00:50,960 --> 00:00:52,330 É mañá ás 1:15. 18 00:00:52,330 --> 00:00:54,480 Non hai xantar venres. 19 00:00:54,480 --> 00:00:55,810 É con Quora. 20 00:00:55,810 --> 00:01:00,190 E Tommy non está aquí aínda, pero unha das a xente de alí é o ex CF cabeza, 21 00:01:00,190 --> 00:01:01,530 Tommy McWilliam. 22 00:01:01,530 --> 00:01:02,730 Entón, el é un cara divertido. 23 00:01:02,730 --> 00:01:04,819 Debe vir. 24 00:01:04,819 --> 00:01:05,900 >> Todo ben. 25 00:01:05,900 --> 00:01:11,360 Entón, a semana pasada, comezamos dobres sobre o que unha secuencia realmente é. 26 00:01:11,360 --> 00:01:14,830 Nós nos coñecemos desde o principio que é unha secuencia de caracteres. 27 00:01:14,830 --> 00:01:18,130 Pero a semana pasada, que investigou o feito que o que é realmente unha secuencia de 28 00:01:18,130 --> 00:01:22,110 caracteres, ben, agora temos arrays de caracteres. 29 00:01:22,110 --> 00:01:26,450 E sabemos que unha secuencia, é unha matriz de carácteres, ao final, 30 00:01:26,450 --> 00:01:30,920 temos este byte especial nulo, este invertida 0, que indica o final de 31 00:01:30,920 --> 00:01:32,230 a corda. 32 00:01:32,230 --> 00:01:36,970 >> E así unha cadea é un array de caracteres, pero podemos ter máis que 33 00:01:36,970 --> 00:01:39,530 só unha matriz de caracteres, que pode ter unha matriz de calquera 34 00:01:39,530 --> 00:01:40,890 tipo de cousas que queremos. 35 00:01:40,890 --> 00:01:51,570 Entón, se se lembra da semana pasada, o Programa Idade que David introduciu 36 00:01:51,570 --> 00:01:53,560 moi rapidamente. 37 00:01:53,560 --> 00:01:57,010 Entón o primeiro que imos facer é pedir ao usuario un número enteiro, o 38 00:01:57,010 --> 00:01:58,800 número de persoas na sala. 39 00:01:58,800 --> 00:02:01,260 Unha vez que temos ese enteiro, estamos declarando un array. 40 00:02:01,260 --> 00:02:02,890 Teña en conta esta sintaxe soporte. 41 00:02:02,890 --> 00:02:04,540 Vai acostumar con iso. 42 00:02:04,540 --> 00:02:09,430 >> Entón, nós estamos declarando un array de enteiros chamado idades, e existen n 43 00:02:09,430 --> 00:02:12,080 enteiros nesa matriz. 44 00:02:12,080 --> 00:02:16,480 Polo tanto, este estándar aquí, este 4 int i é igual a 0, i é menos que n, i aló 45 00:02:16,480 --> 00:02:20,580 plus, que tamén será un estándar que comeza moi acostumado. 46 00:02:20,580 --> 00:02:24,000 Por iso é moi fermoso como está sempre vai iterado sobre matrices. 47 00:02:24,000 --> 00:02:26,330 Así lembrar que non é o lonxitude da nosa matriz. 48 00:02:26,330 --> 00:02:32,120 E aquí, estamos pedindo repetidamente para a idade da persoa i na sala. 49 00:02:32,120 --> 00:02:36,640 >> Despois diso, nós imos para abaixo, e por calquera razón arbitraria, que, a continuación, 50 00:02:36,640 --> 00:02:40,220 imprimir cantos anos van ser un ano a partir de agora. 51 00:02:40,220 --> 00:02:49,980 E correr este programa, imos facer as idades, dot idades Slash. 52 00:02:49,980 --> 00:02:53,010 Así, o número de persoas na sala, digamos que hai tres. 53 00:02:53,010 --> 00:02:59,880 E din, a primeira persoa é de 13, logo é 26, e o último é 30. 54 00:02:59,880 --> 00:03:05,080 Entón el vai interactuar sobre os tres persoas, imprimir 14, 27 e 31. 55 00:03:05,080 --> 00:03:16,060 >> Entón recorda que, cando se declara un matriz de tamaño n, en que os índices 56 00:03:16,060 --> 00:03:19,950 matriz, a matriz ten valores e índices de 0, 1, 2, todo o camiño 57 00:03:19,950 --> 00:03:21,680 ata n menos 1. 58 00:03:21,680 --> 00:03:26,255 Así, cando nos dixo que había tres persoas na sala, e poñemos aquí 59 00:03:26,255 --> 00:03:29,850 a primeira iteración través desta loop, i será 0. 60 00:03:29,850 --> 00:03:31,650 Así, no índice 0. 61 00:03:31,650 --> 00:03:34,540 Estamos asignando o primeiro idade que o usuario escribe. 62 00:03:34,540 --> 00:03:38,870 Entón, a próxima, estamos entrando na segundo n o usuario escribe, e en 63 00:03:38,870 --> 00:03:40,580 xunto a dous, os últimos n. 64 00:03:40,580 --> 00:03:44,200 >> Entón entender que unha matriz de tamaño tres non ten nada 65 00:03:44,200 --> 00:03:46,040 no índice de tres. 66 00:03:46,040 --> 00:03:49,036 Este non é válido. 67 00:03:49,036 --> 00:03:50,250 Todo ben. 68 00:03:50,250 --> 00:03:55,136 Entón, imos voltar aquí. 69 00:03:55,136 --> 00:03:57,650 70 00:03:57,650 --> 00:04:01,590 Polo tanto, agora que lidou con matrices, temos algunha familiaridade. 71 00:04:01,590 --> 00:04:03,780 Agora imos pasar ao mando argumentos de liña, que van ser 72 00:04:03,780 --> 00:04:05,890 moi relevante para este conxunto de problemas. 73 00:04:05,890 --> 00:04:09,670 >> Entón, ata agora, sempre que ten declarou a súa principal función, temos 74 00:04:09,670 --> 00:04:11,230 dixo void main int. 75 00:04:11,230 --> 00:04:14,070 Entón baleiro significa só que non estamos pasando calquera 76 00:04:14,070 --> 00:04:16,440 argumentos para esta función. 77 00:04:16,440 --> 00:04:19,190 Agora imos ver que o principal pode levar algúns argumentos. 78 00:04:19,190 --> 00:04:22,470 Aquí imos chamalos int argc e cordas soportes argv. 79 00:04:22,470 --> 00:04:26,930 Os soportes, unha vez máis, o que indica que estamos lidando con matrices. 80 00:04:26,930 --> 00:04:31,850 Entón, aquí, soportes de corda argv, estamos xestionar un conxunto de cordas. 81 00:04:31,850 --> 00:04:35,360 Entón argc, que vai indicar cantos argumentos temos 82 00:04:35,360 --> 00:04:37,580 pasado para este programa. 83 00:04:37,580 --> 00:04:46,050 E a ver que iso significa, imos pechar iso. 84 00:04:46,050 --> 00:04:46,490 >> Aceptar. 85 00:04:46,490 --> 00:04:50,790 Entón, ata agora, nós funcionan todos programa como idades de barra de puntos. 86 00:04:50,790 --> 00:04:55,250 Podemos tamén, na liña de comandos, o pasado pasar argumentos, así, a prazo, de comandos 87 00:04:55,250 --> 00:04:56,550 argumentos de liña. 88 00:04:56,550 --> 00:04:59,760 Así, o primeiro argumento, Ola mundo. 89 00:04:59,760 --> 00:05:03,350 Entón, aquí, argc sería tres. 90 00:05:03,350 --> 00:05:07,720 É a conta dos argumentos na liña de comandos. 91 00:05:07,720 --> 00:05:12,840 Argc sempre polo menos un, xa que desde o punto reducir as idades, en si, é considerada como unha das 92 00:05:12,840 --> 00:05:14,490 os argumentos de liña de comandos. 93 00:05:14,490 --> 00:05:17,010 >> Entón Ola é o primeiro. 94 00:05:17,010 --> 00:05:20,460 Se as idades barra de puntos é o zeroth, entón Ola é o primeiro, e é o mundo 95 00:05:20,460 --> 00:05:22,830 segundo argumento da liña de comandos. 96 00:05:22,830 --> 00:05:29,490 Así, o argv corda, imos ver, contén a corda, barra dot 97 00:05:29,490 --> 00:05:33,830 idades, Ola, e do mundo. 98 00:05:33,830 --> 00:05:38,945 E, á petición de David, imos para reproducir un vídeo introducindo iso. 99 00:05:38,945 --> 00:05:42,486 100 00:05:42,486 --> 00:05:43,890 >> [REPRODUCIÓN] 101 00:05:43,890 --> 00:05:46,240 >> -Ata o momento, en programas que xa escrito, declaramos 102 00:05:46,240 --> 00:05:48,500 principal void main como int. 103 00:05:48,500 --> 00:05:51,170 E todo ese tempo, ese baleiro ten simplemente foi especificando que a 104 00:05:51,170 --> 00:05:54,430 programa non tomar calquera Argumentos da liña de comandos. 105 00:05:54,430 --> 00:05:57,750 Noutras palabras, cando un usuario executa un programa, el ou ela pode ofrecer ordes 106 00:05:57,750 --> 00:06:01,710 argumentos de liña escribindo adicional palabras ou frases despois do programa 107 00:06:01,710 --> 00:06:03,000 nome na liña. 108 00:06:03,000 --> 00:06:06,550 >> Ben, se quere que o seu programa para ter argumentos de liña de comandos, un ou 109 00:06:06,550 --> 00:06:10,540 máis desas palabras, necesitamos substituír anular con un par de argumentos. 110 00:06:10,540 --> 00:06:12,200 Entón, imos facelo. 111 00:06:12,200 --> 00:06:15,750 Incluír CS50.h. 112 00:06:15,750 --> 00:06:19,360 Incluír io.h. defecto 113 00:06:19,360 --> 00:06:20,760 Int principal. 114 00:06:20,760 --> 00:06:26,330 E agora, en vez de baleiro, eu vou especificar un int argc chamado, e un 115 00:06:26,330 --> 00:06:28,780 matriz de cadeas chamado argv. 116 00:06:28,780 --> 00:06:31,820 Agora, argc e argv son simplemente convencións. 117 00:06:31,820 --> 00:06:34,000 >> Poderiamos chamar estes argumentos máis calquera cousa que queiramos. 118 00:06:34,000 --> 00:06:37,630 Pero o que é importante é que argc é un int porque, por definición, é 119 00:06:37,630 --> 00:06:41,360 indo a conter o número de argumentos, a número de palabras en total, que o 120 00:06:41,360 --> 00:06:43,380 usuario escribiu no seu alerta. 121 00:06:43,380 --> 00:06:47,910 argv, con todo, o argumento do vector, é vai realmente ser unha matriz almacenar 122 00:06:47,910 --> 00:06:52,020 todas as palabras que o usuario ten ingresaran no seu alerta. 123 00:06:52,020 --> 00:06:54,500 >> Seguiremos a facer algo agora cunha ou máis destas 124 00:06:54,500 --> 00:06:55,660 Argumentos da liña de comandos. 125 00:06:55,660 --> 00:07:00,070 En particular, imos adiante e imprimir calquera palabra que o usuario escribe 126 00:07:00,070 --> 00:07:03,960 despois do nome do programa na liña. 127 00:07:03,960 --> 00:07:04,730 Abrir soporte. 128 00:07:04,730 --> 00:07:06,240 Pechar soporte. 129 00:07:06,240 --> 00:07:10,510 Por cento printf s barra invertida e coma. 130 00:07:10,510 --> 00:07:14,550 E agora eu teño que dicir que valor printf para conectar a ese espazo reservado. 131 00:07:14,550 --> 00:07:18,600 Eu quero que a primeira palabra que o usuario ten ingresaran despois do nome do programa, 132 00:07:18,600 --> 00:07:23,130 e entón eu vou para especificar argv soporte 1, preto 133 00:07:23,130 --> 00:07:24,830 parénteses, punto e coma. 134 00:07:24,830 --> 00:07:27,290 >> Agora, por un soporte e non o soporte 0? 135 00:07:27,290 --> 00:07:30,990 Ben, ao parecer, gardados automaticamente en argv 0 será o 136 00:07:30,990 --> 00:07:32,620 nome real do programa. 137 00:07:32,620 --> 00:07:36,180 Así, a primeira palabra que o usuario escribe despois do nome do programa é, polo 138 00:07:36,180 --> 00:07:38,990 convención, será almacenado en argv 1. 139 00:07:38,990 --> 00:07:42,380 Imos agora compilar e executar este programa. 140 00:07:42,380 --> 00:07:47,780 >> Fai argv 0, punto barra argv 0. 141 00:07:47,780 --> 00:07:50,520 E agora unha palabra como Olá 142 00:07:50,520 --> 00:07:51,670 Intro. 143 00:07:51,670 --> 00:07:53,520 E aí temos que, Olá 144 00:07:53,520 --> 00:07:55,750 >> [FIN reprodución de vídeo] 145 00:07:55,750 --> 00:07:57,000 >> ROB Boden: Todo ben. 146 00:07:57,000 --> 00:07:59,380 147 00:07:59,380 --> 00:08:01,230 Peche esa. 148 00:08:01,230 --> 00:08:16,730 Entón, dando un ollo ao que o programa que nós só presentado a nós, así, só 149 00:08:16,730 --> 00:08:24,710 para mostrar, se imprimir argv 0, facer, agora o que é iso, argv 0, punto barra argv 0. 150 00:08:24,710 --> 00:08:30,440 Entón, como sería de esperar, está imprimindo a nome do programa, xa que argv 0 é 151 00:08:30,440 --> 00:08:32,970 sempre será o nome do programa. 152 00:08:32,970 --> 00:08:35,640 Pero imos facer algo un pouco máis interesante. 153 00:08:35,640 --> 00:08:42,080 >> Así, no conxunto de problemas, será introducida para esta función, atoi. 154 00:08:42,080 --> 00:08:44,440 Entón o que imos usar atoi a? 155 00:08:44,440 --> 00:08:48,550 Isto vai converter un cadea para un enteiro. 156 00:08:48,550 --> 00:08:53,280 Entón, se eu pasar a corda, un, dous, tres, para atoi, que vai converter ese 157 00:08:53,280 --> 00:08:56,910 ao número enteiro, un, dous, tres. 158 00:08:56,910 --> 00:09:01,480 Entón, nós estamos indo a converter o primeiro argumento da liña de comandos para un enteiro, 159 00:09:01,480 --> 00:09:05,690 e despois é só imprimir este enteiro. 160 00:09:05,690 --> 00:09:09,680 >> Entón, basicamente, somos tipo de reimplementar getInt, só o 161 00:09:09,680 --> 00:09:12,350 enteiro insírese ao mando liña, en vez de no programa 162 00:09:12,350 --> 00:09:14,560 interactivamente. 163 00:09:14,560 --> 00:09:23,170 Entón, facendo argv 0, faremos el aquí, e pechar iso. 164 00:09:23,170 --> 00:09:27,670 Entón, correndo argv 0, e imos entrar no enteiro, un, dous, tres, catro, un, dous. 165 00:09:27,670 --> 00:09:30,840 Entón, que vai imprimir o número enteiro, un dous, tres, catro, un, dous. 166 00:09:30,840 --> 00:09:35,500 Hai algunhas sutilezas para que atoi que vai deixar de se preocupar de nada 167 00:09:35,500 --> 00:09:39,040 alén dun carácter numérico válido, pero iso non importa. 168 00:09:39,040 --> 00:09:42,870 >> Entón, o que pensas que pasa se eu fai iso? 169 00:09:42,870 --> 00:09:45,520 170 00:09:45,520 --> 00:09:47,050 Fallo de segmento. 171 00:09:47,050 --> 00:09:50,410 Entón, por que isto? 172 00:09:50,410 --> 00:09:56,060 Se ollar cara atrás, o noso programa, estamos converténdose argv 1, o primeiro argumento 173 00:09:56,060 --> 00:09:59,610 despois do nome do programa, a un enteiro. 174 00:09:59,610 --> 00:10:03,350 Pero non hai ningún argumento pasado despois do nome do programa. 175 00:10:03,350 --> 00:10:08,060 Entón, aquí vemos que este é un buggy programa, xa que, se tentar executa-lo 176 00:10:08,060 --> 00:10:10,530 sen ningún argumento, ela só vai fallar. 177 00:10:10,530 --> 00:10:16,950 >> Entón, outro estándar común verás é algo así como, se argc é menos 178 00:10:16,950 --> 00:10:21,100 que dous, o que indica que non houbo , Polo menos, o nome do programa e unha 179 00:10:21,100 --> 00:10:29,100 primeiro argumento, entón imos facer algo como printf, non o suficiente 180 00:10:29,100 --> 00:10:31,190 Argumentos da liña de comandos. 181 00:10:31,190 --> 00:10:33,170 Iso probablemente non é unha boa para imprimir, probablemente é algo, como 182 00:10:33,170 --> 00:10:35,440 ten que escribir un número enteiro na liña de comandos. 183 00:10:35,440 --> 00:10:37,450 Vou acabar con ela alí. 184 00:10:37,450 --> 00:10:39,600 E, a continuación, regresar 1. 185 00:10:39,600 --> 00:10:44,740 Entón recorda que ao final da nosa programa, se voltar 0, este tipo de 186 00:10:44,740 --> 00:10:47,060 indica éxito. 187 00:10:47,060 --> 00:10:50,940 E principal tamén automaticamente Devolve 0 se non o fai. 188 00:10:50,940 --> 00:10:55,800 >> Entón, aquí, estamos afinado novo 1 para indicar que iso non é éxito. 189 00:10:55,800 --> 00:11:01,000 E pode devolver o que queira, só, 0 indica éxito, e 190 00:11:01,000 --> 00:11:03,390 calquera outra cousa que indica falla. 191 00:11:03,390 --> 00:11:04,855 Entón, imos realizar esta versión das cousas. 192 00:11:04,855 --> 00:11:12,880 193 00:11:12,880 --> 00:11:16,600 Entón, agora, se non entrar nunha liña de comandos argumento, que vai dicir correctamente 194 00:11:16,600 --> 00:11:18,290 nós, non é suficiente liña de comandos. 195 00:11:18,290 --> 00:11:20,610 Non rematou a frase. 196 00:11:20,610 --> 00:11:24,950 Outra cousa, se realmente pasar un, pode completar o programa. 197 00:11:24,950 --> 00:11:27,920 Entón é así que usaría en argc Para validar o número de 198 00:11:27,920 --> 00:11:30,630 argumentos de liña de comandos que son realmente pasou. 199 00:11:30,630 --> 00:11:39,360 >> Entón, imos facer este programa un pouco máis complicado, e ollar para a segunda 200 00:11:39,360 --> 00:11:42,180 iteración das cousas. 201 00:11:42,180 --> 00:11:46,310 Entón, agora, non estamos só a impresión do primeiro argumento da liña de comandos. 202 00:11:46,310 --> 00:11:51,210 Aquí, nós estamos interactuar de iguais i int 0, i é menos argc, i aló 203 00:11:51,210 --> 00:11:55,280 plus, e impresión argv, o índice i. 204 00:11:55,280 --> 00:11:59,300 Polo tanto, este estándar, unha vez máis, que é o mesmo estándar como antes, excepto en vez 205 00:11:59,300 --> 00:12:02,600 de chamar a variable n, estamos usando argc. 206 00:12:02,600 --> 00:12:09,520 >> Polo tanto, esta é a iteración sobre cada índice na matriz, e imprimindo cada 207 00:12:09,520 --> 00:12:11,910 elemento desta matriz. 208 00:12:11,910 --> 00:12:20,300 E así, cando executar este programa, así como, Non entrar en calquera liña de comandos 209 00:12:20,300 --> 00:12:22,540 argumentos, polo que só impresións o nome do programa. 210 00:12:22,540 --> 00:12:26,053 Se eu entrar en unha morea de cousas, que vai imprimir un, cada un na súa propia liña. 211 00:12:26,053 --> 00:12:31,213 212 00:12:31,213 --> 00:12:32,210 >> Aceptar. 213 00:12:32,210 --> 00:12:34,770 Entón, imos dar un paso adiante. 214 00:12:34,770 --> 00:12:38,890 E en vez de imprimir cada argumento na súa propia liña, imos imprimir cada 215 00:12:38,890 --> 00:12:42,590 carácter de cada argumento na súa propia liña. 216 00:12:42,590 --> 00:12:46,700 Entón lembre que é argv unha matriz de cadeas. 217 00:12:46,700 --> 00:12:50,960 Entón, o que é unha cadea, mais un xogo de caracteres? 218 00:12:50,960 --> 00:12:57,140 Entón iso significa que argv é realmente unha dunha matriz de caracteres. 219 00:12:57,140 --> 00:13:04,920 Entón, aproveitando que, imos ignorar isto de momento. 220 00:13:04,920 --> 00:13:08,190 Imos considerar só a cadea argv 0. 221 00:13:08,190 --> 00:13:14,170 >> Polo tanto, se queremos levar cada personaxe de argv 0 na súa propia liña, entón eu quero 222 00:13:14,170 --> 00:13:19,500 de facer o estándar que estamos afeitos, i é menos que a lonxitude da matriz, 223 00:13:19,500 --> 00:13:23,990 que aquí, é de strlen, iso é non o que quero facer, corda 224 00:13:23,990 --> 00:13:26,450 s é igual a 0 argv. 225 00:13:26,450 --> 00:13:30,390 Así, i é inferior á lonxitude do noso matriz, que neste caso é unha matriz 226 00:13:30,390 --> 00:13:34,410 de caracteres, i plus plus. 227 00:13:34,410 --> 00:13:41,040 E así, como vimos a semana pasada, é ideal moverse que strlen fóra 228 00:13:41,040 --> 00:13:45,210 da condición, xa que non vai engadir o strlen de s cada vez que imos 229 00:13:45,210 --> 00:13:47,720 a través do lazo, e é non vai estar cambiando. 230 00:13:47,720 --> 00:13:50,230 Entón, imos define-lo igual a n aquí. 231 00:13:50,230 --> 00:13:54,260 232 00:13:54,260 --> 00:13:55,170 >> Aceptar. 233 00:13:55,170 --> 00:14:01,320 Entón, agora, estamos interactuar sobre cada índice do array. 234 00:14:01,320 --> 00:14:05,630 E así, se queremos imprimir cada carácter nese array, cento c é 235 00:14:05,630 --> 00:14:06,880 bandeira que queremos usar para os personaxes. 236 00:14:06,880 --> 00:14:10,750 237 00:14:10,750 --> 00:14:19,770 E agora eu soporte será o corda, personaxe índice i, polo que, se o 238 00:14:19,770 --> 00:14:20,970 corda foron Olá 239 00:14:20,970 --> 00:14:27,530 entón s 0 será h, s soporte 1 e será, e así por diante. 240 00:14:27,530 --> 00:14:30,800 >> Entón, agora queremos combinar estas dúas cousas. 241 00:14:30,800 --> 00:14:35,440 Queremos imprimir cada personaxe de cada argumento de liña de comandos. 242 00:14:35,440 --> 00:14:38,950 Entón, nós imos ter un aniñados para loop. 243 00:14:38,950 --> 00:14:47,480 E convencionalmente, o primeiro contador é i, o seguinte será j, n 244 00:14:47,480 --> 00:14:54,450 será o strlen de argv i, i é menor que n, i, máis aló. 245 00:14:54,450 --> 00:14:59,150 246 00:14:59,150 --> 00:15:06,870 E agora en vez de imprimir argv i, entón argv soporte i vai ao índice - 247 00:15:06,870 --> 00:15:14,280 que será a liña de comandos i-th argumento, argv i, j vai 248 00:15:14,280 --> 00:15:16,925 ser o personaxe de jth argumento de i-th. 249 00:15:16,925 --> 00:15:20,580 250 00:15:20,580 --> 00:15:24,810 Vou me librar dese aquí agora xa que poñelas que loop. 251 00:15:24,810 --> 00:15:33,900 Entón, é equivalente a iguais cadea s argv i, e, a continuación, s soporte j. 252 00:15:33,900 --> 00:15:36,980 >> Ben, non precisa declarar este s variable. 253 00:15:36,980 --> 00:15:44,530 Pola contra, imos combinar estes dous en o que tiñamos, argv i, j. 254 00:15:44,530 --> 00:15:45,780 >> COLUMNA 1: [inaudível]. 255 00:15:45,780 --> 00:15:48,850 256 00:15:48,850 --> 00:15:49,680 >> ROB Boden: Boa chamada. 257 00:15:49,680 --> 00:15:52,936 Polo tanto, este é roto. 258 00:15:52,936 --> 00:15:55,510 Se realmente foi, teriamos xa entenderon iso. 259 00:15:55,510 --> 00:16:01,210 Así, o contador que me interesa neste particular, para 260 00:16:01,210 --> 00:16:05,410 loop é j, o iterador. 261 00:16:05,410 --> 00:16:08,560 Entón tería corrido en cuestións, probablemente un loop infinito, se nós 262 00:16:08,560 --> 00:16:09,540 Non tiña fixado que. 263 00:16:09,540 --> 00:16:12,220 É por iso que tamén estamos a falar sobre a depuración de hoxe. 264 00:16:12,220 --> 00:16:13,120 >> Aceptar. 265 00:16:13,120 --> 00:16:15,240 Entón, imos realizar este programa. 266 00:16:15,240 --> 00:16:21,200 E imos realmente engadir un printf separado aquí que só vai imprimir 267 00:16:21,200 --> 00:16:27,480 outra liña, xa que iso significa que cando executar o programa, haberá un espazo en branco 268 00:16:27,480 --> 00:16:31,830 liña entre cada personaxe do cada argumento de liña de comandos. 269 00:16:31,830 --> 00:16:33,448 Ben, imos ver o que iso significa. 270 00:16:33,448 --> 00:16:37,310 271 00:16:37,310 --> 00:16:37,790 OOP. 272 00:16:37,790 --> 00:16:39,870 Ten algún erro. 273 00:16:39,870 --> 00:16:42,860 Erro implicitamente declarando función de biblioteca strlen. 274 00:16:42,860 --> 00:16:51,630 >> Entón, volvendo para o noso programa, eu esquezo de botar inclúen string.h. 275 00:16:51,630 --> 00:16:54,240 276 00:16:54,240 --> 00:16:57,730 Entón string.h será o arquivo de cabeceira que declara 277 00:16:57,730 --> 00:16:58,980 a función strlen. 278 00:16:58,980 --> 00:17:04,650 279 00:17:04,650 --> 00:17:06,060 OK, el compila. 280 00:17:06,060 --> 00:17:09,109 Agora, imos executalo. 281 00:17:09,109 --> 00:17:10,930 Entón, só iso. 282 00:17:10,930 --> 00:17:17,790 Vai imprimir a nosa nome do programa, Ola mundo. 283 00:17:17,790 --> 00:17:23,510 Vai imprimir cada cousa, cada un personaxe, na súa propia liña. 284 00:17:23,510 --> 00:17:24,540 Aceptar. 285 00:17:24,540 --> 00:17:30,625 >> Entón, imos realmente tomar esta un paso adiante. 286 00:17:30,625 --> 00:17:34,050 287 00:17:34,050 --> 00:17:39,700 E en vez de usar string.h, imos pensar sobre como iríamos aplicar a nosa propia 288 00:17:39,700 --> 00:17:41,420 función strlen. 289 00:17:41,420 --> 00:17:45,600 Entón, eu vou dar inmediatamente sinatura da función. 290 00:17:45,600 --> 00:17:52,900 Entón, imos chamar my_strlen, e é vai levar unha cadea como argumento, 291 00:17:52,900 --> 00:17:57,220 e esperamos para volver lonxitude desta corda. 292 00:17:57,220 --> 00:18:03,430 Entón, onde é esa cara? 293 00:18:03,430 --> 00:18:04,990 Si 294 00:18:04,990 --> 00:18:06,740 Aceptar. 295 00:18:06,740 --> 00:18:12,900 Entón lembre-se a partir do foto anterior que Foi tamén a partir da semana pasada, que un 296 00:18:12,900 --> 00:18:18,890 array de caracteres, así, unha cadea, entón imos dicir que esta é a nosa cadea s. 297 00:18:18,890 --> 00:18:29,870 Polo tanto, se s é a cadea, Ola, entón, H-E-L-L-O, na memoria, que vai 298 00:18:29,870 --> 00:18:35,610 ser, a continuación, esta barra invertida 0 carácter. 299 00:18:35,610 --> 00:18:39,170 >> Entón, como podemos obter a lonxitude de s? 300 00:18:39,170 --> 00:18:43,190 Ben, o truco é mirar para este repercutiría 0 personaxe, este nulo 301 00:18:43,190 --> 00:18:44,380 Terminator. 302 00:18:44,380 --> 00:18:50,270 Así, o algoritmo Vai para ser algo así como uns 303 00:18:50,270 --> 00:18:51,510 caracteres suficientes que - 304 00:18:51,510 --> 00:18:56,180 imos ter a man representan algúns contador, imos chamar iso de lonxitude int. 305 00:18:56,180 --> 00:19:00,060 Así, a partir de aquí, somos vai interactuar sobre a nosa cadea. 306 00:19:00,060 --> 00:19:04,100 >> Así, o primeiro personaxe, é H, e non está de volta reducir 0, polo tanto, 307 00:19:04,100 --> 00:19:05,170 a lonxitude é 1. 308 00:19:05,170 --> 00:19:08,050 Iterate ao seguinte carácter, E, e non é barra invertida 0. 309 00:19:08,050 --> 00:19:09,630 A lonxitude é 2. 310 00:19:09,630 --> 00:19:10,960 G, 3. 311 00:19:10,960 --> 00:19:11,850 L, 4. 312 00:19:11,850 --> 00:19:13,050 Ó, 5. 313 00:19:13,050 --> 00:19:16,690 E, finalmente, chegamos a barra invertida 0, e así que iso significa, tamén, 314 00:19:16,690 --> 00:19:17,780 esta cadea é longo. 315 00:19:17,780 --> 00:19:20,130 Entón, imos volver 5. 316 00:19:20,130 --> 00:19:33,630 >> Entón, en realidade, a posta en marcha que, en primeiro lugar, meu lonxitude n é igual a 0, a miña man dereita. 317 00:19:33,630 --> 00:19:36,088 E imos facer unha iteración - 318 00:19:36,088 --> 00:19:38,000 >> COLUMNA 1: [inaudível] 319 00:19:38,000 --> 00:19:38,640 >> ROB Boden: Oh, tirar. 320 00:19:38,640 --> 00:19:39,870 Boa chamada. 321 00:19:39,870 --> 00:19:42,680 Lanza. 322 00:19:42,680 --> 00:19:44,140 Así, a lonxitude n igual a 0. 323 00:19:44,140 --> 00:19:46,910 324 00:19:46,910 --> 00:19:58,310 Entón, agora, lonxitude, mentres S non igual e, a continuación, barra invertida 0. 325 00:19:58,310 --> 00:20:04,660 Entón lembre, esta barra invertida 0, é unha personaxe real, e indica 326 00:20:04,660 --> 00:20:05,820 o fin da cadea. 327 00:20:05,820 --> 00:20:09,850 Así como, tamén, de barra invertida n é un personaxe real. 328 00:20:09,850 --> 00:20:14,040 Barra invertida 0 vai para indicar o fin da nosa cadea. 329 00:20:14,040 --> 00:20:15,414 Eu non quero poñer isto alí. 330 00:20:15,414 --> 00:20:19,190 331 00:20:19,190 --> 00:20:25,620 E mentres s indexados pola lonxitude non é igual ao terminador nulo, entón 332 00:20:25,620 --> 00:20:27,130 nós só estamos indo para incrementar lonxitude. 333 00:20:27,130 --> 00:20:29,860 334 00:20:29,860 --> 00:20:34,880 Entón, ao final do noso programa, lonxitude é, finalmente, vai 335 00:20:34,880 --> 00:20:37,610 5 ser neste caso. 336 00:20:37,610 --> 00:20:39,210 E nós imos lonxitude basta voltar. 337 00:20:39,210 --> 00:20:42,570 338 00:20:42,570 --> 00:20:43,530 >> Aceptar. 339 00:20:43,530 --> 00:20:48,290 Entón, agora aquí, eu non facer my_strlen. 340 00:20:48,290 --> 00:20:50,700 Imos recompila-lo para asegurarse de todo corra ben. 341 00:20:50,700 --> 00:20:55,820 342 00:20:55,820 --> 00:20:58,210 Eu estaba facendo en 2? 343 00:20:58,210 --> 00:21:00,565 Ou foi un? 344 00:21:00,565 --> 00:21:01,940 Isto debe facer. 345 00:21:01,940 --> 00:21:02,690 Todo ben. 346 00:21:02,690 --> 00:21:08,490 Polo tanto, esta é argv 2. 347 00:21:08,490 --> 00:21:11,585 Funciona como previsto, aínda que foi a de que o que eu fixen iso en? 348 00:21:11,585 --> 00:21:15,060 349 00:21:15,060 --> 00:21:15,550 Si 350 00:21:15,550 --> 00:21:16,760 Aceptar. 351 00:21:16,760 --> 00:21:21,820 Esta versión das cousas que non tiña a nova liña printf despois, pero 352 00:21:21,820 --> 00:21:22,910 non fai calquera diferenza. 353 00:21:22,910 --> 00:21:23,300 Aceptar. 354 00:21:23,300 --> 00:21:25,780 Así funcionou como se esperaba. 355 00:21:25,780 --> 00:21:34,750 >> Agora podemos ata combinar un paso máis lonxe, onde aviso aquí, ben, 356 00:21:34,750 --> 00:21:38,920 primeiro, estamos collendo o strlen de argv i, e entón nós estamos iterando 357 00:21:38,920 --> 00:21:41,450 cada personaxe nesa cadea. 358 00:21:41,450 --> 00:21:47,480 Entón, en vez de facelo, o que se só combinar esa lóxica de esperar 359 00:21:47,480 --> 00:21:50,740 ata chegar barra invertida 0 dereito neste loop for? 360 00:21:50,740 --> 00:21:53,740 361 00:21:53,740 --> 00:22:07,490 Entón iteración mentres argv i, j fai non coincide barra invertida 0. 362 00:22:07,490 --> 00:22:10,680 Entón, imos executa-lo por primeira vez. 363 00:22:10,680 --> 00:22:19,838 364 00:22:19,838 --> 00:22:21,180 >> Todo ben. 365 00:22:21,180 --> 00:22:27,655 Entón, aquí, esta condición está dicindo - 366 00:22:27,655 --> 00:22:38,090 367 00:22:38,090 --> 00:22:40,060 imos aclarar iso. 368 00:22:40,060 --> 00:22:49,140 Entón, agora, que este sexa o noso argv. 369 00:22:49,140 --> 00:22:55,290 Entón, cando eu só corrín este programa antes, argv é unha matriz de cadeas. 370 00:22:55,290 --> 00:23:03,100 E así, se eu executa-lo con un punto argv barra 2, Ola mundo, entón o argv 371 00:23:03,100 --> 00:23:07,650 si é lonxitude 3, para argv cero, Ola, e mundo. 372 00:23:07,650 --> 00:23:11,700 373 00:23:11,700 --> 00:23:19,660 >> E no interior de cada un destes índices é, tamén unha matriz, onde esta será 374 00:23:19,660 --> 00:23:23,780 punto, iso vai ser barra, eu non sei se esa era a dirección correcta, eu 375 00:23:23,780 --> 00:23:25,680 Non creo que era. 376 00:23:25,680 --> 00:23:30,110 A-N-V trazo, precisa de máis espazo. 377 00:23:30,110 --> 00:23:32,570 Imos cortar a esta matriz. 378 00:23:32,570 --> 00:23:38,230 Trazo 0 e barra invertida 0 A-R-V. 379 00:23:38,230 --> 00:23:43,160 E entón en desorde será Olá 380 00:23:43,160 --> 00:23:45,910 Digamos, H-E barra invertida 0. 381 00:23:45,910 --> 00:23:51,130 E, finalmente, o W-O invertida 0. 382 00:23:51,130 --> 00:23:59,730 >> Así, o algoritmo que acaba de escribir, o aniñados para loops, o que están 383 00:23:59,730 --> 00:24:07,321 facendo é, primeiro temos o contador i e logo, j. 384 00:24:07,321 --> 00:24:15,206 Isto sería máis doado co código do pantalla, Imos volver a iso. 385 00:24:15,206 --> 00:24:17,476 Aceptar. 386 00:24:17,476 --> 00:24:24,600 Entón entender que i é o iterador que é iteración sobre cada comando 387 00:24:24,600 --> 00:24:25,610 argumento de liña. 388 00:24:25,610 --> 00:24:28,870 E xa é a iteración iterador sobre cada personaxe no que 389 00:24:28,870 --> 00:24:30,410 argumento de liña de comandos. 390 00:24:30,410 --> 00:24:46,755 Entón, o que este printf íntimo está facendo é, temos printf argv 0 0, printf 391 00:24:46,755 --> 00:24:58,680 argv 0 1, printf argv 0 2 0 3 0 4 0 5, 0 6, pero agora, argv 0 7 vai 392 00:24:58,680 --> 00:25:00,670 igual barra invertida 0. 393 00:25:00,670 --> 00:25:05,730 >> Entón saímos para que loop, e agora eu repite a 1. 394 00:25:05,730 --> 00:25:10,910 E agora nós estamos indo para imprimir argv 1 0, argv 1 1 - 395 00:25:10,910 --> 00:25:17,040 ben, agora, xa que eu corte Ola definitiva, argv 1 2 é de novo será 396 00:25:17,040 --> 00:25:18,170 barra invertida 0. 397 00:25:18,170 --> 00:25:25,050 E así, incrementar i e seguir, e así por diante, ata que imprimir 398 00:25:25,050 --> 00:25:28,580 mundo, e estas son tres de liña de comandos argumentos, e nós imos saír do 399 00:25:28,580 --> 00:25:31,670 o circuíto externo, e rematar noso programa. 400 00:25:31,670 --> 00:25:38,390 401 00:25:38,390 --> 00:25:39,640 Aceptar. 402 00:25:39,640 --> 00:25:43,903 403 00:25:43,903 --> 00:25:46,795 >> Entón, imos voltar aquí. 404 00:25:46,795 --> 00:25:49,670 405 00:25:49,670 --> 00:25:52,370 Entón, vai gañar algunha familiaridade con argumentos de liña de comandos neste 406 00:25:52,370 --> 00:25:54,460 determinado conxunto de problemas. 407 00:25:54,460 --> 00:25:56,630 >> Agora, a depuración. 408 00:25:56,630 --> 00:26:01,680 Entón, probablemente xa tivo que facer algunha depuración co seu anterior 409 00:26:01,680 --> 00:26:03,120 conxunto de problemas. 410 00:26:03,120 --> 00:26:08,420 E un xeito moi sinxelo de depuración, en primeiro lugar, imos ollar para un programa de buggy. 411 00:26:08,420 --> 00:26:20,710 412 00:26:20,710 --> 00:26:23,830 Ben, andando por este programa, imos pedir ao usuario a un 413 00:26:23,830 --> 00:26:29,350 enteiro, tome ese enteiro, e logo arbitrariamente, temos un loop while que 414 00:26:29,350 --> 00:26:32,280 é só ir a diminuír i ata que sexa igual a 10. 415 00:26:32,280 --> 00:26:35,820 Supoñamos que eu estou entrando un número enteiro maior que 10. 416 00:26:35,820 --> 00:26:38,700 Entón diminuír i ata que sexa igual a 10. 417 00:26:38,700 --> 00:26:42,630 >> E entón temos outro loop while que, a pesar de i non é igual a 0, estamos 418 00:26:42,630 --> 00:26:44,540 vai diminuír i por 3. 419 00:26:44,540 --> 00:26:49,790 Entón, se ves a intención do erro aquí, é que iso vai diminuír i para 420 00:26:49,790 --> 00:26:57,010 ser 10, e despois esta vontade loop while decremento i de 10, a 7, a 4, a 1, 421 00:26:57,010 --> 00:27:02,880 a 2 negativo, para negativo 5, e así por diante, ao infinito negativo, xa que eu vou 422 00:27:02,880 --> 00:27:05,920 en realidade, nunca igual a 0. 423 00:27:05,920 --> 00:27:08,610 E despois, a finais do presente programa, que teñen a función foo que se 424 00:27:08,610 --> 00:27:12,130 pasando impresión que eu. 425 00:27:12,130 --> 00:27:16,520 >> Polo tanto, este é un programa curto e trivial, eo erro sexa obvio, 426 00:27:16,520 --> 00:27:18,790 especialmente despois de eu dixo que o erro era. 427 00:27:18,790 --> 00:27:24,840 Pero a intención aquí é, así, este pode realmente parecido con algunhas das súas 428 00:27:24,840 --> 00:27:30,040 solucións de ávida da última problema definido, e quizais ten 429 00:27:30,040 --> 00:27:32,800 algún loop infinito no seu programa, e non ten idea 430 00:27:32,800 --> 00:27:34,100 o que está causando tanto. 431 00:27:34,100 --> 00:27:38,690 Así, unha técnica de depuración moi útil é só engadir printfs 432 00:27:38,690 --> 00:27:40,180 todo o seu código. 433 00:27:40,180 --> 00:27:49,200 >> Entón, aquí eu quero un printf fóra primeiro loop while. 434 00:27:49,200 --> 00:27:53,155 E aquí quero un printf, e eu vou imprimir i. 435 00:27:53,155 --> 00:27:55,670 436 00:27:55,670 --> 00:27:58,330 Eu mesmo vou facer en primeiro lugar, mentres loop, i. 437 00:27:58,330 --> 00:28:05,130 438 00:28:05,130 --> 00:28:09,040 Aí, segundo loop while. 439 00:28:09,040 --> 00:28:12,170 Unha vez máis, imprimir dentro aquí, o valor i. 440 00:28:12,170 --> 00:28:16,270 441 00:28:16,270 --> 00:28:17,520 E imos realizar este. 442 00:28:17,520 --> 00:28:22,620 443 00:28:22,620 --> 00:28:24,800 >> Debug barra Así punto. 444 00:28:24,800 --> 00:28:25,610 Insira un número enteiro. 445 00:28:25,610 --> 00:28:28,150 Imos facer 13. 446 00:28:28,150 --> 00:28:28,760 E boom. 447 00:28:28,760 --> 00:28:33,300 Vemos que estamos loop infinito dentro do segundo circuíto, mentres. 448 00:28:33,300 --> 00:28:36,305 Polo tanto, agora sabemos cal é o erro. 449 00:28:36,305 --> 00:28:39,610 450 00:28:39,610 --> 00:28:45,610 Pero printf depuración é perfectamente grande, pero xa que os seus programas de obter 451 00:28:45,610 --> 00:28:50,560 máis longo e complicado, hai solucións máis sofisticadas para 452 00:28:50,560 --> 00:28:51,705 facer as cousas funcionando. 453 00:28:51,705 --> 00:28:52,955 Polo tanto, imos eliminar todas esas printfs. 454 00:28:52,955 --> 00:29:06,242 455 00:29:06,242 --> 00:29:08,896 E imos ter seguro que eu non fixen romper nada. 456 00:29:08,896 --> 00:29:09,850 Aceptar. 457 00:29:09,850 --> 00:29:14,180 >> Así, o programa que imos introducir chámase 458 00:29:14,180 --> 00:29:16,715 GDB, para o GNU Debugger. 459 00:29:16,715 --> 00:29:21,892 460 00:29:21,892 --> 00:29:27,510 Ben, en realidade, imos eliminar depuración un segundo, e facer debug de novo. 461 00:29:27,510 --> 00:29:31,420 462 00:29:31,420 --> 00:29:34,440 Ben, en realidade, en primeiro lugar, unha boa lección en argumentos de liña de comandos. 463 00:29:34,440 --> 00:29:37,780 Teña en conta que esta orde Clang que é compilando todo está a ser pasado 464 00:29:37,780 --> 00:29:41,300 na liña de comandos, estes Argumentos da liña de comandos. 465 00:29:41,300 --> 00:29:46,250 Entón, exactamente como está indo estar usando argumentos de liña de comandos, como nós 466 00:29:46,250 --> 00:29:51,500 fixo antes, e como vai en PSET 2, que é como Clang é usalos. 467 00:29:51,500 --> 00:30:00,070 >> Entón, teña en conta que esta primeira bandeira, trazo ggdb3, o que está dicindo é que, Clang, 468 00:30:00,070 --> 00:30:03,790 ten que compilar este ficheiro co intención que acabará 469 00:30:03,790 --> 00:30:05,380 Debe depurá-lo. 470 00:30:05,380 --> 00:30:13,840 Entón, mentres ten esa bandeira, entón podemos GDB depuración. 471 00:30:13,840 --> 00:30:17,380 E vai abrir o depurador GNU. 472 00:30:17,380 --> 00:30:22,920 >> Polo tanto, hai unha morea de comandos que precisa para se acostumar. 473 00:30:22,920 --> 00:30:27,100 Primeiro que probablemente vai inmediatamente necesitamos é Executar. 474 00:30:27,100 --> 00:30:28,200 Entón o que está Executar vai facer? 475 00:30:28,200 --> 00:30:30,910 Comezará o noso programa. 476 00:30:30,910 --> 00:30:36,180 Entón execute o programa de partida, o programa de pídenos a un enteiro de 13. 477 00:30:36,180 --> 00:30:39,170 E entón é infinito looping como espera, excepto eu eliminar o 478 00:30:39,170 --> 00:30:40,500 printfs, polo que nin sequera ver iso. 479 00:30:40,500 --> 00:30:43,320 480 00:30:43,320 --> 00:30:44,600 Saíu normalmente. 481 00:30:44,600 --> 00:30:45,850 Oh 482 00:30:45,850 --> 00:30:48,570 483 00:30:48,570 --> 00:30:53,640 É posible que implica toda a volta, volta a - ignorando iso. 484 00:30:53,640 --> 00:30:55,170 Supoña que non saír normalmente. 485 00:30:55,170 --> 00:30:59,500 486 00:30:59,500 --> 00:31:03,370 Hai unha resposta complicada para iso. 487 00:31:03,370 --> 00:31:07,890 >> Así que agora, que non é moi útil. 488 00:31:07,890 --> 00:31:11,480 Entón, só tes que executar o programa no interior este depurador non nos axuda en calquera 489 00:31:11,480 --> 00:31:15,610 forma, xa que podería ter feito dot cortar depuración de fóra GDB. 490 00:31:15,610 --> 00:31:21,250 Así, a orde que probablemente vai - 491 00:31:21,250 --> 00:31:22,970 e eu vou saír desta. 492 00:31:22,970 --> 00:31:25,850 Control-d ou saír, tanto traballo. 493 00:31:25,850 --> 00:31:29,550 Entón, imos abri-lo de novo. 494 00:31:29,550 --> 00:31:31,130 >> Outro comando que, probablemente, quere inmediatamente para 495 00:31:31,130 --> 00:31:33,600 habituar-se é Break. 496 00:31:33,600 --> 00:31:37,120 Entón, imos romper a principal, polo momento, e entón eu vou explicar isto. 497 00:31:37,120 --> 00:31:41,010 498 00:31:41,010 --> 00:31:46,370 Ben, aquí vemos que definir un punto de interrupción nesta liña en debug.c. 499 00:31:46,370 --> 00:31:50,160 Entón, o que significa rompe é que cando eu tipo de execución, o programa vai 500 00:31:50,160 --> 00:31:53,560 seguir funcionando ata Eu bati un punto de interrupción. 501 00:31:53,560 --> 00:31:59,390 Entón, cando bati prazo, o programa iníciase, e despois se rompe, logo que el 502 00:31:59,390 --> 00:32:01,940 entra a función principal. 503 00:32:01,940 --> 00:32:06,930 Rompe principal será algo vostede moi comunmente fan. 504 00:32:06,930 --> 00:32:11,340 >> E agora, para presenta-lo para algúns comandos. 505 00:32:11,340 --> 00:32:14,330 Teña en conta aquí, que está dicindo que romperon na liña 11, que se 506 00:32:14,330 --> 00:32:16,230 printf, introduza un número enteiro. 507 00:32:16,230 --> 00:32:21,260 Así, a orde seguinte será como imos á seguinte liña de código. 508 00:32:21,260 --> 00:32:24,810 Isto vai permitir-nos para a etapa a través da nosa liña de programa por liña. 509 00:32:24,810 --> 00:32:26,260 Así, na seguinte. 510 00:32:26,260 --> 00:32:29,820 >> Agora a liña 12, nós imos para obter o número enteiro. 511 00:32:29,820 --> 00:32:30,450 Seguinte. 512 00:32:30,450 --> 00:32:34,290 E se só prema Intro novo, que vai refacer a última cousa que fixo. 513 00:32:34,290 --> 00:32:36,480 Entón eu non teño escribir xunto de cada vez. 514 00:32:36,480 --> 00:32:40,100 Entón, introduza un número enteiro de 13. 515 00:32:40,100 --> 00:32:46,940 Entón, agora, liña 14, mentres que i é maior de 10, e eu vou facer a continuación. 516 00:32:46,940 --> 00:32:48,685 E vemos que imos diminuír i. 517 00:32:48,685 --> 00:32:50,210 Entón, nós estamos indo a diminuír i novo. 518 00:32:50,210 --> 00:32:53,620 >> Entón, agora, outra utilidade comando é Imprimir. 519 00:32:53,620 --> 00:32:55,750 Así Imprimir vai a imprimir o valor da variable. 520 00:32:55,750 --> 00:32:57,825 Imos levar o valor i variable. 521 00:32:57,825 --> 00:32:58,705 Imos imprimir i. 522 00:32:58,705 --> 00:33:00,910 Vai dicir que eu é 11. 523 00:33:00,910 --> 00:33:03,330 Agora nós Seguinte de novo mentres i é maior que 10. 524 00:33:03,330 --> 00:33:05,590 Entón, eu aínda é maior que 10, xa que ten 11 anos. 525 00:33:05,590 --> 00:33:06,920 i menos menos. 526 00:33:06,920 --> 00:33:08,250 Imos imprimir i novo. 527 00:33:08,250 --> 00:33:10,950 Como esperaba, ten 10 anos. 528 00:33:10,950 --> 00:33:12,510 >> Entón, agora, ao lado. 529 00:33:12,510 --> 00:33:16,250 El vai volver para a condición, i é superior a 10, pero agora é i 10, de xeito 530 00:33:16,250 --> 00:33:20,040 non é maior que 10, por iso, esperamos que caia fóra do loop while. 531 00:33:20,040 --> 00:33:22,220 E agora estamos por baixo desa liña de código. 532 00:33:22,220 --> 00:33:28,750 E outro mando, List, é só ir para mostrar o anterior eo seguinte 533 00:33:28,750 --> 00:33:31,240 par de liñas de código, en No caso de se perdeu. 534 00:33:31,240 --> 00:33:35,420 Entón nós só saíu este loop while, e agora nós entramos neste 535 00:33:35,420 --> 00:33:37,080 mentres loop, liña 18. 536 00:33:37,080 --> 00:33:39,860 Así, mentres i non é igual a 0. 537 00:33:39,860 --> 00:33:46,570 E, a continuación, i é igual a I menos 3, e nós imos notar, este só vai continuar. 538 00:33:46,570 --> 00:33:48,270 E podemos imprimir i. 539 00:33:48,270 --> 00:33:49,990 >> Cada orde ten unha especie de atallos. 540 00:33:49,990 --> 00:33:51,720 Entón p é curto para Imprimir. 541 00:33:51,720 --> 00:33:53,400 Entón podemos p i. 542 00:33:53,400 --> 00:33:57,550 Só ten que manter sostendo n, ou continuar facendo Seguinte. 543 00:33:57,550 --> 00:33:58,340 Imprimir i novo. 544 00:33:58,340 --> 00:34:00,380 Ve agora é negativo 167. 545 00:34:00,380 --> 00:34:06,030 Entón, que vai durar para sempre, pero non realmente para sempre, xa que acaba de ver, é 546 00:34:06,030 --> 00:34:09,330 vai realmente acabar en algún momento. 547 00:34:09,330 --> 00:34:15,699 >> Así que comeza GDB. 548 00:34:15,699 --> 00:34:19,504 Pero imos facer unha cousa en GDB. 549 00:34:19,504 --> 00:34:20,754 Uh, depuración. 550 00:34:20,754 --> 00:34:23,540 551 00:34:23,540 --> 00:34:28,534 Así, neste caso particular, o loop infinito pasou a ser dentro 552 00:34:28,534 --> 00:34:30,050 a función principal. 553 00:34:30,050 --> 00:34:35,779 E, polo de agora, só aceptar que que eu son vai mover o ciclo infinito en 554 00:34:35,779 --> 00:34:37,029 a función foo. 555 00:34:37,029 --> 00:34:40,679 556 00:34:40,679 --> 00:34:43,730 Basta lembrar que, ao final do presente programa, ben, este era orixinalmente 557 00:34:43,730 --> 00:34:46,210 chamar foo, que era só indo para imprimir i. 558 00:34:46,210 --> 00:34:51,880 Pero agora estamos chamando foo, que é vai diminuír i ata que sexa 0, e 559 00:34:51,880 --> 00:34:54,548 a continuación, imprimir esa variable. 560 00:34:54,548 --> 00:34:55,469 Aceptar. 561 00:34:55,469 --> 00:34:57,970 Garde iso. 562 00:34:57,970 --> 00:35:00,175 Fai depuración. 563 00:35:00,175 --> 00:35:03,310 E agora, gdb depuración. 564 00:35:03,310 --> 00:35:04,090 Aceptar. 565 00:35:04,090 --> 00:35:10,580 >> Entón, se eu só correr, entón eu non vou ser capaz de realmente pasar pola miña 566 00:35:10,580 --> 00:35:11,730 liña por liña do programa. 567 00:35:11,730 --> 00:35:19,820 Entón, imos romper a principal, e escriba prazo. 568 00:35:19,820 --> 00:35:28,160 Entón, pasar por iso, printf, introduza un enteiro, conseguir o número enteiro de 13. 569 00:35:28,160 --> 00:35:34,180 570 00:35:34,180 --> 00:35:37,490 Entón, nós estamos indo a perder decremento ata i é maior que 10. 571 00:35:37,490 --> 00:35:42,840 Entón imos a caer ata o while, e chegar á liña - 572 00:35:42,840 --> 00:35:44,364 Imos abrilo nunha ventá separada. 573 00:35:44,364 --> 00:35:48,720 574 00:35:48,720 --> 00:35:53,300 Entón, nós diminuída ata que eu xa non era superior a 10, e entón nós 575 00:35:53,300 --> 00:35:55,700 chamou a función, foo. 576 00:35:55,700 --> 00:36:01,340 >> Entón o que pasou así que eu bati función foo, ben, eu chamei a foo, e 577 00:36:01,340 --> 00:36:04,030 entón eu non tiña máis control sobre o GDB. 578 00:36:04,030 --> 00:36:10,230 Así, logo que eu bati continuación nesta liña, cousas continuou ata que iso aconteceu, 579 00:36:10,230 --> 00:36:12,400 onde a programa saíu cando - 580 00:36:12,400 --> 00:36:14,450 asumir que non existía eventualmente. 581 00:36:14,450 --> 00:36:16,390 Viu unha pausa para un pouco aínda. 582 00:36:16,390 --> 00:36:22,040 Entón, por que eu perda o control sobre o programa en que punto? 583 00:36:22,040 --> 00:36:27,540 Ben, cando eu tecleo seguinte, que vai a a seguinte liña de código que literal 584 00:36:27,540 --> 00:36:28,850 se levará a cabo. 585 00:36:28,850 --> 00:36:35,950 Así, tras a liña 21, a seguinte liña de código que será realizada é a liña 22, 586 00:36:35,950 --> 00:36:38,520 que é, saíndo da principal. 587 00:36:38,520 --> 00:36:43,810 Entón, eu non quero só ir á seguinte liña de código. 588 00:36:43,810 --> 00:36:48,170 Quero ir á función, foo, e despois tamén percorrer 589 00:36:48,170 --> 00:36:49,830 esas liñas de código. 590 00:36:49,830 --> 00:36:53,726 >> Entón, para iso, temos unha alternativa. 591 00:36:53,726 --> 00:36:56,770 Imos parar con iso de novo. 592 00:36:56,770 --> 00:36:58,020 Rompe principal. 593 00:36:58,020 --> 00:37:00,520 594 00:37:00,520 --> 00:37:06,370 Uh, 1, next, next, 13, ao lado, next, next, con coidado, 595 00:37:06,370 --> 00:37:09,820 antes de bater liña foo. 596 00:37:09,820 --> 00:37:10,520 Aceptar. 597 00:37:10,520 --> 00:37:13,700 >> Entón, agora, estamos na liña 21, onde chamamos foo. 598 00:37:13,700 --> 00:37:17,100 Non queremos que escribir próximo, xa que só vai chamar a función foo, e 599 00:37:17,100 --> 00:37:18,710 ir á seguinte liña de código. 600 00:37:18,710 --> 00:37:20,840 O que queremos empregar é Step. 601 00:37:20,840 --> 00:37:25,690 Polo tanto, hai unha diferenza entre a Paso e no seguinte, onde paso os pasos para o 602 00:37:25,690 --> 00:37:28,190 funciona, e no próximo vai sobre a función. 603 00:37:28,190 --> 00:37:32,830 El só executa a totalidade de a función e segue indo. 604 00:37:32,830 --> 00:37:37,210 >> Entón Paso traerá connosco en función, foo. 605 00:37:37,210 --> 00:37:41,160 E vemos aquí, agora, estamos de volta ao ese loop while que é, en teoría, 606 00:37:41,160 --> 00:37:44,190 seguirá para sempre. 607 00:37:44,190 --> 00:37:50,420 E se bater Step, cando non o é unha función para chamar, entón é 608 00:37:50,420 --> 00:37:51,720 idéntica á seguida. 609 00:37:51,720 --> 00:37:55,320 Entón, é só cando está nunha liña que está chamado unha función que o paso 610 00:37:55,320 --> 00:37:56,970 vai diferir en Seguinte. 611 00:37:56,970 --> 00:37:57,930 Entón Paso vai traer aquí. 612 00:37:57,930 --> 00:38:02,100 Paso, paso, paso, paso, paso, paso, e imos Infinite Loop para sempre. 613 00:38:02,100 --> 00:38:06,810 >> Entón, pode se acostumar con iso como a súa forma de identificar loops infinitos, é 614 00:38:06,810 --> 00:38:08,960 só sostendo esta tecla Intro para ver onde queda preso. 615 00:38:08,960 --> 00:38:11,610 616 00:38:11,610 --> 00:38:14,780 Hai xeitos mellores de facelo, pero polo de agora, iso é perfectamente suficiente. 617 00:38:14,780 --> 00:38:17,967 E estilisticamente, conforme Estilo 50, eu debería ter feito isto. 618 00:38:17,967 --> 00:38:21,550 619 00:38:21,550 --> 00:38:24,030 Aceptar. 620 00:38:24,030 --> 00:38:28,400 >> Entón, un último comando a introducir. 621 00:38:28,400 --> 00:38:30,810 Ben, imos gdb depuración dentro 622 00:38:30,810 --> 00:38:35,580 Entón, en vez de romper a principal, se eu coñecer a función foo é tamén o 623 00:38:35,580 --> 00:38:39,230 problema, entón eu podería só dixo, romper a foo, no seu lugar. 624 00:38:39,230 --> 00:38:42,310 Imos dicir que eu rompe a ambos inicio e foo. 625 00:38:42,310 --> 00:38:45,390 Así, pode definir como moitos puntos de interrupción como quere. 626 00:38:45,390 --> 00:38:49,230 Cando eu tecleo prazo, que vai deixar na - 627 00:38:49,230 --> 00:38:52,180 ooh, imos recompilar, sempre Eu mudei as cousas. 628 00:38:52,180 --> 00:38:55,950 Verá esta liña, Aviso fonte ficheiro é máis recente do que executable. 629 00:38:55,950 --> 00:38:59,680 Entón iso significa que eu só fun aquí e cambiou a eles para estar de acordo con Estilo 630 00:38:59,680 --> 00:39:03,100 50, pero eu non recompilar o programa. 631 00:39:03,100 --> 00:39:04,870 Entón GDB me fai consciente diso. 632 00:39:04,870 --> 00:39:10,130 Vou deixar de fumar, facer debug de novo, bater gdb depuración. 633 00:39:10,130 --> 00:39:10,700 Aceptar. 634 00:39:10,700 --> 00:39:12,800 >> Entón, agora, volver ao que eu estaba facendo. 635 00:39:12,800 --> 00:39:15,720 Rompe principal, foo pausa. 636 00:39:15,720 --> 00:39:20,680 Agora, se eu executar o programa, polo que é vai continuar ata que alcanza unha 637 00:39:20,680 --> 00:39:21,320 breakpoint. 638 00:39:21,320 --> 00:39:24,680 Esta interrupción pasa a ser o primeiro en principal. 639 00:39:24,680 --> 00:39:28,630 Agora, en vez de facer next, next, next, next, next, ata que eu bati foo, eu 640 00:39:28,630 --> 00:39:35,230 pode escribir seguir, que continuará ata chegar ao seguinte punto de interrupción. 641 00:39:35,230 --> 00:39:37,200 Teño que entrar no primeiro número enteiro. 642 00:39:37,200 --> 00:39:40,570 Continuar continuará ata que eu bati o seguinte punto de interrupción, que é o que 643 00:39:40,570 --> 00:39:43,320 función de foo. 644 00:39:43,320 --> 00:39:50,130 >> Entón Run levará a cabo ata que bata un breakpoint, pero só escribir run cando 645 00:39:50,130 --> 00:39:54,060 está empezando o programa, e logo a partir de entón, é continuar. 646 00:39:54,060 --> 00:40:01,950 Se eu só fixen romper principal e logo foi, que vai romper a 647 00:40:01,950 --> 00:40:03,670 principal, e logo continuar. 648 00:40:03,670 --> 00:40:10,050 Dende que eu non teño un punto de ruptura en foo, introducir o número enteiro, entón agora eu estou 649 00:40:10,050 --> 00:40:11,380 non vai romper a foo. 650 00:40:11,380 --> 00:40:16,318 É só ir ao infinito loop ata que. 651 00:40:16,318 --> 00:40:17,568 Aceptar. 652 00:40:17,568 --> 00:40:19,500 653 00:40:19,500 --> 00:40:24,420 >> Entón, iso é Introdución á GDB. 654 00:40:24,420 --> 00:40:27,790 Ten que comezar a usalo nos seus conxuntos de problemas. 655 00:40:27,790 --> 00:40:30,550 Pode ser moi útil para identificar erros. 656 00:40:30,550 --> 00:40:35,280 Se realmente só, liña por liña, vaia a través do seu código, e comparar o que é 657 00:40:35,280 --> 00:40:39,740 realmente a suceder co que espera acontecer, entón é moi 658 00:40:39,740 --> 00:40:41,060 difícil perder os seus erros. 659 00:40:41,060 --> 00:40:45,280 660 00:40:45,280 --> 00:40:46,530 Aceptar. 661 00:40:46,530 --> 00:40:48,310 662 00:40:48,310 --> 00:40:54,040 >> Entón, a semana pasada, David trouxo presente cousas cifrado de clave secreta para o 663 00:40:54,040 --> 00:40:59,350 primeira vez, onde nós non queremos contrasinais só ser almacenado na nosa 664 00:40:59,350 --> 00:41:03,210 ordenador en algún arquivo de texto simple, onde alguén pode vir e só 665 00:41:03,210 --> 00:41:04,660 abrilo e le-los. 666 00:41:04,660 --> 00:41:07,530 Ideal, eles serían criptografía dalgún modo. 667 00:41:07,530 --> 00:41:13,340 E o conxunto de problemas 2, estará lidando con un método de criptografia, 668 00:41:13,340 --> 00:41:16,520 ou, ben, dous métodos, pero eles non son tan grandes. 669 00:41:16,520 --> 00:41:20,050 Se fai a edición hacker, está Tamén vai estar lidando con 670 00:41:20,050 --> 00:41:22,150 descifrar algunhas cousas. 671 00:41:22,150 --> 00:41:29,770 >> Así, a cuestión agora é, así, aínda que temos o cifrado máis forte 672 00:41:29,770 --> 00:41:34,830 algoritmo do mundo, se escolle un particularmente pobre contrasinal, polo que 673 00:41:34,830 --> 00:41:37,720 non vai axudar moito, pois a xente aínda será capaz de descubrir iso. 674 00:41:37,720 --> 00:41:41,530 Mesmo a ver a cadea cifrada el se parece unha confusión de lixo 675 00:41:41,530 --> 00:41:44,760 que non significa nada para eles, se eles aínda só precisa probar algunhas claves 676 00:41:44,760 --> 00:41:50,560 para descubrir iso, entón non son moi seguros. 677 00:41:50,560 --> 00:41:55,890 Entón, a asistir a un vídeo que fai ese punto. 678 00:41:55,890 --> 00:41:59,587 679 00:41:59,587 --> 00:42:00,970 >> [REPRODUCIÓN] 680 00:42:00,970 --> 00:42:02,100 >> -Helmet, vostede demo. 681 00:42:02,100 --> 00:42:03,370 O que está a suceder? 682 00:42:03,370 --> 00:42:05,170 O que está facendo a miña filla? 683 00:42:05,170 --> 00:42:09,910 >> -Permítame presentar o brillante novo cirurxián plástico, Dr Phillip 684 00:42:09,910 --> 00:42:13,730 Schlotkin, o maior nariz home do traballo en todo o 685 00:42:13,730 --> 00:42:16,080 universo, e Beverly Hills. 686 00:42:16,080 --> 00:42:17,210 >> -A súa Alteza. 687 00:42:17,210 --> 00:42:18,070 >> -Nariz traballo? 688 00:42:18,070 --> 00:42:18,670 Non estou entendendo. 689 00:42:18,670 --> 00:42:20,090 Ela xa tiña unha plástica no nariz. 690 00:42:20,090 --> 00:42:21,910 Era un doce dezaseis presente. 691 00:42:21,910 --> 00:42:22,140 >> -No. 692 00:42:22,140 --> 00:42:23,690 Non é o que pensa. 693 00:42:23,690 --> 00:42:25,420 É moi, moito peor. 694 00:42:25,420 --> 00:42:30,300 Se non me der a combinación de o escudo do aire, Dr Schlotkin vontade 695 00:42:30,300 --> 00:42:34,226 dar a súa filla de volta o seu antigo nariz. 696 00:42:34,226 --> 00:42:35,476 >> -No. 697 00:42:35,476 --> 00:42:38,712 698 00:42:38,712 --> 00:42:40,516 De onde tirou iso? 699 00:42:40,516 --> 00:42:41,440 >> -Todo ben. 700 00:42:41,440 --> 00:42:42,180 Eu vou che dicir. 701 00:42:42,180 --> 00:42:43,381 Eu vou che dicir. 702 00:42:43,381 --> 00:42:44,263 Non, papá. 703 00:42:44,263 --> 00:42:45,590 Non, non debe. 704 00:42:45,590 --> 00:42:46,860 >> -Está ben, miña querida. 705 00:42:46,860 --> 00:42:48,450 Vou sentir falta do seu novo nariz. 706 00:42:48,450 --> 00:42:52,090 Pero eu non vou dicir-lle a combinación, non importa o que. 707 00:42:52,090 --> 00:42:53,680 >> -Moi ben. 708 00:42:53,680 --> 00:42:55,685 Dr Schlotkin, faga o peor. 709 00:42:55,685 --> 00:42:56,914 >> -O pracer é meu. 710 00:42:56,914 --> 00:43:00,690 >> [TOOLS ser afiadas] 711 00:43:00,690 --> 00:43:01,910 >> -No. 712 00:43:01,910 --> 00:43:02,520 Espera. 713 00:43:02,520 --> 00:43:03,836 Espera. 714 00:43:03,836 --> 00:43:05,300 Eu vou che dicir. 715 00:43:05,300 --> 00:43:06,880 Eu vou che dicir. 716 00:43:06,880 --> 00:43:09,130 >> -Sabía que ía traballar. 717 00:43:09,130 --> 00:43:09,900 Todo ben. 718 00:43:09,900 --> 00:43:12,850 Dáme iso. 719 00:43:12,850 --> 00:43:16,918 >> -A combinación é un. 720 00:43:16,918 --> 00:43:17,406 >> -One. 721 00:43:17,406 --> 00:43:18,382 >> -One. 722 00:43:18,382 --> 00:43:19,358 >> -Two. 723 00:43:19,358 --> 00:43:19,846 >> -Two. 724 00:43:19,846 --> 00:43:20,822 >> -Two. 725 00:43:20,822 --> 00:43:21,310 >> -Tres. 726 00:43:21,310 --> 00:43:21,798 >> -Tres. 727 00:43:21,798 --> 00:43:22,774 >> -Tres. 728 00:43:22,774 --> 00:43:23,262 >> -Catro. 729 00:43:23,262 --> 00:43:23,750 >> -Catro. 730 00:43:23,750 --> 00:43:26,150 >> -Catro. 731 00:43:26,150 --> 00:43:27,010 >> -Five. 732 00:43:27,010 --> 00:43:27,670 >> -Five. 733 00:43:27,670 --> 00:43:29,010 >> -Five. 734 00:43:29,010 --> 00:43:34,770 >> -Así, a combinación é un, dous, tres, catro, cinco. 735 00:43:34,770 --> 00:43:37,460 Esta é a combinación máis estúpida Que eu xa oín na miña vida. 736 00:43:37,460 --> 00:43:39,710 Ese é o tipo de cousas que un idiota tería na súa equipaxe. 737 00:43:39,710 --> 00:43:42,000 >> -Grazas, a súa Alteza. 738 00:43:42,000 --> 00:43:43,530 >> -O que fixo? 739 00:43:43,530 --> 00:43:44,490 >> -Eu apaguei a parede. 740 00:43:44,490 --> 00:43:45,420 >> -Non, non fixo. 741 00:43:45,420 --> 00:43:45,840 Vostede desconectou a película enteiro. 742 00:43:45,840 --> 00:43:46,930 >> -Debo ter axustado o botón errado. 743 00:43:46,930 --> 00:43:48,265 >> -Ben, colocar-lo de novo. 744 00:43:48,265 --> 00:43:49,110 Pon a película de novo. 745 00:43:49,110 --> 00:43:49,510 >> -Si, señor. 746 00:43:49,510 --> 00:43:49,917 Si, señor. 747 00:43:49,917 --> 00:43:50,324 >> -Imos, Arnold. 748 00:43:50,324 --> 00:43:51,140 Veña, Gretchen. 749 00:43:51,140 --> 00:43:53,060 Claro, vostede sabe que eu vou ten que cobre-lo por iso. 750 00:43:53,060 --> 00:43:53,440 >> [FIN reprodución de vídeo] 751 00:43:53,440 --> 00:43:54,690 >> ROB Boden: Todo ben. 752 00:43:54,690 --> 00:43:59,690 753 00:43:59,690 --> 00:44:08,430 Polo tanto, agora que xa estamos falando de seguridade, de certa forma, agradable 754 00:44:08,430 --> 00:44:16,050 pouco poster da película, polo tanto, en última día, estas cuestións co NSA 755 00:44:16,050 --> 00:44:17,300 vixían todo. 756 00:44:17,300 --> 00:44:21,840 757 00:44:21,840 --> 00:44:26,930 Pode ser difícil de se sentir como ter algún tipo de protección de datos en 758 00:44:26,930 --> 00:44:34,540 mundo en liña, aínda que eu non podería dicir te a maioría dos detalles de Prism. 759 00:44:34,540 --> 00:44:42,130 Entón, indo alén Prism, nós non imos estar falando sobre iso, agora 760 00:44:42,130 --> 00:44:44,030 pensar sobre o seu portátil. 761 00:44:44,030 --> 00:44:48,360 Entón, aquí, quero cambiar para a miña conta real, 762 00:44:48,360 --> 00:44:50,370 co meu pequeno pingüín. 763 00:44:50,370 --> 00:44:57,310 Entón, eu teño un conxunto de contrasinal, e que contrasinal é o que quere que sexa. 764 00:44:57,310 --> 00:45:02,430 >> Pero lembre-se de que o que eu estou entrando con, así que este usuario 765 00:45:02,430 --> 00:45:04,850 alerta, é algún programa. 766 00:45:04,850 --> 00:45:07,910 É un programa que foi escrito por unha persoa. 767 00:45:07,910 --> 00:45:13,250 E por iso, que a persoa, se se particularmente mal intencionado, que puideron 768 00:45:13,250 --> 00:45:17,780 xa dixen, todo ben, por iso, se o contrasinal que eu entro coincide co meu 769 00:45:17,780 --> 00:45:22,800 contrasinal real, ou é igual para algunha contrasinal especial - 770 00:45:22,800 --> 00:45:25,550 David é incrible, ou algo así - 771 00:45:25,550 --> 00:45:27,190 logo deixalos dentro 772 00:45:27,190 --> 00:45:33,760 Así, un programador mal intencionado podería acceso a todos os seus Macs, ou 773 00:45:33,760 --> 00:45:36,150 De Windows, ou calquera cousa. 774 00:45:36,150 --> 00:45:41,980 >> De xeito que non é moito dunha preocupación, xa que, Quero dicir, que é programa de inicio de sesión 775 00:45:41,980 --> 00:45:48,720 que se inclúe co OS X, centos ou miles de persoas teñen 776 00:45:48,720 --> 00:45:50,020 Revisei este código. 777 00:45:50,020 --> 00:45:55,330 E así, si, o seu código nalgún lugar, dicir que esta cadea é igual a igual 778 00:45:55,330 --> 00:45:58,860 David é incrible, login, entón alguén está será, tipo, esperar. 779 00:45:58,860 --> 00:45:59,800 Iso non é certo. 780 00:45:59,800 --> 00:46:01,790 Isto non debería estar aquí. 781 00:46:01,790 --> 00:46:06,650 Entón, iso é un xeito de facer as cousas para ser unha especie de seguro. 782 00:46:06,650 --> 00:46:10,300 >> Pero pense mesmo programas que escribe. 783 00:46:10,300 --> 00:46:13,000 Imos dicir que escribiu o programa de inicio de sesión. 784 00:46:13,000 --> 00:46:20,440 Polo tanto, este programa de inicio de sesión que escribiu, entón, obviamente, é un bo 785 00:46:20,440 --> 00:46:21,210 programador. 786 00:46:21,210 --> 00:46:25,610 Non vai poñer calquera mal intencionado se x é igual a igual David é incrible 787 00:46:25,610 --> 00:46:27,860 no seu código. 788 00:46:27,860 --> 00:46:31,930 Pero este programa, o que fai empregar para compilar este programa? 789 00:46:31,930 --> 00:46:34,180 Algo así como Clang. 790 00:46:34,180 --> 00:46:38,460 Así que se a persoa que pasou a escribir Clang especial casetonado en Clang 791 00:46:38,460 --> 00:46:44,310 algo así como, se estou compilando o sesión do programa, a continuación, escriba o código 792 00:46:44,310 --> 00:46:49,720 para o programa de inicio de sesión que di que, se x é igual a igual David é incrible? 793 00:46:49,720 --> 00:46:59,890 Polo tanto, non moito aínda, pero temos o mesmo emitir aquí, onde Clang, ben, 794 00:46:59,890 --> 00:47:03,790 miles, se non decenas de miles de persoas, ter ollo para Clang, teñen 795 00:47:03,790 --> 00:47:07,160 ollou para as súas liñas de código, e dixo: todo ben, non hai nada de malo aquí. 796 00:47:07,160 --> 00:47:10,680 Obviamente, ninguén está a facer algo esta mal intencionado. 797 00:47:10,680 --> 00:47:15,780 >> Pero o que é propio bumbum, como, e se eu compilar Clang? 798 00:47:15,780 --> 00:47:20,900 E se eu tivera algún compilador que compila Clang que inserir Clang 799 00:47:20,900 --> 00:47:25,610 este truco especial que di, todo ben, cando compilar Clang, entón o 800 00:47:25,610 --> 00:47:31,290 executable Recibe debe sobre todo ollar dentro do programa de inicio de sesión e inserción 801 00:47:31,290 --> 00:47:34,230 esta contrasinal, é igual a igual Dave é impresionante? 802 00:47:34,230 --> 00:47:37,990 Entón lembre de que o seu propio compilador ten que ser feita nalgún momento. 803 00:47:37,990 --> 00:47:42,810 Polo tanto, se o que escoller para compilar Clang con, en si é mal intencionado, entón 804 00:47:42,810 --> 00:47:45,580 pode ser aparafusada a todo camiño para abaixo da liña. 805 00:47:45,580 --> 00:47:49,630 >> Entón, aquí temos Ken Thompson e Dennis Ritchie. 806 00:47:49,630 --> 00:47:53,780 Polo tanto, esta é unha foto iconas. 807 00:47:53,780 --> 00:47:55,470 Dennis Ritchie está á dereita. 808 00:47:55,470 --> 00:47:58,740 El é un gran - 809 00:47:58,740 --> 00:48:03,640 practicamente escribiu C. Así, pode agradece-lo por esta clase. 810 00:48:03,640 --> 00:48:04,840 Ken Thomson é do lado esquerdo. 811 00:48:04,840 --> 00:48:07,780 Os dous basicamente escribiu UNIX. 812 00:48:07,780 --> 00:48:10,140 Ben, eles foron grandes contribuíntes en UNIX. 813 00:48:10,140 --> 00:48:11,310 Había algúns outros. 814 00:48:11,310 --> 00:48:16,240 Entón, Ken Thompson, nalgún momento, el gañou o Premio Turing. 815 00:48:16,240 --> 00:48:20,860 E o premio Turing, eu sempre escoitei el referenciada deste xeito, é o 816 00:48:20,860 --> 00:48:23,100 Premio Nobel de ciencia da computación. 817 00:48:23,100 --> 00:48:27,500 >> Entón, o Premio Turing, ten que dar o seu discurso de aceptación. 818 00:48:27,500 --> 00:48:31,790 E dá esta moi famoso discurso agora, chamado Reflexións sobre Confianza 819 00:48:31,790 --> 00:48:35,620 Trust, que temos conectados na páxina web do curso. 820 00:48:35,620 --> 00:48:41,670 E, neste discurso, el di, todo ben, entón escribín UNIX, e agora todos 821 00:48:41,670 --> 00:48:43,320 vostede a xente está usando UNIX. 822 00:48:43,320 --> 00:48:46,960 Agora, lembre-se, hoxe, que Linux é un descendente directo do UNIX. 823 00:48:46,960 --> 00:48:50,140 X usa directamente UNIX. 824 00:48:50,140 --> 00:48:53,810 Windows non fai moito, pero moito de ideas foron tiradas de UNIX. 825 00:48:53,810 --> 00:48:59,220 >> Así, el vai ata o escenario e di: todo ben, eu escribín UNIX. 826 00:48:59,220 --> 00:49:03,940 E só así vostede sabe, eu son capaz de facer sesión en cada 827 00:49:03,940 --> 00:49:05,590 un único dos seus ordenadores. 828 00:49:05,590 --> 00:49:14,280 Dende que eu poñer un destes especial se x é igual a igual Ken Thomson é incrible, 829 00:49:14,280 --> 00:49:16,350 entón eu teño permiso para entrar. 830 00:49:16,350 --> 00:49:18,370 Entón, as persoas son como, ben, Como fai iso? 831 00:49:18,370 --> 00:49:21,090 Miramos para o programa de inicio de sesión e nada está aí. 832 00:49:21,090 --> 00:49:24,700 El é como, ben, eu modifiquei o compilador para entrar no programa de inicio de sesión 833 00:49:24,700 --> 00:49:30,490 para que o programa de inicio de sesión terá agora que x é igual a igual Ken Thompson 834 00:49:30,490 --> 00:49:31,700 é incrible. 835 00:49:31,700 --> 00:49:33,120 >> E din, ben, iso non é verdade. 836 00:49:33,120 --> 00:49:35,740 Estamos mirando para o compilador, eo compilador carece liñas de 837 00:49:35,740 --> 00:49:36,400 código coma este. 838 00:49:36,400 --> 00:49:40,540 El é como, OK, pero o que está a compilar o compilador con? 839 00:49:40,540 --> 00:49:44,810 E eles pensan, e el é, como, así, Eu son o único que lle deu o compilador 840 00:49:44,810 --> 00:49:50,580 que está a usar para compilar o compilador, polo que está compilando un compilador, que 841 00:49:50,580 --> 00:49:56,390 en si é mal intencionado, e ganas romper o programa de inicio de sesión. 842 00:49:56,390 --> 00:49:59,360 Entón, basicamente, nese punto, non hai ningunha maneira que podes ollar para a fonte 843 00:49:59,360 --> 00:50:02,450 código do programa de inicio de sesión para ver o que está mal. 844 00:50:02,450 --> 00:50:04,220 Non podía nin mirar de código fonte do compilador 845 00:50:04,220 --> 00:50:06,790 para ver o que está mal. 846 00:50:06,790 --> 00:50:11,940 >> Ten que ollar para a máquina de código, o binario efectivo da 847 00:50:11,940 --> 00:50:16,760 compilado compilador para ver, esperar, estes liñas de código non debería estar aquí. 848 00:50:16,760 --> 00:50:22,130 Pero Ken Thompson deu un paso máis lonxe e dixo, ben, hai 849 00:50:22,130 --> 00:50:25,980 estes programas especiais que efectivamente axudar a ler o binario de programas, 850 00:50:25,980 --> 00:50:29,340 e por iso, se alguén usou ese programa para ler o binario, verían estes 851 00:50:29,340 --> 00:50:30,490 liñas de código. 852 00:50:30,490 --> 00:50:34,020 El cambiou estes programas para dicir, todo o ben, se está mirando para o 853 00:50:34,020 --> 00:50:38,460 compilador, non mostran este particular conxunto de binario. 854 00:50:38,460 --> 00:50:42,830 >> Entón, entón tes que dar un paso aínda máis e, basicamente, que podería 855 00:50:42,830 --> 00:50:46,210 tomadas varios niveis de erro, e nalgún momento, ninguén é realmente 856 00:50:46,210 --> 00:50:47,990 estará alomenos. 857 00:50:47,990 --> 00:50:52,590 Así, a moral da historia é, vostede é non vai ser escrito 858 00:50:52,590 --> 00:50:54,340 Clang nesta clase. 859 00:50:54,340 --> 00:50:57,020 Vai estar a usar escalada Tinido moito nesta clase. 860 00:50:57,020 --> 00:51:00,490 Para todos saben, Clang é un malicioso programa que está sabotando cada 861 00:51:00,490 --> 00:51:03,520 único programa que xa compilado. 862 00:51:03,520 --> 00:51:08,206 E para deixar aquel mesmo sinistro notar, velo na Mércores. 863 00:51:08,206 --> 00:51:10,030 >> [Aplausos] 864 00:51:10,030 --> 00:51:12,935 >> COLUMNA 2: Na seguinte CS50. 865 00:51:12,935 --> 00:51:14,580 >> COLUMNA 3: Non se atreve a dicilo. 866 00:51:14,580 --> 00:51:15,930 Podes facelo. 867 00:51:15,930 --> 00:51:19,440 Xa o fixo antes, pode facelo hoxe en día, pode facelo mañá. 868 00:51:19,440 --> 00:51:20,930 Ten feito isto hai anos. 869 00:51:20,930 --> 00:51:22,790 Só tes que ir ata alí e facelo. 870 00:51:22,790 --> 00:51:24,310 Podes facelo. 871 00:51:24,310 --> 00:51:26,102 >> [Música tocando]