1 00:00:00,000 --> 00:00:11,200 2 00:00:11,200 --> 00:00:12,580 >> DAVID Malan: Bone, bonvenigas dorso. 3 00:00:12,580 --> 00:00:13,290 Ĉi tiu estas CS50. 4 00:00:13,290 --> 00:00:15,130 Ĉi tiu estas la komenco de semajno sep. 5 00:00:15,130 --> 00:00:18,890 Do jam pasis iom da tempo, do mi pensis ke ni preni trombo tour de kie ni 6 00:00:18,890 --> 00:00:20,760 cxesis kaj kie ni nun iras. 7 00:00:20,760 --> 00:00:23,310 >> Do tiun aferon ĉi tie povus havi kaŭzis iujn angoro en komenco. 8 00:00:23,310 --> 00:00:27,680 Sed mi esperas, ke vi komencas alklimatigi al kio tio signifas tie - 9 00:00:27,680 --> 00:00:32,670 stelo reprezentas pointer, kiu estas nur kio, en pli lego la terminoj? 10 00:00:32,670 --> 00:00:33,400 Do ĝi estas adreso. 11 00:00:33,400 --> 00:00:35,490 >> Do estas la adreso de io en la memoro. 12 00:00:35,490 --> 00:00:38,260 Kaj ni komencis senŝeligi reen la manteloj paro de semajnoj, aĵoj ŝati 13 00:00:38,260 --> 00:00:41,800 GetString kaj aliaj tiaj funkcioj tiu tuta tempo ili reveni 14 00:00:41,800 --> 00:00:46,010 adresoj de aferoj en la memoro, kiel la adreso de la unua signo en 15 00:00:46,010 --> 00:00:46,990 iu vico. 16 00:00:46,990 --> 00:00:50,360 >> Do ni ankaŭ enkondukis valgrind, kiu vi komencos uzi por ĉi tiu problemo 17 00:00:50,360 --> 00:00:53,380 aro, aparte por la venonta problemo starigis kiel bone. 18 00:00:53,380 --> 00:00:54,980 Kaj valgrind faras kion por ni? 19 00:00:54,980 --> 00:00:57,520 20 00:00:57,520 --> 00:01:01,020 Ĝi kontrolas por memoro fugoj, kaj ĝi Ankaŭ kontrolas por misuzo de memoro. 21 00:01:01,020 --> 00:01:05,890 >> Ĝi povas, kun iu probablo, detekti se via kodo tuj tuŝi memoro 22 00:01:05,890 --> 00:01:07,100 ke simple ne devus. 23 00:01:07,100 --> 00:01:10,410 Do ne nepre liko, sed se vi iri preter la limojn de iuj 24 00:01:10,410 --> 00:01:14,730 tabelo, kaj vi efektive kuri valgrind kaj instigi ke la konduto dum 25 00:01:14,730 --> 00:01:17,870 valgrind kuras en via programo estas kurante ene de ĝi, vi ricevos 26 00:01:17,870 --> 00:01:21,460 mesaĝoj kiel tiu - "malvalida skribi de grandeco 4 ", kiu, memoru paro de 27 00:01:21,460 --> 00:01:25,880 semajnoj signifis ke mi havis hazarde kiel sur unu int tro malproksime 28 00:01:25,880 --> 00:01:27,250 trans la limoj de tabelo. 29 00:01:27,250 --> 00:01:30,790 Kaj tiel grandeco 4 signifas tie la grandeco de tiu aparta int. 30 00:01:30,790 --> 00:01:35,260 >> Do prenu konsilojn en la fakto ke valgrind eligo, la formato de ĝi, 31 00:01:35,260 --> 00:01:36,170 estas nur abomena. 32 00:01:36,170 --> 00:01:40,180 Estas vere malfacile vidi tra la salaton por la interesa informo. 33 00:01:40,180 --> 00:01:42,910 Do kion ni faris ĉi tie estas nur ekstrakto kelkaj el la paro de pli 34 00:01:42,910 --> 00:01:43,850 interesaj linioj. 35 00:01:43,850 --> 00:01:46,760 Sed rimarkas ke 80% de valgrind la eligo tuj estos iom de 36 00:01:46,760 --> 00:01:47,650 distro. 37 00:01:47,650 --> 00:01:52,820 >> Nur serĉi tekson tiuj - nevalida pravas, nevalida legis, 40 bitokoj 38 00:01:52,820 --> 00:01:56,690 kaj iu numero de blokoj estas definitive perdita, ŝlosilvortoj tiel. 39 00:01:56,690 --> 00:02:01,920 Kaj kion vi espereble vidos estas iuj ia spuro de kio funkcii la 40 00:02:01,920 --> 00:02:03,340 eraro estas fakte in 41 00:02:03,340 --> 00:02:07,195 En tiu kazo ĉi tie, en kio linio de mia kodo estis la eraro ŝajne? 42 00:02:07,195 --> 00:02:09,729 43 00:02:09,729 --> 00:02:14,130 >> 26 en dosiero nomata memory.c, kiu estis la ekzemplo ni ludis kun 44 00:02:14,130 --> 00:02:14,890 en tiu momento. 45 00:02:14,890 --> 00:02:16,460 Do ĝi estas probable ne en malloc. 46 00:02:16,460 --> 00:02:18,630 Ĝi estis probable en mia kodo anstataŭe. 47 00:02:18,630 --> 00:02:20,910 Do ni vidos ĉi denove kaj denove post nelonge. 48 00:02:20,910 --> 00:02:24,080 >> Do scanf, ĉi tiu venis en paro de formoj tiom. 49 00:02:24,080 --> 00:02:26,410 Ni vidis sscanf mallonge. 50 00:02:26,410 --> 00:02:28,330 Estis iu numero de vi plonĝis en en via 51 00:02:28,330 --> 00:02:29,535 preparoj por la kvizo. 52 00:02:29,535 --> 00:02:33,130 Kaj scanf estas fakte kion la CS50 biblioteko estas estinta uzante sub la 53 00:02:33,130 --> 00:02:36,560 kapuĉo por sufiĉe tempo por akiri eniron de la uzanto. 54 00:02:36,560 --> 00:02:40,420 >> Ekzemple, se mi movas super la CS50 aparato tie, permesu al mi malfermi la 55 00:02:40,420 --> 00:02:45,315 Ekzemple hodiaŭ ke nomiĝas scanf-0.c Kaj ĝi estas super simpla. 56 00:02:45,315 --> 00:02:46,590 Estas nur malmultaj linioj de kodo. 57 00:02:46,590 --> 00:02:50,880 Sed ĝi pruvas vere kiel getInt estis laborante ĉio ĉi tempo. 58 00:02:50,880 --> 00:02:54,710 >> En ĉi tiu programo ĉi tie, en linio 16 , Avizo kiu deklaras la Int. 59 00:02:54,710 --> 00:02:57,270 Do ne montriloj, nenio magia tie, nur int. 60 00:02:57,270 --> 00:03:00,330 Tiam en linio 17, mi instigas la uzanton por nombro, bonvolu. 61 00:03:00,330 --> 00:03:02,930 Tiam fine 18, mi uzas scanf tie. 62 00:03:02,930 --> 00:03:06,910 Kaj mi specifita, ia kiel printf, ke mi atendis citaĵo 63 00:03:06,910 --> 00:03:08,110 unquote procento i. 64 00:03:08,110 --> 00:03:10,920 >> Do procento i, kompreneble, signas la int. 65 00:03:10,920 --> 00:03:14,580 Sed rimarki kion la dua argumento por scanf estas. 66 00:03:14,580 --> 00:03:17,350 Kiel vi priskribus la dua argumento post la komo? 67 00:03:17,350 --> 00:03:19,450 Kio estas tio? 68 00:03:19,450 --> 00:03:20,670 >> Ĝi estas la adreso de x. 69 00:03:20,670 --> 00:03:25,490 Do tiu estas utila ĉar per provizi scanf kun la adreso de x, kion faras 70 00:03:25,490 --> 00:03:29,560 ke plifortigi tiun funkcion por fari? 71 00:03:29,560 --> 00:03:33,010 Ne nur iri tien, sed ankaŭ fari kion? 72 00:03:33,010 --> 00:03:34,060 >> Fari ŝanĝon al ĝi. 73 00:03:34,060 --> 00:03:38,080 Ĉar vi povas iri tien, estas speco de kiel mapon al loko en la memoro. 74 00:03:38,080 --> 00:03:41,900 Kaj tiel longe kiel vi provizis scanf, aŭ iu funkcio kun tia mapo, ke 75 00:03:41,900 --> 00:03:45,840 funkcio povas iri tie, kaj ne nur rigardi la valoro, sed ĝi povas ankaŭ 76 00:03:45,840 --> 00:03:49,670 ŝanĝi tiun valoron, kiu estas utila se la celo en la vivo de scanf estas 77 00:03:49,670 --> 00:03:53,060 skani enigon el la uzanto, specife de la klavaro. 78 00:03:53,060 --> 00:03:57,830 Kaj la f signifas formatan, samkiel printf, la f signifas formatan 79 00:03:57,830 --> 00:03:58,930 kordo, kiun vi volas presi. 80 00:03:58,930 --> 00:04:04,430 >> Do, en mallonga, tiu linio 18 simple diras, provu legi int de la uzanto 81 00:04:04,430 --> 00:04:10,420 klavaro kaj stoki ĝin ene de x, ĉe kion ajn adreso x okazas vivi ĉe. 82 00:04:10,420 --> 00:04:14,860 Kaj poste persiste, linio 19 simple diras, dankon pro la int, en tiu kazo. 83 00:04:14,860 --> 00:04:15,940 >> Do lasu min antaŭeniri kaj realigi ĉi. 84 00:04:15,940 --> 00:04:18,570 Do fari scanf 0. 85 00:04:18,570 --> 00:04:20,130 Lasu min antaŭeniri kaj zomi in 86 00:04:20,130 --> 00:04:22,960 Mi iros kaj kuri ĉi kun dots slash scanf 0. 87 00:04:22,960 --> 00:04:24,020 Nombro, mi petas? 88 00:04:24,020 --> 00:04:24,720 50. 89 00:04:24,720 --> 00:04:25,730 Dankon por la 50. 90 00:04:25,730 --> 00:04:27,270 Do estas sufiĉe simpla. 91 00:04:27,270 --> 00:04:28,160 >> Nun kio ĝi ne faras? 92 00:04:28,160 --> 00:04:29,940 Tio ne faras tutan faskon de eraro checking. 93 00:04:29,940 --> 00:04:33,000 Ekzemple, se mi ne kunlaboras, kaj mi ne tajpas en nombro, sed 94 00:04:33,000 --> 00:04:37,860 anstataŭe mi skribas ion kiel "saluton", tio estas nur ia stranga. 95 00:04:37,860 --> 00:04:41,130 Kaj tial unu el la aĵoj la CS50 biblioteko estis farante por ni por kelkaj 96 00:04:41,130 --> 00:04:43,440 tempo estas ke reprompting kaj reprompting. 97 00:04:43,440 --> 00:04:49,320 >> La reprovi frazo revokon estis en cs50.c, kaj tio estas la kialo ke getInt en 98 00:04:49,320 --> 00:04:51,670 la CS50 biblioteko estas fakte ĉiu faskon da linioj longaj, ĉar ni estas 99 00:04:51,670 --> 00:04:53,190 kontrolanta por stultaj aĵoj kiel ĉi tio. 100 00:04:53,190 --> 00:04:55,730 Ĉu la uzanto ne donos ni, fakte, int? 101 00:04:55,730 --> 00:04:57,910 Ĉu li aŭ ŝi donu al ni ion kiel alfabeta litero? 102 00:04:57,910 --> 00:05:01,410 Se jes, ni volas detekti tio kaj krii al ili. 103 00:05:01,410 --> 00:05:03,915 >> Sed tion akiri pli interesa en la sekva ekzemplo. 104 00:05:03,915 --> 00:05:09,840 Se mi iras al scanf-1.c, kio estas la kiu estas fundamente ŝanĝis en 105 00:05:09,840 --> 00:05:11,135 ĉi sekva ekzemplo? 106 00:05:11,135 --> 00:05:13,690 107 00:05:13,690 --> 00:05:16,010 Mi uzas char *, kompreneble, anstataŭ int. 108 00:05:16,010 --> 00:05:19,210 >> Do tiu estas interesa, ĉar char *, memori, estas vere nur la 109 00:05:19,210 --> 00:05:20,190 sama afero kiel kordo. 110 00:05:20,190 --> 00:05:23,840 Do li sentas kiel eble tiu estas super simpla apliko de GetString. 111 00:05:23,840 --> 00:05:26,010 Sed mi senŝeligis reen la mantelo de la CS50 biblioteko, do mi estas 112 00:05:26,010 --> 00:05:27,550 nomante tiun char * nun. 113 00:05:27,550 --> 00:05:30,070 Do ni vidu kie, se ie, Ni iras malbone. 114 00:05:30,070 --> 00:05:30,840 >> Linio 17 - 115 00:05:30,840 --> 00:05:33,950 Mi denove diras, bonvolu doni al mi ion, en ĉi tiu kazo, kordoj. 116 00:05:33,950 --> 00:05:37,940 Kaj poste en la sekva linio, mi vokas scanf, denove, donante al ĝi formato kodo, 117 00:05:37,940 --> 00:05:39,310 sed tiu tempo procento s. 118 00:05:39,310 --> 00:05:41,900 Kaj tiam tiu tempo, mi estas donante buffer. 119 00:05:41,900 --> 00:05:43,550 >> Nun rimarkos, mi ne uzas la kaj-signo. 120 00:05:43,550 --> 00:05:47,120 Sed kial estas tiu probable OK tie? 121 00:05:47,120 --> 00:05:49,760 Ĉar kio estas buffer jam? 122 00:05:49,760 --> 00:05:50,770 Estas jam puntero. 123 00:05:50,770 --> 00:05:51,650 Estas jam adreso. 124 00:05:51,650 --> 00:05:54,510 >> Kaj let estas tio vorto "konfuzi," lasu min nur nomas ĝin j, ekzemple, por 125 00:05:54,510 --> 00:05:55,050 simpleco. 126 00:05:55,050 --> 00:05:58,250 Sed mi nomis ĝin buffer ĉar en Ĝenerale, en programado, se vi havas 127 00:05:58,250 --> 00:06:02,130 eron de memoro, kiun kordoj vere nur estas, eble vi nomas ĝin buffer. 128 00:06:02,130 --> 00:06:04,460 Ĝi estas loko por stoki informo. 129 00:06:04,460 --> 00:06:07,400 >> Similaj al aĵoj kiel YouTube, kiam ili estas buffering, por tiel diri, ke 130 00:06:07,400 --> 00:06:10,270 nur signifas ĝi estas elŝutanta bitoj de la interreto kaj stoki ilin en 131 00:06:10,270 --> 00:06:14,160 lokaj tabelo, loka eron de memoro por ke vi povas rigardi ĝin poste sen 132 00:06:14,160 --> 00:06:16,830 ĝin saltante aŭ pendis sur vi dum reprodukti. 133 00:06:16,830 --> 00:06:20,930 >> Do tie estas problemo ĉi tie, tamen, ĉar mi diras scanf, atendi 134 00:06:20,930 --> 00:06:22,320 kordoj de la uzanto. 135 00:06:22,320 --> 00:06:24,410 Jen la adreso de eron de memoro. 136 00:06:24,410 --> 00:06:26,180 Meti ke kordo tie. 137 00:06:26,180 --> 00:06:31,230 Kial estas ke bara doni ni afliktigxas, kvankam? 138 00:06:31,230 --> 00:06:33,490 >> Kio estas tio? 139 00:06:33,490 --> 00:06:35,510 Ĉu mi rajtas aliri al tiu parto de memoro? 140 00:06:35,510 --> 00:06:36,250 Vi scias, mi ne scias. 141 00:06:36,250 --> 00:06:39,210 Pro tio bufro estis inicializado al nenio? 142 00:06:39,210 --> 00:06:39,820 Ne vere. 143 00:06:39,820 --> 00:06:43,090 Kaj tial estas kion ni estis nomante de rubo valoro, kiu 144 00:06:43,090 --> 00:06:44,040 ne estas formala vorto. 145 00:06:44,040 --> 00:06:49,200 Ĝi simple signifas ke ni ne havas ideon kion bitoj estas ene de la kvar bajtojn ke 146 00:06:49,200 --> 00:06:51,240 Mi destinis kiel bufro. 147 00:06:51,240 --> 00:06:52,450 >> Mi ne nomas malloc. 148 00:06:52,450 --> 00:06:53,940 Mi certe ne nomas GetString. 149 00:06:53,940 --> 00:06:56,380 Do kiu scias, kio estas fakte ene de buffer? 150 00:06:56,380 --> 00:07:00,550 Kaj tamen dirante scanf blinde, iru tie kaj metis ajn la uzanto tajpas. 151 00:07:00,550 --> 00:07:04,460 >> Do kio estas verŝajna kaŭzi en nia kodo se ni ruli ĝin? 152 00:07:04,460 --> 00:07:05,700 Probable segfault. 153 00:07:05,700 --> 00:07:07,970 Eble ne, sed probable segfault. 154 00:07:07,970 --> 00:07:10,620 Kaj mi diras eble ne ĉar kelkfoje vi faras, kelkfoje 155 00:07:10,620 --> 00:07:11,380 vi ne ricevas segfault. 156 00:07:11,380 --> 00:07:14,280 Kelkfoje vi ĵus ricevas sorton, sed ĝi estas tamen tuj estos 157 00:07:14,280 --> 00:07:15,340 cimon en nia programo. 158 00:07:15,340 --> 00:07:17,060 >> Do lasu min antaŭeniri kaj kompili ĉi. 159 00:07:17,060 --> 00:07:18,280 Mi tuj faros la malnova lernejo vojo. 160 00:07:18,280 --> 00:07:23,825 Do clang haltostreko 0, scanf-1, scanf-1.c, Enter. 161 00:07:23,825 --> 00:07:24,720 Oops, tro malnova lernejo. 162 00:07:24,720 --> 00:07:26,550 Ni vidu. 163 00:07:26,550 --> 00:07:28,440 Kien mi eniru? 164 00:07:28,440 --> 00:07:29,700 Ho, char * buffer. 165 00:07:29,700 --> 00:07:33,595 166 00:07:33,595 --> 00:07:35,130 Ho, dankon - 167 00:07:35,130 --> 00:07:36,930 Konservi, OK - 168 00:07:36,930 --> 00:07:37,690 tre malnova lernejo. 169 00:07:37,690 --> 00:07:38,900 Bone, jam pasis iom da tempo. 170 00:07:38,900 --> 00:07:41,720 >> Do mi ĵus savis la dosieron post farante ke temporal 171 00:07:41,720 --> 00:07:42,700 ŝanĝi antaŭ momento. 172 00:07:42,700 --> 00:07:46,090 Kaj nun mi kompilis ĝin permane kun Clang. 173 00:07:46,090 --> 00:07:49,500 Kaj nun mi tuj iros antaŭen kaj kuri scanf-1, Enter. 174 00:07:49,500 --> 00:07:50,290 String bv. 175 00:07:50,290 --> 00:07:51,600 Mi tajpas en "saluton." 176 00:07:51,600 --> 00:07:54,070 >> Kaj nun, jen kie, sincere, printf povas estas iom ĝena. 177 00:07:54,070 --> 00:07:56,020 Ĝi fakte ne tuj segfault en ĉi tiu kazo. 178 00:07:56,020 --> 00:07:59,860 Printf estas iom speciala ĉar estas tiel super komune uzis tiun 179 00:07:59,860 --> 00:08:03,570 esence printf faras ni favoron kaj realigante, 180 00:08:03,570 --> 00:08:04,830 tio ne estas valida puntero. 181 00:08:04,830 --> 00:08:09,080 Lasu min preni tion sur min al ĝuste presi el en krampoj nula, eĉ 182 00:08:09,080 --> 00:08:13,340 kvankam tio ne nepre kion ni mem atendis. 183 00:08:13,340 --> 00:08:16,940 >> Do ni ne povas vere facile indukti segfault kun ĉi tio, sed klare tiu 184 00:08:16,940 --> 00:08:18,600 ne estas la konduto mi volis. 185 00:08:18,600 --> 00:08:19,800 Do kio estas la simpla solvo? 186 00:08:19,800 --> 00:08:25,650 Nu, en scanf-2, lasu min proponas ke anstataŭ fakte ĝuste atribui al 187 00:08:25,650 --> 00:08:30,100 char *, lasu min esti iom pli inteligenta pri ĉi tio, kaj lasu min atribui buffer 188 00:08:30,100 --> 00:08:32,940 kiel vico de 16 signoj. 189 00:08:32,940 --> 00:08:34,200 >> Do mi povas tion fari en kelkaj manieroj. 190 00:08:34,200 --> 00:08:35,610 Mi povus uzi absolute malloc. 191 00:08:35,610 --> 00:08:38,980 Sed mi povas reiri al semajno du kiam Mi nur bezonis tutan faskon da 192 00:08:38,980 --> 00:08:39,620 gravuloj. 193 00:08:39,620 --> 00:08:40,860 Tio estas nur tabelo. 194 00:08:40,860 --> 00:08:44,870 Do mi anstataŭ redifini buffer esti tabelo de 16 signoj. 195 00:08:44,870 --> 00:08:47,340 >> Kaj nun, kiam mi pasas bufro en - 196 00:08:47,340 --> 00:08:49,940 kaj tio estas io, kion ni ne raporti en semajno du - 197 00:08:49,940 --> 00:08:53,730 sed vi povas trakti tabelo kiel kvankam ĝi estas adreso. 198 00:08:53,730 --> 00:08:56,390 Teknike, kiel ni jam vidis, ili estas iomete malsamaj. 199 00:08:56,390 --> 00:09:01,290 Sed scanf ne gravas se vi pasas ĝin la nomo de tabelo, ĉar kion 200 00:09:01,290 --> 00:09:05,030 Clang faros por ni estas esence trakti la nomon de tiu tabelo kiel la 201 00:09:05,030 --> 00:09:08,280 adreso de la bloko de 16 bajtoj. 202 00:09:08,280 --> 00:09:09,550 >> Do tiu estas preferinda. 203 00:09:09,550 --> 00:09:12,110 Tio signifas, ke nun mi povos espereble faru la sekvajn. 204 00:09:12,110 --> 00:09:16,800 Lasu min malzomi dum momento kaj farata scanf-2, kompilita OK. 205 00:09:16,800 --> 00:09:19,390 Nun mi ne havas oblikvo scanf-2. 206 00:09:19,390 --> 00:09:22,430 String bv. "Saluton." Kaj ŝajnis funkcii ĉi tiu tempo. 207 00:09:22,430 --> 00:09:26,020 >> Sed povas iu proponas scenaro en kiun ĝi eble ne estas ankoraŭ funkcias? 208 00:09:26,020 --> 00:09:28,550 Jes? 209 00:09:28,550 --> 00:09:30,640 Io pli longa ol 16 signoj. 210 00:09:30,640 --> 00:09:32,020 Kaj efektive, ni povas esti iom pli precizan. 211 00:09:32,020 --> 00:09:36,540 Io plu tiam 15 karakteroj, ĉar vere ni bezonas havi en menso 212 00:09:36,540 --> 00:09:39,920 ke ni bezonas ke backslash nulo implice fine de la kordo, 213 00:09:39,920 --> 00:09:42,950 kiu estas flanken scanf volo tipe prizorgi por ni. 214 00:09:42,950 --> 00:09:46,210 >> Do mi faru ion kiel - 215 00:09:46,210 --> 00:09:48,040 kelkfoje ni povas nur lasi gxin tiel. 216 00:09:48,040 --> 00:09:50,630 Bone, do ni nun induktita nia segmentación kulpo. 217 00:09:50,630 --> 00:09:51,000 Kial? 218 00:09:51,000 --> 00:09:54,940 Ĉar mi tajpis al pli ol 15 karakterojn, kaj tiel ni vere 219 00:09:54,940 --> 00:09:58,280 tusxis memoron, ke mi efektive ne devus havi. 220 00:09:58,280 --> 00:10:00,180 >> Do kio estas vere la solvo ĉi tie? 221 00:10:00,180 --> 00:10:02,210 Nu, kio se ni bezonas pli longan ĉenon? 222 00:10:02,210 --> 00:10:03,960 Nu, ni eble faros 32 bajtoj. 223 00:10:03,960 --> 00:10:05,160 Nu, se tio ne sufiĉe longe? 224 00:10:05,160 --> 00:10:06,040 Kion pri 64 bitokoj? 225 00:10:06,040 --> 00:10:07,080 Kio se tio ne sufiĉe longe? 226 00:10:07,080 --> 00:10:09,640 Kiel ĉirkaŭ 128 aŭ 200 bitokoj? 227 00:10:09,640 --> 00:10:12,660 Kio vere estas la solvo ĉi tie en la ĝenerala kazo, se ni ne scias 228 00:10:12,660 --> 00:10:14,460 antaŭi kion la uzanto tuj tajpi? 229 00:10:14,460 --> 00:10:20,000 230 00:10:20,000 --> 00:10:23,050 >> Estas nur speco de granda doloro en la azeno, por esti honesta, tial la 231 00:10:23,050 --> 00:10:29,050 CS50 biblioteko havas kelkdek linioj de kodo kiu kolektive implemento 232 00:10:29,050 --> 00:10:32,390 GetString kordo en maniero, ke ni ne devas scii anticipe, kion la 233 00:10:32,390 --> 00:10:33,430 uzanto tuj tajpi. 234 00:10:33,430 --> 00:10:37,370 En aparta, se vi retrorigardas al cs50.c de du semajnoj, vi vidos 235 00:10:37,370 --> 00:10:40,480 ke GetString fakte faras Ne uzu scanf en tiamaniere. 236 00:10:40,480 --> 00:10:43,720 Pli ĝuste, ĝi legas unu signo samtempe. 237 00:10:43,720 --> 00:10:46,010 >> Pro la agrabla afero pri legante unu signo estas ni povas 238 00:10:46,010 --> 00:10:48,490 garantii nin al ĉiam havi almenaŭ unu char. 239 00:10:48,490 --> 00:10:51,740 Mi povas nur deklari char, kaj poste prenu tiuj vere bebo paŝojn por ĝuste 240 00:10:51,740 --> 00:10:54,380 legi unu signo en ĉe fojo de la klavaro. 241 00:10:54,380 --> 00:10:58,240 Kaj tiam, kion vi vidos GetString faras estas ĉiufoje ĝi kuras el, 242 00:10:58,240 --> 00:11:02,280 diri, 16 bajtoj de memoro, ĝi uzas malloc, aŭ kuzo gxiajn al 243 00:11:02,280 --> 00:11:06,810 atribui pli da memoro, kopiante la malnova memoro en la nova, kaj poste rampis 244 00:11:06,810 --> 00:11:09,900 kune, atingi unu signo samtempe, kaj kiam ĝi kuras el tiu 245 00:11:09,900 --> 00:11:13,370 eron de memoro, ĵetas ĝin for, kroĉas pli grandan eron de memoro, kopias malnovan 246 00:11:13,370 --> 00:11:14,750 en novajn, kaj ripetas. 247 00:11:14,750 --> 00:11:18,480 Kaj estas vere doloron al reale apliki io ​​tiel simpla kiel 248 00:11:18,480 --> 00:11:19,710 ricevas enigon el la uzanto. 249 00:11:19,710 --> 00:11:21,090 >> Do vi povas uzi scanf. 250 00:11:21,090 --> 00:11:22,430 Vi povas uzi aliajn similajn funkciojn. 251 00:11:22,430 --> 00:11:25,420 Kaj multe da lernolibroj kaj rete ekzemploj faru, sed ili ĉiuj estas 252 00:11:25,420 --> 00:11:27,210 vundebla al problemoj kiel ĉi tio. 253 00:11:27,210 --> 00:11:29,550 Kaj fine, getting a segfault estas ia ĝena. 254 00:11:29,550 --> 00:11:30,680 Ĝi ne estas bona por la uzanto. 255 00:11:30,680 --> 00:11:33,560 >> Sed en la plej malbona kazo, kion faras ĝi fundamente meti vian 256 00:11:33,560 --> 00:11:37,160 kodo riskas? 257 00:11:37,160 --> 00:11:39,250 Ia atako, potenciale. 258 00:11:39,250 --> 00:11:41,680 Ni parolis pri unu tia atako - superfluas la stako. 259 00:11:41,680 --> 00:11:44,660 Sed ĝenerale, se vi permesas troplenigxis buffer, kiel ni faris 260 00:11:44,660 --> 00:11:48,070 kelkaj semajnoj, kun nur skribi pli ol "saluton" en la pilo, vi 261 00:11:48,070 --> 00:11:52,330 povas ja transpreni, potenciale, oni komputilo, aŭ almenaŭ atingi datumojn kiuj 262 00:11:52,330 --> 00:11:53,510 ne apartenas al vi. 263 00:11:53,510 --> 00:11:55,970 >> Do, en mallonga, tio estas kial ni havas tiuj trejnado radoj. 264 00:11:55,970 --> 00:11:59,090 Sed nun, ni komencas preni ilin, kiel niaj programoj ne plu bezonas, 265 00:11:59,090 --> 00:12:00,610 nepre, enigo de la uzanto. 266 00:12:00,610 --> 00:12:03,960 Sed en la kazo de problemo starigis ses, via enigo venos de grandega 267 00:12:03,960 --> 00:12:07,520 vortaro-dosiero kun 150 iom nepara mil vortoj. 268 00:12:07,520 --> 00:12:10,330 >> Do vi ne devos maltrankviligi la uzanto arbitrajn enigo. 269 00:12:10,330 --> 00:12:13,720 Ni donos al vi kelkajn supozojn pri tiu dosiero. 270 00:12:13,720 --> 00:12:20,340 Ajna demandojn sur montriloj aŭ scanf aŭ uzanto enigo ĝenerale? 271 00:12:20,340 --> 00:12:24,450 >> Bone, do rapida rigardo tiam je unu trenante temon de du semajnoj. 272 00:12:24,450 --> 00:12:28,590 Kaj tio estis jena nocio de struct. 273 00:12:28,590 --> 00:12:34,180 Ne tio, - tiu nocio de struct, kio estis kion? 274 00:12:34,180 --> 00:12:35,430 Kion struct faru por ni? 275 00:12:35,430 --> 00:12:39,280 276 00:12:39,280 --> 00:12:39,860 >> Difini - 277 00:12:39,860 --> 00:12:41,710 sorry? 278 00:12:41,710 --> 00:12:42,820 Difini variablon tipo. 279 00:12:42,820 --> 00:12:44,410 Do ordigi de. 280 00:12:44,410 --> 00:12:46,180 Ni efektive kombini du temojn. 281 00:12:46,180 --> 00:12:49,510 Do kun typedef, memoru, ke ni povas deklari tipo de nia propra, kiel 282 00:12:49,510 --> 00:12:51,500 sinonimo, kiel ĉenon por char *. 283 00:12:51,500 --> 00:12:56,200 Sed uzante typedef kaj struct, ni povas krei vere nia propra datumstrukturoj. 284 00:12:56,200 --> 00:12:59,600 >> Ekzemple, se mi reirus en gedit ĉi tie dum nur momento, kaj mi iras antaŭen 285 00:12:59,600 --> 00:13:08,230 kaj faru ion kiel, lasu min konservi ĉi tiel, diru, structs.c 286 00:13:08,230 --> 00:13:10,840 provizore, mi nur irante iri antaŭen kaj inkluzivas 287 00:13:10,840 --> 00:13:14,360 standardio.h, int ĉefa malplena. 288 00:13:14,360 --> 00:13:18,960 Kaj tiam en tie, supozu, ke mi volas verki programon kiu stokas 289 00:13:18,960 --> 00:13:21,840 multnombraj studentoj de multnombraj domoj, ekzemple. 290 00:13:21,840 --> 00:13:24,430 Tiel estas kiel registrarial datumbazo de iu varo. 291 00:13:24,430 --> 00:13:29,550 >> Do se mi bezonas la nomon unu studento, mi povus fari ion kiel char * nomon, 292 00:13:29,550 --> 00:13:31,570 kaj Mi faros ion kiel - 293 00:13:31,570 --> 00:13:34,410 fakte, ni uzas la CS50 biblioteko por nur momenton por fari ĉi tion 294 00:13:34,410 --> 00:13:38,380 iom pli simpla, do ni povas prunti tiujn dekojn da linioj de kodo. 295 00:13:38,380 --> 00:13:39,340 Kaj ni simple teni ĝin simpla. 296 00:13:39,340 --> 00:13:42,610 Ni tenu gxin ĉenon, kaj nun GetString. 297 00:13:42,610 --> 00:13:47,420 >> Do mi asertas nun ke mi stokis la nomo de iu studento, kaj la domo de 298 00:13:47,420 --> 00:13:50,240 iu studento, simple uzante variabloj kiel ni faris en la semajno unu. 299 00:13:50,240 --> 00:13:52,370 Sed supozas ke mi nun volas subteni multnombraj studentoj. 300 00:13:52,370 --> 00:13:58,460 Bone, do mia instinktoj devas fari kordo name2, ricevas GetString, kordo 301 00:13:58,460 --> 00:14:01,370 house2 gets GetString. 302 00:14:01,370 --> 00:14:05,850 Kaj tiam nia tria studento, ni faru name3 GetString. 303 00:14:05,850 --> 00:14:09,170 >> Bone, do ĉi tiu estas espereble okulfrapa vi kiel speco de stulta, 304 00:14:09,170 --> 00:14:11,580 ĉar ĉi tiu procezo estas vere neniam tuj finos, kaj ĝi estas nur tuj 305 00:14:11,580 --> 00:14:13,130 fari mian kodo aspektas malbone kaj pli granda malbono. 306 00:14:13,130 --> 00:14:14,810 Sed ni solvis ĉi tro en semajno du. 307 00:14:14,810 --> 00:14:19,450 Kio estis nia relative pura solvo kiam ni havis plurajn variablojn de la 308 00:14:19,450 --> 00:14:23,580 sama datumtipo estas ĉiuj rilataj, sed ni ne volas ke tiu terura katastrofo 309 00:14:23,580 --> 00:14:26,870 de simile, variabloj? 310 00:14:26,870 --> 00:14:30,060 Kion ni faru anstataŭ? 311 00:14:30,060 --> 00:14:31,260 >> Do mi kredas ke mi aŭdis kelkajn lokojn. 312 00:14:31,260 --> 00:14:32,590 Ni havis tabelo. 313 00:14:32,590 --> 00:14:37,110 Se vi volas multnombraj kazoj de io, kial ni ne purigas tiun tutan 314 00:14:37,110 --> 00:14:39,540 supren kaj ĝuste diri, donu al mi tabelo nomis nomojn? 315 00:14:39,540 --> 00:14:41,640 >> Kaj por nun, ni forte kodo 3. 316 00:14:41,640 --> 00:14:44,450 Kaj tiam donu al mi alian tabelo vokis domoj, kaj lasu min por 317 00:14:44,450 --> 00:14:45,800 nun forte kodo 3. 318 00:14:45,800 --> 00:14:49,220 Kaj mi amase purigis la salaton, ke mi ĵus kreis. 319 00:14:49,220 --> 00:14:52,400 Nun, mi ankoraŭ malfacile koditaj 3, sed eĉ la 3 povus dinamike venas de la 320 00:14:52,400 --> 00:14:54,350 uzanto, aŭ argv, aŭ simila. 321 00:14:54,350 --> 00:14:55,720 Do tiu estas jam pli pura. 322 00:14:55,720 --> 00:15:00,100 >> Sed kio estas pri tiu ĝena estas ke nun, eĉ se nomo estas iel 323 00:15:00,100 --> 00:15:02,280 fundamente ligita al studento domo - 324 00:15:02,280 --> 00:15:04,720 ĝi estas studento, ke mi vere volas reprezenti - 325 00:15:04,720 --> 00:15:08,080 Mi nun havas du tabeloj kiuj estas paralela en la senco ke ili estas la 326 00:15:08,080 --> 00:15:13,930 sama amplekso, kaj nomoj krampo 0 supozeble mapojn al domoj krampo 0, 327 00:15:13,930 --> 00:15:16,600 kaj nomoj krampo 1 mapoj al domoj krampo 1. 328 00:15:16,600 --> 00:15:19,280 En aliaj vortoj, kiuj studento loĝas en tiun domon, kaj tiu alia studento 329 00:15:19,280 --> 00:15:20,530 loĝas en tiu alia domo. 330 00:15:20,530 --> 00:15:23,720 Sed verŝajne ĉi tiu povus esti faris eĉ pli pure. 331 00:15:23,720 --> 00:15:24,990 >> Nu, ĝi povas, fakte. 332 00:15:24,990 --> 00:15:28,730 Kaj lasu min antaŭeniri kaj malfermi supren structs.h, kaj vi instruos vin 333 00:15:28,730 --> 00:15:31,130 vidu tiun ideon tie. 334 00:15:31,130 --> 00:15:34,905 Rimarku, ke mi uzis typedef, kiel vi aludas antaŭ momento deklari nian 335 00:15:34,905 --> 00:15:35,570 propra datumtipo. 336 00:15:35,570 --> 00:15:39,660 Sed mi ankaŭ uzas tiun ĉi alia ŝlosilvorto vokis struct kiu donas al mi novan 337 00:15:39,660 --> 00:15:40,790 datumstrukturo. 338 00:15:40,790 --> 00:15:43,980 >> Kaj ĉi tiu datumstrukturo mi asertas tuj havi du aferoj ene de 339 00:15:43,980 --> 00:15:47,060 it - ĉenon nomis nomon, kaj ĉeno nomata domo. 340 00:15:47,060 --> 00:15:49,820 Kaj la nomo Mi tuj donos al tiu datumstrukturo tuj 341 00:15:49,820 --> 00:15:51,005 esti nomita studento. 342 00:15:51,005 --> 00:15:54,030 Mi povus nomi ion mi volas, sed ĉi semantike fari 343 00:15:54,030 --> 00:15:55,810 senti min en mia menso. 344 00:15:55,810 --> 00:15:59,160 >> Do nun, se mi malfermos pli bona versio de la programo mi komencis skribi 345 00:15:59,160 --> 00:16:00,390 tie, lasu min rulumi al la supro. 346 00:16:00,390 --> 00:16:03,190 Kaj kelkaj pliaj linioj de kodo ĉi tie, sed permesu al mi koncentri por 347 00:16:03,190 --> 00:16:04,160 Nuntempe sur unu. 348 00:16:04,160 --> 00:16:07,790 Mi jam deklaris konstanta nomita studentoj kaj hard coded 3 por nun. 349 00:16:07,790 --> 00:16:11,110 Sed nun, rimarki kiom puraj mia kodo komencas akiri. 350 00:16:11,110 --> 00:16:15,030 >> En linio 22, mi deklaras tabelo de studentoj. 351 00:16:15,030 --> 00:16:18,760 Kaj rimarki ke lernanto estas ŝajne nun datumtipo. 352 00:16:18,760 --> 00:16:23,360 Ĉar ĉe la supro de ĉi tiu dosiero, rimarki Mi komprenis ke header dosieron 353 00:16:23,360 --> 00:16:24,820 ke mi tiris supren nur antaŭ momento. 354 00:16:24,820 --> 00:16:28,820 Kaj tio header dosieron tutsimple havis tiu difino de studento. 355 00:16:28,820 --> 00:16:32,470 >> Do nun, mi kreis mian propran datumoj tipo, ke la aŭtoroj de C jaroj 356 00:16:32,470 --> 00:16:33,890 antaŭe ne pensis antaŭe. 357 00:16:33,890 --> 00:16:34,570 Sed neniu problemo. 358 00:16:34,570 --> 00:16:35,870 Mi povas fari tion mem. 359 00:16:35,870 --> 00:16:39,050 Do tiu estas tabelo nomata studentoj, ĉiu el kies membroj 360 00:16:39,050 --> 00:16:41,100 estas studento strukturo. 361 00:16:41,100 --> 00:16:44,270 Kaj mi volas tri el tiuj en la tabelo. 362 00:16:44,270 --> 00:16:46,030 >> Kaj nun, kion faras la reston de tiu programo faras? 363 00:16:46,030 --> 00:16:47,550 Mi bezonis iu iom arbitra. 364 00:16:47,550 --> 00:16:51,450 Tuj kiam de linio 24 pluen, Mi persisti de 0 al 3. 365 00:16:51,450 --> 00:16:54,000 Mi tiam demandas al la uzanto por la studenta nomo. 366 00:16:54,000 --> 00:16:56,110 Kaj tiam mi uzas GetString kiel antaŭe. 367 00:16:56,110 --> 00:16:59,410 Do mi petos la studenta domo, kaj mi uzas GetString kiel antaŭe. 368 00:16:59,410 --> 00:17:01,780 >> Sed avizo - iomete nova peco de sintakso - 369 00:17:01,780 --> 00:17:07,010 Mi povas ankoraŭ indekso al la i-a studento, sed kiel Mi alvenas ĉe la specifa datumoj 370 00:17:07,010 --> 00:17:08,354 kampo ene de la struct? 371 00:17:08,354 --> 00:17:11,770 Nu, kio estas ŝajne la nova peco de sintakso? 372 00:17:11,770 --> 00:17:13,339 Estas nur la skalara operatoro. 373 00:17:13,339 --> 00:17:14,510 >> Ni ne vere vidis tiun antaŭe. 374 00:17:14,510 --> 00:17:17,819 Vi jam vidis gxin en pset kvin se vi havas eniĝis en la jam kun bitmap dosierojn. 375 00:17:17,819 --> 00:17:22,372 Sed la skalara nur signifas ene de ĉi struct aŭ multnombraj kampoj, donu dot 376 00:17:22,372 --> 00:17:24,510 nomo, aŭ doni al mi dot domo. 377 00:17:24,510 --> 00:17:28,690 Tio signifas iras ene de la struct kaj akiri tiujn apartajn kampojn. 378 00:17:28,690 --> 00:17:30,200 >> Kion faras la reston de tiu programo faras? 379 00:17:30,200 --> 00:17:31,190 Ne ĉiuj kiuj sexy. 380 00:17:31,190 --> 00:17:34,640 Rimarku, ke mi persisti de 0 al 3 denove, kaj mi simple krei la angla 381 00:17:34,640 --> 00:17:40,500 frazo kiel tia kaj tia estas en tiaj kaj tia domo, pasante en dot nomon de 382 00:17:40,500 --> 00:17:43,320 la i-a lernanto kaj lia domo tiel. 383 00:17:43,320 --> 00:17:47,560 >> Kaj poste persiste, nun ni komencu akiri anal pri tio, nun ke ni estas 384 00:17:47,560 --> 00:17:49,580 familiara kun kio malloc kaj aliaj funkcioj estis 385 00:17:49,580 --> 00:17:50,570 faras ĉiu ĉi tempo. 386 00:17:50,570 --> 00:17:54,220 Kial mi devas liberiĝi ambaŭ nomo kaj domo, kvankam mi 387 00:17:54,220 --> 00:17:56,960 ne nomis malloc? 388 00:17:56,960 --> 00:17:58,020 >> GetString faris. 389 00:17:58,020 --> 00:18:00,930 Kaj tiu estis la malpura malgranda sekreto por kelkaj semajnoj, sed GetString havas 390 00:18:00,930 --> 00:18:03,530 iris filtrante memoro tra la tuta meti ĉiuj semestro tiom. 391 00:18:03,530 --> 00:18:05,990 Kaj valgrand volo fine malkaŝi tion al ni. 392 00:18:05,990 --> 00:18:10,730 >> Sed tio ne estas granda interkonsento, ĉar mi scias, ke mi povas simple liberigi la nomo 393 00:18:10,730 --> 00:18:15,750 kaj la domo, kvankam teknike, al estu super, super sekuraj, mi devus esti 394 00:18:15,750 --> 00:18:17,890 faras iun eraron kontrolinte tie. 395 00:18:17,890 --> 00:18:19,040 Kio estas via instinktoj diras al vi? 396 00:18:19,040 --> 00:18:22,480 Kion mi povas kontroli por antaŭ ol mi liberigi kio estas 397 00:18:22,480 --> 00:18:25,470 kordo, aka kiu char *? 398 00:18:25,470 --> 00:18:33,460 >> Mi devus vere esti kontrolanta se studentoj krampo i dot nomo ne 399 00:18:33,460 --> 00:18:34,840 egala nula. 400 00:18:34,840 --> 00:18:40,400 Tiam estos bone por antaŭeniri kaj libera ke pointer, kaj sama aŭ alian 401 00:18:40,400 --> 00:18:41,160 tiu siavice. 402 00:18:41,160 --> 00:18:46,860 Se lernantoj krampo i dot domo ne estas egala al nula, tiu nun protektos 403 00:18:46,860 --> 00:18:52,520 kontraŭ la angulo kazo en kiu GetString revenas iun kiel nula. 404 00:18:52,520 --> 00:18:57,310 Kaj ni vidis antaŭ momento, printf volo protekti nin ĉi tien ĝuste dirante 405 00:18:57,310 --> 00:18:58,990 nula, kiu tuj serĉos stranga. 406 00:18:58,990 --> 00:19:02,340 Sed almenaŭ ĝi ne segfault, kiel ni jam vidis. 407 00:19:02,340 --> 00:19:05,990 >> Nu, lasu min fari unu alia afero ĉi tie. structs-0 estas speco de stulta programo 408 00:19:05,990 --> 00:19:09,700 ĉar mi eniras tiun tutan datumojn, kaj poste ĝi estas perdita fojo la programo finiĝas. 409 00:19:09,700 --> 00:19:10,940 Sed lasu min antaŭeniri kaj fari ĉi tion. 410 00:19:10,940 --> 00:19:12,830 Lasu min fari la fina fenestro iom pli granda. 411 00:19:12,830 --> 00:19:17,000 Lasu min fari structs-1, kiu estas nova versio de ĉi. 412 00:19:17,000 --> 00:19:18,520 >> Mi zomi iomete. 413 00:19:18,520 --> 00:19:21,620 Kaj nun mi kuros dot slash structs-1. 414 00:19:21,620 --> 00:19:22,590 Studenta nomo - 415 00:19:22,590 --> 00:19:31,500 Davido Mather, ni faru Rob Kirkland, ni faru Lauren Leverett. 416 00:19:31,500 --> 00:19:33,650 Kio estas interesa nun estas avizo - 417 00:19:33,650 --> 00:19:35,540 kaj mi nur scias tion, ĉar Mi skribis la programon - 418 00:19:35,540 --> 00:19:38,930 ekzistas dosiero nun en mia aktuala dosierujon nomita students.csv. 419 00:19:38,930 --> 00:19:40,420 Iuj el vi eble vidis tiuj en la reala mondo. 420 00:19:40,420 --> 00:19:42,980 >> Kio estas CSV-dosiero? 421 00:19:42,980 --> 00:19:44,170 Komo-disigita valoroj. 422 00:19:44,170 --> 00:19:46,670 Estas iel kiel malriĉa homo, versio de Excel dosiero. 423 00:19:46,670 --> 00:19:50,580 Ĝi estas tablo de vicoj kaj kolumnoj, ke vi povas malfermi en programo kiel Excel, 424 00:19:50,580 --> 00:19:51,800 aŭ Nombroj sur Mac. 425 00:19:51,800 --> 00:19:55,180 >> Kaj se mi malfermas tiun dosieron ĉi tie sur gedit, avizo - kaj la numeroj ne estas tie. 426 00:19:55,180 --> 00:19:57,360 Tio nur gedit diri mi linio nombroj. 427 00:19:57,360 --> 00:19:59,740 Rimarku en la unua linio de tiu dosiero estas David kaj Mather. 428 00:19:59,740 --> 00:20:01,450 La sekva linio estas Rob komo Kirkland. 429 00:20:01,450 --> 00:20:04,170 Kaj la tria linio estas Lauren komo Leverett. 430 00:20:04,170 --> 00:20:05,480 >> Do kion mi kreis? 431 00:20:05,480 --> 00:20:09,580 Mi nun skribas C programon kiu efektive povas generi ŝtono 432 00:20:09,580 --> 00:20:11,840 kiu povas esti malfermita en programon kiel Excel. 433 00:20:11,840 --> 00:20:15,520 Ne ĉiuj kiuj konvinka datumoj aro, sed se vi havas multe pli grandaj pecoj de 434 00:20:15,520 --> 00:20:18,440 datumoj, ke vi efektive volas manipuli kaj fari grafikaĵoj de kaj la 435 00:20:18,440 --> 00:20:21,260 kiel, ĉi tiu estas eble unu maniero krei tiun datumoj. 436 00:20:21,260 --> 00:20:25,370 Cetere, CSVs estas fakte super komuna nur por stoki simpla datumo - 437 00:20:25,370 --> 00:20:28,940 Yahoo Financoj, ekzemple, se vi ricevas stock quotes tra iliaj tn 438 00:20:28,940 --> 00:20:33,180 API, la libera servo kiu permesas akiri aktualan supren-al-la-dato stoko 439 00:20:33,180 --> 00:20:35,650 citaĵojn por entreprenoj, ili doni la datumojn tie en la 440 00:20:35,650 --> 00:20:37,800 super simpla CSV formato. 441 00:20:37,800 --> 00:20:39,380 >> Do kiel ni faros tion? 442 00:20:39,380 --> 00:20:42,530 Nu rimarki, la plejparto de ĉi tiu programo preskaŭ la sama. 443 00:20:42,530 --> 00:20:46,870 Sed rimarkos cxi tie, anstataŭ presi la studentoj ekstere, sur linio 35 444 00:20:46,870 --> 00:20:51,040 antaŭen, mi asertas ke mi ŝparas la lernantoj al disko, do ŝpari dosieron. 445 00:20:51,040 --> 00:20:53,630 >> Do rimarki min deklari DOSIERO * - 446 00:20:53,630 --> 00:20:57,260 Nun, ĉi tiu estas speco de anomalio en C. Ial ajn DOSIERO estas ĉiuj kaskedoj, 447 00:20:57,260 --> 00:21:00,690 kiu ne estas kiel plej parto de aliaj datumtipoj en C. Sed ĉi tiu estas integrita 448 00:21:00,690 --> 00:21:02,320 datumtipo, DOSIERO *. 449 00:21:02,320 --> 00:21:05,900 Kaj mi deklari puntero al dosiero, Estas kiel vi povas pensi pri tio. 450 00:21:05,900 --> 00:21:08,070 >> fopen signifas malferma dosiero. 451 00:21:08,070 --> 00:21:09,470 Kio dosieron vi volas malfermi? 452 00:21:09,470 --> 00:21:12,620 Mi volas malfermi dosieron kiun mi volas arbitre nomas students.csv. 453 00:21:12,620 --> 00:21:14,480 Mi povus nomi kiun ajn mi volas. 454 00:21:14,480 --> 00:21:15,200 >> Kaj poste preni konjekton. 455 00:21:15,200 --> 00:21:18,960 Kion faras la dua argumento al fopen probable signifas? 456 00:21:18,960 --> 00:21:21,480 Ĝuste, w por skribi, ĉu esti r por legado. 457 00:21:21,480 --> 00:21:24,120 Tie estas por append se vi volas aldoni vicoj kaj ne 458 00:21:24,120 --> 00:21:25,200 anstataŭigi la tuta afero. 459 00:21:25,200 --> 00:21:28,005 >> Sed mi nur volas krei tiun dosieron fojon, do mi uzos citaĵo unquote w. 460 00:21:28,005 --> 00:21:31,880 Kaj mi scias, ke nur de esti legitaj la dokumentadon, aŭ la homo paĝo. 461 00:21:31,880 --> 00:21:35,100 Se dosiero estas ne nulaj - alivorte, se nenio misokazis tie - 462 00:21:35,100 --> 00:21:37,820 lasu min persisti pri la studentoj de 0 al 3. 463 00:21:37,820 --> 00:21:40,410 >> Kaj nun rimarkas ke estas io iam tiel iomete malsamajn 464 00:21:40,410 --> 00:21:42,110 pri linio 41 ĉi tie. 465 00:21:42,110 --> 00:21:42,960 Ĝi ne estas printf. 466 00:21:42,960 --> 00:21:46,530 Estas fprintf por dosiero printf. 467 00:21:46,530 --> 00:21:47,790 Do tuj skribi al dosiero. 468 00:21:47,790 --> 00:21:48,860 Kiun dosieron? 469 00:21:48,860 --> 00:21:53,630 La unu kies puntero vi specifas kiel la unua argumento. 470 00:21:53,630 --> 00:21:55,940 >> Tiam ni specifi formato kordo. 471 00:21:55,940 --> 00:21:59,660 Tiam ni precizigi kion string ni volas plug in por la unua procento s, kaj 472 00:21:59,660 --> 00:22:04,320 tiam alia variablo aŭ la dua procento s. 473 00:22:04,320 --> 00:22:06,760 Tiam ni fermas la dosieron kun fclose. 474 00:22:06,760 --> 00:22:09,380 Ol mi liberigi la memoron kiel antaŭe, kvankam Mi devas iri reen en kaj aldoni 475 00:22:09,380 --> 00:22:10,540 iuj ĉekojn por nula. 476 00:22:10,540 --> 00:22:12,090 >> Kaj tio estas ĝi. 477 00:22:12,090 --> 00:22:16,960 fopen, fprintf, fclose donas al mi la kapablo krei tekstaj dosieroj. 478 00:22:16,960 --> 00:22:19,640 Nun, vi vidos en problemo aro kvin, kiu engaĝas bildoj, vi uzos 479 00:22:19,640 --> 00:22:20,990 duumajn dosierojn anstataŭe. 480 00:22:20,990 --> 00:22:24,200 Sed fundamente, la ideo estas la sama, eĉ se la funkcioj vi instruos vin 481 00:22:24,200 --> 00:22:28,710 vidas estas iomete malsamaj. 482 00:22:28,710 --> 00:22:32,580 >> Do trombo tour, sed vi akiros tro familiara kun dosieron I/O-- 483 00:22:32,580 --> 00:22:34,960 enigo kaj eligo - kun pset kvin. 484 00:22:34,960 --> 00:22:38,607 Kaj demandojn pri la komenca fundamentojn tie? 485 00:22:38,607 --> 00:22:39,857 Jes? 486 00:22:39,857 --> 00:22:41,880 487 00:22:41,880 --> 00:22:43,710 >> Kio se vi provas liberigi nulan valoron? 488 00:22:43,710 --> 00:22:48,880 Mi kredas, krom libera alvenis al iom pli uzantamika, vi povas 489 00:22:48,880 --> 00:22:49,890 potenciale segfault. 490 00:22:49,890 --> 00:22:54,160 Pasante ĝin nula estas malbone ĉar mi ne kredu libera tedas por kontroli vin, 491 00:22:54,160 --> 00:22:57,330 ĉar estus potenciale esti restaĵoj de tempo por ĝin fari sin por 492 00:22:57,330 --> 00:22:59,022 ĉiuj en la mondo. 493 00:22:59,022 --> 00:23:00,590 Bona demando, kvankam. 494 00:23:00,590 --> 00:23:04,300 >> Bone, do ĉi tiu speco de gets nin al interesa temo. 495 00:23:04,300 --> 00:23:07,010 La temo de problemo aro kvin estas forensics. 496 00:23:07,010 --> 00:23:08,420 Almenaŭ tio estas parto de la problemo aro. 497 00:23:08,420 --> 00:23:12,030 Forensics ĝenerale rilatas al la reakiro de informo kiu povas aŭ 498 00:23:12,030 --> 00:23:14,110 povas ne esti forigita intence. 499 00:23:14,110 --> 00:23:18,680 Kaj do mi pensis mi volus doni al vi rapidan gusto de kio vere okazas ĉiu 500 00:23:18,680 --> 00:23:21,230 tiu tempo sub la kapuĉo de via komputilo. 501 00:23:21,230 --> 00:23:23,960 >> Ekzemple, se vi havas ene de via portebla aŭ via labortablo komputilo 502 00:23:23,960 --> 00:23:28,040 malmola disko, estas ĉu mekanika aparato kiu fakte ŝpinas - 503 00:23:28,040 --> 00:23:31,650 tie estas cirkla aĵoj nomata pladoj kiuj aspektas sufiĉe ŝatas kion mi 504 00:23:31,650 --> 00:23:34,540 nur havis sur la ekrano tie, kvankam ĉi tiu estas pli malnova lernejo. 505 00:23:34,540 --> 00:23:37,370 Tio estas tri-kaj-al-duono coloj malmola disko. 506 00:23:37,370 --> 00:23:40,070 Kaj tri kaj duona coloj raportas de kun de la afero kiam vi instalu ĝin 507 00:23:40,070 --> 00:23:40,890 en komputilo. 508 00:23:40,890 --> 00:23:44,890 >> Multaj el vi infanoj en viaj komputiloj nun havas solida stato diskoj, aŭ unuecoj SSD, 509 00:23:44,890 --> 00:23:46,260 kiuj ne movi partojn. 510 00:23:46,260 --> 00:23:49,170 Ili estas pli kiel RAM kaj malpli kiel tiuj mekanikaj aparatoj. 511 00:23:49,170 --> 00:23:51,450 Sed la ideoj daŭre estas la sama, certe kiel ili rilatas 512 00:23:51,450 --> 00:23:52,790 al problemo starigis kvin. 513 00:23:52,790 --> 00:23:57,400 >> Kaj se vi pensas nun malmola disko reprezentas esti rondo, kiu 514 00:23:57,400 --> 00:23:58,930 Mi desegnas kiel ĉi tie. 515 00:23:58,930 --> 00:24:02,290 Kiam vi kreas dosieron en via komputilo, ĉu ĝi estas SSD, aŭ en 516 00:24:02,290 --> 00:24:06,610 tiu kazo, plej granda lernejo malmola disko, tiu dosiero komprenas multnombraj bitoj. 517 00:24:06,610 --> 00:24:10,510 Diru ke temas pri tiu ĉi 0 kaj 1, tutan faskon de _0s_ kaj 1s. 518 00:24:10,510 --> 00:24:11,660 Do ĉi tiu estas mia tuta malmola disko. 519 00:24:11,660 --> 00:24:13,225 Tio estas ŝajne sufiĉe granda dosiero. 520 00:24:13,225 --> 00:24:18,080 Kaj oni uzas ĉe la _0s_ kaj 1s en tiu parton de la fizika plado. 521 00:24:18,080 --> 00:24:19,750 >> Nu, kio estas fizika parto? 522 00:24:19,750 --> 00:24:25,310 Nu, tio rezultas ke la malmola disko, almenaŭ de tiu tipo, ne estas 523 00:24:25,310 --> 00:24:27,340 tiuj etaj iom magnetaj eroj. 524 00:24:27,340 --> 00:24:32,630 Kaj ili esence havas nordo kaj suda polusoj al ili, tiel ke se vi 525 00:24:32,630 --> 00:24:35,710 turni unu el tiuj magnetaj eroj tiu formo, vi povus diri ke ĝi estas 526 00:24:35,710 --> 00:24:36,720 reprezentante 1. 527 00:24:36,720 --> 00:24:39,340 Kaj se ĝi estas renversita suden al nordo, vi povus diri ke ĝi estas 528 00:24:39,340 --> 00:24:40,390 reprezentante 0. 529 00:24:40,390 --> 00:24:43,660 >> Do, en la reala fizika mondo, jen kiel vi povis reprezenti ion 530 00:24:43,660 --> 00:24:45,670 duuma stato de la 0 kaj 1. 531 00:24:45,670 --> 00:24:46,720 Do jen ĉio dosiero estas. 532 00:24:46,720 --> 00:24:49,300 Ekzistas tuta amaso de magneta eroj kiuj estas iliaj tiu maniero aŭ 533 00:24:49,300 --> 00:24:51,920 tiamaniere, kreante ŝablonoj de _0s_ kaj 1s. 534 00:24:51,920 --> 00:24:56,760 >> Sed ĝi rezultas kiam vi konservos dosieron, iuj informoj estas savita aparte. 535 00:24:56,760 --> 00:25:00,000 Do tiu estas malgranda tablo, dosierujo, por tiel diri. 536 00:25:00,000 --> 00:25:05,810 Kaj Mi vokos tiu kolumno nomo, kaj Mi nomas tiun kolumnon loko. 537 00:25:05,810 --> 00:25:08,850 >> Kaj mi tuj diros, supozi ĉi tiu estas mia vivresumo. 538 00:25:08,850 --> 00:25:14,050 Mia resume.doc estas stokita en situo, diru 123. 539 00:25:14,050 --> 00:25:15,390 Mi ĉiam iras por tiu numero. 540 00:25:15,390 --> 00:25:18,810 Sed sufiĉas diri, ke nur ŝatis en RAM, vi povas preni malmolan diskon 541 00:25:18,810 --> 00:25:22,350 tio estas gigabajto aŭ 200 gigabajtoj aŭ terabajto, kaj vi povas 542 00:25:22,350 --> 00:25:23,750 numeron ĉiuj bajtoj. 543 00:25:23,750 --> 00:25:26,480 Vi povas kalkuli ĉiujn pecojn el 8 bitoj. 544 00:25:26,480 --> 00:25:29,030 >> Do ni diru ke tiu Estas situo 123. 545 00:25:29,030 --> 00:25:32,070 Do tiu ĉi dosierujo ene de mia mastruma Sistemo memoras, ke mia 546 00:25:32,070 --> 00:25:34,250 vivresumo estas je situo 123. 547 00:25:34,250 --> 00:25:36,850 Sed metas interesa kiam vi forviŝi dosieron. 548 00:25:36,850 --> 00:25:37,820 >> Do ekzemple - 549 00:25:37,820 --> 00:25:40,790 kaj dankeme, la plejparto de la mondo havas kaptita sur tio - kio okazas kiam 550 00:25:40,790 --> 00:25:45,040 vi treni dosieron al via Mac OS Trash aŭ via Windows Reutiliga Bin? 551 00:25:45,040 --> 00:25:48,290 552 00:25:48,290 --> 00:25:50,510 Kio estas la celo de fari tion? 553 00:25:50,510 --> 00:25:53,860 Estas evidente por forigi la dosieron, sed kion faras la akto de trenante kaj 554 00:25:53,860 --> 00:25:57,550 delasante en viajn Trash aŭ vian Reutiliga Bin fari per komputilo? 555 00:25:57,550 --> 00:25:59,230 >> Absolute nenio, vere. 556 00:25:59,230 --> 00:26:00,320 Estas nur kiel dosierujo. 557 00:26:00,320 --> 00:26:01,800 Ĝi estas speciala dosierujo, certe. 558 00:26:01,800 --> 00:26:04,460 Sed tio ĝi efektive forigi la dosieron? 559 00:26:04,460 --> 00:26:06,780 >> Nu, ne, ĉar kelkaj el vi verŝajne estis kiel, oh damn, vi ne 560 00:26:06,780 --> 00:26:07,420 intencas fari tion. 561 00:26:07,420 --> 00:26:09,130 Do vi duoble klaku la Trash aŭ Reutiliga Bin. 562 00:26:09,130 --> 00:26:11,630 Vi poked ĉirkaŭe kaj vi reakiris la dosieron nur trenante ĝin 563 00:26:11,630 --> 00:26:12,110 el tie. 564 00:26:12,110 --> 00:26:14,420 Do klare, ne nepre viŝi ĝin. 565 00:26:14,420 --> 00:26:15,990 >> OK, vi estas pli inteligenta ol tio. 566 00:26:15,990 --> 00:26:18,860 Vi scias, ke ĝuste trenante ĝin en la Trash aŭ Reutiliga Bin ne signifas 567 00:26:18,860 --> 00:26:19,930 vi malplenigi la rubujon. 568 00:26:19,930 --> 00:26:24,110 Do vi iru al la menuo, kaj vi diras Malplena Trash aŭ Malplena Reutiliga Bin. 569 00:26:24,110 --> 00:26:25,360 Tiam kio okazas? 570 00:26:25,360 --> 00:26:29,070 571 00:26:29,070 --> 00:26:32,530 >> Jes, do ĝi estas forigita pli. 572 00:26:32,530 --> 00:26:37,660 Sed cxio, kio okazas estas tiu. 573 00:26:37,660 --> 00:26:45,350 La komputilo forgesas kie resume.doc estis. 574 00:26:45,350 --> 00:26:47,400 >> Sed kio ne ŝanĝis ŝajne en la bildo? 575 00:26:47,400 --> 00:26:51,390 576 00:26:51,390 --> 00:26:55,570 La bitoj, la _0s_ kaj 1s ke mi asertas estas en la loko de iu fizika aspekto de 577 00:26:55,570 --> 00:26:56,280 la aparataro. 578 00:26:56,280 --> 00:26:57,110 Ili estas ankoraŭ tie. 579 00:26:57,110 --> 00:26:58,930 Estas nur la komputilo havas forgesis, kio ili estas. 580 00:26:58,930 --> 00:27:03,160 >> Do ĝi estas esence liberigis la dosiero bitojn por ke ili povas reuzi. 581 00:27:03,160 --> 00:27:06,940 Sed ne ĝis vi krei pli dosierojn, kaj pli dosierojn, kaj pli dosierojn volo 582 00:27:06,940 --> 00:27:12,150 probabilísticamente, tiuj _0s_ kaj 1s, tiuj magnetaj eroj, get reuzi, 583 00:27:12,150 --> 00:27:16,220 upside aŭ dekstra flanko, cxar aliaj dosieroj, _0s_ kaj 1s. 584 00:27:16,220 --> 00:27:17,980 >> Do vi havas ĉi fenestro de tempo. 585 00:27:17,980 --> 00:27:19,860 Kaj ne de antaŭvideblaj longitudo, vere. 586 00:27:19,860 --> 00:27:22,240 Ĝi dependas de la grandeco de via malmola drive kaj kiom da dosieroj vi havas kaj 587 00:27:22,240 --> 00:27:23,490 kiel rapide vi faru novajn. 588 00:27:23,490 --> 00:27:27,050 Sed estas ĉi fenestro de tempo dum kiu tiu dosiero estas ankoraŭ perfekte 589 00:27:27,050 --> 00:27:27,770 recuperable. 590 00:27:27,770 --> 00:27:31,050 >> Do, se vi iam uzi programojn kiel McAfee aŭ Norton por provi reakiri 591 00:27:31,050 --> 00:27:35,680 datumoj, ĉiuj ili faras provas reakiri ĉi tn dosierujo 592 00:27:35,680 --> 00:27:37,340 eltrovi kie estas via dosiero estis. 593 00:27:37,340 --> 00:27:40,605 Kaj kelkfoje Norton kaj diros: dosiero 93% recuperable. 594 00:27:40,605 --> 00:27:42,020 Nu, kion tio signifas? 595 00:27:42,020 --> 00:27:45,690 Tio nur signifas, ke iu alia dosiero hazarde finis uzante, ekzemple, 596 00:27:45,690 --> 00:27:48,920 tiuj bitoj el via originala dosiero. 597 00:27:48,920 --> 00:27:51,950 >> Do kio estas reale implikita en reakiri datumoj? 598 00:27:51,950 --> 00:27:55,720 Nu, se vi ne havas ion kiel Norton antaŭ-instalita sur via komputilo, 599 00:27:55,720 --> 00:27:59,510 la plej bona vi povas iam fari estas rigardi en la tuta malmola disko serĉi 600 00:27:59,510 --> 00:28:00,510 mastroj de bitoj. 601 00:28:00,510 --> 00:28:05,350 Kaj unu el la temoj de problemo aro kvin estas ke vi sercxos la 602 00:28:05,350 --> 00:28:09,570 ekvivalento de malmola disko, kun jura bildo de kompakta flash karto de 603 00:28:09,570 --> 00:28:13,660 cifereca fotilo, serĉante la _0s_ kaj 1s kiu tipe, kun altaj 604 00:28:13,660 --> 00:28:16,720 probablo, ili reprezentas la komenci de JPEG-bildon. 605 00:28:16,720 --> 00:28:21,120 >> Kaj vi infanoj povas reakiri tiujn bildojn de supozante, se mi vidas tiun bildon de 606 00:28:21,120 --> 00:28:24,380 bitoj en la jura bildo, kun alta probablo, kiu markas 607 00:28:24,380 --> 00:28:25,650 la komenco de JPEG. 608 00:28:25,650 --> 00:28:29,520 Kaj se mi vidas la saman desegnon denove, ke probable markas la komencon de 609 00:28:29,520 --> 00:28:32,440 alia JPEG, kaj alia JPEG, kaj alia JPEG. 610 00:28:32,440 --> 00:28:34,970 Kaj jen estas tipe kiel datumoj reakiro funkcios. 611 00:28:34,970 --> 00:28:37,870 Kio estas agrable pri JPEG-oj estas kvankam la formato de dosiero mem estas iom 612 00:28:37,870 --> 00:28:44,400 kompleksa, la komenco de ĉiu tia dosiero estas fakte sufiĉe identigebla 613 00:28:44,400 --> 00:28:47,370 kaj simpla, kiel vi vidos, se vi havas ne jam. 614 00:28:47,370 --> 00:28:50,270 >> Do ni prenu pli proksiman rigardon sube la kapuĉo pri ekzakte kio estis 615 00:28:50,270 --> 00:28:53,360 oni iris kaj kion tiuj _0s_ kaj 1s estas, por doni al vi iom pli ol 616 00:28:53,360 --> 00:28:55,330 kunteksto por tiu aparta defio. 617 00:28:55,330 --> 00:28:55,510 >> [VIDEO reprodukto] 618 00:28:55,510 --> 00:28:58,700 >> -Kie via PC stokas plej el lia permanenta datumoj. 619 00:28:58,700 --> 00:29:03,390 Por fari tion, la datumoj vojaĝas de RAM kune kun la programaro signalojn kiuj rakontas 620 00:29:03,390 --> 00:29:06,110 la malmola disko kiel memori ke la datumoj. 621 00:29:06,110 --> 00:29:09,410 La malmola disko cirkvitoj traduki tiujn signalojn en tensio 622 00:29:09,410 --> 00:29:10,870 fluktuoj. 623 00:29:10,870 --> 00:29:14,970 Tio, siavice, kontroli la malmola disko de movi partojn, iuj el la malmultaj 624 00:29:14,970 --> 00:29:17,910 movi partojn restigis en la moderna komputilo. 625 00:29:17,910 --> 00:29:22,130 >> Kelkaj el la signaloj kontroli motoro kiuj ŝpinas metalo-kovrita pladoj. 626 00:29:22,130 --> 00:29:25,470 Viaj datumoj estas vere stokita sur ĉi tiuj pladoj. 627 00:29:25,470 --> 00:29:28,610 Aliaj signaloj movi la legado / skribo kapoj por legi aŭ 628 00:29:28,610 --> 00:29:30,710 skribi datumojn sur la pladoj. 629 00:29:30,710 --> 00:29:35,450 Ĉi maŝinaro tiel preciza ke homa hararo eĉ ne povis pasi inter la 630 00:29:35,450 --> 00:29:37,280 kapojn kaj ŝpini pladoj. 631 00:29:37,280 --> 00:29:40,316 Tamen, ĉio laboras en terura rapidoj. 632 00:29:40,316 --> 00:29:40,660 >> [FINO reprodukto de vídeo] 633 00:29:40,660 --> 00:29:42,190 >> DAVID Malan: Zoom en iom profunda nun kio estas 634 00:29:42,190 --> 00:29:44,360 fakte en tiuj pladoj. 635 00:29:44,360 --> 00:29:44,720 >> [VIDEO reprodukto] 636 00:29:44,720 --> 00:29:47,660 >> -Ni rigardu kion ni ĵus vidis en malrapida movado. 637 00:29:47,660 --> 00:29:51,710 Kiam mallonga premas de elektro estas sendita al la legado / skribi kapo, se klakas 638 00:29:51,710 --> 00:29:54,650 sur eta elektromagneta por frakcio de sekundo. 639 00:29:54,650 --> 00:29:58,970 La magneto kreas kampo, kiu ŝanĝas la polarity de eta, eta 640 00:29:58,970 --> 00:30:02,850 parton de la metalo eroj kiuj coat ĉiu plado surfaco. 641 00:30:02,850 --> 00:30:05,940 >> Al ŝablono serio de tiuj etaj, akuzita-supren areoj sur la disko 642 00:30:05,940 --> 00:30:08,470 reprezentas unuopa bito de datumojn en la duuma nombro 643 00:30:08,470 --> 00:30:10,530 sistemo uzita de komputiloj. 644 00:30:10,530 --> 00:30:13,775 Nun, se la nuna estas sendita unu vojo tra la legado / skribo kapo, la areo 645 00:30:13,775 --> 00:30:15,970 estas polarizita en unu direkto. 646 00:30:15,970 --> 00:30:17,950 Se la nuna estas sendita en la kontraŭa direkto, la 647 00:30:17,950 --> 00:30:19,930 polarizo estas inversa. 648 00:30:19,930 --> 00:30:22,370 >> Kiel vi akiras datumoj sur la fiksa disko? 649 00:30:22,370 --> 00:30:24,090 Nur inversigi la procezo. 650 00:30:24,090 --> 00:30:26,550 Do estas la eroj en la disko kiu alvenas la fluo en la 651 00:30:26,550 --> 00:30:27,960 legi / skribi kapo moviĝas. 652 00:30:27,960 --> 00:30:30,700 Kunmetis milionojn da tiuj imantado segmentoj, kaj 653 00:30:30,700 --> 00:30:32,160 vi havas dosieron. 654 00:30:32,160 --> 00:30:36,060 >> Nun, la pecoj de sola dosiero eble disigxos ĉie unueco de 655 00:30:36,060 --> 00:30:39,970 pladoj, speco de kiel la katastrofo de paperoj sur via skribotablo. 656 00:30:39,970 --> 00:30:43,500 Do speciala ekstra dosieron sekvadon de kie ĉiu. 657 00:30:43,500 --> 00:30:45,985 Ĉu vi ne deziras, ke vi havis io simila? 658 00:30:45,985 --> 00:30:46,470 >> [FINO reprodukto de vídeo] 659 00:30:46,470 --> 00:30:47,820 >> DAVID Malan: Bone, verŝajne ne. 660 00:30:47,820 --> 00:30:52,070 Do kiel multaj el vi infanoj kreskis kun tiuj? 661 00:30:52,070 --> 00:30:53,970 Bone, do ĝi estas malpli kaj malpli manoj ĉiu jaro. 662 00:30:53,970 --> 00:30:56,550 Sed mi ĝojas ke vi estas almenaŭ familiara kun ili, ĉar ĉi tiu kaj nia propra 663 00:30:56,550 --> 00:31:00,520 libro demo, malfeliĉe, mortas tre malrapida morto tie de familiareco. 664 00:31:00,520 --> 00:31:04,010 >> Sed ĉi tiu estas kion mi, almenaŭ, tie en alta lernejo, uzis uzon por kopioj. 665 00:31:04,010 --> 00:31:08,110 Kaj estis mirinda, ĉar vi povus stoki 1.4 megabajtoj sur 666 00:31:08,110 --> 00:31:08,930 tiu aparta disko. 667 00:31:08,930 --> 00:31:12,260 Kaj tio estis la alta denseco versio, kiel indikitaj de la HD, kiu havas 668 00:31:12,260 --> 00:31:14,240 signifas antaŭ la hodiaŭa HD filmetoj. 669 00:31:14,240 --> 00:31:16,400 >> Norma denseso 800 kilobajtoj. 670 00:31:16,400 --> 00:31:18,640 Kaj antaŭ tio, estis 400-kilobajto diskoj. 671 00:31:18,640 --> 00:31:23,120 Kaj antaŭ tio, estis 5 kaj 1/4 colo diskojn, kio estis vere disketon, 672 00:31:23,120 --> 00:31:25,680 kaj iom pli larĝa kaj pli altkreska ol tiuj aĵoj ĉi tie. 673 00:31:25,680 --> 00:31:29,150 Sed vi povas fakte vidi la tn disketon aspekto de tiuj diskoj. 674 00:31:29,150 --> 00:31:32,630 >> Kaj funkcie, ili estas efektive sufiĉe simila al malmolaj diskoj de ĉe 675 00:31:32,630 --> 00:31:33,570 Almenaŭ tiu tipo. 676 00:31:33,570 --> 00:31:37,270 Denove, unuecoj SSD en pli novaj komputiloj labori iom malsame. 677 00:31:37,270 --> 00:31:41,530 Sed se vi movas ke iom metalo langeto, vi povas fakte vidi iom kuketo, 678 00:31:41,530 --> 00:31:42,560 aŭ plado. 679 00:31:42,560 --> 00:31:43,830 >> Ne estas metalo kiel ĉi tiu. 680 00:31:43,830 --> 00:31:46,000 Ĉi tiu fakte iuj malkaraj mola materialo. 681 00:31:46,000 --> 00:31:46,750 Kaj vi povas ia movi ĝin. 682 00:31:46,750 --> 00:31:50,310 Kaj vi trully ĵus forviŝis de sur kelkaj nombro de bitoj aŭ magneta eroj 683 00:31:50,310 --> 00:31:51,220 el tiu ĉi disko. 684 00:31:51,220 --> 00:31:52,710 >> Do dankeme, estas nenio en ĝi. 685 00:31:52,710 --> 00:31:55,790 Se tio afero estas en la maniero - kaj kovru viaj okuloj kaj tiuj de via proksimulo - 686 00:31:55,790 --> 00:31:58,865 vi povas nur ia tiri tiun tuta ingon ekstere tiel. 687 00:31:58,865 --> 00:32:01,900 Sed estas iom printempo, do estu konscias pri tio kun viaj okuloj. 688 00:32:01,900 --> 00:32:03,620 Do nun vi havas vere disketo. 689 00:32:03,620 --> 00:32:07,090 >> Kaj kio estas rimarkinda pri tiu estas ke en tiom kiom tio estas 690 00:32:07,090 --> 00:32:10,830 malgrandskala reprezento de pli granda malmola disko, tiuj aferoj estas super, 691 00:32:10,830 --> 00:32:11,590 super simpla. 692 00:32:11,590 --> 00:32:15,170 Se vi pinĉi la fundo de tio, nun ke ke metalo afero estas for, kaj senŝeligi 693 00:32:15,170 --> 00:32:20,990 ilin malfermi, la tuta estas estas du pecojn de sentis kaj la tn disketo 694 00:32:20,990 --> 00:32:22,930 kun peco de metalo sur la enen. 695 00:32:22,930 --> 00:32:25,990 >> Kaj iras duono de mia disko la enhavo. 696 00:32:25,990 --> 00:32:27,540 Tie iras alia duono de ili. 697 00:32:27,540 --> 00:32:31,375 Sed tio estas cxio, kion ŝpinis ene de via komputilo en la pasintaj tempoj. 698 00:32:31,375 --> 00:32:35,220 699 00:32:35,220 --> 00:32:38,310 >> Kaj denove, por meti ĉi tion en perspektivon, kiom granda estas la plimulto de via 700 00:32:38,310 --> 00:32:39,560 malmola pelas tiuj tagoj? 701 00:32:39,560 --> 00:32:41,960 702 00:32:41,960 --> 00:32:46,230 500 gigabajtoj, oni terabajto, eble en labortabla komputilo, 2 terabytes, 3 703 00:32:46,230 --> 00:32:47,630 terabytes, 4 terabytes, ĉu ne? 704 00:32:47,630 --> 00:32:52,480 Tiu estas unu megabajto, donos nek prenos, kio povas eĉ persvadis tipa MP3 705 00:32:52,480 --> 00:32:55,310 plu tiujn tagojn, aŭ iu simila muziko dosiero. 706 00:32:55,310 --> 00:32:59,500 >> Do iom memoraĵo por vi hodiaŭ, kaj ankaŭ por helpi contextualizar kio 707 00:32:59,500 --> 00:33:03,570 ni prenos por sentado nun en problemo starigis kvin. 708 00:33:03,570 --> 00:33:04,820 Tuj kiam tiuj estas via gardi. 709 00:33:04,820 --> 00:33:07,340 710 00:33:07,340 --> 00:33:13,370 Do mi transiro al kie estos elspezante la sekvanta pset tiel. 711 00:33:13,370 --> 00:33:18,470 Do ni nun povas tion paĝon por - oh, kelkaj anoncoj rapide. 712 00:33:18,470 --> 00:33:21,730 >> Ĉi tiu vendredo, se vi ŝatus aliĝi CS50 por tagmanĝi, iru al la kutima loko, 713 00:33:21,730 --> 00:33:23,610 cs50.net/rsvp. 714 00:33:23,610 --> 00:33:25,100 Kaj fina projekto - 715 00:33:25,100 --> 00:33:28,520 tiel por la Syllabus, ni eldonis la fina projekto specifo jam. 716 00:33:28,520 --> 00:33:31,410 Konscii, ke tio ne signifas ĝi estas pro aparte frue. 717 00:33:31,410 --> 00:33:33,990 Ĝi estas eldonita, vere, nur por akiri you guys pensante pri ĝi. 718 00:33:33,990 --> 00:33:37,620 Kaj efektive, la super signifa procento de vi estos pritrakti 719 00:33:37,620 --> 00:33:40,780 fina projektojn en materialo, ke ni eĉ ne alvenis al la klaso, 720 00:33:40,780 --> 00:33:42,730 sed volo kiel frua kiel venontan semajnon. 721 00:33:42,730 --> 00:33:45,530 >> Rimarku, tamen, ke la spec vokas kelkaj diversaj komponantoj de la 722 00:33:45,530 --> 00:33:46,190 fina projekto. 723 00:33:46,190 --> 00:33:49,590 La unua, en kelkaj semajnoj, estas antaŭ-propono, bela hazarda retpoŝton al 724 00:33:49,590 --> 00:33:52,760 via TF por diri al li, kaj kion vi estas pensi pri via projekto, kun 725 00:33:52,760 --> 00:33:53,650 neniu devontigo. 726 00:33:53,650 --> 00:33:56,710 Propono estos via aparta devontigo, dirante, tie, tio estas kio 727 00:33:56,710 --> 00:33:57,770 Mi ŝatus fari por mia projekto. 728 00:33:57,770 --> 00:33:58,250 Kion vi opinias? 729 00:33:58,250 --> 00:33:58,650 Tro granda? 730 00:33:58,650 --> 00:33:59,145 Tro malgranda? 731 00:33:59,145 --> 00:34:00,330 Ĉu regebla? 732 00:34:00,330 --> 00:34:02,230 Kaj vi vidos la spec por pli da detaloj. 733 00:34:02,230 --> 00:34:05,060 >> Paro de semajnoj post tio estas la statuso raporto, kiu estas simile 734 00:34:05,060 --> 00:34:08,260 hazardaj retmesaĝon al via TF diri kiom malproksime malantaŭ vi estas en via fina 735 00:34:08,260 --> 00:34:12,360 projekto efektivigo, sekvate de la CS50 Hackathon al kiu ĉiuj 736 00:34:12,360 --> 00:34:17,520 estas invitita, kiu estos evento de 8:00 PM sur unu vesperon ĝis 7:00 737 00:34:17,520 --> 00:34:19,150 AM la sekva mateno. 738 00:34:19,150 --> 00:34:22,560 Pico, kiel mi menciis en la semajno nulo, wil utili je 9:00 PM, 739 00:34:22,560 --> 00:34:24,120 Ĉina manĝo je 1:00 AM. 740 00:34:24,120 --> 00:34:27,929 Kaj se vi estas ankoraŭ viglaj je 5:00 AM, ni prenos vin al IHOP por matenmanĝo. 741 00:34:27,929 --> 00:34:31,310 >> Do la Hackathon estas unu el la plej memorindaj travivaĵoj en la klaso. 742 00:34:31,310 --> 00:34:35,290 Tiam la efektivigo estas pro, kaj tiam la klimataj CS50 Foiro. 743 00:34:35,290 --> 00:34:38,070 Pliaj detaloj sur ĉiuj de ĉi tiuj en la semajnoj venonta. 744 00:34:38,070 --> 00:34:40,739 >> Sed ni reiru al io malnova lernejo - 745 00:34:40,739 --> 00:34:41,920 denove, tabelo. 746 00:34:41,920 --> 00:34:45,040 Do tabelo estis bela, ĉar ĝi solvas problemoj kiel ni vidis nur 747 00:34:45,040 --> 00:34:49,290 antaŭ momento kun studento strukturoj ricevas iom ekstere de kontrolo, se ni 748 00:34:49,290 --> 00:34:52,405 volas havi studento unu, studento du, studento tri, studento dot dot dot, 749 00:34:52,405 --> 00:34:54,400 iuj arbitraj nombro de studentoj. 750 00:34:54,400 --> 00:34:58,850 >> Do arrays, kelkajn semajnojn, abrupte malsuprenflugis en kaj solvitaj ĉiuj niaj problemoj de ne 751 00:34:58,850 --> 00:35:03,340 sciante anticipe kiom da aferoj de iu tipo ni volas. 752 00:35:03,340 --> 00:35:07,390 Kaj ni vidis ke structs povas helpi nin plu organizi niajn kodo kaj teni 753 00:35:07,390 --> 00:35:11,660 koncepte simila variabloj, kiel nomo kaj domo, kune, tiel, ke ni 754 00:35:11,660 --> 00:35:15,570 povas trakti ilin kiel unu enton, ene de kiuj estas pli malgrandaj pecoj. 755 00:35:15,570 --> 00:35:17,810 >> Sed arrays havas iujn malfacilaĵojn. 756 00:35:17,810 --> 00:35:19,780 Kio estas kelkaj el la malavantaĝoj ni renkontis 757 00:35:19,780 --> 00:35:22,320 kun arrays tiel multe? 758 00:35:22,320 --> 00:35:23,450 Kio estas tio? 759 00:35:23,450 --> 00:35:28,130 Fiksa grandeco - do eĉ kvankam vi povus povos rezervi memoron por 760 00:35:28,130 --> 00:35:32,310 tabelo, unufoje vi scias, kiel multaj studentoj vi havas, kiom da signoj vi havas 761 00:35:32,310 --> 00:35:35,460 de la uzanto, unufoje vi jam asignitaj la tabelo, vi ia pentrita 762 00:35:35,460 --> 00:35:36,740 vin en angulon. 763 00:35:36,740 --> 00:35:40,600 >> Ĉar vi ne povas enmeti novajn elementojn en la mezo de tabelo. 764 00:35:40,600 --> 00:35:43,660 Vi ne povas enigi pli elementoj fine de tabelo. 765 00:35:43,660 --> 00:35:47,750 Vere, vi devas veni al kreante tute nova tabelo, kiel ni diskutis, 766 00:35:47,750 --> 00:35:49,320 kopiante la malnova al la nova. 767 00:35:49,320 --> 00:35:52,610 Kaj denove, tio estas la kapdoloro, ke GetString traktas por vi. 768 00:35:52,610 --> 00:35:56,170 >> Sed denove, vi ne povas eĉ enmeti io en la mezo de la tabelo 769 00:35:56,170 --> 00:35:58,200 se la ritmo ne tute plenigis. 770 00:35:58,200 --> 00:36:03,010 Ekzemple, se ĉi tiu tabelo tie de grandeco ses nur havas kvin aĵojn en ĝi, 771 00:36:03,010 --> 00:36:06,080 bone, vi povus simple Tack io sur la fino. 772 00:36:06,080 --> 00:36:08,200 Sed kion se vi volas enmeti ion en la mezo de la 773 00:36:08,200 --> 00:36:11,280 tabelo, kvankam tio povus havi kvin el ses aferoj en ĝi? 774 00:36:11,280 --> 00:36:14,250 >> Nu, kion ni faros kiam ni havis ĉiujn de nia homa volontuloj scenejo en 775 00:36:14,250 --> 00:36:15,110 semajnoj estinteco? 776 00:36:15,110 --> 00:36:18,710 Se ni volis meti iun ĉi tie, ĉu tiuj homoj kiel movi ĉi 777 00:36:18,710 --> 00:36:22,540 vojo, aŭ tiuj homoj kiel movi ĉi maniero, kaj tio fariĝis multekosta. 778 00:36:22,540 --> 00:36:26,950 La movo de homoj ene de tabelo finis adicianta supren kaj kostante 779 00:36:26,950 --> 00:36:31,240 ni tempon, do multaj el niaj n kvadratoj kurante tempoj kiel inserción varon, por 780 00:36:31,240 --> 00:36:32,550 Ekzemple, en la plej malbona kazo. 781 00:36:32,550 --> 00:36:36,520 Do arrays estas grandaj, sed devas scii anticipe kiel granda vi volas ilin. 782 00:36:36,520 --> 00:36:38,030 >> Do okej, jen solvo. 783 00:36:38,030 --> 00:36:43,860 Se mi ne scias anticipe kiom da lernantoj mi havu, kaj mi scias unufoje 784 00:36:43,860 --> 00:36:47,870 Mi decidas, kvankam, mi ne scias kie trovi kun tiu multaj lernantoj, kial mi ne ĝuste ĉiam 785 00:36:47,870 --> 00:36:51,740 destini duoble da spaco kiel mi povis pensi mi bezonas? 786 00:36:51,740 --> 00:36:54,450 Ĉu tio ne estas racia solvo? 787 00:36:54,450 --> 00:36:58,240 >> Realisme, mi ne pensas ke ni estas tuj bezonos pli ol 50 fendoj 788 00:36:58,240 --> 00:37:02,190 en tabelo por meza grandeco klaso, do ni nur rondigi supren. 789 00:37:02,190 --> 00:37:07,040 Mi faros 100 fendoj en mia tabelo, nur tiel ke ni povos definitive akiri la 790 00:37:07,040 --> 00:37:10,330 nombro de studentoj mi anticipas esti en iu meza grandeco klaso. 791 00:37:10,330 --> 00:37:14,320 Do kial ne simple rondigi supren kaj destini pli memoro, tipe, por tabelo 792 00:37:14,320 --> 00:37:16,290 ol vi kredas ke vi povus eĉ bezonas? 793 00:37:16,290 --> 00:37:20,190 Kio estas tio simpla pushback al tiu ideo? 794 00:37:20,190 --> 00:37:21,440 >> Vi simple malŝparas memoro. 795 00:37:21,440 --> 00:37:25,350 Laŭvorte ĉiu programo skribas tiam Estas eble uzi duoble da memoro kiel 796 00:37:25,350 --> 00:37:26,680 vi fakte bezonas. 797 00:37:26,680 --> 00:37:28,990 Kaj tio simple ne sentas min kiel aparte eleganta solvo. 798 00:37:28,990 --> 00:37:31,990 Cetere, nur malpliigas la probablo de problemo. 799 00:37:31,990 --> 00:37:35,300 Se vi hazarde havas popularan kurson unu semestro kaj vi havas 101 800 00:37:35,300 --> 00:37:39,610 studentoj, via programo estas ankoraŭ fundamente alfrontante la saman temon. 801 00:37:39,610 --> 00:37:44,280 >> Do dankeme, estas solvo por ĉi tiun anoncon ĉiuj niaj problemoj en la formo 802 00:37:44,280 --> 00:37:46,790 de datumstrukturoj, kiuj estas pli kompleksaj ol tiuj, 803 00:37:46,790 --> 00:37:47,970 ni vidis tiom. 804 00:37:47,970 --> 00:37:50,530 Tio, mi asertas, estas lerta kunligita. 805 00:37:50,530 --> 00:37:51,920 Jen listo de nombroj - 806 00:37:51,920 --> 00:37:54,970 9, 17, 22, 26, kaj 34 - 807 00:37:54,970 --> 00:38:00,120 kiuj estis kunligitaj per vojo de kio mi desegnita kiel sagoj. 808 00:38:00,120 --> 00:38:03,580 >> En aliaj vortoj, se mi volis reprezenti tabelo, mi povis fari 809 00:38:03,580 --> 00:38:04,910 iu kiel ĉi tio. 810 00:38:04,910 --> 00:38:07,310 Kaj Mi metos tion en la superkape en nur momento. 811 00:38:07,310 --> 00:38:09,970 Mi povus fari - 812 00:38:09,970 --> 00:38:12,520 saluton, tute certe. 813 00:38:12,520 --> 00:38:14,470 Stand by. 814 00:38:14,470 --> 00:38:17,360 Nova komputilo tie, klara - 815 00:38:17,360 --> 00:38:18,090 tute certe. 816 00:38:18,090 --> 00:38:21,730 >> Do, se mi havas ĉi tiujn numerojn en tabelo - 817 00:38:21,730 --> 00:38:28,880 9, 17, 22, 26, 24 - 818 00:38:28,880 --> 00:38:30,530 ne nepre por grimpi. 819 00:38:30,530 --> 00:38:33,730 Bone, do jen mia tabelo - 820 00:38:33,730 --> 00:38:34,980 oh my god. 821 00:38:34,980 --> 00:38:38,700 822 00:38:38,700 --> 00:38:40,395 Bone, do jen mia tabelo. 823 00:38:40,395 --> 00:38:44,110 824 00:38:44,110 --> 00:38:45,050 Ho, mia dio. 825 00:38:45,050 --> 00:38:48,820 >> [Ridado] 826 00:38:48,820 --> 00:38:49,440 >> DAVID Malan: ŝajnigi. 827 00:38:49,440 --> 00:38:52,330 Ĝi estas tro multa peno reiri kaj fiksi ke, tial tie - 828 00:38:52,330 --> 00:38:54,290 26. 829 00:38:54,290 --> 00:38:57,650 Do ni havas ĉi tiun tabelo de 9, 17, 22, 26, kaj 34. 830 00:38:57,650 --> 00:39:00,260 Por tiuj el vi povas vidi la hontinda eraro mi ĵus faris, 831 00:39:00,260 --> 00:39:00,830 tie ĝi estas. 832 00:39:00,830 --> 00:39:04,490 >> Do mi asertas ke ĉi tiu estas tre efika solvo. 833 00:39:04,490 --> 00:39:07,310 Mi destinis kiel multaj ints kiel Mi bezonas - unu, du, tri, 834 00:39:07,310 --> 00:39:09,100 kvar, kvin, ses aŭ - 835 00:39:09,100 --> 00:39:11,660 kaj mi tiam stokitaj la numeroj ene de ĉi tabelo. 836 00:39:11,660 --> 00:39:15,220 Sed supozu, do, mi volas enmeti valoro kiel la numero 8? 837 00:39:15,220 --> 00:39:16,100 Nu, kie ĝi iras? 838 00:39:16,100 --> 00:39:18,530 Supozu mi volas enmeti nombro kiel 20. 839 00:39:18,530 --> 00:39:19,790 Nu, kie ĝi iras? 840 00:39:19,790 --> 00:39:23,160 Ie tie, en la mezo, aŭ la nombro 35 havas iri 841 00:39:23,160 --> 00:39:24,010 ie ĉe la fino. 842 00:39:24,010 --> 00:39:25,320 Sed mi estas ĉiu el la spaco. 843 00:39:25,320 --> 00:39:29,120 >> Kaj tiel tio estas fundamenta defio de arrays tio estas la solvo. 844 00:39:29,120 --> 00:39:32,280 Mi asertis antaŭ momento, GetString solvas tiun problemon. 845 00:39:32,280 --> 00:39:37,380 Se vi volas enmeti sesa nombro en ĉi tiu tabelo, kio estas almenaŭ unu 846 00:39:37,380 --> 00:39:40,090 solvo povas refalis sur sekura, same kiel ni faras kun GetString? 847 00:39:40,090 --> 00:39:44,340 848 00:39:44,340 --> 00:39:46,030 Kio estas tio? 849 00:39:46,030 --> 00:39:48,190 >> Nu, fari ĝin pli granda estas facile dirite ol farite. 850 00:39:48,190 --> 00:39:52,810 Ni ne povas nepre fari la tabelo pli grandaj, sed kion ni povas fari? 851 00:39:52,810 --> 00:39:56,570 Faru nova tabelo kiu estas pli granda, de grandeco 6, aŭ eble grandeco 10, se ni volas 852 00:39:56,570 --> 00:40:00,490 eliri antaŭeniras de aferoj, kaj poste kopii la malnova tabelo en la nova, kaj poste 853 00:40:00,490 --> 00:40:01,680 liberigi la malnova tabelo. 854 00:40:01,680 --> 00:40:05,770 >> Sed kio estas la rula tempo nun de tiu procezo? 855 00:40:05,770 --> 00:40:09,870 Estas granda O de n, ĉar la kopio tuj kostos al vi kelkajn ekzemplerojn de 856 00:40:09,870 --> 00:40:13,480 , do ne tiel ideala se ni devas destini nova tabelo, kiu tuj 857 00:40:13,480 --> 00:40:15,610 konsumi duoble pli memoro provizore. 858 00:40:15,610 --> 00:40:16,660 Kopiu malnova en novajn - 859 00:40:16,660 --> 00:40:18,800 Mi volas diri, estas nur kapdoloron, kiu estas, denove, kial ni skribis 860 00:40:18,800 --> 00:40:19,920 GetString por vi. 861 00:40:19,920 --> 00:40:21,380 >> Do kio povus ni faru anstataŭ? 862 00:40:21,380 --> 00:40:25,000 Nu, se nia datumstrukturo reale havas truojn en ĝi? 863 00:40:25,000 --> 00:40:30,790 Supozu, ke mi malstreĉiĝi mia celo de havi apudaj pecoj de memoro, kie 9 864 00:40:30,790 --> 00:40:34,500 Estas tuj apud 17, kiu estas dekstra flanko de 22, kaj tiel plu. 865 00:40:34,500 --> 00:40:39,570 >> Kaj supozu, ke 9 povas esti super tie en RAM, kaj 17 povas esti super tie en RAM, 866 00:40:39,570 --> 00:40:40,990 kaj 22 povas esti super tie en RAM. 867 00:40:40,990 --> 00:40:43,610 Alivorte, mi ne bezonas ilin eĉ kun malantaŭo al malantaŭo plu. 868 00:40:43,610 --> 00:40:47,850 Mi nur devas iel enhebrar kudrilo tra ĉiu el tiuj numeroj, aŭ ĉiu 869 00:40:47,850 --> 00:40:51,010 de ĉi tiuj nodoj, kiel ni nomas la ortanguloj kiel mi desegnis ilin, 870 00:40:51,010 --> 00:40:55,670 memori pri kiel atingi la lastan tiaj nodo de la unua. 871 00:40:55,670 --> 00:40:59,940 >> Do kio estas la programado konstrui ni vidis sufiĉe ĵus kun kiu mi 872 00:40:59,940 --> 00:41:03,030 povas apliki tiu fadeno, aŭ desegnita tie, kun kiu mi povas 873 00:41:03,030 --> 00:41:05,430 apliki tiujn sagoj? 874 00:41:05,430 --> 00:41:06,500 Do montriloj, ĉu ne? 875 00:41:06,500 --> 00:41:09,560 Se mi malŝparas ne nur int, sed nodo - kaj por 876 00:41:09,560 --> 00:41:10,810 nodo, mi simple signifas ujo. 877 00:41:10,810 --> 00:41:12,900 Kaj vide, mi volas diri rektangulo. 878 00:41:12,900 --> 00:41:16,420 Do nodo ŝajne bezonas enhavi du valoroj - 879 00:41:16,420 --> 00:41:21,490 la int mem, kaj tiam, kiel implicita de la fundo de la duono de la ortangulo, 880 00:41:21,490 --> 00:41:23,010 sufiĉa spaco por int. 881 00:41:23,010 --> 00:41:26,130 >> Do nur pensante antaŭen tie, kiom granda estas ĉi tiu nodo, tiu 882 00:41:26,130 --> 00:41:27,170 ujo en demando? 883 00:41:27,170 --> 00:41:29,250 Kiom da bajtoj por la int? 884 00:41:29,250 --> 00:41:31,310 Supozeble 4, se estas la sama kiel kutima. 885 00:41:31,310 --> 00:41:33,270 Kaj tiam, kiom da bitokoj por la puntero? 886 00:41:33,270 --> 00:41:33,650 4. 887 00:41:33,650 --> 00:41:37,940 Do ĉi ujo, aŭ ĉi tiu nodo, estas tuj estos 8-bajto strukturo. 888 00:41:37,940 --> 00:41:41,760 Ho, kaj tio estas feliĉa hazardo ke ni simple enkondukis tiun nocion de 889 00:41:41,760 --> 00:41:44,400 oni struct, aŭ C strukturo. 890 00:41:44,400 --> 00:41:48,890 >> Do mi asertas ke mi volas doni paŝon kun tiu pli kompleksa 891 00:41:48,890 --> 00:41:52,560 efektivigo de listo de nombroj, oni ligitaj listo de nombroj, mi bezonas fari 892 00:41:52,560 --> 00:41:56,920 iom pli pensado ĉe fronto kaj deklari ne nur int, sed struct 893 00:41:56,920 --> 00:41:58,620 ke mi vokos, konvencie ĉi tie, nodo. 894 00:41:58,620 --> 00:42:01,630 Ni povus nomi ion ni volas, sed nodo tuj estos temáticas en amaso 895 00:42:01,630 --> 00:42:03,560 de la aĵoj ni komencas rigardi nun. 896 00:42:03,560 --> 00:42:06,480 >> Ene de tiu nodo estas int n. 897 00:42:06,480 --> 00:42:09,350 Kaj tiam tiu sintakso, iom weird unuavide - 898 00:42:09,350 --> 00:42:12,960 struct nodo * proksimaj. 899 00:42:12,960 --> 00:42:16,900 Nu pictóricamente, kio estas tio? 900 00:42:16,900 --> 00:42:21,000 Tio estas la malsupera duono de la ortangulo, kiun ni vidis 901 00:42:21,000 --> 00:42:22,730 nur antaŭ momento. 902 00:42:22,730 --> 00:42:27,600 >> Sed kial mi diras struct nodo * kontraste al nur nodo *? 903 00:42:27,600 --> 00:42:31,370 Ĉar se tiu puntero notas en alia nodo, estas nur la 904 00:42:31,370 --> 00:42:32,760 adreso de nodo. 905 00:42:32,760 --> 00:42:35,630 Tio estas konsekvenca kun kion ni diskutis pri montriloj tiom. 906 00:42:35,630 --> 00:42:39,690 Sed kial, se mi pretendas tiu strukturo estas vokis nodo, mi devas diri struct 907 00:42:39,690 --> 00:42:42,660 nodo ene tie? 908 00:42:42,660 --> 00:42:43,190 >> Ekzakte. 909 00:42:43,190 --> 00:42:46,490 Estas iel stulta realaĵo de C. La typedef, por tiel diri, ne havas 910 00:42:46,490 --> 00:42:47,220 okazis ankoraŭ. 911 00:42:47,220 --> 00:42:48,510 C Super laŭvorta. 912 00:42:48,510 --> 00:42:51,050 Ĝi legas vian kodon supre fundo, maldekstre dekstren. 913 00:42:51,050 --> 00:42:54,930 Kaj ĝis batas ke punktokomo en la funda linio, divenu kion ne 914 00:42:54,930 --> 00:42:57,590 ekzisti kiel datumtipon? 915 00:42:57,590 --> 00:42:59,060 Nodo, citaĵo unquote nodo. 916 00:42:59,060 --> 00:43:03,050 >> Sed pro la pli abundajn deklaro mi faris sur la unua linio - 917 00:43:03,050 --> 00:43:05,340 typedef struct nodo - 918 00:43:05,340 --> 00:43:08,790 ĉar tio venis unue, antaŭ ol la krispa krampoj, jen speco de kiel 919 00:43:08,790 --> 00:43:11,800 antaŭ-eduki Clang ke, vi scias kion, donu al mi struct 920 00:43:11,800 --> 00:43:13,570 vokis struct nodo. 921 00:43:13,570 --> 00:43:16,270 Sincere, mi ne ŝatas nomi aĵojn struct nodo, struct nodo ĉiuj 922 00:43:16,270 --> 00:43:17,090 laŭlonge de mia kodo. 923 00:43:17,090 --> 00:43:20,660 Sed mi nur uzos ĝin unu fojon, nur ene, por ke mi povas efike 924 00:43:20,660 --> 00:43:25,010 krei specon de cirkla referenco, ne puntero al mi mem per, sed 925 00:43:25,010 --> 00:43:29,400 puntero al alia de identa tipo. 926 00:43:29,400 --> 00:43:32,330 >> Do rezultas ke sur datumstrukturo kiel tiu, ke estas kelkaj 927 00:43:32,330 --> 00:43:34,470 operacioj kiuj povus esti de intereso al ni. 928 00:43:34,470 --> 00:43:37,460 Ni eble volas enmeti en lerta kiel ĉi tio. 929 00:43:37,460 --> 00:43:39,850 Ni eble volas forviŝi el listo ŝatas tion. 930 00:43:39,850 --> 00:43:43,490 Ni eble volas sercxi la listo por valoro, aŭ pli ĝenerale, través. 931 00:43:43,490 --> 00:43:46,410 Kaj través estas nur ornama metodo de dirante komencas je la maldekstra kaj movi ĉiujn 932 00:43:46,410 --> 00:43:47,650 la vojon al la dekstra. 933 00:43:47,650 --> 00:43:52,640 >> Kaj rimarki, eĉ kun tiu iomete pli kompleksa datumstrukturo, lasu 934 00:43:52,640 --> 00:43:56,510 mi proponas ke ni povas prunti iom da la ideoj de la lastaj du semajnoj kaj 935 00:43:56,510 --> 00:43:58,410 apliki funkcio nomata serĉi ŝatas tion. 936 00:43:58,410 --> 00:44:01,360 Ĝi tuj revenos vera aŭ falsa, indikante, jes aŭ 937 00:44:01,360 --> 00:44:03,390 ne, n estas en la listo. 938 00:44:03,390 --> 00:44:05,960 Lia dua argumento estas puntero al la listo mem, tial 939 00:44:05,960 --> 00:44:07,920 puntero al nodo. 940 00:44:07,920 --> 00:44:10,350 >> Ĉiuj mi tuj poste fari estas deklari portempan variablo. 941 00:44:10,350 --> 00:44:12,730 Ni nomas ĝin ptr per konvencio, por puntero. 942 00:44:12,730 --> 00:44:15,220 Kaj mi atribui ĝin egala al la komencante de la listo. 943 00:44:15,220 --> 00:44:16,680 >> Kaj nun rimarkas dum buklo. 944 00:44:16,680 --> 00:44:20,640 Tiel longe kiel puntero ne estas egala al nula, mi tuj kontroli. 945 00:44:20,640 --> 00:44:24,520 Ĉu puntero sago n egala al la n kiu pasis en? 946 00:44:24,520 --> 00:44:26,410 Kaj atendi minuton - nova peco de sintakso. 947 00:44:26,410 --> 00:44:29,324 Kio estas sago subite? 948 00:44:29,324 --> 00:44:30,574 Jes? 949 00:44:30,574 --> 00:44:34,200 950 00:44:34,200 --> 00:44:34,810 >> Ekzakte. 951 00:44:34,810 --> 00:44:38,860 Do dum kelkaj minutoj, oni uzas la skalara skribmaniero por aliri ion 952 00:44:38,860 --> 00:44:43,080 ene de la struct, se la variablo Vi ne estas la struct 953 00:44:43,080 --> 00:44:47,420 mem, sed puntero al struct, dankeme, peco de sintakso ke 954 00:44:47,420 --> 00:44:48,620 fine faras intuicia senco. 955 00:44:48,620 --> 00:44:52,360 La sago signifas sekvi la puntero, kiel niaj sagoj tipe signifas 956 00:44:52,360 --> 00:44:56,570 pictóricamente kaj iru ĉe datumoj kampo ene. 957 00:44:56,570 --> 00:44:59,700 Do sago estas la sama afero kiel punkto, sed vi uzas ĝin kiam vi havas puntero. 958 00:44:59,700 --> 00:45:05,270 >> Do nur por recap tiam, se la n kampo ene de la struct nomata puntero 959 00:45:05,270 --> 00:45:07,760 egalas egalas n, revenu vera. 960 00:45:07,760 --> 00:45:11,970 Alie, tiu linio tie - puntero egalas puntero proksimaj. 961 00:45:11,970 --> 00:45:17,540 Do kio estas tiu faras, avizo, estas se mi mi nuntempe fingromontrante la struct 962 00:45:17,540 --> 00:45:21,430 enhavanta 9, kaj 9 ne estas la numero Mi serĉas - supozi Mi serĉas 963 00:45:21,430 --> 00:45:22,830 por n egalas 50 - 964 00:45:22,830 --> 00:45:25,930 Mi tuj ĝisdatigi mian temporal puntero por ne atentigi en ĉi tiu nodo 965 00:45:25,930 --> 00:45:31,190 plu, sed puntero sago sekva, kiu tuj metis min tie. 966 00:45:31,190 --> 00:45:34,270 >> Nun, mi rimarkis estas ventego enkonduko. 967 00:45:34,270 --> 00:45:37,380 Merkrede, ni vere faras ĉi kun kelkaj homoj kaj kun iu pli 968 00:45:37,380 --> 00:45:38,900 kodo en malrapida ritmo. 969 00:45:38,900 --> 00:45:42,990 Sed realigi, ni nun faras niaj datumoj strukturoj pli kompleksaj por ke nia 970 00:45:42,990 --> 00:45:45,780 algoritmoj povas akiri pli efika, kiu tuj estos bezonata por 971 00:45:45,780 --> 00:45:50,500 pset ses, kiam ni montru in, denove, tiuj 150.000 vortojn, sed bezonas fari tiel 972 00:45:50,500 --> 00:45:55,650 kompetente, kaj ideale, krei programo kiu kuras por niaj uzantoj ne en 973 00:45:55,650 --> 00:46:00,460 lineara, ne en n kvadrataj, sed en konstanta tempo, en la idealo. 974 00:46:00,460 --> 00:46:02,300 >> Ni vidos vin merkredon. 975 00:46:02,300 --> 00:46:07,240 >> Parolanto: Je la sekvanta CS50, Davido forgesas sian bazon kazo. 976 00:46:07,240 --> 00:46:12,770 >> DAVID Malan: Kaj tio estas kiel vi sendos teksto mesaĝojn kun C. Kion la - 977 00:46:12,770 --> 00:46:14,020 >> [DIVERSAJ TEKSTO MESAĜO Sciigo SOUNDS] 978 00:46:14,020 --> 00:46:19,734