1 00:00:00,000 --> 00:00:00,487 2 00:00:00,487 --> 00:00:11,210 >> [MUSIQUE JEU] 3 00:00:11,210 --> 00:00:12,100 >> ROB BODEN: Très bien. 4 00:00:12,100 --> 00:00:15,620 Donc, la première chose d'abord, de la vidéo d'un visage familier. 5 00:00:15,620 --> 00:00:22,080 6 00:00:22,080 --> 00:00:22,560 >> [VIDEO LECTURE] 7 00:00:22,560 --> 00:00:23,370 >> -Très bien. 8 00:00:23,370 --> 00:00:27,150 C'est CS50, et c'est le début de la troisième semaine. 9 00:00:27,150 --> 00:00:29,980 Je suis désolé, je ne pouvais pas être là avec vous aujourd'hui, mais permettez-moi de vous présenter 10 00:00:29,980 --> 00:00:32,880 Propre Rob Boden CS50. 11 00:00:32,880 --> 00:00:33,872 >> [LECTURE VIDEO FIN] 12 00:00:33,872 --> 00:00:39,340 >> [Applaudissements et des acclamations] 13 00:00:39,340 --> 00:00:41,277 >> ROB BODEN: La filmographie en que la vidéo est fantastique. 14 00:00:41,277 --> 00:00:47,280 15 00:00:47,280 --> 00:00:47,770 Très bien. 16 00:00:47,770 --> 00:00:50,960 Alors d'abord, il ya un autre déjeuner. 17 00:00:50,960 --> 00:00:52,330 C'est demain à 01h15. 18 00:00:52,330 --> 00:00:54,480 Il n'y a pas déjeuner ce vendredi. 19 00:00:54,480 --> 00:00:55,810 C'est avec Quora. 20 00:00:55,810 --> 00:01:00,190 Et Tommy n'est pas encore là, mais l'un des les gens qui y est ancien CF tête, 21 00:01:00,190 --> 00:01:01,530 Tommy McWilliam. 22 00:01:01,530 --> 00:01:02,730 Donc, il s'agit d'un type d'amusement. 23 00:01:02,730 --> 00:01:04,819 Vous devriez venir. 24 00:01:04,819 --> 00:01:05,900 >> Très bien. 25 00:01:05,900 --> 00:01:11,360 Donc, la semaine dernière, nous avons commencé à briser sur ce qu'est une chaîne est vraiment. 26 00:01:11,360 --> 00:01:14,830 On sait depuis le début que c'est une séquence de caractères. 27 00:01:14,830 --> 00:01:18,130 Mais la semaine dernière, nous avons fouillé dans le fait que ce qui est vraiment une séquence de 28 00:01:18,130 --> 00:01:22,110 caractères, eh bien, nous avons maintenant des tableaux de caractères. 29 00:01:22,110 --> 00:01:26,450 Et nous savons qu'une chaîne, c'est un tableau de caractères, à la fin, 30 00:01:26,450 --> 00:01:30,920 nous avons cet octet nul spéciale, ce 0 barre oblique inverse, qui indique la fin d' 31 00:01:30,920 --> 00:01:32,230 la chaîne. 32 00:01:32,230 --> 00:01:36,970 >> Et si une chaîne est un tableau de caractères, mais nous pouvons avoir plus d' 33 00:01:36,970 --> 00:01:39,530 simplement un tableau de caractères, nous pouvons avoir un tableau de n'importe quel 34 00:01:39,530 --> 00:01:40,890 type de chose que nous voulons. 35 00:01:40,890 --> 00:01:51,570 Donc, si vous vous souvenez de la semaine dernière, la programme Age que David a présenté 36 00:01:51,570 --> 00:01:53,560 très rapidement. 37 00:01:53,560 --> 00:01:57,010 Donc la première chose que nous allons faire est demander à l'utilisateur un nombre entier, l' 38 00:01:57,010 --> 00:01:58,800 nombre de personnes dans la salle. 39 00:01:58,800 --> 00:02:01,260 Une fois que nous avons entier, nous déclarer un tableau. 40 00:02:01,260 --> 00:02:02,890 Notez cette syntaxe de support. 41 00:02:02,890 --> 00:02:04,540 Vous allez vous habituer à cela. 42 00:02:04,540 --> 00:02:09,430 >> Nous allons donc déclarer un tableau d'entiers appelés les âges, et il ya n 43 00:02:09,430 --> 00:02:12,080 entiers de ce tableau. 44 00:02:12,080 --> 00:02:16,480 Donc, ce modèle ici, ce 4 int i est égal à 0, i est inférieur à n, i plus 45 00:02:16,480 --> 00:02:20,580 en plus, que va également être un motif que vous êtes très habitué. 46 00:02:20,580 --> 00:02:24,000 Parce que c'est à peu près la façon dont vous êtes toujours aller pour parcourir les tableaux. 47 00:02:24,000 --> 00:02:26,330 Alors, n'oubliez pas que n est le longueur de notre réseau. 48 00:02:26,330 --> 00:02:32,120 Et ici, nous demandons à plusieurs reprises de l'âge de la personne i dans la chambre. 49 00:02:32,120 --> 00:02:36,640 >> Après cela, nous allons vers le bas, et quelle qu'en soit la raison quelconque, nous avons ensuite 50 00:02:36,640 --> 00:02:40,220 imprimer quel âge ils vont pour une année à partir de maintenant. 51 00:02:40,220 --> 00:02:49,980 Et l'exécution de ce programme, nous allons faire âges, dot âges slash. 52 00:02:49,980 --> 00:02:53,010 Donc, le nombre de personnes dans la salle, disons il ya trois. 53 00:02:53,010 --> 00:02:59,880 Et dire, la première personne est 13, se trouve à côté 26, et la dernière est 30. 54 00:02:59,880 --> 00:03:05,080 Alors il va itérer sur ces trois personnes, d'imprimer 14, 27, et 31. 55 00:03:05,080 --> 00:03:16,060 >> Alors, n'oubliez pas que lorsque nous déclarons une tableau de taille n, les indices qui 56 00:03:16,060 --> 00:03:19,950 tableau, le tableau a des valeurs et les indices 0, 1, 2, tout le chemin 57 00:03:19,950 --> 00:03:21,680 à n moins 1. 58 00:03:21,680 --> 00:03:26,255 Ainsi, lorsque nous l'avons dit, il y avait trois personnes dans la salle, et nous mettons ici 59 00:03:26,255 --> 00:03:29,850 la première itération à travers ce boucle, i va être 0. 60 00:03:29,850 --> 00:03:31,650 Donc, dans l'indice 0. 61 00:03:31,650 --> 00:03:34,540 Nous attribuons la première vieillir l'utilisateur entre. 62 00:03:34,540 --> 00:03:38,870 Puis, en le suivant, nous entrons dans la deuxième n l'utilisateur entre, et dans 63 00:03:38,870 --> 00:03:40,580 à côté de deux, le dernier n. 64 00:03:40,580 --> 00:03:44,200 >> Donc remarquer que un tableau de taille trois n'a rien 65 00:03:44,200 --> 00:03:46,040 l'indice trois. 66 00:03:46,040 --> 00:03:49,036 Ce n'est pas valide. 67 00:03:49,036 --> 00:03:50,250 Très bien. 68 00:03:50,250 --> 00:03:55,136 Donc, pour revenir ici. 69 00:03:55,136 --> 00:03:57,650 70 00:03:57,650 --> 00:04:01,590 Alors, maintenant que nous avons traité avec des tableaux, nous avons une certaine familiarité. 71 00:04:01,590 --> 00:04:03,780 Maintenant, nous allons passer à la commande arguments de ligne, qui vont être 72 00:04:03,780 --> 00:04:05,890 assez pertinente à cet ensemble de problèmes. 73 00:04:05,890 --> 00:04:09,670 >> Donc, jusqu'à présent, chaque fois que vous avez déclaré votre fonction principale, nous avons 74 00:04:09,670 --> 00:04:11,230 dit void main int. 75 00:04:11,230 --> 00:04:14,070 Donc nul signifie simplement que nous n'adoptons pas une 76 00:04:14,070 --> 00:04:16,440 arguments de cette fonction. 77 00:04:16,440 --> 00:04:19,190 Maintenant, nous allons voir que le principal peut prendre quelques arguments. 78 00:04:19,190 --> 00:04:22,470 Ici, nous les appelons int argc cordes et crochets de argv. 79 00:04:22,470 --> 00:04:26,930 Les supports, une fois de plus, ce qui indique que nous avons affaire avec des tableaux. 80 00:04:26,930 --> 00:04:31,850 Donc, ici, entre parenthèses chaîne de argv, nous sommes face à un tableau de chaînes. 81 00:04:31,850 --> 00:04:35,360 Donc argc, cela va indiquer combien d'arguments que nous avons 82 00:04:35,360 --> 00:04:37,580 passé à ce programme. 83 00:04:37,580 --> 00:04:46,050 Et pour voir ce que cela signifie, Fermons cette. 84 00:04:46,050 --> 00:04:46,490 >> OK. 85 00:04:46,490 --> 00:04:50,790 Donc, jusqu'à présent, nous avons exécuté chaque programme comme âges slash dot. 86 00:04:50,790 --> 00:04:55,250 Nous pouvons également, à la ligne de commande, passé passer des arguments, d'où le terme, commande 87 00:04:55,250 --> 00:04:56,550 arguments de ligne. 88 00:04:56,550 --> 00:04:59,760 Ainsi, le premier argument, bonjour monde. 89 00:04:59,760 --> 00:05:03,350 Donc, ici, argc serait de trois. 90 00:05:03,350 --> 00:05:07,720 C'est le nombre des arguments à la ligne de commande. 91 00:05:07,720 --> 00:05:12,840 Argc est toujours au moins une, depuis le point réduire les âges, elle-même, qui est considéré comme l'un des 92 00:05:12,840 --> 00:05:14,490 les arguments de ligne de commande. 93 00:05:14,490 --> 00:05:17,010 >> Alors bonjour est la première. 94 00:05:17,010 --> 00:05:20,460 Si âges slash dot est le zéro, alors bonjour est le premier, et le monde est 95 00:05:20,460 --> 00:05:22,830 Le deuxième argument de ligne de commande. 96 00:05:22,830 --> 00:05:29,490 Ainsi, la chaîne de argv, nous allons le voir, contient les chaînes, slash dot 97 00:05:29,490 --> 00:05:33,830 âges, bonjour, et dans le monde. 98 00:05:33,830 --> 00:05:38,945 Et, à la demande de David, nous allons pour lire une vidéo présentant que. 99 00:05:38,945 --> 00:05:42,486 100 00:05:42,486 --> 00:05:43,890 >> [VIDEO LECTURE] 101 00:05:43,890 --> 00:05:46,240 >> -Jusqu'à présent, dans les programmes que nous avons écrite, nous avons déclarons 102 00:05:46,240 --> 00:05:48,500 principal void main int. 103 00:05:48,500 --> 00:05:51,170 Et tout ce temps, ce vide a simplement été précisant que la 104 00:05:51,170 --> 00:05:54,430 programme ne prend pas arguments de ligne de commande. 105 00:05:54,430 --> 00:05:57,750 En d'autres termes, lorsqu'un utilisateur exécute une programme, il ou elle peut assurer le commandement 106 00:05:57,750 --> 00:06:01,710 arguments de ligne en écrivant supplémentaires des mots ou des phrases après le programme de 107 00:06:01,710 --> 00:06:03,000 nom à l'invite. 108 00:06:03,000 --> 00:06:06,550 >> Eh bien, si vous ne vous voulez que votre programme prendre des arguments de ligne de commande, un ou 109 00:06:06,550 --> 00:06:10,540 plusieurs de ces mots, nous avons besoin de remplacer annuler avec un couple d'arguments. 110 00:06:10,540 --> 00:06:12,200 Alors faisons-le. 111 00:06:12,200 --> 00:06:15,750 Inclure CS50.h. 112 00:06:15,750 --> 00:06:19,360 Inclure io.h. norme 113 00:06:19,360 --> 00:06:20,760 Int main. 114 00:06:20,760 --> 00:06:26,330 Et maintenant, au lieu de vide, je vais spécifier un int argc appelé, et un 115 00:06:26,330 --> 00:06:28,780 tableau de chaînes appelées argv. 116 00:06:28,780 --> 00:06:31,820 Maintenant, argc et argv sont simplement conventions. 117 00:06:31,820 --> 00:06:34,000 >> Nous aurions pu appelé ces arguments plus tout ce que nous voulons. 118 00:06:34,000 --> 00:06:37,630 Mais ce qui est important, c'est que argc est un int parce que, par définition, il est 119 00:06:37,630 --> 00:06:41,360 va contenir le nombre d'arguments, l' nombre de mots au total que l' 120 00:06:41,360 --> 00:06:43,380 utilisateur a tapé à son invite. 121 00:06:43,380 --> 00:06:47,910 argv, quant à lui, l'argument vecteur, est va être en réalité un tableau de stockage 122 00:06:47,910 --> 00:06:52,020 tous les mots que l'utilisateur a tapé à son invite. 123 00:06:52,020 --> 00:06:54,500 >> Passons à faire quelque chose maintenant avec un ou plusieurs de ceux-ci 124 00:06:54,500 --> 00:06:55,660 arguments de ligne de commande. 125 00:06:55,660 --> 00:07:00,070 En particulier, nous allons aller de l'avant et d'impression Quelque soit le mot que l'utilisateur tape 126 00:07:00,070 --> 00:07:03,960 après le nom du programme à l'invite. 127 00:07:03,960 --> 00:07:04,730 Ouvrir le support. 128 00:07:04,730 --> 00:07:06,240 Fermer support. 129 00:07:06,240 --> 00:07:10,510 Printf pour cent de barre oblique inverse et la virgule. 130 00:07:10,510 --> 00:07:14,550 Et maintenant, je dois dire que printf valeur à brancher sur cet espace réservé. 131 00:07:14,550 --> 00:07:18,600 Je veux que le premier mot que l'utilisateur a tapé après le nom du programme, 132 00:07:18,600 --> 00:07:23,130 et donc je vais préciser argv support 1, près 133 00:07:23,130 --> 00:07:24,830 parenthèses, point-virgule. 134 00:07:24,830 --> 00:07:27,290 >> Maintenant, pourquoi support 1 et non 0 support? 135 00:07:27,290 --> 00:07:30,990 Eh bien, il s'avère que, automatiquement mémorisées dans argv 0 va être l' 136 00:07:30,990 --> 00:07:32,620 Le véritable nom de programme. 137 00:07:32,620 --> 00:07:36,180 Ainsi, le premier mot que les types d'utilisateurs après le nom du programme est, par 138 00:07:36,180 --> 00:07:38,990 convention, va être stockée dans argv 1. 139 00:07:38,990 --> 00:07:42,380 Compilons maintenant et exécuter ce programme. 140 00:07:42,380 --> 00:07:47,780 >> Faire argv 0, point barre argv 0. 141 00:07:47,780 --> 00:07:50,520 Et maintenant, un mot comme bonjour. 142 00:07:50,520 --> 00:07:51,670 Entrée. 143 00:07:51,670 --> 00:07:53,520 Et il nous l'avons, bonjour. 144 00:07:53,520 --> 00:07:55,750 >> [LECTURE VIDEO FIN] 145 00:07:55,750 --> 00:07:57,000 >> ROB BODEN: Très bien. 146 00:07:57,000 --> 00:07:59,380 147 00:07:59,380 --> 00:08:01,230 Fermez cette. 148 00:08:01,230 --> 00:08:16,730 Donc, en prenant un coup d'oeil à ce programme qui nous avons introduit de nous, eh bien, tout simplement 149 00:08:16,730 --> 00:08:24,710 pour montrer, si nous imprimons argv 0, faire, maintenant quel est-il, argv 0, point barre argv 0. 150 00:08:24,710 --> 00:08:30,440 Donc, comme prévu, c'est l'impression de la le nom du programme, car argv 0 est 151 00:08:30,440 --> 00:08:32,970 toujours aller à la le nom du programme. 152 00:08:32,970 --> 00:08:35,640 Mais nous allons faire quelque chose d'un peu plus intéressant. 153 00:08:35,640 --> 00:08:42,080 >> Donc, dans l'ensemble du problème, vous serez présenter à cette fonction, atoi. 154 00:08:42,080 --> 00:08:44,440 Alors qu'est-ce que nous utilisons pour atoi? 155 00:08:44,440 --> 00:08:48,550 Cela va convertir une chaîne en entier. 156 00:08:48,550 --> 00:08:53,280 Donc, si je passe la chaîne, un deux trois, à atoi, ça va convertir que 157 00:08:53,280 --> 00:08:56,910 à l'entier, un deux trois. 158 00:08:56,910 --> 00:09:01,480 Donc, nous allons convertir la première commande argument de ligne à un nombre entier, 159 00:09:01,480 --> 00:09:05,690 et puis juste imprimer cet entier. 160 00:09:05,690 --> 00:09:09,680 >> Donc, fondamentalement, nous sommes en quelque sorte réimplémentant getint, juste l' 161 00:09:09,680 --> 00:09:12,350 entier est entré à la commande au lieu de la ligne dans le programme 162 00:09:12,350 --> 00:09:14,560 interactive. 163 00:09:14,560 --> 00:09:23,170 Alors, faisant argv 0, faisons il ici, et que fermer. 164 00:09:23,170 --> 00:09:27,670 Il faut donc lancer argv 0, et nous allons entrer dans le entier, un deux trois quatre un deux. 165 00:09:27,670 --> 00:09:30,840 Donc, il va imprimer le nombre entier, un deux trois quatre un deux. 166 00:09:30,840 --> 00:09:35,500 Il ya quelques subtilités à atoi que il va cesser de s'inquiéter de quoi que ce soit 167 00:09:35,500 --> 00:09:39,040 au-delà d'un caractère numérique valide, mais ce n'est pas grave. 168 00:09:39,040 --> 00:09:42,870 >> Alors, que pensez-vous qui se passe si je fais cela? 169 00:09:42,870 --> 00:09:45,520 170 00:09:45,520 --> 00:09:47,050 Segmentation fault. 171 00:09:47,050 --> 00:09:50,410 Alors, pourquoi est-ce? 172 00:09:50,410 --> 00:09:56,060 Si vous regardez en arrière à notre programme, nous sommes conversion argv 1, le premier argument 173 00:09:56,060 --> 00:09:59,610 après le nom du programme, à un nombre entier. 174 00:09:59,610 --> 00:10:03,350 Mais il n'existe aucun argument passé après le nom du programme. 175 00:10:03,350 --> 00:10:08,060 Donc, ici, nous voyons que c'est un buggy programme, car, si nous essayons de l'exécuter 176 00:10:08,060 --> 00:10:10,530 sans aucun argument, il va juste se bloquer. 177 00:10:10,530 --> 00:10:16,950 >> Donc, un autre motif commun que vous verrez est quelque chose comme, si argc est moins 178 00:10:16,950 --> 00:10:21,100 supérieur à deux, ce qui indique qu'il n'y avait pas au moins le nom du programme et une 179 00:10:21,100 --> 00:10:29,100 premier argument, alors nous ferons quelque chose comme printf, pas assez 180 00:10:29,100 --> 00:10:31,190 arguments de ligne de commande. 181 00:10:31,190 --> 00:10:33,170 Ce n'est probablement pas un bon à imprimer, c'est probablement quelque chose, comme 182 00:10:33,170 --> 00:10:35,440 vous devez entrer un nombre entier à la ligne de commande. 183 00:10:35,440 --> 00:10:37,450 Je vais terminer là. 184 00:10:37,450 --> 00:10:39,600 Et puis retour 1. 185 00:10:39,600 --> 00:10:44,740 Alors, n'oubliez pas qu'à la fin de notre programme, si nous revenons 0, ce genre de 186 00:10:44,740 --> 00:10:47,060 indique le succès. 187 00:10:47,060 --> 00:10:50,940 Et principal automatiquement renvoie 0 si vous ne le faites pas. 188 00:10:50,940 --> 00:10:55,800 >> Donc, ici, nous réaccorder 1 pour indiquer que ce n'est pas le succès. 189 00:10:55,800 --> 00:11:01,000 Et vous pouvez retourner ce que vous voulez, juste, 0 indique le succès, et 190 00:11:01,000 --> 00:11:03,390 rien d'autre indique un échec. 191 00:11:03,390 --> 00:11:04,855 Donc, nous allons exécuter cette version des choses. 192 00:11:04,855 --> 00:11:12,880 193 00:11:12,880 --> 00:11:16,600 Alors maintenant, si nous n'entrons pas dans une ligne de commande argument, il va dire correctement 194 00:11:16,600 --> 00:11:18,290 nous, pas assez de ligne de commande. 195 00:11:18,290 --> 00:11:20,610 N'a pas terminé la phrase. 196 00:11:20,610 --> 00:11:24,950 Sinon, si l'on fait passer l'un, il peut compléter le programme. 197 00:11:24,950 --> 00:11:27,920 Donc, c'est la façon dont vous souhaitez utiliser dans argc Afin de valider le nombre d' 198 00:11:27,920 --> 00:11:30,630 arguments de ligne de commande qui sont effectivement passé. 199 00:11:30,630 --> 00:11:39,360 >> Faisons donc ce programme un peu plus compliqué, et regarder le deuxième 200 00:11:39,360 --> 00:11:42,180 itération de choses. 201 00:11:42,180 --> 00:11:46,310 Alors maintenant, nous ne sommes pas seulement l'impression de la premier argument de ligne de commande. 202 00:11:46,310 --> 00:11:51,210 Ici, nous itération de égaux i int 0, i est inférieur à argc, i plus 203 00:11:51,210 --> 00:11:55,280 en plus, et l'impression argv, l'indice i. 204 00:11:55,280 --> 00:11:59,300 Donc ce modèle, encore une fois, c'est la même fantaisie comme avant, sauf qu'au lieu 205 00:11:59,300 --> 00:12:02,600 d'appeler la variable n, nous utilisons argc. 206 00:12:02,600 --> 00:12:09,520 >> Donc, ce n'est itération sur chaque index dans la matrice, et l'impression de chaque 207 00:12:09,520 --> 00:12:11,910 élément dans ce tableau. 208 00:12:11,910 --> 00:12:20,300 Et donc, lorsque nous manquons de ce programme, ainsi, Je ne suis pas entré une ligne de commande 209 00:12:20,300 --> 00:12:22,540 arguments, de sorte qu'il imprime seulement le nom du programme. 210 00:12:22,540 --> 00:12:26,053 Si j'entre dans un tas de choses, ça va imprimer un, chacun sur sa propre ligne. 211 00:12:26,053 --> 00:12:31,213 212 00:12:31,213 --> 00:12:32,210 >> OK. 213 00:12:32,210 --> 00:12:34,770 Alors prenons un peu plus loin. 214 00:12:34,770 --> 00:12:38,890 Et au lieu d'imprimer chaque argument sur sa propre ligne, nous allons imprimer chaque 215 00:12:38,890 --> 00:12:42,590 caractère de chaque argument sur sa propre ligne. 216 00:12:42,590 --> 00:12:46,700 Alors rappelez-vous que argv est un tableau de chaînes. 217 00:12:46,700 --> 00:12:50,960 Alors, quelle est une chaîne, mais un tableau de caractères? 218 00:12:50,960 --> 00:12:57,140 Cela signifie donc que argv est vraiment un tableau d'un tableau de caractères. 219 00:12:57,140 --> 00:13:04,920 Donc, en prenant avantage de cela, ignorons ce pour le moment. 220 00:13:04,920 --> 00:13:08,190 Disons simplement considérer la chaîne argv 0. 221 00:13:08,190 --> 00:13:14,170 >> Donc, si nous voulons apporter chaque caractère de argv 0 sur sa propre ligne, alors je veux 222 00:13:14,170 --> 00:13:19,500 pour faire le modèle que nous sommes habitués, i est inférieure à la longueur du tableau, 223 00:13:19,500 --> 00:13:23,990 qui ici, est de strlen, c'est pas ce que je veux faire, chaîne 224 00:13:23,990 --> 00:13:26,450 s est égal à 0 argv. 225 00:13:26,450 --> 00:13:30,390 Ainsi, i est inférieure à la longueur de notre tableau, qui dans ce cas est un tableau 226 00:13:30,390 --> 00:13:34,410 de caractères, i plus plus. 227 00:13:34,410 --> 00:13:41,040 Et si, comme nous l'avons vu la semaine dernière, il est idéal si nous passons que strlen l'extérieur 228 00:13:41,040 --> 00:13:45,210 de la maladie, puisque n ajoutera la strlen de s chaque fois que nous allons 229 00:13:45,210 --> 00:13:47,720 dans la boucle, et il est ne va pas changer. 230 00:13:47,720 --> 00:13:50,230 Nous allons donc mis il égal à n ici. 231 00:13:50,230 --> 00:13:54,260 232 00:13:54,260 --> 00:13:55,170 >> OK. 233 00:13:55,170 --> 00:14:01,320 Alors maintenant, nous itération sur chaque indice dans le tableau. 234 00:14:01,320 --> 00:14:05,630 Et donc, si nous voulons imprimer chaque caractère de ce tableau, pour cent c est 235 00:14:05,630 --> 00:14:06,880 le drapeau que nous voulons utiliser pour les caractères. 236 00:14:06,880 --> 00:14:10,750 237 00:14:10,750 --> 00:14:19,770 Et maintenant un support i va être l' chaîne, caractère d'indice i, si la 238 00:14:19,770 --> 00:14:20,970 chaîne étaient bonjour. 239 00:14:20,970 --> 00:14:27,530 alors s 0 va être H, S support Une aura e, et ainsi de suite. 240 00:14:27,530 --> 00:14:30,800 >> Alors maintenant, nous voulons combiner ces deux choses. 241 00:14:30,800 --> 00:14:35,440 Nous voulons imprimer chaque caractère de chaque argument de ligne de commande. 242 00:14:35,440 --> 00:14:38,950 Nous allons donc avoir une nichée de boucle. 243 00:14:38,950 --> 00:14:47,480 Et de façon classique, le premier compteur C'est moi, la prochaine va être j, n 244 00:14:47,480 --> 00:14:54,450 sera le strlen de argv i, i est inférieur à n, i plus plus. 245 00:14:54,450 --> 00:14:59,150 246 00:14:59,150 --> 00:15:06,870 Et maintenant, au lieu d'imprimer argv i, de sorte argv support i va à l'index - 247 00:15:06,870 --> 00:15:14,280 que ça va être la ligne de commande i-ème argument argv i, j va 248 00:15:14,280 --> 00:15:16,925 le caractère j de l'argument de la i-ème. 249 00:15:16,925 --> 00:15:20,580 250 00:15:20,580 --> 00:15:24,810 Je vais me débarrasser de cette place ici maintenant depuis que nous avons dans cette boucle. 251 00:15:24,810 --> 00:15:33,900 Donc, est équivalent à l'égal de cordes argv i, puis de support j. 252 00:15:33,900 --> 00:15:36,980 >> Eh bien, nous n'avons pas besoin de déclarer cette variable s. 253 00:15:36,980 --> 00:15:44,530 Au lieu de cela, nous allons combiner ces deux dans ce que nous avions, argv i, j. 254 00:15:44,530 --> 00:15:45,780 >> INTERLOCUTEUR 1: [inaudible]. 255 00:15:45,780 --> 00:15:48,850 256 00:15:48,850 --> 00:15:49,680 >> ROB BODEN: Bon appel. 257 00:15:49,680 --> 00:15:52,936 Donc, c'est cassé. 258 00:15:52,936 --> 00:15:55,510 Si j'ai effectivement couru, nous le ferions ont rendu compte. 259 00:15:55,510 --> 00:16:01,210 Ainsi, le compteur m'importe dans ce cas particulier pour 260 00:16:01,210 --> 00:16:05,410 boucle est j, l'itérateur. 261 00:16:05,410 --> 00:16:08,560 Donc, vous avez rencontrer des problèmes, probablement une boucle infinie, si nous 262 00:16:08,560 --> 00:16:09,540 n'avaient pas fixe. 263 00:16:09,540 --> 00:16:12,220 C'est pourquoi nous parlons aussi débogage aujourd'hui. 264 00:16:12,220 --> 00:16:13,120 >> OK. 265 00:16:13,120 --> 00:16:15,240 Donc, nous allons exécuter ce programme. 266 00:16:15,240 --> 00:16:21,200 Et nous allons effectivement ajouter un printf séparée ici qui va juste imprimer 267 00:16:21,200 --> 00:16:27,480 une autre ligne, car cela signifie que lorsque nous exécuter le programme, il y aura un vide 268 00:16:27,480 --> 00:16:31,830 ligne entre chaque caractère de chaque argument de ligne de commande. 269 00:16:31,830 --> 00:16:33,448 Eh bien, nous verrons ce que cela signifie. 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 Vous avez un bug. 273 00:16:39,870 --> 00:16:42,860 Erreur déclarant implicitement fonction strlen bibliothèque. 274 00:16:42,860 --> 00:16:51,630 >> Pour en revenir à notre programme, je oublié de hachage inclure string.h. 275 00:16:51,630 --> 00:16:54,240 276 00:16:54,240 --> 00:16:57,730 Donc string.h va être la fichier d'en-tête qui déclare 277 00:16:57,730 --> 00:16:58,980 la fonction strlen. 278 00:16:58,980 --> 00:17:04,650 279 00:17:04,650 --> 00:17:06,060 OK, il compile. 280 00:17:06,060 --> 00:17:09,109 Maintenant, nous allons l'exécuter. 281 00:17:09,109 --> 00:17:10,930 Il suffit donc que. 282 00:17:10,930 --> 00:17:17,790 Il va imprimer notre nom du programme, bonjour monde. 283 00:17:17,790 --> 00:17:23,510 Il va imprimer chaque chose, chaque caractère, sur sa propre ligne. 284 00:17:23,510 --> 00:17:24,540 OK. 285 00:17:24,540 --> 00:17:30,625 >> Donc, nous allons effectivement prendre cette un peu plus loin. 286 00:17:30,625 --> 00:17:34,050 287 00:17:34,050 --> 00:17:39,700 Et au lieu d'utiliser string.h, nous allons penser comment nous pourrions mettre en œuvre notre propre 288 00:17:39,700 --> 00:17:41,420 fonction strlen. 289 00:17:41,420 --> 00:17:45,600 Donc je vais donner immédiatement une signature de fonction. 290 00:17:45,600 --> 00:17:52,900 Alors appelons dans my_strlen, et c'est va prendre une chaîne comme argument, 291 00:17:52,900 --> 00:17:57,220 et nous nous attendons à retourner le longueur de cette chaîne. 292 00:17:57,220 --> 00:18:03,430 Alors, où est ce type? 293 00:18:03,430 --> 00:18:04,990 Oui. 294 00:18:04,990 --> 00:18:06,740 OK. 295 00:18:06,740 --> 00:18:12,900 Alors, n'oubliez pas de la diapositive précédente que était aussi de la semaine dernière, que l' 296 00:18:12,900 --> 00:18:18,890 tableau de caractères, ainsi, une chaîne, alors disons que c'est notre chaîne s. 297 00:18:18,890 --> 00:18:29,870 Donc, si s est la chaîne, bonjour, alors, H-E-L-L-O, dans la mémoire, qui va à 298 00:18:29,870 --> 00:18:35,610 être, et puis cette barre oblique inverse 0 caractère. 299 00:18:35,610 --> 00:18:39,170 >> Alors, comment pouvons-nous obtenir la longueur de s? 300 00:18:39,170 --> 00:18:43,190 Eh bien, l'affaire est à la recherche pour cette Backlash 0 caractère, ce nul 301 00:18:43,190 --> 00:18:44,380 terminateur. 302 00:18:44,380 --> 00:18:50,270 Donc, l'algorithme est va être quelque chose comme quelques-uns 303 00:18:50,270 --> 00:18:51,510 suffisamment de caractères que - 304 00:18:51,510 --> 00:18:56,180 nous allons avoir cette main représente une certaine contre, appelons cette longueur int. 305 00:18:56,180 --> 00:19:00,060 Donc, à partir de plus ici, nous sommes aller à parcourir notre chaîne. 306 00:19:00,060 --> 00:19:04,100 >> Ainsi, le premier caractère, il est H, et ce n'est pas de retour slash 0, donc 307 00:19:04,100 --> 00:19:05,170 la longueur est de 1. 308 00:19:05,170 --> 00:19:08,050 Itérer au caractère suivant, E, et ce n'est pas Backslash 0. 309 00:19:08,050 --> 00:19:09,630 La longueur est 2. 310 00:19:09,630 --> 00:19:10,960 L, 3. 311 00:19:10,960 --> 00:19:11,850 L, 4. 312 00:19:11,850 --> 00:19:13,050 O, 5. 313 00:19:13,050 --> 00:19:16,690 Et enfin, nous atteignons la barre oblique inverse 0, et que des moyens, eh bien, 314 00:19:16,690 --> 00:19:17,780 cette chaîne est terminée. 315 00:19:17,780 --> 00:19:20,130 Revenons donc 5. 316 00:19:20,130 --> 00:19:33,630 >> Donc en fait la mise en œuvre qui, d'abord, mon n longueur est égale à 0, ma main droite. 317 00:19:33,630 --> 00:19:36,088 Et nous allons parcourir - 318 00:19:36,088 --> 00:19:38,000 >> INTERLOCUTEUR 1: [inaudible] 319 00:19:38,000 --> 00:19:38,640 >> ROB BODEN: Oh, tirer. 320 00:19:38,640 --> 00:19:39,870 Bon appel. 321 00:19:39,870 --> 00:19:42,680 Boom. 322 00:19:42,680 --> 00:19:44,140 Alors n longueur est égale à 0. 323 00:19:44,140 --> 00:19:46,910 324 00:19:46,910 --> 00:19:58,310 Alors maintenant, la longueur tandis que de ne pas égal puis, barre oblique inverse 0. 325 00:19:58,310 --> 00:20:04,660 Donc n'oubliez pas, ce oblique 0, il s'agit d'une caractère réel, et il indique 326 00:20:04,660 --> 00:20:05,820 la fin de la chaîne. 327 00:20:05,820 --> 00:20:09,850 Tout comme, également, barre oblique inverse n est un personnage réel. 328 00:20:09,850 --> 00:20:14,040 Backslash 0 va indiquer la fin de notre chaîne. 329 00:20:14,040 --> 00:20:15,414 Je ne veux pas mettre que là. 330 00:20:15,414 --> 00:20:19,190 331 00:20:19,190 --> 00:20:25,620 Et tout s indexés par longueur n'est pas égale à la terminaison null, 332 00:20:25,620 --> 00:20:27,130 nous allons juste pour augmenter la longueur. 333 00:20:27,130 --> 00:20:29,860 334 00:20:29,860 --> 00:20:34,880 Alors, à la fin de notre programme, longueur va finalement 335 00:20:34,880 --> 00:20:37,610 être 5 dans ce cas. 336 00:20:37,610 --> 00:20:39,210 Et nous allons revenir longueur. 337 00:20:39,210 --> 00:20:42,570 338 00:20:42,570 --> 00:20:43,530 >> OK. 339 00:20:43,530 --> 00:20:48,290 Alors maintenant, ici-bas, je ne sais pas faire my_strlen. 340 00:20:48,290 --> 00:20:50,700 Compilons pour s'assurer tout se passe bien. 341 00:20:50,700 --> 00:20:55,820 342 00:20:55,820 --> 00:20:58,210 Ce que je faisais en 2? 343 00:20:58,210 --> 00:21:00,565 Ou était-ce une? 344 00:21:00,565 --> 00:21:01,940 Cela devrait le faire. 345 00:21:01,940 --> 00:21:02,690 Très bien. 346 00:21:02,690 --> 00:21:08,490 C'est donc argv 2. 347 00:21:08,490 --> 00:21:11,585 Fonctionne comme prévu, bien que était que celui que j'ai fait il? 348 00:21:11,585 --> 00:21:15,060 349 00:21:15,060 --> 00:21:15,550 Oui. 350 00:21:15,550 --> 00:21:16,760 OK. 351 00:21:16,760 --> 00:21:21,820 Cette version des choses n'avait pas la nouvelle ligne printf après, mais il 352 00:21:21,820 --> 00:21:22,910 ne fait aucune différence. 353 00:21:22,910 --> 00:21:23,300 OK. 354 00:21:23,300 --> 00:21:25,780 Donc travaillé comme prévu. 355 00:21:25,780 --> 00:21:34,750 >> Maintenant, nous pouvons même combiner cette première étape en outre, lorsque l'avis ici, eh bien, 356 00:21:34,750 --> 00:21:38,920 d'abord, nous allons saisir l'strlen de argv i, puis nous itération sur 357 00:21:38,920 --> 00:21:41,450 chaque caractère dans cette chaîne. 358 00:21:41,450 --> 00:21:47,480 Ainsi, au lieu de le faire, si nous juste combiner cette logique d'attendre 359 00:21:47,480 --> 00:21:50,740 jusqu'à ce que nous avons atteint la barre oblique inverse 0 droit dans cette boucle? 360 00:21:50,740 --> 00:21:53,740 361 00:21:53,740 --> 00:22:07,490 Donc parcourir tout argv i, j ne pas égal barre oblique inverse 0. 362 00:22:07,490 --> 00:22:10,680 Donc, nous allons l'exécuter en premier. 363 00:22:10,680 --> 00:22:19,838 364 00:22:19,838 --> 00:22:21,180 >> Très bien. 365 00:22:21,180 --> 00:22:27,655 Donc, ici, cette condition est dit - 366 00:22:27,655 --> 00:22:38,090 367 00:22:38,090 --> 00:22:40,060 clarifions cela. 368 00:22:40,060 --> 00:22:49,140 Alors maintenant, que ce soit notre argv. 369 00:22:49,140 --> 00:22:55,290 Alors, quand j'ai juste couru ce programme avant, argv est un tableau de chaînes. 370 00:22:55,290 --> 00:23:03,100 Et donc, si je le lance avec le point barre argv 2, bonjour le monde, le argv 371 00:23:03,100 --> 00:23:07,650 est elle-même une longueur de 3, pour argv zéro, bonjour, et dans le monde. 372 00:23:07,650 --> 00:23:11,700 373 00:23:11,700 --> 00:23:19,660 >> Et à l'intérieur de chacun de ces indices est, lui-même un tableau, où ce sera 374 00:23:19,660 --> 00:23:23,780 point, ce sera slash, je ne sais pas si c'était la bonne direction, je 375 00:23:23,780 --> 00:23:25,680 Je ne pense pas que c'était. 376 00:23:25,680 --> 00:23:30,110 A-R-V tableau de bord, le besoin de plus d'espace. 377 00:23:30,110 --> 00:23:32,570 Coupons dans ce tableau. 378 00:23:32,570 --> 00:23:38,230 Tiret 0, puis oblique 0 A-R-V. 379 00:23:38,230 --> 00:23:43,160 Et puis dans le désarroi sera bonjour. 380 00:23:43,160 --> 00:23:45,910 Disons, H-E oblique 0. 381 00:23:45,910 --> 00:23:51,130 Et enfin, W-O barre oblique inverse 0. 382 00:23:51,130 --> 00:23:59,730 >> Donc l'algorithme que nous venons d'écrire, la nichée pour les boucles, ce qu'ils 383 00:23:59,730 --> 00:24:07,321 faire dire, nous devons d'abord le contrer i et j. 384 00:24:07,321 --> 00:24:15,206 Ce serait plus facile avec le code de la écran, Revenons à cette question. 385 00:24:15,206 --> 00:24:17,476 OK. 386 00:24:17,476 --> 00:24:24,600 Ainsi constate que i est l'itérateur qui est itération sur chaque commande 387 00:24:24,600 --> 00:24:25,610 argument de la ligne. 388 00:24:25,610 --> 00:24:28,870 Et j est l'itération de l'itération au-dessus de chaque caractère par le fait que 389 00:24:28,870 --> 00:24:30,410 commande argument de ligne. 390 00:24:30,410 --> 00:24:46,755 Donc ce que cela printf interne est fait est, nous avons 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, 6 0, mais maintenant, argv 0 7 va 392 00:24:58,680 --> 00:25:00,670 égal barre oblique inverse 0. 393 00:25:00,670 --> 00:25:05,730 >> Alors que nous sortons de la boucle, et maintenant je itération à 1. 394 00:25:05,730 --> 00:25:10,910 Et maintenant, nous allons imprimer argv 1 0, argv 1 1 - 395 00:25:10,910 --> 00:25:17,040 Eh bien, maintenant, depuis que j'ai coupé court bonjour, argv 1 2 va à nouveau être 396 00:25:17,040 --> 00:25:18,170 barre oblique inverse 0. 397 00:25:18,170 --> 00:25:25,050 Et oui, incrémenter i et continuer, et ainsi de suite, jusqu'à ce que nous imprimons tous 398 00:25:25,050 --> 00:25:28,580 monde, et ceux qui sont de trois ligne de commande arguments, et nous sortons de 399 00:25:28,580 --> 00:25:31,670 la boucle la plus externe, et terminer notre programme. 400 00:25:31,670 --> 00:25:38,390 401 00:25:38,390 --> 00:25:39,640 OK. 402 00:25:39,640 --> 00:25:43,903 403 00:25:43,903 --> 00:25:46,795 >> Donc revenons ici. 404 00:25:46,795 --> 00:25:49,670 405 00:25:49,670 --> 00:25:52,370 Donc, vous gagnerez une certaine familiarité avec arguments de ligne de commande sur ce 406 00:25:52,370 --> 00:25:54,460 problème particulier défini. 407 00:25:54,460 --> 00:25:56,630 >> Maintenant, le débogage. 408 00:25:56,630 --> 00:26:01,680 Donc, vous avez probablement déjà eu à faire du débogage avec votre précédente 409 00:26:01,680 --> 00:26:03,120 problème réglé. 410 00:26:03,120 --> 00:26:08,420 Et une façon très facile de débogage, en premier lieu, regardons un programme de buggy. 411 00:26:08,420 --> 00:26:20,710 412 00:26:20,710 --> 00:26:23,830 Eh bien, la marche à travers ce programme, nous allons demander à l'utilisateur une 413 00:26:23,830 --> 00:26:29,350 entier, prenez cet entier, puis, arbitrairement, nous avons une boucle while qui 414 00:26:29,350 --> 00:26:32,280 va juste à diminuer i jusqu'à ce qu'il soit égal à 10. 415 00:26:32,280 --> 00:26:35,820 Supposons juste que je suis entrée un nombre entier supérieur à 10. 416 00:26:35,820 --> 00:26:38,700 Donc décrémenter i jusqu'à ce qu'il soit égal à 10. 417 00:26:38,700 --> 00:26:42,630 >> Et puis nous avons une autre boucle while que, si i n'est pas égal à 0, nous sommes 418 00:26:42,630 --> 00:26:44,540 aller à i diminuer par 3. 419 00:26:44,540 --> 00:26:49,790 Donc si vous voyez l'intention de l'insecte ici, c'est que ça va décrémenter i de 420 00:26:49,790 --> 00:26:57,010 de 10, et puis cette boucle while volonté décrément i de 10, à 7, à 4, à 1, 421 00:26:57,010 --> 00:27:02,880 à négative 2, à 5 négatif, et ainsi de suite, à l'infini, puisque je 422 00:27:02,880 --> 00:27:05,920 jamais égaler fait 0. 423 00:27:05,920 --> 00:27:08,610 Et puis à la fin de ce programme, nous avons la fonction foo qui est 424 00:27:08,610 --> 00:27:12,130 passe impression que i. 425 00:27:12,130 --> 00:27:16,520 >> C'est donc un programme court et superficiel, et le bug est évident, 426 00:27:16,520 --> 00:27:18,790 surtout après que je viens de dit ce que le bug était. 427 00:27:18,790 --> 00:27:24,840 Mais le but ici est, bien, cela pourrait effectivement ressembler à une partie de votre 428 00:27:24,840 --> 00:27:30,040 solutions de gourmand de la dernière problème posé, et peut-être que vous ne possédez 429 00:27:30,040 --> 00:27:32,800 certains boucle infinie dans votre programme, et vous n'avez aucune idée 430 00:27:32,800 --> 00:27:34,100 ce qui le cause. 431 00:27:34,100 --> 00:27:38,690 Ainsi, une technique de débogage très utile est à juste ajouter printfs 432 00:27:38,690 --> 00:27:40,180 partout dans votre code. 433 00:27:40,180 --> 00:27:49,200 >> Donc ici, je veux un printf extérieur première boucle while. 434 00:27:49,200 --> 00:27:53,155 Et ici, je veux un printf, et je vais imprimer i. 435 00:27:53,155 --> 00:27:55,670 436 00:27:55,670 --> 00:27:58,330 Je vais même faire en premier tandis que boucle, i. 437 00:27:58,330 --> 00:28:05,130 438 00:28:05,130 --> 00:28:09,040 A l'extérieur, tandis que la deuxième boucle. 439 00:28:09,040 --> 00:28:12,170 Une fois de plus, imprimer à l'intérieur d'ici, la valeur i. 440 00:28:12,170 --> 00:28:16,270 441 00:28:16,270 --> 00:28:17,520 Et lançons ce. 442 00:28:17,520 --> 00:28:22,620 443 00:28:22,620 --> 00:28:24,800 >> Donc, point de débogage slash. 444 00:28:24,800 --> 00:28:25,610 Entrez un nombre entier. 445 00:28:25,610 --> 00:28:28,150 Faisons 13. 446 00:28:28,150 --> 00:28:28,760 Et boum. 447 00:28:28,760 --> 00:28:33,300 Nous voyons que nous sommes en boucle infinie à l'intérieur de la deuxième boucle while. 448 00:28:33,300 --> 00:28:36,305 Alors maintenant, nous savons ce que le bug est. 449 00:28:36,305 --> 00:28:39,610 450 00:28:39,610 --> 00:28:45,610 Mais printf débogage est parfaitement bien, mais une fois que vos programmes se 451 00:28:45,610 --> 00:28:50,560 plus long et plus compliqué, il existe solutions plus sophistiquées à 452 00:28:50,560 --> 00:28:51,705 que les choses fonctionnent. 453 00:28:51,705 --> 00:28:52,955 Donc, nous allons supprimer tous ces printfs. 454 00:28:52,955 --> 00:29:06,242 455 00:29:06,242 --> 00:29:08,896 Et faisons en sorte que je n'ai pas rien casser. 456 00:29:08,896 --> 00:29:09,850 OK. 457 00:29:09,850 --> 00:29:14,180 >> Ainsi, le programme que nous allons à introduire est appelé 458 00:29:14,180 --> 00:29:16,715 GDB, pour GNU Debugger. 459 00:29:16,715 --> 00:29:21,892 460 00:29:21,892 --> 00:29:27,510 Eh bien, effectivement, nous allons supprimer débogage pour une seconde, et faire à nouveau débogage. 461 00:29:27,510 --> 00:29:31,420 462 00:29:31,420 --> 00:29:34,440 Eh bien, en fait d'abord, une bonne leçon dans les arguments de ligne de commande. 463 00:29:34,440 --> 00:29:37,780 Notez que cette commande Clang qui est compiler tout est passé 464 00:29:37,780 --> 00:29:41,300 à la ligne de commande, les arguments de ligne de commande. 465 00:29:41,300 --> 00:29:46,250 Donc exactement comment vous allez utiliser arguments de ligne de commande, comme nous 466 00:29:46,250 --> 00:29:51,500 fait avant, et que vous voulez en PSET 2, c'est comme ça que Clang est de les utiliser. 467 00:29:51,500 --> 00:30:00,070 >> Donc remarquer que ce premier drapeau, tableau de bord ggdb3, ce qui n'est pas peu dire c'est, Clang, 468 00:30:00,070 --> 00:30:03,790 vous devez compiler ce fichier avec le intention que nous finirons 469 00:30:03,790 --> 00:30:05,380 besoin de déboguer. 470 00:30:05,380 --> 00:30:13,840 Donc, tant que vous avez le drapeau, alors nous pouvons GDB débogage. 471 00:30:13,840 --> 00:30:17,380 Et il va ouvrir le débogueur GNU. 472 00:30:17,380 --> 00:30:22,920 >> Donc, il ya beaucoup de commandes que vous avez besoin de s'habituer à. 473 00:30:22,920 --> 00:30:27,100 Premier que vous aurez probablement immédiatement besoin est Exécuter. 474 00:30:27,100 --> 00:30:28,200 Alors qu'est-ce Run va faire? 475 00:30:28,200 --> 00:30:30,910 Il va commencer notre programme. 476 00:30:30,910 --> 00:30:36,180 Alors courez, programme de démarrage, le programme nous demande pour un nombre entier, 13. 477 00:30:36,180 --> 00:30:39,170 Et puis c'est boucle infinie prévu, sauf j'ai enlevé le 478 00:30:39,170 --> 00:30:40,500 printfs, de sorte que nous ne voyons même pas. 479 00:30:40,500 --> 00:30:43,320 480 00:30:43,320 --> 00:30:44,600 Sorti normalement. 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 Il est possible que l'enveloppa tout le inverse, vers - ignorant que. 484 00:30:53,640 --> 00:30:55,170 Supposons qu'il n'a pas quitté normalement. 485 00:30:55,170 --> 00:30:59,500 486 00:30:59,500 --> 00:31:03,370 Il ya une réponse compliquée à cela. 487 00:31:03,370 --> 00:31:07,890 >> Alors maintenant, ce n'est pas très utile. 488 00:31:07,890 --> 00:31:11,480 Il suffit donc de la gestion de notre programme à l'intérieur de ce débogueur ne nous aide pas du tout 489 00:31:11,480 --> 00:31:15,610 Ainsi, puisque nous aurions pu faire point slash débogage de l'extérieur GDB. 490 00:31:15,610 --> 00:31:21,250 Donc, la seule commande que Vous aurez probablement - 491 00:31:21,250 --> 00:31:22,970 et je vais arrêter cela. 492 00:31:22,970 --> 00:31:25,850 Control-d ou cesser de fumer, à la fois travail. 493 00:31:25,850 --> 00:31:29,550 Donc, nous allons l'ouvrir à nouveau. 494 00:31:29,550 --> 00:31:31,130 >> Une autre commande que vous aurez probablement immédiatement envie 495 00:31:31,130 --> 00:31:33,600 s'habituer à se Break. 496 00:31:33,600 --> 00:31:37,120 Donc, nous allons briser le principal pour l'instant, et puis je vais vous expliquer cela. 497 00:31:37,120 --> 00:31:41,010 498 00:31:41,010 --> 00:31:46,370 Eh bien, nous voyons ici nous avons mis un point d'arrêt à cette ligne dans debug.c. 499 00:31:46,370 --> 00:31:50,160 Alors quels sont les moyens rupture, c'est que lorsque je saisir run, le programme va 500 00:31:50,160 --> 00:31:53,560 continuer à fonctionner jusqu'à ce que J'ai frappé un point d'arrêt. 501 00:31:53,560 --> 00:31:59,390 Alors, quand j'ai touché terme, le programme démarre, puis il se casse dès que l' 502 00:31:59,390 --> 00:32:01,940 entre dans la fonction principale. 503 00:32:01,940 --> 00:32:06,930 Cassez principal va être quelque chose de vous faites assez souvent. 504 00:32:06,930 --> 00:32:11,340 >> Et maintenant, à vous présenter à un peu plus de commandes. 505 00:32:11,340 --> 00:32:14,330 Notez ici, que c'est de dire que nous cassé à la ligne 11, qui est 506 00:32:14,330 --> 00:32:16,230 printf, entrez un nombre entier. 507 00:32:16,230 --> 00:32:21,260 Ainsi, la commande suivante va être comment nous allons à la ligne de code suivante. 508 00:32:21,260 --> 00:32:24,810 Cela va nous permettre à l'étape grâce à notre programme ligne par ligne. 509 00:32:24,810 --> 00:32:26,260 Alors la prochaine. 510 00:32:26,260 --> 00:32:29,820 >> Maintenant la ligne 12, nous allons pour obtenir le nombre entier. 511 00:32:29,820 --> 00:32:30,450 Suivant. 512 00:32:30,450 --> 00:32:34,290 Et si vous frappez juste Entrez à nouveau, ça va rétablir la dernière chose que vous avez fait. 513 00:32:34,290 --> 00:32:36,480 Donc, je n'ai pas besoin de taper prochaine à chaque fois. 514 00:32:36,480 --> 00:32:40,100 Alors entrer un nombre entier, 13. 515 00:32:40,100 --> 00:32:46,940 Alors maintenant, la ligne 14, tandis que i est supérieur de 10, et je vais faire ensuite. 516 00:32:46,940 --> 00:32:48,685 Et nous voyons que nous allons diminuer i. 517 00:32:48,685 --> 00:32:50,210 Nous allons donc à diminuer i nouveau. 518 00:32:50,210 --> 00:32:53,620 >> Alors maintenant, un autre utiles commande est Print. 519 00:32:53,620 --> 00:32:55,750 Donc Imprimer va imprimer la valeur de la variable. 520 00:32:55,750 --> 00:32:57,825 Allons faire ressortir la valeur i variable. 521 00:32:57,825 --> 00:32:58,705 Imprimons i. 522 00:32:58,705 --> 00:33:00,910 Il va dire i est 11. 523 00:33:00,910 --> 00:33:03,330 Maintenant, nous suivant à nouveau en i est supérieur à 10. 524 00:33:03,330 --> 00:33:05,590 Donc, je c'est encore plus que 10, puisque c'est 11. 525 00:33:05,590 --> 00:33:06,920 i minus minus. 526 00:33:06,920 --> 00:33:08,250 Imprimons i nouveau. 527 00:33:08,250 --> 00:33:10,950 Comme prévu, c'est 10. 528 00:33:10,950 --> 00:33:12,510 >> Alors maintenant, à côté. 529 00:33:12,510 --> 00:33:16,250 Il va revenir à l'état, i est supérieur à 10, mais i est maintenant 10, de sorte 530 00:33:16,250 --> 00:33:20,040 ce n'est pas plus de 10, alors nous nous attendons sa chute hors de la boucle while. 531 00:33:20,040 --> 00:33:22,220 Et maintenant, nous sommes en dessous de cette ligne de code. 532 00:33:22,220 --> 00:33:28,750 Et une autre commande, Liste, va tout simplement pour afficher la précédente et suivante 533 00:33:28,750 --> 00:33:31,240 quelques lignes de code, en Si vous vous perdez. 534 00:33:31,240 --> 00:33:35,420 Donc nous avons juste sortis cette boucle while, et maintenant nous sommes entrés dans ce 535 00:33:35,420 --> 00:33:37,080 tout en boucle, ligne 18. 536 00:33:37,080 --> 00:33:39,860 Ainsi, alors que i n'est pas égal à 0. 537 00:33:39,860 --> 00:33:46,570 Et, à côté, i est égal à i moins 3, et nous allons remarquer, ça va juste continuer. 538 00:33:46,570 --> 00:33:48,270 Et nous pouvons imprimer i. 539 00:33:48,270 --> 00:33:49,990 >> Chaque commande possède sorte de raccourcis. 540 00:33:49,990 --> 00:33:51,720 Donc p est l'abréviation de l'impression. 541 00:33:51,720 --> 00:33:53,400 Donc, nous pouvons p i. 542 00:33:53,400 --> 00:33:57,550 Il suffit de garder la tenue n, ou continuer à faire Suivant. 543 00:33:57,550 --> 00:33:58,340 Imprimer i nouveau. 544 00:33:58,340 --> 00:34:00,380 Vous voyez maintenant, c'est négatif 167. 545 00:34:00,380 --> 00:34:06,030 Donc cela va durer pour toujours, mais pas vraiment jamais, puisque vous venez de voir, il 546 00:34:06,030 --> 00:34:09,330 sera effectivement finir à un moment donné. 547 00:34:09,330 --> 00:34:15,699 >> Alors que commence GDB. 548 00:34:15,699 --> 00:34:19,504 Mais nous allons faire une chose dans GDB. 549 00:34:19,504 --> 00:34:20,754 Euh, débogage. 550 00:34:20,754 --> 00:34:23,540 551 00:34:23,540 --> 00:34:28,534 Donc, dans ce cas particulier, la boucle infinie qui est arrivé à être à l'intérieur de 552 00:34:28,534 --> 00:34:30,050 la fonction principale. 553 00:34:30,050 --> 00:34:35,779 Et pour l'instant, juste accepter que que je suis va déplacer la boucle infinie dans 554 00:34:35,779 --> 00:34:37,029 la fonction foo. 555 00:34:37,029 --> 00:34:40,679 556 00:34:40,679 --> 00:34:43,730 Il suffit de rappeler que, à la fin de cette programme, eh bien, c'était à l'origine 557 00:34:43,730 --> 00:34:46,210 , appeler foo, qui était juste va imprimer i. 558 00:34:46,210 --> 00:34:51,880 Mais maintenant, nous demandons foo, qui est va diminuer jusqu'à ce qu'il soit i 0, et 559 00:34:51,880 --> 00:34:54,548 puis imprimer cette variable. 560 00:34:54,548 --> 00:34:55,469 OK. 561 00:34:55,469 --> 00:34:57,970 Sauf que. 562 00:34:57,970 --> 00:35:00,175 Assurez-debug. 563 00:35:00,175 --> 00:35:03,310 Et maintenant, gdb débogage. 564 00:35:03,310 --> 00:35:04,090 OK. 565 00:35:04,090 --> 00:35:10,580 >> Donc, si je viens couru alors je ne vais pas être en mesure d'intervenir effectivement dans mon 566 00:35:10,580 --> 00:35:11,730 ligne par ligne programme. 567 00:35:11,730 --> 00:35:19,820 Donc, nous allons briser au principal, puis tapez run. 568 00:35:19,820 --> 00:35:28,160 Alors, allez par là, printf, entrez un nombre entier, obtenir le nombre entier, 13. 569 00:35:28,160 --> 00:35:34,180 570 00:35:34,180 --> 00:35:37,490 Donc, nous allons garder décrémentation jusqu'à ce que i est supérieur à 10. 571 00:35:37,490 --> 00:35:42,840 Ensuite, nous allons passer à travers la tout en boucle, et arriver à la ligne - 572 00:35:42,840 --> 00:35:44,364 nous allons ouvrir dans une fenêtre séparée. 573 00:35:44,364 --> 00:35:48,720 574 00:35:48,720 --> 00:35:53,300 Donc nous décrémentés jusqu'à ce que je n'étais plus supérieur à 10, puis on 575 00:35:53,300 --> 00:35:55,700 appelé la fonction, foo. 576 00:35:55,700 --> 00:36:01,340 >> Donc ce qui s'est passé dès que j'ai touché fonction foo, eh bien, j'ai appelé foo, et 577 00:36:01,340 --> 00:36:04,030 je n'avais plus le contrôle de GDB. 578 00:36:04,030 --> 00:36:10,230 Donc dès que j'ai touché suivante à cette ligne, les choses ont continué jusqu'à ce qui s'est passé, 579 00:36:10,230 --> 00:36:12,400 où le programme est sorti quand - 580 00:36:12,400 --> 00:36:14,450 supposer qu'il n'existait pas fini. 581 00:36:14,450 --> 00:36:16,390 Vous l'avez vu faire une pause pour un peu cependant. 582 00:36:16,390 --> 00:36:22,040 Alors, pourquoi ai-je perdu le contrôle de le programme à ce point? 583 00:36:22,040 --> 00:36:27,540 Eh bien, quand je tape suivante, qui va à la ligne suivante littérale de code 584 00:36:27,540 --> 00:36:28,850 exécutera. 585 00:36:28,850 --> 00:36:35,950 Ainsi, après la ligne 21, la ligne de code suivante qui exécutera est la ligne 22, 586 00:36:35,950 --> 00:36:38,520 qui est, à la sortie de la principale. 587 00:36:38,520 --> 00:36:43,810 Donc, je ne veux pas y aller juste à la ligne de code suivante. 588 00:36:43,810 --> 00:36:48,170 Je veux aller dans la fonction foo et puis aussi par l'étape 589 00:36:48,170 --> 00:36:49,830 ces lignes de code. 590 00:36:49,830 --> 00:36:53,726 >> Donc, pour cela, nous avons une solution de rechange. 591 00:36:53,726 --> 00:36:56,770 Cessons de ça. 592 00:36:56,770 --> 00:36:58,020 Cassez principale. 593 00:36:58,020 --> 00:37:00,520 594 00:37:00,520 --> 00:37:06,370 Euh, 1, prochaine, prochain, le 13, à côté, prochaine, prochaine, attentivement, 595 00:37:06,370 --> 00:37:09,820 avant d'atteindre la ligne foo. 596 00:37:09,820 --> 00:37:10,520 OK. 597 00:37:10,520 --> 00:37:13,700 >> Alors maintenant, nous sommes à la ligne 21, où nous appelons foo. 598 00:37:13,700 --> 00:37:17,100 Nous ne voulons pas taper à côté, depuis que va simplement appeler la fonction foo, et 599 00:37:17,100 --> 00:37:18,710 aller à la prochaine ligne de code. 600 00:37:18,710 --> 00:37:20,840 Ce que nous voulons utiliser est l'étape. 601 00:37:20,840 --> 00:37:25,690 Donc, il ya une différence entre l'étape et Suivant, où l'étape étapes dans le 602 00:37:25,690 --> 00:37:28,190 fonctionne, et suivant va au-dessus de la fonction. 603 00:37:28,190 --> 00:37:32,830 Il exécute simplement la totalité de la fonction et continue à aller. 604 00:37:32,830 --> 00:37:37,210 >> Donc, l'étape va nous apporter dans la fonction foo. 605 00:37:37,210 --> 00:37:41,160 Et nous voyons ici, maintenant, nous sommes de retour à cette boucle while est que, en théorie, 606 00:37:41,160 --> 00:37:44,190 va continuer pour toujours. 607 00:37:44,190 --> 00:37:50,420 Et si vous frappez l'étape, quand il n'est même pas une fonction à appeler, alors il est 608 00:37:50,420 --> 00:37:51,720 identique à Suivant. 609 00:37:51,720 --> 00:37:55,320 Donc, c'est seulement quand vous êtes à une ligne qui appelle une fonction qui Step 610 00:37:55,320 --> 00:37:56,970 va différer suivant. 611 00:37:56,970 --> 00:37:57,930 Donc, l'étape va nous apporter ici. 612 00:37:57,930 --> 00:38:02,100 Étape, étape, étape, étape, étape, étape, et Nous allons boucle infinie pour toujours. 613 00:38:02,100 --> 00:38:06,810 >> Donc, vous pourriez vous habituer à ce que votre moyen d'identifier des boucles infinies, est 614 00:38:06,810 --> 00:38:08,960 juste maintenant cette touche Entrée pour voir où vous êtes coincé. 615 00:38:08,960 --> 00:38:11,610 616 00:38:11,610 --> 00:38:14,780 Il ya de meilleures façons de le faire, mais pour l'instant, c'est parfaitement suffisant. 617 00:38:14,780 --> 00:38:17,967 Et stylistiquement, de se conformer aux modèles 50, je l'ai fait. 618 00:38:17,967 --> 00:38:21,550 619 00:38:21,550 --> 00:38:24,030 OK. 620 00:38:24,030 --> 00:38:28,400 >> Alors une dernière commande à introduire. 621 00:38:28,400 --> 00:38:30,810 Eh bien, GDB débogage po 622 00:38:30,810 --> 00:38:35,580 Donc, au lieu de casser dans la principale, si je connaître la fonction foo est aussi le 623 00:38:35,580 --> 00:38:39,230 problème, alors je pourrais avoir juste ledit, briser à foo, à la place. 624 00:38:39,230 --> 00:38:42,310 Disons que je me casse à à la fois principal et foo. 625 00:38:42,310 --> 00:38:45,390 Ainsi, vous pouvez définir autant de points d'arrêt que vous le souhaitez. 626 00:38:45,390 --> 00:38:49,230 Lorsque je tape terme, il va s'arrêter à la - 627 00:38:49,230 --> 00:38:52,180 ooh, nous allons recompiler, depuis J'ai changé les choses. 628 00:38:52,180 --> 00:38:55,950 Vous verrez cette ligne, Attention, la source fichier est plus récente que exécutable. 629 00:38:55,950 --> 00:38:59,680 Cela signifie donc que je suis juste allé ici et changé pour se conformer à ces modèles 630 00:38:59,680 --> 00:39:03,100 50, mais je n'ai pas recompile le programme. 631 00:39:03,100 --> 00:39:04,870 Donc GDB me fait prendre conscience de cela. 632 00:39:04,870 --> 00:39:10,130 Je vais arrêter, faire à nouveau débogage, frapper gdb débogage. 633 00:39:10,130 --> 00:39:10,700 OK. 634 00:39:10,700 --> 00:39:12,800 >> Alors maintenant, à ce que je faisais. 635 00:39:12,800 --> 00:39:15,720 Cassez principal, coupure foo. 636 00:39:15,720 --> 00:39:20,680 Maintenant, si je lance le programme, si ce n'est va continuer jusqu'à ce que frappe un 637 00:39:20,680 --> 00:39:21,320 point d'arrêt. 638 00:39:21,320 --> 00:39:24,680 Cela se produit au point d'arrêt être le premier à principal. 639 00:39:24,680 --> 00:39:28,630 Maintenant, au lieu de le faire suivant, suivant, suivant, prochaine, à côté, jusqu'à ce que je frappe foo, je 640 00:39:28,630 --> 00:39:35,230 peut saisir continuer, qui se poursuivra jusqu'à ce que vous atteignez le point d'arrêt suivant. 641 00:39:35,230 --> 00:39:37,200 Je dois saisir l'entier premier. 642 00:39:37,200 --> 00:39:40,570 Continuer continuera jusqu'à ce que je frappe le point d'arrêt suivante, à savoir que 643 00:39:40,570 --> 00:39:43,320 fonction de foo. 644 00:39:43,320 --> 00:39:50,130 >> Alors Run se déroulera jusqu'à ce que vous atteignez un point d'arrêt, mais vous ne tapez run quand 645 00:39:50,130 --> 00:39:54,060 vous commencez le programme, puis, à partir de là, c'est continuer. 646 00:39:54,060 --> 00:40:01,950 Si je l'ai fait briser principal et puis a couru, il va casser à 647 00:40:01,950 --> 00:40:03,670 principal, puis continuer. 648 00:40:03,670 --> 00:40:10,050 Comme je n'ai pas un point de rupture au foo, entrez le nombre entier, alors maintenant je suis 649 00:40:10,050 --> 00:40:11,380 ne va pas se casser à foo. 650 00:40:11,380 --> 00:40:16,318 Il va juste à l'infini jusqu'à ce que la boucle. 651 00:40:16,318 --> 00:40:17,568 OK. 652 00:40:17,568 --> 00:40:19,500 653 00:40:19,500 --> 00:40:24,420 >> C'est donc Intro à GDB. 654 00:40:24,420 --> 00:40:27,790 Vous devriez commencer à l'utiliser dans vos ensembles de problèmes. 655 00:40:27,790 --> 00:40:30,550 Il peut être très utile pour identifier des bogues. 656 00:40:30,550 --> 00:40:35,280 Si vous avez réellement juste, ligne par ligne, allez dans votre code, et comparer ce qui est 657 00:40:35,280 --> 00:40:39,740 qui se passe réellement avec ce que vous attendez arriver, alors il est assez 658 00:40:39,740 --> 00:40:41,060 difficile de rater vos bugs. 659 00:40:41,060 --> 00:40:45,280 660 00:40:45,280 --> 00:40:46,530 OK. 661 00:40:46,530 --> 00:40:48,310 662 00:40:48,310 --> 00:40:54,040 >> Donc, la semaine dernière, David a cette substance de la cryptographie à clé secrète pour l' 663 00:40:54,040 --> 00:40:59,350 première fois, où nous ne voulons pas les mots de passe juste être stockées sur notre 664 00:40:59,350 --> 00:41:03,210 ordinateur dans certains fichiers de texte brut, où quelqu'un peut venir et juste 665 00:41:03,210 --> 00:41:04,660 ouvrir et les lire. 666 00:41:04,660 --> 00:41:07,530 Idéalement, ils seront cryptées d'une certaine façon. 667 00:41:07,530 --> 00:41:13,340 Et dans le problème Set 2, vous aurez affaire avec une méthode de cryptage, 668 00:41:13,340 --> 00:41:16,520 ou, ainsi, deux méthodes, mais ils ne sont pas si grand. 669 00:41:16,520 --> 00:41:20,050 Si vous faites l'édition pirate, vous êtes va aussi avoir affaire à 670 00:41:20,050 --> 00:41:22,150 décrypter certaines choses. 671 00:41:22,150 --> 00:41:29,770 >> Donc, la question est maintenant, bien, même si nous avons le cryptage le plus puissant 672 00:41:29,770 --> 00:41:34,830 algorithme dans le monde, si vous choisissez un particulièrement mauvaise passe, alors il 673 00:41:34,830 --> 00:41:37,720 ne vous aidera pas beaucoup, car les gens seront toujours en mesure de le comprendre. 674 00:41:37,720 --> 00:41:41,530 Même si voir la chaîne cryptée et il ressemble à un gâchis de déchets 675 00:41:41,530 --> 00:41:44,760 qui ne signifie rien pour eux, s'ils toujours juste besoin d'essayer quelques mots de passe 676 00:41:44,760 --> 00:41:50,560 à comprendre, alors vous ne sont pas très sécurisé. 677 00:41:50,560 --> 00:41:55,890 Donc, en regardant une vidéo rend ce point. 678 00:41:55,890 --> 00:41:59,587 679 00:41:59,587 --> 00:42:00,970 >> [VIDEO LECTURE] 680 00:42:00,970 --> 00:42:02,100 >> -Casque, vous démon. 681 00:42:02,100 --> 00:42:03,370 Qu'est-ce qui se passe? 682 00:42:03,370 --> 00:42:05,170 Que faites-vous à ma fille? 683 00:42:05,170 --> 00:42:09,910 >> -Permettez-moi de présenter le brillant jeune chirurgien plasticien, le Dr Phillip 684 00:42:09,910 --> 00:42:13,730 Schlotkin, le plus grand nez emploi homme dans l'ensemble du 685 00:42:13,730 --> 00:42:16,080 univers, et de Beverly Hills. 686 00:42:16,080 --> 00:42:17,210 >> -Votre Altesse. 687 00:42:17,210 --> 00:42:18,070 >> -Nez emploi? 688 00:42:18,070 --> 00:42:18,670 Je ne comprends pas. 689 00:42:18,670 --> 00:42:20,090 Elle a déjà eu un travail de nez. 690 00:42:20,090 --> 00:42:21,910 C'était un bonbon seize présente. 691 00:42:21,910 --> 00:42:22,140 >> -Non. 692 00:42:22,140 --> 00:42:23,690 Ce n'est pas ce que vous pensez. 693 00:42:23,690 --> 00:42:25,420 C'est bien pire. 694 00:42:25,420 --> 00:42:30,300 Si vous ne me donnez pas la combinaison de le bouclier de l'air, le Dr Schlotkin sera 695 00:42:30,300 --> 00:42:34,226 donner votre fille son vieux nez. 696 00:42:34,226 --> 00:42:35,476 >> -Non. 697 00:42:35,476 --> 00:42:38,712 698 00:42:38,712 --> 00:42:40,516 Où avez-vous cela? 699 00:42:40,516 --> 00:42:41,440 >> -Très bien. 700 00:42:41,440 --> 00:42:42,180 Je vais vous dire. 701 00:42:42,180 --> 00:42:43,381 Je vais vous dire. 702 00:42:43,381 --> 00:42:44,263 Non, papa. 703 00:42:44,263 --> 00:42:45,590 Non, vous ne devez pas. 704 00:42:45,590 --> 00:42:46,860 >> -Vous avez raison, mon cher. 705 00:42:46,860 --> 00:42:48,450 Je vais manquer votre nouveau nez. 706 00:42:48,450 --> 00:42:52,090 Mais je ne vais pas lui dire la combinaison, peu importe quoi. 707 00:42:52,090 --> 00:42:53,680 >> -Très bien. 708 00:42:53,680 --> 00:42:55,685 Dr Schlotkin, faire votre pire. 709 00:42:55,685 --> 00:42:56,914 >> -Mon plaisir. 710 00:42:56,914 --> 00:43:00,690 >> [OUTILS à affûter] 711 00:43:00,690 --> 00:43:01,910 >> -Non. 712 00:43:01,910 --> 00:43:02,520 Attendez. 713 00:43:02,520 --> 00:43:03,836 Attendez. 714 00:43:03,836 --> 00:43:05,300 Je vais vous dire. 715 00:43:05,300 --> 00:43:06,880 Je vais vous dire. 716 00:43:06,880 --> 00:43:09,130 >> -Je savais que ça marcherait. 717 00:43:09,130 --> 00:43:09,900 Très bien. 718 00:43:09,900 --> 00:43:12,850 Donne-le moi. 719 00:43:12,850 --> 00:43:16,918 >> -La combinaison est un. 720 00:43:16,918 --> 00:43:17,406 >> -Un. 721 00:43:17,406 --> 00:43:18,382 >> -Un. 722 00:43:18,382 --> 00:43:19,358 >> -Deux. 723 00:43:19,358 --> 00:43:19,846 >> -Deux. 724 00:43:19,846 --> 00:43:20,822 >> -Deux. 725 00:43:20,822 --> 00:43:21,310 >> Trois. 726 00:43:21,310 --> 00:43:21,798 >> Trois. 727 00:43:21,798 --> 00:43:22,774 >> Trois. 728 00:43:22,774 --> 00:43:23,262 >> -Quatre. 729 00:43:23,262 --> 00:43:23,750 >> -Quatre. 730 00:43:23,750 --> 00:43:26,150 >> -Quatre. 731 00:43:26,150 --> 00:43:27,010 >> -Cinq. 732 00:43:27,010 --> 00:43:27,670 >> -Cinq. 733 00:43:27,670 --> 00:43:29,010 >> -Cinq. 734 00:43:29,010 --> 00:43:34,770 >> -Ainsi, la combinaison est un, deux, trois, quatre, cinq. 735 00:43:34,770 --> 00:43:37,460 C'est la combinaison la plus stupide J'ai jamais entendu dans ma vie. 736 00:43:37,460 --> 00:43:39,710 C'est le genre de chose un idiot pourrait avoir sur ses bagages. 737 00:43:39,710 --> 00:43:42,000 >> -Merci, Votre Altesse. 738 00:43:42,000 --> 00:43:43,530 >> -Qu'avez-vous fait? 739 00:43:43,530 --> 00:43:44,490 >> -Je me suis tourné sur le mur. 740 00:43:44,490 --> 00:43:45,420 >> -Non, vous ne l'avez pas. 741 00:43:45,420 --> 00:43:45,840 Vous avez désactivé tout le film. 742 00:43:45,840 --> 00:43:46,930 >> -Je dois avoir appuyé sur le mauvais bouton. 743 00:43:46,930 --> 00:43:48,265 >> -Eh bien, le remettre sur. 744 00:43:48,265 --> 00:43:49,110 Mettez la vidéo sur. 745 00:43:49,110 --> 00:43:49,510 >> -Oui, monsieur. 746 00:43:49,510 --> 00:43:49,917 Oui, monsieur. 747 00:43:49,917 --> 00:43:50,324 >> -Allons, Arnold. 748 00:43:50,324 --> 00:43:51,140 Venez, Gretchen. 749 00:43:51,140 --> 00:43:53,060 Bien sûr, vous savez que je vais encore dois vous facturer pour cela. 750 00:43:53,060 --> 00:43:53,440 >> [LECTURE VIDEO FIN] 751 00:43:53,440 --> 00:43:54,690 >> ROB BODEN: Très bien. 752 00:43:54,690 --> 00:43:59,690 753 00:43:59,690 --> 00:44:08,430 Alors, maintenant que nous parlons déjà la sécurité, à certains égards, agréable 754 00:44:08,430 --> 00:44:16,050 petite affiche de film, si au cours des dernières jour, ces questions avec la NSA 755 00:44:16,050 --> 00:44:17,300 suivi tout. 756 00:44:17,300 --> 00:44:21,840 757 00:44:21,840 --> 00:44:26,930 Il peut être difficile de se sentir comme vous avoir une sorte de vie privée dans le 758 00:44:26,930 --> 00:44:34,540 monde en ligne, bien que je ne pouvais pas dire vous la plupart des détails de PRISM. 759 00:44:34,540 --> 00:44:42,130 Donc, aller au-delà PRISM, nous n'allons pas de parler de cela, maintenant 760 00:44:42,130 --> 00:44:44,030 pensez à votre ordinateur portable. 761 00:44:44,030 --> 00:44:48,360 Donc ici, je veux passer à mon compte réel, 762 00:44:48,360 --> 00:44:50,370 avec mon petit pingouin. 763 00:44:50,370 --> 00:44:57,310 Donc, j'ai un jeu de mot de passe, et que mot de passe est tout ce que je veux que ce soit. 764 00:44:57,310 --> 00:45:02,430 >> Mais n'oubliez pas que ce que je vous connectant avec, si cette connexion 765 00:45:02,430 --> 00:45:04,850 rapide, est un programme. 766 00:45:04,850 --> 00:45:07,910 C'est un programme qui a été écrit par une personne. 767 00:45:07,910 --> 00:45:13,250 Et donc, que personne, si elles sont particulièrement malveillant, ils pourraient 768 00:45:13,250 --> 00:45:17,780 ont dit, tout droit, si le mot de passe que j'entre est égale à mon 769 00:45:17,780 --> 00:45:22,800 mot de passe réel, ou c'est l'égalité une certaine mot de passe spécial - 770 00:45:22,800 --> 00:45:25,550 David est génial ou quelque chose - 771 00:45:25,550 --> 00:45:27,190 puis laissez-les po 772 00:45:27,190 --> 00:45:33,760 Ainsi, un programmeur malveillant pourrait avoir accès à tous vos Mac, ou 773 00:45:33,760 --> 00:45:36,150 Fenêtres, ou quoi que ce soit. 774 00:45:36,150 --> 00:45:41,980 >> Donc, ce n'est pas vraiment un problème, car, Je veux dire, c'est le programme de connexion 775 00:45:41,980 --> 00:45:48,720 C'est livré avec OS X, des centaines ou des milliers de personnes ont 776 00:45:48,720 --> 00:45:50,020 examiné ce code. 777 00:45:50,020 --> 00:45:55,330 Et donc, si, dans votre code quelque part, vous dire si cette chaîne est égale à égal 778 00:45:55,330 --> 00:45:58,860 David est génial, connectez-vous, puis quelqu'un est va être, comme, attendre. 779 00:45:58,860 --> 00:45:59,800 Ce n'est pas juste. 780 00:45:59,800 --> 00:46:01,790 Cela ne devrait pas être ici. 781 00:46:01,790 --> 00:46:06,650 Donc, c'est une façon de faire les choses à être une sorte de sécurité. 782 00:46:06,650 --> 00:46:10,300 >> Mais pensez à même des programmes que vous écrivez. 783 00:46:10,300 --> 00:46:13,000 Disons que vous avez écrit le programme de connexion. 784 00:46:13,000 --> 00:46:20,440 Donc, ce programme de connexion que vous avez écrit, si évidemment, vous êtes un bon 785 00:46:20,440 --> 00:46:21,210 programmeur. 786 00:46:21,210 --> 00:46:25,610 Vous n'allez pas mettre n'importe quel malveillants si x est égal à égaux David est génial 787 00:46:25,610 --> 00:46:27,860 dans votre code. 788 00:46:27,860 --> 00:46:31,930 Mais ce programme, ce que vous faites utiliser pour compiler ce programme? 789 00:46:31,930 --> 00:46:34,180 Quelque chose comme Clang. 790 00:46:34,180 --> 00:46:38,460 Alors que faire si la personne qui se trouvait à écrire Clang spécial tubé dans Clang 791 00:46:38,460 --> 00:46:44,310 quelque chose comme, si je suis la compilation du programme vous connecter, saisissez ce code 792 00:46:44,310 --> 00:46:49,720 dans le programme de connexion qui dit, si x est égal à égal David est génial? 793 00:46:49,720 --> 00:46:59,890 Donc, pas encore tout à fait, mais nous avons le même émettre ici, où Clang, bien, 794 00:46:59,890 --> 00:47:03,790 des milliers, sinon des dizaines de milliers de personnes, ont regardé Clang, ont 795 00:47:03,790 --> 00:47:07,160 regardé ses lignes de code et dit: tout droit, il n'y a rien de mal ici. 796 00:47:07,160 --> 00:47:10,680 Évidemment, personne ne fait tout ce malveillant. 797 00:47:10,680 --> 00:47:15,780 >> Mais ce qui est lui-même Clang, comme, si je compile Clang? 798 00:47:15,780 --> 00:47:20,900 Que faire si j'ai un compilateur qui compile Clang qui s'insère dans Clang 799 00:47:20,900 --> 00:47:25,610 ce hack spécial qui dit, tout droit, quand je compile Clang, le 800 00:47:25,610 --> 00:47:31,290 exécutable je me dois spécialement regarder à l'intérieur du programme et insert connexion 801 00:47:31,290 --> 00:47:34,230 ce mot de passe, est égal à égal Dave est génial? 802 00:47:34,230 --> 00:47:37,990 Alors, n'oubliez pas que votre compilateur lui-même doit être compilé à un moment donné. 803 00:47:37,990 --> 00:47:42,810 Donc, si ce que vous choisissez de compiler Clang avec lui-même est malveillant, alors vous 804 00:47:42,810 --> 00:47:45,580 pourrait être vissée toute en bas de la ligne. 805 00:47:45,580 --> 00:47:49,630 >> Donc, ici, nous avons Ken Thompson et Dennis Ritchie. 806 00:47:49,630 --> 00:47:53,780 C'est donc une photo emblématique. 807 00:47:53,780 --> 00:47:55,470 Dennis Ritchie est sur la droite. 808 00:47:55,470 --> 00:47:58,740 Il est un grand - 809 00:47:58,740 --> 00:48:03,640 assez bien écrit C. Ainsi, vous pouvez le remercier pour cette classe. 810 00:48:03,640 --> 00:48:04,840 Ken Thomson est sur la gauche. 811 00:48:04,840 --> 00:48:07,780 Les deux d'entre eux essentiellement écrit UNIX. 812 00:48:07,780 --> 00:48:10,140 Eh bien, ils ont été les principaux contributeurs sous UNIX. 813 00:48:10,140 --> 00:48:11,310 Il y avait quelques autres. 814 00:48:11,310 --> 00:48:16,240 Donc, Ken Thompson, à un moment donné, il remporte le prix Turing. 815 00:48:16,240 --> 00:48:20,860 Et le prix Turing, j'ai toujours entendu il référencé cette façon, c'est le 816 00:48:20,860 --> 00:48:23,100 Prix ​​Nobel de l'informatique. 817 00:48:23,100 --> 00:48:27,500 >> Donc, au prix Turing, il doit prononcer son discours d'acceptation. 818 00:48:27,500 --> 00:48:31,790 Et il donne cette très célèbre discours maintenant, appelé Réflexions sur la confiance 819 00:48:31,790 --> 00:48:35,620 Confiance, qui nous avons lié Pour sur le site du cours. 820 00:48:35,620 --> 00:48:41,670 Et dans ce discours, dit-il, tout droit, j'ai donc écrit UNIX, et maintenant tous 821 00:48:41,670 --> 00:48:43,320 vous les gens utilisent UNIX. 822 00:48:43,320 --> 00:48:46,960 Maintenant, rappelez-vous aujourd'hui que Linux est un descendant direct d'UNIX. 823 00:48:46,960 --> 00:48:50,140 OS X utilise directement UNIX. 824 00:48:50,140 --> 00:48:53,810 Windows n'utilise pas beaucoup, mais beaucoup d'idées ont été prises à partir d'UNIX. 825 00:48:53,810 --> 00:48:59,220 >> Alors il monte sur la scène et dit: tout droit, j'ai écrit UNIX. 826 00:48:59,220 --> 00:49:03,940 Et juste pour vous les gars savent, je suis en mesure de se connecter à tous les 827 00:49:03,940 --> 00:49:05,590 seul un de vos ordinateurs. 828 00:49:05,590 --> 00:49:14,280 Depuis que j'ai mis un de ces si spéciale x est égal à égal Ken Thomson est impressionnant, 829 00:49:14,280 --> 00:49:16,350 alors je suis autorisé à vous connecter. 830 00:49:16,350 --> 00:49:18,370 Alors, les gens sont comme, bien, Comment as-tu fait cela? 831 00:49:18,370 --> 00:49:21,090 Nous avons examiné le programme de connexion et rien n'est là. 832 00:49:21,090 --> 00:49:24,700 Il est comme, bien, j'ai modifié le compilateur à identifier le programme de connexion 833 00:49:24,700 --> 00:49:30,490 de sorte que le programme de connexion maintenant aura que x est égal à égaux Ken Thompson 834 00:49:30,490 --> 00:49:31,700 est impressionnante. 835 00:49:31,700 --> 00:49:33,120 >> Et ils disent, eh bien, ce n'est pas vrai. 836 00:49:33,120 --> 00:49:35,740 Nous cherchons à le compilateur, et la compilateur n'a pas encore de lignes de 837 00:49:35,740 --> 00:49:36,400 Code comme ça. 838 00:49:36,400 --> 00:49:40,540 Il est comme, OK, mais ce qui vous la compilation du compilateur avec? 839 00:49:40,540 --> 00:49:44,810 Et ils pensent, et il est, comme, bien, Je suis celui qui vous a donné le compilateur 840 00:49:44,810 --> 00:49:50,580 vous utilisez pour compiler le compilateur, si vous compilez un compilateur, qui 841 00:49:50,580 --> 00:49:56,390 lui-même est malveillant, et sera briser le programme de connexion. 842 00:49:56,390 --> 00:49:59,360 Donc, fondamentalement, à ce moment, il n'y a aucun moyen que vous pouvez regarder à la source 843 00:49:59,360 --> 00:50:02,450 Code du programme de connexion pour voir ce qui est faux. 844 00:50:02,450 --> 00:50:04,220 Vous pourriez même pas regarder dans le le code source du compilateur 845 00:50:04,220 --> 00:50:06,790 pour voir ce qui est faux. 846 00:50:06,790 --> 00:50:11,940 >> Vous auriez besoin de regarder la machine code, le binaire réel de la 847 00:50:11,940 --> 00:50:16,760 compilateur compilé pour voir, attendre, ces lignes de code ne devrait pas être ici. 848 00:50:16,760 --> 00:50:22,130 Mais Ken Thompson a pris une étape plus loin et dit, eh bien, il ya 849 00:50:22,130 --> 00:50:25,980 ces programmes spéciaux qui fait vous aider à lire le fichier binaire de programmes, 850 00:50:25,980 --> 00:50:29,340 et si quelqu'un a utilisé ce programme pour lire le binaire, ils verraient les 851 00:50:29,340 --> 00:50:30,490 lignes de code. 852 00:50:30,490 --> 00:50:34,020 Il a modifié ces programmes à dire, tout droite, si vous êtes à la recherche à la 853 00:50:34,020 --> 00:50:38,460 compilateur, ne montrent pas ce particulier ensemble de binaire. 854 00:50:38,460 --> 00:50:42,830 >> Alors vous avez besoin de faire un pas de plus loin et en gros, qui pourrait avoir 855 00:50:42,830 --> 00:50:46,210 plusieurs niveaux d'indirection prises, et à un moment donné, personne ne s'agit en fait 856 00:50:46,210 --> 00:50:47,990 va être vérifier. 857 00:50:47,990 --> 00:50:52,590 Donc la morale de l'histoire est, vous êtes ne va pas être écrit 858 00:50:52,590 --> 00:50:54,340 Clang dans cette classe. 859 00:50:54,340 --> 00:50:57,020 Vous allez être en utilisant l'escalade Clang beaucoup dans cette classe. 860 00:50:57,020 --> 00:51:00,490 Pour tous vous le savez, Clang est un malveillant programme qui est en train de saboter tous les 861 00:51:00,490 --> 00:51:03,520 programme unique que vous avez jamais compilé. 862 00:51:03,520 --> 00:51:08,206 Et de vous laisser sur ce très inquiétant Attention, vous voir mercredi. 863 00:51:08,206 --> 00:51:10,030 >> [Applaudissements] 864 00:51:10,030 --> 00:51:12,935 >> ENCEINTE 2: Lors de la prochaine CS50. 865 00:51:12,935 --> 00:51:14,580 >> ENCEINTE 3: Ne pas vous osez dire que. 866 00:51:14,580 --> 00:51:15,930 Vous pouvez le faire. 867 00:51:15,930 --> 00:51:19,440 Vous l'avez déjà fait, vous pouvez le faire aujourd'hui, vous pouvez le faire demain. 868 00:51:19,440 --> 00:51:20,930 Vous avez fait cela pendant des années. 869 00:51:20,930 --> 00:51:22,790 Il suffit d'aller là-bas et le faire. 870 00:51:22,790 --> 00:51:24,310 Vous pouvez le faire. 871 00:51:24,310 --> 00:51:26,102 >> [MUSIQUE JEU]