1 00:00:00,000 --> 00:00:11,200 2 00:00:11,200 --> 00:00:12,580 >> DAVID MALAN: All right, willkommen zurück. 3 00:00:12,580 --> 00:00:13,290 Dies ist CS50. 4 00:00:13,290 --> 00:00:15,130 Dies ist der Beginn der Woche sieben. 5 00:00:15,130 --> 00:00:18,890 Also es ist schon eine Weile her, so dass ich dachte, wir würden nehmen eine rasante Tour, wo wir 6 00:00:18,890 --> 00:00:20,760 Aus-und links, wo wir gehen jetzt. 7 00:00:20,760 --> 00:00:23,310 >> Also diese Sache hier haben könnte verursachte etwas angst auf den ersten. 8 00:00:23,310 --> 00:00:27,680 Aber hoffentlich sind Sie zum Anfang akklimatisieren, was dies bedeutet hier - 9 00:00:27,680 --> 00:00:32,670 Sterne, die einen Zeiger, der ist genau das, was in mehr juristischer Hinsicht? 10 00:00:32,670 --> 00:00:33,400 Also ist es eine Adresse. 11 00:00:33,400 --> 00:00:35,490 >> So ist es die Adresse des etwas in Erinnerung. 12 00:00:35,490 --> 00:00:38,260 Und wir begannen zu schälen die Schichten ein paar Wochen, wie die Dinge 13 00:00:38,260 --> 00:00:41,800 GetString und andere solche Funktionen all dieser Zeit wurden wieder 14 00:00:41,800 --> 00:00:46,010 Adressen der Dinge in Erinnerung, wie die Adresse des ersten Zeichens in 15 00:00:46,010 --> 00:00:46,990 einige Sequenz. 16 00:00:46,990 --> 00:00:50,360 >> So führten wir auch valgrind, die Sie beginnen, für dieses Problem verwenden 17 00:00:50,360 --> 00:00:53,380 festzulegen, insbesondere für die nächste Problem eingestellt als gut. 18 00:00:53,380 --> 00:00:54,980 Und valgrind tut, was für uns? 19 00:00:54,980 --> 00:00:57,520 20 00:00:57,520 --> 00:01:01,020 Es prüft, ob Speicherlecks, und es Außerdem prüft wegen Missbrauch der Erinnerung. 21 00:01:01,020 --> 00:01:05,890 >> Es kann mit einiger Wahrscheinlichkeit erkennen, ob Ihr Code wird Speicher berühren 22 00:01:05,890 --> 00:01:07,100 dass es einfach nicht tun sollten. 23 00:01:07,100 --> 00:01:10,410 Also nicht unbedingt ein Leck, aber wenn Sie geht über die Grenzen der einige 24 00:01:10,410 --> 00:01:14,730 Array und Sie tatsächlich ausführen valgrind und induzieren dieses Verhalten während 25 00:01:14,730 --> 00:01:17,870 valgrind wird in Ihrem Programm ausgeführt wird Laufen in der es, erhalten Sie 26 00:01:17,870 --> 00:01:21,460 Meldungen wie diese - "invalid schreiben von Größe 4 ", die erinnern ein paar 27 00:01:21,460 --> 00:01:25,880 Wochen gemeint, dass ich aus Versehen hatte mag auf der einen int zu weit 28 00:01:25,880 --> 00:01:27,250 über die Grenzen eines Arrays. 29 00:01:27,250 --> 00:01:30,790 Und so Größe 4 bedeutet hier die Größe des jeweiligen Int. 30 00:01:30,790 --> 00:01:35,260 >> So nehmen Beruhigung in der Tatsache, dass valgrind die Ausgabe, das Format ist, 31 00:01:35,260 --> 00:01:36,170 ist nur grauenhaft. 32 00:01:36,170 --> 00:01:40,180 Es ist wirklich schwer, durch das Durcheinander zu sehen für die interessanten Informationen. 33 00:01:40,180 --> 00:01:42,910 Also, was wir hier gemacht haben ist nur Auszug einige von den paar mehr 34 00:01:42,910 --> 00:01:43,850 interessante Linien. 35 00:01:43,850 --> 00:01:46,760 Aber klar, dass 80% der valgrind die Ausgang wird ein bisschen wie ein sein 36 00:01:46,760 --> 00:01:47,650 Ablenkung. 37 00:01:47,650 --> 00:01:52,820 >> Just for Muster wie diese aussehen - ungültig Recht, ungültig zu lesen, 40 Byte 38 00:01:52,820 --> 00:01:56,690 und eine Anzahl von Blöcken sind definitiv verloren, dass Schlüsselwörter wie. 39 00:01:56,690 --> 00:02:01,920 Und das, was Sie sehen, ist hoffentlich einige Art der Spur, welche Funktion die 40 00:02:01,920 --> 00:02:03,340 Fehler ist eigentlich in. 41 00:02:03,340 --> 00:02:07,195 In diesem Fall hier, in welcher Zeile mein Code war der Fehler offenbar? 42 00:02:07,195 --> 00:02:09,729 43 00:02:09,729 --> 00:02:14,130 >> 26 in einer Datei namens memory.c, das war das Beispiel haben wir mit dem Spielen wurden 44 00:02:14,130 --> 00:02:14,890 an der Zeit. 45 00:02:14,890 --> 00:02:16,460 So ist es wahrscheinlich nicht in malloc. 46 00:02:16,460 --> 00:02:18,630 Es war wohl in meinem Code statt. 47 00:02:18,630 --> 00:02:20,910 Also werden wir dies wieder zu sehen und schon bald wieder. 48 00:02:20,910 --> 00:02:24,080 >> So scanf, kam diese in ein paar Formen so weit. 49 00:02:24,080 --> 00:02:26,410 Wir sahen sscanf kurz. 50 00:02:26,410 --> 00:02:28,330 Es war etwas, eine Reihe von Sie tauchte in in Ihrem 51 00:02:28,330 --> 00:02:29,535 Vorbereitungen für das Quiz. 52 00:02:29,535 --> 00:02:33,130 Und scanf ist eigentlich das, was die CS50 Bibliothek unter die wurden mit 53 00:02:33,130 --> 00:02:36,560 Kapuze seit geraumer Zeit, um einer Eingabe durch den Benutzer zu erhalten. 54 00:02:36,560 --> 00:02:40,420 >> Zum Beispiel, wenn ich mich bewege über den CS50 Gerät hier, lass mich eröffnen ein 55 00:02:40,420 --> 00:02:45,315 Beispiel heute, die aufgerufen scanf-0.C ist Und es ist super einfach. 56 00:02:45,315 --> 00:02:46,590 Es ist nur ein paar Zeilen Code. 57 00:02:46,590 --> 00:02:50,880 Aber es zeigt wirklich, wie getInt gearbeitet hat, all dieser Zeit. 58 00:02:50,880 --> 00:02:54,710 >> In diesem Programm finden Sie hier, in Zeile 16 Beachten Sie, dass ich ein int deklarieren. 59 00:02:54,710 --> 00:02:57,270 Also keine Zeiger, nichts Magisches da, nur ein int. 60 00:02:57,270 --> 00:03:00,330 Dann in Zeile 17, die ich prompt Benutzer für eine Reihe, bitte. 61 00:03:00,330 --> 00:03:02,930 Dann Ende 18, ich benutze scanf hier. 62 00:03:02,930 --> 00:03:06,910 Und ich angegeben, der Art wie printf, Ich erwarte, dass Zitat 63 00:03:06,910 --> 00:03:08,110 unquote Prozent i. 64 00:03:08,110 --> 00:03:10,920 >> So Prozent i natürlich bezeichnet einen int. 65 00:03:10,920 --> 00:03:14,580 Aber bemerken, was die zweite Argument scanf ist. 66 00:03:14,580 --> 00:03:17,350 Wie würden Sie die zweite Argument nach dem Komma? 67 00:03:17,350 --> 00:03:19,450 Was ist das? 68 00:03:19,450 --> 00:03:20,670 >> Es ist die Adresse von x. 69 00:03:20,670 --> 00:03:25,490 So ist dies, weil durch die Bereitstellung nützlicher scanf mit der Adresse x, was bedeutet 70 00:03:25,490 --> 00:03:29,560 , die Lage versetzen, diese Funktion zu tun? 71 00:03:29,560 --> 00:03:33,010 Nicht nur dorthin zu gehen, sondern auch was zu tun? 72 00:03:33,010 --> 00:03:34,060 >> Nehmen Sie eine Änderung um sie. 73 00:03:34,060 --> 00:03:38,080 Weil du es gehen kann, ist es eine Art wie eine Karte zu einer Stelle in dem Speicher. 74 00:03:38,080 --> 00:03:41,900 Und so lange, wie Sie bieten scanf oder jede Funktion mit einer solchen Karte, dass 75 00:03:41,900 --> 00:03:45,840 Funktion kann es gehen, und nicht nur Blick auf den Wert, aber es kann auch 76 00:03:45,840 --> 00:03:49,670 Ändern Sie diesen Wert, das ist nützlich, wenn das Ziel im Leben ist es, von scanf 77 00:03:49,670 --> 00:03:53,060 Scannen Eingabe vom Benutzer, und zwar von der Tastatur. 78 00:03:53,060 --> 00:03:57,830 Und das f zeigt formatierte, genau wie printf bezeichnet das f eine formatierte 79 00:03:57,830 --> 00:03:58,930 Zeichenfolge, die Sie drucken möchten. 80 00:03:58,930 --> 00:04:04,430 >> Also kurz gesagt, diese Linie 18 sagt einfach, versuchen, eine int vom Benutzer gelesen 81 00:04:04,430 --> 00:04:10,420 Tastatur und speichern Sie es innerhalb von x, bei was passiert mit x-Adresse an leben. 82 00:04:10,420 --> 00:04:14,860 Und dann schließlich, Zeile 19 sagt nur, danke für den int, in diesem Fall. 83 00:04:14,860 --> 00:04:15,940 >> Also lassen Sie mich gehen Sie vor und machen diese. 84 00:04:15,940 --> 00:04:18,570 So machen scanf 0. 85 00:04:18,570 --> 00:04:20,130 Lassen Sie mich gehen Sie vor und Vergrößern klicken 86 00:04:20,130 --> 00:04:22,960 Ich werde gehen und laufen diese mit dots Schrägstrich scanf 0. 87 00:04:22,960 --> 00:04:24,020 Nummer, bitte? 88 00:04:24,020 --> 00:04:24,720 50. 89 00:04:24,720 --> 00:04:25,730 Vielen Dank für die 50. 90 00:04:25,730 --> 00:04:27,270 So ist es ganz einfach. 91 00:04:27,270 --> 00:04:28,160 >> Nun, was ist es nicht zu tun? 92 00:04:28,160 --> 00:04:29,940 Es ist nicht zu tun eine ganze Reihe der Fehlerprüfung. 93 00:04:29,940 --> 00:04:33,000 Zum Beispiel, wenn ich nicht mit, und ich glaube nicht eine Zahl eingeben, aber 94 00:04:33,000 --> 00:04:37,860 stattdessen schreibe ich etwas wie "hallo" das ist nur irgendwie seltsam. 95 00:04:37,860 --> 00:04:41,130 Und so eines der Dinge, die CS50 Bibliothek wurde für uns zu tun für einige 96 00:04:41,130 --> 00:04:43,440 Zeit ist, dass reprompting und reprompting. 97 00:04:43,440 --> 00:04:49,320 >> Die Wiederholung Begriff Rückruf war in cs50.c, und das ist der Grund, dass in getInt 98 00:04:49,320 --> 00:04:51,670 der CS50-Bibliothek ist eigentlich eine ganze Bündel von Zeilen lang, weil wir 99 00:04:51,670 --> 00:04:53,190 Überprüfung für dumme Sachen wie diese. 100 00:04:53,190 --> 00:04:55,730 Hat der Benutzer nicht geben uns in der Tat, ein int? 101 00:04:55,730 --> 00:04:57,910 Hat er oder sie uns etwas geben wie ein alphabetischer Brief? 102 00:04:57,910 --> 00:05:01,410 Wenn ja, wollen wir erkennen dass und schreien sie an. 103 00:05:01,410 --> 00:05:03,915 >> Aber die Sache schon interessanter Im nächsten Beispiel. 104 00:05:03,915 --> 00:05:09,840 Wenn ich scanf-1.c gehen, ist was der eine Sache, die grundsätzlich in geändert wird 105 00:05:09,840 --> 00:05:11,135 Das nächste Beispiel? 106 00:05:11,135 --> 00:05:13,690 107 00:05:13,690 --> 00:05:16,010 Ich bin mit char *, natürlich, anstelle von int. 108 00:05:16,010 --> 00:05:19,210 >> Also das ist interessant, weil char *, erinnern, ist wirklich nur die 109 00:05:19,210 --> 00:05:20,190 dasselbe wie String. 110 00:05:20,190 --> 00:05:23,840 So fühlt es sich wie vielleicht ein super ist einfache Implementierung GetString. 111 00:05:23,840 --> 00:05:26,010 Aber ich habe wieder die Schicht geschält des CS50-Bibliothek, also bin ich 112 00:05:26,010 --> 00:05:27,550 Aufruf dieser char * jetzt. 113 00:05:27,550 --> 00:05:30,070 Also mal sehen, wo, wenn irgendwo, wir schief gehen. 114 00:05:30,070 --> 00:05:30,840 >> Zeile 17 - 115 00:05:30,840 --> 00:05:33,950 Ich noch einmal sagen, bitte geben Sie mir etwas, in diesem Fall wird eine Zeichenfolge. 116 00:05:33,950 --> 00:05:37,940 Und dann in der nächsten Zeile, ich nenne scanf, wieder, die ihm einen Format-Code, 117 00:05:37,940 --> 00:05:39,310 aber diesmal Prozent s. 118 00:05:39,310 --> 00:05:41,900 Und dann ist diese Zeit, ich bin ihm Puffer. 119 00:05:41,900 --> 00:05:43,550 >> Jetzt bemerken, ich bin nicht mit das kaufmännische. 120 00:05:43,550 --> 00:05:47,120 Aber warum ist das wohl OK hier? 121 00:05:47,120 --> 00:05:49,760 Denn was ist schon Puffer? 122 00:05:49,760 --> 00:05:50,770 Es ist schon ein Zeiger. 123 00:05:50,770 --> 00:05:51,650 Es ist bereits eine Adresse. 124 00:05:51,650 --> 00:05:54,510 >> Und lassen Sie uns dieses Wort "verwirren", lassen Sie mich nennen es einfach s, z. B. für 125 00:05:54,510 --> 00:05:55,050 Einfachheit. 126 00:05:55,050 --> 00:05:58,250 Aber ich habe es nannte puffern, weil in Generell in der Programmierung, wenn Sie einen 127 00:05:58,250 --> 00:06:02,130 Teil des Speichers, die einen String wirklich gerade ist, könnten Sie nennen es einen Puffer. 128 00:06:02,130 --> 00:06:04,460 Es ist ein Ort, um Informationen zu speichern. 129 00:06:04,460 --> 00:06:07,400 >> Ähnliche Dinge wie YouTube, wenn sie Pufferung, so zu sprechen, dass 130 00:06:07,400 --> 00:06:10,270 bedeutet nur, es ist das Herunterladen von Bits das Internet und Speichern derselben in einem 131 00:06:10,270 --> 00:06:14,160 lokales Array, einem lokalen Teil des Speichers so dass man es später zu sehen, ohne 132 00:06:14,160 --> 00:06:16,830 Überspringen oder es hängen Sie während der Wiedergabe. 133 00:06:16,830 --> 00:06:20,930 >> So gibt es hier ein Problem, obwohl, weil ich sage scanf bin, erwarten eine 134 00:06:20,930 --> 00:06:22,320 String von dem Benutzer. 135 00:06:22,320 --> 00:06:24,410 Hier ist die Adresse von ein Teil des Speichers. 136 00:06:24,410 --> 00:06:26,180 Setzen Sie diese Zeichenfolge gibt. 137 00:06:26,180 --> 00:06:31,230 Warum ist das so gebundene geben uns Mühe, obwohl? 138 00:06:31,230 --> 00:06:33,490 >> Was ist das? 139 00:06:33,490 --> 00:06:35,510 Darf ich zugreifen dass ein Teil des Speichers? 140 00:06:35,510 --> 00:06:36,250 Weißt du, ich weiß nicht. 141 00:06:36,250 --> 00:06:39,210 Da hat Puffer initialisiert um nichts? 142 00:06:39,210 --> 00:06:39,820 Nicht wirklich. 143 00:06:39,820 --> 00:06:43,090 Und so ist es, was wir gefordert eine Garbage-Wert, der 144 00:06:43,090 --> 00:06:44,040 ist nicht eine formale Wort. 145 00:06:44,040 --> 00:06:49,200 Es bedeutet nur, wir haben keine Ahnung, was Bits sind innerhalb der vier Bytes, 146 00:06:49,200 --> 00:06:51,240 Ich habe als Puffer zugeordnet. 147 00:06:51,240 --> 00:06:52,450 >> Ich habe nicht angerufen malloc. 148 00:06:52,450 --> 00:06:53,940 Ich habe definitiv nicht genannt GetString. 149 00:06:53,940 --> 00:06:56,380 Also, wer weiß, was ist eigentlich Innenseite der Puffer? 150 00:06:56,380 --> 00:07:00,550 Und doch erzählen scanf blind, dorthin zu gehen und setzen, was der Benutzer eingegeben. 151 00:07:00,550 --> 00:07:04,460 >> Also, was ist zu veranlassen geeignet in unserem Code, wenn wir es laufen? 152 00:07:04,460 --> 00:07:05,700 Wahrscheinlich ein segfault. 153 00:07:05,700 --> 00:07:07,970 Vielleicht nicht, aber wahrscheinlich ein segfault. 154 00:07:07,970 --> 00:07:10,620 Und ich sage, vielleicht auch nicht, denn manchmal Sie tun, manchmal 155 00:07:10,620 --> 00:07:11,380 Sie erhalten keine segfault. 156 00:07:11,380 --> 00:07:14,280 Manchmal muss man einfach Glück haben, aber es dennoch sein wird 157 00:07:14,280 --> 00:07:15,340 ein Fehler in unserem Programm. 158 00:07:15,340 --> 00:07:17,060 >> Also lass mich gehen und diese kompilieren. 159 00:07:17,060 --> 00:07:18,280 Ich werde es tun, desto alten Schule. 160 00:07:18,280 --> 00:07:23,825 So clang dash 0, scanf-1, scanf-1.c, Enter. 161 00:07:23,825 --> 00:07:24,720 Hoppla, zu alten Schule. 162 00:07:24,720 --> 00:07:26,550 Mal sehen. 163 00:07:26,550 --> 00:07:28,440 Wo habe ich? 164 00:07:28,440 --> 00:07:29,700 Oh, char * buffer. 165 00:07:29,700 --> 00:07:33,595 166 00:07:33,595 --> 00:07:35,130 Oh, danke - 167 00:07:35,130 --> 00:07:36,930 Speichern, OK - 168 00:07:36,930 --> 00:07:37,690 sehr alte Schule. 169 00:07:37,690 --> 00:07:38,900 Na gut, es ist schon eine Weile her. 170 00:07:38,900 --> 00:07:41,720 >> Also habe ich einfach die Datei nach gespeichert machen, dass temporäre 171 00:07:41,720 --> 00:07:42,700 vor einem Augenblick ändern. 172 00:07:42,700 --> 00:07:46,090 Und jetzt habe ich es kompiliert manuell mit Schall. 173 00:07:46,090 --> 00:07:49,500 Und jetzt gehe ich voran gehen und führen scanf-1, Enter. 174 00:07:49,500 --> 00:07:50,290 String bitte. 175 00:07:50,290 --> 00:07:51,600 Ich werde in Typ "hallo." 176 00:07:51,600 --> 00:07:54,070 >> Und jetzt ist hier, wo, ehrlich gesagt, printf kann, ist ein wenig ärgerlich. 177 00:07:54,070 --> 00:07:56,020 Es ist nicht eigentlich los Segfault in diesem Fall. 178 00:07:56,020 --> 00:07:59,860 Printf ist ein wenig speziell, weil es ist so super, dass häufig verwendete 179 00:07:59,860 --> 00:08:03,570 Wesentlichen printf tut uns einen Gefallen und Realisierung, 180 00:08:03,570 --> 00:08:04,830 das ist nicht ein gültiger Zeiger. 181 00:08:04,830 --> 00:08:09,080 Lassen Sie mich es auf mich nur zum Drucken in Klammern null, auch 182 00:08:09,080 --> 00:08:13,340 obwohl es nicht unbedingt das, was wir uns erwartet. 183 00:08:13,340 --> 00:08:16,940 >> So können wir nicht wirklich leicht zu induzieren ein segfault mit diesem, aber eindeutig das 184 00:08:16,940 --> 00:08:18,600 ist nicht das Verhalten, das ich wollte. 185 00:08:18,600 --> 00:08:19,800 Also, was ist die einfache Lösung? 186 00:08:19,800 --> 00:08:25,650 Nun, in scanf-2, lassen Sie mich schlagen vor, dass anstatt wirklich nur eine Zuteilung 187 00:08:25,650 --> 00:08:30,100 char *, lassen Sie mich ein wenig schlauer über dies, und lassen Sie mich zuteilen Puffer 188 00:08:30,100 --> 00:08:32,940 als eine Folge von 16 Zeichen. 189 00:08:32,940 --> 00:08:34,200 >> So kann ich diese in ein paar Möglichkeiten. 190 00:08:34,200 --> 00:08:35,610 Ich konnte absolut malloc verwenden. 191 00:08:35,610 --> 00:08:38,980 Aber ich kann zurück zu Woche zwei, wenn Ich brauchte nur eine ganze Reihe von 192 00:08:38,980 --> 00:08:39,620 Zeichen. 193 00:08:39,620 --> 00:08:40,860 Das ist nur ein Array. 194 00:08:40,860 --> 00:08:44,870 Also lassen Sie mich stattdessen neu Puffer ein Array von 16 Zeichen lang sein. 195 00:08:44,870 --> 00:08:47,340 >> Und jetzt, wo ich pass in Puffer - 196 00:08:47,340 --> 00:08:49,940 und dies ist etwas, was wir nicht sprechen in Woche zwei - 197 00:08:49,940 --> 00:08:53,730 aber Sie können ein Array als behandeln obwohl es eine Adresse. 198 00:08:53,730 --> 00:08:56,390 Technisch, wie wir gesehen haben, sind sie ein bisschen anders. 199 00:08:56,390 --> 00:09:01,290 Aber scanf nichts dagegen, wenn Sie es weitergeben der Name eines Arrays, weil das, was 200 00:09:01,290 --> 00:09:05,030 Schall wird für uns tun im Wesentlichen behandeln den Namen dieses Array als die 201 00:09:05,030 --> 00:09:08,280 Adresse des Brocken von 16 Bytes. 202 00:09:08,280 --> 00:09:09,550 >> Also das ist besser. 203 00:09:09,550 --> 00:09:12,110 Dies bedeutet nun, dass ich kann hoffentlich Gehen Sie wie folgt. 204 00:09:12,110 --> 00:09:16,800 Lassen Sie mich zu verkleinern und für einen Moment tun machen scanf-2, zusammengestellt OK. 205 00:09:16,800 --> 00:09:19,390 Lassen Sie mich nun zu tun Schrägstrich scanf-2. 206 00:09:19,390 --> 00:09:22,430 String bitte. "Hallo." Und es schien diese Zeit zu arbeiten. 207 00:09:22,430 --> 00:09:26,020 >> Aber kann jemand vorschlagen ein Szenario , in dem es nicht immer noch funktionieren? 208 00:09:26,020 --> 00:09:28,550 Ja? 209 00:09:28,550 --> 00:09:30,640 Etwas mehr als 16 Zeichen. 210 00:09:30,640 --> 00:09:32,020 Und tatsächlich, wir können etwas genauer. 211 00:09:32,020 --> 00:09:36,540 Etwas länger als 15 Zeichen, weil wir wirklich brauchen, um im Auge zu behalten 212 00:09:36,540 --> 00:09:39,920 die wir brauchen, dass Backslash Null implizit am Ende der Zeichenkette, 213 00:09:39,920 --> 00:09:42,950 Das ist nebenbei scanf wird in der Regel kümmern sich für uns. 214 00:09:42,950 --> 00:09:46,210 >> Also lassen Sie mich etwas tun - 215 00:09:46,210 --> 00:09:48,040 Manchmal können wir nur lassen Sie es so. 216 00:09:48,040 --> 00:09:50,630 OK, also haben wir jetzt induziert unsere Segmentation Fault. 217 00:09:50,630 --> 00:09:51,000 Warum? 218 00:09:51,000 --> 00:09:54,940 Da ich mehr als 15 eingegeben Zeichen, und so haben wir eigentlich 219 00:09:54,940 --> 00:09:58,280 Speicher berührt, dass ich eigentlich sollte nicht. 220 00:09:58,280 --> 00:10:00,180 >> Also, was ist wirklich die Lösung hier? 221 00:10:00,180 --> 00:10:02,210 Nun, was ist, wenn wir eine längere Schnur? 222 00:10:02,210 --> 00:10:03,960 Nun, wir machen es vielleicht 32 Byte. 223 00:10:03,960 --> 00:10:05,160 Nun, was ist, wenn das nicht lang genug? 224 00:10:05,160 --> 00:10:06,040 Wie wäre es mit 64 Bytes? 225 00:10:06,040 --> 00:10:07,080 Was ist, wenn das nicht lang genug? 226 00:10:07,080 --> 00:10:09,640 Wie wäre es mit 128 oder 200 Bytes? 227 00:10:09,640 --> 00:10:12,660 Was ist eigentlich die Lösung hier in der allgemeinen Fall, wenn wir nicht wissen, in 228 00:10:12,660 --> 00:10:14,460 voranzubringen, was der Benutzer geht zu schreiben? 229 00:10:14,460 --> 00:10:20,000 230 00:10:20,000 --> 00:10:23,050 >> Es ist nur eine Art große Schmerzen in den Arsch, um ehrlich zu sein, weshalb die 231 00:10:23,050 --> 00:10:29,050 CS50-Bibliothek hat ein paar Dutzend Zeilen Code, der gemeinsam umsetzen 232 00:10:29,050 --> 00:10:32,390 GetString String in einer Weise, dass wir nicht müssen im Voraus wissen, was die 233 00:10:32,390 --> 00:10:33,430 Benutzer wird geben. 234 00:10:33,430 --> 00:10:37,370 Insbesondere, wenn man sich wieder an cs50.c von vor zwei Wochen, werden Sie sehen, 235 00:10:37,370 --> 00:10:40,480 dass GetString tatsächlich nicht verwenden scanf in dieser Weise. 236 00:10:40,480 --> 00:10:43,720 Vielmehr liest sie ein Zeichen zu einer Zeit. 237 00:10:43,720 --> 00:10:46,010 >> Da das eine nette Sache über Lesen eines Zeichens ist, können wir 238 00:10:46,010 --> 00:10:48,490 garantieren uns immer mindestens einen char. 239 00:10:48,490 --> 00:10:51,740 Ich kann nur erklären, ein char, und dann nehmen diese wirklich kleine Schritte nur 240 00:10:51,740 --> 00:10:54,380 lesen ein Zeichen auf eine Zeit von der Tastatur. 241 00:10:54,380 --> 00:10:58,240 Und dann, was Sie sehen GetString macht, ist jedes Mal läuft es aus, 242 00:10:58,240 --> 00:11:02,280 sagen, 16 Byte Speicher, verwendet es malloc oder ein Cousin davon, um 243 00:11:02,280 --> 00:11:06,810 mehr Speicher, das Kopieren der alten Speicher in den neuen und dann kriechen 244 00:11:06,810 --> 00:11:09,900 entlang, immer ein Zeichen in einer Zeit, und wenn es läuft aus, dass 245 00:11:09,900 --> 00:11:13,370 Teil des Speichers, wirft es weg, Greifer ein größerer Teil des Speichers, kopiert alt 246 00:11:13,370 --> 00:11:14,750 in neue und wiederholt. 247 00:11:14,750 --> 00:11:18,480 Und es ist wirklich ein Schmerz tatsächlich Umsetzung etwas so einfaches wie 248 00:11:18,480 --> 00:11:19,710 Erhalten einer Eingabe von einem Benutzer. 249 00:11:19,710 --> 00:11:21,090 >> So können Sie scanf. 250 00:11:21,090 --> 00:11:22,430 Sie können auch andere ähnliche Funktionen. 251 00:11:22,430 --> 00:11:25,420 Und eine Menge von Lehrbüchern und Online- Beispiele zu tun, aber sie sind alle 252 00:11:25,420 --> 00:11:27,210 anfällig für Probleme wie diese. 253 00:11:27,210 --> 00:11:29,550 Und letztlich immer ein segfault ist irgendwie nervig. 254 00:11:29,550 --> 00:11:30,680 Es ist nicht gut für den Anwender. 255 00:11:30,680 --> 00:11:33,560 >> Aber im schlimmsten Fall, was bedeutet es grundsätzlich setzen Sie Ihre 256 00:11:33,560 --> 00:11:37,160 Code in Gefahr? 257 00:11:37,160 --> 00:11:39,250 Irgendeine Art von Angriff, möglicherweise. 258 00:11:39,250 --> 00:11:41,680 Wir sprachen über einen solchen Angriff - Überlaufen des Stapels. 259 00:11:41,680 --> 00:11:44,660 Aber im Allgemeinen, wenn Sie zu erlaubt einen Pufferüberlauf, wie wir eine 260 00:11:44,660 --> 00:11:48,070 Vor einigen Wochen, mit nur schriftlich mehr als "Hallo" auf dem Stack, Sie 261 00:11:48,070 --> 00:11:52,330 kann in der Tat zu übernehmen, möglicherweise ein Computer, oder zumindest Daten zu erhalten, die 262 00:11:52,330 --> 00:11:53,510 nicht Ihnen gehören. 263 00:11:53,510 --> 00:11:55,970 >> Also kurz gesagt, das ist, warum wir diese Stützräder. 264 00:11:55,970 --> 00:11:59,090 Aber jetzt fangen wir an, sie abzunehmen, wie unsere Programme nicht mehr benötigen, 265 00:11:59,090 --> 00:12:00,610 notwendigerweise Eingabe von dem Benutzer. 266 00:12:00,610 --> 00:12:03,960 Aber im Fall von Problem stellte sechs, Ihre Eingaben werden aus einer riesigen kommen 267 00:12:03,960 --> 00:12:07,520 Wörterbuch-Datei mit 150 einige ungerade tausend Worte. 268 00:12:07,520 --> 00:12:10,330 >> Sie werden also nicht zu befürchten des Benutzers beliebigen Eingang. 269 00:12:10,330 --> 00:12:13,720 Wir geben Ihnen einige Annahmen über diese Datei. 270 00:12:13,720 --> 00:12:20,340 Irgendwelche Fragen zu Zeigern oder scanf oder Benutzereingaben im Allgemeinen? 271 00:12:20,340 --> 00:12:24,450 >> Alles klar, so ein kurzer Blick dann auf einen Hinterkante Thema aus vor zwei Wochen. 272 00:12:24,450 --> 00:12:28,590 Und das war diese Vorstellung von einer Struktur. 273 00:12:28,590 --> 00:12:34,180 Nicht, dass - diese Vorstellung von einem struct, das war was? 274 00:12:34,180 --> 00:12:35,430 Was hat struct für uns tun? 275 00:12:35,430 --> 00:12:39,280 276 00:12:39,280 --> 00:12:39,860 >> Definieren - 277 00:12:39,860 --> 00:12:41,710 Entschuldigung? 278 00:12:41,710 --> 00:12:42,820 Definieren Sie eine Variable Typ. 279 00:12:42,820 --> 00:12:44,410 Also irgendwie. 280 00:12:44,410 --> 00:12:46,180 Wir sind tatsächlich die Kombination von zwei Themen. 281 00:12:46,180 --> 00:12:49,510 Also mit typedef, daran erinnern, dass wir können erklären, eine Art von unseren eigenen, wie ein 282 00:12:49,510 --> 00:12:51,500 Synonym für wie String char *. 283 00:12:51,500 --> 00:12:56,200 Aber mit typedef struct und können wir erstellen Sie wirklich unsere eigenen Datenstrukturen. 284 00:12:56,200 --> 00:12:59,600 >> Zum Beispiel, wenn ich zurück in gedit hier nur für einen Augenblick, und ich gehe voraus 285 00:12:59,600 --> 00:13:08,230 und etwas tun, lassen Sie mich zu retten dies als, sagen wir, structs.c 286 00:13:08,230 --> 00:13:10,840 vorübergehend, ich werde einfach gehen Sie vor und schließen 287 00:13:10,840 --> 00:13:14,360 standardio.h, int main nichtig. 288 00:13:14,360 --> 00:13:18,960 Und dann hier, nehme, was ich will um ein Programm, dass speichert schreiben 289 00:13:18,960 --> 00:13:21,840 mehrere Schüler aus verschiedenen Häuser, zum Beispiel. 290 00:13:21,840 --> 00:13:24,430 So ist es wie ein registrarial Datenbank einiger sortieren. 291 00:13:24,430 --> 00:13:29,550 >> Also, wenn ich den Namen ein Student braucht, ich könnte so etwas wie char * Namen zu tun, 292 00:13:29,550 --> 00:13:31,570 und ich werde etwas tun - 293 00:13:31,570 --> 00:13:34,410 tatsächlich, verwenden wir die CS50-Bibliothek nur für einen Augenblick, um diesen ein 294 00:13:34,410 --> 00:13:38,380 wenig einfacher, so können wir leihen jene Dutzende von Zeilen Code. 295 00:13:38,380 --> 00:13:39,340 Und lasst uns einfach keep it simple. 296 00:13:39,340 --> 00:13:42,610 Wir halten es string, und jetzt GetString. 297 00:13:42,610 --> 00:13:47,420 >> So behaupte ich jetzt, dass ich den Namen gespeichert von einigen Studenten, und das Haus 298 00:13:47,420 --> 00:13:50,240 einige Schüler, einfach mit Variablen wie wir und in der ersten Woche. 299 00:13:50,240 --> 00:13:52,370 Aber ich nehme jetzt unterstützen wollen mehrere Schüler. 300 00:13:52,370 --> 00:13:58,460 Alles klar, also meinen Instinkten zu tun String Name2, bekommt GetString, string 301 00:13:58,460 --> 00:14:01,370 house2 bekommt GetString. 302 00:14:01,370 --> 00:14:05,850 Und dann unsere dritte Student, lass es uns tun name3 GetString. 303 00:14:05,850 --> 00:14:09,170 >> Alles klar, so ist dies hoffentlich markante Sie als eine Art dumm, 304 00:14:09,170 --> 00:14:11,580 da dieser Prozess ist nie wirklich zu Ende gehen, und es ist gerade dabei, 305 00:14:11,580 --> 00:14:13,130 machen meinen Code schlechter aussehen und schlimmer und schlimmer. 306 00:14:13,130 --> 00:14:14,810 Aber wir lösen diese auch in Woche zwei. 307 00:14:14,810 --> 00:14:19,450 Was war unser relativ saubere Lösung wenn wir hatten mehrere Variablen des 308 00:14:19,450 --> 00:14:23,580 gleichen Datentyp, die alle miteinander verbunden sind, sondern wir nicht wollen, dass diese grausamen Chaos 309 00:14:23,580 --> 00:14:26,870 von ähnlich benannten Variablen? 310 00:14:26,870 --> 00:14:30,060 Was haben wir stattdessen? 311 00:14:30,060 --> 00:14:31,260 >> Also ich glaube, ich hörte ein paar Plätze. 312 00:14:31,260 --> 00:14:32,590 Wir hatten ein Array. 313 00:14:32,590 --> 00:14:37,110 Wenn Sie mehrere Instanzen von etwas, warum wir nicht alle diese reinigen 314 00:14:37,110 --> 00:14:39,540 und einfach sagen, gib mir Array namens Namen? 315 00:14:39,540 --> 00:14:41,640 >> Und jetzt, lasst uns hart Code 3. 316 00:14:41,640 --> 00:14:44,450 Und dann geben Sie mir ein weiteres Array Häuser genannt, und lassen Sie mich für 317 00:14:44,450 --> 00:14:45,800 jetzt schwer Code 3. 318 00:14:45,800 --> 00:14:49,220 Und ich habe massiv bis das gereinigte durcheinander, dass ich gerade erstellt haben. 319 00:14:49,220 --> 00:14:52,400 Nun, ich habe immer noch schwer 3 codiert, sondern sogar die 3 könnte dynamisch aus der kommen 320 00:14:52,400 --> 00:14:54,350 Benutzer oder argv oder dergleichen. 321 00:14:54,350 --> 00:14:55,720 Also das ist schon sauberer. 322 00:14:55,720 --> 00:15:00,100 >> Aber was ist ärgerlich daran ist, dass jetzt ist, obwohl ein Name irgendwie 323 00:15:00,100 --> 00:15:02,280 grundsätzlich verknüpft eines Schülers Haus - 324 00:15:02,280 --> 00:15:04,720 es ist ein Student, dass ich wirklich darstellen wollen - 325 00:15:04,720 --> 00:15:08,080 Ich habe jetzt zwei Arrays, die parallel sind in dem Sinne, dass sie das sind 326 00:15:08,080 --> 00:15:13,930 gleiche Größe und Namen Klammer 0 Karten vermutlich um Häuser Halterung 0, 327 00:15:13,930 --> 00:15:16,600 und Namen Halterung 1 Karten um Häuser Halterung 1. 328 00:15:16,600 --> 00:15:19,280 In anderen Worten, lebt, dass Schüler in das Haus, und dass andere Schüler 329 00:15:19,280 --> 00:15:20,530 Leben im anderen Haus. 330 00:15:20,530 --> 00:15:23,720 Aber sicherlich könnte dies getan noch sauber. 331 00:15:23,720 --> 00:15:24,990 >> Nun, es kann, in der Tat. 332 00:15:24,990 --> 00:15:28,730 Und lassen Sie mich gehen Sie vor und öffnen bis structs.h, und du wirst 333 00:15:28,730 --> 00:15:31,130 sehen diese Idee hier. 334 00:15:31,130 --> 00:15:34,905 Beachten Sie, dass ich verwendet habe, typedef, wie Sie angespielt einen Moment vor, zu erklären, unsere 335 00:15:34,905 --> 00:15:35,570 eigenen Datentyp. 336 00:15:35,570 --> 00:15:39,660 Aber ich bin auch mit diesen anderen Stichwort genannt struct was gibt mir eine neue 337 00:15:39,660 --> 00:15:40,790 Datenstruktur. 338 00:15:40,790 --> 00:15:43,980 >> Und diese Datenstruktur Ich behaupte, wird auf zwei Dinge in haben 339 00:15:43,980 --> 00:15:47,060 es - ein String namens name, und eine Zeichenfolge namens Haus. 340 00:15:47,060 --> 00:15:49,820 Und der Name Ich werde zu geben Diese Datenstruktur wird 341 00:15:49,820 --> 00:15:51,005 genannt Schüler werden. 342 00:15:51,005 --> 00:15:54,030 Ich könnte es, was ich will, aber diese semantisch machen 343 00:15:54,030 --> 00:15:55,810 Sinn für mich in meinem Kopf. 344 00:15:55,810 --> 00:15:59,160 >> So, jetzt, wenn ich eröffnen eine bessere Version des Programms begann ich 345 00:15:59,160 --> 00:16:00,390 gibt, lassen Sie mich nach oben scrollen. 346 00:16:00,390 --> 00:16:03,190 Und es gibt einige weitere Zeilen Code hier, aber lassen Sie mich zu konzentrieren für 347 00:16:03,190 --> 00:16:04,160 der Moment, auf einem. 348 00:16:04,160 --> 00:16:07,790 Ich habe ein konstanter genannte Schüler erklärt und hart 3 jetzt codiert. 349 00:16:07,790 --> 00:16:11,110 Aber jetzt, bemerken, wie sauber mein Code beginnt zu bekommen. 350 00:16:11,110 --> 00:16:15,030 >> In Zeile 22, erkläre ich Array von Studenten. 351 00:16:15,030 --> 00:16:18,760 Und feststellen, dass Schüler offenbar Jetzt ein Datentyp. 352 00:16:18,760 --> 00:16:23,360 Denn am Anfang der Datei, bemerken Ich habe diesen Header-Datei enthalten 353 00:16:23,360 --> 00:16:24,820 dass ich zog nur einen Augenblick vor. 354 00:16:24,820 --> 00:16:28,820 Und dass die Header-Datei ganz einfach hatte diese Definition eines Schülers. 355 00:16:28,820 --> 00:16:32,470 >> So jetzt habe ich meine eigene benutzerdefinierte Daten erstellt Art, dass die Autoren von C Jahren 356 00:16:32,470 --> 00:16:33,890 Vor nicht von im Voraus zu denken. 357 00:16:33,890 --> 00:16:34,570 Aber kein Problem. 358 00:16:34,570 --> 00:16:35,870 Ich kann es mir. 359 00:16:35,870 --> 00:16:39,050 Das ist also ein Array namens Studenten, jeweils aus Mitgliedern 360 00:16:39,050 --> 00:16:41,100 ist ein Student Struktur. 361 00:16:41,100 --> 00:16:44,270 Und ich möchte drei davon in dem Array. 362 00:16:44,270 --> 00:16:46,030 >> Und nun, was macht der Rest dieses Programm? 363 00:16:46,030 --> 00:16:47,550 Ich brauchte etwas, ein wenig willkürlich. 364 00:16:47,550 --> 00:16:51,450 Also von Online 24 vorwärts, I von 0 bis 3 zu durchlaufen. 365 00:16:51,450 --> 00:16:54,000 Dann frage ich den Benutzer zur den Namen des Studenten. 366 00:16:54,000 --> 00:16:56,110 Und dann benutze ich nach wie vor GetString. 367 00:16:56,110 --> 00:16:59,410 Dann frage ich für die Schüler das Haus, und ich verwende GetString wie zuvor. 368 00:16:59,410 --> 00:17:01,780 >> Aber beachten Sie - etwas neues Stück Syntax - 369 00:17:01,780 --> 00:17:07,010 Ich kann mich noch an den Index i-ten Studenten, aber wie kann ich die Daten bekommen 370 00:17:07,010 --> 00:17:08,354 Feld innerhalb der Struktur? 371 00:17:08,354 --> 00:17:11,770 Nun, was ist offenbar die neues Stück Syntax? 372 00:17:11,770 --> 00:17:13,339 Es ist nur der Punkt-Operator. 373 00:17:13,339 --> 00:17:14,510 >> Wir haben nicht wirklich schon einmal gesehen. 374 00:17:14,510 --> 00:17:17,819 Sie haben es in fünf pset gesehen haben, wenn Sie tauchte bereits mit Bitmap-Dateien. 375 00:17:17,819 --> 00:17:22,372 Aber der Punkt bedeutet nur innerhalb dieses struct oder mehrere Felder, geben dot 376 00:17:22,372 --> 00:17:24,510 Namen, oder geben Sie mir dot Haus. 377 00:17:24,510 --> 00:17:28,690 Das bedeutet, gehen innerhalb der Struktur und bekommen diese speziellen Bereichen. 378 00:17:28,690 --> 00:17:30,200 >> Was macht der Rest dieses Programm? 379 00:17:30,200 --> 00:17:31,190 Es ist gar nicht so sexy. 380 00:17:31,190 --> 00:17:34,640 Beachten Sie, dass ich 0-3 wieder durchlaufen, und ich erstellen Sie einfach eine englische 381 00:17:34,640 --> 00:17:40,500 Phrase wie so und so ist in solchen und wie ein Haus, vorbei an dot Namen 382 00:17:40,500 --> 00:17:43,320 die i-te und die Schüler Haus auch. 383 00:17:43,320 --> 00:17:47,560 >> Und dann endlich, jetzt werden wir beginnen, um anal darüber, jetzt, wo wir sind 384 00:17:47,560 --> 00:17:49,580 vertraut mit dem, was malloc-und andere Funktionen haben 385 00:17:49,580 --> 00:17:50,570 die ganze Zeit getan. 386 00:17:50,570 --> 00:17:54,220 Warum muss ich sowohl Name befreien und Haus, obwohl ich 387 00:17:54,220 --> 00:17:56,960 nicht nennen malloc? 388 00:17:56,960 --> 00:17:58,020 >> GetString tat. 389 00:17:58,020 --> 00:18:00,930 Und das war das schmutzige kleine Geheimnis für mehrere Wochen, aber GetString hat 390 00:18:00,930 --> 00:18:03,530 wurde undicht Speicher der ganzen Legen Sie alle Semester so weit. 391 00:18:03,530 --> 00:18:05,990 Und Valgrand endlich zeigen uns dies. 392 00:18:05,990 --> 00:18:10,730 >> Aber es ist keine große Sache, weil ich weiß, dass ich einfach befreien den Namen 393 00:18:10,730 --> 00:18:15,750 und das Haus, obwohl technisch auf sein super, super sicher, sollte ich 394 00:18:15,750 --> 00:18:17,890 dabei einige Fehlerprüfung hier. 395 00:18:17,890 --> 00:18:19,040 Was sind Ihre Instinkte sagen Sie? 396 00:18:19,040 --> 00:18:22,480 Was soll ich werden überprüft bevor ich zu befreien, was ist ein 397 00:18:22,480 --> 00:18:25,470 String, aka die ein char *? 398 00:18:25,470 --> 00:18:33,460 >> Ich sollte wirklich prüfen, ob Studenten Halterung i dot Name nicht 399 00:18:33,460 --> 00:18:34,840 gleich null. 400 00:18:34,840 --> 00:18:40,400 Dann wird es bald auf OK, um voran zu gehen und kostenlos daß Zeiger und gleichen oder andere 401 00:18:40,400 --> 00:18:41,160 man als gut. 402 00:18:41,160 --> 00:18:46,860 Wenn die Schüler Halterung i dot Haus ist nicht gleich null, wird dies jetzt schützen 403 00:18:46,860 --> 00:18:52,520 gegen die Ecke Fall, in dem GetString kehrt so etwas wie null. 404 00:18:52,520 --> 00:18:57,310 Und wir sahen einen Moment vor, printf wird schützen uns bis hier nur sagen, 405 00:18:57,310 --> 00:18:58,990 null ist, wird die gut aussehen seltsam. 406 00:18:58,990 --> 00:19:02,340 Aber zumindest wird es nicht segfault, wie wir gesehen haben. 407 00:19:02,340 --> 00:19:05,990 >> Nun, lassen Sie mich noch eine andere Sache hier. Strukturen-0 ist eine Art dumm Programm 408 00:19:05,990 --> 00:19:09,700 geben, weil ich all diese Daten, und dann es ist verloren, sobald das Programm beendet. 409 00:19:09,700 --> 00:19:10,940 Aber lassen Sie mich gehen Sie vor und tun dies. 410 00:19:10,940 --> 00:19:12,830 Lassen Sie mich das Terminal Fenster ein bisschen größer. 411 00:19:12,830 --> 00:19:17,000 Lassen Sie mich Strukturen-1, die ist eine neue Version davon. 412 00:19:17,000 --> 00:19:18,520 >> Ich werde in ein wenig vergrößern. 413 00:19:18,520 --> 00:19:21,620 Und jetzt lassen Sie mich laufen dot Schrägstrich Strukturen-1. 414 00:19:21,620 --> 00:19:22,590 Student-Namen - 415 00:19:22,590 --> 00:19:31,500 David Mather, lass es uns tun Rob Kirkland, lass es uns tun Lauren Leverett. 416 00:19:31,500 --> 00:19:33,650 Was interessant ist jetzt Aufträge - 417 00:19:33,650 --> 00:19:35,540 und ich weiß nur, weil dieses Ich schrieb das Programm - 418 00:19:35,540 --> 00:19:38,930 gibt es eine Datei jetzt auf meinem aktuellen Verzeichnis namens students.csv. 419 00:19:38,930 --> 00:19:40,420 Einige von euch haben vielleicht gesehen haben diese in der realen Welt. 420 00:19:40,420 --> 00:19:42,980 >> Was ist eine CSV-Datei? 421 00:19:42,980 --> 00:19:44,170 Werte durch Komma getrennt. 422 00:19:44,170 --> 00:19:46,670 Es ist wie eine Art des armen Mannes Version einer Excel-Datei. 423 00:19:46,670 --> 00:19:50,580 Es folgt eine Tabelle mit Zeilen und Spalten, Sie können in einem Programm wie Excel zu öffnen, 424 00:19:50,580 --> 00:19:51,800 oder Zahlen auf einem Mac. 425 00:19:51,800 --> 00:19:55,180 >> Und wenn ich diese Datei öffnen hier auf gedit, Bekanntmachung - und die Zahlen sind nicht da. 426 00:19:55,180 --> 00:19:57,360 Das ist nur gedit erzählen mich Zeilennummern. 427 00:19:57,360 --> 00:19:59,740 Hinweis auf der ersten Zeile des Datei ist David und Mather. 428 00:19:59,740 --> 00:20:01,450 Die nächste Zeile ist Rob Komma Kirkland. 429 00:20:01,450 --> 00:20:04,170 Und die dritte Zeile ist Lauren Komma Leverett. 430 00:20:04,170 --> 00:20:05,480 >> So was habe ich geschaffen? 431 00:20:05,480 --> 00:20:09,580 Ich habe jetzt ein C-Programm geschrieben, dass effektiv erzeugen kann Kalkulationstabellen 432 00:20:09,580 --> 00:20:11,840 das kann in eine geöffnet werden Programm wie Excel. 433 00:20:11,840 --> 00:20:15,520 Nicht alles, was zwingend ein Datensatz, aber wenn Sie haben viel größere Brocken 434 00:20:15,520 --> 00:20:18,440 Daten, die Sie wirklich wollen, manipulieren und machen Graphen und die 435 00:20:18,440 --> 00:20:21,260 möchten, ist dies vielleicht eine Möglichkeit, diese Daten zu erstellen. 436 00:20:21,260 --> 00:20:25,370 Darüber hinaus sind CSVs eigentlich Super gemeinsamen nur für die Speicherung von einfachen Daten - 437 00:20:25,370 --> 00:20:28,940 Yahoo Finance, zum Beispiel, wenn man Börsenkurse über ihre sogenannten 438 00:20:28,940 --> 00:20:33,180 API, der kostenlose Service, mit dem Sie bekommen aktuellen up-to-the-date Lager 439 00:20:33,180 --> 00:20:35,650 Angebote für Unternehmen, sie geben die Daten wieder in der 440 00:20:35,650 --> 00:20:37,800 super einfach CSV-Format. 441 00:20:37,800 --> 00:20:39,380 >> Und wie haben wir das tun? 442 00:20:39,380 --> 00:20:42,530 Nun bemerken, die meisten von diesem Programm fast die gleichen. 443 00:20:42,530 --> 00:20:46,870 Aber beachten Sie hier unten, anstatt Druck die Schüler heraus, on line 35 444 00:20:46,870 --> 00:20:51,040 weiter, behaupte ich, dass ich die Sparquote der Studenten auf der Festplatte, so das Speichern einer Datei. 445 00:20:51,040 --> 00:20:53,630 >> So stelle ich mir die Vereinbarkeit eines FILE * - 446 00:20:53,630 --> 00:20:57,260 Jetzt ist diese Art einer Anomalie in C. Aus welchem ​​Grund, ist FILE alle Kappen, 447 00:20:57,260 --> 00:21:00,690 Das ist nicht wie die meisten anderen Datentypen in C. Aber dies ist eine integrierte 448 00:21:00,690 --> 00:21:02,320 Datentyp FILE *. 449 00:21:02,320 --> 00:21:05,900 Und ich erklärte einen Zeiger auf eine Datei, So können Sie von zu denken. 450 00:21:05,900 --> 00:21:08,070 >> fopen bedeutet geöffnete Datei. 451 00:21:08,070 --> 00:21:09,470 Welche Datei müssen Sie öffnen möchten? 452 00:21:09,470 --> 00:21:12,620 Ich möchte eine Datei zu öffnen, dass ich will willkürlich nennen students.csv. 453 00:21:12,620 --> 00:21:14,480 Ich nennen könnte, dass alles, was ich will. 454 00:21:14,480 --> 00:21:15,200 >> Und dann nehmen Sie eine Vermutung. 455 00:21:15,200 --> 00:21:18,960 Was das zweite Argument zu fopen wahrscheinlich bedeuten? 456 00:21:18,960 --> 00:21:21,480 Richtig, w für Schreiben, konnte r sein für gelesen. 457 00:21:21,480 --> 00:21:24,120 Es gibt eine für append, wenn Sie Zeilen und wollen nicht hinzufügen 458 00:21:24,120 --> 00:21:25,200 überschreiben die ganze Sache. 459 00:21:25,200 --> 00:21:28,005 >> Aber ich will einfach nur diese Datei zu erstellen einmal, also werde ich verwenden Zitat unquote w. 460 00:21:28,005 --> 00:21:31,880 Und ich weiß, dass nur aus gelesen zu haben die Dokumentation oder die man-Seite. 461 00:21:31,880 --> 00:21:35,100 Wenn die Datei nicht null ist - in anderen Worten, wenn nichts schief gelaufen ist da - 462 00:21:35,100 --> 00:21:37,820 lassen Sie mich über die durchlaufen Schüler 0-3. 463 00:21:37,820 --> 00:21:40,410 >> Und nun feststellen, es ist etwas, immer so leicht unterschiedliche 464 00:21:40,410 --> 00:21:42,110 um die Linie 41 hier. 465 00:21:42,110 --> 00:21:42,960 Es ist nicht printf. 466 00:21:42,960 --> 00:21:46,530 Es ist für fprintf Datei printf. 467 00:21:46,530 --> 00:21:47,790 Also es geht um die Datei schreiben. 468 00:21:47,790 --> 00:21:48,860 Welche Datei? 469 00:21:48,860 --> 00:21:53,630 Derjenige, dessen Zeiger Sie angeben als erstes Argument. 470 00:21:53,630 --> 00:21:55,940 >> Dann geben wir einen Format-String. 471 00:21:55,940 --> 00:21:59,660 Dann werden wir festlegen, was wir wollen String Plug-in für das erste Prozent s, und 472 00:21:59,660 --> 00:22:04,320 dann eine andere Variable oder das zweite s Prozent. 473 00:22:04,320 --> 00:22:06,760 Dann schließen wir die Datei mit fclose. 474 00:22:06,760 --> 00:22:09,380 Als ich den Speicher frei wie zuvor, obwohl Ich sollte gehen wieder an und fügen 475 00:22:09,380 --> 00:22:10,540 einige Prüfungen für null. 476 00:22:10,540 --> 00:22:12,090 >> Und das ist es. 477 00:22:12,090 --> 00:22:16,960 fopen, fprintf, gibt mir das fclose Fähigkeit, Text-Dateien zu erstellen. 478 00:22:16,960 --> 00:22:19,640 Nun, werden Sie in Problem-Set fünf sehen Bilder, die beinhaltet, werden Sie mit 479 00:22:19,640 --> 00:22:20,990 Binär-Dateien statt. 480 00:22:20,990 --> 00:22:24,200 Aber im Grunde ist die Idee, die gleiche, obwohl die Funktionen, die Sie werde 481 00:22:24,200 --> 00:22:28,710 sehen, sind ein bisschen anders. 482 00:22:28,710 --> 00:22:32,580 >> So rasante Tour, aber Sie erhalten nur allzu vertraut mit Datei I/O-- 483 00:22:32,580 --> 00:22:34,960 Eingang und Ausgang - mit pset fünf. 484 00:22:34,960 --> 00:22:38,607 Und Fragen zu den ersten Grundlagen hier? 485 00:22:38,607 --> 00:22:39,857 Ja? 486 00:22:39,857 --> 00:22:41,880 487 00:22:41,880 --> 00:22:43,710 >> Was, wenn Sie einen Nullwert kostenlos ausprobieren? 488 00:22:43,710 --> 00:22:48,880 Ich glaube, es sei denn, ein frei bekommen hat wenig mehr benutzerfreundlich, können Sie 489 00:22:48,880 --> 00:22:49,890 potenziell segfault. 490 00:22:49,890 --> 00:22:54,160 Vorbei ist es null ist schlecht, weil ich nicht glauben frei stört, für Sie zu überprüfen, 491 00:22:54,160 --> 00:22:57,330 denn es wäre möglicherweise eine Verschwendung Zeit für ihn, sich für tun 492 00:22:57,330 --> 00:22:59,022 jeder in der Welt. 493 00:22:59,022 --> 00:23:00,590 Gute Frage, though. 494 00:23:00,590 --> 00:23:04,300 >> Alles klar, so bekommt diese Art von uns zu einem interessanten Thema. 495 00:23:04,300 --> 00:23:07,010 Das Thema Problem Set fünf ist Forensik. 496 00:23:07,010 --> 00:23:08,420 Mindestens das ist ein Teil des Problems Satz. 497 00:23:08,420 --> 00:23:12,030 Forensics Regel bezieht sich auf die Verwertung von Informationen, die kann oder 498 00:23:12,030 --> 00:23:14,110 kann nicht gelöscht wurden bewusst. 499 00:23:14,110 --> 00:23:18,680 Und so dachte ich, ich geben Ihnen einen schnellen Vorgeschmack darauf, was wirklich vor sich geht alle 500 00:23:18,680 --> 00:23:21,230 diesmal unter der Motorhaube Ihres Computers. 501 00:23:21,230 --> 00:23:23,960 >> Zum Beispiel, wenn Sie in Ihrer Laptop oder Ihren Desktop-Computer ein 502 00:23:23,960 --> 00:23:28,040 Festplatte, ist es entweder ein mechanisches Gerät, das tatsächlich dreht - 503 00:23:28,040 --> 00:23:31,650 es gibt Dinge genannt kreisförmigen Platten Dieser Blick ganz gerne, was ich 504 00:23:31,650 --> 00:23:34,540 hatte gerade auf dem Bildschirm hier, obwohl Dies ist zunehmend der alten Schule. 505 00:23:34,540 --> 00:23:37,370 Dies ist ein Drei-and-a-half-inch Festplatte. 506 00:23:37,370 --> 00:23:40,070 Und dreieinhalb Zoll bezieht sich der mit der Sache, wenn Sie es installieren 507 00:23:40,070 --> 00:23:40,890 in einem Computer. 508 00:23:40,890 --> 00:23:44,890 >> Viele von euch in Ihrer Laptops jetzt haben Solid-State-Laufwerke oder SSDs 509 00:23:44,890 --> 00:23:46,260 die haben keine beweglichen Teile. 510 00:23:46,260 --> 00:23:49,170 Sie sind eher wie RAM und weniger wie Diese mechanischen Vorrichtungen. 511 00:23:49,170 --> 00:23:51,450 Aber die Ideen sind immer noch die gleichen, sicherlich als sie sich beziehen, 512 00:23:51,450 --> 00:23:52,790 zum Problem stellte fünf. 513 00:23:52,790 --> 00:23:57,400 >> Und wenn Sie darüber nachdenken, jetzt eine Festplatte wesen stellt einen Kreis, der 514 00:23:57,400 --> 00:23:58,930 Ich werde wie diese hier zu ziehen. 515 00:23:58,930 --> 00:24:02,290 Wenn Sie eine Datei auf Ihrem Computer, ob es sich um eine SSD, oder in 516 00:24:02,290 --> 00:24:06,610 In diesem Fall eine ältere Schule Festplatte, diese Datei enthält mehrere Bits. 517 00:24:06,610 --> 00:24:10,510 Lassen Sie uns sagen, dass es diese 0 und 1 ist, eine ganze Reihe von 0 und 1. 518 00:24:10,510 --> 00:24:11,660 Also das ist meine ganze Festplatte. 519 00:24:11,660 --> 00:24:13,225 Dies ist offenbar eine ziemlich große Datei. 520 00:24:13,225 --> 00:24:18,080 Und es ist mit den 0 und 1 an, dass Teil der physischen Platte. 521 00:24:18,080 --> 00:24:19,750 >> Nun, was ist, dass körperliche Teil? 522 00:24:19,750 --> 00:24:25,310 Nun stellt sich heraus, dass auf einer Festplatte, mindestens dieser Art gibt es 523 00:24:25,310 --> 00:24:27,340 diese winzige magnetische Partikel. 524 00:24:27,340 --> 00:24:32,630 Und sie haben im Wesentlichen nördlich und Südpol zu ihnen, so dass, wenn Sie 525 00:24:32,630 --> 00:24:35,710 wiederum eine jener magnetischen Teilchen auf diese Weise könnte man sagen, dass es 526 00:24:35,710 --> 00:24:36,720 1, die eine. 527 00:24:36,720 --> 00:24:39,340 Und wenn es den Kopf nach Süden bis Norden, könnte man sagen, dass es ist 528 00:24:39,340 --> 00:24:40,390 repräsentiert eine 0 ein. 529 00:24:40,390 --> 00:24:43,660 >> So in der realen physischen Welt, das ist wie man etwas in repräsentieren 530 00:24:43,660 --> 00:24:45,670 binären Zustand der 0 und a 1. 531 00:24:45,670 --> 00:24:46,720 Also das ist alles eine Datei ist. 532 00:24:46,720 --> 00:24:49,300 Es gibt eine ganze Reihe von magnetischen Partikel, die ihre so oder sind 533 00:24:49,300 --> 00:24:51,920 Auf diese Weise Schaffung von Mustern von 0 und 1. 534 00:24:51,920 --> 00:24:56,760 >> Aber es stellt sich heraus, wenn Sie eine Datei speichern, einige Informationen wird separat gespeichert. 535 00:24:56,760 --> 00:25:00,000 Also das ist ein kleiner Tisch, ein Verzeichnis, so zu sprechen. 536 00:25:00,000 --> 00:25:05,810 Und ich rufe diese Spalte Name, und Ich rufe diese Spalte Lage. 537 00:25:05,810 --> 00:25:08,850 >> Und ich werde sagen, nehme dies ist mein Lebenslauf. 538 00:25:08,850 --> 00:25:14,050 Meine resume.doc an gespeicherten Lage, sagen wir 123. 539 00:25:14,050 --> 00:25:15,390 Ich habe immer für diese Zahl zu gehen. 540 00:25:15,390 --> 00:25:18,810 Aber es genügt zu sagen, dass genau wie im RAM, können Sie eine Festplatte 541 00:25:18,810 --> 00:25:22,350 Das ist ein Gigabyte oder 200 Gigabyte oder ein Terabyte, und Sie können 542 00:25:22,350 --> 00:25:23,750 Anzahl alle Bytes. 543 00:25:23,750 --> 00:25:26,480 Sie können Nummer alle Stücke von 8 Bit. 544 00:25:26,480 --> 00:25:29,030 >> Also werden wir sagen, dass diese ist die Lage 123. 545 00:25:29,030 --> 00:25:32,070 Also das Verzeichnis innerhalb von meinem Betriebssystem System merkt, dass mein 546 00:25:32,070 --> 00:25:34,250 Lebenslauf ist an der Stelle 123. 547 00:25:34,250 --> 00:25:36,850 Aber es wird interessant, wenn Sie eine Datei löschen. 548 00:25:36,850 --> 00:25:37,820 >> So zum Beispiel - 549 00:25:37,820 --> 00:25:40,790 und Gott sei Dank, hat die meisten der Welt gefangen auf diese - was passiert, wenn 550 00:25:40,790 --> 00:25:45,040 Sie ziehen eine Datei auf Ihren Mac OS Trash oder Ihr Windows-Papierkorb? 551 00:25:45,040 --> 00:25:48,290 552 00:25:48,290 --> 00:25:50,510 Was ist der Zweck, das zu tun? 553 00:25:50,510 --> 00:25:53,860 Es ist offensichtlich, um loszuwerden, der Datei, aber was bedeutet der Akt der Drag-and- 554 00:25:53,860 --> 00:25:57,550 Drop in den Papierkorb oder Ihr Papierkorbs auf einem Computer zu tun? 555 00:25:57,550 --> 00:25:59,230 >> Absolut nichts, wirklich. 556 00:25:59,230 --> 00:26:00,320 Es ist wie ein Ordner. 557 00:26:00,320 --> 00:26:01,800 Es ist ein spezieller Ordner, um sicher zu sein. 558 00:26:01,800 --> 00:26:04,460 Aber ist es tatsächlich die Datei löschen? 559 00:26:04,460 --> 00:26:06,780 >> Nun, nein, weil einige von Ihnen wahrscheinlich wie gewesen, oh verdammt, hast du nicht 560 00:26:06,780 --> 00:26:07,420 bedeutet, das zu tun. 561 00:26:07,420 --> 00:26:09,130 So können Sie einen Doppelklick auf das Trash oder Papierkorb. 562 00:26:09,130 --> 00:26:11,630 Sie haben rund um stocherte und Sie haben gewonnen die Datei einfach per Drag es 563 00:26:11,630 --> 00:26:12,110 raus. 564 00:26:12,110 --> 00:26:14,420 So klar, es ist nicht unbedingt löschen. 565 00:26:14,420 --> 00:26:15,990 >> OK, du bist schlauer. 566 00:26:15,990 --> 00:26:18,860 Sie wissen, dass gerade bewegen indem sie sie in die Trash oder Papierkorb bedeutet nicht, 567 00:26:18,860 --> 00:26:19,930 Sie Leeren des Papierkorbs. 568 00:26:19,930 --> 00:26:24,110 So können Sie bis zum Menü, und Sie sagen, Empty Trash oder Papierkorb leeren. 569 00:26:24,110 --> 00:26:25,360 Und was passiert dann? 570 00:26:25,360 --> 00:26:29,070 571 00:26:29,070 --> 00:26:32,530 >> Ja, so ist es um so mehr gelöscht. 572 00:26:32,530 --> 00:26:37,660 Aber alles, was geschieht, ist dies. 573 00:26:37,660 --> 00:26:45,350 Der Computer vergisst, wo resume.doc war. 574 00:26:45,350 --> 00:26:47,400 >> Aber was sich nicht geändert hat offenbar auf dem Bild? 575 00:26:47,400 --> 00:26:51,390 576 00:26:51,390 --> 00:26:55,570 Die Bits sind die 0 und 1, dass ich behaupten vor Ort von einigen physischen Aspekt des 577 00:26:55,570 --> 00:26:56,280 die Hardware. 578 00:26:56,280 --> 00:26:57,110 Sie sind immer noch da. 579 00:26:57,110 --> 00:26:58,930 Es ist nur der Computer vergessen, was sie sind. 580 00:26:58,930 --> 00:27:03,160 >> So ist es im wesentlichen befreit die Datei Bits, so dass sie wiederverwendet werden können. 581 00:27:03,160 --> 00:27:06,940 Aber erst, wenn man mehrere Dateien zu erstellen, und mehr Dateien und mehr Dateien werden 582 00:27:06,940 --> 00:27:12,150 probabilistisch, die 0 und 1, diese magnetischen Teilchen, wiederverwendet zu werden, 583 00:27:12,150 --> 00:27:16,220 Kopf oder rechten Seite nach oben, für andere Dateien, 0s und 1s. 584 00:27:16,220 --> 00:27:17,980 >> So haben Sie dieses Zeitfenster. 585 00:27:17,980 --> 00:27:19,860 Und es ist nicht vorhersehbarer Länge, wirklich. 586 00:27:19,860 --> 00:27:22,240 Es hängt von der Größe Ihrer Festplatte Antrieb und wie viele Dateien Sie haben und 587 00:27:22,240 --> 00:27:23,490 wie schnell Sie neue Kontakte zu knüpfen. 588 00:27:23,490 --> 00:27:27,050 Aber es ist das Zeitfenster, in welche die Datei ist immer noch perfekt 589 00:27:27,050 --> 00:27:27,770 erstattungsfähig. 590 00:27:27,770 --> 00:27:31,050 >> Also, wenn Sie jemals verwenden Programme wie McAfee Norton oder zu versuchen sich zu erholen 591 00:27:31,050 --> 00:27:35,680 Daten, wird alles, was sie tun versuchen, erholen dieses sogenannten Verzeichnis 592 00:27:35,680 --> 00:27:37,340 herauszufinden, wo Sie Ihre Datei war. 593 00:27:37,340 --> 00:27:40,605 Und manchmal Norton und wird sagen: Datei beträgt 93% erstattungsfähig. 594 00:27:40,605 --> 00:27:42,020 Nun, was bedeutet das? 595 00:27:42,020 --> 00:27:45,690 Das bedeutet nur, dass eine andere Datei zufällig unter Verwendung endete, sagen wir, 596 00:27:45,690 --> 00:27:48,920 diese Bits aus Ihrer ursprünglichen Datei. 597 00:27:48,920 --> 00:27:51,950 >> Also, was ist eigentlich beteiligt in die Wiederherstellung von Daten? 598 00:27:51,950 --> 00:27:55,720 Nun, wenn Sie nicht so etwas wie Norton auf Ihrem Computer vorinstalliert, 599 00:27:55,720 --> 00:27:59,510 das Beste was Sie tun können, ist manchmal aussehen auf die gesamte Festplatte auf der Suche nach 600 00:27:59,510 --> 00:28:00,510 Muster von Bits. 601 00:28:00,510 --> 00:28:05,350 Und eines der Themen von Problem-Set fünf ist, dass Sie die Suche 602 00:28:05,350 --> 00:28:09,570 Äquivalent einer Festplatte, einem forensischen Bild von einer Compact-Flash-Karte von einem 603 00:28:09,570 --> 00:28:13,660 Digitalkamera, die Suche nach dem 0s 1s und dass in der Regel mit hohen 604 00:28:13,660 --> 00:28:16,720 Wahrscheinlichkeit, stellen die Starten eines JPEG-Bildes. 605 00:28:16,720 --> 00:28:21,120 >> Und euch kann diese Bilder durch erholen vorausgesetzt, wenn ich dieses Muster der zu sehen 606 00:28:21,120 --> 00:28:24,380 Bits auf der forensischen mit hohe Wahrscheinlichkeit, die markiert 607 00:28:24,380 --> 00:28:25,650 der Beginn einer JPEG. 608 00:28:25,650 --> 00:28:29,520 Und wenn ich sehe, das gleiche Muster wieder, das wahrscheinlich markiert den Beginn der 609 00:28:29,520 --> 00:28:32,440 JPEG andere und ein anderes JPEG, JPEG und andere. 610 00:28:32,440 --> 00:28:34,970 Und dies ist in der Regel, wie Datenrettung funktioniert. 611 00:28:34,970 --> 00:28:37,870 Was ist schön zu JPEGs ist, obwohl das Dateiformat selbst ist etwas 612 00:28:37,870 --> 00:28:44,400 Komplex, der zu Beginn eines jeden solchen Datei ist eigentlich ziemlich identifizierbaren 613 00:28:44,400 --> 00:28:47,370 und einfach, wie Sie sehen werden, wenn Sie nicht bereits haben. 614 00:28:47,370 --> 00:28:50,270 >> Werfen wir also einen genaueren Blick unter die Haube, um genau das, was gewesen ist 615 00:28:50,270 --> 00:28:53,360 los ist, und was diese 0 und 1 sind, um Ihnen ein bisschen mehr von einem 616 00:28:53,360 --> 00:28:55,330 Rahmen für dieses besondere Herausforderung. 617 00:28:55,330 --> 00:28:55,510 >> [VIDEO PLAYBACK] 618 00:28:55,510 --> 00:28:58,700 >> -Wo ist Ihr PC speichert die meisten seiner permanenten Daten. 619 00:28:58,700 --> 00:29:03,390 Um dies zu erreichen, bewegt sich die Daten aus dem RAM zusammen mit Software-Signale, die sagen, 620 00:29:03,390 --> 00:29:06,110 die Festplatte, wie diese Daten zu speichern. 621 00:29:06,110 --> 00:29:09,410 Die Festplatte Schaltungen übersetzen diese Signale in Spannungssignale 622 00:29:09,410 --> 00:29:10,870 Schwankungen. 623 00:29:10,870 --> 00:29:14,970 Diese wiederum kontrollieren die Festplatte bewegliche Teile, einige der wenigen 624 00:29:14,970 --> 00:29:17,910 beweglichen Teile in der linken modernen Computer. 625 00:29:17,910 --> 00:29:22,130 >> Einige der Steuersignale einen Motor die spinnt Metall beschichteten Platten. 626 00:29:22,130 --> 00:29:25,470 Ihre Daten tatsächlich gespeichert auf diesen Platten. 627 00:29:25,470 --> 00:29:28,610 Andere Signale bewegen die Lese / Schreib- Köpfen zu lesen oder 628 00:29:28,610 --> 00:29:30,710 Schreiben von Daten auf den Platten. 629 00:29:30,710 --> 00:29:35,450 Diese Maschinen so präzise, ​​dass ein Mensch Haar konnte nicht einmal zwischen den Pass 630 00:29:35,450 --> 00:29:37,280 Köpfe und Spinnen Platten. 631 00:29:37,280 --> 00:29:40,316 Doch es funktioniert alles mit ungeheurer Geschwindigkeit. 632 00:29:40,316 --> 00:29:40,660 >> [END VIDEO PLAYBACK] 633 00:29:40,660 --> 00:29:42,190 >> DAVID MALAN: Zoom in einem kleinen tiefer jetzt an, was 634 00:29:42,190 --> 00:29:44,360 tatsächlich auf diesen Platten. 635 00:29:44,360 --> 00:29:44,720 >> [VIDEO PLAYBACK] 636 00:29:44,720 --> 00:29:47,660 >> -Lassen Sie uns, was wir gerade sah in Zeitlupe. 637 00:29:47,660 --> 00:29:51,710 Wenn eine kurze Stromimpuls ist an den Schreib / Lese-Kopf, wenn Flips 638 00:29:51,710 --> 00:29:54,650 auf einem winzigen elektromagnetischen für ein Bruchteil einer Sekunde. 639 00:29:54,650 --> 00:29:58,970 Der Magnet erzeugt ein Feld, das ändert sich die Polarität eines winzig kleinen 640 00:29:58,970 --> 00:30:02,850 Teil der Metall-Teilchen, Mantel jeden Plattenteller Oberfläche. 641 00:30:02,850 --> 00:30:05,940 >> Ein Muster dieser Serie winzige, aufgeladenen Bereichen auf dem Speicherplatten 642 00:30:05,940 --> 00:30:08,470 ein einzelnes Bit Daten in der Binärzahl 643 00:30:08,470 --> 00:30:10,530 System von Computern verwendet. 644 00:30:10,530 --> 00:30:13,775 Nun, wenn der Strom einen Weg geschickt durch den Lese / Schreib-Kopf, den Bereich 645 00:30:13,775 --> 00:30:15,970 ist in einer Richtung polarisiert. 646 00:30:15,970 --> 00:30:17,950 Wenn der Strom in die gesendete entgegengesetzte Richtung, die 647 00:30:17,950 --> 00:30:19,930 Polarisation umgekehrt wird. 648 00:30:19,930 --> 00:30:22,370 >> Wie Sie Daten von der Festplatte zu bekommen? 649 00:30:22,370 --> 00:30:24,090 Nur den Prozess umzukehren. 650 00:30:24,090 --> 00:30:26,550 So ist es die Partikel auf der Platte das bekommen den Strom in der 651 00:30:26,550 --> 00:30:27,960 Lese / Schreib-Kopf zu bewegen. 652 00:30:27,960 --> 00:30:30,700 Stellen Sie sich diese Millionen von magnetisierten Segmenten und 653 00:30:30,700 --> 00:30:32,160 Sie haben eine Datei. 654 00:30:32,160 --> 00:30:36,060 >> Nun kann die Stücke aus einer einzigen Datei alle über einen Laufwerks gestreut werden 655 00:30:36,060 --> 00:30:39,970 Platten, ein bisschen wie das Chaos Papiere auf Ihrem Schreibtisch. 656 00:30:39,970 --> 00:30:43,500 So ein besonderes Extra Datei verfolgt von wo alles ist. 657 00:30:43,500 --> 00:30:45,985 Weißt du nicht wünschte, Sie hätten so etwas? 658 00:30:45,985 --> 00:30:46,470 >> [END VIDEO PLAYBACK] 659 00:30:46,470 --> 00:30:47,820 >> DAVID MALAN: OK, wahrscheinlich nicht. 660 00:30:47,820 --> 00:30:52,070 So wie viele von euch wuchs mit diesen? 661 00:30:52,070 --> 00:30:53,970 OK, es ist also immer weniger Hände jedes Jahr. 662 00:30:53,970 --> 00:30:56,550 Aber ich bin froh, dass du wenigstens vertraut mit ihnen, weil diese und unsere eigenen 663 00:30:56,550 --> 00:31:00,520 Buch Demo leider sterben einen sehr langsamen Tod hier der Vertrautheit. 664 00:31:00,520 --> 00:31:04,010 >> Aber das ist, was ich zumindest wieder in High School, verwendet Verwendung für Backups. 665 00:31:04,010 --> 00:31:08,110 Und es war erstaunlich, weil man konnte 1,4 Megabyte auf speichern 666 00:31:08,110 --> 00:31:08,930 Diese Festplatte. 667 00:31:08,930 --> 00:31:12,260 Und dies war die hohe Dichte Version wie durch die HD, die hat angegeben 668 00:31:12,260 --> 00:31:14,240 dh vor der heutigen HD-Videos. 669 00:31:14,240 --> 00:31:16,400 >> Standard-Dichte betrug 800 Kilobyte. 670 00:31:16,400 --> 00:31:18,640 Und davor gab es 400-Kilobyte-Festplatten. 671 00:31:18,640 --> 00:31:23,120 Und davor gab es 5 und 1/4 Zoll-Disketten, die wirklich Floppy waren, 672 00:31:23,120 --> 00:31:25,680 , und ein wenig breiter und höher als diese Dinge hier. 673 00:31:25,680 --> 00:31:29,150 Aber kann man tatsächlich sehen die sogenannte Floppy Aspekt dieser Scheiben. 674 00:31:29,150 --> 00:31:32,630 >> Und funktionell, sind sie tatsächlich ziemlich ähnlich wie bei Festplatten 675 00:31:32,630 --> 00:31:33,570 mindestens dieses Typs. 676 00:31:33,570 --> 00:31:37,270 Wieder SSDs in neueren Computern Arbeit ein wenig anders. 677 00:31:37,270 --> 00:31:41,530 Aber wenn Sie sich bewegen, dass kleine Metall-Registerkarte kann man tatsächlich sehen ein wenig Cookie 678 00:31:41,530 --> 00:31:42,560 oder Platte. 679 00:31:42,560 --> 00:31:43,830 >> Es ist nicht aus Metall wie dieser. 680 00:31:43,830 --> 00:31:46,000 Dieser ist eigentlich etwas billiger Kunststoff. 681 00:31:46,000 --> 00:31:46,750 Und Sie können es Art wackeln. 682 00:31:46,750 --> 00:31:50,310 Und du hast trully gerade weg wischte einige Anzahl von Bits oder magnetischen Teilchen 683 00:31:50,310 --> 00:31:51,220 von dieser Festplatte. 684 00:31:51,220 --> 00:31:52,710 >> Also zum Glück, es gibt nichts auf sie. 685 00:31:52,710 --> 00:31:55,790 Wenn das Ding ist in der Art und Weise - und decken Ihre Augen und die Ihrer Nachbarn - 686 00:31:55,790 --> 00:31:58,865 Sie können nur eine Art ziehen diese ganzen Mantel aus so. 687 00:31:58,865 --> 00:32:01,900 Aber es gibt eine kleine Quelle, so sein bewusst, dass mit den Augen. 688 00:32:01,900 --> 00:32:03,620 So, jetzt haben Sie wirklich eine Diskette. 689 00:32:03,620 --> 00:32:07,090 >> Und was ist bemerkenswert, über diese ist, dass, soweit es sich um eine 690 00:32:07,090 --> 00:32:10,830 kleine Darstellung eines größeren Festplatten, diese Dinge sind super, 691 00:32:10,830 --> 00:32:11,590 super einfach. 692 00:32:11,590 --> 00:32:15,170 Wenn Sie kneifen die Unterseite von ihr, jetzt, dass Metall Sache ab und schälen 693 00:32:15,170 --> 00:32:20,990 sie zu öffnen, ist alles dort ist zwei Stücke Filz und dem sogenannten Diskette 694 00:32:20,990 --> 00:32:22,930 mit einem Stück aus Metall an der Innenseite. 695 00:32:22,930 --> 00:32:25,990 >> Und da geht die Hälfte der meine Festplatte den Inhalt. 696 00:32:25,990 --> 00:32:27,540 Es geht noch eine halbe von ihnen. 697 00:32:27,540 --> 00:32:31,375 Aber das ist alles, was im Inneren Spinnerei wurde von Ihrem Computer in vergangener Zeiten. 698 00:32:31,375 --> 00:32:35,220 699 00:32:35,220 --> 00:32:38,310 >> Und wieder, dieses in Perspektive zu setzen, Wie groß ist die meisten Ihrer 700 00:32:38,310 --> 00:32:39,560 Festplatten in diesen Tagen? 701 00:32:39,560 --> 00:32:41,960 702 00:32:41,960 --> 00:32:46,230 500 Gigabyte, ein Terabyte, vielleicht in ein Desktop-Computer, 2 Terabyte, 3 703 00:32:46,230 --> 00:32:47,630 Terabyte, 4 Terabyte, nicht wahr? 704 00:32:47,630 --> 00:32:52,480 Dies ist ein Megabyte, geben oder nehmen, das kann nicht einmal fit ein typisches MP3 705 00:32:52,480 --> 00:32:55,310 mehr in diesen Tagen, oder einige ähnliche Musikdatei. 706 00:32:55,310 --> 00:32:59,500 >> So ein kleines Souvenir für Sie heute, und auch zu helfen, zu kontextualisieren, was 707 00:32:59,500 --> 00:33:03,570 wir für selbstverständlich nehmen jetzt in Problem stellte fünf. 708 00:33:03,570 --> 00:33:04,820 Das sind also Ihnen zu halten. 709 00:33:04,820 --> 00:33:07,340 710 00:33:07,340 --> 00:33:13,370 Lassen Sie mich also Übergang, wo sein verbringen die nächsten pset als gut. 711 00:33:13,370 --> 00:33:18,470 So haben wir jetzt diese Seite gesetzt für - oh, ein paar Ansagen schnell. 712 00:33:18,470 --> 00:33:21,730 >> An diesem Freitag, wenn Sie möchten, kommen CS50 zum Mittagessen, zu den üblichen Ort zu gehen, 713 00:33:21,730 --> 00:33:23,610 cs50.net/rsvp. 714 00:33:23,610 --> 00:33:25,100 Und letztes Projekt - 715 00:33:25,100 --> 00:33:28,520 so pro Lehrplan, haben wir geschrieben das Abschlussprojekt Spezifikation bereits. 716 00:33:28,520 --> 00:33:31,410 Erkenne, dass das bedeutet nicht, es ist wegen besonders schnell. 717 00:33:31,410 --> 00:33:33,990 Es ist geschrieben, wirklich, nur um euch daran zu denken. 718 00:33:33,990 --> 00:33:37,620 Und in der Tat, ein super signifikante Prozentsatz werden Sie Bewältigung 719 00:33:37,620 --> 00:33:40,780 Abschlussarbeiten auf Material, das wir noch nicht einmal in der Klasse bekommen, 720 00:33:40,780 --> 00:33:42,730 wird aber so früh wie nächste Woche. 721 00:33:42,730 --> 00:33:45,530 >> Beachten Sie jedoch, dass die Spezifikation fordert einige unterschiedliche Komponenten der 722 00:33:45,530 --> 00:33:46,190 Abschlussprojekt. 723 00:33:46,190 --> 00:33:49,590 Die erste, in wenigen Wochen ein Erstvorschlag, ein ziemlich lässig E-Mail an 724 00:33:49,590 --> 00:33:52,760 Ihre TF, ihm zu sagen, oder was du bist darüber nachzudenken, für Ihr Projekt, mit 725 00:33:52,760 --> 00:33:53,650 keine Verpflichtung. 726 00:33:53,650 --> 00:33:56,710 Der Vorschlag macht Ihre besondere sein Engagement und sagte, hier ist das, was 727 00:33:56,710 --> 00:33:57,770 Ich möchte für mein Projekt zu tun. 728 00:33:57,770 --> 00:33:58,250 Was denken Sie? 729 00:33:58,250 --> 00:33:58,650 Zu groß? 730 00:33:58,650 --> 00:33:59,145 Zu klein? 731 00:33:59,145 --> 00:34:00,330 Ist es überschaubar? 732 00:34:00,330 --> 00:34:02,230 Und sehen Sie die Spezifikation für weitere Details. 733 00:34:02,230 --> 00:34:05,060 >> Paar Wochen danach ist der Status Bericht, der ein ähnlich ist 734 00:34:05,060 --> 00:34:08,260 Casual-Mail an Ihre TF zu sagen, wie weit hinter Sie in Ihrem letzten 735 00:34:08,260 --> 00:34:12,360 Projektdurchführung, gefolgt von die CS50 Hackathon zu dem jeder 736 00:34:12,360 --> 00:34:17,520 ist eingeladen wird, die ein Ereignis aus 20.00 an einem Abend bis 07.00 Uhr 737 00:34:17,520 --> 00:34:19,150 Uhr am nächsten Morgen. 738 00:34:19,150 --> 00:34:22,560 Pizza, wie ich kann in Woche erwähnt haben Null, wil um 9:00 Uhr serviert werden, 739 00:34:22,560 --> 00:34:24,120 Chinesisches Essen um 1:00 Uhr. 740 00:34:24,120 --> 00:34:27,929 Und wenn Sie noch um 5:00 Uhr wach, nehmen wir Sie zum Frühstück IHOP. 741 00:34:27,929 --> 00:34:31,310 >> Also die Hackathon ist eine der mehr Erlebnisse in der Klasse. 742 00:34:31,310 --> 00:34:35,290 Dann wird die Umsetzung fällig ist, und dann die klimatischen CS50 Fair. 743 00:34:35,290 --> 00:34:38,070 Mehr Details über all diese in den kommenden Wochen. 744 00:34:38,070 --> 00:34:40,739 >> Aber gehen wir zurück zu etwas old school - 745 00:34:40,739 --> 00:34:41,920 wieder ein Array. 746 00:34:41,920 --> 00:34:45,040 So ein Array war schön, denn es löst Probleme wie wir sahen nur eine 747 00:34:45,040 --> 00:34:49,290 vorhin mit studentischen Strukturen immer ein wenig außer Kontrolle, wenn wir 748 00:34:49,290 --> 00:34:52,405 Studenten wollen eine, Student zwei, Schüler drei, student dot dot dot, 749 00:34:52,405 --> 00:34:54,400 einige beliebige Anzahl von Studenten. 750 00:34:54,400 --> 00:34:58,850 >> So Arrays, vor ein paar Wochen, stürzte in und lösen alle unsere Probleme nicht 751 00:34:58,850 --> 00:35:03,340 im Voraus zu wissen, wie viele Dinge irgendeiner Art könnten wir wollen. 752 00:35:03,340 --> 00:35:07,390 Und wir haben gesehen, dass Strukturen können Sie uns helfen weiter zu organisieren unseren Code und halten 753 00:35:07,390 --> 00:35:11,660 konzeptionell ähnliche Variablen, wie ein Namen und ein Haus, zusammen, so dass wir 754 00:35:11,660 --> 00:35:15,570 können sie als eine Einheit, innen behandeln von denen es kleinere Stücke. 755 00:35:15,570 --> 00:35:17,810 >> Aber Arrays haben einige Nachteile. 756 00:35:17,810 --> 00:35:19,780 Was sind einige der Nachteile haben wir angetroffen 757 00:35:19,780 --> 00:35:22,320 mit Arrays so weit? 758 00:35:22,320 --> 00:35:23,450 Was ist das? 759 00:35:23,450 --> 00:35:28,130 Feste Größe - so, obwohl Sie vielleicht in der Lage sein, um Speicher für eine Zuweisung 760 00:35:28,130 --> 00:35:32,310 Array, wenn Sie wissen, wie viele Schüler Sie haben, wie viele Zeichen Sie haben 761 00:35:32,310 --> 00:35:35,460 vom Benutzer, wenn man einmal zugeordnet das Array, haben Sie Art gemalt 762 00:35:35,460 --> 00:35:36,740 sich in eine Ecke. 763 00:35:36,740 --> 00:35:40,600 >> Da kann man keinen neuen Elemente in der Mitte eines Arrays. 764 00:35:40,600 --> 00:35:43,660 Sie können keine Elemente mehr am Ende eines Arrays. 765 00:35:43,660 --> 00:35:47,750 Wirklich, müssen Sie in der Schaffung einer zurückgreifen ganz neue Reihe, wie wir besprochen haben, 766 00:35:47,750 --> 00:35:49,320 Kopieren der alten in die neue. 767 00:35:49,320 --> 00:35:52,610 Und wieder, das ist das, dass Kopfschmerzen GetString beschäftigt sich mit für Sie. 768 00:35:52,610 --> 00:35:56,170 >> Aber noch einmal, kann man noch nicht einfügen etwas in der Mitte des Arrays 769 00:35:56,170 --> 00:35:58,200 wenn die Rate nicht vollständig gefüllt. 770 00:35:58,200 --> 00:36:03,010 Zum Beispiel, wenn diese Anordnung hier Größe sechs nur fünf Dinge in ihm, 771 00:36:03,010 --> 00:36:06,080 Nun, man könnte nur tack etwas auf das Ende. 772 00:36:06,080 --> 00:36:08,200 Aber was, wenn Sie etwas einfügen in der Mitte des 773 00:36:08,200 --> 00:36:11,280 Array, obwohl es wahrscheinlich fünf von sechs Dinge in ihm? 774 00:36:11,280 --> 00:36:14,250 >> Nun, was wir tun, wenn wir alle hatten unserer menschlichen Freiwilligen auf der Bühne in 775 00:36:14,250 --> 00:36:15,110 Wochen Vergangenheit? 776 00:36:15,110 --> 00:36:18,710 Wenn wir jemanden hier setzen wollte, entweder diese Menschen, wie dies zu bewegen 777 00:36:18,710 --> 00:36:22,540 Weg, oder diese Menschen, wie dies zu bewegen Weise, und das wurde teuer. 778 00:36:22,540 --> 00:36:26,950 Die Verschiebung von Menschen innerhalb eines Array landete Addition und Kalkulation 779 00:36:26,950 --> 00:36:31,240 uns Zeit, damit viele unserer n squared Laufzeiten wie Insertion Sort, für 780 00:36:31,240 --> 00:36:32,550 Beispiel im schlimmsten Fall. 781 00:36:32,550 --> 00:36:36,520 So Arrays sind groß, aber man muss im Voraus wissen, wie groß Sie wollen. 782 00:36:36,520 --> 00:36:38,030 >> So OK, hier ist eine Lösung. 783 00:36:38,030 --> 00:36:43,860 Wenn ich nicht im Voraus wissen, wie viele Studenten, die ich haben könnte, und ich weiß, einmal 784 00:36:43,860 --> 00:36:47,870 Ich entscheide mich, obwohl, ich bin mit dem stecken viele Schüler, warum ich nicht einfach immer 785 00:36:47,870 --> 00:36:51,740 zuteilen doppelt so viel Platz wie ich denke, vielleicht brauche ich? 786 00:36:51,740 --> 00:36:54,450 Ist das nicht eine vernünftige Lösung? 787 00:36:54,450 --> 00:36:58,240 >> Realistisch gesehen, glaube ich nicht, dass wir gehen, um mehr als 50 Slots benötigen 788 00:36:58,240 --> 00:37:02,190 in einem Array für eine mittlere Klasse, also lasst uns einfach aufrunden. 789 00:37:02,190 --> 00:37:07,040 Ich werde 100 Slots in meinem Array zu machen, so so dass wir auf jeden Fall erhalten die 790 00:37:07,040 --> 00:37:10,330 Zahl der Studenten, die ich erwarten, in einigen mittel-Größenklasse. 791 00:37:10,330 --> 00:37:14,320 Also warum nicht einfach aufrunden und zuweisen mehr Speicher, typischerweise für eine Reihe 792 00:37:14,320 --> 00:37:16,290 als Sie denken Sie vielleicht sogar müssen? 793 00:37:16,290 --> 00:37:20,190 Was ist das einfache pushback zu dieser Idee? 794 00:37:20,190 --> 00:37:21,440 >> Du bist nur verschwenden Speicher. 795 00:37:21,440 --> 00:37:25,350 Buchstäblich jedes Programm schreiben Sie dann ist vielleicht mit doppelt so viel Speicher wie 796 00:37:25,350 --> 00:37:26,680 Sie tatsächlich benötigen. 797 00:37:26,680 --> 00:37:28,990 Und das funktioniert einfach nicht wie ein Gefühl besonders elegante Lösung. 798 00:37:28,990 --> 00:37:31,990 Darüber hinaus ist es gerade nimmt die Wahrscheinlichkeit eines Problems. 799 00:37:31,990 --> 00:37:35,300 Wenn Sie geschehen, ein beliebtes natürlich einem Semester und Sie haben 101 800 00:37:35,300 --> 00:37:39,610 Studenten, ist das Programm noch grundsätzlich vor dem gleichen Problem. 801 00:37:39,610 --> 00:37:44,280 >> Also zum Glück gibt es eine Lösung für Diese Anzeige all unsere Probleme in Form 802 00:37:44,280 --> 00:37:46,790 von Datenstrukturen, die sind komplexer als die 803 00:37:46,790 --> 00:37:47,970 Wir haben bisher gesehen. 804 00:37:47,970 --> 00:37:50,530 Dies, behaupte ich, ist eine verkettete Liste. 805 00:37:50,530 --> 00:37:51,920 Dies ist eine Liste von Zahlen - 806 00:37:51,920 --> 00:37:54,970 9, 17, 22, 26 und 34 - 807 00:37:54,970 --> 00:38:00,120 das sind zusammen durch verlinkt von dem, was ich als Pfeile gezeichnet. 808 00:38:00,120 --> 00:38:03,580 >> In anderen Worten, wenn ich darstellen wollte ein Array ist, konnte ich tun 809 00:38:03,580 --> 00:38:04,910 etwas wie dieses. 810 00:38:04,910 --> 00:38:07,310 Und ich werde diese auf dem Overhead setzen in nur einem Augenblick. 811 00:38:07,310 --> 00:38:09,970 Was ich tun konnte - 812 00:38:09,970 --> 00:38:12,520 hallo, alles in Ordnung. 813 00:38:12,520 --> 00:38:14,470 Stand by. 814 00:38:14,470 --> 00:38:17,360 Neue Computer hier, klar - 815 00:38:17,360 --> 00:38:18,090 alles in Ordnung. 816 00:38:18,090 --> 00:38:21,730 >> Also, wenn ich diese Zahlen in Array - 817 00:38:21,730 --> 00:38:28,880 9, 17, 22, 26, 24 - 818 00:38:28,880 --> 00:38:30,530 nicht notwendigerweise maßstabsgetreu. 819 00:38:30,530 --> 00:38:33,730 Alles klar, also hier ist mein array - 820 00:38:33,730 --> 00:38:34,980 oh mein Gott. 821 00:38:34,980 --> 00:38:38,700 822 00:38:38,700 --> 00:38:40,395 Alles klar, also hier ist mein Array. 823 00:38:40,395 --> 00:38:44,110 824 00:38:44,110 --> 00:38:45,050 Oh mein Gott. 825 00:38:45,050 --> 00:38:48,820 >> [Gelächter] 826 00:38:48,820 --> 00:38:49,440 >> DAVID MALAN: Pretend. 827 00:38:49,440 --> 00:38:52,330 Es ist zu viel Aufwand um zurück zu gehen und beheben, so dass es - 828 00:38:52,330 --> 00:38:54,290 26. 829 00:38:54,290 --> 00:38:57,650 So haben wir diese Reihe von 9, 17, 22, 26 und 34. 830 00:38:57,650 --> 00:39:00,260 Für diejenigen unter Ihnen können die peinliche Fehler, den ich gerade gemacht, 831 00:39:00,260 --> 00:39:00,830 da ist es. 832 00:39:00,830 --> 00:39:04,490 >> Also ich behaupten, dass dies ein sehr effiziente Lösung. 833 00:39:04,490 --> 00:39:07,310 Ich habe so viele ints als zugeteilt Ich - ein, zwei, drei, 834 00:39:07,310 --> 00:39:09,100 vier, fünf oder sechs - 835 00:39:09,100 --> 00:39:11,660 und ich habe dann die Nummern gespeichert innerhalb dieses Arrays. 836 00:39:11,660 --> 00:39:15,220 Aber nehmen wir an, dann möchte ich einfügen einen Wert wie die Zahl 8? 837 00:39:15,220 --> 00:39:16,100 Nun, wo es gehen? 838 00:39:16,100 --> 00:39:18,530 Angenommen, ich möchte einfügen eine Zahl wie 20. 839 00:39:18,530 --> 00:39:19,790 Nun, wo es gehen? 840 00:39:19,790 --> 00:39:23,160 Irgendwo in der Mitte, oder die Nummer 35 muss gehen 841 00:39:23,160 --> 00:39:24,010 irgendwo am Ende. 842 00:39:24,010 --> 00:39:25,320 Aber ich bin ganz aus dem Raum. 843 00:39:25,320 --> 00:39:29,120 >> Und dies ist eine grundlegende Herausforderung von Arrays, sind die Lösung nicht. 844 00:39:29,120 --> 00:39:32,280 Ich behauptete vor einem Augenblick, GetString löst dieses Problem. 845 00:39:32,280 --> 00:39:37,380 Wenn Sie möchten, um eine sechste Nummer einfügen in diesem Array, was ist mindestens eine 846 00:39:37,380 --> 00:39:40,090 Lösung können Sie zurückgreifen sicher, genau wie wir mit GetString? 847 00:39:40,090 --> 00:39:44,340 848 00:39:44,340 --> 00:39:46,030 Was ist das? 849 00:39:46,030 --> 00:39:48,190 >> Nun, um es größer wird leichter gesagt als getan. 850 00:39:48,190 --> 00:39:52,810 Wir können nicht unbedingt das Array größer, aber was können wir tun? 851 00:39:52,810 --> 00:39:56,570 Machen Sie ein neues Array, das größer ist, der Größe 6, oder vielleicht Größe 10, wenn wir wollen, 852 00:39:56,570 --> 00:40:00,490 die Nase vorne zu bekommen, und dann kopieren das alte Array in das neue, und dann 853 00:40:00,490 --> 00:40:01,680 gratis das alte Array. 854 00:40:01,680 --> 00:40:05,770 >> Aber was ist die Laufzeit jetzt dieses Prozesses? 855 00:40:05,770 --> 00:40:09,870 Es ist groß O von n, weil der Kopiervorgang kosten wird Ihnen einige Einheiten 856 00:40:09,870 --> 00:40:13,480 Zeit, also nicht so ideal, wenn wir zuteilen ein neues Array, das wird 857 00:40:13,480 --> 00:40:15,610 doppelt so viel verbrauchen Speicher vorübergehend. 858 00:40:15,610 --> 00:40:16,660 Kopieren alt mach neu - 859 00:40:16,660 --> 00:40:18,800 Ich meine, es ist nur ein Kopfschmerz, der wird wieder, warum wir schrieben 860 00:40:18,800 --> 00:40:19,920 GetString für Sie. 861 00:40:19,920 --> 00:40:21,380 >> Also, was können wir stattdessen tun? 862 00:40:21,380 --> 00:40:25,000 Nun, was ist, wenn unsere Datenstruktur tatsächlich hat Lücken in ihm? 863 00:40:25,000 --> 00:40:30,790 Angenommen, dass ich mein Ziel mit entspannen zusammenhängende Abschnitte des Speichers, wobei 9 864 00:40:30,790 --> 00:40:34,500 befindet sich direkt neben 17, das ist direkt neben 22, und so weiter. 865 00:40:34,500 --> 00:40:39,570 >> Und angenommen, dass 9 kann hier in RAM und 17 können hier im RAM überschrieben werden, 866 00:40:39,570 --> 00:40:40,990 und 22 können hier im RAM überschrieben werden. 867 00:40:40,990 --> 00:40:43,610 Mit anderen Worten, ich brauche sie nicht sogar zurück, um nicht mehr zurueck. 868 00:40:43,610 --> 00:40:47,850 Ich muss nur irgendwie eine Nadel einfädeln durch jede dieser Zahlen oder jedem 869 00:40:47,850 --> 00:40:51,010 dieser Knoten, so nennen wir die Rechtecke wie ich sie gezeichnet, um 870 00:40:51,010 --> 00:40:55,670 erinnern, wie man auf den letzten bekommen Knoten, wie die erste. 871 00:40:55,670 --> 00:40:59,940 >> Also, was ist die Programmierung zu konstruieren Wir haben vor kurzem gesehen, mit denen ich 872 00:40:59,940 --> 00:41:03,030 kann den Thread zu implementieren, oder hier, gezeichnet mit dem ich 873 00:41:03,030 --> 00:41:05,430 Umsetzung dieser Pfeile? 874 00:41:05,430 --> 00:41:06,500 So Zeiger, nicht wahr? 875 00:41:06,500 --> 00:41:09,560 Wenn ich vergeben nicht nur ein int, sondern ein Knoten - und durch 876 00:41:09,560 --> 00:41:10,810 Knoten, ich habe gerade meine Container. 877 00:41:10,810 --> 00:41:12,900 Und visuell, ich meine ein Rechteck. 878 00:41:12,900 --> 00:41:16,420 So ein Knoten anscheinend braucht zwei Werte enthalten - 879 00:41:16,420 --> 00:41:21,490 die int selbst, und dann, wie angedeutet die untere Hälfte des Rechtecks, 880 00:41:21,490 --> 00:41:23,010 ausreichend Platz für ein int. 881 00:41:23,010 --> 00:41:26,130 >> Also einfach Vorausdenken hier wie groß ist dieser Knoten, diese 882 00:41:26,130 --> 00:41:27,170 Container in Frage? 883 00:41:27,170 --> 00:41:29,250 Wie viele Bytes für den int? 884 00:41:29,250 --> 00:41:31,310 Vermutlich 4, wenn es wie üblich. 885 00:41:31,310 --> 00:41:33,270 Und dann, wie viele Bytes für den Zeiger? 886 00:41:33,270 --> 00:41:33,650 4. 887 00:41:33,650 --> 00:41:37,940 Also dieser Behälter oder dieser Knoten ist gehen, um eine 8-Byte-Struktur sein. 888 00:41:37,940 --> 00:41:41,760 Oh, und das ist ein glücklicher Zufall, dass wir gerade eingeführt diesen Begriff der 889 00:41:41,760 --> 00:41:44,400 eine Struktur oder eine C-Struktur. 890 00:41:44,400 --> 00:41:48,890 >> Also ich behaupten, dass ich einen Schritt machen wollen auf dieses kompliziertere 891 00:41:48,890 --> 00:41:52,560 Umsetzung einer Liste von Nummern, einem verketteten Liste von Zahlen, muss ich eine do 892 00:41:52,560 --> 00:41:56,920 wenig mehr nach vorne und Denken erklären nicht nur ein int, aber eine Struktur 893 00:41:56,920 --> 00:41:58,620 dass ich rufe, konventionell hier Knoten. 894 00:41:58,620 --> 00:42:01,630 Wir könnten es, was wir wollen, aber Knoten sein wird, in einer Menge thematischen 895 00:42:01,630 --> 00:42:03,560 Dinge, die wir beginnen, jetzt. 896 00:42:03,560 --> 00:42:06,480 >> Innerhalb dieses Knotens ist ein int n. 897 00:42:06,480 --> 00:42:09,350 Und dann diese Syntax, ein wenig seltsam auf den ersten Blick - 898 00:42:09,350 --> 00:42:12,960 struct node * next. 899 00:42:12,960 --> 00:42:16,900 Nun bildhaft, was ist das? 900 00:42:16,900 --> 00:42:21,000 Das ist die untere Hälfte der Das Rechteck, das wir gesehen haben 901 00:42:21,000 --> 00:42:22,730 nur einen Augenblick vor. 902 00:42:22,730 --> 00:42:27,600 >> Aber warum sage ich struct node * als nur Knoten * dagegen? 903 00:42:27,600 --> 00:42:31,370 Denn wenn die Zeiger zeigt an einem anderen Knoten, es ist nur die 904 00:42:31,370 --> 00:42:32,760 Adresse eines Knotens. 905 00:42:32,760 --> 00:42:35,630 Das ist im Einklang mit, was wir diskutiert über Zeiger so weit. 906 00:42:35,630 --> 00:42:39,690 Aber warum, wenn ich behaupte, ist diese Struktur genannt Knoten, muss ich sagen, struct 907 00:42:39,690 --> 00:42:42,660 Knoten hier drinnen? 908 00:42:42,660 --> 00:42:43,190 >> Genau. 909 00:42:43,190 --> 00:42:46,490 Es ist irgendwie eine dumme Wirklichkeit C. Der typedef, so zu sprechen, hat nicht 910 00:42:46,490 --> 00:42:47,220 passiert. 911 00:42:47,220 --> 00:42:48,510 C ist super wörtlich. 912 00:42:48,510 --> 00:42:51,050 Es liest den Code oben nach unten, von links nach rechts. 913 00:42:51,050 --> 00:42:54,930 Und bis es trifft, dass das Semikolon Unterm Strich denke was nicht 914 00:42:54,930 --> 00:42:57,590 existieren als Datentyp? 915 00:42:57,590 --> 00:42:59,060 Node, Zitat unquote Knotens. 916 00:42:59,060 --> 00:43:03,050 >> Aber wegen der ausführlichere Erklärung habe ich in der ersten Zeile - 917 00:43:03,050 --> 00:43:05,340 typedef struct node - 918 00:43:05,340 --> 00:43:08,790 denn das war zuerst da, bevor die geschweiften Klammern, die Art ist wie 919 00:43:08,790 --> 00:43:11,800 Pre-Erziehung Clang, dass Sie Wissen Sie was, geben Sie mir eine Struktur 920 00:43:11,800 --> 00:43:13,570 genannt struct Knoten. 921 00:43:13,570 --> 00:43:16,270 Ehrlich gesagt, mag ich nicht, die Dinge struct Knoten struct Knoten alle 922 00:43:16,270 --> 00:43:17,090 in meinem Code. 923 00:43:17,090 --> 00:43:20,660 Aber ich werde es nur einmal, nur innen, so dass ich effektiv 924 00:43:20,660 --> 00:43:25,010 schaffen eine Art kreisförmige Referenz, nicht ein Zeiger auf mich per se, sondern ein 925 00:43:25,010 --> 00:43:29,400 Zeiger auf eine andere von einen identischen Typ. 926 00:43:29,400 --> 00:43:32,330 >> So stellt sich heraus, dass auf einer Datenstruktur wie diese, es gibt ein paar 927 00:43:32,330 --> 00:43:34,470 Operationen, die möglicherweise für uns von Interesse. 928 00:43:34,470 --> 00:43:37,460 Wir könnten einfügen möchten in eine Liste wie diese. 929 00:43:37,460 --> 00:43:39,850 Wir könnten zu löschenden aus einer Liste wie diese. 930 00:43:39,850 --> 00:43:43,490 Vielleicht wollen wir die Liste für eine Suche Wert, oder allgemeiner, Verfahrwege. 931 00:43:43,490 --> 00:43:46,410 Und Traverse ist nur eine andere Art von sagt Start auf der linken und stellen Sie 932 00:43:46,410 --> 00:43:47,650 der Weg nach rechts. 933 00:43:47,650 --> 00:43:52,640 >> Und beachten Sie, auch mit diesem etwas mehr anspruchsvolle Datenstruktur, lassen 934 00:43:52,640 --> 00:43:56,510 mich vorzuschlagen, dass wir einige leihen die Ideen der letzten zwei Wochen und 935 00:43:56,510 --> 00:43:58,410 implementieren eine Funktion namens Suche wie diese. 936 00:43:58,410 --> 00:44:01,360 Es wird true oder falsch, was darauf hinweist, ja oder 937 00:44:01,360 --> 00:44:03,390 nein, n in der Liste. 938 00:44:03,390 --> 00:44:05,960 Sein zweites Argument ist ein Zeiger an die Liste selbst, so dass ein 939 00:44:05,960 --> 00:44:07,920 Zeiger zu einem Knoten. 940 00:44:07,920 --> 00:44:10,350 >> Alles, was ich dann tun werde, ist zu erklären einen temporären Variablen. 941 00:44:10,350 --> 00:44:12,730 Wir nennen sie ptr durch Konvention, für Zeiger. 942 00:44:12,730 --> 00:44:15,220 Und ich zuweisen gleich die Anfang der Liste. 943 00:44:15,220 --> 00:44:16,680 >> Und jetzt bemerken die While-Schleife. 944 00:44:16,680 --> 00:44:20,640 Solange Zeiger nicht gleich auf null, ich werde zu prüfen. 945 00:44:20,640 --> 00:44:24,520 Ist Zeigerpfeil n gleich die n, die übergeben wurde? 946 00:44:24,520 --> 00:44:26,410 Und warten Sie eine Minute - neue Stück Syntax. 947 00:44:26,410 --> 00:44:29,324 Was ist Pfeil ganz plötzlich? 948 00:44:29,324 --> 00:44:30,574 Ja? 949 00:44:30,574 --> 00:44:34,200 950 00:44:34,200 --> 00:44:34,810 >> Genau. 951 00:44:34,810 --> 00:44:38,860 Während also vor ein paar Minuten haben wir die Punkt-Notation etwas zugreifen 952 00:44:38,860 --> 00:44:43,080 Innere eines der Struktur, wenn die Variable Sie ist nicht die Struktur 953 00:44:43,080 --> 00:44:47,420 selbst, sondern ein Zeiger auf eine Struktur, Gott sei Dank, ein Stück Syntax, 954 00:44:47,420 --> 00:44:48,620 schließlich macht intuitiv Sinn. 955 00:44:48,620 --> 00:44:52,360 Der Pfeil bedeutet, um den Zeiger zu folgen, wie unsere Pfeile in der Regel bedeuten, 956 00:44:52,360 --> 00:44:56,570 bildhaft, und gehen Datenfeld innen. 957 00:44:56,570 --> 00:44:59,700 So Pfeil ist das gleiche wie Punkt, aber Sie verwenden, wenn Sie einen Zeiger haben. 958 00:44:59,700 --> 00:45:05,270 >> So, nur um dann rekapitulieren, wenn das n Feld innerhalb der Struktur als Zeiger 959 00:45:05,270 --> 00:45:07,760 gleich gleich n, true zurückgeben. 960 00:45:07,760 --> 00:45:11,970 Ansonsten ist diese Linie hier - Zeiger gleich Zeiger nächsten. 961 00:45:11,970 --> 00:45:17,540 Also, was ist zu tun, bemerken, ist, wenn ich bin derzeit zeigt auf die Struktur 962 00:45:17,540 --> 00:45:21,430 mit 9 und 9 ist nicht die Anzahl Ich suche - nehme ich suche 963 00:45:21,430 --> 00:45:22,830 für n gleich 50 - 964 00:45:22,830 --> 00:45:25,930 Ich werde meine temporäre Zeiger aktualisieren bis zu diesem Knotenpunkt 965 00:45:25,930 --> 00:45:31,190 mehr, aber den Mauspfeil nächsten, die wird mich hier aufgestellt. 966 00:45:31,190 --> 00:45:34,270 >> Jetzt erkannte ich, ist ein Wirbelwind Einführung. 967 00:45:34,270 --> 00:45:37,380 Am Mittwoch, den wir tatsächlich tun dies mit einigen Menschen und mit etwas mehr 968 00:45:37,380 --> 00:45:38,900 Code in einem langsameren Tempo. 969 00:45:38,900 --> 00:45:42,990 Aber klar, wir machen jetzt unsere Daten Strukturen komplexer, so dass unsere 970 00:45:42,990 --> 00:45:45,780 Algorithmen können effizienter, die sein wird, Voraussetzung für 971 00:45:45,780 --> 00:45:50,500 pset sechs, wenn wir in laden, wieder diejenigen 150.000 Worte, sondern müssen so tun, 972 00:45:50,500 --> 00:45:55,650 effizient und im Idealfall erstellen Programm, das für unsere Nutzer nicht läuft 973 00:45:55,650 --> 00:46:00,460 lineare, nicht in n Quadrat, aber in konstante Zeit, in der ideal. 974 00:46:00,460 --> 00:46:02,300 >> Wir informieren Sie am Mittwoch sehen. 975 00:46:02,300 --> 00:46:07,240 >> SPRECHER: Bei der nächsten CS50, David vergisst seine base case. 976 00:46:07,240 --> 00:46:12,770 >> DAVID MALAN: Und das ist, wie Sie senden Textnachrichten mit C. Was die - 977 00:46:12,770 --> 00:46:14,020 >> [VARIOUS TEXTNACHRICHT Hinweis-Sounds] 978 00:46:14,020 --> 00:46:19,734