1 00:00:00,000 --> 00:00:10,970 >> [Jouer de la musique] 2 00:00:10,970 --> 00:00:12,536 >> DAVID J. Malan: Très bien. 3 00:00:12,536 --> 00:00:13,392 >> [Rires] 4 00:00:13,392 --> 00:00:14,240 >> Bienvenue. 5 00:00:14,240 --> 00:00:14,990 C'est CS50. 6 00:00:14,990 --> 00:00:16,890 Et c'est la fin de la cinquième semaine. 7 00:00:16,890 --> 00:00:20,020 Et jusqu'à maintenant, nous avons à peu près été prise pour acquis qu'il n'y 8 00:00:20,020 --> 00:00:23,480 existe ce compilateur, Clang, que vous avez été invoquer par le biais de cette 9 00:00:23,480 --> 00:00:27,100 autre outil appelé Faire que quelque transforme comme par magie votre code source 10 00:00:27,100 --> 00:00:31,350 en code objet, les zéros et de uns que le processeur de votre ordinateur, central 11 00:00:31,350 --> 00:00:33,410 unité de traitement, comprend réellement. 12 00:00:33,410 --> 00:00:36,770 Mais il s'avère qu'il ya un certain nombre qui est passe sous le capot en 13 00:00:36,770 --> 00:00:38,690 entre l'entrée et la sortie. 14 00:00:38,690 --> 00:00:41,800 >> Et je voudrais proposer que nous chair que dans un peu plus en détail dans 15 00:00:41,800 --> 00:00:45,130 ces quatre étapes, ont quelque chose appelé pré-traitement, quelque chose 16 00:00:45,130 --> 00:00:48,300 appelée compilation, qui nous l'avons vu, quelque chose qui s'appelle l'assemblage et 17 00:00:48,300 --> 00:00:49,420 quelque chose qui s'appelle la liaison. 18 00:00:49,420 --> 00:00:53,270 Donc, jusqu'à présent, dans certains de nos programmes, nous avons eu tranchant comprend. 19 00:00:53,270 --> 00:00:56,650 Plus récemment, nous avons eu un peu de tranchant définit des constantes. 20 00:00:56,650 --> 00:01:00,660 Ainsi, il s'avère que ces choses qui sont précédés du symbole dièse ou 21 00:01:00,660 --> 00:01:04,150 le symbole de la livre sont pré-processeur directives. 22 00:01:04,150 --> 00:01:07,960 C'est juste une façon élégante de dire que c'est une ligne de code qui est réellement 23 00:01:07,960 --> 00:01:12,280 transformé en quelque chose d'autre avant l' ordinateur même essayer de convertir votre 24 00:01:12,280 --> 00:01:13,800 programme en zéros et de uns. 25 00:01:13,800 --> 00:01:19,000 >> Par exemple, forte inclut norme I / O. H, à peu près signifie simplement aller 26 00:01:19,000 --> 00:01:24,010 l'avance, récupérer le contenu des fichiers stdio.h et les coller là. 27 00:01:24,010 --> 00:01:25,880 Donc, pas de zéros et de uns à ce moment-là encore. 28 00:01:25,880 --> 00:01:27,470 C'est vraiment juste une substitution. 29 00:01:27,470 --> 00:01:30,790 Et cela est fait au cours de la soi-disant phase de pré-traitement, lorsque vous 30 00:01:30,790 --> 00:01:34,230 effectivement parcourue Clang ou spécifiquement Faire dans la plupart des cas. 31 00:01:34,230 --> 00:01:36,950 Donc, tout ce qui s'est passé première automatiquement jusqu'à présent. 32 00:01:36,950 --> 00:01:38,800 >> Puis vient l'étape de compilation. 33 00:01:38,800 --> 00:01:40,920 Mais nous avons été trop simplifiée compilation. 34 00:01:40,920 --> 00:01:45,060 Compiler un programme signifie vraiment prendre à partir de quelque chose comme C, le 35 00:01:45,060 --> 00:01:48,430 code source que nous avons écrit, en baisse à quelque chose qui s'appelle l'assemblage. 36 00:01:48,430 --> 00:01:52,900 Assemblée langue est un niveau inférieur langage qui, heureusement, nous ne serons pas 37 00:01:52,900 --> 00:01:55,480 ont beaucoup l'occasion d' écrire ce semestre. 38 00:01:55,480 --> 00:01:59,100 Mais c'est au niveau le plus bas dans l' sens où vous littéralement commencer à écrire 39 00:01:59,100 --> 00:02:04,270 additionner et soustraire et multiplier et charger à partir de la mémoire et sauvegarder dans la mémoire, l' 40 00:02:04,270 --> 00:02:08,259 instructions très simples qu'un ordinateur, sous le capot, 41 00:02:08,259 --> 00:02:09,639 comprend réellement. 42 00:02:09,639 --> 00:02:14,930 >> Enfin, l'assemblage prend cette langue les zéros et de uns que nous avons été 43 00:02:14,930 --> 00:02:16,190 décrivant ce jour. 44 00:02:16,190 --> 00:02:19,270 Et vraiment, enfin, il ya le soi-disant édition de liens, que nous allons 45 00:02:19,270 --> 00:02:22,360 voir dans un instant, qui combine vos zéros et de uns avec des zéros et 46 00:02:22,360 --> 00:02:24,870 ceux d'autres personnes avant vous avez créé. 47 00:02:24,870 --> 00:02:26,660 >> Ainsi, considérer ce programme super simple. 48 00:02:26,660 --> 00:02:27,560 C'est à partir de la semaine 1. 49 00:02:27,560 --> 00:02:29,610 Il a simplement dit: Bonjour tout le monde, sur l'écran. 50 00:02:29,610 --> 00:02:30,920 Nous avons couru à travers cette Clang. 51 00:02:30,920 --> 00:02:33,200 Or nous avons couru il Faire travers qui s'est déroulée Clang. 52 00:02:33,200 --> 00:02:36,170 Et sorti à l'époque où certains zéros et de uns. 53 00:02:36,170 --> 00:02:38,100 Mais il s'avère qu'il ya une étape intermédiaire. 54 00:02:38,100 --> 00:02:40,460 Si je vais ici - oups, n'a pas veux le voir encore. 55 00:02:40,460 --> 00:02:44,800 Si je vais sur ici pour mon appareil et j'ouvre hello.c, ici 56 00:02:44,800 --> 00:02:46,160 est que même programme. 57 00:02:46,160 --> 00:02:48,600 Et ce que je vais faire dans mon terminal fenêtre est ici, je vais 58 00:02:48,600 --> 00:02:51,430 Clang courir plutôt que de faire, ce qui automatise l'ensemble des quatre 59 00:02:51,430 --> 00:02:52,870 ces étapes pour nous. 60 00:02:52,870 --> 00:02:58,620 Et je vais faire clang-S et puis hello.c puis entrez. 61 00:02:58,620 --> 00:03:00,590 >> Et je reçois un message clignotant encore une fois, ce qui est bon. 62 00:03:00,590 --> 00:03:05,280 Et maintenant, dans un peu plus grande fenêtre, Je vais ouvrir gedit ici. 63 00:03:05,280 --> 00:03:09,610 Et je vais ouvrir un fichier, s'avère, est appelé hello.s cette 64 00:03:09,610 --> 00:03:11,870 contient que langage d'assemblage J'ai parlé plus tôt. 65 00:03:11,870 --> 00:03:15,060 Et c'est ce qu'on appelle l'Assemblée langue, niveau assez faible 66 00:03:15,060 --> 00:03:18,470 instructions que votre CPU Intel ou quoi que ce soit qui est à l'intérieur 67 00:03:18,470 --> 00:03:19,350 comprend. 68 00:03:19,350 --> 00:03:24,480 Et mov est pour le mouvement. appel est pour l'appel, une fonction de très faible activité. 69 00:03:24,480 --> 00:03:26,380 sous est pour soustraire. 70 00:03:26,380 --> 00:03:30,370 >> Ainsi, lorsque vous avez un processeur particulier à l'intérieur de votre ordinateur, ce qui le rend 71 00:03:30,370 --> 00:03:34,300 processeurs distincts, par rapport aux autres sur le marché, qui est elle instructions 72 00:03:34,300 --> 00:03:39,460 comprend et souvent de son efficacité est, comment il est rapide à exécuter certaines 73 00:03:39,460 --> 00:03:40,380 de ces instructions. 74 00:03:40,380 --> 00:03:45,150 Maintenant, pour en savoir plus, vous pouvez prendre prochaine CS61 d'automne au collège. 75 00:03:45,150 --> 00:03:48,170 Mais ici, nous avons, par exemple, quelques-uns identificateurs qui pourrait sembler familier. 76 00:03:48,170 --> 00:03:50,150 hello.c est le nom du programme. 77 00:03:50,150 --> 00:03:51,070 >> . Texte - 78 00:03:51,070 --> 00:03:54,190 il n'ya pas beaucoup d'intérêt il tout à l'heure, rappelons que le texte 79 00:03:54,190 --> 00:03:59,190 secteur, à partir de lundi, c'est là en mémoire de votre programme se termine effectivement en place. 80 00:03:59,190 --> 00:04:01,330 C'est donc au moins vaguement familier là. 81 00:04:01,330 --> 00:04:03,730 Ici, bien sûr, est une mention de notre fonction principale. 82 00:04:03,730 --> 00:04:07,220 Défilement vers le bas, ceux-ci concernent des choses appelés registres très petits morceaux de 83 00:04:07,220 --> 00:04:09,190 à l'intérieur de la mémoire de votre CPU réelle. 84 00:04:09,190 --> 00:04:12,930 Et si je fais défiler vers le bas, même plus loin, je vois une sorte 85 00:04:12,930 --> 00:04:14,240 mention indirecte de l'ASCII. 86 00:04:14,240 --> 00:04:17,120 Et là, en effet, cette chaîne, bonjour, une virgule monde. 87 00:04:17,120 --> 00:04:20,079 >> Tant histoire courte, cela a été se passe pour vous, automatiquement, 88 00:04:20,079 --> 00:04:22,140 sous le capot tout ce temps. 89 00:04:22,140 --> 00:04:26,450 Et ce qui se passe est vraiment une fois vous avez couru Clang, ou par voie de 90 00:04:26,450 --> 00:04:29,150 Faites, vous obtenez d'abord, à partir du code source, l' 91 00:04:29,150 --> 00:04:30,700 ce qu'on appelle en langage assembleur. 92 00:04:30,700 --> 00:04:35,210 Puis Clang est de convertir cette assemblée langue vers zéros et de uns. 93 00:04:35,210 --> 00:04:38,340 Et c'est la diapositive que nous avons commencé notre discussion à la Semaine 0 sur - 94 00:04:38,340 --> 00:04:39,840 puis 1 semaine de suite. 95 00:04:39,840 --> 00:04:44,030 Et enfin, ces zéros et de uns sont combinées avec des zéros et des uns 96 00:04:44,030 --> 00:04:47,190 à partir de ces bibliothèques que nous avons pris des pour acquis, comme E / S standard ou la 97 00:04:47,190 --> 00:04:50,010 Chaîne bibliothèque ou même la bibliothèque CS50. 98 00:04:50,010 --> 00:04:54,200 >> Donc, pour peindre ce tableau plus Visuellement, nous avons hello.c. 99 00:04:54,200 --> 00:04:57,220 Et, bien sûr, utilise la fonction printf fonctionner à dire, bonjour tout le monde. 100 00:04:57,220 --> 00:05:01,810 L'étape de compilation prend le bas à ce fichier que nous venons de voir hello.s, même 101 00:05:01,810 --> 00:05:04,290 mais qui est généralement supprimé automatiquement pour vous. 102 00:05:04,290 --> 00:05:06,050 Mais c'est le code assembleur à l'étape intermédiaire. 103 00:05:06,050 --> 00:05:09,750 Et puis, quand nous montons l'Assemblée langue, pour ainsi dire, c'est quand vous 104 00:05:09,750 --> 00:05:10,830 obtenir ces zéros et de uns. 105 00:05:10,830 --> 00:05:13,920 Donc, nous avons zoomé efficacement aujourd'hui sur ce que nous avons prenons pour acquis, 106 00:05:13,920 --> 00:05:16,430 signifie aller code source de s'opposer code. 107 00:05:16,430 --> 00:05:18,850 >> Mais enfin, maintenant que même image - nous allons le pousser vers 108 00:05:18,850 --> 00:05:20,020 le côté gauche. 109 00:05:20,020 --> 00:05:22,880 Et noter que dans le top il J'ai mentionné stdio.h. 110 00:05:22,880 --> 00:05:25,030 C'est un dossier que nous avons inclus dans la quasi-totalité de la 111 00:05:25,030 --> 00:05:26,250 programmes que nous avons écrit. 112 00:05:26,250 --> 00:05:28,830 Et c'est le fichier dont le contenu Obtenir une copie collé, 113 00:05:28,830 --> 00:05:30,350 effectivement au sommet de votre code. 114 00:05:30,350 --> 00:05:34,170 Mais il s'avère que, sur un ordinateur système quelque part, il ya sans doute une 115 00:05:34,170 --> 00:05:39,150 fichier stdio.c que quelqu'un écrivait ans Il ya ce que met en œuvre l'ensemble de la 116 00:05:39,150 --> 00:05:41,870 fonctions qui ont été déclarées dans stdio.h. 117 00:05:41,870 --> 00:05:45,465 >> Maintenant, en réalité, ce n'est probablement pas le votre Mac ou votre PC, ou même dans la 118 00:05:45,465 --> 00:05:47,660 CS50 appareil est un code C brut. 119 00:05:47,660 --> 00:05:52,710 Quelqu'un a déjà compilé et inclus Fichier de code objet. O ou. Une 120 00:05:52,710 --> 00:05:56,020 fichier, qui se réfère à une bibliothèque partagée qui a été pré-installés et 121 00:05:56,020 --> 00:05:57,240 pré-compilé pour vous. 122 00:05:57,240 --> 00:06:01,950 Mais supposons qu'il existe effectivement sur notre stdio.c informatique en parallèle 123 00:06:01,950 --> 00:06:02,650 avec Clang. 124 00:06:02,650 --> 00:06:04,960 Votre code est en cours de compilation et assemblés. 125 00:06:04,960 --> 00:06:09,200 Code de l 'stdio.c est compilé et assemblé, de sorte que cette dernière 126 00:06:09,200 --> 00:06:13,730 étape, ici-bas, nous avons en quelque sorte lien, pour ainsi dire, vos zéros et de uns 127 00:06:13,730 --> 00:06:18,430 avec ses zéros et de uns dans une programme simple qui est en fin de compte 128 00:06:18,430 --> 00:06:20,540 appelé juste Bonjour. 129 00:06:20,540 --> 00:06:23,340 >> C'est donc toute la magie qui est s'est passé jusqu'à présent. 130 00:06:23,340 --> 00:06:26,430 Et nous continuerons à prendre ces processus pour acquis, mais se rendent compte 131 00:06:26,430 --> 00:06:28,750 il ya beaucoup de détails croustillants se passe là-dessous. 132 00:06:28,750 --> 00:06:31,920 Et c'est ce qui fait votre ordinateur avec Intel inside 133 00:06:31,920 --> 00:06:33,940 particulièrement nette. 134 00:06:33,940 --> 00:06:37,020 >> Donc, sur cette note, si vous souhaitez vous joindre à nous pour le déjeuner ce vendredi, le faire aller 135 00:06:37,020 --> 00:06:41,570 au lieu cs50.net/rsvp d'habitude, 13h15 ce vendredi. 136 00:06:41,570 --> 00:06:43,400 Et maintenant quelques annonces. 137 00:06:43,400 --> 00:06:44,670 Donc, nous avons quelques bonnes nouvelles. 138 00:06:44,670 --> 00:06:45,970 Et nous avons de mauvaises nouvelles. 139 00:06:45,970 --> 00:06:47,260 Commencez par quelques bonnes nouvelles ici. 140 00:06:47,260 --> 00:06:52,038 141 00:06:52,038 --> 00:06:54,510 >> [Gémissant] 142 00:06:54,510 --> 00:06:54,710 >> Très bien. 143 00:06:54,710 --> 00:06:56,670 Eh bien, c'est techniquement un jour férié, donc ce n'est pas tellement un cadeau de nous. 144 00:06:56,670 --> 00:06:58,030 Mais alors, les mauvaises nouvelles bien sûr. 145 00:06:58,030 --> 00:07:00,550 146 00:07:00,550 --> 00:07:01,880 >> [Gémissant] 147 00:07:01,880 --> 00:07:03,530 >> J'ai passé beaucoup de temps sur ces animations. 148 00:07:03,530 --> 00:07:04,690 >> [Rires] 149 00:07:04,690 --> 00:07:07,000 >> Il y aura une session d'examen lundi prochain. 150 00:07:07,000 --> 00:07:08,340 Ça va être à 17h30. 151 00:07:08,340 --> 00:07:11,210 Nous allons vous rappeler de tous ces détails via e-mail sur le cours de 152 00:07:11,210 --> 00:07:13,470 site Web en seulement quelques jours de temps. 153 00:07:13,470 --> 00:07:16,610 Il sera filmé et mis à disposition peu de temps après. 154 00:07:16,610 --> 00:07:19,200 Donc, si vous ne pouvez pas faire ce lundi fente de la nuit, ne vous inquiétez pas. 155 00:07:19,200 --> 00:07:22,270 Sections cette semaine à venir sera également se concentrer sur l'examen pour le quiz. 156 00:07:22,270 --> 00:07:25,670 Si votre section est le lundi, ce qui est En effet vacances universitaires, nous 157 00:07:25,670 --> 00:07:26,920 encore satisfaire à la section. 158 00:07:26,920 --> 00:07:28,890 Si vous ne pouvez pas faire ce que section parce que vous allez 159 00:07:28,890 --> 00:07:29,860 de là, c'est très bien. 160 00:07:29,860 --> 00:07:33,710 Assister à un dimanche ou mardi ou section mise au point pour la section de Jason, qui est 161 00:07:33,710 --> 00:07:35,110 disponibles en ligne. 162 00:07:35,110 --> 00:07:37,490 >> Ainsi, plus de mauvaises nouvelles. 163 00:07:37,490 --> 00:07:41,960 Ainsi, selon le programme, nous avons conférence vendredi prochain. 164 00:07:41,960 --> 00:07:43,690 Mais les bonnes nouvelles - 165 00:07:43,690 --> 00:07:44,860 clairement, j'ai passé trop de temps sur ce sujet. 166 00:07:44,860 --> 00:07:45,280 >> [Rires] 167 00:07:45,280 --> 00:07:47,140 >> Nous annulerons suivant les cours de vendredi. 168 00:07:47,140 --> 00:07:50,590 Donc, ça va être un cadeau pour nous, de sorte que vous peut vraiment avoir un bon répit 169 00:07:50,590 --> 00:07:52,990 entre cette semaine et deux semaines plus tard. 170 00:07:52,990 --> 00:07:57,460 Donc, pas de conférences la semaine prochaine, un tout petit petit quiz, pour lequel vous devriez être 171 00:07:57,460 --> 00:07:59,030 se faire de plus en plus excité. 172 00:07:59,030 --> 00:08:03,870 >> Donc, nous allons maintenant tourner notre attention vers quelque chose qui est bien plus visuelle 173 00:08:03,870 --> 00:08:06,990 et de plus excitant et de préparer le terrain pour ce qui va être à l'horizon 174 00:08:06,990 --> 00:08:08,420 en seulement quelques semaines. 175 00:08:08,420 --> 00:08:12,160 Après le premier questionnaire, nous allons transformer le l'accent de nos ensembles de problèmes à l'autre 176 00:08:12,160 --> 00:08:16,710 problème spécifique à un domaine, celui de judiciaire ou de sécurité plus général. 177 00:08:16,710 --> 00:08:19,550 >> En fait, la tradition avec ce problème ensemble est pour moi l'un des 178 00:08:19,550 --> 00:08:24,850 enseignement boursier ou CA de marcher à travers campus de prendre quelques photos de 179 00:08:24,850 --> 00:08:29,450 personnes évidents identifiables, mais non, endroits ou des choses, puis tous les ans je 180 00:08:29,450 --> 00:08:34,520 en quelque sorte réussi à effacer accidentellement ou endommager la carte des médias numériques 181 00:08:34,520 --> 00:08:35,720 C'est à l'intérieur de notre caméra. 182 00:08:35,720 --> 00:08:36,860 Mais pas une grosse affaire. 183 00:08:36,860 --> 00:08:39,200 Je peux aller de l'avant et de le brancher que dans mon ordinateur. 184 00:08:39,200 --> 00:08:43,010 Je peux faire une image légale de celui-ci, de sorte dire, en copiant les zéros et 185 00:08:43,010 --> 00:08:46,830 celles au large de cette carte mémoire, que ce soit c'est une carte SD ou une carte compact flash ou 186 00:08:46,830 --> 00:08:48,100 ce que vous êtes familier avec. 187 00:08:48,100 --> 00:08:49,300 Et puis, nous pouvons remettre cela. 188 00:08:49,300 --> 00:08:53,190 >> Et si le défi à relever, entre autres, choses pour vous, sera d'écrire 189 00:08:53,190 --> 00:08:58,630 Code C qui récupère tout un tas d' JPEG pour moi et révélées seront 190 00:08:58,630 --> 00:09:00,190 ces personnes, des lieux ou des choses. 191 00:09:00,190 --> 00:09:03,340 Et nous parlerons également, dans ce problème définir et dans les jours à venir, sur 192 00:09:03,340 --> 00:09:04,440 graphiques plus générale. 193 00:09:04,440 --> 00:09:06,140 Nous les avons utilisés, un cours, pour sortir. 194 00:09:06,140 --> 00:09:09,080 Mais vous avez en quelque sorte pris pour acquis il existe ces notions de haut niveau 195 00:09:09,080 --> 00:09:10,680 des rectangles et des ovales. 196 00:09:10,680 --> 00:09:12,450 Mais sous le capot il ya des pixels. 197 00:09:12,450 --> 00:09:14,370 Et vous avez dû commencer penser à ceux-ci. 198 00:09:14,370 --> 00:09:18,800 Ou vous pour p-set 4 avoir à penser sur l'écart entre vos briques, comment 199 00:09:18,800 --> 00:09:21,990 rapidement vous n'êtes balle se déplace à travers l'écran pour sortir. 200 00:09:21,990 --> 00:09:24,830 Donc, il ya cette notion de l' points sur votre écran qui est 201 00:09:24,830 --> 00:09:26,290 entrer en jeu déjà. 202 00:09:26,290 --> 00:09:29,430 >> Maintenant, ce que vous voyez, cependant, c'est ce vous arrivez sur un écran d'ordinateur. 203 00:09:29,430 --> 00:09:33,680 Si vous avez déjà regardé un bien ou mauvaise télévision, les chances sont-ils assez bien 204 00:09:33,680 --> 00:09:36,280 traiter le public comme technophobes qui n'ont pas vraiment 205 00:09:36,280 --> 00:09:37,630 en savoir beaucoup sur l'informatique. 206 00:09:37,630 --> 00:09:40,840 Et il est donc très facile pour la police detective-à-dire, pouvez-vous 207 00:09:40,840 --> 00:09:41,710 nettoyer ça pour moi? 208 00:09:41,710 --> 00:09:42,710 Ou renforcer, non? 209 00:09:42,710 --> 00:09:45,550 Améliorer, c'est comme le mot à la mode dans plus aucune émission liée à la criminalité. 210 00:09:45,550 --> 00:09:49,240 Et la réalité est que si vous prenez une très image floue d'un suspect faisant 211 00:09:49,240 --> 00:09:51,620 quelque chose de mauvais, vous ne pouvez pas juste l'améliorer. 212 00:09:51,620 --> 00:09:53,080 Vous ne pouvez pas zoomer en continu. 213 00:09:53,080 --> 00:09:56,350 Vous ne pouvez pas le voir dans le reflet de quelqu'un d' oeil qui a commis le 214 00:09:56,350 --> 00:09:59,860 crime particulier, malgré le la prévalence de ce phénomène sur la télévision. 215 00:09:59,860 --> 00:10:04,110 >> Et ainsi, avec qui nous allons motiver que à venir problème réglé avec un aperçu 216 00:10:04,110 --> 00:10:05,765 quelques spectacles avec qui vous peut-être familier. 217 00:10:05,765 --> 00:10:06,500 >> [LECTURE VIDEO] 218 00:10:06,500 --> 00:10:07,835 >> -OK. 219 00:10:07,835 --> 00:10:09,956 Maintenant, nous allons obtenir un look bien à vous. 220 00:10:09,956 --> 00:10:17,060 221 00:10:17,060 --> 00:10:17,766 >> -Tenez-le. 222 00:10:17,766 --> 00:10:18,658 Exécutez ce retour. 223 00:10:18,658 --> 00:10:19,550 >> -Attendez une minute. 224 00:10:19,550 --> 00:10:21,580 Allez à droite. 225 00:10:21,580 --> 00:10:21,800 >> -Il. 226 00:10:21,800 --> 00:10:22,690 Congeler cela. 227 00:10:22,690 --> 00:10:23,692 >> Écran plein. 228 00:10:23,692 --> 00:10:23,846 >> -OK. 229 00:10:23,846 --> 00:10:24,154 Congeler cela. 230 00:10:24,154 --> 00:10:25,140 >> Serrez-vous à ce sujet, voulez-vous? 231 00:10:25,140 --> 00:10:27,090 >> Vector-en sur ce mec par la roue arrière. 232 00:10:27,090 --> 00:10:29,730 >> -Zoom, ici, sur cette place. 233 00:10:29,730 --> 00:10:33,700 >> -Avec le bon équipement, le imagée peuvent être agrandies et aiguisé. 234 00:10:33,700 --> 00:10:34,490 >> -Qu'est-ce que c'est? 235 00:10:34,490 --> 00:10:35,870 >> -Il s'agit d'un programme d'amélioration. 236 00:10:35,870 --> 00:10:36,793 >> -Pouvez-vous éclaircir ce point tout? 237 00:10:36,793 --> 00:10:38,560 >> -Je ne sais pas. 238 00:10:38,560 --> 00:10:39,090 Nous allons l'améliorer. 239 00:10:39,090 --> 00:10:41,690 >> -Améliorer la section A-6. 240 00:10:41,690 --> 00:10:43,510 >> -J'ai augmenté le détail et - 241 00:10:43,510 --> 00:10:44,456 >> -Je pense qu'il ya suffisamment de renforcer. 242 00:10:44,456 --> 00:10:45,402 Relâchez à mon écran. 243 00:10:45,402 --> 00:10:47,300 >> -Améliorer la réflexion dans son oeil. 244 00:10:47,300 --> 00:10:49,330 >> -Courons à travers cette amélioration de la vidéo. 245 00:10:49,330 --> 00:10:50,340 >> -Edgar, pouvez-vous améliorer ce? 246 00:10:50,340 --> 00:10:52,320 >> -Attends. 247 00:10:52,320 --> 00:10:54,290 >> -J'ai travaillé sur cette réflexion. 248 00:10:54,290 --> 00:10:55,560 >> -Quelqu'un de réflexion. 249 00:10:55,560 --> 00:10:56,440 >> -Réflexion. 250 00:10:56,440 --> 00:10:57,940 >> -Il ya une réflexion du visage de l'homme. 251 00:10:57,940 --> 00:10:58,860 >> -La réflexion. 252 00:10:58,860 --> 00:10:59,710 >> -Il ya une réflexion. 253 00:10:59,710 --> 00:11:00,900 >> -Zoom sur le miroir. 254 00:11:00,900 --> 00:11:03,500 >> Vous pouvez voir un reflet. 255 00:11:03,500 --> 00:11:04,700 >> -Pouvez-vous améliorer l'image à partir d'ici? 256 00:11:04,700 --> 00:11:05,700 >> -Pouvez-vous améliorer le droit ici? 257 00:11:05,700 --> 00:11:06,500 >> -Pouvez-vous améliorer? 258 00:11:06,500 --> 00:11:07,380 >> -Pouvez-vous améliorer? 259 00:11:07,380 --> 00:11:08,190 >> -Pouvons-nous améliorer ce? 260 00:11:08,190 --> 00:11:08,940 >> -Pouvez-vous améliorer? 261 00:11:08,940 --> 00:11:10,280 >> -Attends une seconde, je vais améliorer. 262 00:11:10,280 --> 00:11:11,570 >> -Zoomez sur la porte. 263 00:11:11,570 --> 00:11:12,180 >> -X10. 264 00:11:12,180 --> 00:11:13,052 >> -Zoom. 265 00:11:13,052 --> 00:11:13,197 >> [Rires] 266 00:11:13,197 --> 00:11:14,360 >> -Emménager 267 00:11:14,360 --> 00:11:15,100 >> -Attendez, arrêtez. 268 00:11:15,100 --> 00:11:15,740 >> -Stop. 269 00:11:15,740 --> 00:11:16,290 >> -Mettre en pause. 270 00:11:16,290 --> 00:11:19,390 >> -Tourner un 75 degrés autour de merci de la verticale. 271 00:11:19,390 --> 00:11:19,886 >> [Rires] 272 00:11:19,886 --> 00:11:24,350 >> -Arrêtez, et revenir à la partie sur la porte. 273 00:11:24,350 --> 00:11:26,330 >> -Vous avez une image enhancer qui peut bitmap? 274 00:11:26,330 --> 00:11:28,990 >> -Peut-être que nous pouvons utiliser la Pradeep Sen méthode pour voir à travers les fenêtres. 275 00:11:28,990 --> 00:11:30,680 >> -Ce logiciel est l'état de l'art. 276 00:11:30,680 --> 00:11:31,676 >> -La valeur d'icône est désactivée. 277 00:11:31,676 --> 00:11:34,166 >> -Avec la bonne combinaison des algorithmes. 278 00:11:34,166 --> 00:11:38,399 >> -Il a pris des algorithmes d'éclairage à le prochain niveau et je peux les utiliser pour 279 00:11:38,399 --> 00:11:38,648 renforcer cette photo. 280 00:11:38,648 --> 00:11:42,050 >> Verrouillez-le et agrandir l'axe z. 281 00:11:42,050 --> 00:11:42,760 >> -Améliorer. 282 00:11:42,760 --> 00:11:43,060 >> -Améliorer. 283 00:11:43,060 --> 00:11:43,760 >> -Améliorer. 284 00:11:43,760 --> 00:11:45,010 >> Le gel et améliorer. 285 00:11:45,010 --> 00:11:47,470 286 00:11:47,470 --> 00:11:47,910 >> [FIN LECTURE VIDÉO] 287 00:11:47,910 --> 00:11:51,470 >> DAVID J. Malan: Set de problème pour 5 est ce qui nous attend là-bas. 288 00:11:51,470 --> 00:11:55,260 Donc, nous allons bientôt avoir une meilleure compréhension quand et pourquoi vous ne pouvez 289 00:11:55,260 --> 00:11:57,300 et notre ne peut améliorer de cette façon. 290 00:11:57,300 --> 00:12:00,090 Mais d'abord, revenons à notre attention à certains des blocs de construction, nous allons 291 00:12:00,090 --> 00:12:02,250 doivent être en mesure de raconter cette histoire. 292 00:12:02,250 --> 00:12:05,580 >> Donc, rappelons que nous avons tiré cette image sur Lundi et un peu la semaine dernière. 293 00:12:05,580 --> 00:12:09,970 Et cela décrit la disposition des choses dans la mémoire de votre ordinateur lorsque 294 00:12:09,970 --> 00:12:11,000 l'exécution de certains programmes. 295 00:12:11,000 --> 00:12:14,310 Le segment technologique en haut, rappel, se réfère les zéros et de uns réels 296 00:12:14,310 --> 00:12:16,000 qui composent votre programme. 297 00:12:16,000 --> 00:12:19,340 Il ya, en dessous, certains initialisé ou données non initialisées, qui généralement 298 00:12:19,340 --> 00:12:22,910 se réfère à des choses comme des constantes ou des chaînes ou variables globales qui ont 299 00:12:22,910 --> 00:12:24,200 été déclarée à l'avance. 300 00:12:24,200 --> 00:12:26,500 Il ya le tas, mais nous reviendrons revenir dans un peu. 301 00:12:26,500 --> 00:12:27,410 >> Et puis il ya la pile. 302 00:12:27,410 --> 00:12:30,660 Tout comme une pile de plateaux dans la cafétéria, c'est là que la mémoire devient 303 00:12:30,660 --> 00:12:33,610 couches et couches chaque fois vous faites ce que dans un programme? 304 00:12:33,610 --> 00:12:36,380 305 00:12:36,380 --> 00:12:37,730 Quelle est l'utilité de pile pour? 306 00:12:37,730 --> 00:12:39,320 >> Ouais? 307 00:12:39,320 --> 00:12:40,000 >> Appel de fonction. 308 00:12:40,000 --> 00:12:42,890 Chaque fois que vous appelez une fonction, c'est donné à ruban de mémoire pour son 309 00:12:42,890 --> 00:12:45,020 variables locales ou de ses paramètres. 310 00:12:45,020 --> 00:12:48,810 Et imagée, nous voyons que les uns avec les fonction successive appelé, lorsque A 311 00:12:48,810 --> 00:12:52,520 appels B appelle C appels D, ils se couche sur la pile. 312 00:12:52,520 --> 00:12:55,630 Et dans chacune de ces tranches de mémoire est essentiellement une portée unique, 313 00:12:55,630 --> 00:12:58,590 pour cette fonction, ce qui, bien sûr, est problématique si vous voulez remettre 314 00:12:58,590 --> 00:13:01,850 d'une fonction à une autre Une pièce de données que vous voulez qu'il 315 00:13:01,850 --> 00:13:03,500 de muter ou de changer. 316 00:13:03,500 --> 00:13:08,060 >> Alors quelle est notre solution pour permettre aux Une fonction représentée par une pile 317 00:13:08,060 --> 00:13:11,390 encadrer pour changer la mémoire à l'intérieur d'un autre cadre de pile? 318 00:13:11,390 --> 00:13:14,590 Comment ces deux discours à l'autre? 319 00:13:14,590 --> 00:13:18,510 Donc, par le biais de pointeurs ou des adresses, qui, encore une fois, juste décrire où en 320 00:13:18,510 --> 00:13:22,280 la mémoire, par l'intermédiaire d'une particulière nombre de morsure, le particulier 321 00:13:22,280 --> 00:13:23,830 valeur peut être trouvée. 322 00:13:23,830 --> 00:13:26,860 Donc, rappeler la dernière fois aussi, nous avons continué l'histoire et regardé un 323 00:13:26,860 --> 00:13:28,280 assez programme buggy. 324 00:13:28,280 --> 00:13:32,900 Et ce programme est buggé pour quelques-uns raisons, mais le plus inquiétant est l'un 325 00:13:32,900 --> 00:13:34,620 parce qu'il ne parvient pas à vérifier quoi? 326 00:13:34,620 --> 00:13:39,111 327 00:13:39,111 --> 00:13:40,450 >> Ouais, il ne parvient pas à contrôler l'entrée. 328 00:13:40,450 --> 00:13:41,870 Désolé? 329 00:13:41,870 --> 00:13:43,880 >> Si c'est plus de 12 caractères. 330 00:13:43,880 --> 00:13:47,260 Donc, très intelligemment, en appelant memcopy, qui, comme son nom l'indique, juste 331 00:13:47,260 --> 00:13:50,630 copies mémoire de son second argument dans son premier argument. 332 00:13:50,630 --> 00:13:54,730 Le troisième argument, très intelligemment, est vérifié pour s'assurer que vous n'avez pas 333 00:13:54,730 --> 00:13:59,400 copier plus, dans ce cas, la longueur de barre, le nombre de caractères, 334 00:13:59,400 --> 00:14:03,810 dans la destination, ce qui est tableau C. Mais le problème est que ce 335 00:14:03,810 --> 00:14:07,230 C si elle n'est pas assez grande pour gérer cela? 336 00:14:07,230 --> 00:14:09,900 Vous allez copier le numéro de octets que vous avez été donné. 337 00:14:09,900 --> 00:14:13,040 Mais qu'est-ce que vous avez fait plus octets que vous avez la place pour? 338 00:14:13,040 --> 00:14:16,770 >> Eh bien, ce programme très bêtement juste procède aveuglément à prendre ce que ça 339 00:14:16,770 --> 00:14:20,650 donné, bonjour barre oblique inverse est 0 grand si la chaîne est courte 340 00:14:20,650 --> 00:14:22,040 assez, comme cinq caractères. 341 00:14:22,040 --> 00:14:26,470 Mais si c'est effectivement 12 caractères ou 1200 caractères, nous avons vu la dernière fois 342 00:14:26,470 --> 00:14:29,380 que vous allez juste complètement écraser la mémoire 343 00:14:29,380 --> 00:14:30,470 ne vous appartient pas. 344 00:14:30,470 --> 00:14:34,390 Et pire, si vous écrasez qui partie rouge là-bas que nous avons appelé l' 345 00:14:34,390 --> 00:14:35,380 adresse de retour - 346 00:14:35,380 --> 00:14:38,370 ce n'est que lorsque l'ordinateur automatiquement, pour vous, derrière l' 347 00:14:38,370 --> 00:14:43,130 scènes, se range une valeur 32 bits qui rappelle à quelle adresse il se doit 348 00:14:43,130 --> 00:14:47,080 retourner quand foo, cette autre fonction, on fait exécuter. 349 00:14:47,080 --> 00:14:49,320 C'est une miette de pain de toutes sortes à laquelle il renvoie. 350 00:14:49,320 --> 00:14:52,490 Si vous écrasez qui, potentiellement, Si vous êtes le méchant, peut pouvaient 351 00:14:52,490 --> 00:14:54,750 potentiellement prendre le relais l'ordinateur de quelqu'un. 352 00:14:54,750 --> 00:14:58,020 Et vous aurez très certainement s'écraser dans la plupart des cas. 353 00:14:58,020 --> 00:15:01,690 >> Maintenant, ce problème a été exacerbé seulement comme nous avons commencé à parler de la mémoire 354 00:15:01,690 --> 00:15:03,010 la gestion en général. 355 00:15:03,010 --> 00:15:07,150 Et malloc, pour l'allocation de mémoire, est un fonction que nous pouvons utiliser pour allouer 356 00:15:07,150 --> 00:15:11,260 mémoire lorsque nous ne savons pas à l'avance que nous pourrions avoir besoin d'. 357 00:15:11,260 --> 00:15:13,960 Ainsi, par exemple, si je reviens à l'appareil ici. 358 00:15:13,960 --> 00:15:21,010 Et j'ouvre de dernière hello2.c de temps, rappeler ce programme ici, qui semblait 359 00:15:21,010 --> 00:15:23,500 un petit quelque chose de ce genre, seulement trois lignes - 360 00:15:23,500 --> 00:15:27,940 indiquer votre nom, puis le nom de la chaîne, sur la gauche, est égal GetString. 361 00:15:27,940 --> 00:15:29,690 Et puis nous avons l'imprimer, le nom de l'utilisateur. 362 00:15:29,690 --> 00:15:31,170 >> Donc, ce fut un programme super simple. 363 00:15:31,170 --> 00:15:34,870 Pour être clair, je vais de l'avant et faire bonjour-2. 364 00:15:34,870 --> 00:15:36,680 Je vais faire dot slash bonjour-2. 365 00:15:36,680 --> 00:15:37,750 Indiquez votre nom - 366 00:15:37,750 --> 00:15:38,140 David. 367 00:15:38,140 --> 00:15:38,840 Entrée. 368 00:15:38,840 --> 00:15:39,540 Bonjour David. 369 00:15:39,540 --> 00:15:41,060 Il semble fonctionner OK. 370 00:15:41,060 --> 00:15:43,140 Mais qu'est-ce qui se passe réellement sous le capot ici? 371 00:15:43,140 --> 00:15:44,670 D'abord nous allons décoller certaines couches. 372 00:15:44,670 --> 00:15:48,380 String est juste un synonyme nous avons réalisé pour quoi? 373 00:15:48,380 --> 00:15:49,110 Étoiles Char. 374 00:15:49,110 --> 00:15:52,740 Donc, nous allons faire un peu plus obscur mais techniquement plus correct que ce 375 00:15:52,740 --> 00:15:55,570 est une étoile carbonisation, ce qui signifie que nom, oui, est une variable. 376 00:15:55,570 --> 00:15:59,920 Mais ce que les magasins de nom est l'adresse de un char, qui se sent un peu étrange 377 00:15:59,920 --> 00:16:01,050 parce que je suis en train de retourner une chaîne. 378 00:16:01,050 --> 00:16:03,580 Je suis en train de revenir multiple chars pas un chevalier. 379 00:16:03,580 --> 00:16:07,400 >> Mais bien sûr, vous n'avez besoin que du premier L'adresse de chevalier de se rappeler où l' 380 00:16:07,400 --> 00:16:08,870 chaîne entière est parce que pourquoi? 381 00:16:08,870 --> 00:16:12,700 Comment déterminez-vous où la fin de la chaîne est de savoir le début? 382 00:16:12,700 --> 00:16:13,630 Le zéro de barre oblique inverse. 383 00:16:13,630 --> 00:16:17,260 Donc, avec ces deux indices que vous avez compris avant le début et la fin de l' 384 00:16:17,260 --> 00:16:20,280 toute chaîne sont, tant qu'ils sont correctement formé avec qui null 385 00:16:20,280 --> 00:16:22,110 terminateur, que nul barre oblique inverse. 386 00:16:22,110 --> 00:16:24,520 >> Mais cela appelle GetString. 387 00:16:24,520 --> 00:16:28,020 Et il s'avère que GetString tout ce temps a été un peu 388 00:16:28,020 --> 00:16:28,820 tricher pour nous. 389 00:16:28,820 --> 00:16:32,460 Il a été fait ce travail, pour être sûr, obtenir une chaîne de caractères à partir de l'utilisateur. 390 00:16:32,460 --> 00:16:34,580 Mais où est cette mémoire été en venir? 391 00:16:34,580 --> 00:16:38,440 Si nous revenons à l'image ici et appliquer la définition d'un juste 392 00:16:38,440 --> 00:16:42,610 il ya moment, que la pile est l'endroit où mémoire va quand les fonctions sont appelées, 393 00:16:42,610 --> 00:16:45,370 Selon cette logique, lorsque vous appelez GetString, et puis je tape dans 394 00:16:45,370 --> 00:16:50,900 D-A-V-I-D Entrée, où est D-A-V-I-D oblique zéro stocké, sur la base de l' 395 00:16:50,900 --> 00:16:53,480 histoire que nous nous avons dit jusqu'ici? 396 00:16:53,480 --> 00:16:55,190 >> Il semble être en la pile, non? 397 00:16:55,190 --> 00:16:58,120 Lorsque vous appelez obtenir chaîne que vous obtenez un petit coin de mémoire sur la pile. 398 00:16:58,120 --> 00:17:01,630 Donc, il va de soi que D-A-V-I-D backslash zéro est stockée 399 00:17:01,630 --> 00:17:02,770 y dans la pile. 400 00:17:02,770 --> 00:17:07,680 Mais attendez une minute, getString retours cette chaîne, pour ainsi dire, ce qui signifie 401 00:17:07,680 --> 00:17:11,700 c'est le plateau de la cafétéria est retiré de la pile. 402 00:17:11,700 --> 00:17:14,560 Et nous avons dit la dernière fois que dès qu'un retour de la fonction, et que vous prenez 403 00:17:14,560 --> 00:17:20,109 plateau, pour ainsi dire, de la pile, ce qui pouvez-vous prendre sur les restes d' 404 00:17:20,109 --> 00:17:21,819 que la mémoire? 405 00:17:21,819 --> 00:17:25,160 J'ai en quelque sorte leur redessiné comme des points d'interrogation car ils deviennent effectivement 406 00:17:25,160 --> 00:17:26,250 des valeurs inconnues. 407 00:17:26,250 --> 00:17:29,500 Ils peuvent être réutilisés lors de certains fonction suivante est appelée. 408 00:17:29,500 --> 00:17:31,870 >> En d'autres termes, si nous nous trouvons à stocker - 409 00:17:31,870 --> 00:17:34,350 Je vais faire un dessin rapide ici de la pile. 410 00:17:34,350 --> 00:17:38,690 S'il nous arrive d'être dessiner le fond de mon segment de mémoire, et nous dirons 411 00:17:38,690 --> 00:17:42,230 que c'est le lieu de mémoire occupé par principale et peut-être arg c et 412 00:17:42,230 --> 00:17:46,790 arg v et rien d'autre dans le programme, lorsque GetString est appelé, 413 00:17:46,790 --> 00:17:51,120 vraisemblablement GetString obtient un morceau de mémoire ici. 414 00:17:51,120 --> 00:17:53,940 Et puis D-A-V-I-D en quelque sorte se retrouve dans cette fonction. 415 00:17:53,940 --> 00:17:55,320 Et je vais simplifier. 416 00:17:55,320 --> 00:18:00,050 Mais supposons que le D-A-V-I-D backslash zéro. 417 00:18:00,050 --> 00:18:03,500 Donc, ce nombre d'octets sont utilisés dans le cadre de GetString. 418 00:18:03,500 --> 00:18:08,270 >> Mais dès le retour getString, nous dit la dernière fois que cette mémoire sur 419 00:18:08,270 --> 00:18:11,340 ici tout devient - woops! - 420 00:18:11,340 --> 00:18:14,270 tout devient effectivement effacées. 421 00:18:14,270 --> 00:18:17,220 Et nous pouvons penser à cela maintenant comme question marques, car qui sait 422 00:18:17,220 --> 00:18:18,720 ce qui va devenir de cette mémoire. 423 00:18:18,720 --> 00:18:22,130 En effet, je l'appelle très souvent des fonctions autre que GetString. 424 00:18:22,130 --> 00:18:24,750 Et dès que je l'appelle un autre fonction de GetString, peut-être pas en 425 00:18:24,750 --> 00:18:28,860 ce programme nous avons juste regardé mais à une autre, sûrement un autre 426 00:18:28,860 --> 00:18:34,180 fonction pourrait finir par être donné cette prochaine place dans la pile. 427 00:18:34,180 --> 00:18:39,410 >> Donc, il ne peut pas être que les magasins getString D-A-V-I-D sur la pile parce que je 428 00:18:39,410 --> 00:18:41,040 perdre immédiatement accès. 429 00:18:41,040 --> 00:18:43,720 Mais nous savons qu'ils getString ne retourne quoi? 430 00:18:43,720 --> 00:18:47,220 Il ne s'agit pas de revenir à moi six caractères. 431 00:18:47,220 --> 00:18:51,090 Qu'est-ce que cela revient vraiment ne nous concluons dernière fois? 432 00:18:51,090 --> 00:18:52,480 L'adresse de la première. 433 00:18:52,480 --> 00:18:56,650 Donc, d'une certaine manière, lorsque vous avez appelé GetString, c'est allouer un bloc de mémoire pour 434 00:18:56,650 --> 00:18:59,620 la chaîne de caractères que le type et les utilisateurs adresse puis retour de celui-ci. 435 00:18:59,620 --> 00:19:02,930 Et il s'avère que lorsque vous voulez fonctionner pour allouer de la mémoire dans ce 436 00:19:02,930 --> 00:19:08,390 chemin et revenir à la personne qui a appelé cette fonction, l'adresse de l' 437 00:19:08,390 --> 00:19:11,870 ce morceau de mémoire, vous devez absolument peut pas le mettre dans la pile à l' 438 00:19:11,870 --> 00:19:14,750 bas, parce que fonctionnellement c'est juste va pas devenir la vôtre très 439 00:19:14,750 --> 00:19:17,800 rapidement, de sorte que vous pouvez probablement le deviner où nous allons probablement le jeter 440 00:19:17,800 --> 00:19:20,130 à la place, la soi-disant tas. 441 00:19:20,130 --> 00:19:25,290 >> Donc, entre le fond de votre mémoire de mise en page et le dessus de votre mémoire de 442 00:19:25,290 --> 00:19:26,820 disposition sont tout un tas de segments. 443 00:19:26,820 --> 00:19:29,270 La première est la pile, et droit ci-dessus, il est le segment de mémoire. 444 00:19:29,270 --> 00:19:33,680 Et le tas est juste un autre morceau de mémoire qui n'est pas utilisé pour des fonctions 445 00:19:33,680 --> 00:19:34,770 quand ils sont appelés. 446 00:19:34,770 --> 00:19:38,100 Il est utilisé pour la mémoire à long terme, lorsque vous voulez une fonction pour saisir certains 447 00:19:38,100 --> 00:19:42,700 mémoire et être capable de s'accrocher à elle sans perdre le contrôle. 448 00:19:42,700 --> 00:19:45,550 >> Maintenant, vous pourriez peut-être immédiatement voir que ce n'est pas 449 00:19:45,550 --> 00:19:48,060 nécessairement un design parfait. 450 00:19:48,060 --> 00:19:51,350 Comme votre programme alloue de la mémoire sur la pile, ou comme vous l'appelez plus et 451 00:19:51,350 --> 00:19:55,540 plus de fonctions, ou que vous allouez mémoire sur le tas avec malloc off comme 452 00:19:55,540 --> 00:20:00,690 GetString fait, ce qui clairement semble être inévitable problème? 453 00:20:00,690 --> 00:20:00,860 >> Droit. 454 00:20:00,860 --> 00:20:03,150 Comme le fait que ces flèches sont dirigés les uns les autres 455 00:20:03,150 --> 00:20:04,380 n'augure rien de bon. 456 00:20:04,380 --> 00:20:08,630 Et en effet, nous pourrions très rapidement planter un programme dans un certain nombre de façons. 457 00:20:08,630 --> 00:20:12,050 En fait, je pense que nous pourrions avoir fait cette fois accidentellement. 458 00:20:12,050 --> 00:20:14,020 Ou sinon, nous allons le faire délibérément maintenant. 459 00:20:14,020 --> 00:20:21,330 Permettez-moi d'aller de l'avant et j'écris super-rapide un programme appelé dontdothis.c. 460 00:20:21,330 --> 00:20:26,730 Et maintenant, je vais ici et ne forte comprennent stdio.h. 461 00:20:26,730 --> 00:20:32,620 Disons déclarer fonction foo prend aucun argument, ce qui est 462 00:20:32,620 --> 00:20:34,040 notée aussi bien par vide. 463 00:20:34,040 --> 00:20:37,830 >> Et la seule chose foo va faire est appel foo, ce qui n'est probablement pas le 464 00:20:37,830 --> 00:20:39,100 plus intelligent idée, mais tant pis. 465 00:20:39,100 --> 00:20:40,490 Ent void main. 466 00:20:40,490 --> 00:20:45,270 Maintenant, la seule chose principale va à faire est d'appeler foo ainsi. 467 00:20:45,270 --> 00:20:51,050 Et juste pour le plaisir, je vais aller avance ici et dire printf "Bonjour de 468 00:20:51,050 --> 00:20:52,340 foo ". 469 00:20:52,340 --> 00:20:52,890 >> OK. 470 00:20:52,890 --> 00:21:00,160 Donc, si je n'ai pas fait d'erreurs, Faire dontdothis point slash. 471 00:21:00,160 --> 00:21:01,960 Et faisons-le dans une plus grande fenêtre - 472 00:21:01,960 --> 00:21:03,210 dot slash, dontdothis. 473 00:21:03,210 --> 00:21:07,590 474 00:21:07,590 --> 00:21:08,840 Allez. 475 00:21:08,840 --> 00:21:10,940 476 00:21:10,940 --> 00:21:11,890 Uh oh. 477 00:21:11,890 --> 00:21:13,100 Apparemment, vous pouvez le faire. 478 00:21:13,100 --> 00:21:15,190 Merde. 479 00:21:15,190 --> 00:21:16,190 OK. 480 00:21:16,190 --> 00:21:16,580 Attendez. 481 00:21:16,580 --> 00:21:17,370 Stand by. 482 00:21:17,370 --> 00:21:18,270 Avons-nous - 483 00:21:18,270 --> 00:21:20,110 Nous n'avons utilisons avec Make. 484 00:21:20,110 --> 00:21:22,050 >> [Soupirs] 485 00:21:22,050 --> 00:21:25,110 >> Je sais, mais je pense que nous juste supprimé cela. 486 00:21:25,110 --> 00:21:28,410 Euh, ouais. 487 00:21:28,410 --> 00:21:30,660 Merde. 488 00:21:30,660 --> 00:21:32,640 Résolvez cette Rob. 489 00:21:32,640 --> 00:21:34,678 Quoi? 490 00:21:34,678 --> 00:21:35,928 C'est très simple. 491 00:21:35,928 --> 00:21:43,820 492 00:21:43,820 --> 00:21:47,360 Oui, nous nous sommes tournés optimisation off. 493 00:21:47,360 --> 00:21:48,970 OK, stand bye. 494 00:21:48,970 --> 00:21:49,950 Maintenant je me sens mieux. 495 00:21:49,950 --> 00:21:51,390 OK. 496 00:21:51,390 --> 00:21:51,780 Très bien. 497 00:21:51,780 --> 00:21:53,430 >> Donc, nous allons recompiler - 498 00:21:53,430 --> 00:21:55,880 Assurez-vous dontdothis. 499 00:21:55,880 --> 00:22:00,090 Vous pourriez avoir à renommer ce à dothis.c dans un instant. 500 00:22:00,090 --> 00:22:00,710 Nous y voilà. 501 00:22:00,710 --> 00:22:01,240 Je vous remercie. 502 00:22:01,240 --> 00:22:02,050 OK. 503 00:22:02,050 --> 00:22:05,480 Donc, le fait que j'imprimais quelque chose a été fait juste 504 00:22:05,480 --> 00:22:08,150 ralentissant le processus par lequel nous aurait atteint ce point. 505 00:22:08,150 --> 00:22:08,510 OK. 506 00:22:08,510 --> 00:22:08,870 Ouf! 507 00:22:08,870 --> 00:22:11,180 >> Alors qu'est-ce qui se passe réellement? 508 00:22:11,180 --> 00:22:14,440 La raison pour laquelle, soit dit en passant, est faire quoi que ce soit en termes d'entrée et 509 00:22:14,440 --> 00:22:17,270 la production tend à être plus lent parce que vous avoir à écrire des caractères à l' 510 00:22:17,270 --> 00:22:18,600 écran, il doit défiler. 511 00:22:18,600 --> 00:22:21,720 Tant histoire courte, je n'avais en fait arrivé si impatient, nous aurions 512 00:22:21,720 --> 00:22:23,260 vu ce résultat final aussi. 513 00:22:23,260 --> 00:22:26,220 Maintenant que je me suis conduite de l'impression-ups, on voit tout de suite. 514 00:22:26,220 --> 00:22:28,410 Alors pourquoi est-ce qui se passe. 515 00:22:28,410 --> 00:22:31,300 Eh bien, l'explication est simple, bien sûr, est que foo ne devrait probablement pas 516 00:22:31,300 --> 00:22:32,500 être lui-même appel. 517 00:22:32,500 --> 00:22:34,470 >> Maintenant, en termes généraux, c'est récursion. 518 00:22:34,470 --> 00:22:36,970 Et nous avons pensé quelques semaines Il ya récursive est bon. 519 00:22:36,970 --> 00:22:40,330 La récursivité est cette façon magique d' vous exprimer superbe succinctement. 520 00:22:40,330 --> 00:22:41,400 Et ça marche. 521 00:22:41,400 --> 00:22:45,060 Mais il est un élément clé de l'ensemble des les programmes récursifs dont nous avons parlé 522 00:22:45,060 --> 00:22:48,260 et regardant à ce jour, qui était qu'ils avaient quoi? 523 00:22:48,260 --> 00:22:52,610 Un scénario de base, ce qui était quelque codé en dur cas où ledit, dans certaines situations 524 00:22:52,610 --> 00:22:56,210 ne pas appeler foo, ce qui est clairement pas le cas ici. 525 00:22:56,210 --> 00:22:58,920 >> Alors qu'est-ce qui se passe réellement en termes de cette image? 526 00:22:58,920 --> 00:23:01,790 Eh bien, quand principal appelle foo, il obtient une tranche de mémoire. 527 00:23:01,790 --> 00:23:04,150 Quand foo foo appelle, il devient une tranche de mémoire. 528 00:23:04,150 --> 00:23:06,430 Quand foo foo appelle, il obtient une tranche. 529 00:23:06,430 --> 00:23:07,080 Il obtient une tranche. 530 00:23:07,080 --> 00:23:08,120 Il obtient une tranche. 531 00:23:08,120 --> 00:23:09,460 Parce que foo n'est jamais revenir. 532 00:23:09,460 --> 00:23:12,160 Nous ne sommes jamais effacer l'un de ceux cadres de la pile. 533 00:23:12,160 --> 00:23:15,930 Nous sommes donc souffler dans le tas, pas parler qui sait quoi d'autre, et 534 00:23:15,930 --> 00:23:19,600 nous outrepasser les limites de notre dits segments de mémoire. 535 00:23:19,600 --> 00:23:21,790 Erreur aller segmentation faux. 536 00:23:21,790 --> 00:23:24,110 >> Donc, la solution existe clairement ne pas le faire. 537 00:23:24,110 --> 00:23:28,830 Mais la plus grande implication est que, oui, il est absolument certaine limite, 538 00:23:28,830 --> 00:23:32,470 même si elle n'est pas bien défini, quant à la façon de nombreuses fonctions que vous pouvez appeler dans un 539 00:23:32,470 --> 00:23:34,970 programme, combien de fois une fonction peut s'appeler. 540 00:23:34,970 --> 00:23:38,430 Ainsi, même si nous avons fait prêcher la récursivité que cette chose magique potentiellement une 541 00:23:38,430 --> 00:23:41,870 Il ya quelques semaines pour le sigma fonction, et quand nous obtenons les données 542 00:23:41,870 --> 00:23:45,270 structures et CS50, vous verrez d'autres applications pour elle, ce n'est pas 543 00:23:45,270 --> 00:23:46,500 nécessairement la meilleure chose. 544 00:23:46,500 --> 00:23:50,070 Parce que si une fonction s'appelle elle-même, appelle lui-même, même s'il ya une base 545 00:23:50,070 --> 00:23:54,860 cas, si vous ne frappez pas ce cas de base pour 1000 appels ou 10.000 appels, par 546 00:23:54,860 --> 00:23:58,800 ce moment-là que vous pourriez avoir plus de place sur votre soi-disant pile et appuyez 547 00:23:58,800 --> 00:24:00,400 d'autres segments de la mémoire. 548 00:24:00,400 --> 00:24:03,950 Il est donc trop une conception compromis entre élégance et entre 549 00:24:03,950 --> 00:24:06,920 la robustesse de votre particulier mise en oeuvre. 550 00:24:06,920 --> 00:24:10,780 >> Donc, il ya un autre inconvénient ou autre gotcha à ce que nous avons 551 00:24:10,780 --> 00:24:11,720 fait jusqu'ici. 552 00:24:11,720 --> 00:24:12,980 Quand j'ai appelé GetString - 553 00:24:12,980 --> 00:24:15,120 Permettez-moi de revenir en bonjour-2. 554 00:24:15,120 --> 00:24:18,170 Remarquez que je vais appeler GetString, qui est de retour d'une adresse. 555 00:24:18,170 --> 00:24:20,730 Et nous revendiquons aujourd'hui cette adresse c'est à partir du tas. 556 00:24:20,730 --> 00:24:24,480 Et maintenant, je suis imprimant la chaîne à cette adresse. 557 00:24:24,480 --> 00:24:27,000 Mais nous n'avons jamais appelé l' opposé de GetString. 558 00:24:27,000 --> 00:24:30,850 Nous n'avons jamais eu à Calll une fonction comme ungetstring, où vous la main arrière 559 00:24:30,850 --> 00:24:31,610 cette mémoire. 560 00:24:31,610 --> 00:24:33,250 Mais franchement nous avons probablement aurait dû être. 561 00:24:33,250 --> 00:24:37,390 Parce que si nous continuons à demander à l'ordinateur pour la mémoire, par l'intermédiaire d'une personne comme 562 00:24:37,390 --> 00:24:40,830 GetString mais jamais lui redonner, sûrement cela aussi est lié à conduire à 563 00:24:40,830 --> 00:24:42,970 problèmes qui nous manquer de mémoire. 564 00:24:42,970 --> 00:24:46,140 >> Et en fait, nous pouvons regarder pour ces problèmes avec le nouvel outil dont l'usage 565 00:24:46,140 --> 00:24:47,640 est un peu cryptique à taper. 566 00:24:47,640 --> 00:24:50,960 Mais permettez-moi d'aller de l'avant et les éclaboussures vers le haut sur l'écran dans un instant. 567 00:24:50,960 --> 00:24:56,940 Je vais aller de l'avant et d'exécuter Valgrind avec paramètre dont la première commande 568 00:24:56,940 --> 00:25:00,260 argument de la ligne est le nom de ce programme bonjour-2. 569 00:25:00,260 --> 00:25:02,650 Et malheureusement c'est sortie est atrocement 570 00:25:02,650 --> 00:25:04,290 complexe pour aucune bonne raison. 571 00:25:04,290 --> 00:25:06,280 Ainsi, nous voyons tout ce désordre. 572 00:25:06,280 --> 00:25:07,530 David est l'état mon nom. 573 00:25:07,530 --> 00:25:09,760 C'est donc le programme effectivement en cours d'exécution. 574 00:25:09,760 --> 00:25:11,180 Et maintenant, nous obtenons cette sortie. 575 00:25:11,180 --> 00:25:13,400 >> Alors Valgrind est similaire dans l'esprit de GDB. 576 00:25:13,400 --> 00:25:14,950 Ce n'est pas un débogueur en soi. 577 00:25:14,950 --> 00:25:16,270 Mais c'est un contrôleur de mémoire. 578 00:25:16,270 --> 00:25:20,140 C'est un programme qui se déroulera votre programmer et vous dire si vous demandiez à un 579 00:25:20,140 --> 00:25:23,860 ordinateur pour la mémoire et jamais remis cela arrière, ce qui signifie que vous avez 580 00:25:23,860 --> 00:25:24,570 une fuite de mémoire. 581 00:25:24,570 --> 00:25:26,240 Et les fuites de mémoire ont tendance à être mauvais. 582 00:25:26,240 --> 00:25:29,120 Et vous, c'est aux utilisateurs d'ordinateurs ont probablement ressenti cela, si vous avez un 583 00:25:29,120 --> 00:25:30,300 Mac ou un PC. 584 00:25:30,300 --> 00:25:33,730 Avez-vous déjà utilisé votre ordinateur pendant tout et pas redémarré dans plusieurs 585 00:25:33,730 --> 00:25:36,820 jours, ou si vous avez juste beaucoup de programmes en cours, et ce satané 586 00:25:36,820 --> 00:25:42,360 ralentit à une halte de meulage, ou tout au moins c'est super ennuyeux à utiliser, parce que 587 00:25:42,360 --> 00:25:44,350 tout juste obtenu super lent. 588 00:25:44,350 --> 00:25:46,260 >> Maintenant, cela peut être n'importe quel nombre de raisons. 589 00:25:46,260 --> 00:25:49,600 Il pourrait s'agir d'une boucle infinie, un bug dans le code de quelqu'un, ou, plus simplement, il 590 00:25:49,600 --> 00:25:53,250 pourrait signifier que vous utilisez plus mémoire, ou d'essayer d', que votre 591 00:25:53,250 --> 00:25:54,920 ordinateur dispose effectivement. 592 00:25:54,920 --> 00:25:57,770 Et peut-être il ya un bug dans certains programmes qui continuent à demander pour la mémoire. 593 00:25:57,770 --> 00:26:02,480 Navigateurs pour les années étaient connus pour ce, demandant de plus en plus de mémoire 594 00:26:02,480 --> 00:26:03,870 mais jamais le remettre. 595 00:26:03,870 --> 00:26:07,220 Assurément, si vous avez seulement un nombre fini quantité de mémoire, vous ne pouvez pas demander 596 00:26:07,220 --> 00:26:09,990 un nombre infini de fois pour une partie de cette mémoire. 597 00:26:09,990 --> 00:26:13,070 >> Et ce que vous voyez ici, même si à nouveau la sortie de Valgrind est 598 00:26:13,070 --> 00:26:17,490 inutilement complexe pour jeter un regard sur Tout d'abord, c'est la partie intéressante. 599 00:26:17,490 --> 00:26:18,890 Heap - 600 00:26:18,890 --> 00:26:20,060 en cours d'utilisation, à la sortie. 601 00:26:20,060 --> 00:26:22,810 Alors, voici la quantité de mémoire est en cours d'utilisation dans le tas à l' 602 00:26:22,810 --> 00:26:24,300 fois que mon programme est sorti - 603 00:26:24,300 --> 00:26:27,280 apparemment six octets dans un bloc. 604 00:26:27,280 --> 00:26:28,710 Donc, je vais saluer mes mains ce qui est un bloc. 605 00:26:28,710 --> 00:26:31,270 Pensez que c'est juste un morceau, un plus mot technique pour morceau. 606 00:26:31,270 --> 00:26:33,140 Mais six octets - 607 00:26:33,140 --> 00:26:36,870 ce sont les six octets étaient encore en cours d'utilisation? 608 00:26:36,870 --> 00:26:37,390 >> Exactement. 609 00:26:37,390 --> 00:26:41,520 D-A-V-I-D barre oblique inverse zéro, cinq lettre nom ainsi que la terminaison nulle. 610 00:26:41,520 --> 00:26:46,350 Donc, ce programme Valgrind remarqué que je demandé six octets, apparemment, par 611 00:26:46,350 --> 00:26:48,950 façon de GetString, mais jamais leur a donné dos. 612 00:26:48,950 --> 00:26:52,030 Et en fait, ce ne serait pas si évident si mon programme n'est pas trois 613 00:26:52,030 --> 00:26:53,590 lignes, mais c'est 300 lignes. 614 00:26:53,590 --> 00:26:56,920 Nous pouvons donc donner une autre commande argument de la ligne de Valgrind pour 615 00:26:56,920 --> 00:26:58,290 rendre plus verbeux. 616 00:26:58,290 --> 00:26:59,760 C'est un peu gênant de se souvenir. 617 00:26:59,760 --> 00:27:01,580 Mais si je le fais - 618 00:27:01,580 --> 00:27:01,930 Voyons voir. 619 00:27:01,930 --> 00:27:03,540 Fuite - 620 00:27:03,540 --> 00:27:05,030 Était-ce une fuite - 621 00:27:05,030 --> 00:27:07,580 même si je ne me souviens pas Ainsi, il est hors main. 622 00:27:07,580 --> 00:27:08,550 >> - Fuite chèque équivaut à plein. 623 00:27:08,550 --> 00:27:10,180 Yep, merci. 624 00:27:10,180 --> 00:27:12,520 - Fuite chèque équivaut à plein. 625 00:27:12,520 --> 00:27:13,800 Entrée. 626 00:27:13,800 --> 00:27:14,940 Même programme est en cours d'exécution. 627 00:27:14,940 --> 00:27:16,180 Tapez David à nouveau. 628 00:27:16,180 --> 00:27:17,660 Maintenant, je vois un peu plus en détail. 629 00:27:17,660 --> 00:27:20,890 Mais au-dessous le résumé du tas, ce qui est identique à quatre - ah, 630 00:27:20,890 --> 00:27:22,120 c'est plutôt agréable. 631 00:27:22,120 --> 00:27:25,460 Maintenant Valgrind est actuellement à la recherche un peu plus difficile dans mon code. 632 00:27:25,460 --> 00:27:29,580 Et il est dit que, apparemment, malloc à la ligne - 633 00:27:29,580 --> 00:27:30,580 nous agrandir. 634 00:27:30,580 --> 00:27:31,980 À la ligne - 635 00:27:31,980 --> 00:27:32,930 nous ne voyons pas quelle ligne il s'agit. 636 00:27:32,930 --> 00:27:35,110 Mais malloc est le premier coupable. 637 00:27:35,110 --> 00:27:38,630 Il ya un blog dans malloc. 638 00:27:38,630 --> 00:27:39,810 >> Tout va bien? 639 00:27:39,810 --> 00:27:40,450 OK, no. 640 00:27:40,450 --> 00:27:40,940 Droite? 641 00:27:40,940 --> 00:27:42,520 J'ai appelé getString. 642 00:27:42,520 --> 00:27:44,460 GetString appelle apparemment malloc. 643 00:27:44,460 --> 00:27:47,800 Alors, quelle ligne de code est apparemment à défaut d'avoir 644 00:27:47,800 --> 00:27:49,050 attribué cette mémoire? 645 00:27:49,050 --> 00:27:51,560 646 00:27:51,560 --> 00:27:55,540 Supposons que celui qui a écrit malloc a été assez longtemps qu'il est 647 00:27:55,540 --> 00:27:56,390 pas de leur faute. 648 00:27:56,390 --> 00:27:57,520 Donc, c'est probablement la mienne. 649 00:27:57,520 --> 00:28:02,000 getString dans cs50.c - de sorte que c'est une déposer quelque part sur l'ordinateur - 650 00:28:02,000 --> 00:28:05,210 en ligne 286 semble être le coupable. 651 00:28:05,210 --> 00:28:08,140 Maintenant, supposons que CS50 a été autour de quantité décente de temps, de sorte 652 00:28:08,140 --> 00:28:09,720 nous aussi nous sommes infaillibles. 653 00:28:09,720 --> 00:28:14,080 Et ce n'est probablement pas dans getString que le bug se trouve, mais plutôt dans 654 00:28:14,080 --> 00:28:17,810 bonjour line-2.c 18. 655 00:28:17,810 --> 00:28:20,670 >> Donc, nous allons jeter un coup d'œil à ce que la ligne 18 était. 656 00:28:20,670 --> 00:28:21,130 Oh. 657 00:28:21,130 --> 00:28:27,130 D'une certaine manière cette ligne n'est pas nécessairement buggy en soi, mais c'est la raison 658 00:28:27,130 --> 00:28:28,630 derrière cette fuite de mémoire. 659 00:28:28,630 --> 00:28:32,140 Si super simple, ce serait intuitivement être la solution ici? 660 00:28:32,140 --> 00:28:34,710 Si nous demandons mémoire, n'ont jamais été lui redonner, et cela semble être un 661 00:28:34,710 --> 00:28:37,940 problème, car au fil du temps mon ordinateur pourrait manquer de mémoire, pourrait ralentir 662 00:28:37,940 --> 00:28:42,110 vers le bas, de mauvaises choses peuvent arriver, eh bien, quelle est la solution simple et intuitive? 663 00:28:42,110 --> 00:28:43,140 Il suffit de lui redonner. 664 00:28:43,140 --> 00:28:44,770 >> Comment pouvez-vous libérer de la mémoire? 665 00:28:44,770 --> 00:28:49,970 Eh bien, heureusement, c'est très simple de dire simplement le nom gratuite. 666 00:28:49,970 --> 00:28:51,260 Et nous n'avons jamais fait cela auparavant. 667 00:28:51,260 --> 00:28:55,890 Mais vous pouvez penser essentiellement de libre comme l'opposé de malloc. 668 00:28:55,890 --> 00:28:58,030 libre est à l'opposé de allouer de la mémoire. 669 00:28:58,030 --> 00:28:59,540 Alors maintenant, permettez-moi de recompiler. 670 00:28:59,540 --> 00:29:02,050 Assurez-bonjour-2. 671 00:29:02,050 --> 00:29:04,620 Permettez-moi de le relancer. bonjour-2 David. 672 00:29:04,620 --> 00:29:07,290 Donc, il semble fonctionner dans exactement de la même façon. 673 00:29:07,290 --> 00:29:11,180 Mais si je reviens à Valgrind et relancez que même commande sur mon nouveau 674 00:29:11,180 --> 00:29:14,720 programme compilé, le typage en mon nom comme avant - 675 00:29:14,720 --> 00:29:15,370 Nice. 676 00:29:15,370 --> 00:29:16,760 Résumé Heap - 677 00:29:16,760 --> 00:29:17,740 en usage à la sortie - 678 00:29:17,740 --> 00:29:19,370 zéro octets dans les blocs zéro. 679 00:29:19,370 --> 00:29:21,840 Et c'est super sympa, tout blocs de tas ont été libérés. 680 00:29:21,840 --> 00:29:23,480 Pas de fuites sont possibles. 681 00:29:23,480 --> 00:29:27,200 >> Donc à venir, pas avec l'ensemble du problème 4, mais avec l'ensemble du problème 5, la médecine légale 682 00:29:27,200 --> 00:29:30,740 et au-delà, cela aussi va devenir un mesure de la justesse de votre 683 00:29:30,740 --> 00:29:33,630 programme, si vous avez ou non ou qui n'ont pas de fuites de mémoire. 684 00:29:33,630 --> 00:29:36,900 Mais heureusement, vous pouvez non seulement raisonner à travers eux de manière intuitive, qui 685 00:29:36,900 --> 00:29:40,430 est, sans doute, facile pour les petits programmes mais plus difficile pour les grands programmes, 686 00:29:40,430 --> 00:29:43,860 Valgrind, pour les grands programmes, peut vous aider à identifier 687 00:29:43,860 --> 00:29:45,360 le problème particulier. 688 00:29:45,360 --> 00:29:47,500 >> Mais il ya un autre problème qui pourraient survenir. 689 00:29:47,500 --> 00:29:51,245 Permettez-moi d'ouvrir ce fichier ici, qui est, encore une fois, un exemple un peu simple. 690 00:29:51,245 --> 00:29:53,760 Mais concentrons-nous sur ce que ce programme fait. 691 00:29:53,760 --> 00:29:55,190 C'est ce qu'on appelle memory.c. 692 00:29:55,190 --> 00:29:58,380 Nous publierons plus tard aujourd'hui dans la zip du code source d'aujourd'hui. 693 00:29:58,380 --> 00:30:01,610 Et remarquez que j'ai une fonction appelée f qui ne prend aucun argument et 694 00:30:01,610 --> 00:30:02,800 retourne rien. 695 00:30:02,800 --> 00:30:07,240 Dans la ligne 20, je suis apparemment déclarant une pointeur vers un int et de l'appeler x. 696 00:30:07,240 --> 00:30:09,570 Je attribution est le retour valeur de malloc. 697 00:30:09,570 --> 00:30:14,590 Et juste pour être clair, combien d'octets h Je obtenir probablement de retour de malloc 698 00:30:14,590 --> 00:30:17,080 dans cette situation? 699 00:30:17,080 --> 00:30:18,040 >> Probablement 40. 700 00:30:18,040 --> 00:30:18,840 Où puisez-vous cette information? 701 00:30:18,840 --> 00:30:22,410 Eh bien, si vous vous souvenez que l'int est souvent 4 octets, au moins il est dans l' 702 00:30:22,410 --> 00:30:25,110 appareil, 10 fois 4 est évidemment 40. 703 00:30:25,110 --> 00:30:28,920 Alors malloc retourne l'adresse d' un bloc de mémoire et à stocker que 704 00:30:28,920 --> 00:30:30,800 répondre finalement à x. 705 00:30:30,800 --> 00:30:32,570 Donc, pour être clair, ce qui puis qui se passe? 706 00:30:32,570 --> 00:30:34,990 Eh bien, permettez-moi de revenir à notre image ici. 707 00:30:34,990 --> 00:30:38,150 Permettez-moi de ne pas simplement attirer le fond de mon la mémoire de l'ordinateur, laissez-moi aller de l'avant et 708 00:30:38,150 --> 00:30:42,990 tirer l'ensemble du rectangle que représente l'ensemble de ma RAM. 709 00:30:42,990 --> 00:30:44,790 >> Nous dirons que la pile est sur le fond. 710 00:30:44,790 --> 00:30:47,010 Et il ya un segment de texte dans les données non initialisées. 711 00:30:47,010 --> 00:30:49,880 Mais je vais juste ceux abstrait d'autres choses à l'extérieur comme dot, dot dot. 712 00:30:49,880 --> 00:30:53,470 Je vais faire référence à ce que le segment de mémoire dans la partie supérieure. 713 00:30:53,470 --> 00:30:57,070 Et puis, au fond de cette image, pour représenter principal, je vais 714 00:30:57,070 --> 00:30:59,880 de lui donner une mémoire de tranches sur la pile. 715 00:30:59,880 --> 00:31:03,150 Pour f, je vais lui donner une tranche de la mémoire dans la pile. 716 00:31:03,150 --> 00:31:05,140 Maintenant, je dois consulter mon le code source à nouveau. 717 00:31:05,140 --> 00:31:07,170 Quelles sont les variables locales pour principal? 718 00:31:07,170 --> 00:31:10,710 Apparemment rien, si cette tranche est effectivement vide ou même pas aussi grand 719 00:31:10,710 --> 00:31:11,600 comme je l'ai dessiné. 720 00:31:11,600 --> 00:31:15,730 Mais dans f, j'ai une variable locale, qui est appelé x. 721 00:31:15,730 --> 00:31:20,410 Donc, je vais aller de l'avant et donner f un morceau de la mémoire, le qualifiant de x. 722 00:31:20,410 --> 00:31:24,680 >> Et maintenant malloc de 10 fois 4, Alors malloc 40, où est-ce 723 00:31:24,680 --> 00:31:25,430 mémoire vient-il? 724 00:31:25,430 --> 00:31:27,530 Nous n'avons pas fait un dessin comme ça avant. 725 00:31:27,530 --> 00:31:31,140 Mais supposons que c'est effectivement venant ici, donc on, 726 00:31:31,140 --> 00:31:33,170 deux, trois, quatre, cinq. 727 00:31:33,170 --> 00:31:34,680 Et maintenant j'ai besoin de 40 de ces derniers. 728 00:31:34,680 --> 00:31:37,540 Alors je vais juste faire point, point, point de suggérer qu'il ya encore plus de mémoire 729 00:31:37,540 --> 00:31:39,350 revenir dans le tas. 730 00:31:39,350 --> 00:31:40,710 Maintenant ce qui est l'adresse? 731 00:31:40,710 --> 00:31:42,620 Choisissons notre arbitraire traiter comme toujours - 732 00:31:42,620 --> 00:31:46,310 Ox123, même si ça va probablement être quelque chose de complètement différent. 733 00:31:46,310 --> 00:31:50,420 C'est l'adresse du premier octet mémoire que je demande malloc pour. 734 00:31:50,420 --> 00:31:53,630 >> Donc en bref, une fois la ligne 20 exécute, ce qui est littéralement 735 00:31:53,630 --> 00:31:57,170 stocké à l'intérieur de x ici? 736 00:31:57,170 --> 00:31:58,730 Ox123. 737 00:31:58,730 --> 00:32:00,370 Ox123. 738 00:32:00,370 --> 00:32:01,550 Et le bœuf est inintéressant. 739 00:32:01,550 --> 00:32:03,200 Cela signifie simplement voici un nombre hexadécimal. 740 00:32:03,200 --> 00:32:06,490 Mais ce qui est important est que ce que j'ai magasin en x, qui est une variable locale. 741 00:32:06,490 --> 00:32:10,260 Mais son type de données, encore une fois, est une adresse d'un int. 742 00:32:10,260 --> 00:32:12,710 Eh bien, je vais stocker Ox123. 743 00:32:12,710 --> 00:32:16,610 Mais encore une fois, si c'est un peu trop compliqué inutilement, si je fais défiler 744 00:32:16,610 --> 00:32:21,490 en arrière, nous pouvons abstrait cette distance assez raisonnable et juste dire que x est un 745 00:32:21,490 --> 00:32:23,910 pointeur vers ce bloc de mémoire. 746 00:32:23,910 --> 00:32:24,070 >> OK. 747 00:32:24,070 --> 00:32:26,230 Maintenant, la question à portée de main est la suivante - 748 00:32:26,230 --> 00:32:29,910 ligne 21, il s'avère, est bogué. 749 00:32:29,910 --> 00:32:31,160 Pourquoi? 750 00:32:31,160 --> 00:32:34,890 751 00:32:34,890 --> 00:32:36,930 >> Désolé? 752 00:32:36,930 --> 00:32:38,640 Il n'a pas - 753 00:32:38,640 --> 00:32:40,390 dire qu'une fois de plus. 754 00:32:40,390 --> 00:32:41,240 Eh bien, ce n'est pas gratuit. 755 00:32:41,240 --> 00:32:42,350 C'est donc la deuxième mais. 756 00:32:42,350 --> 00:32:45,000 Donc, il ya un autre mais plus particulièrement à la ligne 21. 757 00:32:45,000 --> 00:32:49,480 758 00:32:49,480 --> 00:32:50,040 >> Exactement. 759 00:32:50,040 --> 00:32:54,980 Cette simple ligne de code est juste un buffer overflow, un dépassement de mémoire tampon. 760 00:32:54,980 --> 00:32:57,050 Un tampon signifie simplement un morceau de mémoire. 761 00:32:57,050 --> 00:33:01,520 Mais ce morceau de mémoire est de taille 10, 10 entiers, ce qui signifie, si nous 762 00:33:01,520 --> 00:33:05,350 index dans l'aide du sucre syntaxique de notation de tableau, la place 763 00:33:05,350 --> 00:33:09,220 entre parenthèses, vous avez accès à x support 0 x 1 x support, 764 00:33:09,220 --> 00:33:10,390 Support point, point, point. 765 00:33:10,390 --> 00:33:13,270 x support 9 est le plus grand. 766 00:33:13,270 --> 00:33:17,680 Donc, si je fais x support 10, où Je vais encore en mémoire? 767 00:33:17,680 --> 00:33:19,120 >> Eh bien, si j'ai 10 int - 768 00:33:19,120 --> 00:33:21,070 nous allons réellement tirer toutes d'entre eux ici. 769 00:33:21,070 --> 00:33:22,700 C'était donc les cinq premiers. 770 00:33:22,700 --> 00:33:24,660 Voici les cinq autres ints. 771 00:33:24,660 --> 00:33:29,580 Donc x support 0 est ici. x support 1 est ici. x support 9 est ici. x support 772 00:33:29,580 --> 00:33:37,960 10 est ici, ce qui signifie que je dis, dans la ligne 21, l'ordinateur de mettre l' 773 00:33:37,960 --> 00:33:39,400 numéro où? 774 00:33:39,400 --> 00:33:42,010 Le numéro 0 où? 775 00:33:42,010 --> 00:33:43,380 Eh bien, c'est 0, oui. 776 00:33:43,380 --> 00:33:45,460 Mais juste le fait que son 0 est une sorte de coïncidence. 777 00:33:45,460 --> 00:33:47,140 Il pourrait être le nombre 50, pour tous nous nous soucions. 778 00:33:47,140 --> 00:33:50,480 Mais nous essayons de mettre au point x support 10, qui est où cette 779 00:33:50,480 --> 00:33:53,700 interrogation est tiré, qui n'est pas une bonne chose. 780 00:33:53,700 --> 00:33:57,070 Ce programme pourrait très bien planter en conséquence. 781 00:33:57,070 --> 00:33:59,400 >> Maintenant, nous allons aller de l'avant et voir si cela est, en effet, ce qui se passe. 782 00:33:59,400 --> 00:34:02,600 Faire mémoire, depuis le fichier est appelé memory.c. 783 00:34:02,600 --> 00:34:05,950 Allons de l'avant et exploités la mémoire de programme. 784 00:34:05,950 --> 00:34:08,239 Nous avons donc eu de la chance, en fait, il semble. 785 00:34:08,239 --> 00:34:09,340 Nous avons eu de la chance. 786 00:34:09,340 --> 00:34:11,060 Mais nous allons voir si nous courons maintenant Valgrind. 787 00:34:11,060 --> 00:34:14,170 À première vue, mon programme pourrait semblent être tout à fait exact. 788 00:34:14,170 --> 00:34:18,010 Mais laissez-moi courir Valgrind avec l' - Fuite chèque équivaut à plein sur la mémoire. 789 00:34:18,010 --> 00:34:20,110 >> Et maintenant, quand je lance cette - 790 00:34:20,110 --> 00:34:21,030 intéressant. 791 00:34:21,030 --> 00:34:26,800 Invalide écrire de taille 4 à la ligne 21 du memory.c. 792 00:34:26,800 --> 00:34:29,284 Ligne 21 de memory.c est lequel? 793 00:34:29,284 --> 00:34:30,340 Oh, intéressant. 794 00:34:30,340 --> 00:34:31,080 Mais attendez. 795 00:34:31,080 --> 00:34:32,389 Taille 4, quelle est cette référence? 796 00:34:32,389 --> 00:34:34,969 Je n'ai qu'une seule j'écris, mais il est de taille 4. 797 00:34:34,969 --> 00:34:36,889 Pourquoi est-il 4? 798 00:34:36,889 --> 00:34:39,280 C'est parce que c'est un int, ce qui est, là encore, quatre octets. 799 00:34:39,280 --> 00:34:42,510 Alors Valgrind trouvé un bug que j'ai, en regardant mon code, n'est-ce pas. 800 00:34:42,510 --> 00:34:45,040 Et peut-être votre TF seraient ou non. 801 00:34:45,040 --> 00:34:48,469 Qu'est Mais Valgrind pour sûr constaté que nous avons fait une erreur il ya, même 802 00:34:48,469 --> 00:34:52,719 mais nous avons eu de la chance, et l'ordinateur a décidé, hein, je ne vais pas planter 803 00:34:52,719 --> 00:34:57,470 juste parce que vous avez touché un octet, un La valeur de la mémoire de l'int que vous n'avez pas 804 00:34:57,470 --> 00:34:58,550 propre réalité. 805 00:34:58,550 --> 00:35:00,380 >> Eh bien, quoi d'autre est bogué ici. 806 00:35:00,380 --> 00:35:01,180 Adresse - 807 00:35:01,180 --> 00:35:03,190 c'est une adresse regard fou en hexadécimal. 808 00:35:03,190 --> 00:35:06,890 Cela signifie simplement que quelque part dans le tas est zéro octets après un bloc de taille 40 809 00:35:06,890 --> 00:35:07,620 est affecté. 810 00:35:07,620 --> 00:35:10,610 Permettez-moi de faire un zoom arrière ici et voir si c'est un peu plus utile. 811 00:35:10,610 --> 00:35:11,410 Intéressant. 812 00:35:11,410 --> 00:35:15,600 40 octets sont définitivement perdues dans le dossier de la perte de 1 1. 813 00:35:15,600 --> 00:35:17,840 Encore une fois, plus de mots que est utile ici. 814 00:35:17,840 --> 00:35:21,350 Mais sur la base des lignes mises en surbrillance, où dois-je me concentrer probablement mon 815 00:35:21,350 --> 00:35:24,070 attention pour un autre bug? 816 00:35:24,070 --> 00:35:26,570 On dirait une ligne 20 de memory.c. 817 00:35:26,570 --> 00:35:30,990 >> Donc, si nous revenons à la ligne 20, c'est la celui que vous avez identifié plus tôt. 818 00:35:30,990 --> 00:35:33,030 Et ce n'est pas nécessairement buggy. 819 00:35:33,030 --> 00:35:35,160 Mais nous avons cette inversé ses effets. 820 00:35:35,160 --> 00:35:38,790 Alors, comment puis-je corriger au moins l'une de ces erreurs? 821 00:35:38,790 --> 00:35:42,240 Que pouvais-je faire après la ligne 21? 822 00:35:42,240 --> 00:35:47,110 Je pourrais le faire sans x, est donc de redonner cette mémoire. 823 00:35:47,110 --> 00:35:49,230 Et comment puis-je résoudre ce bug? 824 00:35:49,230 --> 00:35:52,120 Je dois absolument aller pas plus loin que 0. 825 00:35:52,120 --> 00:35:53,670 Je vais donc essayer et ré-exécuter cette. 826 00:35:53,670 --> 00:35:56,080 Désolé, certainement aller pas plus loin que 9. 827 00:35:56,080 --> 00:35:57,510 Faire mémoire. 828 00:35:57,510 --> 00:36:00,650 Permettez-moi de RERUN Valgrind dans une fenêtre plus grande. 829 00:36:00,650 --> 00:36:01,580 Et maintenant, regardez. 830 00:36:01,580 --> 00:36:02,250 Nice. 831 00:36:02,250 --> 00:36:03,270 Tous les blocs de tas ont été libérés. 832 00:36:03,270 --> 00:36:04,270 Pas de fuites sont possibles. 833 00:36:04,270 --> 00:36:07,520 Et au-dessus ici, il n'y a aucune mention pas plus de droit valide. 834 00:36:07,520 --> 00:36:09,820 >> Juste pour avoir gourmand, et LET'S voir si une autre démonstration 835 00:36:09,820 --> 00:36:11,050 ne va pas comme prévu - 836 00:36:11,050 --> 00:36:12,560 J'ai eu la chance il ya un instant. 837 00:36:12,560 --> 00:36:15,530 Et le fait que ce n'est peut-être 0 inutilement trompeuse. 838 00:36:15,530 --> 00:36:20,650 Disons simplement faire 50, un peu arbitraire nombre, faire mémoire de points mémoire slash - 839 00:36:20,650 --> 00:36:21,410 toujours avoir de la chance. 840 00:36:21,410 --> 00:36:22,510 Rien n'est s'écraser. 841 00:36:22,510 --> 00:36:26,150 Supposons que je viens de faire quelque chose de vraiment stupide, et je fais 100. 842 00:36:26,150 --> 00:36:30,360 Permettez-moi refais mémoire, dot mémoire slash - 843 00:36:30,360 --> 00:36:31,075 eu de la chance à nouveau. 844 00:36:31,075 --> 00:36:32,800 Que diriez-vous de 1000? 845 00:36:32,800 --> 00:36:35,370 ints au-delà, à peu près, où je devrais être? 846 00:36:35,370 --> 00:36:37,410 Faire mémoire - 847 00:36:37,410 --> 00:36:38,570 bon sang. 848 00:36:38,570 --> 00:36:39,920 >> [Rires] 849 00:36:39,920 --> 00:36:41,270 >> OK. 850 00:36:41,270 --> 00:36:43,920 Disons plaisante pas plus. 851 00:36:43,920 --> 00:36:45,120 Exécutez à nouveau la mémoire. 852 00:36:45,120 --> 00:36:45,840 Nous y voilà. 853 00:36:45,840 --> 00:36:46,410 Très bien. 854 00:36:46,410 --> 00:36:52,500 Donc, apparemment, vous indexez 100.000 ints au-delà où vous auriez dû en 855 00:36:52,500 --> 00:36:54,410 mémoire, de mauvaises choses arrivent. 856 00:36:54,410 --> 00:36:56,430 Donc, ce n'est évidemment pas , une règle dur rapide. 857 00:36:56,430 --> 00:36:58,190 J'étais un peu en utilisant essai et l'erreur d'y arriver. 858 00:36:58,190 --> 00:37:02,230 Mais c'est parce que, longue histoire courte, la mémoire de votre ordinateur est également divisé 859 00:37:02,230 --> 00:37:03,580 dans ces choses appelées segments. 860 00:37:03,580 --> 00:37:07,260 Et parfois, l'ordinateur fait vous a donné un peu plus de mémoire 861 00:37:07,260 --> 00:37:08,400 que vous demandez. 862 00:37:08,400 --> 00:37:12,170 Mais pour l'efficacité, c'est juste plus facile à obtenir plus de mémoire, mais seulement vous dire 863 00:37:12,170 --> 00:37:13,780 que vous obtenez une partie de celui-ci. 864 00:37:13,780 --> 00:37:16,370 >> Et si vous avez de la chance, parfois, Par conséquent, vous pourriez être en mesure de toucher 865 00:37:16,370 --> 00:37:17,795 mémoire qui ne vous appartient pas. 866 00:37:17,795 --> 00:37:21,860 Vous n'avez aucune garantie que la valeur que vous mettez y aura rester là, parce que 867 00:37:21,860 --> 00:37:25,080 l'ordinateur pense toujours que ce n'est pas vôtre, mais ce n'est pas nécessairement aller 868 00:37:25,080 --> 00:37:29,910 pour toucher un autre segment de mémoire de l' ordinateur et d'induire une erreur comme 869 00:37:29,910 --> 00:37:31,710 celui-là. 870 00:37:31,710 --> 00:37:32,060 Très bien. 871 00:37:32,060 --> 00:37:37,240 Vous avez des questions, puis sur la mémoire? 872 00:37:37,240 --> 00:37:37,590 >> Très bien. 873 00:37:37,590 --> 00:37:40,610 Prenons un coup d'oeil ici, puis, à quelque chose que nous avons entreprise depuis 874 00:37:40,610 --> 00:37:48,361 accordée pour un certain temps, ce qui C'est dans ce fichier appelé cs50.h. 875 00:37:48,361 --> 00:37:49,420 Il s'agit donc d'un fichier. 876 00:37:49,420 --> 00:37:51,130 Ce sont juste un tas des commentaires là-haut. 877 00:37:51,130 --> 00:37:53,900 Et vous pourriez avoir regardé cette si vous poussé autour de l'appareil. 878 00:37:53,900 --> 00:37:57,000 Mais il s'avère que tout le temps, lorsque nous utilisions chaîne comme une 879 00:37:57,000 --> 00:38:01,130 synonyme, le moyen par lequel nous avons déclaré qui était synonyme avec cette 880 00:38:01,130 --> 00:38:03,990 mot-clé typedef, pour la définition de type. 881 00:38:03,990 --> 00:38:07,500 Et nous sommes essentiellement en disant faisons enchaîner un synonyme pour la star caractères. 882 00:38:07,500 --> 00:38:11,190 Ce que le moyen par lequel la pile créé ces roues de formation appelés 883 00:38:11,190 --> 00:38:12,040 la chaîne. 884 00:38:12,040 --> 00:38:14,830 >> Maintenant, voici juste un prototype pour getchar. 885 00:38:14,830 --> 00:38:17,350 Nous aurions vu avant, mais c'est en effet ce qu'il fait. getchar 886 00:38:17,350 --> 00:38:19,070 aucun argument, retourne un chevalier. 887 00:38:19,070 --> 00:38:21,340 getDouble ne prend aucun argument, renvoie un double. 888 00:38:21,340 --> 00:38:24,440 getFloat ne prend aucun argument, déclarations un flotteur, et ainsi de suite. 889 00:38:24,440 --> 00:38:27,270 getint est ici. getlonglong est ici. 890 00:38:27,270 --> 00:38:28,820 Et GetString est ici. 891 00:38:28,820 --> 00:38:29,420 Et c'est tout. 892 00:38:29,420 --> 00:38:33,080 Cette ligne violette est une autre préprocesseur directive en raison de l' 893 00:38:33,080 --> 00:38:35,550 hashtag au début de celui-ci. 894 00:38:35,550 --> 00:38:35,870 >> Très bien. 895 00:38:35,870 --> 00:38:38,380 Alors maintenant, laissez-moi aller dans cs50.c. 896 00:38:38,380 --> 00:38:40,400 Et nous n'allons pas parler trop longtemps sur ce point. 897 00:38:40,400 --> 00:38:43,280 Mais pour vous donner un aperçu de ce qui est en cours depuis tout ce 898 00:38:43,280 --> 00:38:46,434 temps, laissez-moi aller à - 899 00:38:46,434 --> 00:38:48,250 faisons getchar. 900 00:38:48,250 --> 00:38:51,050 Alors getchar est principalement commentaires. 901 00:38:51,050 --> 00:38:52,060 Mais il semble que cela. 902 00:38:52,060 --> 00:38:54,800 Donc, c'est la fonction réelle getchar que nous avons été 903 00:38:54,800 --> 00:38:56,055 en prenant pour acquis existe. 904 00:38:56,055 --> 00:38:59,370 Et même si nous n'avons pas utiliser celui-ci que, souvent, voire jamais, il est au moins 905 00:38:59,370 --> 00:39:00,470 relativement simple. 906 00:39:00,470 --> 00:39:02,580 Donc, il vaut la peine d' coup d'oeil sur ici. 907 00:39:02,580 --> 00:39:06,540 >> Alors getchar a une boucle infinie, de façon délibérée, apparemment. 908 00:39:06,540 --> 00:39:10,050 Il appelle ensuite - et c'est une sorte de belle réutilisation du code, nous nous écrit. 909 00:39:10,050 --> 00:39:11,220 Il appelle GetString. 910 00:39:11,220 --> 00:39:12,460 Parce que qu'est-ce que c'est dire d'obtenir un chevalier? 911 00:39:12,460 --> 00:39:14,730 Eh bien, vous pourriez aussi bien essayer d'obtenir un ligne entière de texte de l'utilisateur, et 912 00:39:14,730 --> 00:39:16,940 puis il suffit de regarder une de ces caractères. 913 00:39:16,940 --> 00:39:19,170 Dans la ligne 60, voici un petit peu d'un test de cohérence. 914 00:39:19,170 --> 00:39:21,610 Si GetString retourné null, il ne faut pas procéder. 915 00:39:21,610 --> 00:39:22,820 Quelque chose s'est mal passé. 916 00:39:22,820 --> 00:39:28,120 >> Maintenant, c'est un peu gênant, mais classique dans C. caractères max probablement 917 00:39:28,120 --> 00:39:29,960 représente ce qui vient en fonction de son nom? 918 00:39:29,960 --> 00:39:31,670 C'est une constante. 919 00:39:31,670 --> 00:39:36,040 C'est comme la valeur numérique de l' gros caractères que vous pouvez représenter avec 920 00:39:36,040 --> 00:39:40,370 une bouchée, qui est probablement le nombre 255, qui est le plus grand nombre vous 921 00:39:40,370 --> 00:39:42,720 représenter huit bits, à partir de zéro. 922 00:39:42,720 --> 00:39:47,460 J'ai donc l'utiliser, dans cette fonction, lorsque la rédaction de ce code, uniquement parce que 923 00:39:47,460 --> 00:39:51,753 si quelque chose va mal dans getchar mais son but dans la vie est de retourner une 924 00:39:51,753 --> 00:39:54,830 char, vous devez en quelque sorte être en mesure pour signaler à l'utilisateur que 925 00:39:54,830 --> 00:39:55,840 quelque chose s'est mal passé. 926 00:39:55,840 --> 00:39:56,970 Nous ne pouvons pas retourner null. 927 00:39:56,970 --> 00:39:58,480 Il s'avère que nulle est un pointeur. 928 00:39:58,480 --> 00:40:01,030 Et encore une fois, a getchar pour retourner un chevalier. 929 00:40:01,030 --> 00:40:04,760 >> Ainsi, la convention, si quelque chose va mal, c'est vous, le programmeur, ou en 930 00:40:04,760 --> 00:40:08,160 ce cas, moi avec la bibliothèque, j'ai eu un peu arbitrairement décider si 931 00:40:08,160 --> 00:40:12,230 quelque chose va mal, je vais retourner le nombre 255, qui est vraiment 932 00:40:12,230 --> 00:40:17,240 signifie que nous ne pouvons pas, l'utilisateur ne peut pas saisir le caractère représenté par l' 933 00:40:17,240 --> 00:40:21,410 numéro 255 parce que nous avions une bonne affaire, il en tant que valeur dite de sentinelle 934 00:40:21,410 --> 00:40:23,410 représenter un problème. 935 00:40:23,410 --> 00:40:27,010 Or, il s'avère que le caractère 255 n'est pas quelque chose que vous pouvez taper sur 936 00:40:27,010 --> 00:40:28,380 votre clavier, donc c'est pas une grosse affaire. 937 00:40:28,380 --> 00:40:30,910 L'utilisateur ne remarque pas que J'ai volé ce personnage. 938 00:40:30,910 --> 00:40:34,620 Mais si jamais vous voyez dans les pages de l'homme sur un système informatique une référence à un 939 00:40:34,620 --> 00:40:38,560 tous les bouchons constant comme celui qui dit, en cas d'erreur de cette puissance constante 940 00:40:38,560 --> 00:40:42,720 être retourné, c'est tout ce que certains humains n'ont il ya quelques années a été arbitrairement décidé d' 941 00:40:42,720 --> 00:40:45,680 retourner cette valeur spéciale et appeler une constante dans le cas 942 00:40:45,680 --> 00:40:46,840 quelque chose va mal. 943 00:40:46,840 --> 00:40:48,580 >> Maintenant, la magie se produit ici. 944 00:40:48,580 --> 00:40:52,600 Tout d'abord, je suis déclarant en ligne 67 deux caractères, C1 et C2. 945 00:40:52,600 --> 00:40:57,080 Et puis, dans la ligne 68, il ya en fait une ligne de code qui n'est pas sans rappeler 946 00:40:57,080 --> 00:41:01,140 notre ami printf, étant donné qu'il ne disposer pour cent Cs entre guillemets. 947 00:41:01,140 --> 00:41:06,490 Mais remarquez ce qui se passe ici. sscanf signifie balayage de chaîne - 948 00:41:06,490 --> 00:41:11,690 signifie numériser un format chaîne, sscanf ergo. 949 00:41:11,690 --> 00:41:12,590 Qu'est-ce que ça veut dire? 950 00:41:12,590 --> 00:41:16,310 Cela signifie que vous passez à SSCANF une chaîne. 951 00:41:16,310 --> 00:41:18,420 Et la ligne est tout les types d'utilisateurs po 952 00:41:18,420 --> 00:41:23,520 Vous passez à SSCANF une chaîne de format comme ce qui indique quels sont scanf 953 00:41:23,520 --> 00:41:25,870 vous en espérant que l'utilisateur a tapé: 954 00:41:25,870 --> 00:41:29,730 Vous passez ensuite dans les adresses des deux segments de mémoire, dans ce cas, 955 00:41:29,730 --> 00:41:31,150 parce que j'ai deux espaces réservés. 956 00:41:31,150 --> 00:41:34,610 Donc, je vais lui donner l'adresse C1 et C2 de l'adresse. 957 00:41:34,610 --> 00:41:37,700 >> Et rappelez que vous donnez à une fonction du adresse d'une variable, ce qui est 958 00:41:37,700 --> 00:41:38,950 l'implication? 959 00:41:38,950 --> 00:41:41,400 960 00:41:41,400 --> 00:41:45,050 Qu'est-ce que la fonction peut faire à la suite de lui donner l'adresse d'un 961 00:41:45,050 --> 00:41:48,170 variables, par opposition à la variable elle-même? 962 00:41:48,170 --> 00:41:49,450 Il peut changer, non? 963 00:41:49,450 --> 00:41:53,250 Si vous aviez quelqu'un une carte à un physique adresse, ils peuvent y aller et faire 964 00:41:53,250 --> 00:41:54,750 tout ce qu'ils veulent à cette adresse. 965 00:41:54,750 --> 00:41:55,800 Même idée ici. 966 00:41:55,800 --> 00:41:59,950 Si nous passons à sscanf, l'adresse de deux segments de mémoire, même ces petits 967 00:41:59,950 --> 00:42:03,585 petits morceaux de mémoire, C1 et C2, mais nous lui disons l'adresse d'eux, 968 00:42:03,585 --> 00:42:05,170 sscanf peut changer. 969 00:42:05,170 --> 00:42:08,530 >> Donc, le but de sscanf dans la vie, si nous lisons la page de manuel, c'est de lire ce que l' 970 00:42:08,530 --> 00:42:13,420 utilisateur a tapé dans, espoir pour l'utilisateur d'avoir tapé dans un personnage et peut-être 971 00:42:13,420 --> 00:42:16,470 un autre personnage, et quel que soit l'utilisateur dactylographié, le premier personnage passe 972 00:42:16,470 --> 00:42:19,310 ici, le second personnage passe ici. 973 00:42:19,310 --> 00:42:22,470 Maintenant, en aparté, cela, et vous le feriez savoir que ce à partir de la documentation, 974 00:42:22,470 --> 00:42:25,570 le fait que je mets un espace vierge, veut juste dire que je ne m'inquiète pas si 975 00:42:25,570 --> 00:42:28,440 l'utilisateur appuie sur la barre d'espace de quelques fois avant qu'il ou elle prend une 976 00:42:28,440 --> 00:42:30,400 caractère, je vais ignorer tout espace blanc. 977 00:42:30,400 --> 00:42:32,510 Donc, je sais de la documentation. 978 00:42:32,510 --> 00:42:36,570 >> Le fait qu'il y ait un second% c suivi par un espace blanc est en fait 979 00:42:36,570 --> 00:42:37,410 délibérée. 980 00:42:37,410 --> 00:42:41,190 Je veux être capable de détecter si l'utilisateur foiré ou n'a pas coopéré. 981 00:42:41,190 --> 00:42:45,630 J'espère donc que l'utilisateur ne tapée dans un personnage, donc j'espère 982 00:42:45,630 --> 00:42:50,640 sscanf qui va seulement de retourner le valeur 1 parce que, encore une fois, si je lis 983 00:42:50,640 --> 00:42:55,400 la documentation, le but de sscanf en vie est de retourner le nombre d' 984 00:42:55,400 --> 00:42:59,170 les variables qui ont été remplis avec une entrée utilisateur. 985 00:42:59,170 --> 00:43:02,270 >> Je suis passé à deux variables adresses, C1 et C2. 986 00:43:02,270 --> 00:43:06,420 J'espère, cependant, que seul un des eux est tué parce que si sscanf 987 00:43:06,420 --> 00:43:11,130 renvoie 2, ce qui est sans doute l'implication logique? 988 00:43:11,130 --> 00:43:14,600 Que l'utilisateur n'a pas juste me donner une personnage comme je lui ai dit ou elle. 989 00:43:14,600 --> 00:43:17,860 Ils ont probablement tapé à moins deux caractères. 990 00:43:17,860 --> 00:43:22,430 Donc, si je n'ai pas la place au deuxième % C, j'ai juste eu un, ce qui 991 00:43:22,430 --> 00:43:25,370 franchement serait plus intuitive approche, je pense qu'un premier coup d'œil, 992 00:43:25,370 --> 00:43:30,220 vous n'allez pas être en mesure de détecter si l'utilisateur vous a donné plus 993 00:43:30,220 --> 00:43:31,780 entrée que vous vouliez. 994 00:43:31,780 --> 00:43:34,100 Il s'agit donc d'une forme implicite de vérification d'erreur. 995 00:43:34,100 --> 00:43:35,640 >> Mais remarquez ce que je fais ici. 996 00:43:35,640 --> 00:43:39,970 Une fois que je suis sûr que l'utilisateur m'a donné une caractère, je libérer la ligne, faire 997 00:43:39,970 --> 00:43:44,450 à l'opposé de GetString, qui à son tour utilise malloc, puis je reviens 998 00:43:44,450 --> 00:43:51,030 C1, le personnage que je souhaitais le fournies par l'utilisateur et fournie seulement. 999 00:43:51,030 --> 00:43:54,680 Ainsi, un rapide entrevu seulement, mais des questions sur getchar? 1000 00:43:54,680 --> 00:43:57,450 1001 00:43:57,450 --> 00:43:59,590 Nous reviendrons sur quelques-uns des autres. 1002 00:43:59,590 --> 00:44:03,770 >> Eh bien, permettez-moi d'aller de l'avant et de le faire - Supposons maintenant, juste pour motiver notre 1003 00:44:03,770 --> 00:44:08,910 discussion en une semaine, plus le temps, cette est un fichier appelé structs.h. 1004 00:44:08,910 --> 00:44:11,440 Et encore, ce n'est qu'un avant-goût de quelque chose qui nous attend. 1005 00:44:11,440 --> 00:44:13,090 Mais remarquez que beaucoup ce sont des commentaires. 1006 00:44:13,090 --> 00:44:17,440 Alors permettez-moi de souligner que le partie la plus intéressante pour l'instant. 1007 00:44:17,440 --> 00:44:18,020 typedef - 1008 00:44:18,020 --> 00:44:19,700 il ya encore ce même mot clé. 1009 00:44:19,700 --> 00:44:23,100 typedef nous utilisons pour déclarer chaîne comme un type de données spécial. 1010 00:44:23,100 --> 00:44:27,490 Vous pouvez utiliser typedef pour créer tout nouveau les types de données qui existaient pas quand 1011 00:44:27,490 --> 00:44:28,570 C a été inventé. 1012 00:44:28,570 --> 00:44:32,520 Par exemple, int vient avec C. caractères livré avec C. Double livré avec C. Mais 1013 00:44:32,520 --> 00:44:34,000 il n'y a aucune notion d'un étudiant. 1014 00:44:34,000 --> 00:44:37,230 Et pourtant, il serait très utile d'être capable d'écrire un programme qui stocke 1015 00:44:37,230 --> 00:44:40,440 dans une variable, le numéro d'identification d'un élève, leur nom et leur maison. 1016 00:44:40,440 --> 00:44:42,890 En d'autres termes, trois pièces de données, comme un int et un 1017 00:44:42,890 --> 00:44:44,420 chaîne et une autre chaîne. 1018 00:44:44,420 --> 00:44:48,220 >> Avec typedef, ce qui est assez puissant à ce sujet et le mot-clé pour sturct 1019 00:44:48,220 --> 00:44:53,660 structure, vous, le programmeur en 2013, peut réellement définir votre propre l' 1020 00:44:53,660 --> 00:44:57,530 les types de données qui n'existaient pas ans il ya, mais qui répondent à vos besoins. 1021 00:44:57,530 --> 00:45:01,910 Et ici, dans les lignes 13 à 19, nous déclarer un nouveau type de données, comme 1022 00:45:01,910 --> 00:45:04,320 un int, mais l'appelant étudiant. 1023 00:45:04,320 --> 00:45:09,310 Et à l'intérieur de cette variable va avoir trois choses - int, string, 1024 00:45:09,310 --> 00:45:09,930 et une chaîne de caractères. 1025 00:45:09,930 --> 00:45:13,040 Ainsi, vous pouvez penser à ce qui est vraiment arrivé ici, même si c'est un 1026 00:45:13,040 --> 00:45:17,160 là d'une simplification pour aujourd'hui, un élève est essentiellement va 1027 00:45:17,160 --> 00:45:19,450 pour ressembler à ceci. 1028 00:45:19,450 --> 00:45:22,580 Sa va être un morceau de mémoire avec un identificateur, un nom 1029 00:45:22,580 --> 00:45:25,580 champ, et un champ de maison. 1030 00:45:25,580 --> 00:45:30,670 Et nous serons en mesure d'utiliser ces morceaux de mémoire et y accéder comme suit. 1031 00:45:30,670 --> 00:45:38,870 >> Si je vais dans struct0.c, voici un relativement longue, mais suite à une 1032 00:45:38,870 --> 00:45:42,630 motif, du code qui utilise cette nouvelle astuce. 1033 00:45:42,630 --> 00:45:45,790 Alors d'abord, permettez-moi d'attirer votre attention pour les parties intéressantes là-haut. 1034 00:45:45,790 --> 00:45:49,670 Forte définit étudiants 3, déclare un constante appelée étudiants et ayants droit 1035 00:45:49,670 --> 00:45:53,450 arbitrairement le numéro 3, juste j'ai donc trois élèves à l'aide 1036 00:45:53,450 --> 00:45:54,830 ce programme pour l'instant. 1037 00:45:54,830 --> 00:45:55,960 Voici venir Main. 1038 00:45:55,960 --> 00:45:58,860 Et remarquez, comment dois-je déclarer un tableau des étudiants? 1039 00:45:58,860 --> 00:46:00,480 Eh bien, je viens d'utiliser la même syntaxe. 1040 00:46:00,480 --> 00:46:02,110 L'étudiant de mot est évidemment de nouveau. 1041 00:46:02,110 --> 00:46:04,790 Mais étudiant, classe, les élèves de support. 1042 00:46:04,790 --> 00:46:06,720 >> Donc, malheureusement, il ya beaucoup de réutilisation des termes ici. 1043 00:46:06,720 --> 00:46:07,660 Ceci est juste un nombre. 1044 00:46:07,660 --> 00:46:09,040 Donc, c'est à dire trois. 1045 00:46:09,040 --> 00:46:11,430 La classe est ce que je veux d'appeler la variable. 1046 00:46:11,430 --> 00:46:12,840 Je pourrais appeler les étudiants. 1047 00:46:12,840 --> 00:46:15,880 Mais la classe, ce n'est pas une classe dans un orientée objet Java de type moyen. 1048 00:46:15,880 --> 00:46:17,220 C'est juste une classe d'élèves. 1049 00:46:17,220 --> 00:46:20,590 Et du type de chaque élément de données dans ce tableau est étudiant. 1050 00:46:20,590 --> 00:46:23,040 Donc, c'est un peu différent et de dire quelque chose 1051 00:46:23,040 --> 00:46:25,250 comme ça, c'est juste - 1052 00:46:25,250 --> 00:46:29,500 Je veux dire, donnez-moi trois étudiants et d'appeler cette classe de tableau. 1053 00:46:29,500 --> 00:46:29,800 >> Très bien. 1054 00:46:29,800 --> 00:46:30,680 Maintenant, voici un quatre boucle. 1055 00:46:30,680 --> 00:46:33,480 Familier de ce gars - itération de zéro à un maximum de trois. 1056 00:46:33,480 --> 00:46:35,160 Et voici le nouveau morceau de syntaxe. 1057 00:46:35,160 --> 00:46:37,710 Le programme va me demandera, l'homme, pour lui donner un étudiant 1058 00:46:37,710 --> 00:46:39,200 ID, qui est un entier. 1059 00:46:39,200 --> 00:46:44,650 Et voici la syntaxe avec lequel vous pouvez stocker quelque chose dans le domaine ID à 1060 00:46:44,650 --> 00:46:48,630 classe Emplacement du support I. Ainsi, cette syntaxe n'est pas nouvelle. 1061 00:46:48,630 --> 00:46:51,450 Cela signifie simplement me donner la huitième élève de la classe. 1062 00:46:51,450 --> 00:46:52,940 Mais ce symbole est nouveau. 1063 00:46:52,940 --> 00:46:56,320 Jusqu'à maintenant, nous avons ne pouvons pas utilisé dot, au moins dans le code comme ceci. 1064 00:46:56,320 --> 00:47:01,490 Cela signifie aller vers la structure appelée un étudiant et mettre quelque chose là-bas. 1065 00:47:01,490 --> 00:47:05,670 De même, dans cette ligne suivante, 31, rendez-vous de l'avant et mettre ce que l'utilisateur tape 1066 00:47:05,670 --> 00:47:10,530 pour un nom ici et ce qu'ils font pour maison, la même chose, aller de l'avant et 1067 00:47:10,530 --> 00:47:13,230 mettre dans. maison. 1068 00:47:13,230 --> 00:47:15,955 >> Alors, qu'est-ce que ce programme en fin de compte faire? 1069 00:47:15,955 --> 00:47:17,220 Vous pouvez voir un petit teaser là. 1070 00:47:17,220 --> 00:47:24,780 Permettez-moi d'aller de l'avant et ne fais struct 0 dot slash struct 0, le numéro d'identification de l'élève 1, 1071 00:47:24,780 --> 00:47:28,250 dire David Mather, étudiant ID 2. 1072 00:47:28,250 --> 00:47:32,070 Rob Kirkland, étudiant ID 3. 1073 00:47:32,070 --> 00:47:35,010 Lauren Leverit - 1074 00:47:35,010 --> 00:47:38,380 et la seule chose que ce programme a fait, qui est juste totalement arbitraire, est 1075 00:47:38,380 --> 00:47:40,980 Je voulais faire quelque chose avec ces données, maintenant que je nous avez appris à 1076 00:47:40,980 --> 00:47:43,450 utiliser des structures, c'est que je viens d'avoir cette boucle supplémentaire ici. 1077 00:47:43,450 --> 00:47:45,260 Je itérer sur l'ensemble des étudiants. 1078 00:47:45,260 --> 00:47:49,170 J'ai utilisé notre ami, peut-être maintenant familier, comparaison de chaîne, stircomp à 1079 00:47:49,170 --> 00:47:53,780 chèque est la maison de 8 étudiants égale à Mather? 1080 00:47:53,780 --> 00:47:56,760 Et si c'est le cas, vous n'avez qu'à imprimer quelque chose arbitrairement comme, oui, c'est vrai. 1081 00:47:56,760 --> 00:47:59,430 Mais encore une fois, juste me donner des opportunités d'utiliser et de réutiliser et 1082 00:47:59,430 --> 00:48:02,270 réutiliser cette nouvelle notation de la dot. 1083 00:48:02,270 --> 00:48:03,250 >> Alors, qui se soucie, non? 1084 00:48:03,250 --> 00:48:06,270 Venir avec un programme de l'étudiant est quelque peu arbitraire, mais il s'avère 1085 00:48:06,270 --> 00:48:09,800 que nous pouvons faire des choses utiles avec C'est, par exemple comme suit. 1086 00:48:09,800 --> 00:48:14,600 Il s'agit d'une structure beaucoup plus complexe en C. Il a une douzaine ou plus de champs, 1087 00:48:14,600 --> 00:48:15,880 quelque peu énigmatique nommé. 1088 00:48:15,880 --> 00:48:20,110 Mais si vous avez déjà entendu parler d'un graphique format de fichier appelé bitmap, BMP, il 1089 00:48:20,110 --> 00:48:22,830 s'avère que le format de fichier bitmap à peu près ressembler que cela. 1090 00:48:22,830 --> 00:48:24,200 C'est un petit visage souriant stupide. 1091 00:48:24,200 --> 00:48:27,840 C'est une petite image que j'ai zoomé sur assez grand pour que je puisse voir chaque 1092 00:48:27,840 --> 00:48:30,410 des points individuels ou pixels. 1093 00:48:30,410 --> 00:48:33,800 Maintenant, il s'avère que nous pouvons représenter une point noir avec, par exemple, le numéro 0. 1094 00:48:33,800 --> 00:48:35,520 Et un point blanc avec le numéro 1. 1095 00:48:35,520 --> 00:48:39,140 >> Donc, en d'autres termes, si vous voulez dessiner un Smiley face et à sauver cette image dans un 1096 00:48:39,140 --> 00:48:42,680 ordinateur, il suffit de stocker des zéros et ceux qui ressemblent à celui-ci, le cas échéant, 1097 00:48:42,680 --> 00:48:45,250 encore une fois, ceux qui sont blancs et les zéros sont noirs. 1098 00:48:45,250 --> 00:48:48,290 Et en même temps, si vous avez effectivement un cerceau de uns et de zéros, vous disposez d'un 1099 00:48:48,290 --> 00:48:51,030 grille de pixels, et si vous posez les, vous disposez d'un mignon 1100 00:48:51,030 --> 00:48:52,560 petit visage souriant. 1101 00:48:52,560 --> 00:48:58,150 Maintenant, le format de fichier bitmap, BMP, est efficacement que sous le capot, 1102 00:48:58,150 --> 00:49:00,970 mais avec plus de pixels sot que vous peut effectivement représenter les couleurs. 1103 00:49:00,970 --> 00:49:05,170 >> Mais quand vous avez plus sophistiqué formats de fichiers tels que BMP et JPEG et GIF 1104 00:49:05,170 --> 00:49:09,360 avec qui vous connaissez peut-être, ceux fichiers sur disque en général pas seulement 1105 00:49:09,360 --> 00:49:13,760 avoir zéros et de uns pour les pixels, mais ils ont des métadonnées ainsi - 1106 00:49:13,760 --> 00:49:16,960 méta dans le sens qui n'est pas vraiment données, mais il est utile d'avoir. 1107 00:49:16,960 --> 00:49:21,370 Ainsi, ces champs sont ici ce qui implique, et Nous verrons cela plus en détail dans P-set 1108 00:49:21,370 --> 00:49:25,810 5, qu'avant que les zéros et les uns que représenter les pixels d'une image, 1109 00:49:25,810 --> 00:49:29,110 il ya un tas de métadonnées comme la taille de l'image et l' 1110 00:49:29,110 --> 00:49:30,250 largeur de l'image. 1111 00:49:30,250 --> 00:49:32,910 Et notez que je suis plumer hors certains choses arbitraires ici - 1112 00:49:32,910 --> 00:49:34,260 largeur et hauteur. 1113 00:49:34,260 --> 00:49:36,160 nombre de bits et d'autres choses. 1114 00:49:36,160 --> 00:49:37,840 Donc, il ya certaines métadonnées dans un fichier. 1115 00:49:37,840 --> 00:49:41,470 >> Mais par la compréhension de la façon dont les fichiers sont fixées de cette façon, vous pouvez réellement 1116 00:49:41,470 --> 00:49:45,890 puis manipuler des images, récupérer des images à partir du disque, redimensionner les images. 1117 00:49:45,890 --> 00:49:47,560 Mais vous ne pouvez pas nécessairement améliorer. 1118 00:49:47,560 --> 00:49:48,480 J'avais besoin d'une photo. 1119 00:49:48,480 --> 00:49:52,840 Je suis donc retourné à RJ ici, qui vous avez vu sur l'écran il ya un certain temps. 1120 00:49:52,840 --> 00:49:57,160 Et si j'ouvre Keynote ici, c'est ce qui se passe si vous essayez d'effectuer un zoom avant et 1121 00:49:57,160 --> 00:49:59,380 améliorer RJ. 1122 00:49:59,380 --> 00:50:01,480 Il a pas mieux faire vraiment. 1123 00:50:01,480 --> 00:50:06,240 Maintenant Keynote est une sorte de flou un peu, juste pour dissimuler le 1124 00:50:06,240 --> 00:50:11,040 fait que RJ n'obtient pas particulièrement améliorée lorsque vous zoomez po 1125 00:50:11,040 --> 00:50:13,310 Et si faire de cette façon, voir les places? 1126 00:50:13,310 --> 00:50:15,490 Oui, vous pouvez certainement voir les carrés sur un projecteur. 1127 00:50:15,490 --> 00:50:17,690 >> C'est ce que vous obtenez lorsque vous améliorer. 1128 00:50:17,690 --> 00:50:22,570 Mais pour comprendre comment notre RJ ou l' Smiley face est mise en œuvre va nous permettre 1129 00:50:22,570 --> 00:50:24,950 réellement écrire du code qui manipule ces choses. 1130 00:50:24,950 --> 00:50:29,970 Et j'ai pensé que je finirais sur cette note, avec 55 secondes d'une améliorent c'est, 1131 00:50:29,970 --> 00:50:31,230 J'ose, disons plutôt trompeur. 1132 00:50:31,230 --> 00:50:32,990 >> [LECTURE VIDEO] 1133 00:50:32,990 --> 00:50:34,790 >> -Il ment. 1134 00:50:34,790 --> 00:50:38,310 À propos de quoi, je ne sais pas. 1135 00:50:38,310 --> 00:50:41,200 >> -Alors, que savons-nous? 1136 00:50:41,200 --> 00:50:45,280 >> -C'est à 9:15 Ray Santoya était à l'ATM. 1137 00:50:45,280 --> 00:50:47,830 >> -Donc la question est ce que faisait-il à 09h16? 1138 00:50:47,830 --> 00:50:50,750 >> -Tirer le neuf millimètres à quelque chose. 1139 00:50:50,750 --> 00:50:52,615 Peut-être qu'il a vu le sniper. 1140 00:50:52,615 --> 00:50:54,760 >> -Or a été de travailler avec lui. 1141 00:50:54,760 --> 00:50:56,120 >> -Attendez. 1142 00:50:56,120 --> 00:50:57,450 Remonter d'un. 1143 00:50:57,450 --> 00:50:58,700 >> -Que voyez-vous? 1144 00:50:58,700 --> 00:51:05,530 1145 00:51:05,530 --> 00:51:09,490 >> -Apporter son visage vers le haut, en plein écran. 1146 00:51:09,490 --> 00:51:09,790 >> -Ses lunettes. 1147 00:51:09,790 --> 00:51:11,040 >> -Il ya une réflexion. 1148 00:51:11,040 --> 00:51:21,790 1149 00:51:21,790 --> 00:51:23,520 >> -C'est l'équipe de baseball Neuvitas. 1150 00:51:23,520 --> 00:51:24,530 C'est leur logo. 1151 00:51:24,530 --> 00:51:27,040 >> -Et il parle à celui qui est porter cette veste. 1152 00:51:27,040 --> 00:51:27,530 >> [FIN LECTURE VIDÉO] 1153 00:51:27,530 --> 00:51:29,180 >> DAVID J. Malan: Ce sera être réglé de problème 5. 1154 00:51:29,180 --> 00:51:30,720 Nous vous verrons la semaine prochaine. 1155 00:51:30,720 --> 00:51:32,330 >> INTERVENANT: À la prochaine CS50. 1156 00:51:32,330 --> 00:51:39,240 >> [Grillons] 1157 00:51:39,240 --> 00:51:41,270 >> [Jouer de la musique]