1 00:00:00,000 --> 00:00:03,395 >> [Jouer de la musique] 2 00:00:03,395 --> 00:00:11,031 3 00:00:11,031 --> 00:00:13,280 DAVID J. Malan: Cela ressemble un séminaire de première année aujourd'hui. 4 00:00:13,280 --> 00:00:14,060 D'ACCORD. 5 00:00:14,060 --> 00:00:15,024 Donc très pluvieux sur. 6 00:00:15,024 --> 00:00:17,690 Cette tendance à se produire le mercredi, mais d'autant plus l'occasion 7 00:00:17,690 --> 00:00:18,700 Pour des questions aujourd'hui. 8 00:00:18,700 --> 00:00:22,210 Donc, nous allons commencer effectivement avec le film dans un instant. 9 00:00:22,210 --> 00:00:24,560 Mais nous allons commencer pompeusement comme toujours. 10 00:00:24,560 --> 00:00:28,000 >> Ceci est CS50, et cela est la fin de la semaine 4. 11 00:00:28,000 --> 00:00:30,820 Donc, si vous avez déjà regardé TV ou un film dans lequel des 12 00:00:30,820 --> 00:00:34,690 il ya certains experts informatiques et la police, ou le FBI, ou une agence 13 00:00:34,690 --> 00:00:36,930 est d'essayer de prendre un peu adversaire, eh bien, vous avez 14 00:00:36,930 --> 00:00:40,850 probablement entendu l'expression "améliorer" lequel que technicien en quelque sorte 15 00:00:40,850 --> 00:00:44,750 zooms par magie dans l'infini loin pour voir les criminels 16 00:00:44,750 --> 00:00:48,640 identité ou le numéro de la plaque d'immatriculation même dans le miroitement d'un miroir 17 00:00:48,640 --> 00:00:50,390 ou l'éclat de l'œil de quelqu'un. 18 00:00:50,390 --> 00:00:55,196 Donc, en effet, nous allons jeter un oeil à quelques telles scènes de Hollywood. 19 00:00:55,196 --> 00:00:55,862 [LECTURE VIDÉO] 20 00:00:55,862 --> 00:00:59,243 -OK, Maintenant nous allons obtenir un bon oeil à vous. 21 00:00:59,243 --> 00:01:06,488 22 00:01:06,488 --> 00:01:07,415 >> -hold Il. 23 00:01:07,415 --> 00:01:08,267 Exécutez ce retour. 24 00:01:08,267 --> 00:01:09,121 >> -Attendez une minute. 25 00:01:09,121 --> 00:01:11,300 Aller à droite. 26 00:01:11,300 --> 00:01:12,209 >> -Il, Geler cela. 27 00:01:12,209 --> 00:01:12,750 -Plein écran. 28 00:01:12,750 --> 00:01:13,558 -OK, Geler cela. 29 00:01:13,558 --> 00:01:14,820 -Serrez Là-dessus, allez-vous? 30 00:01:14,820 --> 00:01:16,530 En ce que sur -vector gars par la roue arrière. 31 00:01:16,530 --> 00:01:19,400 -Zoom En droit ici à cet endroit. 32 00:01:19,400 --> 00:01:22,846 -Avec Le bon équipement, l'image pourrait être élargie et aiguisé. 33 00:01:22,846 --> 00:01:24,065 -Qu'est ce que c'est? 34 00:01:24,065 --> 00:01:25,600 -C'est Un programme d'amélioration. 35 00:01:25,600 --> 00:01:26,860 -Peut-On clair que jusqu'à tout? 36 00:01:26,860 --> 00:01:27,890 -Je ne sais pas. 37 00:01:27,890 --> 00:01:29,050 Disons améliorer. 38 00:01:29,050 --> 00:01:31,575 >> -Améliorez Section A6. 39 00:01:31,575 --> 00:01:33,642 >> -I Amélioré le détail, et-- Je pense qu'il ya 40 00:01:33,642 --> 00:01:35,433 assez pour améliorer, relâchez-le pour mon écran. 41 00:01:35,433 --> 00:01:37,080 -I Amélioré le reflet dans les yeux. 42 00:01:37,080 --> 00:01:38,830 >> -LET Est géré par cette amélioration vidéo. 43 00:01:38,830 --> 00:01:40,100 -Edgar, Pouvez-vous améliorer ce? 44 00:01:40,100 --> 00:01:41,875 >> -Attendre. 45 00:01:41,875 --> 00:01:44,010 >> -J'ai Travaillé sur cette réflexion. 46 00:01:44,010 --> 00:01:44,995 >> La réflexion de -Quelqu. 47 00:01:44,995 --> 00:01:45,495 -Réflexion. 48 00:01:45,495 --> 00:01:47,399 -Il Ya une réflexion du visage de l'homme. 49 00:01:47,399 --> 00:01:48,065 -La Réflexion. 50 00:01:48,065 --> 00:01:48,981 -Il Ya une réflexion. 51 00:01:48,981 --> 00:01:50,600 Dans -Zoom sur le miroir. 52 00:01:50,600 --> 00:01:52,712 -Vous Pouvez voir un reflet. 53 00:01:52,712 --> 00:01:54,350 -Peut Vous améliorez l'image à partir d'ici? 54 00:01:54,350 --> 00:01:55,370 -Peut Vous l'améliorer ici? 55 00:01:55,370 --> 00:01:56,210 -Peut-Vous améliorer? 56 00:01:56,210 --> 00:01:56,900 Pouvez-vous améliorer? 57 00:01:56,900 --> 00:01:57,870 >> -Peut-On améliorer ce? 58 00:01:57,870 --> 00:01:58,717 >> -Peut-Vous améliorer? 59 00:01:58,717 --> 00:02:00,050 -hold Sur une seconde, je vais améliorer. 60 00:02:00,050 --> 00:02:00,924 -Zoom Dans la porte. 61 00:02:00,924 --> 00:02:01,700 -Times 10. 62 00:02:01,700 --> 00:02:02,586 -Zoom. 63 00:02:02,586 --> 00:02:03,490 -Emménager. 64 00:02:03,490 --> 00:02:03,990 -Plus. 65 00:02:03,990 --> 00:02:04,690 Attends, arrête. 66 00:02:04,690 --> 00:02:05,190 -Arrêtez. 67 00:02:05,190 --> 00:02:05,970 -PAUSE Il. 68 00:02:05,970 --> 00:02:09,460 Nous -rotate 75 degrés autour de la verticale, s'il vous plaît. 69 00:02:09,460 --> 00:02:10,962 -Arrêtez. 70 00:02:10,962 --> 00:02:14,040 Retour à la partie sur la porte, à nouveau. 71 00:02:14,040 --> 00:02:15,860 >> -Got Un amplificateur d'image qui peut bitmap? 72 00:02:15,860 --> 00:02:18,776 >> Hé, peut-être nous pouvons utiliser la Pradeep Méthode Sen de voir dans les fenêtres. 73 00:02:18,776 --> 00:02:20,372 -Ce Logiciel est l'état de l'art. 74 00:02:20,372 --> 00:02:21,845 >> -La Valeur propre est éteint. 75 00:02:21,845 --> 00:02:24,300 >> -Avec Le droit combinaison de algorithm-- 76 00:02:24,300 --> 00:02:26,755 >> Pris l'élimination de -Il algorithmes au niveau suivant, 77 00:02:26,755 --> 00:02:28,730 et je peux les utiliser pour améliorer cette photo. 78 00:02:28,730 --> 00:02:31,286 >> -lock Sur et agrandir l'axe z. 79 00:02:31,286 --> 00:02:32,560 >> -Améliorez. 80 00:02:32,560 --> 00:02:33,100 >> -Améliorez. 81 00:02:33,100 --> 00:02:33,600 >> -Améliorez. 82 00:02:33,600 --> 00:02:34,960 -Freeze Et améliorer. 83 00:02:34,960 --> 00:02:37,180 >> [FIN LECTURE] 84 00:02:37,180 --> 00:02:41,160 >> DAVID J. Malan: Très bien, alors tous ceux qui sont en fait des mots. 85 00:02:41,160 --> 00:02:44,450 Ils sont juste enchaînés dans un manière qui est pas réellement sensible. 86 00:02:44,450 --> 00:02:48,400 Et, en fait, CS50 et cours comme il tend à ruiner beaucoup de télévision et des films 87 00:02:48,400 --> 00:02:48,900 pour toi. 88 00:02:48,900 --> 00:02:52,330 Parce que quand ces experts en informatique sont débiter termes et dire 89 00:02:52,330 --> 00:02:56,860 les choses de fantaisie comme vecteurs propres, et l'axe z, 90 00:02:56,860 --> 00:02:59,572 et un nombre quelconque d'autres effectivement termes plus techniques, 91 00:02:59,572 --> 00:03:02,030 ils sont vraiment juste enfiler mots ensemble trop souvent. 92 00:03:02,030 --> 00:03:05,020 Est-ce que l'un de nos espoirs est que, comme un effet secondaire de suivre des cours 93 00:03:05,020 --> 00:03:08,245 comme ce sera, plus de gens dans le monde être effectivement en mesure de peser 94 00:03:08,245 --> 00:03:12,040 et juste très légèrement influencer le qualité et la précision de ces films? 95 00:03:12,040 --> 00:03:14,350 >> En fait, nous allons jeter un oeil à la réalité. 96 00:03:14,350 --> 00:03:18,070 Donc, voici la photo de personnel Marie, l'un de nos compagnons d'enseignement. 97 00:03:18,070 --> 00:03:20,050 Et si elle est soupçonné de quelque chose. 98 00:03:20,050 --> 00:03:23,730 Et pourtant, il ya une lueur d' certains éléments de preuve dans les yeux, 99 00:03:23,730 --> 00:03:25,480 ou dans la réflexion de ses lunettes. 100 00:03:25,480 --> 00:03:30,760 Eh bien, si nous faisons exactement comme les films proposer, dans laquelle on zoome et «améliorer», 101 00:03:30,760 --> 00:03:34,080 cela est la quantité d'informations est dans le visage de Marie 102 00:03:34,080 --> 00:03:36,795 lorsque vous capturez une image avec la résolution d'origine. 103 00:03:36,795 --> 00:03:39,120 >> Et, en fait, vous pouvez voir ces points. 104 00:03:39,120 --> 00:03:41,900 Et ce sont eux qui sont appelés pixels, P-I-X-E-L-S, 105 00:03:41,900 --> 00:03:45,740 qui est juste un carré généralement qui est un point qui compose une image. 106 00:03:45,740 --> 00:03:49,200 Et retour dans la journée, et effectivement, même aujourd'hui avec certains des téléviseurs LED d'aujourd'hui 107 00:03:49,200 --> 00:03:51,950 ou les téléviseurs LCD, si vous avez l'un dans votre chambre ou à la maison, 108 00:03:51,950 --> 00:03:55,100 si vous montez super proche de lui, et surtout si elle est une télévision un peu plus âgés, 109 00:03:55,100 --> 00:03:58,760 vous pouvez probablement même voir ces points et que est ce que composer une image. 110 00:03:58,760 --> 00:04:00,980 >> Et il n'y a plus informations que cela. 111 00:04:00,980 --> 00:04:05,400 Nous pourrions «améliorer», dans le sens de arrondir les angles et une sorte de 112 00:04:05,400 --> 00:04:09,040 inférer sorte de, en quelque sorte ce que couleur doit être à côté de l'œil de Mary 113 00:04:09,040 --> 00:04:10,910 de sorte qu'il est pas en fait si pixélisé. 114 00:04:10,910 --> 00:04:14,510 Mais si je continue zoom avant, il est le méchant dans son oeil. 115 00:04:14,510 --> 00:04:16,600 Comme cela est d'autant informations dont nous disposons. 116 00:04:16,600 --> 00:04:18,920 Vous ne pouvez pas créer informations à partir de rien. 117 00:04:18,920 --> 00:04:20,790 Il ya seulement un ensemble fini nombre de bits là. 118 00:04:20,790 --> 00:04:22,873 >> Donc, dans le problème Set 4, où vous avez l'occasion 119 00:04:22,873 --> 00:04:24,580 à jouer avec ce genre de monde. 120 00:04:24,580 --> 00:04:27,610 Dans problème Set 4, vous pourrez explorer la monde du graphisme, et la médecine légale, 121 00:04:27,610 --> 00:04:30,870 et effectivement écrire du code qui récupère des images perdues. 122 00:04:30,870 --> 00:04:33,510 Vous allez écrire du code qui manipule des images existantes 123 00:04:33,510 --> 00:04:36,120 et finalement comprendre ce qui est passe sous le capot. 124 00:04:36,120 --> 00:04:38,540 >> Et, il se trouve, il est effectivement pas si compliqué que ça. 125 00:04:38,540 --> 00:04:41,320 Par exemple, si nous voulions représenter un visage souriant où 126 00:04:41,320 --> 00:04:44,160 avec ces pixels noirs, ou ces points noirs, 127 00:04:44,160 --> 00:04:47,230 Eh bien, nous ne pouvions tout simplement représenter comme vraiment un bitmap. 128 00:04:47,230 --> 00:04:50,040 Et si vous aviez déjà entendu dire que bitmap d'expression, peut-être 129 00:04:50,040 --> 00:04:52,330 il commence maintenant à faire un peu plus de sens aujourd'hui. 130 00:04:52,330 --> 00:04:53,580 >> Nous savons déjà ce qui est un peu. 131 00:04:53,580 --> 00:04:54,160 Il est 0 ou 1. 132 00:04:54,160 --> 00:04:56,201 Et une carte est juste quelque chose comme un morceau de papier 133 00:04:56,201 --> 00:04:59,180 qui vous donne les directions et a peut-être une grille de coordonnées x et. 134 00:04:59,180 --> 00:05:00,540 Donc, voici une image bitmap. 135 00:05:00,540 --> 00:05:03,680 Il est une carte de bits grâce à quoi un 1 est apparemment 136 00:05:03,680 --> 00:05:07,857 va représenter un pixel blanc, et un 0 va représenter un pixel noir. 137 00:05:07,857 --> 00:05:09,440 Mais nous pourrions certainement retourner autour. 138 00:05:09,440 --> 00:05:11,648 Il ne compte pas vraiment si Tant que nous sommes cohérents. 139 00:05:11,648 --> 00:05:15,570 Et voici comment, à l'intérieur binary-- de la mémoire d'un ordinateur, ou même à l'intérieur 140 00:05:15,570 --> 00:05:18,160 d'un fichier sur votre disque drive-- pourriez-vous stocker 141 00:05:18,160 --> 00:05:20,240 le plus simple des images de visages souriants. 142 00:05:20,240 --> 00:05:23,990 Mais que sommes-nous, bien sûr, manque dans cette image? 143 00:05:23,990 --> 00:05:24,610 Couleur, non? 144 00:05:24,610 --> 00:05:28,220 Il est une prochaine étape évidente ou amélioration pour améliorer la couleur. 145 00:05:28,220 --> 00:05:32,230 Donc, malheureusement avec un seul bits, 0 ou 1, on pourrait représenter la couleur. 146 00:05:32,230 --> 00:05:36,100 Cela pourrait être rouge, ou bleu, ou noir, ou blanc, ou vert, ou rose, 147 00:05:36,100 --> 00:05:37,420 ou des paires de couleurs. 148 00:05:37,420 --> 00:05:40,860 Mais pour des raisons de simplicité, nous allons simplement supposer noir et blanc. 149 00:05:40,860 --> 00:05:45,930 >> Alors, que devons-nous logiquement si nous vouloir mettre en œuvre couleur dans une image? 150 00:05:45,930 --> 00:05:49,080 Qu'avons nous à faire? 151 00:05:49,080 --> 00:05:51,900 Comme si le facteur limitant ici est que, avec un peu vous pouvez seulement 152 00:05:51,900 --> 00:05:55,977 représentent deux états, 0 ou 1, blanc ou noir, que voulez-vous faire? 153 00:05:55,977 --> 00:05:56,810 Audience: plus de données. 154 00:05:56,810 --> 00:05:58,813 DAVID J. Malan: plus de bits, ouais plus de données, plus de bits. 155 00:05:58,813 --> 00:06:01,440 Et, en effet, que est exactement comment images couleurs sont représentées. 156 00:06:01,440 --> 00:06:05,120 Plutôt que d'utiliser un seul bit, un 0 ou 1 pour chaque pixel, chaque point, 157 00:06:05,120 --> 00:06:06,170 vous utilisez simplement multiple. 158 00:06:06,170 --> 00:06:09,660 Peut-être utiliser 8, peut-être, plus communément utiliser 24, et en effet, dans le problème Set 159 00:06:09,660 --> 00:06:13,300 4, allez-vous jouer avec un fichier format qui utilise typiquement 24 bits. 160 00:06:13,300 --> 00:06:15,430 >> Mais la plupart d'entre vous sont sans doute familier avec les fichiers JPEG. 161 00:06:15,430 --> 00:06:17,460 Si vous avez déjà pris une photo de votre téléphone, 162 00:06:17,460 --> 00:06:20,360 ou téléchargé ou vu quelque chose sur Facebook, Flickr ou, tout nombre 163 00:06:20,360 --> 00:06:24,882 des sites web à base de photos, vous avez probablement vu une image JPEG avant. 164 00:06:24,882 --> 00:06:27,840 Et il se trouve, cela est le fichier format que nous allons utiliser dans PSet 4, 165 00:06:27,840 --> 00:06:30,340 par lequel vous allez avoir à récupérer des images 166 00:06:30,340 --> 00:06:35,160 que je l'ai accidentellement supprimé à partir d'un corrompu carte de mémoire dans l'appareil, 167 00:06:35,160 --> 00:06:35,800 si vous voulez. 168 00:06:35,800 --> 00:06:38,490 >> Et il se trouve que, même si JPEG est assez sophisticated-- 169 00:06:38,490 --> 00:06:40,906 il est beaucoup plus sophistiqué que les points noirs et blancs 170 00:06:40,906 --> 00:06:44,480 nous avons vu il ya un instant, parce qu'il ya algorithmes de fantaisie qui fait 171 00:06:44,480 --> 00:06:47,410 sont utilisés pour compresser un fichier JPEG, afin que vous pouvez avoir une très belle, 172 00:06:47,410 --> 00:06:49,832 qualité d'image, mais en utilisant relativement peu de bits. 173 00:06:49,832 --> 00:06:51,790 Et nous y reviendrons compression avant longtemps. 174 00:06:51,790 --> 00:06:56,280 Il se trouve que la première trois octets dans un image-- JPEG 175 00:06:56,280 --> 00:07:02,750 peu importe ce que vous avez pris une photo de-- sont les valeurs 255, 216, 255. 176 00:07:02,750 --> 00:07:05,990 >> En d'autres termes, si vous venez de voir ce modèle de bits, 177 00:07:05,990 --> 00:07:09,180 ici représenté comme trois octets ou 24 bits au total, 178 00:07:09,180 --> 00:07:13,810 avec une forte probabilité, vous pouvez en déduire que vous cherchez les choses de cette trois premiers 179 00:07:13,810 --> 00:07:15,230 octets d'un JPEG. 180 00:07:15,230 --> 00:07:18,040 Et ceci est ce qui est connu que la signature d'un JPEG. 181 00:07:18,040 --> 00:07:20,540 Un grand nombre de formats de fichiers là-bas ont tendance à commencer 182 00:07:20,540 --> 00:07:23,735 avec certains modèles de 0 et de 1, afin que Windows et Mac OS et iOS, 183 00:07:23,735 --> 00:07:28,272 et de savoir ce que les applications du type de fichier sont, en plus du fichier que l'on appelle 184 00:07:28,272 --> 00:07:29,730 l'extension que beaucoup de dossiers ont. 185 00:07:29,730 --> 00:07:32,590 Si vous avez .jpg, qui est un autre indice à l'ordinateur. 186 00:07:32,590 --> 00:07:35,310 >> Donc, nous allons maintenant examiner cette un peu plus technique. 187 00:07:35,310 --> 00:07:37,390 Nous savons la décimale système est de 0 à 9. 188 00:07:37,390 --> 00:07:38,740 Nous savons binaire est 0 et 1. 189 00:07:38,740 --> 00:07:41,842 Et si vous repensez à PSet 0, nous avions vous luttez avec, 190 00:07:41,842 --> 00:07:43,800 pour un peu, quelque chose appelé hexadécimal, 191 00:07:43,800 --> 00:07:47,320 où vous avez 16 chiffres, au lieu de 10 ou au lieu de deux. 192 00:07:47,320 --> 00:07:50,405 Et ces chiffres, par convention, sont 0 à 9, puis une 193 00:07:50,405 --> 00:07:55,040 à f, où f représente ce nombre décimal, tout comme un bon sens rapide 194 00:07:55,040 --> 00:07:56,640 vérifier? 195 00:07:56,640 --> 00:07:57,610 Donc, 15. 196 00:07:57,610 --> 00:08:01,390 Et une doit représenter 10, juste en nature de l'ordre que je vous ai donné. 197 00:08:01,390 --> 00:08:04,350 Il est juste une convention arbitraire, mais il est tout à fait standard. 198 00:08:04,350 --> 00:08:06,870 >> Donc, si nous regardons ce modèle trois bytes-- de laisser 199 00:08:06,870 --> 00:08:09,620 il suffit de commencer à regarder dans d'une manière compatible avec la façon dont 200 00:08:09,620 --> 00:08:12,450 d'informaticiens en général regarder et de réfléchir sur les fichiers. 201 00:08:12,450 --> 00:08:15,580 Vous pouvez certainement penser fichiers dans des 0 et des 1, et décimal, 202 00:08:15,580 --> 00:08:19,340 mais en réalité, nous avons tendance à utiliser binaire ou plus généralement hexadecimal-- 203 00:08:19,340 --> 00:08:20,760 retour de PSet 0. 204 00:08:20,760 --> 00:08:25,857 Alors permettez-moi propose que 255, 216, et 255 sont seulement ces schémas de 0 et de 1. 205 00:08:25,857 --> 00:08:28,440 Et vous pouvez le vérifier si vous vouloir faire le calcul de la Semaine 0. 206 00:08:28,440 --> 00:08:30,810 Mais, pour l'instant, simplement supposer que tel est bien correcte. 207 00:08:30,810 --> 00:08:33,850 Je viens réécrit trois virgule numéros que trois valeurs binaires. 208 00:08:33,850 --> 00:08:36,100 Maintenant, ce que je vais faire est il suffit d'ajouter un peu d'espace blanc, 209 00:08:36,100 --> 00:08:37,266 juste pour l'amour de la lisibilité. 210 00:08:37,266 --> 00:08:39,940 Et remarquez, je vais juste faire avancer les choses en dehors. 211 00:08:39,940 --> 00:08:43,090 Donc, avant, après, avant, après. 212 00:08:43,090 --> 00:08:46,180 Je ne suis rien d'autre intéressant faire que juste répandre les choses de telle sorte 213 00:08:46,180 --> 00:08:50,380 que l'avis de chaque ensemble de huit bits est maintenant deux ensembles de quatre bits. 214 00:08:50,380 --> 00:08:54,920 Ceci est utile car hexadécimal est particulièrement à la mode 215 00:08:54,920 --> 00:09:00,930 parce que chaque chiffre hexadécimal de 0 à f, ou plus précisément de 0 à 15, 216 00:09:00,930 --> 00:09:03,430 peuvent être représentés avec exactement quatre bits. 217 00:09:03,430 --> 00:09:07,960 En d'autres termes, si vous en hexadécimal veut représenter un 0, il est juste 0000, 218 00:09:07,960 --> 00:09:08,780 quatre zéros. 219 00:09:08,780 --> 00:09:13,997 Et si vous voulez représenter 15, il est 1111, qui est de quatre bits. 220 00:09:13,997 --> 00:09:16,080 Et si vous faites le calcul, si cela est le lieu de ceux, 221 00:09:16,080 --> 00:09:18,210 cet endroit est de plus de 16, que ça va donner vous-- 222 00:09:18,210 --> 00:09:19,960 plutôt que ça va to-- désolé, en binaire, 223 00:09:19,960 --> 00:09:23,660 cela va vous donner 15, les place, Twos endroit, quatre ou huit lieu. 224 00:09:23,660 --> 00:09:26,821 Donc, je vous propose que ce un ensemble de quatre bits sur la gauche 225 00:09:26,821 --> 00:09:28,070 est ce que nous allons appeler f. 226 00:09:28,070 --> 00:09:30,110 Il est le plus grand nombre que vous peut représenter avec quatre bits. 227 00:09:30,110 --> 00:09:33,300 Et nous savons déjà hexadécimal, f est la plus grande chiffres en hexadécimal. 228 00:09:33,300 --> 00:09:36,020 Nous avons une autre f il, deux de plus là-bas. 229 00:09:36,020 --> 00:09:38,980 Et pour l'instant, il suffit de prendre sur la foi que je l'ai fait le droit de maths 230 00:09:38,980 --> 00:09:41,890 et que la moitié gauche de ces bits, 1101, 231 00:09:41,890 --> 00:09:43,980 est la même chose que d en hexadécimal. 232 00:09:43,980 --> 00:09:46,490 Et la main droite, 1000, est à seulement 8. 233 00:09:46,490 --> 00:09:48,140 >> Et celui-là est facile à voir, non? 234 00:09:48,140 --> 00:09:51,670 Le 8 represents-- est juste dessous de cet endroit huit. 235 00:09:51,670 --> 00:09:56,040 Nous avons donc l'un dans la colonne de huit et rien dans les pattes, deux ou petits. 236 00:09:56,040 --> 00:09:59,830 Alors maintenant, plus classiquement, les humains ont tendance pour écrire des chiffres hexadécimaux de ce genre, 237 00:09:59,830 --> 00:10:03,000 vous squish juste leur ensemble, et puis vous les préfixe 0x. 238 00:10:03,000 --> 00:10:05,920 Cela signifie rien d'autre que un indice visuel à un human-- 239 00:10:05,920 --> 00:10:10,350 voici un value-- hexadécimal parce il pourrait ne pas en être autrement évidente. 240 00:10:10,350 --> 00:10:13,629 >> Ce qui veut dire, en définitive, le modèle de zéros et de uns, 241 00:10:13,629 --> 00:10:16,170 ou le modèle de hexadécimal chiffres équivalente que vous êtes 242 00:10:16,170 --> 00:10:18,990 va commencer à chercher dans le problème Set 4 est this-- 243 00:10:18,990 --> 00:10:22,120 et le problème Set 4 spec sera marcher vous à travers ce dans plus detail-- 244 00:10:22,120 --> 00:10:25,344 mais comme une sorte de réaliser des arcanes comme ce pourrait ressembler à première vue, 245 00:10:25,344 --> 00:10:27,010 vous allez commencer à voir ce lot. 246 00:10:27,010 --> 00:10:30,320 Et en fait, même dans GDB, la débogueur, nous avons introduit le lundi 247 00:10:30,320 --> 00:10:35,440 et Dan introduit dans PSet 3, va vous montrer souvent des valeurs hexadécimaux 248 00:10:35,440 --> 00:10:39,910 juste parce qu'ils ont tendance à être plus conventionnelle que décimale ou binaire 249 00:10:39,910 --> 00:10:41,157 dans le monde de l'informatique. 250 00:10:41,157 --> 00:10:42,490 Maintenant, nous allons mettre cela en contexte. 251 00:10:42,490 --> 00:10:48,040 Beaucoup d'entre vous souvenez peut-être de cette image ici, qui venait de quoi? 252 00:10:48,040 --> 00:10:51,240 Vista, donc même plus tôt que que Windows XP a fait ce premier. 253 00:10:51,240 --> 00:10:52,620 Alors ceci est un beau paysage. 254 00:10:52,620 --> 00:10:55,940 Et en fait, si vous fouillez online-- Je pense qu'il est un article de Wikipedia, 255 00:10:55,940 --> 00:11:00,110 dans laquelle quelqu'un est allé très étonnamment sur trouvé cet endroit dans le monde mis en place 256 00:11:00,110 --> 00:11:02,240 sa caméra dans précisément le droit place-- 257 00:11:02,240 --> 00:11:06,510 et cela apparaît aujourd'hui mais like-- il est exactement le même réglage. 258 00:11:06,510 --> 00:11:10,060 Cette image, cependant, est dans un fichier format appelé bitmap, b-m-p. 259 00:11:10,060 --> 00:11:12,910 Et nous allons prendre un super- rapide coup d'œil à ce que cela signifie. 260 00:11:12,910 --> 00:11:17,770 >> Mais bitmap est juste une façon différente de images représentant encore l'aide de pixels 261 00:11:17,770 --> 00:11:19,580 à 0 et de 1, en fin de compte. 262 00:11:19,580 --> 00:11:23,282 Mais au coup d'œil rapide, il a une signature plus intéressant 263 00:11:23,282 --> 00:11:24,490 au début du fichier. 264 00:11:24,490 --> 00:11:26,670 Il ne suffit pas de trois octets, plutôt il est 265 00:11:26,670 --> 00:11:30,770 tout un tas de modèles d'octets qui ont prédéterminée sens. 266 00:11:30,770 --> 00:11:34,490 Par exemple, quelque part dans le quelques premiers octets d'une image bitmap 267 00:11:34,490 --> 00:11:37,440 va être la taille de la l'image, la largeur de l'image, 268 00:11:37,440 --> 00:11:40,390 la hauteur de l'image, de sorte que métadonnées utiles, si vous voulez. 269 00:11:40,390 --> 00:11:43,940 Informations pratiques que Photoshop ou tout programme graphique vous utilisez 270 00:11:43,940 --> 00:11:45,180 pourrait réellement se soucier. 271 00:11:45,180 --> 00:11:47,170 >> Donc plus à ce sujet dans Problème Set 4, mais cette 272 00:11:47,170 --> 00:11:49,220 est seulement pour dire que à la fin de la journée 273 00:11:49,220 --> 00:11:52,390 tous les formats de fichiers que vous avez utilisé pour les fichiers Microsoft Word années--, 274 00:11:52,390 --> 00:11:55,820 Les fichiers Numbers, fichiers Excel, un certain nombre de formats de fichiers 275 00:11:55,820 --> 00:11:57,770 qui peut avoir une certaine extension de fichier connu 276 00:11:57,770 --> 00:12:00,130 sont seulement 0 et 1 sous le capot. 277 00:12:00,130 --> 00:12:02,970 Et les humains ont décidé ce sont les conventions, 278 00:12:02,970 --> 00:12:08,340 quels sont les modèles de 0 et de 1 représentent un fichier Word par rapport à un fichier Excel, 279 00:12:08,340 --> 00:12:10,322 par rapport à un certain nombre d'autres formats de fichiers. 280 00:12:10,322 --> 00:12:12,780 Donc, en PSet 4, vous aurez une possibilité de jouer avec cela. 281 00:12:12,780 --> 00:12:14,405 >> Mais qu'est-ce que cela signifie d'avoir une structure. 282 00:12:14,405 --> 00:12:18,012 Ceci est en fait une belle transition maintenant en C, qui ne dispose que d'un couple 283 00:12:18,012 --> 00:12:20,220 caractéristiques supplémentaires que de nous avons pas regardé encore. 284 00:12:20,220 --> 00:12:24,230 Il est un joli petit langage et l'un des les fonctionnalités intéressantes au sujet de C est une struct. 285 00:12:24,230 --> 00:12:27,300 Par exemple, si vous voulu qu'elle représente: nous allons 286 00:12:27,300 --> 00:12:33,690 dites-vous voulu avoir une variable qui représente un étudiant dans un programme. 287 00:12:33,690 --> 00:12:37,330 Peut-être que vous écriviez un cours programme d'enregistrement, ou noyau achats 288 00:12:37,330 --> 00:12:38,870 outil, ou quelque chose comme ça. 289 00:12:38,870 --> 00:12:42,922 Qu'est-ce sont des morceaux de données relatives à un étudiant qui viennent à l'esprit? 290 00:12:42,922 --> 00:12:44,880 Comme un étudiant est représenté avec quelles valeurs? 291 00:12:44,880 --> 00:12:45,732 Ouais? 292 00:12:45,732 --> 00:12:46,940 Vous avez un nom en tant qu'étudiant. 293 00:12:46,940 --> 00:12:48,900 Quoi d'autre ne possède un étudiant typique? 294 00:12:48,900 --> 00:12:49,320 >> AUDIENCE: [inaudible] 295 00:12:49,320 --> 00:12:50,200 >> DAVID J. Malan: Alors, désolé. 296 00:12:50,200 --> 00:12:50,660 >> AUDIENCE: Age. 297 00:12:50,660 --> 00:12:52,980 >> DAVID J. Malan: Un âge ou anniversaire équivalente, yep. 298 00:12:52,980 --> 00:12:53,557 Quoi d'autre? 299 00:12:53,557 --> 00:12:54,390 PUBLIC: numéro d'identification? 300 00:12:54,390 --> 00:12:57,460 DAVID J. Malan: Donc, un numéro d'identification, peut-être un numéro de téléphone, peut-être un dortoir, ou une maison, 301 00:12:57,460 --> 00:12:58,670 ou au collège, ou quelque chose comme ça. 302 00:12:58,670 --> 00:13:01,820 Un nombre quelconque d'éléments de données qui vous pourriez avoir dans votre liste de contacts 303 00:13:01,820 --> 00:13:03,890 est ce qui pourrait définir un étudiant. 304 00:13:03,890 --> 00:13:08,490 Donc, si nous voulions faire cela, dans le code, nous pourrions faire quelque chose de simple comme ça. 305 00:13:08,490 --> 00:13:15,670 Nous pourrions avoir un programme de telle sorte que a disons, int main (void). 306 00:13:15,670 --> 00:13:18,920 Et si je veux représenter un étudiant, je pourrais avoir, par exemple, 307 00:13:18,920 --> 00:13:24,330 une chaîne appelée nom pour cet étudiant, une chaîne appelée dortoir pour cet étudiant, 308 00:13:24,330 --> 00:13:26,900 peut-être un int appelé ID pour cet étudiant. 309 00:13:26,900 --> 00:13:30,840 Et parce que je suis l'aide de ficelle, je besoin de revenir en arrière et mettre en place CS50.h. 310 00:13:30,840 --> 00:13:33,300 Peut-être que je vais avoir besoin de stdio.h. 311 00:13:33,300 --> 00:13:38,190 Alors permettez-moi de faire ces préventivement et je suis va appeler cette student.c pour l'instant 312 00:13:38,190 --> 00:13:40,080 et sauver ce. 313 00:13:40,080 --> 00:13:44,206 >> Et maintenant, je peux faire quelque chose avec ces variables. 314 00:13:44,206 --> 00:13:46,830 Et nous allons juste pour écrire que comme un commentaire dans le code de pseudo, 315 00:13:46,830 --> 00:13:48,829 parce qu'il est pas intéressant ce que nous faisons pour le moment. 316 00:13:48,829 --> 00:13:51,242 OK, donc ce est un programme qui stocke en quelque sorte un étudiant. 317 00:13:51,242 --> 00:13:53,450 Qu'est-ce que je veux faire si je vouloir stocker deux étudiants? 318 00:13:53,450 --> 00:13:55,991 Donc, mon premier instinct va être tout droit, attendez une minute, 319 00:13:55,991 --> 00:14:01,920 si je dois un autre étudiant Pourquoi je ne just do nom de la chaîne 2, chaîne dortoir 2, 320 00:14:01,920 --> 00:14:04,190 int ID2. 321 00:14:04,190 --> 00:14:06,540 Et nous avons fait parti dans cette voie avant 322 00:14:06,540 --> 00:14:10,890 et ce qui était notre solution à ce qui semble à être une sorte de pâte de copie hackish 323 00:14:10,890 --> 00:14:11,555 travail ici? 324 00:14:11,555 --> 00:14:12,346 PUBLIC: Un tableau. 325 00:14:12,346 --> 00:14:13,830 DAVID J. Malan: Ouais, nous pourrions utiliser un tableau. 326 00:14:13,830 --> 00:14:15,620 Droite très rapidement devient difficile à manier. 327 00:14:15,620 --> 00:14:18,453 Vous devez trier de façon arbitraire commencer à nommer toutes ces variables. 328 00:14:18,453 --> 00:14:22,190 Et vous, l'humain, devez garder piste correspondant OK de NOM2 329 00:14:22,190 --> 00:14:25,060 avec dorm2 correspond à id2. 330 00:14:25,060 --> 00:14:26,200 Il devient tout simplement un gâchis. 331 00:14:26,200 --> 00:14:29,350 Donc, il est beaucoup plus facile, rappeler à partir il ya quelques semaines, 332 00:14:29,350 --> 00:14:34,300 juste avoir à noms appelés à cordes et peut-être nous donner trois de ceux-ci. 333 00:14:34,300 --> 00:14:36,940 Et puis peut-être que nous avons dortoirs à cordes et ont 334 00:14:36,940 --> 00:14:41,900 trois d'entre eux, ou avec une constante, int identifiants et ont trois de ceux-ci. 335 00:14:41,900 --> 00:14:45,250 Mais même maintenant cela se sent un peu bâclé, à droite. 336 00:14:45,250 --> 00:14:49,440 Nous parlons d'étudiants et encore Je suis vraiment insister sur le faible niveau 337 00:14:49,440 --> 00:14:50,470 détails d'implémentation. 338 00:14:50,470 --> 00:14:52,790 L'étudiant est un nom et un dortoir et ID. 339 00:14:52,790 --> 00:14:59,814 >> Pourquoi ne puis-je déclarer une variable appelé étudiant et l'appeler l'art. 340 00:14:59,814 --> 00:15:02,230 Et si je veux un autre étudiant, pourquoi ne pas tout simplement l'appelle t. 341 00:15:02,230 --> 00:15:05,260 Ou si je veux tout un tas des étudiants, pourquoi fais-je pas simplement 342 00:15:05,260 --> 00:15:09,740 Je dois dire que toute une classe de étudiants, et il est trois d'entre eux. 343 00:15:09,740 --> 00:15:12,470 En d'autres termes, pourquoi je ne peux pas venir avec mon propre type de données, appelé 344 00:15:12,470 --> 00:15:15,641 Les étudiants, qui est de l'intérieur un nom, est une pièce d'identité, est un dortoir, 345 00:15:15,641 --> 00:15:16,890 est un nombre quelconque d'autres domaines. 346 00:15:16,890 --> 00:15:19,030 Et il se trouve que vous peut faire exactement cela. 347 00:15:19,030 --> 00:15:21,850 >> Donc C dispose de cette fonctionnalité appelée struct. 348 00:15:21,850 --> 00:15:24,700 Voilà un dispositif de langue nous permet de faire exactement cela. 349 00:15:24,700 --> 00:15:28,370 Je vais aller de l'avant et d'ouvrir structs.h 350 00:15:28,370 --> 00:15:32,299 où nous allons voir le la définition suivante d'un étudiant. 351 00:15:32,299 --> 00:15:35,215 Il se trouve - et celui-ci est encore plus simple que celui impliquant un ID 352 00:15:35,215 --> 00:15:36,080 il y a un moment. 353 00:15:36,080 --> 00:15:39,120 Si vous voulez venir avec votre type de données maison, 354 00:15:39,120 --> 00:15:42,750 et en plus de int, et l'omble chevalier et flotter et tous ces autres qui existent, 355 00:15:42,750 --> 00:15:45,810 vous pouvez le faire par lettre écrit typedef struct, 356 00:15:45,810 --> 00:15:47,880 puis quelques accolades, l'intérieur de laquelle vous 357 00:15:47,880 --> 00:15:51,460 énumérer les variables que vous voulez associer à cette nouvelle données personnalisées 358 00:15:51,460 --> 00:15:55,670 taper comme un nom et un dortoir, et puis après les accolades 359 00:15:55,670 --> 00:15:57,860 vous donnez un nom au nouveau type de données. 360 00:15:57,860 --> 00:15:59,220 Ainsi, par exemple, étudiant. 361 00:15:59,220 --> 00:16:03,247 >> Et ce qui est bon à ce sujet maintenant est que si nous regardons le code correspondant, 362 00:16:03,247 --> 00:16:05,080 la convention, première de tous, est de mettre cette 363 00:16:05,080 --> 00:16:08,230 dans un fichier appelé quelque chose dot h, un fichier d'en-tête, que nous avons pas 364 00:16:08,230 --> 00:16:09,780 commencé à nous d'utiliser trop. 365 00:16:09,780 --> 00:16:12,120 Mais nous allons commencer en utilisant un peu maintenant. 366 00:16:12,120 --> 00:16:18,650 Et ce que nous pouvons faire avec cela, en fin de compte, dans ces quelques lignes de code 367 00:16:18,650 --> 00:16:22,130 est déclarer exactement cela type de données, un étudiant. 368 00:16:22,130 --> 00:16:23,230 Et maintenant, nous allons l'utiliser. 369 00:16:23,230 --> 00:16:27,274 >> Je vais y aller maintenant en un fichier appelé structs1.c. 370 00:16:27,274 --> 00:16:29,440 Et nous allons jeter un oeil à un quelques caractéristiques ici. 371 00:16:29,440 --> 00:16:32,250 Donc le truc ici est la plupart du temps familier, et nous allons 372 00:16:32,250 --> 00:16:35,040 revenir à ce qui est pas familiers dans un instant. 373 00:16:35,040 --> 00:16:39,880 Bien sûr, cela est y compris le mien fichier en-tête, ce qui est nouveau aussi, 374 00:16:39,880 --> 00:16:42,580 sauf pour PSet 3 où, rappel, nous avons helpers.h. 375 00:16:42,580 --> 00:16:45,150 Donc, vous pourriez rappeler helpers.h #include. 376 00:16:45,150 --> 00:16:49,381 >> Pourquoi si je utilise citations au lieu de chevrons? 377 00:16:49,381 --> 00:16:50,630 Quand dois-je choisir entre les deux? 378 00:16:50,630 --> 00:16:52,310 Presque toujours il me semble d'utiliser des chevrons. 379 00:16:52,310 --> 00:16:55,040 Et puis, tout d'un coup sur ligne six ans, je suis en utilisant des guillemets doubles. 380 00:16:55,040 --> 00:16:55,860 Pourquoi pourrait-il être? 381 00:16:55,860 --> 00:16:56,700 Ouais? 382 00:16:56,700 --> 00:16:57,725 >> AUDIENCE: [inaudible] 383 00:16:57,725 --> 00:16:59,350 DAVID J. Malan: Voilà une réelle, quoi? 384 00:16:59,350 --> 00:17:00,559 AUDIENCE: qui est dans votre IDE. 385 00:17:00,559 --> 00:17:02,475 DAVID J. Malan: Ouais, qui est dans mon IDE réelle. 386 00:17:02,475 --> 00:17:05,690 Et il ne faut pas insister sur les IDE, parce qui est juste un outil que je suis en utilisant. 387 00:17:05,690 --> 00:17:08,119 Voilà à mon actuelle répertoire, spécifiquement. 388 00:17:08,119 --> 00:17:11,647 Donc structs.h est mon propre fichier pas installé dans l'IDE, 389 00:17:11,647 --> 00:17:14,480 dans le système d'exploitation lui-même, plutôt il est dans mon répertoire courant. 390 00:17:14,480 --> 00:17:16,910 Donc, la convention est si vous voulez d'inclure votre propre fichier d'en-tête, 391 00:17:16,910 --> 00:17:18,200 il suffit d'utiliser des guillemets. 392 00:17:18,200 --> 00:17:23,290 >> Comment appelons-nous cette chose dans la ligne 8, de manière générale? 393 00:17:23,290 --> 00:17:25,200 C'est quoi? 394 00:17:25,200 --> 00:17:28,220 quelque chose #define. 395 00:17:28,220 --> 00:17:31,040 Cela représente constantes, non? 396 00:17:31,040 --> 00:17:33,140 Si vous voulez avoir un valeur dans votre programme 397 00:17:33,140 --> 00:17:35,110 que vous utilisez un ensemble tas de fois, il est 398 00:17:35,110 --> 00:17:39,330 bonne convention à tenir dehors, déclarer, avec le symbole de hachage 399 00:17:39,330 --> 00:17:43,340 définir, puis, par convention, dans tous les majuscules word-- si elle est pas 400 00:17:43,340 --> 00:17:45,320 strictement nécessaire, mais il est convention humaine 401 00:17:45,320 --> 00:17:47,210 de capitaliser constantes de sorte qu'ils sautent 402 00:17:47,210 --> 00:17:50,380 à l'espace et vous visually-- alors la valeur que vous voulez être 403 00:17:50,380 --> 00:17:52,250 équivalent du nom de cette constante. 404 00:17:52,250 --> 00:17:56,110 Aucune virgule, mais vous simplement suivre ce schéma là. 405 00:17:56,110 --> 00:17:57,770 >> Alors qu'est-ce que je fais dans ce code réel. 406 00:17:57,770 --> 00:18:00,660 Donc, nous allons jeter un oeil à le programme principal ici. 407 00:18:00,660 --> 00:18:04,080 Dans la ligne 12, parce que je ont inclus structs.h, 408 00:18:04,080 --> 00:18:06,492 Je dois maintenant magie à mon disposition un nouveau type de données. 409 00:18:06,492 --> 00:18:09,200 Je ne dois pas seulement l'accès à l'int, et char, et le flotteur, et la chaîne, 410 00:18:09,200 --> 00:18:10,060 et bleu et d'autres. 411 00:18:10,060 --> 00:18:12,470 Je dois maintenant accès à un type de données de l'étudiant. 412 00:18:12,470 --> 00:18:17,740 Donc, à la ligne 12, je suis combinant deux ideas-- un type de données personnalisé et deux, 413 00:18:17,740 --> 00:18:18,940 utilisant un tableau. 414 00:18:18,940 --> 00:18:21,700 Et donc dans ce programme si Je veux soutenir effectivement 415 00:18:21,700 --> 00:18:24,320 trois élèves différents dans mon programme, je 416 00:18:24,320 --> 00:18:30,480 peut dire simplement me donner une variable appelés étudiants, dont chacun 417 00:18:30,480 --> 00:18:32,970 est des étudiants de type, qui est mon type de données personnalisé. 418 00:18:32,970 --> 00:18:35,890 Et, en particulier, donne-moi trois de ceux dans mon tableau. 419 00:18:35,890 --> 00:18:37,750 >> Alors maintenant, que faisons-nous dans ce programme? 420 00:18:37,750 --> 00:18:40,670 Voici juste une boucle itération 0-3, parce que ce 421 00:18:40,670 --> 00:18:42,110 quelle est la valeur des étudiants est. 422 00:18:42,110 --> 00:18:44,420 Je suis juste invitant l'utilisateur me donner le nom de l'étudiant. 423 00:18:44,420 --> 00:18:48,090 Et puis dans la ligne 17, nous avoir une ligne plus souvent familier. 424 00:18:48,090 --> 00:18:50,370 Nous avons notre vieil ami GetString sur la droite. 425 00:18:50,370 --> 00:18:52,345 Et ce morceau de syntaxe est apparemment nouvelle, 426 00:18:52,345 --> 00:18:55,130 si vous ne l'avez jamais programmé en C avant, et n'a jamais utilisé les structs? 427 00:18:55,130 --> 00:18:55,510 Ouais? 428 00:18:55,510 --> 00:18:56,417 >> AUDIENCE: Le .name. 429 00:18:56,417 --> 00:18:57,500 DAVID J. Malan: Le .name. 430 00:18:57,500 --> 00:19:01,220 Mais ce ne sont pas trop d'un saut, parce que maintenant les étudiants Patte I 431 00:19:01,220 --> 00:19:02,590 vous donne l'étudiant i-ème. 432 00:19:02,590 --> 00:19:04,730 Et si vous voulez plonger à l'intérieur de cette structure, 433 00:19:04,730 --> 00:19:09,490 il suffit d'utiliser une seule période et puis le nom de la variable à l'intérieur, 434 00:19:09,490 --> 00:19:11,900 ou la propriété à l'intérieur qui vous voulez avoir accès à. 435 00:19:11,900 --> 00:19:14,816 De même, puis, si je puis l'invite utilisateur, donne-moi le dortoir de l'étudiant, 436 00:19:14,816 --> 00:19:18,390 vous pouvez stocker de façon similaire que chaîne dans la variable de dortoir à l'intérieur 437 00:19:18,390 --> 00:19:19,940 de cette structure de l'étudiant. 438 00:19:19,940 --> 00:19:21,410 >> Et maintenant, les choses deviennent un peu de fantaisie. 439 00:19:21,410 --> 00:19:24,420 Et cela va se pencher au peut-être beaucoup assez rapidement. 440 00:19:24,420 --> 00:19:27,970 Mais vous verrez ce beaucoup plus dans PSet 4, afin de laisser tout regard à lui maintenant. 441 00:19:27,970 --> 00:19:33,364 Il se trouve que dans la ligne 23 par le biais 38, que pensez-vous que je peut faire? 442 00:19:33,364 --> 00:19:35,530 Je l'ai enlevé les commentaires pour aujourd'hui, mais la version 443 00:19:35,530 --> 00:19:38,660 du code en ligne pour référence a tous les commentaires. 444 00:19:38,660 --> 00:19:40,171 Que dois-je semblent faire? 445 00:19:40,171 --> 00:19:42,530 >> AUDIENCE: Sauvegarde du fichier avec toutes les informations que l'utilisateur a entré. 446 00:19:42,530 --> 00:19:44,530 >> DAVID J. Malan: Ouais, exactement, cela est une nouvelle façon 447 00:19:44,530 --> 00:19:46,370 que nous voyons deux, une autre caractéristique de C, 448 00:19:46,370 --> 00:19:48,700 par lequel je peux créer mes propres fichiers. 449 00:19:48,700 --> 00:19:51,580 Jusqu'à présent, presque tous les programmes Vous avez écrit est apatride. 450 00:19:51,580 --> 00:19:53,334 Dès qu'il a fait courir, ça y est. 451 00:19:53,334 --> 00:19:55,000 Il n'y a pas de mémoire ou souvenir. 452 00:19:55,000 --> 00:19:56,110 Il n'y a pas fichier enregistré. 453 00:19:56,110 --> 00:19:58,120 Mais si vous ne voulez sauver entrée qui a 454 00:19:58,120 --> 00:20:02,100 passé, comme dans un jeu ou un programme comme ça, il se trouve que nous pouvons le faire. 455 00:20:02,100 --> 00:20:04,360 Et vous verrez cela plus dans PSet 4 et à la section. 456 00:20:04,360 --> 00:20:08,661 Mais cette ligne 23 essentiellement crée un fichier appelé students.csv. 457 00:20:08,661 --> 00:20:10,160 Et vous pourriez avoir vu cela avant. 458 00:20:10,160 --> 00:20:14,250 Même si vous ne l'avez jamais étudié CS avant, CSV est des variables séparées par des virgules. 459 00:20:14,250 --> 00:20:19,000 Il est comme un homme très pauvre de version d'un fichier Excel, 460 00:20:19,000 --> 00:20:22,270 ce qui signifie qu'il peut être ouvert dans Excel et en chiffres d'Apple, 461 00:20:22,270 --> 00:20:23,830 et il comporte des rangées et des colonnes. 462 00:20:23,830 --> 00:20:26,485 Mais il est pas un propriétaire format comme Microsoft ou Apple. 463 00:20:26,485 --> 00:20:29,840 Il est juste virgules séparant la valeurs que nous verrons dans un instant. 464 00:20:29,840 --> 00:20:31,010 >> Et il suffit de prendre une supposition. 465 00:20:31,010 --> 00:20:33,480 Dans la ligne 23, à la très fin, mon second argument 466 00:20:33,480 --> 00:20:37,700 à cette nouvelle fonction appelée f ouverte pour le fichier ouvert est w. 467 00:20:37,700 --> 00:20:39,430 Ce qui pourrait désigner w? 468 00:20:39,430 --> 00:20:40,022 Ouais? 469 00:20:40,022 --> 00:20:41,260 >> PUBLIC: Il vous permet d'écrire dans le fichier? 470 00:20:41,260 --> 00:20:42,630 >> DAVID J. Malan: Il permet de vous écrivez dans le fichier. 471 00:20:42,630 --> 00:20:44,810 Donc, il ya un couple de variantes que nous pouvons brancher ici. 472 00:20:44,810 --> 00:20:47,184 Mais si vous voulez juste lire le fichier, qui est de regarder ce 473 00:20:47,184 --> 00:20:50,010 et le lire dans la mémoire, vous il suffit d'utiliser entre guillemets "r". 474 00:20:50,010 --> 00:20:53,110 Si vous voulez écrire à la fichier, vous utilisez entre guillemets "w". 475 00:20:53,110 --> 00:20:55,190 Il ya également ajouter et un couple d'autres choses 476 00:20:55,190 --> 00:20:57,356 si vous souhaitez modifier des fichiers existants. 477 00:20:57,356 --> 00:21:00,480 Maintenant, nous allons continuer à voir cette chose, alors nous reviendrons à la ligne 24. 478 00:21:00,480 --> 00:21:02,640 NULL, il se trouve, est une valeur spéciale qui 479 00:21:02,640 --> 00:21:06,070 peut être retourné par certaines fonctions si quelque chose est allé wrong-- 480 00:21:06,070 --> 00:21:08,490 si ne pas le fichier existe, si vous avez plus de mémoire, 481 00:21:08,490 --> 00:21:09,620 ou un tas d'autres erreurs. 482 00:21:09,620 --> 00:21:13,470 Mais pour l'instant, supposons simplement que cette est la vérification d'erreur juste conventionnelle. 483 00:21:13,470 --> 00:21:17,090 Ici, à la ligne 26, je suis itération 0-3 sur tous mes étudiants. 484 00:21:17,090 --> 00:21:20,470 Et cela est une sorte de tri d'une nouvelle fonction, fprintf, 485 00:21:20,470 --> 00:21:21,460 mais juste prendre une proposition. 486 00:21:21,460 --> 00:21:24,370 Si printf est juste Imprimer une chaîne formatée, 487 00:21:24,370 --> 00:21:26,507 ce qui ne signifie probablement fprintf? 488 00:21:26,507 --> 00:21:27,590 AUDIENCE: Imprimer dans un fichier. 489 00:21:27,590 --> 00:21:29,290 DAVID J. Malan: Imprimer une chaîne formatée dans un fichier. 490 00:21:29,290 --> 00:21:31,180 Voilà ce que l'supplémentaires des moyens de f est un fichier. 491 00:21:31,180 --> 00:21:36,420 Et le nouveau premier argument doit être la variable qui représente votre fichier. 492 00:21:36,420 --> 00:21:38,866 Ensuite, nous avons juste un format chaîne comme printf. 493 00:21:38,866 --> 00:21:40,740 Et même si cette la syntaxe est nouveau, ce juste 494 00:21:40,740 --> 00:21:44,610 des moyens de brancher le nom de l'étudiant, plug-in de la résidence étudiante, puis 495 00:21:44,610 --> 00:21:47,160 avec fclose, fermez le fichier. 496 00:21:47,160 --> 00:21:49,730 Et puis lastly-- cela est nouveau et nous reviendrons à cette 497 00:21:49,730 --> 00:21:53,240 avant long-- Je libérant l'étudiant pour des raisons 498 00:21:53,240 --> 00:21:54,860 qui est arrivé là-haut. 499 00:21:54,860 --> 00:21:56,820 Mais nous reviendrons à celle d'avant long-- 500 00:21:56,820 --> 00:21:59,820 qui est à cause de la façon dont est GetString travailler effectivement sous le capot. 501 00:21:59,820 --> 00:22:01,280 >> Donc, nous allons jeter un coup d'oeil ici. 502 00:22:01,280 --> 00:22:04,380 Si je tape ls dans mon répertoire, remarque que je ne fais pas 503 00:22:04,380 --> 00:22:09,360 avoir un fichier appelé students.csv, tout simplement pas là, ne pas exister. 504 00:22:09,360 --> 00:22:14,965 Donc, si je compile maintenant ce programme, faire structs-1,. / structs-1, 505 00:22:14,965 --> 00:22:20,570 et je vais aller de l'avant et tapez Andi, qui vit à Berkeley à Yale. 506 00:22:20,570 --> 00:22:26,350 Nous allons avoir Rob qui vit en Thayer ces jours. 507 00:22:26,350 --> 00:22:33,760 Et nous allons venir avec où est, je pense, Maria est à Mather, 508 00:22:33,760 --> 00:22:35,100 si je me suis souvenu correctement. 509 00:22:35,100 --> 00:22:36,460 >> Donc, rien ne semble se produire. 510 00:22:36,460 --> 00:22:40,680 Mais si je tape ls maintenant, il est students.csv. 511 00:22:40,680 --> 00:22:43,080 Allons de l'avant et students.csv ouverte. 512 00:22:43,080 --> 00:22:46,050 Ceci est encore une très format de fichier léger. 513 00:22:46,050 --> 00:22:49,570 Mais je suis tout simplement adopté une convention que je ai deux lignes et de colonnes ici. 514 00:22:49,570 --> 00:22:52,020 La première colonne est premiers noms des personnes. 515 00:22:52,020 --> 00:22:55,740 La deuxième colonne est l'élève de dortoir, ou au collège, ou une maison, ou autres joyeusetés. 516 00:22:55,740 --> 00:22:57,900 Et maintenant, je suis sauvé cette de façon permanente dans un fichier. 517 00:22:57,900 --> 00:22:59,280 >> Donc, il est pas tout à fait intéressant. 518 00:22:59,280 --> 00:23:02,980 Mais ceci est juste un tremplin maintenant d'être capable de persister informations 519 00:23:02,980 --> 00:23:04,040 de façon permanente. 520 00:23:04,040 --> 00:23:08,340 Voyons donc maintenant ce que nous pouvons faire de ces et d'autres caractéristiques. 521 00:23:08,340 --> 00:23:10,729 Mais d'abord, des questions? 522 00:23:10,729 --> 00:23:12,145 Ce fut beaucoup, et qui a été rapide. 523 00:23:12,145 --> 00:23:16,131 Mais vous verrez beaucoup plus PSet 4, ainsi. 524 00:23:16,131 --> 00:23:16,630 Ouais? 525 00:23:16,630 --> 00:23:19,360 >> Public: Y at-il un moyen de continuer à ajouter des noms à ce fichier? 526 00:23:19,360 --> 00:23:19,880 >> DAVID J. Malan: Bonne question. 527 00:23:19,880 --> 00:23:21,800 Y at-il un moyen de continuer d'ajouter des noms à ce fichier? 528 00:23:21,800 --> 00:23:22,340 Oui. 529 00:23:22,340 --> 00:23:24,630 Et, en fait, si vous finissez jusqu'à la réouverture du dossier, 530 00:23:24,630 --> 00:23:26,780 vous devez utiliser devis Ils ont dit «un» pour l'ajout, 531 00:23:26,780 --> 00:23:31,090 qui vient ajouter une nouvelle ligne, un nouvelle ligne encore et encore, exactement. 532 00:23:31,090 --> 00:23:32,010 Bonne question. 533 00:23:32,010 --> 00:23:32,950 D'autres questions? 534 00:23:32,950 --> 00:23:33,450 Ouais? 535 00:23:33,450 --> 00:23:35,580 Public: Si vous avez exécuté le programme à nouveau en ce moment, 536 00:23:35,580 --> 00:23:38,000 serait-il continuer à ajouter des noms à la fichier ou serait-il ouvrir un nouveau fichier? 537 00:23:38,000 --> 00:23:38,740 >> DAVID J. Malan: Ah, bonne question. 538 00:23:38,740 --> 00:23:41,448 Si vous avez exécuté le programme à nouveau droit maintenant, peut-être tapé dans de nouveaux noms, 539 00:23:41,448 --> 00:23:44,820 serait-il ajouter au fichier ou écraser le fichier? 540 00:23:44,820 --> 00:23:47,420 Celui-ci, parce que je suis ne pas utiliser le mode append. 541 00:23:47,420 --> 00:23:49,930 Et parce que je suis aveuglément ouvrir le fichier pour l'écriture, 542 00:23:49,930 --> 00:23:51,310 il va juste pour écraser le fichier. 543 00:23:51,310 --> 00:23:54,570 Donc, je voudrais en effet besoin de faire est de joindre, si je veux avoir fait un long terme 544 00:23:54,570 --> 00:23:55,350 base de données. 545 00:23:55,350 --> 00:23:58,220 >> Maintenant CSV est utile, franchement, même car, comme si vous êtes writing-- 546 00:23:58,220 --> 00:24:00,100 et nous finirons par voir cette plus tard dans le semestre lorsque 547 00:24:00,100 --> 00:24:01,455 nous utilisons CSVs à d'autres fins. 548 00:24:01,455 --> 00:24:04,920 Si vous souhaitez stocker toutes les personnes qui se sont inscrits pour un événement, 549 00:24:04,920 --> 00:24:07,420 ou signé pour votre étudiant groupe, ou quelque chose comme ça, 550 00:24:07,420 --> 00:24:10,330 stocker les données dans ce genre le format est super pratique. 551 00:24:10,330 --> 00:24:12,580 Parce que littéralement, si je étaient pour télécharger ce fichier. 552 00:24:12,580 --> 00:24:14,540 Je pourrais double-- et nous allons effectivement essayer cette 553 00:24:14,540 --> 00:24:16,720 si je dois Excel ou Numbers ici. 554 00:24:16,720 --> 00:24:19,130 >> Je vais clic-droit ou Ctrl-clic mon dossier. 555 00:24:19,130 --> 00:24:20,020 Oups. 556 00:24:20,020 --> 00:24:21,830 Faites un clic droit ou Ctrl-clic mon dossier. 557 00:24:21,830 --> 00:24:24,960 Allons, ma souris ne coopère pas. 558 00:24:24,960 --> 00:24:32,694 Download-- je vais télécharger tous les fichiers ici si 559 00:24:32,694 --> 00:24:33,860 juste pour que je peux saisir celui-ci. 560 00:24:33,860 --> 00:24:37,850 Et nous allons voir si cela fonctionne students.csv-- première fois 561 00:24:37,850 --> 00:24:39,310 Je ai activé. 562 00:24:39,310 --> 00:24:41,360 Maintenant, ils veulent voir mes contacts. 563 00:24:41,360 --> 00:24:44,310 Maintenant, je dois enregistrer. 564 00:24:44,310 --> 00:24:47,620 Voyez comment il est facile à utiliser CSV? 565 00:24:47,620 --> 00:24:50,840 Oui, le garder à jour. 566 00:24:50,840 --> 00:24:52,375 OK, maintenant nous sommes prêts pour la classe. 567 00:24:52,375 --> 00:24:58,750 568 00:24:58,750 --> 00:25:00,370 OK, oh, ce qui est nouveau? 569 00:25:00,370 --> 00:25:02,920 OK, fermez. 570 00:25:02,920 --> 00:25:04,750 Ce fut magique. 571 00:25:04,750 --> 00:25:07,280 OK, maintenant, nous devons mettre à jour. 572 00:25:07,280 --> 00:25:10,890 Et maintenant, il a oublié ce fichier I ouvert à l'origine, 573 00:25:10,890 --> 00:25:13,090 mais ce qu'il y A-- nous allons. 574 00:25:13,090 --> 00:25:16,341 OK, alors maintenant nous avons un fichier Excel. 575 00:25:16,341 --> 00:25:18,290 Merci. 576 00:25:18,290 --> 00:25:20,764 >> OK, donc ce que je faisais était la partie facile. 577 00:25:20,764 --> 00:25:23,930 Bien sûr, je pourrais avoir pré-installé Excel ou Numbers, ou quel que soit le programme. 578 00:25:23,930 --> 00:25:25,846 Mais cela est agréable, parce maintenant je peux manipuler 579 00:25:25,846 --> 00:25:28,090 les données dans un format standard. 580 00:25:28,090 --> 00:25:30,294 >> Le contexte Alors maintenant, laissez- passer à l'endroit où nous nous sommes quittés 581 00:25:30,294 --> 00:25:32,710 la dernière fois, qui devait commencer à décoller les roues de formation. 582 00:25:32,710 --> 00:25:34,543 Mais d'abord, vous ne l'avez pas voir ce déjeuner tôt 583 00:25:34,543 --> 00:25:38,150 est de nouveau qui se passe ici à feu et à Ice à Cambridge, Sitar à New Haven. 584 00:25:38,150 --> 00:25:43,150 Inscrivez-vous sur le site CS50s ASAP à rejoindre les étudiants et le personnel CS50. 585 00:25:43,150 --> 00:25:46,090 >> Nous avons donc pris des roues de formation hors le lundi comme follows-- 586 00:25:46,090 --> 00:25:49,120 chaîne a été déclarée dans CS50s bibliothèque pendant un certain temps. 587 00:25:49,120 --> 00:25:52,650 Et il est bon, car elle permet nous parlons des variables comme étant 588 00:25:52,650 --> 00:25:54,660 mots et des phrases complètes et plus encore. 589 00:25:54,660 --> 00:25:56,710 Mais il se trouve chaîne ne existe pas. 590 00:25:56,710 --> 00:26:00,200 Cela est juste un synonyme, ou un alias, que nous avons créé quelque chose qui 591 00:26:00,200 --> 00:26:03,780 est en fait un peu plus technique appelle un char *. 592 00:26:03,780 --> 00:26:07,900 >> Et en effet, nous avons vu un exemple d'un programme le lundi 593 00:26:07,900 --> 00:26:11,200 qui ne se comportent pas tout à fait ce que nous attendions. 594 00:26:11,200 --> 00:26:13,630 Ce fut le fichier, comparez-0. 595 00:26:13,630 --> 00:26:17,910 Et rappelons que compare-0, si Je recompile le programme de lundi 596 00:26:17,910 --> 00:26:22,670 et exécutez-le comparer 0 et tapez maman dans minuscules, et maman en minuscules nouveau. 597 00:26:22,670 --> 00:26:25,320 Le programme insisté pour que je taper des choses différentes, 598 00:26:25,320 --> 00:26:29,210 même si maman, tout en minuscules, est identique visuellement. 599 00:26:29,210 --> 00:26:31,990 Alors quelle est la réponse courte pourquoi l'ordinateur pense 600 00:26:31,990 --> 00:26:34,500 ces deux chaînes sont différentes? 601 00:26:34,500 --> 00:26:35,250 Ouais? 602 00:26:35,250 --> 00:26:36,534 >> AUDIENCE: [inaudible] 603 00:26:36,534 --> 00:26:37,450 DAVID J. Malan: Droit. 604 00:26:37,450 --> 00:26:39,600 Alors, maman, la première fois Je tape dedans, est d'être 605 00:26:39,600 --> 00:26:42,710 stocké quelque part dans mon ordinateur de mémoire mais dans un emplacement différent 606 00:26:42,710 --> 00:26:44,690 que la deuxième fois que je tape dans maman. 607 00:26:44,690 --> 00:26:46,580 Maintenant, il pourrait certainement être optimisé. 608 00:26:46,580 --> 00:26:49,205 L'ordinateur peut être intelligent et réaliser ces deux chaînes, hey, 609 00:26:49,205 --> 00:26:49,954 ils sont identiques. 610 00:26:49,954 --> 00:26:51,520 Permettez-moi de ne pas redondante stocker. 611 00:26:51,520 --> 00:26:54,229 Mais les ordinateurs ne font pas cela l'optimisation, sauf si vous leur dire de. 612 00:26:54,229 --> 00:26:56,061 Donc, par défaut, ils sont tout va finir 613 00:26:56,061 --> 00:26:57,670 à deux endroits différents dans la mémoire. 614 00:26:57,670 --> 00:27:01,570 Et pour être plus clair, quand nous avons comparé les deux chaînes, 615 00:27:01,570 --> 00:27:03,950 Le premier a été appelé S, la seconde a été appelé 616 00:27:03,950 --> 00:27:08,530 t, ce qui a été spécifiquement je comparer ici sur la ligne 13? 617 00:27:08,530 --> 00:27:09,494 Ouais. 618 00:27:09,494 --> 00:27:12,390 >> PUBLIC: Il est l'endroit dans la mémoire la variable qui pointera vers. 619 00:27:12,390 --> 00:27:14,900 >> DAVID J. Malan: Exactement, je était comparant la place dans la mémoire 620 00:27:14,900 --> 00:27:16,300 que ces variables souligné. 621 00:27:16,300 --> 00:27:20,560 Donc spécifiquement, si maman était à nombre d'octets 1 et 2, et 3, 622 00:27:20,560 --> 00:27:24,020 et 4-- souviens parce que la barre oblique inverse 0 doit être tout le chemin à la fin. 623 00:27:24,020 --> 00:27:29,420 Et l'autre instance de maman, m-o-m, était à l'adresse 10, 11, 12, et 13. 624 00:27:29,420 --> 00:27:33,100 Je comparais 1, cette adresse, cet emplacement en mémoire, 625 00:27:33,100 --> 00:27:35,160 contre 10, ce qui est évidemment pas les mêmes. 626 00:27:35,160 --> 00:27:36,260 1 est pas 10. 627 00:27:36,260 --> 00:27:39,620 >> Donc, ce qui est agréable dans il est assez simple. 628 00:27:39,620 --> 00:27:42,870 Mais il est problématique dans la mesure où nous ne pouvons pas sembler pour comparer des chaînes. 629 00:27:42,870 --> 00:27:44,930 Donc fundamentally-- et à ce faible niveau, 630 00:27:44,930 --> 00:27:47,300 si vous vouliez mettre en œuvre un programme pour comparer 631 00:27:47,300 --> 00:27:50,270 deux mots distincts que le l'utilisateur a tapé dans la qualité, 632 00:27:50,270 --> 00:27:53,944 ils font la queue pour les ombles char, simplement en termes généraux, 633 00:27:53,944 --> 00:27:55,360 qu'est-ce que nous devons faire, apparemment? 634 00:27:55,360 --> 00:27:57,940 Il ne suffit pas juste regarder ces deux adresses. 635 00:27:57,940 --> 00:27:58,860 Que devons-nous faire? 636 00:27:58,860 --> 00:27:59,360 Ouais? 637 00:27:59,360 --> 00:28:01,120 >> AUDIENCE: Itération la chaîne [inaudible]. 638 00:28:01,120 --> 00:28:02,600 >> DAVID J. Malan: Ouais, nous allons parcourir la chaîne. 639 00:28:02,600 --> 00:28:05,808 Nous allons utiliser une boucle for, une boucle while, ou tout ce que vous êtes plus à l'aise. 640 00:28:05,808 --> 00:28:08,840 Et si nous avons deux chaînes quelque part en mémoire, regardons chacun de 641 00:28:08,840 --> 00:28:11,770 premier caractère, chaque seconde est caractère, puis troisième et quatrième, 642 00:28:11,770 --> 00:28:15,206 et le cinquième, jusqu'à ce que nous a frappé quelle valeur sentinelle spéciale? 643 00:28:15,206 --> 00:28:16,080 AUDIENCE: [inaudible] 644 00:28:16,080 --> 00:28:18,800 DAVID J. Malan: Ouais, la barre oblique inverse zéro, à quel point dans les deux cordes 645 00:28:18,800 --> 00:28:20,100 nous pouvons décider que voilà. 646 00:28:20,100 --> 00:28:21,970 Avons-nous identifié tous les personnages? 647 00:28:21,970 --> 00:28:22,990 Si non, return false. 648 00:28:22,990 --> 00:28:24,770 Si oui, retourner vrai. 649 00:28:24,770 --> 00:28:28,800 Et pour que est exactement ce que cette version du programme comparer-1.c fait. 650 00:28:28,800 --> 00:28:31,677 Elle est identique à ce que l'on regardé lundi sauf que je l'ai 651 00:28:31,677 --> 00:28:34,760 débarrassé du mot string-- si qui n'a pas impact-- fonctionnelle tout 652 00:28:34,760 --> 00:28:37,450 Je fais maintenant est de retirer des roues de formation visuels, 653 00:28:37,450 --> 00:28:40,880 mais pour voir clairement que s et t sont des adresses. 654 00:28:40,880 --> 00:28:43,020 Et qui est ce que l'étoile, l'astérisque, représente 655 00:28:43,020 --> 00:28:46,690 est une adresse, autrement connu techniquement plus comme un pointeur. 656 00:28:46,690 --> 00:28:49,880 >> Alors, quand je déclare sur s ligne 9 et dire char * s, 657 00:28:49,880 --> 00:28:52,160 cela ne signifie pas me donner une chaîne. 658 00:28:52,160 --> 00:28:56,360 Cela signifie que me donner une variable dont la but dans la vie est de stocker une adresse. 659 00:28:56,360 --> 00:29:00,400 Parce que je suis sur le point de mettre la adresse d'une chaîne en elle. 660 00:29:00,400 --> 00:29:03,500 Et en effet, GetString, soit clair, ne retourne pas une chaîne. 661 00:29:03,500 --> 00:29:06,110 Il ne renvoie pas maman barre oblique inverse zéro, en soi. 662 00:29:06,110 --> 00:29:10,005 Ce qui ne GetString spécifiquement et de revenir précisément? 663 00:29:10,005 --> 00:29:10,880 AUDIENCE: [inaudible] 664 00:29:10,880 --> 00:29:14,080 DAVID J. Malan: Une adresse, la l'adresse du premier caractère 665 00:29:14,080 --> 00:29:16,070 dans une chaîne de caractères qu'il a obtenu. 666 00:29:16,070 --> 00:29:19,250 Et maintenant nous voyons un mot clé spécial à nouveau. 667 00:29:19,250 --> 00:29:20,640 Et, je faisais allusion tout à l'heure. 668 00:29:20,640 --> 00:29:23,620 Cela va être bon convention que nous verrons encore et encore maintenant. 669 00:29:23,620 --> 00:29:27,540 Je vérifie pour vous assurer que s est pas nulle et t est pas nul. 670 00:29:27,540 --> 00:29:30,100 Parce que la base de mon vraiment mention rapide plus tôt, 671 00:29:30,100 --> 00:29:35,510 ce qui pourrait signifier si GetString retourne pas une adresse, mais N-U-L-L, ce qui est nouveau, 672 00:29:35,510 --> 00:29:36,990 une valeur particulière? 673 00:29:36,990 --> 00:29:37,890 >> AUDIENCE: Erreur. 674 00:29:37,890 --> 00:29:38,600 >> DAVID J. Malan: Il ya une erreur. 675 00:29:38,600 --> 00:29:39,550 Quelque chose a mal tourné. 676 00:29:39,550 --> 00:29:41,341 Et ce qui généralement qui pourrait se produire, en particulier 677 00:29:41,341 --> 00:29:45,162 avec strings-- qui pourrait être de longueur inconnue dans advance-- 678 00:29:45,162 --> 00:29:46,870 peut-être les ordinateurs » de mémoire, peut-être 679 00:29:46,870 --> 00:29:49,280 vous avez tapé dans un tel à long mot ou une phrase 680 00:29:49,280 --> 00:29:51,880 ou collé une énorme essai il ya juste pas assez de mémoire. 681 00:29:51,880 --> 00:29:55,340 Et donc GetString ne peut pas revenir l'adresse de la chose, 682 00:29:55,340 --> 00:29:56,620 si elle retourne juste rien. 683 00:29:56,620 --> 00:30:00,580 Et il dit qu'une erreur est arrivé en retournant la valeur spéciale NULL. 684 00:30:00,580 --> 00:30:02,890 Il est l'adresse zéro, pour ainsi dire. 685 00:30:02,890 --> 00:30:06,157 >> Maintenant, il se trouve C est livré avec un fonction qui fait que itération. 686 00:30:06,157 --> 00:30:09,240 Nous ne devons pas mettre en œuvre ce avec une boucle ou une boucle while nous-mêmes. 687 00:30:09,240 --> 00:30:11,150 Nous pouvons utiliser une fonction, appelé succinctement, 688 00:30:11,150 --> 00:30:15,400 remuer échantillon, ou la chaîne de comparer, dont but dans la vie est de faire exactement cela. 689 00:30:15,400 --> 00:30:19,990 Vous lui donnez deux pointeurs, deux adresses, et il ira à ces adresses 690 00:30:19,990 --> 00:30:23,130 et ensuite comparer lettre pour lettre pour lettre pour la qualité, 691 00:30:23,130 --> 00:30:26,610 arrêter que lorsque ce qui est vrai? 692 00:30:26,610 --> 00:30:31,540 Lorsque intuitivement devrait remuer maquette arrêt de son itération, juste pour être clair? 693 00:30:31,540 --> 00:30:35,400 Quand il frappe une barre oblique inverse 0 dans les deux ficelle, à quel point elle peut décider 694 00:30:35,400 --> 00:30:38,910 a tout assorti, ou a t-il eu une différence? 695 00:30:38,910 --> 00:30:42,740 >> Donc, si nous courons cela maintenant et essayer notre petit jeu de capitalisation, 696 00:30:42,740 --> 00:30:49,260 alors assurez-1 comparer, ./compare-1, et taper en minuscules maman deux fois. 697 00:30:49,260 --> 00:30:50,560 Maintenant, il est la même chose. 698 00:30:50,560 --> 00:30:54,080 Et si je le fais à nouveau avec minuscules et alors peut-être en majuscules. 699 00:30:54,080 --> 00:30:56,720 Maintenant, il distingue bien entre majuscules et minuscules. 700 00:30:56,720 --> 00:31:00,440 Donc, pas si difficile ou magique, mais il ne explique maintenant 701 00:31:00,440 --> 00:31:03,140 ce qui se passe sous le capot. 702 00:31:03,140 --> 00:31:07,640 >> Alors que pouvons-nous extraire de ce genre de leçon? 703 00:31:07,640 --> 00:31:08,980 Donc, nous allons jeter un oeil à ce. 704 00:31:08,980 --> 00:31:15,380 Je vais aller de l'avant et écrire une programme rapide ici appelé copie-0. 705 00:31:15,380 --> 00:31:21,594 Et maintenant, nous allons aller de l'avant et fait Faisons this-- avec copie-0, 706 00:31:21,594 --> 00:31:23,010 jetez un oeil à ce que je suis arrivé ici. 707 00:31:23,010 --> 00:31:24,712 Je dis d'abord l'utilisateur, dire quelque chose. 708 00:31:24,712 --> 00:31:26,420 Puis-je obtenir une chaîne et je stocké dans s. 709 00:31:26,420 --> 00:31:29,810 Puis-je vérifier si s est égal à est égal à NULL, il suffit de retourner 1. 710 00:31:29,810 --> 00:31:31,590 Donc, ceci est juste un contrôle d'erreur standard. 711 00:31:31,590 --> 00:31:33,112 Rien d'intéressant est arrivé. 712 00:31:33,112 --> 00:31:36,320 Et en fait, si nous nous débarrassons de l'erreur vérifier, cela ressemble Code semaine 1 713 00:31:36,320 --> 00:31:36,985 en ce moment. 714 00:31:36,985 --> 00:31:39,110 Mais je l'ai commencé à obtenir un peu mieux à ce sujet. 715 00:31:39,110 --> 00:31:43,340 >> Or, dans la ligne 16, il ya une semaine, peut-être Il ya même un jour de quelques minutes ou, 716 00:31:43,340 --> 00:31:46,720 vous pourriez dire la ligne 16 est la création d'une variable appelée t 717 00:31:46,720 --> 00:31:48,219 et la copie s en elle. 718 00:31:48,219 --> 00:31:50,010 Et voilà une parfaite livraison raisonnable. 719 00:31:50,010 --> 00:31:51,560 Mais être plus précis maintenant. 720 00:31:51,560 --> 00:31:54,190 Qu'est-ce qui se passe dans la ligne 16? 721 00:31:54,190 --> 00:31:56,170 Qu'est-ce qui se copié de droite à gauche? 722 00:31:56,170 --> 00:31:56,669 Ouais? 723 00:31:56,669 --> 00:31:58,490 Public: Est-t obtient une adresse de s? 724 00:31:58,490 --> 00:32:01,220 >> DAVID J. Malan: Exactement, t est d'obtenir l'adresse de l'art. 725 00:32:01,220 --> 00:32:05,170 Donc, pour être clair maintenant, si je vais Retour à cet exemple plus tôt 726 00:32:05,170 --> 00:32:08,520 et je tirerai la chose que je l'ai tapé. 727 00:32:08,520 --> 00:32:11,640 Et ce que je l'ai tapé in-- voici s, et ici 728 00:32:11,640 --> 00:32:15,830 est ce que je l'ai tapé dans quelque part dans mémoire, maman, puis une barre oblique inverse 729 00:32:15,830 --> 00:32:17,840 0 qui est ajouté pour moi. 730 00:32:17,840 --> 00:32:23,060 Ce que je stockées ici, rappeler, cette situation est à 1, 2, 3, 4, 731 00:32:23,060 --> 00:32:24,655 ceci est ce qui est actuellement à l'art. 732 00:32:24,655 --> 00:32:29,220 Donc, si sur la ligne 16, je dis me donner une autre variable appelée t et magasin 733 00:32:29,220 --> 00:32:33,590 dans à la valeur de s, ce qui est stockée ici ne sera pas maman 734 00:32:33,590 --> 00:32:35,480 mais plutôt juste le numéro 1. 735 00:32:35,480 --> 00:32:38,520 >> Donc, si nous regardons de l'avant dans ce programme maintenant, ce qui va se passer? 736 00:32:38,520 --> 00:32:40,690 Donc, notez qu'il ya cette fonction vous pourriez 737 00:32:40,690 --> 00:32:44,410 ont utilisé ce il ya quelque temps pour César, ou Vigenère, ou peut-être pas du tout. 738 00:32:44,410 --> 00:32:48,170 Je revendique mon printf, je suis va tirer la copie t. 739 00:32:48,170 --> 00:32:51,616 D'abord dans la ligne 19, la santé mentale rapide vérifier, chèques strlen la longueur de t. 740 00:32:51,616 --> 00:32:53,740 Parce que je ne veux pas essayer de tirer quelque chose de 741 00:32:53,740 --> 00:32:55,104 si il n'y a pas de chaîne il. 742 00:32:55,104 --> 00:32:57,520 Si l'utilisateur vient de frapper Entrez, il n'y a rien à tirer. 743 00:32:57,520 --> 00:33:01,100 Donc, je ne veux pas faire la ligne 21. 744 00:33:01,100 --> 00:33:05,758 Donc, la ligne 21 est en capitalisant lettre qui, apparemment, en t? 745 00:33:05,758 --> 00:33:06,514 >> AUDIENCE: m? 746 00:33:06,514 --> 00:33:08,722 DAVID J. Malan: Il semble comme il est la copie lequel? 747 00:33:08,722 --> 00:33:09,486 AUDIENCE: m. 748 00:33:09,486 --> 00:33:10,450 DAVID J. Malan: Euh, m. 749 00:33:10,450 --> 00:33:12,685 OK, donc la première m, parce que je suis un avis 750 00:33:12,685 --> 00:33:14,935 passant à ToUpper, qui si vous avez jamais vu, il est 751 00:33:14,935 --> 00:33:16,980 juste une fonction capitaliser à son entrée. 752 00:33:16,980 --> 00:33:20,240 t support zéro signifie donner moi le caractère zéro de t. 753 00:33:20,240 --> 00:33:22,550 Et Alors, comment cela changement d'image, pour être clair? 754 00:33:22,550 --> 00:33:25,490 755 00:33:25,490 --> 00:33:29,160 Ce qui doit être réécrit ou modifié par rapport à s et t et maman 756 00:33:29,160 --> 00:33:30,097 zéro barre oblique inverse. 757 00:33:30,097 --> 00:33:31,470 >> AUDIENCE: [inaudible] 758 00:33:31,470 --> 00:33:34,030 >> DAVID J. Malan: Ouais, donc celui-là tout simplement 759 00:33:34,030 --> 00:33:40,860 a besoin d'obtenir changé to-- fixer this-- a besoin d'obtenir changé à un M majuscule. 760 00:33:40,860 --> 00:33:44,330 Mais maintenant, regardez plus tard dans la programme, si je imprimer 761 00:33:44,330 --> 00:33:49,800 s et t que je nettoie ici, de regarder ce qui est va se passer imprimer s et t. 762 00:33:49,800 --> 00:33:54,310 Donc, assurez-copie-0, ./copy-0. 763 00:33:54,310 --> 00:33:57,140 Laissez-moi aller de l'avant et tape dans MOM en minuscules. 764 00:33:57,140 --> 00:34:00,140 Remarquez l'original et la copie ont été capitalisés. 765 00:34:00,140 --> 00:34:00,850 Pourquoi? 766 00:34:00,850 --> 00:34:04,431 Eh bien, s et t sont tous deux pointent vers, si vous voulez, le même bloc de mémoire. 767 00:34:04,431 --> 00:34:06,930 Et franchement, cela devient uninteresting-- vraiment le fait 768 00:34:06,930 --> 00:34:09,150 que nous utilisons l'adresse zéro ici. 769 00:34:09,150 --> 00:34:11,719 Je veux dire, je ne me soucie pas vraiment où truc est dans la mémoire. 770 00:34:11,719 --> 00:34:13,550 Désolé je effacer un peu trop. 771 00:34:13,550 --> 00:34:15,674 Mais je ne me soucie pas vraiment où les choses sont en mémoire. 772 00:34:15,674 --> 00:34:18,510 Et donc, en effet ce que les programmeurs ont tendance à penser 773 00:34:18,510 --> 00:34:21,080 est que lorsque vous parlez une adresse ou un pointeur, 774 00:34:21,080 --> 00:34:22,679 qui se soucie où il est dans la mémoire. 775 00:34:22,679 --> 00:34:24,989 Je ne me soucie pas si il est au octet ou un milliard. 776 00:34:24,989 --> 00:34:27,920 Je me soucie simplement que cette variable est efficacement 777 00:34:27,920 --> 00:34:29,620 pointant à ce morceau de mémoire. 778 00:34:29,620 --> 00:34:33,350 Et donc, désormais, plutôt que de chicane sur des adresses mémoire arbitraires, nous allons 779 00:34:33,350 --> 00:34:36,710 il suffit de commencer à tirer des pointeurs en tant que pointeurs, comme des flèches. 780 00:34:36,710 --> 00:34:39,340 Donc, ce que S et T sont vraiment, selon ce programme, 781 00:34:39,340 --> 00:34:42,130 en raison de la façon dont je créé t, il est à seulement deux variables distinctes 782 00:34:42,130 --> 00:34:43,840 pointant dans le même bloc de mémoire. 783 00:34:43,840 --> 00:34:45,215 Et nous ne nous soucions pas où ils sont. 784 00:34:45,215 --> 00:34:47,130 Donc, nous pouvons abstraire ce détail. 785 00:34:47,130 --> 00:34:48,780 >> Alors, comment puis-je résoudre ce problème? 786 00:34:48,780 --> 00:34:54,120 Si je veux écrire une version de la copie programme qui en fait des copies de la chaîne 787 00:34:54,120 --> 00:34:56,840 et capitalise seulement le copie, juste intuitivement, 788 00:34:56,840 --> 00:34:59,766 ce que ça doit être un ingrédient à notre solution? 789 00:34:59,766 --> 00:35:00,640 AUDIENCE: [inaudible] 790 00:35:00,640 --> 00:35:01,420 DAVID J. Malan: Nous avons besoin de quoi? 791 00:35:01,420 --> 00:35:01,820 AUDIENCE: Chunk de mémoire. 792 00:35:01,820 --> 00:35:03,280 DAVID J. Malan: Nous devons une autre partie de la mémoire, non? 793 00:35:03,280 --> 00:35:05,360 Nous ne savons pas comment faire encore, nécessairement. 794 00:35:05,360 --> 00:35:11,330 Mais je sorte de besoin que cela se produise de manière que la mère d'origine en minuscules 795 00:35:11,330 --> 00:35:14,170 se retrouve dans ce morceau de mémoire supplémentaire. 796 00:35:14,170 --> 00:35:19,770 Et puis quand je change la copie, je ne veulent pas changer cette copie ici. 797 00:35:19,770 --> 00:35:26,020 Je veux la place de ne changer que ce copie de sorte que l'original est inchangé. 798 00:35:26,020 --> 00:35:27,980 >> Donc, nous allons voir comment nous pourrions le faire. 799 00:35:27,980 --> 00:35:31,800 Dans copie-1, qui a déjà été dépouillé de commentaire, 800 00:35:31,800 --> 00:35:33,250 mais est commenté en ligne. 801 00:35:33,250 --> 00:35:36,710 Nous faisons plutôt le following-- ces lignes sont identiques, me faire une chaîne 802 00:35:36,710 --> 00:35:38,340 et l'appeler l'art. 803 00:35:38,340 --> 00:35:43,500 Mais maintenant, regardons un de nos plus complexe mais le dernier de la complexité 804 00:35:43,500 --> 00:35:47,340 pendant un certain temps, la ligne 16 fait exactement cela. 805 00:35:47,340 --> 00:35:49,400 Donc, si votre confortable avec la image nous vient drew-- 806 00:35:49,400 --> 00:35:51,790 me donner un nouveau bloc de mémoire, copier tout en elle, 807 00:35:51,790 --> 00:35:53,730 nous allons voir comment nous traduisons que le code. 808 00:35:53,730 --> 00:35:59,400 >> Donc, la ligne 16, sur le côté gauche, char * t me donne cette boîte ici. 809 00:35:59,400 --> 00:36:00,230 Voilà tout ce qu'il fait. 810 00:36:00,230 --> 00:36:03,240 Sur le côté droit, m alloc ou malloc, 811 00:36:03,240 --> 00:36:06,480 est l'allocation de mémoire, super chic, une manière cryptique de dire simplement 812 00:36:06,480 --> 00:36:07,640 me donner un morceau de la mémoire. 813 00:36:07,640 --> 00:36:09,290 Combien de mémoire avons-nous besoin? 814 00:36:09,290 --> 00:36:10,910 Eh bien, est une sorte de grande expression. 815 00:36:10,910 --> 00:36:12,570 Mais voyons ce qu'il dit ici. 816 00:36:12,570 --> 00:36:15,940 Donc, cela, bien sûr, est de donner moi la longueur de la chaîne de l'art. 817 00:36:15,940 --> 00:36:19,094 Alors, maman, il devrait être quoi? 818 00:36:19,094 --> 00:36:21,010 Alors que trois, non? maman est trois caractères. 819 00:36:21,010 --> 00:36:22,830 Vous ne comptez pas le barre oblique inverse zéro lorsque vous 820 00:36:22,830 --> 00:36:25,960 parler de la longueur d'une chaîne il est en fait, les lettres visibles humaines. 821 00:36:25,960 --> 00:36:28,020 Alors maman, donc cela me donne 3. 822 00:36:28,020 --> 00:36:31,170 Mais attendez une minute, je suis maintenant en ajoutant 1. 823 00:36:31,170 --> 00:36:34,861 Pourquoi dois-je veux vraiment allouer 4 octets et pas seulement 3? 824 00:36:34,861 --> 00:36:35,360 Ouais? 825 00:36:35,360 --> 00:36:36,910 >> Public: Pour la valeur sentinelle? 826 00:36:36,910 --> 00:36:38,951 >> DAVID J. Malan: Exactement, pour cette valeur de sentinelle. 827 00:36:38,951 --> 00:36:40,840 Pour la barre oblique inverse zéro, Je dois 4 octets au total. 828 00:36:40,840 --> 00:36:42,870 Donc, je dois la longueur de la chaîne plus 1. 829 00:36:42,870 --> 00:36:45,400 Et puis, juste pour faire bonne measure-- même si sur ce système, 830 00:36:45,400 --> 00:36:49,390 il va toujours être 1-- je dis multiplier par la taille d'un caractère. 831 00:36:49,390 --> 00:36:51,552 Turns out est sizeof un opérateur en C qui 832 00:36:51,552 --> 00:36:53,260 vous le dit tout nombre d'octets qui est 833 00:36:53,260 --> 00:36:54,700 requise pour un certain type de données. 834 00:36:54,700 --> 00:36:57,740 Il ne fonctionne pas pour les tableaux, généralement, parfois il le fait. 835 00:36:57,740 --> 00:36:59,210 Mais dans le cas général, non. 836 00:36:59,210 --> 00:37:02,330 Mais il me dire combien d'octets un Char, qui se révèle est toujours 1. 837 00:37:02,330 --> 00:37:04,080 Donc, cela est comme la multiplication par 1. 838 00:37:04,080 --> 00:37:05,900 >> Si super cryptique ligne à la recherche de code. 839 00:37:05,900 --> 00:37:09,320 Mais tout ce qu'il fait est donne moi un morceau de la mémoire. 840 00:37:09,320 --> 00:37:13,590 Mais ça semble être la copie rien dans cette mémoire? 841 00:37:13,590 --> 00:37:14,560 Pas encore. 842 00:37:14,560 --> 00:37:22,040 Et que dois-je sur la ligne 22, et 23, 24, 25, eh bien, je fais simplement ce. 843 00:37:22,040 --> 00:37:23,760 Et cela est une sorte de vieux trucs de l'école maintenant. 844 00:37:23,760 --> 00:37:26,010 Cela ressemble PSet 2, où vous êtes juste faire avancer les choses 845 00:37:26,010 --> 00:37:28,620 autour dans la mémoire, ou plutôt dans les chaînes. 846 00:37:28,620 --> 00:37:31,920 >> Donc, je suis itération de 0 à la longueur de la chaîne s. 847 00:37:31,920 --> 00:37:37,820 Et je copie le caractère i-ème à s dans le personnage de i-ième t. 848 00:37:37,820 --> 00:37:41,820 Et parce que je, le programmeur, fait Assurez-vous d'allouer exactement autant d'octets 849 00:37:41,820 --> 00:37:44,600 comme je l'ai besoin, il est parfait one-to-one relation. 850 00:37:44,600 --> 00:37:47,060 Et je copie maman dans minuscules vers le nouveau. 851 00:37:47,060 --> 00:37:50,170 Et puis enfin, je fais cette ligne. 852 00:37:50,170 --> 00:37:54,637 Et donc l'effet est seulement de capitaliser ce t ici. 853 00:37:54,637 --> 00:37:56,470 Il ya donc beaucoup à absorber, mais si vous considérez juste 854 00:37:56,470 --> 00:37:58,220 ce qui se passe réellement sur sous le capot 855 00:37:58,220 --> 00:38:00,880 est tout simplement le déplacement de ces octets environ, tout ce qui 856 00:38:00,880 --> 00:38:06,617 qui est nécessaire pour résoudre ce problème est juste pour nous donner à ce morceau de mémoire. 857 00:38:06,617 --> 00:38:08,450 Maintenant, au risque de écrasante, permettez-moi de vous montrer 858 00:38:08,450 --> 00:38:13,200 un autre exemple qui est presque identiques, sauf pour celui-ci 859 00:38:13,200 --> 00:38:14,350 ligne de code. 860 00:38:14,350 --> 00:38:18,870 Donc ceci est la version pirate de ce programme, si vous voulez. 861 00:38:18,870 --> 00:38:21,050 Mais disons simplement distiller dans ce qui se passe. 862 00:38:21,050 --> 00:38:28,920 Ligne 24 utilisé pour être ce t Obtient support i s i support. 863 00:38:28,920 --> 00:38:33,370 Maintenant, je vais changer cela l'étoile beaucoup plus cryptique t 864 00:38:33,370 --> 00:38:36,280 plus 1 égale étoiles s plus 1. 865 00:38:36,280 --> 00:38:38,702 >> Donc ce qui se passe et pourquoi avons-nous un caractère étoile? 866 00:38:38,702 --> 00:38:41,410 Nous avons vu l'étoile avant, et il est utilisé différemment ici. 867 00:38:41,410 --> 00:38:45,490 Nous avons vu précédemment char *, maintenant que je vois Une étoile au début, et ce est OK. 868 00:38:45,490 --> 00:38:48,190 Parce que il se trouve nous peut déduire de tout genre 869 00:38:48,190 --> 00:38:50,280 première de celles principes ce qui se passe. 870 00:38:50,280 --> 00:38:53,860 Donc, juste pour être clair, ce qui est s? 871 00:38:53,860 --> 00:38:55,052 La semaine dernière, il était une chaîne. 872 00:38:55,052 --> 00:38:56,260 Cela ne suffit pas plus. 873 00:38:56,260 --> 00:38:57,690 Qu'est-ce que s, spécifiquement? 874 00:38:57,690 --> 00:38:58,590 >> AUDIENCE: [inaudible] 875 00:38:58,590 --> 00:38:59,881 >> DAVID J. Malan: Il est un pointeur. 876 00:38:59,881 --> 00:39:02,610 Il est l'adresse du premier caractère que nous avons tapé dans. 877 00:39:02,610 --> 00:39:04,780 OK, ce qui est t? 878 00:39:04,780 --> 00:39:05,660 >> AUDIENCE: [inaudible] 879 00:39:05,660 --> 00:39:07,950 >> DAVID J. Malan: Le l'adresse du premier octet 880 00:39:07,950 --> 00:39:10,490 en t, ce morceau de mémoire réaffecté. 881 00:39:10,490 --> 00:39:14,720 Donc, il se trouve que lorsque nous itérer de 0 sur un maximum de la chaîne 882 00:39:14,720 --> 00:39:17,424 length-- tout d'abord, i commence à 0, parce 883 00:39:17,424 --> 00:39:18,840 de cette ancienne école pour la boucle chose. 884 00:39:18,840 --> 00:39:22,400 Donc, pour simplifier les choses, nous allons supposer que la première ligne de code 885 00:39:22,400 --> 00:39:23,760 est vraiment juste ce, à droite. 886 00:39:23,760 --> 00:39:26,080 Si i est nul, ajoutant zéro à quelque chose sans doute 887 00:39:26,080 --> 00:39:27,540 ne va pas avoir un effet. 888 00:39:27,540 --> 00:39:28,560 >> Alors, quelle est cette parole? 889 00:39:28,560 --> 00:39:31,600 Il se trouve que la star opérateur dans ce contexte 890 00:39:31,600 --> 00:39:33,700 est le déréférencement l'opérateur, qui est juste 891 00:39:33,700 --> 00:39:37,530 une façon élégante de dire aller à l'adresse suivante. 892 00:39:37,530 --> 00:39:42,080 Donc, si s est l'adresse de la première personnage dans ce bloc de mémoire, 893 00:39:42,080 --> 00:39:43,630 * les moyens de s'y rendre. 894 00:39:43,630 --> 00:39:45,630 Et parce que nous avons tiré l'image de cette manière, 895 00:39:45,630 --> 00:39:47,430 vous pouvez adopter le suivant le modèle mental. 896 00:39:47,430 --> 00:39:51,030 Si cela est s, et vous dites * s * s, un peu comme Chutes and Ladders, 897 00:39:51,030 --> 00:39:54,540 si vous vous souvenez du jeu de l'enfance, est comme suivre cette flèche et aller 898 00:39:54,540 --> 00:39:55,570 à l'adresse. 899 00:39:55,570 --> 00:39:57,080 >> * t est la même chose. 900 00:39:57,080 --> 00:39:59,855 Donc, commencer ici, aller à son morceau. 901 00:39:59,855 --> 00:40:03,350 Je ne peux pas dessiner sur cet écran de cette façon. 902 00:40:03,350 --> 00:40:05,560 * t signifie d'aller ici. 903 00:40:05,560 --> 00:40:08,830 Et puis, la boucle est juste dire déplacer ce personnage ici, 904 00:40:08,830 --> 00:40:11,330 déplacer ce personnage ici, déplacer ce personnage ici. 905 00:40:11,330 --> 00:40:12,890 Mais comment puis-je faire incrémentation? 906 00:40:12,890 --> 00:40:15,430 Je dois défaire ce que je viens de supprimer. 907 00:40:15,430 --> 00:40:18,140 Ceci est ce qui est généralement appelé l'arithmétique des pointeurs, qui 908 00:40:18,140 --> 00:40:20,040 signifie mathématiques avec des adresses. 909 00:40:20,040 --> 00:40:22,460 >> Si, dans cette boucle, Je continue à incrémenter i, 910 00:40:22,460 --> 00:40:26,880 et s est une adresse et t est un adresse, si je continue simplement d'ajouter 1, 911 00:40:26,880 --> 00:40:31,406 qui signifie simplement continuer à avancer, et transmettre, et de transmettre dans la mémoire. 912 00:40:31,406 --> 00:40:34,030 Il est comme Oxford Street, le rue que le bâtiment CS est activée. 913 00:40:34,030 --> 00:40:36,490 Les bâtiments CS est à 33 Oxford Street. 914 00:40:36,490 --> 00:40:39,870 Donc, si vous aviez à faire 33 Oxford Street plus 1, 915 00:40:39,870 --> 00:40:42,870 qui vous amène à 34 Oxford Street, puis 35 Oxford Street, 916 00:40:42,870 --> 00:40:46,380 puis 36 Oxford Street, quels qu'ils bâtiments sont en fait - si elles existent. 917 00:40:46,380 --> 00:40:50,540 Et donc, voilà tout ce que nous faisons ici avec l'arithmétique des pointeurs. 918 00:40:50,540 --> 00:40:53,820 >> Donc, il est un moyen super arcanes de nous exprimer. 919 00:40:53,820 --> 00:40:56,160 Mais tout ce qui se passe sous le capot 920 00:40:56,160 --> 00:40:59,330 est juste après ces adresses, comme suivre une carte, si vous voulez, 921 00:40:59,330 --> 00:41:02,692 ou des flèches comme suit nous avons dessiné sur l'écran. 922 00:41:02,692 --> 00:41:04,910 OK, beaucoup de choses à digérer. 923 00:41:04,910 --> 00:41:10,410 Toute question sur la syntaxe, les concepts, pointeurs, malloc, ou analogues. 924 00:41:10,410 --> 00:41:11,480 Ouais, ici en premier. 925 00:41:11,480 --> 00:41:13,755 >> AUDIENCE: Alors, où que dit * t égal toupper * t, 926 00:41:13,755 --> 00:41:15,575 est ce que cela va capitaliser toutes les lettres ou just-- 927 00:41:15,575 --> 00:41:17,283 >> DAVID J. Malan: Ah, très bonne question. 928 00:41:17,283 --> 00:41:19,805 Donc, dans cette ligne ici, 31, est ce que cela va capitaliser 929 00:41:19,805 --> 00:41:21,430 la première lettre ou l'ensemble des lettres. 930 00:41:21,430 --> 00:41:23,460 Donc, nous allons répondre qu'en allant revenir aux principes premiers. 931 00:41:23,460 --> 00:41:26,168 Et les premiers principes ici je veux dire juste aller aux définitions de base 932 00:41:26,168 --> 00:41:27,000 de ce qui est impliqué. 933 00:41:27,000 --> 00:41:29,770 Donc toupper est une fonction qui capitalise char. 934 00:41:29,770 --> 00:41:30,530 C'est tout. 935 00:41:30,530 --> 00:41:36,740 * t signifie aller à la first-- aller à l'adresse en t. 936 00:41:36,740 --> 00:41:40,350 Donc, dans l'image, si tel est le morceau de la mémoire, nous avons alloué avec malloc, 937 00:41:40,350 --> 00:41:43,310 et cela est t, * t signifie aller ici. 938 00:41:43,310 --> 00:41:46,710 >> Pendant ce temps, vous êtes de passage cette valeur, minuscules m 939 00:41:46,710 --> 00:41:50,040 à toupper, vous obtenez de retour M majuscule, où allez-vous mettre? 940 00:41:50,040 --> 00:41:52,410 Vous mettre dans le même emplacement. 941 00:41:52,410 --> 00:41:55,540 Et ainsi que par la logique de celles définitions de base, il est seulement 942 00:41:55,540 --> 00:41:58,792 capitalisant la première lettre à moins que vous itérer avec i ou d'un 943 00:41:58,792 --> 00:42:02,000 pour la boucle ou une boucle while, ça ne va pas à faire autre chose que vous lui demandez. 944 00:42:02,000 --> 00:42:02,583 Bonne question. 945 00:42:02,583 --> 00:42:03,237 Ouais? 946 00:42:03,237 --> 00:42:05,369 >> Public: Pourquoi avez-vous utilisé déréférencer méthode plutôt qu'une 947 00:42:05,369 --> 00:42:05,979 le tableau? 948 00:42:05,979 --> 00:42:07,395 >> DAVID J. Malan: Ah, bonne question. 949 00:42:07,395 --> 00:42:10,672 Pourquoi voudriez-vous utiliser le déréférencement Procédé selon au lieu de la méthode de la matrice? 950 00:42:10,672 --> 00:42:12,130 Aucune raison particulière, pour être honnête. 951 00:42:12,130 --> 00:42:15,290 Et, de fait, pour ce genre d'exemple, à droite, 952 00:42:15,290 --> 00:42:17,556 Je suis juste en faisant valoir le faire programme plus compliqué, 953 00:42:17,556 --> 00:42:19,680 plus les yeux sont des vitrages plus, les gens sont vérifiant 954 00:42:19,680 --> 00:42:22,830 parce que cela semble super arcanes, mais même si elle fait la même chose. 955 00:42:22,830 --> 00:42:26,695 Et, franchement, cela est un solution inutilement complexe visuellement 956 00:42:26,695 --> 00:42:27,320 au problème. 957 00:42:27,320 --> 00:42:29,580 >> Il est toujours bon design, cinq sur cinq pour la conception, 958 00:42:29,580 --> 00:42:33,140 que ce soit dans le support la notation ou la notation de pointeur. 959 00:42:33,140 --> 00:42:36,299 Mais-- surtout quand nous obtenons plus tard dans le cours de PSet 5 960 00:42:36,299 --> 00:42:39,340 lorsque nous mettons en œuvre ce dictionnaire que Je l'ai mentionné un couple de times-- 961 00:42:39,340 --> 00:42:42,300 nous allons effectivement soucions de la adresses de mémoire de bas niveau 962 00:42:42,300 --> 00:42:44,140 que nous comprenons vraiment ce qui se passe. 963 00:42:44,140 --> 00:42:48,300 >> Mais, pour l'instant, il se trouve que cette ligne de code entre crochets carrés ici 964 00:42:48,300 --> 00:42:49,900 ne existent pas vraiment. 965 00:42:49,900 --> 00:42:52,230 Ils sont ce qu'on appelle sucre syntaxique, qui 966 00:42:52,230 --> 00:42:58,390 est juste une façon étrangement fraîche de dire la compilateur convertit entre crochets pour être 967 00:42:58,390 --> 00:43:00,420 que l'expression mathématique. 968 00:43:00,420 --> 00:43:02,660 Donc, il est une convention humaine pour être en mesure d'écrire simplement 969 00:43:02,660 --> 00:43:04,220 ces supports très conviviale. 970 00:43:04,220 --> 00:43:06,850 Mais ce que le compilateur, clang, fait vraiment tout moment 971 00:43:06,850 --> 00:43:10,970 vous écrivez ce qui est mis en évidence dans la ligne 24, sous le capot, il est vraiment 972 00:43:10,970 --> 00:43:12,330 convertir en ce produit. 973 00:43:12,330 --> 00:43:16,200 Il est juste plus agréable comme un être humain à lire et à écrire du code comme la ligne 24. 974 00:43:16,200 --> 00:43:18,530 Mais finalement, ceux roues de formation trop se détachent 975 00:43:18,530 --> 00:43:21,780 quand on est propre confort devient plus fort. 976 00:43:21,780 --> 00:43:27,240 >> Très bien, alors rappeler ensuite que cette était le genre de gros problème 977 00:43:27,240 --> 00:43:27,807 nous avons couru dans. 978 00:43:27,807 --> 00:43:30,640 Et voilà ce qui a déclenché cet ensemble putain de conversation sur des pointeurs, 979 00:43:30,640 --> 00:43:32,340 et adresses, et les choses de la copie. 980 00:43:32,340 --> 00:43:35,410 Il était parce que nous trébucher ce stupide, question stupide, lequel 981 00:43:35,410 --> 00:43:38,830 Je implémenté logically-- avec Lauren ici sur la démo et le jus d'orange 982 00:43:38,830 --> 00:43:43,770 dans le milk-- une faute fonction algorithmique correcte 983 00:43:43,770 --> 00:43:47,010 pour échanger deux variables ' valeurs, mais la chose sacrément 984 00:43:47,010 --> 00:43:50,550 n'a eu aucune persistante, ou permanente, l'effet sur mon code. 985 00:43:50,550 --> 00:43:51,820 >> Et pourquoi était-ce? 986 00:43:51,820 --> 00:43:54,650 En un mot, pourquoi est-ce la mise en œuvre des swaps 987 00:43:54,650 --> 00:43:58,740 logiquement correct, mais n'a pas d'impact sur les variables qui lui sont transmis, 988 00:43:58,740 --> 00:44:01,119 comme x et y pour principale? 989 00:44:01,119 --> 00:44:02,410 Quel était l'essentiel de la question? 990 00:44:02,410 --> 00:44:02,909 Ouais? 991 00:44:02,909 --> 00:44:05,532 AUDIENCE: Parce que la variable fait des copies de la variable dans la passe 992 00:44:05,532 --> 00:44:06,240 grâce à la fonction. 993 00:44:06,240 --> 00:44:09,060 >> DAVID J. Malan: Exactement, quand vous passez variables dans une fonction, ou des arguments 994 00:44:09,060 --> 00:44:11,030 dans une fonction, ils sont adoptée par exemplaire, qui 995 00:44:11,030 --> 00:44:14,770 signifie que vous obtenez un produit identique à la recherche motif de bits pour x et y, 996 00:44:14,770 --> 00:44:15,955 appelé ici a et b. 997 00:44:15,955 --> 00:44:18,080 Et vous pouvez faire quelque chose vous voulez avec ces copies, 998 00:44:18,080 --> 00:44:20,657 mais ils vont avoir pas effet sur la fonction d'appel. 999 00:44:20,657 --> 00:44:22,990 Et, en fait, nous avons établi que image sur l'écran, le rappel 1000 00:44:22,990 --> 00:44:25,520 la dernière fois, de sorte que si vous vraiment penser à ce qui est 1001 00:44:25,520 --> 00:44:28,570 passe sous le hood-- si ceci est la mémoire de votre ordinateur, 1002 00:44:28,570 --> 00:44:31,650 et ici-bas est le morceau de mémoire étant utilisée pour principale, 1003 00:44:31,650 --> 00:44:34,020 tel est le morceau de mémoire étant utilisée pour la pagination, 1004 00:44:34,020 --> 00:44:37,090 et même si principale a deux variables x et y, 1005 00:44:37,090 --> 00:44:41,840 échange pourrait avoir la recherche identiques les valeurs, qui sont tous deux 1 et 2, 1006 00:44:41,840 --> 00:44:44,520 mais ils sont complètement différents morceaux de mémoire. 1007 00:44:44,520 --> 00:44:46,130 >> Nous avons donc besoin d'une solution à cela. 1008 00:44:46,130 --> 00:44:51,580 Et franchement, il semblerait que nous maintenant avoir une solution à ce problème, à droite. 1009 00:44:51,580 --> 00:44:55,760 Si nous avons maintenant la capacité de manipuler les choses par le biais d'adresses 1010 00:44:55,760 --> 00:44:59,310 et, en quelque sorte Chutes and Ladders le style, suivez ces flèches 1011 00:44:59,310 --> 00:45:02,820 et aller partout où nous voulons en mémoire, on ne pourrait pas 1012 00:45:02,820 --> 00:45:06,220 résoudre ce problème en passant de principale pour échanger 1013 00:45:06,220 --> 00:45:09,650 pas les valeurs que nous voulons swap, mais juste intuitivement 1014 00:45:09,650 --> 00:45:11,630 que pourrions-nous passer d'échanger la place? 1015 00:45:11,630 --> 00:45:12,620 >> [Interposition VOIX] 1016 00:45:12,620 --> 00:45:15,244 >> DAVID J. Malan: Pourquoi ne pas simplement il passe les adresses, non? 1017 00:45:15,244 --> 00:45:17,470 Pourquoi ne nous donnons pas un échange carte au trésor, si vous voulez, 1018 00:45:17,470 --> 00:45:20,950 qu'elle conduit à la valeurs réelles x et y. 1019 00:45:20,950 --> 00:45:24,340 Let swap, réellement changer ces bits d'origine, plutôt que 1020 00:45:24,340 --> 00:45:26,797 juste de passage des copies des bits. 1021 00:45:26,797 --> 00:45:29,130 Et donc, en fait, que est ce qui est va être la solution. 1022 00:45:29,130 --> 00:45:31,899 Cette version est ici clairement mauvais et imparfait. 1023 00:45:31,899 --> 00:45:35,190 Et maintenant, à première vue, il semble juste comme nous avons ajouté un tas d'étoiles au hasard 1024 00:45:35,190 --> 00:45:37,106 et traversé nos doigts qu'il serait compiler. 1025 00:45:37,106 --> 00:45:38,460 Mais, il serait maintenant compiler. 1026 00:45:38,460 --> 00:45:40,090 >> Mais voyons ce que ces choses signifient. 1027 00:45:40,090 --> 00:45:43,990 Et malheureusement, les auteurs de, C aurait pu choisir un autre symbole 1028 00:45:43,990 --> 00:45:46,380 pour faire cela un peu plus claire, mais l'opérateur étoiles 1029 00:45:46,380 --> 00:45:48,610 a une signification différente dans deux contextes différents. 1030 00:45:48,610 --> 00:45:50,890 Et nous avons vu à la fois, mais nous allons distinguer. 1031 00:45:50,890 --> 00:45:55,310 >> Donc, au sommet il, quand je l'ai changé A et B 1032 00:45:55,310 --> 00:46:00,470 d'être l'INT dans le mauvais Version int étoiles, a et b, 1033 00:46:00,470 --> 00:46:01,740 précédemment, sont des nombres entiers. 1034 00:46:01,740 --> 00:46:05,752 Quels sont a et b maintenant le bon, version verte? 1035 00:46:05,752 --> 00:46:06,900 Ils sont adresses. 1036 00:46:06,900 --> 00:46:09,610 Adresses de ce que, pour être clair? 1037 00:46:09,610 --> 00:46:10,770 Adresses des nombres entiers. 1038 00:46:10,770 --> 00:46:12,520 Donc, le fait que je suis disant moyens int étoiles 1039 00:46:12,520 --> 00:46:15,440 ceci est l'adresse de un nombre entier, en particulier. 1040 00:46:15,440 --> 00:46:19,120 >> Donc remarquerez maintenant dans les lignes de code, quelque chose d'autre a changé aussi. 1041 00:46:19,120 --> 00:46:22,770 tmp reste le même, parce que il est juste l'entier temporaire, 1042 00:46:22,770 --> 00:46:24,110 pas de magie de mémoire il. 1043 00:46:24,110 --> 00:46:26,370 Mais maintenant besoin d'une étoile. 1044 00:46:26,370 --> 00:46:28,560 Et, en fait, chaque autre mention de a et b, 1045 00:46:28,560 --> 00:46:31,780 notez que tout ce qui est changer du rouge au vert 1046 00:46:31,780 --> 00:46:34,209 est que je suis le préfixe ces variables avec des étoiles. 1047 00:46:34,209 --> 00:46:35,750 Parce que je ne veux pas copier a et b. 1048 00:46:35,750 --> 00:46:40,350 Parce que si je copie simplement A et B et d'échange A et B, ce que je suis réellement permutation? 1049 00:46:40,350 --> 00:46:43,760 Juste adresses, je veux échanger ce qui est en ces adresses. 1050 00:46:43,760 --> 00:46:44,860 Je veux aller là-bas. 1051 00:46:44,860 --> 00:46:48,000 Et si l'opérateur étoiles à l'intérieur de ma fonction, 1052 00:46:48,000 --> 00:46:51,700 pas à l'intérieur de la liste des paramètres, signifie que vous allez à ces adresses 1053 00:46:51,700 --> 00:46:54,490 et effectivement changer ces valeurs. 1054 00:46:54,490 --> 00:46:56,500 >> Alors qu'est-ce que l'image ressemblent maintenant à la place. 1055 00:46:56,500 --> 00:47:03,250 Eh bien, si je passe à la place en pour A et B et non une 2-- 1056 00:47:03,250 --> 00:47:05,790 En fait, je dois ajouter un autre définition ici. 1057 00:47:05,790 --> 00:47:09,030 Alors que ce morceau supposer de la mémoire est à l'emplacement 10. 1058 00:47:09,030 --> 00:47:12,960 >> Ceci est à l'emplacement 11, mais cette est un peu d'une simplification, 1059 00:47:12,960 --> 00:47:18,900 Je dois maintenant deux choix font je passe x et y ou dois-je passer leurs adresses? 1060 00:47:18,900 --> 00:47:22,500 Si je passe leurs adresses comme ça, je viens 1061 00:47:22,500 --> 00:47:25,390 maintenant besoin de mettre en œuvre swap par le code vert 1062 00:47:25,390 --> 00:47:29,080 de sorte que quand il voit un et quand il b voit, il ne se copie pas a et b 1063 00:47:29,080 --> 00:47:30,540 et déplacer le lait et le jus d'orange. 1064 00:47:30,540 --> 00:47:32,664 Le lait et jus d'orange métaphore brise maintenant en baisse, 1065 00:47:32,664 --> 00:47:35,060 parce que ce sont des tasses Cartes de liquides et non. 1066 00:47:35,060 --> 00:47:37,750 Nous avons plutôt besoin d'aller à traiter 10 et nous 1067 00:47:37,750 --> 00:47:42,420 besoin d'aller à traiter 11, et puis effectuer cette logique de permutation. 1068 00:47:42,420 --> 00:47:45,580 >> Ainsi, la logique est la même, mais nous avons besoin d'une manière légèrement différente 1069 00:47:45,580 --> 00:47:47,160 d'accéder à ces variables. 1070 00:47:47,160 --> 00:47:52,400 Et à la fin, ce que le programme doit ressembler à ceci. 1071 00:47:52,400 --> 00:47:56,610 Dans swap.c littéralement copié et collé la version verte. 1072 00:47:56,610 --> 00:47:58,450 Mais je dois faire un changement. 1073 00:47:58,450 --> 00:48:00,180 Il ne suffit pas simplement de changer swap. 1074 00:48:00,180 --> 00:48:03,830 Quelle autre ligne de code dois-je changer? 1075 00:48:03,830 --> 00:48:04,330 Ouais? 1076 00:48:04,330 --> 00:48:05,770 >> AUDIENCE: Lorsqu'il prend les arguments. 1077 00:48:05,770 --> 00:48:07,603 >> DAVID J. Malan: Où il tire son argument. 1078 00:48:07,603 --> 00:48:09,985 Donc, si je fais défiler jusqu'à principale, je ne peut pas simplement passer en x et y, 1079 00:48:09,985 --> 00:48:12,820 et, je vous le promets, la dernière morceau de nouvelle syntaxe aujourd'hui. 1080 00:48:12,820 --> 00:48:17,200 Je dois passer au pas x et mais l'adresse y de x et y. 1081 00:48:17,200 --> 00:48:20,400 Et il se trouve, le symbole que les auteurs de C choisi 1082 00:48:20,400 --> 00:48:23,860 est si vous utilisez une esperluette ici, de ne pas être confondu avec l'esperluette au niveau du bit, 1083 00:48:23,860 --> 00:48:27,130 si vous utilisez une esperluette ici et ici une esperluette, 1084 00:48:27,130 --> 00:48:29,570 Ces chiffres pour vous, Quelle est l'adresse de x, 1085 00:48:29,570 --> 00:48:31,740 il est peut être 10, quelle est la Adresse de y, il est peut être 1086 00:48:31,740 --> 00:48:35,400 11, et passe dans ceux à la place. 1087 00:48:35,400 --> 00:48:37,210 >> Il ya donc beaucoup d'absorber à la fois. 1088 00:48:37,210 --> 00:48:40,190 Mais voyons maintenant rapidement nos quatre minutes restantes 1089 00:48:40,190 --> 00:48:42,150 où les choses peuvent mal tourner. 1090 00:48:42,150 --> 00:48:45,120 Et en passant, fait Je pris cette photo, 1091 00:48:45,120 --> 00:48:46,920 TF a pris cette photo il ya un an ou deux. 1092 00:48:46,920 --> 00:48:49,190 Voilà donc le coin arrière Eliot Dining Hall. 1093 00:48:49,190 --> 00:48:52,310 Les pointeurs sont peut-être le plus difficile sujet que nous couvrons dans CS50. 1094 00:48:52,310 --> 00:48:54,810 Donc, si vous vous inquiétez de la sorte de la pente est comme peut-être il est 1095 00:48:54,810 --> 00:48:56,770 plus d'un bâton de hockey comme ça, réaliser 1096 00:48:56,770 --> 00:49:00,160 nous sommes en quelque sorte presque un pic en termes de la complexité conceptuelle. 1097 00:49:00,160 --> 00:49:02,300 >> Et je soulève cette photo, parce que je jure 1098 00:49:02,300 --> 00:49:05,920 à Dieu, à l'automne 1996, quand je prenais CS50 avec mon enseignement compatriote, 1099 00:49:05,920 --> 00:49:09,620 Nishat Mehta, il m'a fait asseoir dans le coin de la Eliot D. Hall pendant le déjeuner, 1100 00:49:09,620 --> 00:49:12,330 ou le dîner, ou quelque chose à essayer me aider à comprendre les pointeurs. 1101 00:49:12,330 --> 00:49:16,520 Et ceci est où je me trouvais semaines après il a été introduit dans la leçon quand 1102 00:49:16,520 --> 00:49:18,170 Je comprenais enfin pointeurs. 1103 00:49:18,170 --> 00:49:20,590 Et je suis plein d'espoir que cette seront cliquez beaucoup plus tôt pour vous. 1104 00:49:20,590 --> 00:49:23,540 Mais réaliser ce absolument parmi les sujets plus sophistiqués 1105 00:49:23,540 --> 00:49:24,420 nous avons examiné. 1106 00:49:24,420 --> 00:49:25,819 Mais il est parmi les plus puissants. 1107 00:49:25,819 --> 00:49:28,860 Et quand vous arrivez, il est vraiment tout aller juste pour venir finalement ensemble. 1108 00:49:28,860 --> 00:49:31,460 Donc, rassurez-vous, il ne le fait pas besoin de tous les puits aujourd'hui. 1109 00:49:31,460 --> 00:49:32,980 >> Alors, voici le dernier programme nous allons regarder. 1110 00:49:32,980 --> 00:49:35,605 Et nous allons finir avec un rapides trois minutes de pâte à modeler 1111 00:49:35,605 --> 00:49:37,030 faite par notre ami, Nick Parlante. 1112 00:49:37,030 --> 00:49:41,440 Voici un programme, que sur les deux haut lignes déclare une variable x et y. 1113 00:49:41,440 --> 00:49:44,780 Les deux qui sont des adresses d'entiers, les pointeurs AKA. 1114 00:49:44,780 --> 00:49:48,125 Nous attribuons ensuite assez mémoire pour stocker un int 1115 00:49:48,125 --> 00:49:51,344 et stocker l'adresse de cette mémoire dans x. 1116 00:49:51,344 --> 00:49:53,260 Ainsi, il est encore plus simple que l'exemple avant. 1117 00:49:53,260 --> 00:49:56,100 Donnez-moi quatre octets de mémoire, qui est la taille d'un int, 1118 00:49:56,100 --> 00:49:58,000 et de mettre cette adresse en x. 1119 00:49:58,000 --> 00:50:01,070 Cette ligne signifie ici aller à l'adresse dans x 1120 00:50:01,070 --> 00:50:05,270 et de mettre le sens de la vie, le nombre 42 il. 1121 00:50:05,270 --> 00:50:07,710 Mais cette ligne me préoccupe. 1122 00:50:07,710 --> 00:50:12,620 STAR y signifie aller à l'adresse en y, et de mettre le mauvais numéro 13 il. 1123 00:50:12,620 --> 00:50:15,780 Pourquoi est-il dangereux, à ce stade bien que dans les story-- dit rapidement 1124 00:50:15,780 --> 00:50:17,980 dans nos minutes déclin ici-- pourquoi est-il mauvais 1125 00:50:17,980 --> 00:50:19,660 pour moi de dire, aller à l'adresse de y? 1126 00:50:19,660 --> 00:50:21,077 >> AUDIENCE: Vous ne l'avez pas [inaudible]. 1127 00:50:21,077 --> 00:50:22,910 DAVID J. Malan: Je ne ai pas mettre quelque chose en y. 1128 00:50:22,910 --> 00:50:25,520 Alors, quelle est la valeur de y, à ce point dans l'histoire? 1129 00:50:25,520 --> 00:50:26,570 Nous avons aucune idée. 1130 00:50:26,570 --> 00:50:29,190 Il est une valeur d'ordures et ni ne sait Binky. 1131 00:50:29,190 --> 00:50:32,532 Si nous pouvions terminer sur cette note. 1132 00:50:32,532 --> 00:50:34,832 >> [LECTURE VIDÉO] 1133 00:50:34,832 --> 00:50:36,500 >> -Hé, Binky, réveillez-vous. 1134 00:50:36,500 --> 00:50:39,140 Il est temps pour le plaisir pointeur. 1135 00:50:39,140 --> 00:50:40,210 >> -Qu'est ce que c'est? 1136 00:50:40,210 --> 00:50:41,690 En savoir plus sur les pointeurs? 1137 00:50:41,690 --> 00:50:43,570 Oh, Goody. 1138 00:50:43,570 --> 00:50:46,600 >> -Eh Bien, pour commencer, je suppose que nous sommes allez avoir besoin de quelques pointeurs. 1139 00:50:46,600 --> 00:50:47,380 >> -D'ACCORD. 1140 00:50:47,380 --> 00:50:51,120 Ce code attribue deux pointeurs qui peut pointer vers entiers. 1141 00:50:51,120 --> 00:50:53,557 >> -OK, Je vois bien la deux pointeurs, mais ils 1142 00:50:53,557 --> 00:50:55,140 ne semblent pas être pointant à rien. 1143 00:50:55,140 --> 00:50:55,970 >> -C'est vrai. 1144 00:50:55,970 --> 00:50:58,100 Pointeurs Initialement ne pointe pas sur quoi que ce soit. 1145 00:50:58,100 --> 00:51:00,950 Les choses qu'ils pointent vers sont appelé pointees et leur mise en place 1146 00:51:00,950 --> 00:51:02,330 est une étape séparée. 1147 00:51:02,330 --> 00:51:03,210 >> Oh, droite, droite. 1148 00:51:03,210 --> 00:51:03,940 Je le savais. 1149 00:51:03,940 --> 00:51:05,730 Les pointees sont séparés. 1150 00:51:05,730 --> 00:51:08,310 Alors, comment voulez vous allouez un pointée? 1151 00:51:08,310 --> 00:51:11,960 >> -Ok, Eh bien, ce Code alloue un nouveau pointée entier, 1152 00:51:11,960 --> 00:51:15,050 et cette partie ensembles x pour pointer vers elle. 1153 00:51:15,050 --> 00:51:16,240 >> -Hé, Qui semble mieux. 1154 00:51:16,240 --> 00:51:17,743 Donc, en faire quelque chose. 1155 00:51:17,743 --> 00:51:23,580 >> -OK, Je vais déréférence le pointeur à x enregistrer le numéro 42 dans sa pointée. 1156 00:51:23,580 --> 00:51:27,130 Pour cette astuce, je vais avoir besoin de ma baguette magique de déréférencement. 1157 00:51:27,130 --> 00:51:30,200 >> -Votre Baguette magique de déréférencement? 1158 00:51:30,200 --> 00:51:32,310 Euh, ce qui est très bien. 1159 00:51:32,310 --> 00:51:34,270 >> -C'est Ce que le code ressemble. 1160 00:51:34,270 --> 00:51:35,970 Je vais simplement mettre en place le nombre et-- 1161 00:51:35,970 --> 00:51:37,070 >> [POP SOUND] 1162 00:51:37,070 --> 00:51:39,140 >> Hé, regardez là, il va. 1163 00:51:39,140 --> 00:51:43,980 Donc, faire un déréférencement x suit la flèche pour accéder à sa pointée. 1164 00:51:43,980 --> 00:51:46,150 Dans ce cas, pour stocker 42 là-dedans. 1165 00:51:46,150 --> 00:51:50,700 Hey, essayez de l'utiliser pour stocker le nombre 13 à travers l'autre pointeur, y. 1166 00:51:50,700 --> 00:51:51,840 >> -D'ACCORD. 1167 00:51:51,840 --> 00:51:56,270 Je vais juste aller sur ici pour y, et obtenir le nombre 13 mise en place. 1168 00:51:56,270 --> 00:52:00,380 Et puis prendre la baguette de déréférencement et just-- 1169 00:52:00,380 --> 00:52:01,646 >> [Buzzer] 1170 00:52:01,646 --> 00:52:04,080 >> Oh, hey cela ne fonctionne pas. 1171 00:52:04,080 --> 00:52:06,470 Dire, euh, Binky, je ne sais pas penser déréférencement 1172 00:52:06,470 --> 00:52:10,850 y est une bonne idée, parce que la mise en le pointée est une étape séparée. 1173 00:52:10,850 --> 00:52:12,480 Et je ne pense pas que nous ayons jamais fait. 1174 00:52:12,480 --> 00:52:14,620 >> -Hmm, Bon point. 1175 00:52:14,620 --> 00:52:19,810 >> -Oui, Nous avons attribué le pointeur, y, mais nous ne fixons pour pointer vers un pointée. 1176 00:52:19,810 --> 00:52:21,590 >> -Hmm, Très observateur. 1177 00:52:21,590 --> 00:52:23,215 Hé, vous êtes à la recherche bonne là, Binky. 1178 00:52:23,215 --> 00:52:26,390 Pouvez-vous résoudre ce problème afin que les points y à la même pointée comme x. 1179 00:52:26,390 --> 00:52:29,290 >> -sure, Je utiliser ma baguette magique d'affectation du pointeur. 1180 00:52:29,290 --> 00:52:31,970 >> -Est-Ce que cela va être un problème, comme avant? 1181 00:52:31,970 --> 00:52:33,790 >> Non, cela ne touche pas les pointees. 1182 00:52:33,790 --> 00:52:35,840 Il change juste un pointeur pour pointer vers le même chose-- 1183 00:52:35,840 --> 00:52:36,465 >> [Claquement] 1184 00:52:36,465 --> 00:52:37,450 --en l'autre. 1185 00:52:37,450 --> 00:52:38,440 >> -Oh je vois. 1186 00:52:38,440 --> 00:52:41,200 Maintenant y pointe vers le même endroit que x. 1187 00:52:41,200 --> 00:52:42,950 Alors, attendez, maintenant y est fixé. 1188 00:52:42,950 --> 00:52:44,110 Il dispose d'un pointée. 1189 00:52:44,110 --> 00:52:47,779 Ainsi, vous pouvez essayer de la baguette de déréférencement à nouveau d'envoyer le 13 plus. 1190 00:52:47,779 --> 00:52:51,110 >> Oh, OK, voilà. 1191 00:52:51,110 --> 00:52:52,330 >> Hé, regardez ça. 1192 00:52:52,330 --> 00:52:53,570 Maintenant déréférencement travaux sur y. 1193 00:52:53,570 --> 00:52:57,900 Et parce que les pointeurs partagent que l'on pointée, ils voient tous deux la 13. 1194 00:52:57,900 --> 00:52:59,952 >> -Ouais, Partage, euh, peu importe. 1195 00:52:59,952 --> 00:53:01,535 Alors, allons-nous changer de place maintenant? 1196 00:53:01,535 --> 00:53:03,730 >> Oh, regardons, nous manquons de temps. 1197 00:53:03,730 --> 00:53:04,660 >> -But-- 1198 00:53:04,660 --> 00:53:06,520 >> -Juste Rappeler les trois règles de pointeur. 1199 00:53:06,520 --> 00:53:09,550 Numéro 1, la structure de base est que vous avez un pointeur, 1200 00:53:09,550 --> 00:53:11,630 et il souligne plus à un pointée. 1201 00:53:11,630 --> 00:53:13,740 Mais le pointeur et pointée sont séparés. 1202 00:53:13,740 --> 00:53:15,620 Et l'erreur commune est de mettre en place un pointeur 1203 00:53:15,620 --> 00:53:18,000 mais oublier de lui donner un pointée. 1204 00:53:18,000 --> 00:53:21,170 >> Numéro 2, pointeur déréférencement commence au niveau du pointeur 1205 00:53:21,170 --> 00:53:24,020 et suit sa flèche sur pour accéder à sa pointée. 1206 00:53:24,020 --> 00:53:27,815 Comme nous le savons tous, cela ne fonctionne que si est un pointée, qui obtient sorte de retour 1207 00:53:27,815 --> 00:53:29,260 à la règle numéro 1. 1208 00:53:29,260 --> 00:53:31,990 >> Numéro 3, pointeur cession prend un pointeur 1209 00:53:31,990 --> 00:53:35,330 et il change pour indiquer le même pointée comme un autre pointeur. 1210 00:53:35,330 --> 00:53:37,150 Donc, après la cession, les deux pointeurs 1211 00:53:37,150 --> 00:53:40,927 va pointer vers le même pointée, parfois que ce qu'on appelle le partage. 1212 00:53:40,927 --> 00:53:42,510 Et cela est tout ce qu'il ya à faire, vraiment. 1213 00:53:42,510 --> 00:53:43,130 Bye-bye maintenant. 1214 00:53:43,130 --> 00:53:43,475 >> [FIN LECTURE] 1215 00:53:43,475 --> 00:53:44,830 >> DAVID J. Malan: Voilà pour CS50. 1216 00:53:44,830 --> 00:53:46,246 Merci au professeur Nick Parlante. 1217 00:53:46,246 --> 00:53:47,730 Nous vous verrons la semaine prochaine. 1218 00:53:47,730 --> 00:53:51,706 1219 00:53:51,706 --> 00:53:56,435 >> [Electronic Music JEU] 1220 00:53:56,435 --> 00:57:22,775