1 00:00:00,000 --> 00:00:10,970 >> [Musik spielt] 2 00:00:10,970 --> 00:00:12,536 >> DAVID J. MALAN: Alles klar. 3 00:00:12,536 --> 00:00:13,392 >> [Gelächter] 4 00:00:13,392 --> 00:00:14,240 >> Willkommen zurück. 5 00:00:14,240 --> 00:00:14,990 Dies ist CS50. 6 00:00:14,990 --> 00:00:16,890 Und das ist das Ende der Woche fünf. 7 00:00:16,890 --> 00:00:20,020 Und bis jetzt haben wir ziemlich viel genommen für selbstverständlich, dass es 8 00:00:20,020 --> 00:00:23,480 existiert diese Compiler Clang, dass Sie wurde durch diese Aufrufen 9 00:00:23,480 --> 00:00:27,100 anderen Tool namens Machen Sie, dass irgendwie magisch verwandelt Ihren Quellcode 10 00:00:27,100 --> 00:00:31,350 in Objekt-Code, die Nullen und Einsen dass Ihr Computer CPU, zentrale 11 00:00:31,350 --> 00:00:33,410 Verarbeitungseinheit, eigentlich versteht. 12 00:00:33,410 --> 00:00:36,770 Aber es stellt sich heraus, es gibt eine Zahl, die ist los unter der Haube in 13 00:00:36,770 --> 00:00:38,690 zwischen Eingang und Ausgang. 14 00:00:38,690 --> 00:00:41,800 >> Und ich möchte vorschlagen, dass wir Fleisch dass in einem kleinen Detail in 15 00:00:41,800 --> 00:00:45,130 diese vier Schritte haben etwas namens Pre-Processing, etwas 16 00:00:45,130 --> 00:00:48,300 genannt compiling, die wir gesehen haben, etwas namens Montage und 17 00:00:48,300 --> 00:00:49,420 etwas namens Verlinkung nicht erkennbar. 18 00:00:49,420 --> 00:00:53,270 Also bis jetzt in einigen unserer Programme, wir hatten scharfe enthält. 19 00:00:53,270 --> 00:00:56,650 Vor kurzem hatten wir etwas scharf definiert für Konstanten. 20 00:00:56,650 --> 00:01:00,660 So stellt sich heraus, dass die Dinge, die werden mit dem Hash-Symbol oder vorangestellt 21 00:01:00,660 --> 00:01:04,150 das Pfund-Symbol sind Pre-Prozessor Richtlinien. 22 00:01:04,150 --> 00:01:07,960 Das ist nur eine andere Art zu sagen, es ist eine Codezeile, die eigentlich 23 00:01:07,960 --> 00:01:12,280 umgewandelt in etwas anderes, bevor die Computer sogar versuchen, konvertieren Sie Ihre 24 00:01:12,280 --> 00:01:13,800 Programm in Nullen und Einsen. 25 00:01:13,800 --> 00:01:19,000 >> So enthält scharfe Standard I / O. H, ziemlich genau bedeutet gehen 26 00:01:19,000 --> 00:01:24,010 voraus, greifen die Inhalte der Dateien stdio.h und fügen Sie sie genau dort. 27 00:01:24,010 --> 00:01:25,880 Also keine Nullen und Einsen an diesem Punkt noch. 28 00:01:25,880 --> 00:01:27,470 Es ist wirklich nur eine Substitution. 29 00:01:27,470 --> 00:01:30,790 Und das ist während des sogenannten getan Vorverarbeitungsstufe, wenn man 30 00:01:30,790 --> 00:01:34,230 tatsächlich laufen Clang oder speziell Stellen Sie in den meisten Fällen. 31 00:01:34,230 --> 00:01:36,950 Also all das passiert ist zunächst automatisch so weit. 32 00:01:36,950 --> 00:01:38,800 >> Dann kommt die Zusammenstellung Schritt. 33 00:01:38,800 --> 00:01:40,920 Aber wir haben vereinfacht Zusammenstellung. 34 00:01:40,920 --> 00:01:45,060 Kompilieren eines Programms wirklich bedeutet nehmen Sie es von so etwas wie C, die 35 00:01:45,060 --> 00:01:48,430 Quellcode haben wir geschrieben, unten etwas Versammlung aufgerufen. 36 00:01:48,430 --> 00:01:52,900 Assembler ist eine untere Ebene Sprache, die, Gott sei Dank, werden wir nicht 37 00:01:52,900 --> 00:01:55,480 haben viel zu veranlassen schreiben in diesem Semester. 38 00:01:55,480 --> 00:01:59,100 Aber es ist auf der untersten Ebene in der Sinne, dass man buchstäblich mit dem Schreiben beginnen 39 00:01:59,100 --> 00:02:04,270 addieren und subtrahieren und multiplizieren und laden aus dem Speicher und in den Speicher zu speichern, die 40 00:02:04,270 --> 00:02:08,259 sehr grundlegende Hinweise, dass ein Computer, unter der Haube, 41 00:02:08,259 --> 00:02:09,639 tatsächlich versteht. 42 00:02:09,639 --> 00:02:14,930 >> Schließlich nimmt der Montage diese Sprache zu den Nullen und Einsen, die wir waren 43 00:02:14,930 --> 00:02:16,190 beschreibt so weit. 44 00:02:16,190 --> 00:02:19,270 Und wahrlich schließlich gibt es noch die sogenannten Verknüpfung Phase, die wir werden 45 00:02:19,270 --> 00:02:22,360 sehen in nur einem Augenblick, das verbindet Ihre Nullen und Einsen mit Nullen und 46 00:02:22,360 --> 00:02:24,870 Wieder andere Menschen vor Sie erstellt haben. 47 00:02:24,870 --> 00:02:26,660 >> So betrachten diese super einfaches Programm. 48 00:02:26,660 --> 00:02:27,560 Es war von Woche 1. 49 00:02:27,560 --> 00:02:29,610 Es sagte nur Hallo Welt, auf dem Bildschirm. 50 00:02:29,610 --> 00:02:30,920 Wir liefen durch diese Schall. 51 00:02:30,920 --> 00:02:33,200 Oder wir rannten sie durch Stellen das lief Schall. 52 00:02:33,200 --> 00:02:36,170 Und zu der Zeit, wo ausgegeben einige Nullen und Einsen. 53 00:02:36,170 --> 00:02:38,100 Aber es stellt sich heraus, es gibt ein Zwischenschritt. 54 00:02:38,100 --> 00:02:40,460 Wenn ich hier gehen - oops, nicht will ihn noch sehen. 55 00:02:40,460 --> 00:02:44,800 Wenn ich gehe hier um mein Gerät und ich eröffnen hello.c, hier 56 00:02:44,800 --> 00:02:46,160 ist, dass dasselbe Programm. 57 00:02:46,160 --> 00:02:48,600 Und was ich in meinem Terminal tun Fenster hier ist, ich bin zu gehen 58 00:02:48,600 --> 00:02:51,430 laufen Clang anstatt Stellen, die automatisiert alle vier 59 00:02:51,430 --> 00:02:52,870 diese Schritte für uns. 60 00:02:52,870 --> 00:02:58,620 Und ich werde tun Klang-S und dann hello.c und geben Sie dann. 61 00:02:58,620 --> 00:03:00,590 >> Und ich bekomme einen blinkenden Eingabeaufforderung wieder ist das gut. 62 00:03:00,590 --> 00:03:05,280 Und nun in eine etwas größere Fenster, Ich werde zu öffnen gedit hier. 63 00:03:05,280 --> 00:03:09,610 Und ich werde zu öffnen, eine Datei, die, stellt sich heraus, heißt dies hello.s 64 00:03:09,610 --> 00:03:11,870 enthält, dass Assembler Ich bezog mich auf früher. 65 00:03:11,870 --> 00:03:15,060 Und das ist, was heißt Montage Sprache, recht niedrigen Niveau 66 00:03:15,060 --> 00:03:18,470 Anweisungen, dass Ihr Intel CPU oder was auch immer es ist, dass drin ist 67 00:03:18,470 --> 00:03:19,350 versteht. 68 00:03:19,350 --> 00:03:24,480 Und mov ist für unterwegs. Anruf ist für Aufruf, einen sehr niedrigen Level-Funktion. 69 00:03:24,480 --> 00:03:26,380 sub ist für subtrahieren. 70 00:03:26,380 --> 00:03:30,370 >> Also, wenn Sie eine bestimmte CPU im Inneren Ihres Computers, was macht es 71 00:03:30,370 --> 00:03:34,300 deutlich, im Vergleich zu anderen CPUs auf die Markt, welche Anweisungen es 72 00:03:34,300 --> 00:03:39,460 versteht und oft wie effizient es ist, wie schnell es bei der Ausführung einige ist 73 00:03:39,460 --> 00:03:40,380 dieser Anleitung. 74 00:03:40,380 --> 00:03:45,150 Jetzt für weitere Informationen hierzu, können Sie nächsten Herbst CS61 an der Hochschule. 75 00:03:45,150 --> 00:03:48,170 Hier haben wir aber zum Beispiel einige Kennungen, die vertraut aussehen könnte. 76 00:03:48,170 --> 00:03:50,150 hello.c ist der Name des Programms. 77 00:03:50,150 --> 00:03:51,070 >> . Text - 78 00:03:51,070 --> 00:03:54,190 es gibt nicht viel von Interesse gibt gerade jetzt daran erinnern, dass der Text 79 00:03:54,190 --> 00:03:59,190 Segment ab Montag, ist, wo in Speicher Ihr Programm tatsächlich endet. 80 00:03:59,190 --> 00:04:01,330 Also das ist zumindest vage vertraut dort. 81 00:04:01,330 --> 00:04:03,730 Dabei ist natürlich eine Erwähnung von unsere Funktion. 82 00:04:03,730 --> 00:04:07,220 Scrollen nach unten, siehe diese Dinge genannten Registern, sehr kleine Stücke von 83 00:04:07,220 --> 00:04:09,190 Speicher in Ihrer eigentlichen CPU. 84 00:04:09,190 --> 00:04:12,930 Und wenn ich nach unten scrollen, auch weiter, sehe ich eine Art 85 00:04:12,930 --> 00:04:14,240 indirekte Erwähnung von ASCII. 86 00:04:14,240 --> 00:04:17,120 Und es ist in der Tat, dass die String, hallo, Komma, Welt. 87 00:04:17,120 --> 00:04:20,079 >> So lange Rede, kurzer Sinn, dies war geschieht für Sie, automatisch, 88 00:04:20,079 --> 00:04:22,140 unter der Haube all dieser Zeit. 89 00:04:22,140 --> 00:04:26,450 Und was ist schon passiert ist wirklich einmal Sie haben Clang laufen, oder durch 90 00:04:26,450 --> 00:04:29,150 Machen Sie, Sie zuerst zu erreichen, aus dem Quellcode, der 91 00:04:29,150 --> 00:04:30,700 sogenannte Assembler. 92 00:04:30,700 --> 00:04:35,210 Dann Clang ist die Umwandlung dieser Versammlung Sprache auf Nullen und Einsen. 93 00:04:35,210 --> 00:04:38,340 Und dies ist die Folie, die wir begonnen unsere Diskussion in Woche 0 auf - 94 00:04:38,340 --> 00:04:39,840 und dann Woche 1 auf. 95 00:04:39,840 --> 00:04:44,030 Und schließlich, diese Nullen und Einsen mit den Nullen und Einsen in Kombination 96 00:04:44,030 --> 00:04:47,190 von diesen Bibliotheken haben wir genommen wie für Standard-I / O oder gewährt 97 00:04:47,190 --> 00:04:50,010 String-Bibliothek oder sogar der CS50-Bibliothek. 98 00:04:50,010 --> 00:04:54,200 >> So ist dieses Bild zu malen mehr visuell, haben wir hello.c. 99 00:04:54,200 --> 00:04:57,220 Und natürlich wird die printf funktionieren zu sagen, hallo Welt. 100 00:04:57,220 --> 00:05:01,810 Die Zusammenstellung Schritt dauert es bis zu dass wir gerade gesehen haben Datei hello.s, auch 101 00:05:01,810 --> 00:05:04,290 obwohl das ist in der Regel gelöscht automatisch für Sie. 102 00:05:04,290 --> 00:05:06,050 Aber das ist die Assembler-Code in der mittleren Stufe. 103 00:05:06,050 --> 00:05:09,750 Und dann, wenn wir montieren die Montage Sprache, so zu sprechen, das ist, wenn Sie 104 00:05:09,750 --> 00:05:10,830 bekommen die Nullen und Einsen. 105 00:05:10,830 --> 00:05:13,920 Deshalb haben wir uns in effektiv erkennen heute auf was wir bisher für selbstverständlich nehmen, 106 00:05:13,920 --> 00:05:16,430 bedeutet, sich Quellcode Code widersprechen. 107 00:05:16,430 --> 00:05:18,850 >> Aber schließlich, jetzt, da gleiche Bild - lasst es schieben, um über 108 00:05:18,850 --> 00:05:20,020 auf der linken Seite. 109 00:05:20,020 --> 00:05:22,880 Und beachten Sie, dass in der Spitze gibt Ich erwähnte stdio.h. 110 00:05:22,880 --> 00:05:25,030 Das ist eine Datei, die wir aufgenommen in fast allen der 111 00:05:25,030 --> 00:05:26,250 Programme, die wir geschrieben haben. 112 00:05:26,250 --> 00:05:28,830 Und das ist die Datei, deren Inhalt Kopie eingefügt bekommen, 113 00:05:28,830 --> 00:05:30,350 effektiv oben auf Ihrem Code. 114 00:05:30,350 --> 00:05:34,170 Aber es stellt sich heraus, dass auf einem Computer System irgendwo, gibt es vermutlich ein 115 00:05:34,170 --> 00:05:39,150 stdio.c Datei, dass jemand Jahren schrieb her, dass implementiert alle die 116 00:05:39,150 --> 00:05:41,870 Funktionen, die deklariert wurden in stdio.h. 117 00:05:41,870 --> 00:05:45,465 >> Jetzt in der Realität ist es wahrscheinlich nicht auf Ihrem Mac oder PC oder sogar in der 118 00:05:45,465 --> 00:05:47,660 CS50-Appliance ist eine rohe C-Code. 119 00:05:47,660 --> 00:05:52,710 Jemand es bereits zusammengestellt und enthalten . O Datei für Objekt-Code oder. Ein 120 00:05:52,710 --> 00:05:56,020 Datei, die zu einer gemeinsam genutzten Bibliothek bezieht Das ist bereits vorinstalliert und 121 00:05:56,020 --> 00:05:57,240 für Sie vorab zusammengestellt. 122 00:05:57,240 --> 00:06:01,950 Aber nehmen wir an, dass es in der Tat existiert auf unserem Computer stdio.c parallel 123 00:06:01,950 --> 00:06:02,650 mit Schall. 124 00:06:02,650 --> 00:06:04,960 Ihr Code ist kompilierten und montiert. 125 00:06:04,960 --> 00:06:09,200 stdio.c 's Code wird kompiliert und montiert, so dass diese letzte 126 00:06:09,200 --> 00:06:13,730 Schritt, hier unten, wir müssen irgendwie Link, so zu sprechen, Ihre Nullen und Einsen 127 00:06:13,730 --> 00:06:18,430 mit seinem Nullen und Einsen in einem einfaches Programm, das letztendlich 128 00:06:18,430 --> 00:06:20,540 rief nur hallo. 129 00:06:20,540 --> 00:06:23,340 >> Also das ist alles von der Magie, ist wurden bisher geschieht. 130 00:06:23,340 --> 00:06:26,430 Und wird auch weiterhin diese nehmen Prozesse für selbstverständlich halten, sondern erkennen, 131 00:06:26,430 --> 00:06:28,750 es gibt eine Menge von saftigen Details geht es unter. 132 00:06:28,750 --> 00:06:31,920 Und das ist, was macht Ihr Computer mit Intel inside 133 00:06:31,920 --> 00:06:33,940 besonders ausgeprägt. 134 00:06:33,940 --> 00:06:37,020 >> Also in diesem Sinne, wenn Sie möchten, besuchen Sie uns für das Mittagessen an diesem Freitag, tun zu gehen 135 00:06:37,020 --> 00:06:41,570 zu den üblichen Ort cs50.net/rsvp, 01.15 an diesem Freitag. 136 00:06:41,570 --> 00:06:43,400 Und nun ein paar Ankündigungen. 137 00:06:43,400 --> 00:06:44,670 So haben wir eine gute Nachricht. 138 00:06:44,670 --> 00:06:45,970 Und wir haben einige schlechte Nachrichten. 139 00:06:45,970 --> 00:06:47,260 Beginnen Sie mit einigen guten Nachrichten hier. 140 00:06:47,260 --> 00:06:52,038 141 00:06:52,038 --> 00:06:54,510 >> [Stöhnt] 142 00:06:54,510 --> 00:06:54,710 >> In Ordnung. 143 00:06:54,710 --> 00:06:56,670 Nun, es ist technisch ein Feiertag, so es ist nicht so sehr ein Geschenk von uns. 144 00:06:56,670 --> 00:06:58,030 Aber dann die schlechten Nachrichten natürlich. 145 00:06:58,030 --> 00:07:00,550 146 00:07:00,550 --> 00:07:01,880 >> [Stöhnt] 147 00:07:01,880 --> 00:07:03,530 >> Ich verbrachte viel Zeit auf diesen Animationen. 148 00:07:03,530 --> 00:07:04,690 >> [Gelächter] 149 00:07:04,690 --> 00:07:07,000 >> Es wird eine Überprüfung Session am kommenden Montag. 150 00:07:07,000 --> 00:07:08,340 Es wird um 5:30 Uhr sein. 151 00:07:08,340 --> 00:07:11,210 Wir werden Sie über all diese Details erinnern per E-Mail über den Verlauf der 152 00:07:11,210 --> 00:07:13,470 Website in nur ein paar Tage Zeit. 153 00:07:13,470 --> 00:07:16,610 Es wird gefilmt und zur Verfügung gestellt werden kurz danach. 154 00:07:16,610 --> 00:07:19,200 Also, wenn Sie nicht an diesem Montag Nacht-Slot, keine Sorge. 155 00:07:19,200 --> 00:07:22,270 Abschnitte in der kommenden Woche wird auch konzentrieren sich auf eine Bewertung für das Quiz. 156 00:07:22,270 --> 00:07:25,670 Wenn Ihr Abschnitt ist am Montag, das ist Tat Universität Urlaub, werden wir 157 00:07:25,670 --> 00:07:26,920 noch in Abschnitt erfüllen. 158 00:07:26,920 --> 00:07:28,890 Wenn man einfach nicht machen, dass Abschnitt, weil du gehst 159 00:07:28,890 --> 00:07:29,860 entfernt, ist das in Ordnung. 160 00:07:29,860 --> 00:07:33,710 Nehmen Sie an einem Sonntag oder Dienstag oder Abschnitt tune-in, um Jasons Abschnitt, das ist 161 00:07:33,710 --> 00:07:35,110 online verfügbar. 162 00:07:35,110 --> 00:07:37,490 >> Also, noch mehr schlechte Nachrichten. 163 00:07:37,490 --> 00:07:41,960 So nach dem Lehrplan, wir haben Vortrag am kommenden Freitag. 164 00:07:41,960 --> 00:07:43,690 Aber die gute Nachricht - 165 00:07:43,690 --> 00:07:44,860 klar, verbrachte ich viel Zeit zu diesem Thema. 166 00:07:44,860 --> 00:07:45,280 >> [Gelächter] 167 00:07:45,280 --> 00:07:47,140 >> Wir werden am kommenden Freitag die Vorträge abzubrechen. 168 00:07:47,140 --> 00:07:50,590 Also das wird ein Fest für uns sein, damit Sie kann wirklich eine schöne Abwechslung in 169 00:07:50,590 --> 00:07:52,990 zwischen dieser Woche bis zwei Wochen damit. 170 00:07:52,990 --> 00:07:57,460 Also keine Vorlesungen nächste Woche, nur ein winziger kleines Quiz, für das Sie sollte 171 00:07:57,460 --> 00:07:59,030 zunehmend aufgeregt. 172 00:07:59,030 --> 00:08:03,870 >> So lasst uns nun unsere Aufmerksamkeit auf etwas, das ist in der Tat mehr visuelle 173 00:08:03,870 --> 00:08:06,990 und spannender zu gestalten und die Bühne für das, was ist los, um am Horizont 174 00:08:06,990 --> 00:08:08,420 in nur ein paar Wochen Zeit. 175 00:08:08,420 --> 00:08:12,160 Nach dem ersten Quiz, wir drehen die Schwerpunkt unseres Problems Sätze zu einem anderen 176 00:08:12,160 --> 00:08:16,710 Domain-spezifisches Problem, dass der Forensik oder Sicherheit im Allgemeinen. 177 00:08:16,710 --> 00:08:19,550 >> In der Tat, die Tradition mit diesem Problem Set ist für mich einer der 178 00:08:19,550 --> 00:08:24,850 Lehrbeauftragter oder CAs zu Fuß über Campus unter ein paar Fotos von 179 00:08:24,850 --> 00:08:29,450 erkennbar, aber nicht offensichtlich Menschen, Orte oder Dinge, dann jedes Jahr habe ich 180 00:08:29,450 --> 00:08:34,520 irgendwie versehentlich gelöscht oder korrumpieren die digitale Medien-Karte 181 00:08:34,520 --> 00:08:35,720 das ist in unserer Kamera. 182 00:08:35,720 --> 00:08:36,860 Aber keine große Sache. 183 00:08:36,860 --> 00:08:39,200 Ich kann gehen und stecken die in meinem Computer. 184 00:08:39,200 --> 00:08:43,010 Ich kann eine forensische Bild von ihm, so zu sprechen, durch Kopieren der Nullen und 185 00:08:43,010 --> 00:08:46,830 diejenigen aus dieser Speicherkarte, ob es ist ein SD-Card oder Compact-Flash-Karte oder 186 00:08:46,830 --> 00:08:48,100 was du bist vertraut mit. 187 00:08:48,100 --> 00:08:49,300 Und dann können wir Hand, die sich. 188 00:08:49,300 --> 00:08:53,190 >> Und so ist die Herausforderung für die Zukunft, unter anderem Dinge für Sie, wird es sein, zu schreiben 189 00:08:53,190 --> 00:08:58,630 C-Code, der eine ganze Reihe von erholt JPEGs für mich und enthüllt werden 190 00:08:58,630 --> 00:09:00,190 jene Menschen, Orte oder Dinge. 191 00:09:00,190 --> 00:09:03,340 Und wir werden auch zu sprechen, in dieses Problem gesetzt und in den kommenden Tagen, über 192 00:09:03,340 --> 00:09:04,440 Grafiken im Allgemeinen. 193 00:09:04,440 --> 00:09:06,140 Wir haben sie genutzt, einen Kurs, für ausbrechen. 194 00:09:06,140 --> 00:09:09,080 Aber du hast irgendwie für selbstverständlich existiert diese hohe Vorstellungen 195 00:09:09,080 --> 00:09:10,680 Rechtecke und Ovale. 196 00:09:10,680 --> 00:09:12,450 Aber unter der Haube es Pixel. 197 00:09:12,450 --> 00:09:14,370 Und Sie mussten mit dem Nachdenken über diese. 198 00:09:14,370 --> 00:09:18,800 Oder du wirst für p-Satz 4 haben zu denken, über die Lücke zwischen Ihrem Ziegel, wie 199 00:09:18,800 --> 00:09:21,990 schnell du Ball wird über Bewegung der Bildschirm für die ausbrechen. 200 00:09:21,990 --> 00:09:24,830 So gibt es diese Vorstellung von der Punkte auf dem Bildschirm, das ist 201 00:09:24,830 --> 00:09:26,290 ins Spiel kommen schon. 202 00:09:26,290 --> 00:09:29,430 >> Nun, was Sie sehen, obwohl, ist das, was erhalten Sie auf einem Computer-Bildschirm. 203 00:09:29,430 --> 00:09:33,680 Wenn Sie jemals etwas Gutes oder beobachtete schlechte TV, stehen die Chancen sie ziemlich viel 204 00:09:33,680 --> 00:09:36,280 behandeln das Publikum wie technophob , die nicht wirklich 205 00:09:36,280 --> 00:09:37,630 wissen viel über Computer. 206 00:09:37,630 --> 00:09:40,840 Und so ist es sehr einfach für die Polizei Detektiv zu sagen, können Sie 207 00:09:40,840 --> 00:09:41,710 sauber, dass Sie sich für mich? 208 00:09:41,710 --> 00:09:42,710 Oder verbessern, nicht wahr? 209 00:09:42,710 --> 00:09:45,550 Verbessern Sie ist wie das Modewort in die meisten jedes Verbrechen verwandten Show. 210 00:09:45,550 --> 00:09:49,240 Und die Realität ist, wenn Sie eine sehr nehmen verschwommene Bild eines Verdächtigen zu tun 211 00:09:49,240 --> 00:09:51,620 etwas schlecht, kann man nicht nur verbessern es. 212 00:09:51,620 --> 00:09:53,080 Sie können nicht in unendlich vergrößern. 213 00:09:53,080 --> 00:09:56,350 Sie können nicht in der Glitzern von jemandem sehen Auge, die die verpflichtet 214 00:09:56,350 --> 00:09:59,860 bestimmtes Verbrechen, trotz der Prävalenz dieser im Fernsehen. 215 00:09:59,860 --> 00:10:04,110 >> Und so mit, dass wir uns zu motivieren, dass kommenden Problem mit einem Blick auf gesetzt 216 00:10:04,110 --> 00:10:05,765 einige Shows, mit denen Sie Vielleicht kennen. 217 00:10:05,765 --> 00:10:06,500 >> [VIDEO PLAYBACK] 218 00:10:06,500 --> 00:10:07,835 >> -OK. 219 00:10:07,835 --> 00:10:09,956 Jetzt wollen wir einen guten Blick auf Sie zu besorgen. 220 00:10:09,956 --> 00:10:17,060 221 00:10:17,060 --> 00:10:17,766 >> -Halten Sie es. 222 00:10:17,766 --> 00:10:18,658 Führen Sie das zurück. 223 00:10:18,658 --> 00:10:19,550 >> -Warten Sie eine Minute. 224 00:10:19,550 --> 00:10:21,580 Gehen Sie nach rechts. 225 00:10:21,580 --> 00:10:21,800 >> -Es. 226 00:10:21,800 --> 00:10:22,690 Frieren Sie, dass. 227 00:10:22,690 --> 00:10:23,692 >> -Full screen. 228 00:10:23,692 --> 00:10:23,846 >> -OK. 229 00:10:23,846 --> 00:10:24,154 Frieren Sie, dass. 230 00:10:24,154 --> 00:10:25,140 >> -Ziehen Sie auf, dass, wird ya? 231 00:10:25,140 --> 00:10:27,090 >> Vektor-in an diesem Kerl durch das Hinterrad. 232 00:10:27,090 --> 00:10:29,730 >> Zoom-in direkt hier an dieser Stelle. 233 00:10:29,730 --> 00:10:33,700 >> -Mit der richtigen Ausrüstung, die abgebildete vergrößert und geschärft werden. 234 00:10:33,700 --> 00:10:34,490 >> -Was ist das? 235 00:10:34,490 --> 00:10:35,870 >> -Es ist eine Verbesserung Programm. 236 00:10:35,870 --> 00:10:36,793 >> -Können Sie sich klar, dass Sie überhaupt? 237 00:10:36,793 --> 00:10:38,560 >> -Ich weiß es nicht. 238 00:10:38,560 --> 00:10:39,090 Lassen Sie uns zu verbessern es. 239 00:10:39,090 --> 00:10:41,690 >> Enhance-Abschnitt A-6. 240 00:10:41,690 --> 00:10:43,510 >> -I erweitert das Detail und - 241 00:10:43,510 --> 00:10:44,456 >> -Ich denke, es ist genug, um zu verbessern. 242 00:10:44,456 --> 00:10:45,402 Lassen Sie es auf meinem Bildschirm. 243 00:10:45,402 --> 00:10:47,300 >> -Erhöhen Sie die Reflexion in ihrem Auge. 244 00:10:47,300 --> 00:10:49,330 >> -Lassen Sie uns diese durchlaufen Video-Enhancement. 245 00:10:49,330 --> 00:10:50,340 >> -Edgar, können Sie verbessern das? 246 00:10:50,340 --> 00:10:52,320 >> -Warte. 247 00:10:52,320 --> 00:10:54,290 >> -Ich habe auf dieser Reflexion gearbeitet. 248 00:10:54,290 --> 00:10:55,560 >> -Jemand Reflexion. 249 00:10:55,560 --> 00:10:56,440 >> -Reflection. 250 00:10:56,440 --> 00:10:57,940 >> -Es ist ein Spiegelbild von dem Gesicht des Mannes. 251 00:10:57,940 --> 00:10:58,860 >> -Die Reflexion. 252 00:10:58,860 --> 00:10:59,710 >> -Es ist eine Reflexion. 253 00:10:59,710 --> 00:11:00,900 >> In auf dem Spiegel-Zoom. 254 00:11:00,900 --> 00:11:03,500 >> -Sie können eine Reflexion. 255 00:11:03,500 --> 00:11:04,700 >> -Können Sie das Image von hier? 256 00:11:04,700 --> 00:11:05,700 >> -Können Sie erweitern ihn hier richtig? 257 00:11:05,700 --> 00:11:06,500 >> -Können Sie es verbessern? 258 00:11:06,500 --> 00:11:07,380 >> -Können Sie es verbessern? 259 00:11:07,380 --> 00:11:08,190 >> -Können wir verbessern das? 260 00:11:08,190 --> 00:11:08,940 >> -Können Sie es verbessern? 261 00:11:08,940 --> 00:11:10,280 >> Auf einem zweiten Halten, werde ich verbessern. 262 00:11:10,280 --> 00:11:11,570 >> In an der Tür-Zoom. 263 00:11:11,570 --> 00:11:12,180 >> -X10. 264 00:11:12,180 --> 00:11:13,052 >> -Zoom. 265 00:11:13,052 --> 00:11:13,197 >> [Gelächter] 266 00:11:13,197 --> 00:11:14,360 >> -Verschieben in. 267 00:11:14,360 --> 00:11:15,100 >> -Warten, zu stoppen. 268 00:11:15,100 --> 00:11:15,740 >> -Stopp. 269 00:11:15,740 --> 00:11:16,290 >> -Pause zu. 270 00:11:16,290 --> 00:11:19,390 >> -Drehen eines 75 Grad um die vertikale bitte. 271 00:11:19,390 --> 00:11:19,886 >> [Gelächter] 272 00:11:19,886 --> 00:11:24,350 >> -Beenden und zurück zum Teil über der Tür wieder. 273 00:11:24,350 --> 00:11:26,330 >> -Haben Sie ein Image Enhancer Das kann Bitmap? 274 00:11:26,330 --> 00:11:28,990 >> -Vielleicht können wir die Pradeep Sen Verfahren in das Fenster sehen. 275 00:11:28,990 --> 00:11:30,680 >> -Diese Software ist Stand der Technik. 276 00:11:30,680 --> 00:11:31,676 >> Das Symbol-Wert ist ausgeschaltet. 277 00:11:31,676 --> 00:11:34,166 >> -Mit der richtigen Kombination von Algorithmen. 278 00:11:34,166 --> 00:11:38,399 >> -Er Beleuchtung Algorithmen getroffen werden, um die nächste Stufe, und ich kann sie zu benutzen 279 00:11:38,399 --> 00:11:38,648 Verbesserung dieses Foto. 280 00:11:38,648 --> 00:11:42,050 >> -Lock auf und vergrößern die z-Achse. 281 00:11:42,050 --> 00:11:42,760 >> -Enhance. 282 00:11:42,760 --> 00:11:43,060 >> -Enhance. 283 00:11:43,060 --> 00:11:43,760 >> -Enhance. 284 00:11:43,760 --> 00:11:45,010 >> Einfrieren und zu verbessern. 285 00:11:45,010 --> 00:11:47,470 286 00:11:47,470 --> 00:11:47,910 >> [END VIDEO PLAYBACK] 287 00:11:47,910 --> 00:11:51,470 >> DAVID J. MALAN: So Problem Set 5 ist es, was vor uns liegt. 288 00:11:51,470 --> 00:11:55,260 So werden wir bald ein besseres Verständnis wann und warum man 289 00:11:55,260 --> 00:11:57,300 und unsere nicht in der gleichen Art und Weise zu verbessern. 290 00:11:57,300 --> 00:12:00,090 Aber zunächst wollen wir unsere Aufmerksamkeit zurück einige der Bausteine ​​wir werden 291 00:12:00,090 --> 00:12:02,250 müssen in der Lage sein, diese Geschichte zu erzählen. 292 00:12:02,250 --> 00:12:05,580 >> So erinnern, dass wir dieses Bild auf zog Montag und ein wenig der vergangenen Woche. 293 00:12:05,580 --> 00:12:09,970 Und dies beschreibt das Layout der Dinge in den Arbeitsspeicher Ihres Computers, wenn 294 00:12:09,970 --> 00:12:11,000 laufen einige Programm. 295 00:12:11,000 --> 00:12:14,310 Der Tech-Segment bis oben, Rückruf bezieht sich den tatsächlichen Nullen und Einsen 296 00:12:14,310 --> 00:12:16,000 das komponieren Ihrem Programm. 297 00:12:16,000 --> 00:12:19,340 Es gibt, darunter, einige initialisiert oder initialisierte Daten, die typischerweise 298 00:12:19,340 --> 00:12:22,910 bezieht sich auf Dinge wie Konstanten oder Strings oder globale Variablen, die haben 299 00:12:22,910 --> 00:12:24,200 wurde im Vorfeld erklärt. 300 00:12:24,200 --> 00:12:26,500 Es ist der Haufen, aber wir kommen zurück zu, dass in einem Bit. 301 00:12:26,500 --> 00:12:27,410 >> Und dann ist da noch der Stapel. 302 00:12:27,410 --> 00:12:30,660 Ähnlich wie ein Stapel von Ablagen in der Cafeteria, das ist, wo bekommt Speicher 303 00:12:30,660 --> 00:12:33,610 geschichtet und geschichtet, wenn Sie tun, was in einem Programm? 304 00:12:33,610 --> 00:12:36,380 305 00:12:36,380 --> 00:12:37,730 Was ist der Stapel für den Einsatz? 306 00:12:37,730 --> 00:12:39,320 >> Ja? 307 00:12:39,320 --> 00:12:40,000 >> Aufruf der Funktion. 308 00:12:40,000 --> 00:12:42,890 Jedes Mal, wenn Sie eine Funktion aufrufen, ist es gegeben, Splitter der Erinnerung für seine 309 00:12:42,890 --> 00:12:45,020 lokale Variablen oder seine Parameter. 310 00:12:45,020 --> 00:12:48,810 Und bildhaft, sehen wir, dass mit jedem aufeinanderfolgenden Funktion aufgerufen, wenn A 311 00:12:48,810 --> 00:12:52,520 Anrufe Anrufe B C D fordert, sie auf den Stapel geschichtet bekommen. 312 00:12:52,520 --> 00:12:55,630 Und innerhalb jeder dieser Scheiben Speicher ist im Wesentlichen eine einzigartige Rahmen 313 00:12:55,630 --> 00:12:58,590 für die Funktion, die natürlich, Problematisch ist, wenn Sie übergeben wollen 314 00:12:58,590 --> 00:13:01,850 von einer Funktion zur anderen ein Stück von Daten, dass Sie es wollen 315 00:13:01,850 --> 00:13:03,500 zu mutieren oder zu ändern. 316 00:13:03,500 --> 00:13:08,060 >> Also, was war unsere Lösung ermöglicht Eine Funktion von einem Stapel dargestellt 317 00:13:08,060 --> 00:13:11,390 Rahmen, um das Gedächtnis nach innen ändern von einem anderen Stack-Frame? 318 00:13:11,390 --> 00:13:14,590 Wie diese beiden miteinander reden? 319 00:13:14,590 --> 00:13:18,510 So mittels Zeigern oder Adressen, was wiederum nur beschreiben, wo in 320 00:13:18,510 --> 00:13:22,280 Speicher, durch einen bestimmten Biß-Nummer, die insbesondere 321 00:13:22,280 --> 00:13:23,830 Wert gefunden werden kann. 322 00:13:23,830 --> 00:13:26,860 So erinnern wir letztes Mal auch fortgesetzt die Geschichte und sah ein 323 00:13:26,860 --> 00:13:28,280 ziemlich buggy Programm. 324 00:13:28,280 --> 00:13:32,900 Und dieses Programm ist buggy für ein paar Gründe, aber die eine ist besorgniserregend 325 00:13:32,900 --> 00:13:34,620 weil es nicht auf das, was zu überprüfen? 326 00:13:34,620 --> 00:13:39,111 327 00:13:39,111 --> 00:13:40,450 >> Ja, doch fehlt es an den Eingang zu überprüfen. 328 00:13:40,450 --> 00:13:41,870 Es tut uns leid? 329 00:13:41,870 --> 00:13:43,880 >> Wenn es mehr als 12 Zeichen. 330 00:13:43,880 --> 00:13:47,260 So sehr intelligent, wenn Sie anrufen memcopy, die, wie der Name schon sagt, nur 331 00:13:47,260 --> 00:13:50,630 Kopien Speicher aus dem zweiten Argument in seine erste Argument. 332 00:13:50,630 --> 00:13:54,730 Das dritte Argument, sehr intelligent ist überprüft, um sicherzustellen, dass Sie nicht 333 00:13:54,730 --> 00:13:59,400 kopieren mehr als, in diesem Fall die Länge der Bar, die Anzahl der Zeichen, 334 00:13:59,400 --> 00:14:03,810 in das Ziel ist, die diese Array C. Aber das Problem ist, dass das, was 335 00:14:03,810 --> 00:14:07,230 wenn C selbst ist nicht groß genug zu umgehen? 336 00:14:07,230 --> 00:14:09,900 Du wirst die Nummer kopieren Bytes, die Sie schon immer gegeben. 337 00:14:09,900 --> 00:14:13,040 Aber was tun Sie tatsächlich mehr Bytes als Sie haben Platz für? 338 00:14:13,040 --> 00:14:16,770 >> Nun, dieses Programm nur sehr töricht blind weiter zu nehmen, was es ist 339 00:14:16,770 --> 00:14:20,650 gegeben ist, hallo Backslash 0 toll, wenn String ist kurz 340 00:14:20,650 --> 00:14:22,040 genug, wie fünf Zeichen. 341 00:14:22,040 --> 00:14:26,470 Aber wenn es tatsächlich 12 Zeichen oder 1.200 Zeichen, sahen wir letzte Mal 342 00:14:26,470 --> 00:14:29,380 dass Sie nur gehen, um ganz Speicher überschreiben, dass 343 00:14:29,380 --> 00:14:30,470 nicht Ihnen gehören. 344 00:14:30,470 --> 00:14:34,390 Und am schlimmsten Fall, wenn Sie überschreiben, dass Rotanteil es, dass wir das genannt 345 00:14:34,390 --> 00:14:35,380 Rückkehr-Adresse - 346 00:14:35,380 --> 00:14:38,370 dies ist nur, wo der Computer automatisch für Sie, hinter der 347 00:14:38,370 --> 00:14:43,130 Szenen, Biesen entfernt ein 32-Bit-Wert, es erinnert an welche Adresse es sollte 348 00:14:43,130 --> 00:14:47,080 zurück, wenn foo, diese andere Funktion, erfolgt die Ausführung. 349 00:14:47,080 --> 00:14:49,320 Es ist ein Brotkrümel von möglichen zu dem es zurückkehrt. 350 00:14:49,320 --> 00:14:52,490 Wenn Sie überschreiben, dass möglicherweise auch wenn Sie der Bösewicht sind, kann, könnte 351 00:14:52,490 --> 00:14:54,750 potentiell übernehmen jemandes Computer. 352 00:14:54,750 --> 00:14:58,020 Und du wirst ganz sicher Absturz in den meisten Fällen. 353 00:14:58,020 --> 00:15:01,690 >> Jetzt wurde dieses Problem nur verschärft als wir kamen ins Gespräch über das Gedächtnis 354 00:15:01,690 --> 00:15:03,010 Management im Allgemeinen. 355 00:15:03,010 --> 00:15:07,150 Und malloc, für Speicherzuweisung, ist ein Funktion, die wir verwenden können, um zuteilen 356 00:15:07,150 --> 00:15:11,260 Speicher, wenn wir nicht im Voraus wissen, dass wir vielleicht brauchen einige. 357 00:15:11,260 --> 00:15:13,960 So, zum Beispiel, wenn ich gehe zurück an das Gerät hier. 358 00:15:13,960 --> 00:15:21,010 Und ich eröffnen vom letzten Mal hello2.c, erinnern dieses Programm hier, das sah 359 00:15:21,010 --> 00:15:23,500 ein wenig so etwas wie dieses, nur drei Linien - 360 00:15:23,500 --> 00:15:27,940 Ihren Namen, dann string name, auf der linken Seite, gleich getstring. 361 00:15:27,940 --> 00:15:29,690 Und dann haben wir drucken es aus, den Namen des Benutzers. 362 00:15:29,690 --> 00:15:31,170 >> Also das war ein super einfaches Programm. 363 00:15:31,170 --> 00:15:34,870 Um klar zu sein, lass mich gehen und machen hallo-2. 364 00:15:34,870 --> 00:15:36,680 Ich werde dot Schrägstrich hallo-2 zu tun. 365 00:15:36,680 --> 00:15:37,750 Nennen Sie Ihren Namen - 366 00:15:37,750 --> 00:15:38,140 David. 367 00:15:38,140 --> 00:15:38,840 Enter. 368 00:15:38,840 --> 00:15:39,540 Hallo David. 369 00:15:39,540 --> 00:15:41,060 Es scheint OK zu arbeiten. 370 00:15:41,060 --> 00:15:43,140 Aber was wirklich vor sich geht unter Haube hier? 371 00:15:43,140 --> 00:15:44,670 Lassen Sie uns zunächst schälen einigen Schichten. 372 00:15:44,670 --> 00:15:48,380 String ist nur ein Synonym wir haben realisiert für was? 373 00:15:48,380 --> 00:15:49,110 Char Stern. 374 00:15:49,110 --> 00:15:52,740 So machen wir es ein wenig mehr arkanen aber technisch korrekt, dass diese 375 00:15:52,740 --> 00:15:55,570 ist ein char Stern, was bedeutet, dass Name, ja, das ist eine Variable. 376 00:15:55,570 --> 00:15:59,920 Aber welchen Namen speichert die Adresse ein char, die ein wenig seltsam fühlt 377 00:15:59,920 --> 00:16:01,050 weil ich immer wieder einen String. 378 00:16:01,050 --> 00:16:03,580 Ich gehe zurück bekommen mehrere Zeichen kein char. 379 00:16:03,580 --> 00:16:07,400 >> Aber natürlich, Sie benötigen nur die erste char die Adresse zu erinnern, wo die 380 00:16:07,400 --> 00:16:08,870 ganze Reihe ist, weil warum? 381 00:16:08,870 --> 00:16:12,700 Wie kann man herausfinden, wo das Ende des die Zeichenfolge ist zu wissen, den Anfang? 382 00:16:12,700 --> 00:16:13,630 Der Backslash Null. 383 00:16:13,630 --> 00:16:17,260 Also mit diesen beiden Hinweisen Sie herausfinden, vor dem Beginn und dem Ende der 384 00:16:17,260 --> 00:16:20,280 jede Zeichenfolge sind, so lange wie sie sind ordnungsgemäß an dieses null gebildet 385 00:16:20,280 --> 00:16:22,110 Terminator, dass Backslash Null. 386 00:16:22,110 --> 00:16:24,520 >> Aber dies ruft getstring. 387 00:16:24,520 --> 00:16:28,020 Und es stellt sich heraus, dass getstring all dieser Zeit war Art von 388 00:16:28,020 --> 00:16:28,820 Betrug für uns. 389 00:16:28,820 --> 00:16:32,460 Es mache diese Arbeit, um sicher zu sein, immer einen String vom Benutzer. 390 00:16:32,460 --> 00:16:34,580 Aber wo ist die Erinnerung worden herkommt? 391 00:16:34,580 --> 00:16:38,440 Wenn wir zurück zu dem Bild hier und gelten die Definition von nur 392 00:16:38,440 --> 00:16:42,610 Moment vor, dass der Stapel ist, wo Speicher geht, wenn Funktionen aufgerufen werden, 393 00:16:42,610 --> 00:16:45,370 nach dieser Logik, wenn Sie getstring nennen, und dann habe ich in geben 394 00:16:45,370 --> 00:16:50,900 D-A-V-I-D eingeben, wo ist D-A-V-I-D Schrägstrich Null gespeichert, basierend auf dem 395 00:16:50,900 --> 00:16:53,480 Geschichte haben wir uns gesagt, bis jetzt? 396 00:16:53,480 --> 00:16:55,190 >> Es scheint in sein der Stapel, nicht wahr? 397 00:16:55,190 --> 00:16:58,120 Wenn Sie den String rufen Sie bekommen ein kleines Stück vom Speicher auf dem Stack. 398 00:16:58,120 --> 00:17:01,630 So liegt es nahe, dass D-A-V-I-D Backslash Null gespeichert 399 00:17:01,630 --> 00:17:02,770 es in den Stapel. 400 00:17:02,770 --> 00:17:07,680 Aber warten Sie eine Minute, GetString Renditen dass string, so zu sprechen, was bedeutet, 401 00:17:07,680 --> 00:17:11,700 es ist Fach aus der Cafeteria wird vom Stack genommen. 402 00:17:11,700 --> 00:17:14,560 Wir sagten letzte Mal, dass, sobald ein Funktion zurück, und nehmen Sie die 403 00:17:14,560 --> 00:17:20,109 Tablett, so zu sprechen, vom Stapel, was können Sie über den Resten davon ausgehen, 404 00:17:20,109 --> 00:17:21,819 dass der Speicher? 405 00:17:21,819 --> 00:17:25,160 Ich Art von Grenzziehung sie als Fragezeichen weil sie wirksam geworden 406 00:17:25,160 --> 00:17:26,250 unbekannte Werte. 407 00:17:26,250 --> 00:17:29,500 Sie können wiederverwendet werden, wenn einige werden nächste Funktion aufgerufen wird. 408 00:17:29,500 --> 00:17:31,870 >> Mit anderen Worten, wenn wir passieren zu speichern - 409 00:17:31,870 --> 00:17:34,350 Ich werde ziehen schnell ein Bild hier des Stapels. 410 00:17:34,350 --> 00:17:38,690 Wenn wir passieren zu zeichnen den Boden meiner Memory-Segment, und wir sagen 411 00:17:38,690 --> 00:17:42,230 dass dies der Ort der Erinnerung besetzt durch Haupt-und vielleicht arg c und 412 00:17:42,230 --> 00:17:46,790 arg v und alles, was in dem Programm, wenn getstring genannt wird, 413 00:17:46,790 --> 00:17:51,120 vermutlich getstring bekommt ein Teil des Speichers hier. 414 00:17:51,120 --> 00:17:53,940 Und dann D-A-V-I-D irgendwie landet in dieser Funktion. 415 00:17:53,940 --> 00:17:55,320 Und ich werde vereinfachen. 416 00:17:55,320 --> 00:18:00,050 Aber lassen Sie uns davon ausgehen, dass ihre D-A-V-I-D Backslash Null. 417 00:18:00,050 --> 00:18:03,500 So dass diese viele Bytes in verwendet der Rahmen für getstring. 418 00:18:03,500 --> 00:18:08,270 >> Aber sobald getstring Renditen, wir sagte letzte Mal, dass dieser Speicher über 419 00:18:08,270 --> 00:18:11,340 hier wird alles - woops! - 420 00:18:11,340 --> 00:18:14,270 alles wird effektiv gelöscht. 421 00:18:14,270 --> 00:18:17,220 Und wir können dies nun denken als Fragezeichen Noten denn wer weiß, 422 00:18:17,220 --> 00:18:18,720 was los ist, um von dieser Erinnerung geworden. 423 00:18:18,720 --> 00:18:22,130 In der Tat, ich bin sehr oft Funktionen aufrufen andere als getstring. 424 00:18:22,130 --> 00:18:24,750 Und sobald ich einige andere nennen Funktion als getstring, vielleicht nicht in 425 00:18:24,750 --> 00:18:28,860 Dieses spezielle Programm wir sahen an, aber einige andere, sicherlich eine andere 426 00:18:28,860 --> 00:18:34,180 Funktion könnte am Ende wird gegeben Diese nächste Stelle in dem Stapel. 427 00:18:34,180 --> 00:18:39,410 >> So kann es nicht so, dass getstring speichert sein D-A-V-I-D auf dem Stapel, weil ich würde 428 00:18:39,410 --> 00:18:41,040 verlieren sofort Zugriff darauf. 429 00:18:41,040 --> 00:18:43,720 Aber wir wissen, dass sie GetString gibt nur was? 430 00:18:43,720 --> 00:18:47,220 Es ist nicht wieder zu mir sechs Zeichen. 431 00:18:47,220 --> 00:18:51,090 Wie ist es wirklich wieder haben schließen wir beim letzten Mal? 432 00:18:51,090 --> 00:18:52,480 Die Adresse des ersten. 433 00:18:52,480 --> 00:18:56,650 Also irgendwie, wenn Sie getstring genannt, es Zuweisung eines Teil des Speichers für 434 00:18:56,650 --> 00:18:59,620 der String, der Benutzer Art und dann Rückkehr-Adresse von ihm. 435 00:18:59,620 --> 00:19:02,930 Und es stellt sich heraus, dass, wenn Sie wollen funktionieren, um Speicher in dieses zuweisen 436 00:19:02,930 --> 00:19:08,390 Weg und Rückkehr zu der Person, die als diese Funktion wird die Adresse 437 00:19:08,390 --> 00:19:11,870 dass Teil des Speichers, Sie absolut kann es nicht in den Stapel an der 438 00:19:11,870 --> 00:19:14,750 Boden, denn es ist nur funktionell werde nicht verkaufen sehr zu 439 00:19:14,750 --> 00:19:17,800 schnell, so können Sie wahrscheinlich erraten, wo wir sind wahrscheinlich zu werfen 440 00:19:17,800 --> 00:19:20,130 Stattdessen wird die sogenannte Heap. 441 00:19:20,130 --> 00:19:25,290 >> So zwischen der Unterseite des Speichers Layout und die Oberseite des Speichers 442 00:19:25,290 --> 00:19:26,820 Layout gibt eine ganze Reihe von Segmenten. 443 00:19:26,820 --> 00:19:29,270 Einer ist der Stapel, und rechts darüber ist die Heap. 444 00:19:29,270 --> 00:19:33,680 Und Heap ist nur eine andere Brocken Speicher, der nicht für Funktionen wird benutzt 445 00:19:33,680 --> 00:19:34,770 wenn sie aufgerufen wird. 446 00:19:34,770 --> 00:19:38,100 Es ist für die längerfristige Speicher verwendet, wenn Sie wollen eine Funktion, einige greifen 447 00:19:38,100 --> 00:19:42,700 Speicher und in der Lage sein zu hängen, um es ohne die Kontrolle zu verlieren über sie. 448 00:19:42,700 --> 00:19:45,550 >> Nun könnte man vielleicht sofort sehen, dass dies nicht 449 00:19:45,550 --> 00:19:48,060 notwendigerweise mit perfektem Design. 450 00:19:48,060 --> 00:19:51,350 Als Ihr Programmspeicher auf zugeteilt der Stapel, oder wie Sie es nennen und mehr 451 00:19:51,350 --> 00:19:55,540 mehr Funktionen oder wie Sie zuweisen Speicher auf dem Heap mit malloc off als 452 00:19:55,540 --> 00:20:00,690 getstring tut, was deutlich scheint unvermeidlich Problem sein? 453 00:20:00,690 --> 00:20:00,860 >> Richtig. 454 00:20:00,860 --> 00:20:03,150 Ebenso wie die Tatsache, dass diese Pfeile sind zueinander zeigen 455 00:20:03,150 --> 00:20:04,380 Das verheißt nichts Gutes. 456 00:20:04,380 --> 00:20:08,630 Und in der Tat konnten wir sehr schnell abstürzen ein Programm in einer beliebigen Anzahl von Möglichkeiten. 457 00:20:08,630 --> 00:20:12,050 In der Tat, ich glaube, wir haben könnten dies getan versehentlich einmal. 458 00:20:12,050 --> 00:20:14,020 Oder wenn nicht, lass es uns tun bewusst jetzt. 459 00:20:14,020 --> 00:20:21,330 Lassen Sie mich gehen und schreiben Super schnell ein Programm namens dontdothis.c. 460 00:20:21,330 --> 00:20:26,730 Und jetzt gehe ich in hier und Sie sind scharf stdio.h. 461 00:20:26,730 --> 00:20:32,620 Lassen Sie uns erklären function foo nimmt keine Argumente, ist die 462 00:20:32,620 --> 00:20:34,040 bezeichnet sowie von Leere. 463 00:20:34,040 --> 00:20:37,830 >> Und das einzige, was foo zu tun ist, ist Aufruf foo, das ist wahrscheinlich nicht der 464 00:20:37,830 --> 00:20:39,100 klügste Idee, aber so zu sein. 465 00:20:39,100 --> 00:20:40,490 Ent wichtigsten nichtig. 466 00:20:40,490 --> 00:20:45,270 Nun ist die einzige Sache wichtigsten wird zu tun ist, foo auch telefonisch. 467 00:20:45,270 --> 00:20:51,050 Und nur zum Spaß, ich werde gehen vor hier und printf sagen "Hallo aus 468 00:20:51,050 --> 00:20:52,340 foo. " 469 00:20:52,340 --> 00:20:52,890 >> OK. 470 00:20:52,890 --> 00:21:00,160 Also wenn ich keine Fehler machen, Machen dontdothis dot Schrägstrich. 471 00:21:00,160 --> 00:21:01,960 Und lasst es uns in einem größeren Fenster - 472 00:21:01,960 --> 00:21:03,210 dot Schrägstrich dontdothis. 473 00:21:03,210 --> 00:21:07,590 474 00:21:07,590 --> 00:21:08,840 Komm. 475 00:21:08,840 --> 00:21:10,940 476 00:21:10,940 --> 00:21:11,890 Uh oh. 477 00:21:11,890 --> 00:21:13,100 Offenbar können Sie dies tun. 478 00:21:13,100 --> 00:21:15,190 Verdammt. 479 00:21:15,190 --> 00:21:16,190 OK. 480 00:21:16,190 --> 00:21:16,580 Warten. 481 00:21:16,580 --> 00:21:17,370 Stand by. 482 00:21:17,370 --> 00:21:18,270 Haben wir - 483 00:21:18,270 --> 00:21:20,110 Wir haben es mit Nutzen. 484 00:21:20,110 --> 00:21:22,050 >> [Seufzt] 485 00:21:22,050 --> 00:21:25,110 >> Ich weiß, aber ich denke, dass wir nur gelöscht, dass. 486 00:21:25,110 --> 00:21:28,410 Äh, ja. 487 00:21:28,410 --> 00:21:30,660 Verdammt. 488 00:21:30,660 --> 00:21:32,640 Lösen Sie dieses Rob. 489 00:21:32,640 --> 00:21:34,678 Was? 490 00:21:34,678 --> 00:21:35,928 Es ist sehr einfach. 491 00:21:35,928 --> 00:21:43,820 492 00:21:43,820 --> 00:21:47,360 Ja, wandten wir uns Optimierung aus. 493 00:21:47,360 --> 00:21:48,970 OK, Stand bye. 494 00:21:48,970 --> 00:21:49,950 Jetzt fühle ich mich besser. 495 00:21:49,950 --> 00:21:51,390 OK. 496 00:21:51,390 --> 00:21:51,780 In Ordnung. 497 00:21:51,780 --> 00:21:53,430 >> Also lasst uns diese neu kompilieren - 498 00:21:53,430 --> 00:21:55,880 Machen Sie dontdothis. 499 00:21:55,880 --> 00:22:00,090 Möglicherweise müssen Sie diese umbenennen dothis.c in nur einem Augenblick. 500 00:22:00,090 --> 00:22:00,710 Dort gehen wir. 501 00:22:00,710 --> 00:22:01,240 Vielen Dank. 502 00:22:01,240 --> 00:22:02,050 OK. 503 00:22:02,050 --> 00:22:05,480 Also die Tatsache, dass ich Druck etwas aus war eigentlich nur 504 00:22:05,480 --> 00:22:08,150 Verlangsamung des Prozesses, durch den wir würde diesen Punkt erreicht haben. 505 00:22:08,150 --> 00:22:08,510 OK. 506 00:22:08,510 --> 00:22:08,870 Puh! 507 00:22:08,870 --> 00:22:11,180 >> Also, was ist eigentlich los? 508 00:22:11,180 --> 00:22:14,440 Der Grund da, nur so nebenbei, ist etwas zu tun in Bezug auf die Ein-und 509 00:22:14,440 --> 00:22:17,270 Ausgang tendenziell langsamer, weil Sie haben, um die Zeichen zu schreiben 510 00:22:17,270 --> 00:22:18,600 Bildschirm ist zu blättern. 511 00:22:18,600 --> 00:22:21,720 So lange Rede, kurzer Sinn, ich hatte eigentlich passiert so ungeduldig, müssten wir 512 00:22:21,720 --> 00:22:23,260 gesehen dieses Endergebnis auch. 513 00:22:23,260 --> 00:22:26,220 Nun, ich habe Ritt der Druck-ups, sehen wir es sofort. 514 00:22:26,220 --> 00:22:28,410 Also, warum ist das passiert. 515 00:22:28,410 --> 00:22:31,300 Nun, die einfache Erklärung, natürlich, ist, dass foo wahrscheinlich sollte nicht 516 00:22:31,300 --> 00:22:32,500 werden, die sich selbst. 517 00:22:32,500 --> 00:22:34,470 >> Jetzt im allgemeinen, dies Rekursion. 518 00:22:34,470 --> 00:22:36,970 Und wir dachten, ein paar Wochen Vor rekursiv ist gut. 519 00:22:36,970 --> 00:22:40,330 Rekursion ist diese magische Art und Weise der sich selbst auszudrücken Super lapidar. 520 00:22:40,330 --> 00:22:41,400 Und es funktioniert einfach. 521 00:22:41,400 --> 00:22:45,060 Aber es ist ein wesentliches Merkmal aller die rekursive Programme, die wir gesprochen haben 522 00:22:45,060 --> 00:22:48,260 über und sah so weit, die war, dass sie, was hatte? 523 00:22:48,260 --> 00:22:52,610 Ein Basis-Fall, der einige hart codiert war Fall, dass in einigen Situationen die 524 00:22:52,610 --> 00:22:56,210 nicht nennen foo, was eindeutig hier nicht der Fall. 525 00:22:56,210 --> 00:22:58,920 >> Also, was ist wirklich passiert in Bezug auf diesem Bild? 526 00:22:58,920 --> 00:23:01,790 Nun, wenn der Haupt ruft foo, es bekommt ein Stück Erinnerung. 527 00:23:01,790 --> 00:23:04,150 Wenn foo foo aufruft, bekommt es ein Stück Erinnerung. 528 00:23:04,150 --> 00:23:06,430 Wenn foo foo aufruft, bekommt sie eine Scheibe. 529 00:23:06,430 --> 00:23:07,080 Es wird eine Scheibe. 530 00:23:07,080 --> 00:23:08,120 Es wird eine Scheibe. 531 00:23:08,120 --> 00:23:09,460 Da foo wird nie wiederkommen. 532 00:23:09,460 --> 00:23:12,160 Wir sind nie Löschen einer von denen Rahmen aus dem Stapel. 533 00:23:12,160 --> 00:23:15,930 Daher freuen wir uns über den Haufen blasen, nicht zu erwähnen, wer weiß, was sonst, und 534 00:23:15,930 --> 00:23:19,600 wir überschreiten die Grenzen unserer so genannte Segment des Speichers. 535 00:23:19,600 --> 00:23:21,790 Fehler Es gehen Segmentierung falsch. 536 00:23:21,790 --> 00:23:24,110 >> So ist die Lösung gibt es offensichtlich nicht tun. 537 00:23:24,110 --> 00:23:28,830 Aber das größere Implikation ist, dass, ja, es ist absolut einige Grenze, 538 00:23:28,830 --> 00:23:32,470 auch wenn es nicht gut definiert, so wie viele Funktionen, die Sie bei einem Anruf können 539 00:23:32,470 --> 00:23:34,970 Programm, wie oft eine Funktion kann sich nennen. 540 00:23:34,970 --> 00:23:38,430 Also auch wenn wir predigten Rekursion als dieser möglicherweise magische Sache ein 541 00:23:38,430 --> 00:23:41,870 vor einigen Wochen für den Sigma Funktion, und wenn wir die Daten 542 00:23:41,870 --> 00:23:45,270 Strukturen und CS50, sehen Sie andere Anwendungen für sie, ist es nicht 543 00:23:45,270 --> 00:23:46,500 unbedingt die beste Sache. 544 00:23:46,500 --> 00:23:50,070 Denn wenn eine Funktion nennt sich, nennt sich, auch wenn es eine Basis 545 00:23:50,070 --> 00:23:54,860 Fall, wenn Sie nicht, dass base Fall getroffen für 1.000 oder 10.000 Anrufe Anrufe durch 546 00:23:54,860 --> 00:23:58,800 dass die Zeit, die Dir vielleicht aus dem Zimmer laufen haben auf Ihrem sogenannten Stack und Hit 547 00:23:58,800 --> 00:24:00,400 einige andere Segmente des Speichers. 548 00:24:00,400 --> 00:24:03,950 Also es ist auch ein Design trade-off zwischen Eleganz und zwischen 549 00:24:03,950 --> 00:24:06,920 Robustheit Ihren speziellen Umsetzung. 550 00:24:06,920 --> 00:24:10,780 >> So gibt es einen anderen Nachteil oder andere gotcha, was wir haben 551 00:24:10,780 --> 00:24:11,720 wurden bisher tun. 552 00:24:11,720 --> 00:24:12,980 Als ich anrief getstring - 553 00:24:12,980 --> 00:24:15,120 lass mich gehen zurück in hallo-2. 554 00:24:15,120 --> 00:24:18,170 Beachten Sie, dass ich rufe getstring, das ist wieder eine Adresse. 555 00:24:18,170 --> 00:24:20,730 Und wir behaupten heute, dass Adresse ist aus dem Haufen. 556 00:24:20,730 --> 00:24:24,480 Und jetzt bin ich den Ausdruck der String an dieser Adresse. 557 00:24:24,480 --> 00:24:27,000 Aber wir haben nie genannt Gegenteil von getstring. 558 00:24:27,000 --> 00:24:30,850 Wir hatten noch nie eine Funktion wie CALLL ungetstring, wo man die Hand zurück 559 00:24:30,850 --> 00:24:31,610 dass der Speicher. 560 00:24:31,610 --> 00:24:33,250 Aber ehrlich gesagt wir wahrscheinlich hätte sein sollen. 561 00:24:33,250 --> 00:24:37,390 Denn wenn wir immer wieder die Computer für das Gedächtnis, durch jemanden wie 562 00:24:37,390 --> 00:24:40,830 getstring aber nie geben es zurück, sicherlich Das ist auch verpflichtet, zu führen 563 00:24:40,830 --> 00:24:42,970 Probleme, wobei wir über genügend Arbeitsspeicher ausgeführt. 564 00:24:42,970 --> 00:24:46,140 >> Und in der Tat können wir für diese aussehen Probleme mit dem neuen Werkzeug, dessen Nutzung 565 00:24:46,140 --> 00:24:47,640 ist ein wenig kryptisch zu geben. 566 00:24:47,640 --> 00:24:50,960 Aber lassen Sie mich gehen Sie vor und spritzen es auf dem Bildschirm in nur einem Augenblick. 567 00:24:50,960 --> 00:24:56,940 Ich werde weitermachen und laufen Walgrind mit Parameter, dessen erste Befehl 568 00:24:56,940 --> 00:25:00,260 Argument ist der Name dieses Programms hallo-2. 569 00:25:00,260 --> 00:25:02,650 Und leider ist es Ausgang ist grausam 570 00:25:02,650 --> 00:25:04,290 Komplex ohne guten Grund. 571 00:25:04,290 --> 00:25:06,280 Wir sehen also, die den Schlamassel. 572 00:25:06,280 --> 00:25:07,530 David ist mein Name angeben. 573 00:25:07,530 --> 00:25:09,760 Also das ist das Programm tatsächlich läuft. 574 00:25:09,760 --> 00:25:11,180 Und jetzt bekommen wir diesen Ausgang. 575 00:25:11,180 --> 00:25:13,400 >> So Valgrind ist ähnlich im Geiste GDB. 576 00:25:13,400 --> 00:25:14,950 Es ist nicht per se ein Debugger. 577 00:25:14,950 --> 00:25:16,270 Aber es ist ein Speicher checker. 578 00:25:16,270 --> 00:25:20,140 Es ist ein Programm, das Ihren laufen wird programmieren und Ihnen sagen, wenn Sie ein gefragt 579 00:25:20,140 --> 00:25:23,860 Computer-Speicher und nie gab es zurück, wodurch bedeutet, dass Sie haben 580 00:25:23,860 --> 00:25:24,570 ein Speicherverlust. 581 00:25:24,570 --> 00:25:26,240 Und Speicherlecks sind in der Regel schlecht. 582 00:25:26,240 --> 00:25:29,120 Und Sie ist Nutzer von Computern haben wohl gefühlt, egal ob Sie eine haben 583 00:25:29,120 --> 00:25:30,300 Mac oder ein PC. 584 00:25:30,300 --> 00:25:33,730 Haben Sie schon einmal verwendet Ihr Computer für während und nicht in mehreren neu gestartet 585 00:25:33,730 --> 00:25:36,820 Tage, oder Sie haben gerade eine Menge Programme laufen, und das verdammte Ding 586 00:25:36,820 --> 00:25:42,360 verlangsamt zum Erliegen, oder zumindest es ist super ärgerlich zu bedienen, weil 587 00:25:42,360 --> 00:25:44,350 alles gerade super langsam. 588 00:25:44,350 --> 00:25:46,260 >> Nun, das kann eine beliebige Anzahl von Gründen. 589 00:25:46,260 --> 00:25:49,600 Es könnte eine Endlosschleife, eine Wanze in sein jemand den Code, oder einfach, es 590 00:25:49,600 --> 00:25:53,250 könnte bedeuten, dass Sie mit mehr Speicher, oder versuchen, als Ihre 591 00:25:53,250 --> 00:25:54,920 Computer tatsächlich hat. 592 00:25:54,920 --> 00:25:57,770 Und vielleicht gibt es einen Fehler in einem gewissen Programm dass immer wieder gefragt für das Gedächtnis. 593 00:25:57,770 --> 00:26:02,480 Browser für Jahre waren berüchtigt für Dazu fordern mehr und mehr Speicher 594 00:26:02,480 --> 00:26:03,870 aber nie reichte es zurück. 595 00:26:03,870 --> 00:26:07,220 Sicherlich, wenn man nur eine endliche Menge an Speicher, können Sie nicht fragen 596 00:26:07,220 --> 00:26:09,990 unendlich viele Male für etwas von diesem Speicher. 597 00:26:09,990 --> 00:26:13,070 >> Und was Sie hier sehen, obwohl wieder Valgrind der Ausgang ist 598 00:26:13,070 --> 00:26:17,490 unnötig komplex, um auf einen Blick Erstens ist dies der interessante Teil. 599 00:26:17,490 --> 00:26:18,890 Heap - 600 00:26:18,890 --> 00:26:20,060 im Einsatz bei der Ausfahrt. 601 00:26:20,060 --> 00:26:22,810 Also hier ist, wie viel Speicher war in Verwendung in dem Haufen am 602 00:26:22,810 --> 00:26:24,300 Zeit mein Programm verlassen - 603 00:26:24,300 --> 00:26:27,280 offenbar sechs Bytes in einem Block. 604 00:26:27,280 --> 00:26:28,710 Also werde ich meine Hände winken an, was ein Block ist. 605 00:26:28,710 --> 00:26:31,270 Denken Sie daran, nur ein Stück, ein mehr technische Wort für Stück. 606 00:26:31,270 --> 00:26:33,140 Aber sechs Bytes - 607 00:26:33,140 --> 00:26:36,870 was sind die sechs Bytes, die waren noch im Einsatz? 608 00:26:36,870 --> 00:26:37,390 >> Genau. 609 00:26:37,390 --> 00:26:41,520 D-A-V-I-D Backslash Null, fünf Buchstaben Namen plus die Nullabschlusszeichen. 610 00:26:41,520 --> 00:26:46,350 Also das Programm bemerkt, dass ich Valgrind bat um sechs Bytes, offenbar durch 611 00:26:46,350 --> 00:26:48,950 Weg getstring, aber nie gab sie zurück. 612 00:26:48,950 --> 00:26:52,030 Und in der Tat, könnte dies nicht so sein, offensichtlich, wenn mein Programm nicht drei 613 00:26:52,030 --> 00:26:53,590 Linien, aber es ist 300 Zeilen. 614 00:26:53,590 --> 00:26:56,920 So können wir tatsächlich geben einen anderen Befehl Argument zu Walgrind 615 00:26:56,920 --> 00:26:58,290 machen es ausführlich. 616 00:26:58,290 --> 00:26:59,760 Es ist ein wenig ärgerlich, sich zu erinnern. 617 00:26:59,760 --> 00:27:01,580 Aber wenn ich es tue - 618 00:27:01,580 --> 00:27:01,930 mal sehen. 619 00:27:01,930 --> 00:27:03,540 Leck - 620 00:27:03,540 --> 00:27:05,030 War es undicht - 621 00:27:05,030 --> 00:27:07,580 auch ich kann mich nicht erinnern was es ist, aus der Hand. 622 00:27:07,580 --> 00:27:08,550 >> - Leck-check gleich voll. 623 00:27:08,550 --> 00:27:10,180 Yep, danke. 624 00:27:10,180 --> 00:27:12,520 - Leck-check gleich voll. 625 00:27:12,520 --> 00:27:13,800 Enter. 626 00:27:13,800 --> 00:27:14,940 Das gleiche Programm läuft. 627 00:27:14,940 --> 00:27:16,180 Geben Sie in David wieder. 628 00:27:16,180 --> 00:27:17,660 Jetzt sehe ich ein wenig mehr Details. 629 00:27:17,660 --> 00:27:20,890 Aber unter dem Haufen Zusammenfassung, die ist identisch mit vier - ah, 630 00:27:20,890 --> 00:27:22,120 Das ist ganz nett. 631 00:27:22,120 --> 00:27:25,460 Jetzt Valgrind ist eigentlich auf der Suche ein wenig härter in meinem Code. 632 00:27:25,460 --> 00:27:29,580 Und es ist, dass es scheint, malloc in Zeile - 633 00:27:29,580 --> 00:27:30,580 wir verkleinern. 634 00:27:30,580 --> 00:27:31,980 In Zeile - 635 00:27:31,980 --> 00:27:32,930 sehen wir nicht, welche Linie es ist. 636 00:27:32,930 --> 00:27:35,110 Aber malloc ist der erste Täter. 637 00:27:35,110 --> 00:27:38,630 Es ist ein Blog in malloc. 638 00:27:38,630 --> 00:27:39,810 >> Alles klar? 639 00:27:39,810 --> 00:27:40,450 OK, nein. 640 00:27:40,450 --> 00:27:40,940 Right? 641 00:27:40,940 --> 00:27:42,520 Ich rief GetString. 642 00:27:42,520 --> 00:27:44,460 getstring anscheinend ruft malloc. 643 00:27:44,460 --> 00:27:47,800 Also, was Codezeile ist offenbar Schuld an mit 644 00:27:47,800 --> 00:27:49,050 zugeordnet diese Erinnerung? 645 00:27:49,050 --> 00:27:51,560 646 00:27:51,560 --> 00:27:55,540 Lassen Sie uns annehmen, daß, wer schrieb malloc hat schon lange genug, dass es 647 00:27:55,540 --> 00:27:56,390 nicht ihre Schuld. 648 00:27:56,390 --> 00:27:57,520 So ist es wahrscheinlich meine. 649 00:27:57,520 --> 00:28:02,000 GetString in cs50.c - so ist das ein Datei irgendwo auf dem Computer - 650 00:28:02,000 --> 00:28:05,210 in Zeile 286 scheint die Ursache sein. 651 00:28:05,210 --> 00:28:08,140 Nun nehmen wir an, dass CS50 wurde um für anständige Menge an Zeit, so 652 00:28:08,140 --> 00:28:09,720 auch wir sind unfehlbar. 653 00:28:09,720 --> 00:28:14,080 Und so ist es wahrscheinlich nicht in GetString dass der Fehler liegt, sondern vielmehr in 654 00:28:14,080 --> 00:28:17,810 hallo-2.c Linie 18. 655 00:28:17,810 --> 00:28:20,670 >> Werfen wir also einen Blick auf was die Linie 18 war. 656 00:28:20,670 --> 00:28:21,130 Oh. 657 00:28:21,130 --> 00:28:27,130 Irgendwie ist diese Linie nicht unbedingt Buggy, per se, aber es ist der Grund, 658 00:28:27,130 --> 00:28:28,630 hinter dieser Speicherverlust. 659 00:28:28,630 --> 00:28:32,140 So super einfach, was würden intuitiv werden hier die Lösung? 660 00:28:32,140 --> 00:28:34,710 Wenn wir für das Gedächtnis gefragt sind, waren nie ihn zurück zu geben, und das scheint eine sein 661 00:28:34,710 --> 00:28:37,940 Problem, weil im Laufe der Zeit mein Computer könnte über genügend Arbeitsspeicher ausgeführt, verlangsamen könnte 662 00:28:37,940 --> 00:28:42,110 nach unten, vielleicht schlimme Dinge passieren, gut, was ist die einfache intuitive Lösung? 663 00:28:42,110 --> 00:28:43,140 Gib es zurück. 664 00:28:43,140 --> 00:28:44,770 >> Wie wollen Sie, dass der Speicher frei? 665 00:28:44,770 --> 00:28:49,970 Nun, zum Glück ist es ganz einfach nur sagen freien Namen. 666 00:28:49,970 --> 00:28:51,260 Und wir haben das noch nie gemacht. 667 00:28:51,260 --> 00:28:55,890 Aber man kann im Wesentlichen aus denken frei als das Gegenteil von malloc. 668 00:28:55,890 --> 00:28:58,030 kostenlos ist das Gegenteil von Zuweisen von Speicher. 669 00:28:58,030 --> 00:28:59,540 So, jetzt lassen Sie mich diese neu zu kompilieren. 670 00:28:59,540 --> 00:29:02,050 Machen Sie hallo-2. 671 00:29:02,050 --> 00:29:04,620 Lassen Sie mich führen Sie es erneut. hallo-2 David. 672 00:29:04,620 --> 00:29:07,290 So scheint es in Arbeit genau die gleiche Weise. 673 00:29:07,290 --> 00:29:11,180 Aber wenn ich zurück zu Walgrind und erneut ausführen dass derselbe Befehl auf meinem neu 674 00:29:11,180 --> 00:29:14,720 kompilierte Programm, Typisierung in meinem Namen nach wie vor - 675 00:29:14,720 --> 00:29:15,370 schön. 676 00:29:15,370 --> 00:29:16,760 Heap Zusammenfassung - 677 00:29:16,760 --> 00:29:17,740 im Einsatz bei der Ausfahrt - 678 00:29:17,740 --> 00:29:19,370 Null-Bytes in Null-Blöcke. 679 00:29:19,370 --> 00:29:21,840 Und das ist super nett, alle Heapblöcke befreit wurden. 680 00:29:21,840 --> 00:29:23,480 Keine Undichtigkeiten sind möglich. 681 00:29:23,480 --> 00:29:27,200 >> So kommen, nicht mit Problem Set 4, aber mit Problem Set 5, die Forensik 682 00:29:27,200 --> 00:29:30,740 und weiter, auch dies wird ein sich Maß für die Richtigkeit Ihrer 683 00:29:30,740 --> 00:29:33,630 Programm, ob Sie oder nicht über Speicherlecks. 684 00:29:33,630 --> 00:29:36,900 Aber zum Glück können Sie nicht nur die Vernunft durch sie intuitiv, denen 685 00:29:36,900 --> 00:29:40,430 ist wohl einfach für kleine Programme aber schwieriger für größere Programme, 686 00:29:40,430 --> 00:29:43,860 Walgrind, für jene größeren Programmen kann Ihnen dabei helfen, 687 00:29:43,860 --> 00:29:45,360 Das besondere Problem. 688 00:29:45,360 --> 00:29:47,500 >> Aber es gibt ein anderes Problem , die entstehen könnten. 689 00:29:47,500 --> 00:29:51,245 Lassen Sie mich öffnen Sie diese Datei hier, das ist, wiederum ein etwas einfaches Beispiel. 690 00:29:51,245 --> 00:29:53,760 Aber lassen Sie uns auf das, was konzentrieren dieses Programm macht. 691 00:29:53,760 --> 00:29:55,190 Dies nennt man memory.c. 692 00:29:55,190 --> 00:29:58,380 Wir veröffentlichen diese im Laufe des Tages in der zip der heutigen Quellcode. 693 00:29:58,380 --> 00:30:01,610 Und merke, dass ich eine Funktion namens haben f, die keine Argumente und nimmt 694 00:30:01,610 --> 00:30:02,800 nichts zurückgibt. 695 00:30:02,800 --> 00:30:07,240 In Zeile 20, ich bin anscheinend die Vereinbarkeit eines Zeiger auf eine int und nannte es x. 696 00:30:07,240 --> 00:30:09,570 Ich Zuordnung ist die Rückkehr Wert von malloc. 697 00:30:09,570 --> 00:30:14,590 Und nur klar zu sein, wie viele Bytes Uhr Ich wahrscheinlich immer wieder von malloc 698 00:30:14,590 --> 00:30:17,080 in dieser Situation? 699 00:30:17,080 --> 00:30:18,040 >> Wahrscheinlich 40. 700 00:30:18,040 --> 00:30:18,840 Wo bekommt man das her? 701 00:30:18,840 --> 00:30:22,410 Nun, wenn Sie sich erinnern, dass ein int ist oft 4 Bytes, zumindest ist es in der 702 00:30:22,410 --> 00:30:25,110 Gerät ist 10 mal 4 40 offensichtlich. 703 00:30:25,110 --> 00:30:28,920 So malloc wird wieder eine Adresse ein Teil des Speichers und Speicherung dass 704 00:30:28,920 --> 00:30:30,800 adressieren letztlich in x. 705 00:30:30,800 --> 00:30:32,570 So klar zu sein, was dann geschieht? 706 00:30:32,570 --> 00:30:34,990 Nun, lassen Sie mich zurück schalten zu unserem Bild hier. 707 00:30:34,990 --> 00:30:38,150 Lassen Sie mich nicht nur zeichnen die Unterseite meines Arbeitsspeicher des Computers, lass mich gehen Sie vor und 708 00:30:38,150 --> 00:30:42,990 ziehen das ganze Rechteck, dass stellt alle meine RAM. 709 00:30:42,990 --> 00:30:44,790 >> Wir sagen, dass der Stapel ist auf der Unterseite. 710 00:30:44,790 --> 00:30:47,010 Und es gibt eine Textstelle in die Daten nicht initialisiert. 711 00:30:47,010 --> 00:30:49,880 Aber ich werde einfach zu abstrakt solche andere Dinge weg, als Punkt, Punkt Punkt. 712 00:30:49,880 --> 00:30:53,470 Ich bin gerade dabei, dies zu beziehen als Haufen an der Spitze. 713 00:30:53,470 --> 00:30:57,070 Und dann am unteren Rand des Bildes, Zur Hauptseite stellen, ich werde 714 00:30:57,070 --> 00:30:59,880 um ihm eine Scheiben-Speicher auf den Stapel. 715 00:30:59,880 --> 00:31:03,150 Für f, werde ich ihm eine Scheibe der Speicher auf dem Stapel. 716 00:31:03,150 --> 00:31:05,140 Nun bekam ich zu meinem konsultieren Quellcode wieder. 717 00:31:05,140 --> 00:31:07,170 Was sind die lokalen Variablen für die wichtigsten? 718 00:31:07,170 --> 00:31:10,710 Offenbar nichts, so dass Scheibe ist effektiv leer oder gar nicht so groß 719 00:31:10,710 --> 00:31:11,600 wie ich es gezeichnet. 720 00:31:11,600 --> 00:31:15,730 Aber in f, habe ich eine lokale Variable die aufgerufen wird, x. 721 00:31:15,730 --> 00:31:20,410 Also werde ich weitermachen und geben f ein Teil des Speichers, nannte es x. 722 00:31:20,410 --> 00:31:24,680 >> Und jetzt malloc von 10 mal 4, So malloc 40, wo das ist 723 00:31:24,680 --> 00:31:25,430 Speicher aus? 724 00:31:25,430 --> 00:31:27,530 Wir haben nicht ein Bild gezeichnet wie dies vor. 725 00:31:27,530 --> 00:31:31,140 Aber nehmen wir an, dass es effektiv ist kommen von hier, so dass man, 726 00:31:31,140 --> 00:31:33,170 zwei, drei, vier, fünf. 727 00:31:33,170 --> 00:31:34,680 Und jetzt brauche ich 40 von diesen. 728 00:31:34,680 --> 00:31:37,540 Also werde ich nur tun, Punkt, Punkt, Punkt zu schlagen dass es noch mehr Speicher 729 00:31:37,540 --> 00:31:39,350 auf dem Rückweg von der Halde. 730 00:31:39,350 --> 00:31:40,710 Nun, was ist die Adresse? 731 00:31:40,710 --> 00:31:42,620 Wir wählen unsere willkürlichen Adresse wie immer - 732 00:31:42,620 --> 00:31:46,310 Ox123, obwohl es wahrscheinlich etwas ganz anderes sein. 733 00:31:46,310 --> 00:31:50,420 Das ist die Adresse des ersten Bytes in Erinnerung, die ich frage für malloc. 734 00:31:50,420 --> 00:31:53,630 >> Also kurz gesagt, wenn die Leitung 20 führt, was ist buchstäblich 735 00:31:53,630 --> 00:31:57,170 gespeichert Innenseite x hier? 736 00:31:57,170 --> 00:31:58,730 Ox123. 737 00:31:58,730 --> 00:32:00,370 Ox123. 738 00:32:00,370 --> 00:32:01,550 Und das Ox ist uninteressant. 739 00:32:01,550 --> 00:32:03,200 Es bedeutet nur, hier ist ein Hexadezimalzahl. 740 00:32:03,200 --> 00:32:06,490 Aber was ist Schlüssel ist, dass das, was ich habe store in x, die eine lokale Variable. 741 00:32:06,490 --> 00:32:10,260 Aber seine Datentyp wieder eine Adresse einer int. 742 00:32:10,260 --> 00:32:12,710 Nun, ich werde Ox123 speichern. 743 00:32:12,710 --> 00:32:16,610 Aber noch einmal, wenn das ein wenig zu ist unnötig kompliziert, wenn ich blättern 744 00:32:16,610 --> 00:32:21,490 zurück, können wir diese abstrakten weg ganz vernünftig und einfach sagen, dass x eine 745 00:32:21,490 --> 00:32:23,910 Zeiger auf diesen Teil des Speichers. 746 00:32:23,910 --> 00:32:24,070 >> OK. 747 00:32:24,070 --> 00:32:26,230 Nun ist die Frage auf der Hand ist die folgende - 748 00:32:26,230 --> 00:32:29,910 Linie 21, es stellt sich heraus, ist buggy. 749 00:32:29,910 --> 00:32:31,160 Warum? 750 00:32:31,160 --> 00:32:34,890 751 00:32:34,890 --> 00:32:36,930 >> Es tut uns leid? 752 00:32:36,930 --> 00:32:38,640 Es muss nicht - 753 00:32:38,640 --> 00:32:40,390 sagen, dass noch einmal. 754 00:32:40,390 --> 00:32:41,240 Nun, ist es nicht kostenlos. 755 00:32:41,240 --> 00:32:42,350 Also das ist der zweite aber. 756 00:32:42,350 --> 00:32:45,000 So gibt es eine andere, sondern speziell in Zeile 21. 757 00:32:45,000 --> 00:32:49,480 758 00:32:49,480 --> 00:32:50,040 >> Genau. 759 00:32:50,040 --> 00:32:54,980 Diese einfache Codezeile ist nur ein Pufferüberlauf, ein Pufferüberlauf. 760 00:32:54,980 --> 00:32:57,050 Ein Puffer bedeutet nur einen Teil des Speichers. 761 00:32:57,050 --> 00:33:01,520 Aber das Teil des Speichers ist von der Größe 10, 10 ganze Zahlen sind, das heißt, wenn wir 762 00:33:01,520 --> 00:33:05,350 Index in es mit der syntaktischen Zucker von Array-Notation, das Quadrat 763 00:33:05,350 --> 00:33:09,220 Klammern, haben Sie Zugriff auf x 0 x Halter Halterung 1 x, 764 00:33:09,220 --> 00:33:10,390 Halterung Punkt, Punkt, Punkt. 765 00:33:10,390 --> 00:33:13,270 x Halterung 9 ist die größte. 766 00:33:13,270 --> 00:33:17,680 Also, wenn ich x Bügel 10, wo Ich bin eigentlich los in Erinnerung? 767 00:33:17,680 --> 00:33:19,120 >> Nun, wenn ich 10 int - 768 00:33:19,120 --> 00:33:21,070 wir eigentlich ziehen alle dieser hier. 769 00:33:21,070 --> 00:33:22,700 Das war also die ersten fünf. 770 00:33:22,700 --> 00:33:24,660 Hier sind die anderen fünf ints. 771 00:33:24,660 --> 00:33:29,580 So x Klammer 0 ist hier. x Halterung 1 ist hier. x Halterung 9 ist hier. x Halterung 772 00:33:29,580 --> 00:33:37,960 10 ist hier, was bedeutet, ich sage, in Zeile 21, um den Computer in der 773 00:33:37,960 --> 00:33:39,400 Zahl wo? 774 00:33:39,400 --> 00:33:42,010 Die Zahl 0 wo? 775 00:33:42,010 --> 00:33:43,380 Nun, es ist 0, ja. 776 00:33:43,380 --> 00:33:45,460 Aber gerade die Tatsache, dass seine 0 ist eine Art Zufall. 777 00:33:45,460 --> 00:33:47,140 Es könnte die Nummer 50, für alles, was wir kümmern. 778 00:33:47,140 --> 00:33:50,480 Aber wir versuchen, es zu x Halterung setzen 10, die, wenn dies 779 00:33:50,480 --> 00:33:53,700 Fragezeichen gezeichnet wird, die ist nicht eine gute Sache. 780 00:33:53,700 --> 00:33:57,070 Dieses Programm könnte sehr gut Absturz als Folge. 781 00:33:57,070 --> 00:33:59,400 >> Nun, lassen Sie uns gehen und sehen, ob diese ist in der Tat, was passiert. 782 00:33:59,400 --> 00:34:02,600 Als Speicher, da die Datei heißt memory.c. 783 00:34:02,600 --> 00:34:05,950 Fahren wir fort und führen der Programmspeicher. 784 00:34:05,950 --> 00:34:08,239 Also wir Glück haben, tatsächlich, wie es scheint. 785 00:34:08,239 --> 00:34:09,340 Wir hatten Glück. 786 00:34:09,340 --> 00:34:11,060 Aber lasst uns sehen, ob wir laufen jetzt Valgrind. 787 00:34:11,060 --> 00:34:14,170 Auf den ersten Blick könnte mein Programm zu sein scheinen vollkommen richtig. 788 00:34:14,170 --> 00:34:18,010 Aber lassen Sie mich laufen Walgrind mit der - Leck-check gleich voll auf das Gedächtnis. 789 00:34:18,010 --> 00:34:20,110 >> Und wenn ich jetzt laufen diese - 790 00:34:20,110 --> 00:34:21,030 interessant. 791 00:34:21,030 --> 00:34:26,800 Ungültige der Größe 4 schreiben an Zeile 21 memory.c. 792 00:34:26,800 --> 00:34:29,284 Zeile 21 von memory.c ist welche? 793 00:34:29,284 --> 00:34:30,340 Oh, interessant. 794 00:34:30,340 --> 00:34:31,080 Aber warten. 795 00:34:31,080 --> 00:34:32,389 Größe 4, was ist das gemeint? 796 00:34:32,389 --> 00:34:34,969 Ich habe nur einen zu schreiben, aber es ist der Größe 4. 797 00:34:34,969 --> 00:34:36,889 Warum ist es 4? 798 00:34:36,889 --> 00:34:39,280 Es ist, weil es ein int, das ist ist wiederum vier Bytes. 799 00:34:39,280 --> 00:34:42,510 So einen Bug gefunden Walgrind, dass ich, mit einem Blick auf meinen Code, tat es nicht. 800 00:34:42,510 --> 00:34:45,040 Und vielleicht Ihre TF würde oder nicht. 801 00:34:45,040 --> 00:34:48,469 Was aber sicher festgestellt, dass Walgrind wir haben einen Fehler gibt, machte auch 802 00:34:48,469 --> 00:34:52,719 obwohl wir hatten Glück, und der Computer beschlossen, eh, ich werde nicht zum Absturz 803 00:34:52,719 --> 00:34:57,470 nur weil Sie berührt ein Byte, ein int im Wert von Speicher, die Sie nicht 804 00:34:57,470 --> 00:34:58,550 tatsächlich besitzen. 805 00:34:58,550 --> 00:35:00,380 >> Nun, was ist hier buggy. 806 00:35:00,380 --> 00:35:01,180 Adresse - 807 00:35:01,180 --> 00:35:03,190 dies ist ein verrückt aussehenden Adresse in hexadezimal. 808 00:35:03,190 --> 00:35:06,890 Das bedeutet nur, irgendwo in der Halde ist Null-Bytes nach einem Block der Größe 40 809 00:35:06,890 --> 00:35:07,620 zugeordnet ist. 810 00:35:07,620 --> 00:35:10,610 Lassen Sie mich hier vergrößern und sehen, ob Das ist ein wenig mehr hilfreich. 811 00:35:10,610 --> 00:35:11,410 Interessante. 812 00:35:11,410 --> 00:35:15,600 40 Bytes sind definitiv verloren in Verlust-Rekord 1 von 1. 813 00:35:15,600 --> 00:35:17,840 Auch hier ist mehr Wörter als nützlich. 814 00:35:17,840 --> 00:35:21,350 Aber auf den markierten Linien basieren, wo soll ich wahrscheinlich mein Fokus 815 00:35:21,350 --> 00:35:24,070 Aufmerksamkeit für einen anderen bug? 816 00:35:24,070 --> 00:35:26,570 Sieht aus wie eine Linie 20 von memory.c. 817 00:35:26,570 --> 00:35:30,990 >> Also, wenn wir zurück in die Linie 20, das ist die eine, die Sie zuvor festgelegt haben. 818 00:35:30,990 --> 00:35:33,030 Und es ist nicht unbedingt Buggy. 819 00:35:33,030 --> 00:35:35,160 Aber wir haben diese umgekehrt ihre Auswirkungen. 820 00:35:35,160 --> 00:35:38,790 Also wie kann ich wenigstens korrigieren einer dieser Fehler? 821 00:35:38,790 --> 00:35:42,240 Was könnte ich nach Zeile 21 zu tun? 822 00:35:42,240 --> 00:35:47,110 Ich tun konnte, frei von x, so ist zurück zu geben, dass der Speicher. 823 00:35:47,110 --> 00:35:49,230 Und wie kann ich diesen Fehler beheben? 824 00:35:49,230 --> 00:35:52,120 Ich sollte auf jeden Fall gehen nicht weiter als 0 ist. 825 00:35:52,120 --> 00:35:53,670 Also lassen Sie mich versuchen und starten Sie diese. 826 00:35:53,670 --> 00:35:56,080 Sorry, auf jeden Fall gehen nicht weiter als 9. 827 00:35:56,080 --> 00:35:57,510 Als Erinnerung. 828 00:35:57,510 --> 00:36:00,650 Lassen Sie mich erneut Walgrind in einem größeren Fenster. 829 00:36:00,650 --> 00:36:01,580 Und jetzt schauen. 830 00:36:01,580 --> 00:36:02,250 Nizza. 831 00:36:02,250 --> 00:36:03,270 Alle Heapblöcke befreit wurden. 832 00:36:03,270 --> 00:36:04,270 Keine Undichtigkeiten sind möglich. 833 00:36:04,270 --> 00:36:07,520 Und bis hier oben gibt es keine Erwähnung mehr der unwirksamen rechts. 834 00:36:07,520 --> 00:36:09,820 >> Nur um gierig, und lassen Sie uns sehen, ob eine weitere Demonstration 835 00:36:09,820 --> 00:36:11,050 geht nicht wie beabsichtigt - 836 00:36:11,050 --> 00:36:12,560 Ich habe Glück vor einem Augenblick. 837 00:36:12,560 --> 00:36:15,530 Und die Tatsache, dass diese 0 ist, ist vielleicht unnötig irreführend. 838 00:36:15,530 --> 00:36:20,650 Lass uns einfach tun 50, ein etwas willkürlich Zahl, stellen Speicher dot Schrägstrich Speicher - 839 00:36:20,650 --> 00:36:21,410 noch Glück. 840 00:36:21,410 --> 00:36:22,510 Nichts ist abstürzt. 841 00:36:22,510 --> 00:36:26,150 Angenommen, ich nur etwas tun wirklich dumm, und ich tue 100. 842 00:36:26,150 --> 00:36:30,360 Lassen Sie mich Remake Speicher, dot Schrägstrich Speicher - 843 00:36:30,360 --> 00:36:31,075 hatte Glück wieder. 844 00:36:31,075 --> 00:36:32,800 Wie etwa 1.000? 845 00:36:32,800 --> 00:36:35,370 ints darüber hinaus, etwa, , wo ich sein sollte? 846 00:36:35,370 --> 00:36:37,410 Als Speicher - 847 00:36:37,410 --> 00:36:38,570 verdammt. 848 00:36:38,570 --> 00:36:39,920 >> [Gelächter] 849 00:36:39,920 --> 00:36:41,270 >> OK. 850 00:36:41,270 --> 00:36:43,920 Lassen Sie uns nicht um mehr durcheinander bringen. 851 00:36:43,920 --> 00:36:45,120 Führen Speicher. 852 00:36:45,120 --> 00:36:45,840 Dort gehen wir. 853 00:36:45,840 --> 00:36:46,410 In Ordnung. 854 00:36:46,410 --> 00:36:52,500 So scheinbar Sie Index 100.000 ints über, wo Sie sollten in gewesen sein 855 00:36:52,500 --> 00:36:54,410 Speicher, passieren schlimme Dinge. 856 00:36:54,410 --> 00:36:56,430 Also das ist offensichtlich nicht eine harte, schnelle Regel. 857 00:36:56,430 --> 00:36:58,190 Ich war irgendwie mit Studie und Irrtum, um dorthin zu gelangen. 858 00:36:58,190 --> 00:37:02,230 Aber das liegt daran, dass lange Rede kurzer Sinn, Arbeitsspeicher Ihres Computers wird auch geteilt 859 00:37:02,230 --> 00:37:03,580 in diesen Dingen Segmente genannt. 860 00:37:03,580 --> 00:37:07,260 Und manchmal, der Computer tatsächlich hat Ihnen ein wenig mehr Speicher 861 00:37:07,260 --> 00:37:08,400 als Sie verlangen. 862 00:37:08,400 --> 00:37:12,170 Aber für Effizienz, es ist nur einfacher, bekommen mehr Speicher, sondern nur sagen, 863 00:37:12,170 --> 00:37:13,780 dass Sie immer einen Teil davon. 864 00:37:13,780 --> 00:37:16,370 >> Und wenn Sie Glück haben manchmal, daher könnten Sie in der Lage sein zu berühren 865 00:37:16,370 --> 00:37:17,795 Speicher, die nicht Ihnen gehören. 866 00:37:17,795 --> 00:37:21,860 Sie haben keine Garantie, dass das, was Wert Sie setzen es wird dort bleiben, weil 867 00:37:21,860 --> 00:37:25,080 der Computer immer noch denkt, dass es nicht Ihnen, aber es ist nicht notwendigerweise 868 00:37:25,080 --> 00:37:29,910 ein anderes Segment des Speichers in der Trefferliste Computer und induzieren einen Fehler wie 869 00:37:29,910 --> 00:37:31,710 dieser hier. 870 00:37:31,710 --> 00:37:32,060 In Ordnung. 871 00:37:32,060 --> 00:37:37,240 Noch Fragen dann auf der Speicherkarte? 872 00:37:37,240 --> 00:37:37,590 >> In Ordnung. 873 00:37:37,590 --> 00:37:40,610 Werfen Sie einen Blick hier, dann bei etwas, was wir schon immer unter 874 00:37:40,610 --> 00:37:48,361 gewährt seit geraumer Zeit, die ist in dieser Datei namens cs50.h. 875 00:37:48,361 --> 00:37:49,420 So ist dies eine Datei. 876 00:37:49,420 --> 00:37:51,130 Dies sind nur ein ganzes Bündel Kommentare bis oben. 877 00:37:51,130 --> 00:37:53,900 Und Sie könnten auf diese Option, wenn ausgesehen haben Sie stocherte auf das Gerät. 878 00:37:53,900 --> 00:37:57,000 Aber es stellt sich heraus, dass die ganze Zeit, wenn wir verwendet, um eine Zeichenfolge als nutzen 879 00:37:57,000 --> 00:38:01,130 Synonym sind die Mittel, mit denen wir erklärt das Synonym war mit diesem 880 00:38:01,130 --> 00:38:03,990 Schlüsselwort typedef, für Typ-Definition. 881 00:38:03,990 --> 00:38:07,500 Und wir sind im Wesentlichen sagen, machen String Ein Synonym für char Stern. 882 00:38:07,500 --> 00:38:11,190 Dass die Mittel, durch die der Stapel erstellt diese Stützräder bekannt als 883 00:38:11,190 --> 00:38:12,040 die Zeichenkette. 884 00:38:12,040 --> 00:38:14,830 >> Jetzt ist hier nur ein Prototyp für getchar. 885 00:38:14,830 --> 00:38:17,350 Wir könnten es schon einmal gesehen haben, aber das ist in der Tat, was sie tut. getchar 886 00:38:17,350 --> 00:38:19,070 nimmt keine Argumente, gibt einen char. 887 00:38:19,070 --> 00:38:21,340 getDouble nimmt keine Argumente, gibt eine doppelte. 888 00:38:21,340 --> 00:38:24,440 GetFloat nimmt keine Argumente, kehrt einen Schwimmer, und so weiter. 889 00:38:24,440 --> 00:38:27,270 getint ist hier. getlonglong ist hier. 890 00:38:27,270 --> 00:38:28,820 Und getstring ist hier. 891 00:38:28,820 --> 00:38:29,420 Und das ist es. 892 00:38:29,420 --> 00:38:33,080 Dieser violette Linie ist ein weiterer Präprozessor Richtlinie wegen der 893 00:38:33,080 --> 00:38:35,550 hashtag am Anfang. 894 00:38:35,550 --> 00:38:35,870 >> In Ordnung. 895 00:38:35,870 --> 00:38:38,380 So, jetzt lass mich in cs50.c. gehen 896 00:38:38,380 --> 00:38:40,400 Und wir werden nicht zu lange sprechen zu diesem Thema. 897 00:38:40,400 --> 00:38:43,280 Aber um Ihnen einen Einblick von dem, was wurde auf alles gehen 898 00:38:43,280 --> 00:38:46,434 Zeit, lassen Sie mich zu gehen - 899 00:38:46,434 --> 00:38:48,250 lass es uns tun getchar. 900 00:38:48,250 --> 00:38:51,050 So getchar ist meist Kommentare. 901 00:38:51,050 --> 00:38:52,060 Aber es sieht so aus. 902 00:38:52,060 --> 00:38:54,800 Also das ist die eigentliche Funktion getchar, dass wir waren 903 00:38:54,800 --> 00:38:56,055 nehmen für selbstverständlich vorhanden. 904 00:38:56,055 --> 00:38:59,370 Und auch wenn wir nicht dieses eine dass oft, wenn überhaupt, dann ist es zumindest 905 00:38:59,370 --> 00:39:00,470 relativ einfach. 906 00:39:00,470 --> 00:39:02,580 So lohnt es sich ein kurzen Blick auf hier. 907 00:39:02,580 --> 00:39:06,540 >> So getchar hat eine Endlosschleife, bewusst so offensichtlich. 908 00:39:06,540 --> 00:39:10,050 Dann ruft sie - und das ist eine Art von schön Wiederverwendung von Code, den wir uns selbst schrieb. 909 00:39:10,050 --> 00:39:11,220 Er fordert getstring. 910 00:39:11,220 --> 00:39:12,460 Denn was bedeutet es bedeuten einen char zu bekommen? 911 00:39:12,460 --> 00:39:14,730 Nun, könnte man genauso gut versuchen, eine zu bekommen ganze Reihe von Text aus dem Benutzer-und 912 00:39:14,730 --> 00:39:16,940 dann einfach auf einen Blick dieser Zeichen. 913 00:39:16,940 --> 00:39:19,170 In Zeile 60, ist hier ein wenig Bit einer Plausibilitätsprüfung. 914 00:39:19,170 --> 00:39:21,610 Wenn getstring zurückgegeben null, lasst uns nicht gehen. 915 00:39:21,610 --> 00:39:22,820 Irgendetwas ist schiefgegangen. 916 00:39:22,820 --> 00:39:28,120 >> Nun, das ist etwas ärgerlich, aber herkömmlichen in C char max wahrscheinlich 917 00:39:28,120 --> 00:39:29,960 stellt dar, was gerade basierend auf seinen Namen? 918 00:39:29,960 --> 00:39:31,670 Es ist eine Konstante. 919 00:39:31,670 --> 00:39:36,040 Es ist wie der numerische Wert des größten char Ihnen darstellen kann 920 00:39:36,040 --> 00:39:40,370 einem Biss, das ist wahrscheinlich die Zahl 255, die die größte Zahl, die Sie ist 921 00:39:40,370 --> 00:39:42,720 acht Bits repräsentieren, beginnend bei Null. 922 00:39:42,720 --> 00:39:47,460 Also habe ich diese, in dieser Funktion, wenn Schreiben Sie diesen Code, nur weil 923 00:39:47,460 --> 00:39:51,753 wenn etwas falsch, aber in getchar ihren Zweck im Leben ist, eine Rückkehr 924 00:39:51,753 --> 00:39:54,830 char, musst du irgendwie in der Lage sein um dem Benutzer zu signalisieren, dass 925 00:39:54,830 --> 00:39:55,840 etwas schief gelaufen ist. 926 00:39:55,840 --> 00:39:56,970 Wir können nicht null zurück. 927 00:39:56,970 --> 00:39:58,480 Es stellt sich heraus, dass ein Zeiger ist null. 928 00:39:58,480 --> 00:40:01,030 Und wieder hat getchar einen char zurückzukehren. 929 00:40:01,030 --> 00:40:04,760 >> Also die Konvention, wenn etwas schief falsch, Sie, der Programmierer, oder in 930 00:40:04,760 --> 00:40:08,160 In diesem Fall, mich mit der Bibliothek, hatte ich ein einfach willkürlich entscheiden, ob 931 00:40:08,160 --> 00:40:12,230 etwas schief geht, bin ich zu gehen Rückkehr der Nummer 255, das ist wirklich 932 00:40:12,230 --> 00:40:17,240 bedeutet, dass wir nicht können, kann der Benutzer nicht geben der Charakter vertreten durch die 933 00:40:17,240 --> 00:40:21,410 Nummer 255, denn wir hatten ein stehlen als sog. Sentinel Wert 934 00:40:21,410 --> 00:40:23,410 ein Problem darstellen. 935 00:40:23,410 --> 00:40:27,010 Jetzt stellt sich heraus, dass das Zeichen 255 ist nicht etwas, das Sie auf eingeben können 936 00:40:27,010 --> 00:40:28,380 Ihrer Tastatur, so ist es keine große Sache. 937 00:40:28,380 --> 00:40:30,910 Der Benutzer bemerkt nicht, dass Ich habe diesen Charakter gestohlen. 938 00:40:30,910 --> 00:40:34,620 Aber wenn Sie jemals in man-Seiten auf eine zu sehen Computersystem einige Verweis auf eine 939 00:40:34,620 --> 00:40:38,560 alle Kappen konstant wie diese, die sagt, in Fällen der Fehler dieser konstanten Kraft 940 00:40:38,560 --> 00:40:42,720 zurückgegeben werden, das ist alles einige Menschen haben Jahren wurde willkürlich beschlossen 941 00:40:42,720 --> 00:40:45,680 senden Sie dieses besondere Wert und nennen es eine Konstante im Fall 942 00:40:45,680 --> 00:40:46,840 etwas schief geht. 943 00:40:46,840 --> 00:40:48,580 >> Nun ist die Magie passiert hier unten. 944 00:40:48,580 --> 00:40:52,600 Zuerst bin ich in Zeile 67 erklärt zwei Zeichen, C1 und C2. 945 00:40:52,600 --> 00:40:57,080 Und dann in Zeile 68, es ist eigentlich eine Codezeile, die erinnert an ist 946 00:40:57,080 --> 00:41:01,140 unser Freund printf, da es bedeutet Prozent Cs in Anführungszeichen haben. 947 00:41:01,140 --> 00:41:06,490 Aber beachten Sie, was hier passiert. sscanf-String-Scan - 948 00:41:06,490 --> 00:41:11,690 bedeutet, scannen eine formatierte string, ergo sscanf. 949 00:41:11,690 --> 00:41:12,590 Was bedeutet das? 950 00:41:12,590 --> 00:41:16,310 Es heißt, Sie gehen, um eine Zeichenfolge sscanf. 951 00:41:16,310 --> 00:41:18,420 Und was auch immer ist Linie der Benutzer in. 952 00:41:18,420 --> 00:41:23,520 Sie passieren einen Format-String wie sscanf dies, dass scanf sagt, was sind 953 00:41:23,520 --> 00:41:25,870 Sie hoffen, dass der Benutzer eingegeben hat in. 954 00:41:25,870 --> 00:41:29,730 Dann übergeben Sie in den Adressen von zwei Stücke von Speicher, in diesem Fall 955 00:41:29,730 --> 00:41:31,150 denn ich habe zwei Platzhalter. 956 00:41:31,150 --> 00:41:34,610 Also werde ich, um ihm die Adresse von C1 und C2 der Adresse. 957 00:41:34,610 --> 00:41:37,700 >> Und daran erinnern, dass Sie eine Funktion geben, die Adresse einer Variablen, was ist 958 00:41:37,700 --> 00:41:38,950 die Implikation? 959 00:41:38,950 --> 00:41:41,400 960 00:41:41,400 --> 00:41:45,050 Was kann diese Funktion nicht als Ergebnis von ihm die Adresse eines 961 00:41:45,050 --> 00:41:48,170 Variable, im Gegensatz die Variable selbst? 962 00:41:48,170 --> 00:41:49,450 Er kann sich ändern, nicht wahr? 963 00:41:49,450 --> 00:41:53,250 Wenn Sie hatte jemanden eine Karte zu einem physischen Adresse können sie hingehen und tun 964 00:41:53,250 --> 00:41:54,750 was sie an dieser Adresse wollen. 965 00:41:54,750 --> 00:41:55,800 Gleiche Idee hier. 966 00:41:55,800 --> 00:41:59,950 Wenn wir den Ball zu sscanf, die Adresse von zwei Brocken von Speicher, auch diese winzigen 967 00:41:59,950 --> 00:42:03,585 kleine Stücke von Speicher, C1 und C2, aber wir sagen, dass es die Adresse von ihnen, 968 00:42:03,585 --> 00:42:05,170 sscanf können es ändern. 969 00:42:05,170 --> 00:42:08,530 >> So sscanf seinen Zweck im Leben, wenn wir lesen Die man-Seite ist zu lesen, was die 970 00:42:08,530 --> 00:42:13,420 Benutzer eingetippt, Hoffnung für die Benutzer mit eingegeben in einem Charakter und vielleicht 971 00:42:13,420 --> 00:42:16,470 ein anderer Charakter, und was der Benutzer eingegeben, geht das erste Zeichen 972 00:42:16,470 --> 00:42:19,310 hier geht das zweite Zeichen hier. 973 00:42:19,310 --> 00:42:22,470 Jetzt, als beiseite, dieses, und Sie würden nur wissen das aus der Dokumentation, 974 00:42:22,470 --> 00:42:25,570 die Tatsache, dass ich ein Leerzeichen setzen dort bedeutet nur, dass ich mich nicht, wenn 975 00:42:25,570 --> 00:42:28,440 der Benutzer trifft der Leertaste ein paar mal, bevor er oder sie nimmt eine 976 00:42:28,440 --> 00:42:30,400 Charakter, werde ich ignorieren einem weißen Raum. 977 00:42:30,400 --> 00:42:32,510 So, dass weiß ich aus die Dokumentation. 978 00:42:32,510 --> 00:42:36,570 >> Die Tatsache, dass es eine zweite% c gefolgt von Leerraum ist eigentlich 979 00:42:36,570 --> 00:42:37,410 gewollt. 980 00:42:37,410 --> 00:42:41,190 Ich möchte in der Lage sein zu erkennen, ob der Benutzer up oder verschraubt nicht mit. 981 00:42:41,190 --> 00:42:45,630 Also hoffe ich, dass der Benutzer nur getippt in einem Zeichen, daher hoffe ich, 982 00:42:45,630 --> 00:42:50,640 das sscanf wird nur gehen, um die Rückkehr Wert 1, weil wieder, wenn ich lese 983 00:42:50,640 --> 00:42:55,400 die Dokumentation, sscanf seinen Zweck in Lebensziel ist es, die Anzahl der zurück 984 00:42:55,400 --> 00:42:59,170 Variablen, die gefüllt waren mit Benutzereingaben. 985 00:42:59,170 --> 00:43:02,270 >> Ich ging in zwei Variablen Adressen, C1 und C2. 986 00:43:02,270 --> 00:43:06,420 Ich hoffe aber, dass nur einer der ihnen getötet wird, denn wenn sscanf 987 00:43:06,420 --> 00:43:11,130 den Wert 2, was ist vermutlich die Implikation logisch? 988 00:43:11,130 --> 00:43:14,600 Dass der Benutzer nicht nur geben Sie mir eine Charakter, wie ich sagte ihm oder ihr. 989 00:43:14,600 --> 00:43:17,860 Wahrscheinlich bei getippt mindestens zwei Buchstaben. 990 00:43:17,860 --> 00:43:22,430 Also, wenn ich stattdessen nicht die zweite % C, ich hatte gerade eine, die 991 00:43:22,430 --> 00:43:25,370 ehrlich gesagt wäre intuitiver Ansatz, denke ich einen ersten Blick 992 00:43:25,370 --> 00:43:30,220 du wirst nicht in der Lage sein zu erkennen, wenn der Benutzer wurde Ihnen mehr 993 00:43:30,220 --> 00:43:31,780 Eingang, als Sie eigentlich wollten. 994 00:43:31,780 --> 00:43:34,100 Das ist also eine implizite Form der Fehlerprüfung. 995 00:43:34,100 --> 00:43:35,640 >> Aber beachten Sie, was ich hier zu tun. 996 00:43:35,640 --> 00:43:39,970 Sobald ich bin sicher, dass der Benutzer gab mir eine Charakter, befreien ich die Linie, zu tun 997 00:43:39,970 --> 00:43:44,450 das Gegenteil von getstring, was wiederum malloc verwendet, und dann bin ich zurück 998 00:43:44,450 --> 00:43:51,030 C1, das Zeichen, dass ich hoffte, dass die Benutzer zur Verfügung gestellt und zur Verfügung gestellt. 999 00:43:51,030 --> 00:43:54,680 So eine schnelle flüchtig nur, aber Fragen zum getchar? 1000 00:43:54,680 --> 00:43:57,450 1001 00:43:57,450 --> 00:43:59,590 Wir kommen zurück, um einige der anderen. 1002 00:43:59,590 --> 00:44:03,770 >> Nun, lassen Sie mich gehen Sie vor und tun dies - Nehmen wir nun an, nur um zu motivieren unsere 1003 00:44:03,770 --> 00:44:08,910 Diskussion in einer Woche plus Zeit, diese ist eine Datei namens structs.h. 1004 00:44:08,910 --> 00:44:11,440 Und wieder, das ist nur ein Vorgeschmack von etwas, das vor uns liegt. 1005 00:44:11,440 --> 00:44:13,090 Beachten Sie aber, dass eine Menge Dies hat Kommentare. 1006 00:44:13,090 --> 00:44:17,440 Also lassen Sie mich unterstreichen nur die Interessant für jetzt. 1007 00:44:17,440 --> 00:44:18,020 typedef - 1008 00:44:18,020 --> 00:44:19,700 es ist das gleiche Keyword erneut. 1009 00:44:19,700 --> 00:44:23,100 typedef wir verwenden, um String deklarieren als spezieller Datentyp. 1010 00:44:23,100 --> 00:44:27,490 Sie können typedef, um neue zu schaffen Datentypen, die nicht existieren, wenn 1011 00:44:27,490 --> 00:44:28,570 C erfunden wurde. 1012 00:44:28,570 --> 00:44:32,520 Zum Beispiel kommt int mit C. char kommt mit Doppel-C kommt mit C. Aber 1013 00:44:32,520 --> 00:44:34,000 gibt es keine Vorstellung von einem Schüler. 1014 00:44:34,000 --> 00:44:37,230 Und doch wäre es ziemlich nützlich zu sein in der Lage, ein Programm, das speichert schreiben 1015 00:44:37,230 --> 00:44:40,440 in einer Variablen, eines Schülers ID-Nummer, ihren Namen, und ihr Haus. 1016 00:44:40,440 --> 00:44:42,890 Mit anderen Worten, drei Stücke von Daten, wie ein int und ein 1017 00:44:42,890 --> 00:44:44,420 String und andere Zeichenfolge. 1018 00:44:44,420 --> 00:44:48,220 >> Mit typedef, was ist ziemlich mächtig über dies und das Schlüsselwort für sturct 1019 00:44:48,220 --> 00:44:53,660 Struktur, Sie als Programmierer im Jahr 2013, tatsächlich eigene definieren die 1020 00:44:53,660 --> 00:44:57,530 Datentypen, die nicht existierten Jahre her, aber dass Ihre Zwecke. 1021 00:44:57,530 --> 00:45:01,910 Und hier, in den Zeilen 13 bis 19, wir erklären einen neuen Datentyp, wie 1022 00:45:01,910 --> 00:45:04,320 ein int, aber nannte es Schüler. 1023 00:45:04,320 --> 00:45:09,310 Und innerhalb dieser Variablen wird zu gehen sein drei Dinge - ein int, String, 1024 00:45:09,310 --> 00:45:09,930 und eine Zeichenfolge. 1025 00:45:09,930 --> 00:45:13,040 So können Sie von dem, was wirklich hier passiert ist, obwohl es sich um eine 1026 00:45:13,040 --> 00:45:17,160 Bit einer Vereinfachung für heute, ein Student im Wesentlichen gehen 1027 00:45:17,160 --> 00:45:19,450 wie folgt aussehen. 1028 00:45:19,450 --> 00:45:22,580 Sein Gehen, ein Stück sein Speicher mit einer ID, ein Name 1029 00:45:22,580 --> 00:45:25,580 Feld, und ein Haus ein. 1030 00:45:25,580 --> 00:45:30,670 Und wir werden in der Lage sein, diese Stücke verwenden Speicher und greifen Sie wie folgt. 1031 00:45:30,670 --> 00:45:38,870 >> Wenn ich in struct0.c gehen, ist hier ein relativ lang, aber nach einer 1032 00:45:38,870 --> 00:45:42,630 Muster, der Code, verwendet diesen neuen Trick. 1033 00:45:42,630 --> 00:45:45,790 Also lassen Sie mich zunächst darauf aufmerksam zu den interessanten Teilen bis oben. 1034 00:45:45,790 --> 00:45:49,670 Sharp legt Studenten 3, erklärt ein Konstante namens Studenten und Abtretungsempfänger 1035 00:45:49,670 --> 00:45:53,450 willkürlich die Zahl 3, nur so habe ich drei Studenten, die mit 1036 00:45:53,450 --> 00:45:54,830 dieses Programm für heute. 1037 00:45:54,830 --> 00:45:55,960 Kommt Main. 1038 00:45:55,960 --> 00:45:58,860 Und beachtet, wie kann ich erklären eine Reihe von Studenten? 1039 00:45:58,860 --> 00:46:00,480 Nun, ich nutze einfach die gleiche Syntax. 1040 00:46:00,480 --> 00:46:02,110 Das Wort Student ist offensichtlich neu. 1041 00:46:02,110 --> 00:46:04,790 Aber Schüler, Klasse, Schüler Halterung. 1042 00:46:04,790 --> 00:46:06,720 >> So leider gibt es eine Menge der Wiederverwendung von Begriffen hier. 1043 00:46:06,720 --> 00:46:07,660 Dies ist nur eine Nummer. 1044 00:46:07,660 --> 00:46:09,040 Also das ist wie gesagt drei. 1045 00:46:09,040 --> 00:46:11,430 Klasse ist genau das, was ich will die Variable nennen. 1046 00:46:11,430 --> 00:46:12,840 Ich könnte es Studenten. 1047 00:46:12,840 --> 00:46:15,880 Aber Klasse, ist dies nicht eine Klasse in ein objektorientierten Java Art und Weise. 1048 00:46:15,880 --> 00:46:17,220 Es ist nur eine Klasse von Schülern. 1049 00:46:17,220 --> 00:46:20,590 Und der Datentyp jedes Elements in diesem Array ist Student. 1050 00:46:20,590 --> 00:46:23,040 Also das ist ein wenig anders und von etwas zu sagen 1051 00:46:23,040 --> 00:46:25,250 wie diese, es ist nur - 1052 00:46:25,250 --> 00:46:29,500 Ich sage mir drei Studenten und rufen Sie das Array-Klasse. 1053 00:46:29,500 --> 00:46:29,800 >> In Ordnung. 1054 00:46:29,800 --> 00:46:30,680 Jetzt ist hier eine vier-Schleife. 1055 00:46:30,680 --> 00:46:33,480 Dieser Kerl ist vertraut - iterate von Null auf bis zu drei. 1056 00:46:33,480 --> 00:46:35,160 Und hier ist das neue Stück von Syntax. 1057 00:46:35,160 --> 00:46:37,710 Das Programm wird mich veranlassen, der Mensch, um ihm ein Student 1058 00:46:37,710 --> 00:46:39,200 ID, die ein int ist. 1059 00:46:39,200 --> 00:46:44,650 Und hier ist die Syntax, mit denen Sie speichern etwas in der ID-Feld auf 1060 00:46:44,650 --> 00:46:48,630 Lageklasse Halterung I. So Diese Syntax ist nicht neu. 1061 00:46:48,630 --> 00:46:51,450 Dies bedeutet nur, gib mir die achte Schüler in der Klasse. 1062 00:46:51,450 --> 00:46:52,940 Aber das Symbol ist neu. 1063 00:46:52,940 --> 00:46:56,320 Bis jetzt haben wir nicht genutzt dot, zumindest in Code wie diesen. 1064 00:46:56,320 --> 00:47:01,490 Das bedeutet, auf die Struktur bekannt als gehen ein Student und legte dort etwas. 1065 00:47:01,490 --> 00:47:05,670 Auch in diesem nächsten Zeile, 31, gehen voran und setzen, was der Benutzer-Typen 1066 00:47:05,670 --> 00:47:10,530 für Sie hier einen Namen und was sie für eine Haus, dasselbe, gehen Sie vor und 1067 00:47:10,530 --> 00:47:13,230 steckte es in. Hauses. 1068 00:47:13,230 --> 00:47:15,955 >> Also, was macht dieses Programm letztendlich zu tun? 1069 00:47:15,955 --> 00:47:17,220 Sie können einen kleinen Vorgeschmack gibt. 1070 00:47:17,220 --> 00:47:24,780 Lassen Sie mich gehen Sie vor und machen Sie Strukturen 0 dot Schrägstrich struct 0, Schüler-ID 1, 1071 00:47:24,780 --> 00:47:28,250 sagen David Mather, Studentenausweis 2. 1072 00:47:28,250 --> 00:47:32,070 Rob Kirkland, Studentenausweis 3. 1073 00:47:32,070 --> 00:47:35,010 Lauren Leverit - 1074 00:47:35,010 --> 00:47:38,380 und das einzige, was dieses Programm haben, Das ist einfach völlig willkürlich, wird 1075 00:47:38,380 --> 00:47:40,980 Ich wollte etwas mit diesen Daten zu tun, jetzt, dass ich uns gelehrt, wie man 1076 00:47:40,980 --> 00:47:43,450 Strukturen verwenden, ist, dass ich gerade diese zusätzliche Schleife hier. 1077 00:47:43,450 --> 00:47:45,260 Ich über die Anordnung der Studierenden durchlaufen. 1078 00:47:45,260 --> 00:47:49,170 Früher habe ich unsere, vielleicht inzwischen vertrauten Freund, String vergleichen, um stircomp 1079 00:47:49,170 --> 00:47:53,780 Check ist der 8. Schülers Haus gleich Mather? 1080 00:47:53,780 --> 00:47:56,760 Und wenn ja, nur etwas ausdrucken willkürlich mag, ja, das ist es. 1081 00:47:56,760 --> 00:47:59,430 Aber noch einmal, nur gibt mir Möglichkeiten zu nutzen und wiederzuverwenden und 1082 00:47:59,430 --> 00:48:02,270 Wiederverwendung dieser neuen dot-Notation. 1083 00:48:02,270 --> 00:48:03,250 >> Also wer sich interessiert, nicht wahr? 1084 00:48:03,250 --> 00:48:06,270 Coming up mit einem Schüler-Programm ist etwas willkürlich, aber es stellt sich heraus, 1085 00:48:06,270 --> 00:48:09,800 dass wir nützliche Dinge tun mit Dies ist zum Beispiel wie folgt. 1086 00:48:09,800 --> 00:48:14,600 Dies ist ein komplizierter struct in C. Es hat ein Dutzend oder mehr Felder, 1087 00:48:14,600 --> 00:48:15,880 etwas kryptisch benannt. 1088 00:48:15,880 --> 00:48:20,110 Aber wenn Sie jemals von einem Grafik gehört Dateiformat namens Bitmap, BMP, es 1089 00:48:20,110 --> 00:48:22,830 stellt sich heraus, dass die Bitmap-Datei-Format ziemlich ähnlich sieht, dass diese. 1090 00:48:22,830 --> 00:48:24,200 Es ist eine dumme kleine Smiley Gesicht. 1091 00:48:24,200 --> 00:48:27,840 Es ist ein kleines Bild, dass ich in gezoomt auf ziemlich groß, so dass ich sehen konnte jeder 1092 00:48:27,840 --> 00:48:30,410 von den einzelnen Punkten oder Pixeln. 1093 00:48:30,410 --> 00:48:33,800 Nun, es stellt sich heraus, dass wir ein darstellen kann black dot mit, sagen wir, die Zahl 0. 1094 00:48:33,800 --> 00:48:35,520 Und ein weißer Punkt mit der Nummer 1. 1095 00:48:35,520 --> 00:48:39,140 >> Also mit anderen Worten, wenn Sie wollen, ziehen ein Smiley-Gesicht und speichern Sie das Bild in ein 1096 00:48:39,140 --> 00:48:42,680 Computer, genügt es, Nullen speichern und diejenigen, die so aussehen, wo 1097 00:48:42,680 --> 00:48:45,250 wieder, sind diejenigen, weiß und Nullen sind schwarz. 1098 00:48:45,250 --> 00:48:48,290 Und gemeinsam, wenn Sie effektiv haben ein von Einsen und Nullen rüsten, haben Sie ein 1099 00:48:48,290 --> 00:48:51,030 Gitter aus Pixeln, und wenn Sie legen sie aus, haben Sie eine nette 1100 00:48:51,030 --> 00:48:52,560 wenig Smiley Gesicht. 1101 00:48:52,560 --> 00:48:58,150 Nun ist Bitmapdateiformat, BMP, effektiv, dass unter der Haube, 1102 00:48:58,150 --> 00:49:00,970 aber mit mehr Pixeln sot, dass Sie kann tatsächlich repräsentieren Farben. 1103 00:49:00,970 --> 00:49:05,170 >> Aber wenn man über kompliziertere Dateiformate wie BMP und JPEG und GIF 1104 00:49:05,170 --> 00:49:09,360 mit denen Sie vielleicht kennen, die Dateien auf der Festplatte in der Regel nicht nur 1105 00:49:09,360 --> 00:49:13,760 haben Nullen und Einsen für die Pixel, aber sie haben einige Metadaten sowie - 1106 00:49:13,760 --> 00:49:16,960 meta in dem Sinne, das ist nicht wirklich Daten, aber es ist nützlich zu haben. 1107 00:49:16,960 --> 00:49:21,370 Also diese Felder hier impliziert, und wir werden diese im Detail in P-Satz zu sehen 1108 00:49:21,370 --> 00:49:25,810 5, dass vor den Nullen und Einsen, dass stellen die Pixel in einem Bild, 1109 00:49:25,810 --> 00:49:29,110 gibt es eine Reihe von Metadaten wie die Größe des Bildes und die 1110 00:49:29,110 --> 00:49:30,250 Breite des Bildes. 1111 00:49:30,250 --> 00:49:32,910 Und ich merke, ich Rupfen aus einige beliebige Dinge hier - 1112 00:49:32,910 --> 00:49:34,260 Breite und Höhe. 1113 00:49:34,260 --> 00:49:36,160 Bit count und einige andere Dinge. 1114 00:49:36,160 --> 00:49:37,840 So gibt es einige Metadaten in einer Datei. 1115 00:49:37,840 --> 00:49:41,470 >> Aber durch das Verständnis, wie die Dateien gelegt werden auf diese Weise kann man tatsächlich 1116 00:49:41,470 --> 00:49:45,890 dann Bearbeiten von Bildern, erholen Bilder von der Festplatte, die Größe von Bildern. 1117 00:49:45,890 --> 00:49:47,560 Aber man kann nicht unbedingt verbessern sie. 1118 00:49:47,560 --> 00:49:48,480 Ich brauchte ein Foto. 1119 00:49:48,480 --> 00:49:52,840 Also ging ich zurück zu RJ hier, die du gesehen hast, auf dem Bildschirm schon vor einiger Zeit. 1120 00:49:52,840 --> 00:49:57,160 Und wenn ich Keynote hier öffnen, ist dies was passiert, wenn Sie versuchen, um es zu vergrößern und 1121 00:49:57,160 --> 00:49:59,380 RJ verbessern. 1122 00:49:59,380 --> 00:50:01,480 Er ist nicht besser, wirklich. 1123 00:50:01,480 --> 00:50:06,240 Jetzt Keynote ist eine Art verwischt es ein wenig, nur um über den Glanz 1124 00:50:06,240 --> 00:50:11,040 Tatsache, dass RJ nicht besonders bekommen erhöht, wenn Sie in. vergrößern 1125 00:50:11,040 --> 00:50:13,310 Und wenn es auf diese Weise, sehen die Quadrate? 1126 00:50:13,310 --> 00:50:15,490 Ja, können Sie auf jeden Fall sehen die Quadrate auf einem Projektor. 1127 00:50:15,490 --> 00:50:17,690 >> Das ist, was Sie, wenn Sie verbessern zu bekommen. 1128 00:50:17,690 --> 00:50:22,570 Aber zu verstehen, wie unsere RJ oder die Smiley-Gesicht umgesetzt wird uns 1129 00:50:22,570 --> 00:50:24,950 tatsächlich Code schreiben, der manipuliert diese Dinge. 1130 00:50:24,950 --> 00:50:29,970 Und ich dachte, ich würde in diesem Sinne zu beenden, mit 55 Sekunden von einer Verbesserung ist, dass, 1131 00:50:29,970 --> 00:50:31,230 Ich wage, sagen wir eher irreführend. 1132 00:50:31,230 --> 00:50:32,990 >> [VIDEO PLAYBACK] 1133 00:50:32,990 --> 00:50:34,790 >> -Er lügt. 1134 00:50:34,790 --> 00:50:38,310 Über was, ich weiß nicht. 1135 00:50:38,310 --> 00:50:41,200 >> -Also, was wissen wir? 1136 00:50:41,200 --> 00:50:45,280 >> -Das um 9:15 Ray Santoya war bei der ATM. 1137 00:50:45,280 --> 00:50:47,830 >> -Die Frage ist also, was tat er um 9:16? 1138 00:50:47,830 --> 00:50:50,750 >> -Schießen die neun Millimeter auf etwas. 1139 00:50:50,750 --> 00:50:52,615 Vielleicht sah er die Scharfschützen. 1140 00:50:52,615 --> 00:50:54,760 >> -Oder war die Arbeit mit ihm. 1141 00:50:54,760 --> 00:50:56,120 >> -Warten. 1142 00:50:56,120 --> 00:50:57,450 Zurück eins. 1143 00:50:57,450 --> 00:50:58,700 >> -Was sehen Sie? 1144 00:50:58,700 --> 00:51:05,530 1145 00:51:05,530 --> 00:51:09,490 >> -Bringen Sie sein Gesicht, Vollbild. 1146 00:51:09,490 --> 00:51:09,790 >> -Seine Brille. 1147 00:51:09,790 --> 00:51:11,040 >> -Es ist eine Reflexion. 1148 00:51:11,040 --> 00:51:21,790 1149 00:51:21,790 --> 00:51:23,520 >> -Das ist die Neuvitas Baseball-Team. 1150 00:51:23,520 --> 00:51:24,530 Das ist ihr Logo. 1151 00:51:24,530 --> 00:51:27,040 >> -Und er hat zu reden, wer ist Tragen diese Jacke. 1152 00:51:27,040 --> 00:51:27,530 >> [END VIDEO PLAYBACK] 1153 00:51:27,530 --> 00:51:29,180 >> DAVID J. MALAN: Dies wird sein Problem Set 5. 1154 00:51:29,180 --> 00:51:30,720 Wir sehen uns nächste Woche. 1155 00:51:30,720 --> 00:51:32,330 >> Männlicher Sprecher: An der nächsten CS50. 1156 00:51:32,330 --> 00:51:39,240 >> [Grillen zirpen] 1157 00:51:39,240 --> 00:51:41,270 >> [Musik spielt]