1 00:00:00,000 --> 00:00:02,730 [Powered by Google Translate] [SEKCIO 5: malpli da komfortaj] 2 00:00:02,730 --> 00:00:05,180 [Nate Hardison, Harvard University] 3 00:00:05,180 --> 00:00:08,260 [Jen CS50.] [CS50.TV] 4 00:00:08,260 --> 00:00:11,690 Do bonvenigas reen, knaboj. 5 00:00:11,690 --> 00:00:16,320 Bonvenon sekcio 5. 6 00:00:16,320 --> 00:00:20,220 Je ĉi tiu punkto, esti kompletigita kvizo 0 kaj vidinte, kiel vi faris, 7 00:00:20,220 --> 00:00:25,770 espereble vi sentas vere bonan ĉar mi estis tre impresita de la interpunkcioj en ĉi tiu sekcio. 8 00:00:25,770 --> 00:00:28,050 Por nia linio spektantoj, ni havis kelkajn demandojn 9 00:00:28,050 --> 00:00:33,680 pri la lastaj du problemoj sur la problemo aro - aŭ en la kvizo, prefere. 10 00:00:33,680 --> 00:00:39,690 Do ni iras, por transiri tiujn vere rapide tiel ke ĉiuj vidas, kio okazis 11 00:00:39,690 --> 00:00:45,060 kaj kiel iros tra la efektiva solvo anstataŭ nur vidi la solvon mem. 12 00:00:45,060 --> 00:00:50,330 Ni tuj iros dum la lastaj kelkaj problemoj vere rapide, 32 kaj 33. 13 00:00:50,330 --> 00:00:53,240 Ĝuste, denove, por ke la linio de spektantoj povas vidi tion. 14 00:00:53,240 --> 00:00:59,080 >> Se vi revenos al via problemo 32, kiu estas en la paĝo 13, 15 00:00:59,080 --> 00:01:02,730 13 el 16, problemo 32 estas ĉion pri svopoj. 16 00:01:02,730 --> 00:01:05,010 Afero temis interŝanĝi du entjeroj. 17 00:01:05,010 --> 00:01:08,740 Ĝi estas la problemo, ke ni volonte iris trans kelkajn fojojn en prelego. 18 00:01:08,740 --> 00:01:13,590 Kaj en tie, kion ni petas vin fari estas rapida memoro spuro. 19 00:01:13,590 --> 00:01:17,000 Por plenigi la valoroj de la variabloj kiuj estas sur la stako 20 00:01:17,000 --> 00:01:20,250 kiel la kodo iras tra ĉi interŝanĝa funkcio. 21 00:01:20,250 --> 00:01:24,500 En aparta, kion ni rigardis - I'm tuj metis ĉi iPad malsupren - 22 00:01:24,500 --> 00:01:29,650 en aparta, kion ni rigardis estas tiu linio kalkulitaj 6 dekstra tie. 23 00:01:29,650 --> 00:01:36,740 Kaj ĝi estas kalkulitaj 6 por ĝuste contiguity kun la antaŭa problemo. 24 00:01:36,740 --> 00:01:41,720 Kion ni volas fari estas montri aŭ etikedi la stato de memoro 25 00:01:41,720 --> 00:01:46,090 kiel estas en la momento kiam ni ekzekuti tiu linio numero 6, 26 00:01:46,090 --> 00:01:52,540 kio estas efektive reveno de nia interŝanĝa funkcio ĉi tie. 27 00:01:52,540 --> 00:01:59,450 Se ni rulumu malsupren tie, ni rimarkis, ke la adresoj de ĉio en memoro estis provizita por ni. 28 00:01:59,450 --> 00:02:02,540 Ĉi tio estas tre ŝlosila; ni revenos al tio en nur momento. 29 00:02:02,540 --> 00:02:09,240 Kaj tiam cxi tie malsupre, ni havis iom memoro diagramo kiu ni iras al referi al. 30 00:02:09,240 --> 00:02:12,490 Mi vere faris tion sur mia iPad. 31 00:02:12,490 --> 00:02:20,720 Do mi iros al alterni tien kaj reen inter la iPad kaj ĉi tiu kodo nur por via referenco. 32 00:02:20,720 --> 00:02:26,540 >> Ni komencu. Unue, ni koncentriĝas pri la unua paro de linioj de ĉefa dekstra tie. 33 00:02:26,540 --> 00:02:30,220 Por komenci, ni iras al pravalorizi x al 1 kaj y al 2. 34 00:02:30,220 --> 00:02:33,040 Do ni havas du entjeraj variabloj, ili estas ambaŭ tuj estos metita sur la stako. 35 00:02:33,040 --> 00:02:36,050 Ni tuj metis 1 kaj 2 en ili. 36 00:02:36,050 --> 00:02:43,150 Do se mi klaki super mia iPad, espereble, ni vidu - 37 00:02:43,150 --> 00:02:48,660 Apple TV spegulon, kaj tie ni iru. Okay. 38 00:02:48,660 --> 00:02:51,670 Do se mi klaki super mia iPad, 39 00:02:51,670 --> 00:02:56,220 Mi volas pravalorizi x al 1 kaj y al 2. 40 00:02:56,220 --> 00:03:00,580 Ni faras tion sufiĉe simple skribante 1 en la skatolo markita x 41 00:03:00,580 --> 00:03:07,730 kaj 2 en la skatolo markita y. Sufiĉe simpla. 42 00:03:07,730 --> 00:03:11,620 Do nun ni reiros al la tekkomputilo, vidi kio sekve okazos. 43 00:03:11,620 --> 00:03:15,810 Do tiu sekva linio estas kie aĵoj komplikas. 44 00:03:15,810 --> 00:03:28,110 Ni pasos la adreso de x kaj la adreson de y kiel la parametroj a kaj b por la interŝanĝa funkcio. 45 00:03:28,110 --> 00:03:32,380 La adreso de x kaj la adreso de y estas aĵoj kiuj oni ne povas kalkuli 46 00:03:32,380 --> 00:03:36,360 sen referenco al tiuj kuglo notas dekstra cxi tie. 47 00:03:36,360 --> 00:03:39,750 Kaj feliĉe, la unuaj du kuglo antaŭ diri al ni precize kion la respondoj estas. 48 00:03:39,750 --> 00:03:44,740 La adreso de x en memoro estas 10, kaj la adreso de y en memoro estas 14. 49 00:03:44,740 --> 00:03:51,870 Do tiuj estas la valoroj kiuj get pasis en kiel kaj b ĝis supro en nia interŝanĝa funkcio. 50 00:03:51,870 --> 00:04:00,760 Do denove, ŝanĝante reen al la diagramo, mi povas skribi 10 en 51 00:04:00,760 --> 00:04:07,400 kaj 14 en b. 52 00:04:07,400 --> 00:04:11,610 Nun, ĉi tiu punkto estas kie ni procedi kun la interŝanĝa. 53 00:04:11,610 --> 00:04:14,520 Do flipping reen al la tekkomputilo denove, 54 00:04:14,520 --> 00:04:21,079 ni vidas ke la vojo la interŝanĝa funkcias estas mi unue dereference a kaj tendencas la rezulton en tmp. 55 00:04:21,079 --> 00:04:27,650 Do la dereference operatoro diras, "Hej. Treat la enhavon de variabloj tiel adreson. 56 00:04:27,650 --> 00:04:33,830 Iru al kiom estas stokita en tiu adreso, kaj montru ĝin. " 57 00:04:33,830 --> 00:04:41,720 Kion vi montru el la variablo tuj estos stokitaj en niajn tmp variablo. 58 00:04:41,720 --> 00:04:45,150 Flipping reen al la iPad. 59 00:04:45,150 --> 00:04:51,690 Se ni iras al adreso 10, ni scias ke adreso 10 estas la varible x 60 00:04:51,690 --> 00:04:55,480 ĉar ni ricevis informojn de niaj kuglo punkto, ke la adreso de x en memoro estas 10. 61 00:04:55,480 --> 00:05:00,180 Do ni povas iri tien, akiri la valoron de tio, kiu estas 1, kiel ni vidas sur nia iPad, 62 00:05:00,180 --> 00:05:06,300 kaj montru ke en tmp. 63 00:05:06,300 --> 00:05:08,250 Denove, tio ne estas la fino enhavo. 64 00:05:08,250 --> 00:05:14,350 Ni tuj marŝi tra kaj ni atingos nian lastan staton de la programo je la fino. 65 00:05:14,350 --> 00:05:17,210 Sed nun, ni havas la valoron 1 stokitaj en tmp. 66 00:05:17,210 --> 00:05:19,210 >> Kaj estas rapida demando super tie. 67 00:05:19,210 --> 00:05:23,980 [Aleksandro] Ĉu la dereference operatoro - tio estas nur la stelo ĝuste fronte de la variablo? 68 00:05:23,980 --> 00:05:27,600 >> Jes. Do la dereference operatoro, kiel ni klaki al nia tekkomputilo denove, 69 00:05:27,600 --> 00:05:33,780 Estas ĉi tiu stelo ĝuste fronte. 70 00:05:33,780 --> 00:05:37,460 En tiu senco, ĝi estas - vi kontrastigi ĝin kun la multiplika operatoro 71 00:05:37,460 --> 00:05:42,400 kiuj postulas du aferojn: la dereference operatoro estas unuloka operatoro. 72 00:05:42,400 --> 00:05:46,130 Nur aplikita al unu valoro kompare al duuma operatoro, 73 00:05:46,130 --> 00:05:48,810 kie vi aplikas al du malsamaj valoroj. 74 00:05:48,810 --> 00:05:52,080 Do jen kio okazas en tiu linio. 75 00:05:52,080 --> 00:05:58,390 Ni ŝarĝis la valoro 1 kaj gardis ŝin en nian temporal entjera variablo. 76 00:05:58,390 --> 00:06:05,800 La sekva linio, ni stoki la enhavo de b al - 77 00:06:05,800 --> 00:06:12,630 aŭ, pli ĝuste, ni stoki la enhavon ke b estas indikante sur la loko, kie oni notas al. 78 00:06:12,630 --> 00:06:17,690 Se ni analizas tiun de dekstra al maldekstra, tuj dereference b, 79 00:06:17,690 --> 00:06:23,580 tuj trakti 14, tuj kapti la entjero kiu estas tie, 80 00:06:23,580 --> 00:06:26,900 kaj poste ni tuj iros al la adreso 10, 81 00:06:26,900 --> 00:06:34,240 kaj ni tuj ĵetu la rezulto de nia dereference de b en tiun spacon. 82 00:06:34,240 --> 00:06:40,080 Flipping reen al nia iPad, kie ni povas fari ĉi iom pli konkreta, 83 00:06:40,080 --> 00:06:44,070 ĝi povus helpi se mi skribas nombroj sur ĉiu el la adresoj ĉi tie. 84 00:06:44,070 --> 00:06:53,820 Do ni scias ke al y, ni estas ĉe adreso 14, x estas ĉe adreso 10. 85 00:06:53,820 --> 00:07:00,180 Kiam ni komencos je b, ni dereference b, ni tuj kapti la valoro 2. 86 00:07:00,180 --> 00:07:08,320 Ni tuj kapti tiun valoron ĉar tio estas la valoro kiu vivas ĉe adreso 14. 87 00:07:08,320 --> 00:07:15,700 Kaj ni tuj metis ĝin en la variablo kiu vivas ĉe adreso 10, 88 00:07:15,700 --> 00:07:19,160 kiu estas dekstre tie, respondante al niaj variablo x. 89 00:07:19,160 --> 00:07:21,810 Do ni povas fari iom da overwriting tie 90 00:07:21,810 --> 00:07:35,380 kie ni forigi niajn 1 kaj anstataŭe ni skribos 2. 91 00:07:35,380 --> 00:07:39,560 Do ĉiuj estas bone kaj bonan en la mondo, kvankam ni anstataŭigi x nun. 92 00:07:39,560 --> 00:07:44,890 Ni stokas x malnovan valoron en nia tmp variablo. 93 00:07:44,890 --> 00:07:50,210 Do ni povas kompletigi la interŝanĝa kun la sekvanta linio. 94 00:07:50,210 --> 00:07:53,030 Flipping reen al nia teko. 95 00:07:53,030 --> 00:07:58,150 Kaj cxio tio restaĵoj estas preni la enhavo el nia provizora entjera variablo 96 00:07:58,150 --> 00:08:05,630 kaj stoki ilin en la variablo kiu vivas je la adreso ke b estas tenante. 97 00:08:05,630 --> 00:08:10,230 Do ni tuj efektive dereference b akiri aliron al la variablo 98 00:08:10,230 --> 00:08:14,340 tio estas je la adreso kiun b veras en ĝi, 99 00:08:14,340 --> 00:08:19,190 kaj ni tuj plenigos la valoro kiu tmp estas tenante en ĝin. 100 00:08:19,190 --> 00:08:23,280 Flipping reen al la iPad denove. 101 00:08:23,280 --> 00:08:31,290 Mi povas forviŝi ĉi tiun valoron tie, 2, 102 00:08:31,290 --> 00:08:41,010 kaj anstataŭ ni kopii la 1 rekte en ĝi. 103 00:08:41,010 --> 00:08:43,059 Tiam la sekva linio kiu ekzekutas, kompreneble - 104 00:08:43,059 --> 00:08:47,150 se ni klaki reen al la tekkomputilo - estas tiu punkto 6, 105 00:08:47,150 --> 00:08:52,500 kiu estas la punkto je kiuj ni volis havi la diagramo tute plenigis eksteren. 106 00:08:52,500 --> 00:08:58,940 Do flipping reen al la iPad ankoraŭfoje, ĝuste tial vi povas vidi la kompletigis diagramo, 107 00:08:58,940 --> 00:09:06,610 vi povas vidi, ke ni havas 10 en a, a 14 en b, a 1 en tmp, a 2 en x, kaj 1 en kaj. 108 00:09:06,610 --> 00:09:11,000 Ĉu estas demandoj pri tio? 109 00:09:11,000 --> 00:09:14,640 Ĉu ĉi tiu fari pli sentita, esti iradis tra gxi? 110 00:09:14,640 --> 00:09:24,850 Faru malpli senco? Espereble ne. Okay. 111 00:09:24,850 --> 00:09:28,230 >> Punteros estas tre malfacila temo. 112 00:09:28,230 --> 00:09:33,420 Unu el la infanoj ni laboras kun ĝi havas tre komuna diro: 113 00:09:33,420 --> 00:09:36,590 "Kompreni punteros, vi devas unue kompreni punteros." 114 00:09:36,590 --> 00:09:40,530 Kiun mi pensas estas tre vera. Ĝi faras preni momenton por alkutimiĝi al ĝi. 115 00:09:40,530 --> 00:09:45,360 Desegno multajn pentraĵojn, desegnado multe da memoro diagramoj kiel ĉi tiu estas tre helpema, 116 00:09:45,360 --> 00:09:49,480 kaj kiam vi iros tra ekzemple post ekzemple post ekzemplo, 117 00:09:49,480 --> 00:09:54,450 ĝi devos komenci fari iom pli sentita kaj iom pli sentita kaj iom pli senco. 118 00:09:54,450 --> 00:10:01,560 Fine, unu tagon, vi devos ĉion tute regata. 119 00:10:01,560 --> 00:10:13,800 Demandojn antaŭ ol ni movos al la venonta problemo? Bone. 120 00:10:13,800 --> 00:10:18,840 Do klaki reen al la portebla. 121 00:10:18,840 --> 00:10:23,300 La sekva problemo ni havas estas problemo nombro 33 en dosiero mi / O. 122 00:10:23,300 --> 00:10:26,350 Zomi en ĉi iom. 123 00:10:26,350 --> 00:10:28,710 Problemo 33 - Jes? 124 00:10:28,710 --> 00:10:32,110 >> [Daniel] Mi nur havis rapidan demandon. Tiu stelo, aux la asterisko, 125 00:10:32,110 --> 00:10:35,590 ĝi estas nomata dereferencing kiam vi uzas asterisko antaŭe. 126 00:10:35,590 --> 00:10:38,820 Kio estas tio nomita kiam oni uzas la signon antaŭ? 127 00:10:38,820 --> 00:10:43,140 >> La signo antaŭe estas la adreso-de operatoro. 128 00:10:43,140 --> 00:10:45,880 Do ni rulumu back up. 129 00:10:45,880 --> 00:10:49,310 Oops. Mi estas en zoom modo do mi ne povas vere skribrulajxon. 130 00:10:49,310 --> 00:10:52,780 Se ni rigardas tiun kodon vere rapide ĉi tie, 131 00:10:52,780 --> 00:10:54,980 denove, samo okazas. 132 00:10:54,980 --> 00:10:59,180 Se ni rigardas tiun kodon ĉi tie, sur ĉi tiu linio, kie ni fari la alvokon por interŝanĝi, 133 00:10:59,180 --> 00:11:10,460 la signo simple diri "preni la adreson al kiu variablo x vivojn." 134 00:11:10,460 --> 00:11:14,460 Kiam via tradukilo kompilas vian kodon, 135 00:11:14,460 --> 00:11:20,590 ĝi devas vere fizike marki el loko en memoro por ĉiuj viaj variabloj vivi. 136 00:11:20,590 --> 00:11:24,910 Kaj tiel kion la tradukilo povas tiam fari iam ĝi estas kompilitaj ĉio, 137 00:11:24,910 --> 00:11:31,110 scias, "Ho, mi metas x ĉe adreso 10. Mi metis y je adreso 14." 138 00:11:31,110 --> 00:11:34,640 Ĝi povas tiam plenigu ĉi tiujn valorojn por vi. 139 00:11:34,640 --> 00:11:44,740 Do vi povas tiam - ĝi povas tiam pasas ĉi en kaj pasas & y en tiel. 140 00:11:44,740 --> 00:11:50,730 Tiuj infanoj ricevi la adreson, sed ankaŭ, kiam vi pasos ilin en la interŝanĝa funkcio, 141 00:11:50,730 --> 00:11:55,690 ĉi tiu tipo informo, ĉi int * ĉi tie, rakontas la tradukilo, 142 00:11:55,690 --> 00:12:01,350 "Konsentite, ni tuj estos interpreti ĉi tiu adreso kiel adreso de entjero variablo." 143 00:12:01,350 --> 00:12:05,900 Kiel adreso de int, kiu estas malsama de la adreso de gravulo variablo 144 00:12:05,900 --> 00:12:09,930 ĉar int okupas, sur 32-bita maŝino, reprenas 4 bajtoj de spaco, 145 00:12:09,930 --> 00:12:13,310 dum karakteron nur okupas 1 bajto de spaco. 146 00:12:13,310 --> 00:12:17,310 Do ĝi estas grave scii ankaŭ kio estas - kio vivas, kio tipo de valoro 147 00:12:17,310 --> 00:12:20,340 vivas je la adreso kiun got pasis in 148 00:12:20,340 --> 00:12:22,020 Aŭ la adreso kiun vi pritraktas. 149 00:12:22,020 --> 00:12:29,020 Tiun vojon, vi scias kiom da bajtoj de informo por fakte montru el via memoro RAM. 150 00:12:29,020 --> 00:12:31,780 Kaj tiam, jes, ĉi dereference operatoro, kiel vi demandas, 151 00:12:31,780 --> 00:12:37,200 iras kaj aliroj informo je aparta adreso. 152 00:12:37,200 --> 00:12:42,820 Do ĝi diras, kun ĉi variablo tie, trakti la enhavon de kiel adreso, 153 00:12:42,820 --> 00:12:47,880 iri al tiu adreso, kaj eltiri, montru al la procesoro, ŝarĝo en registriĝi 154 00:12:47,880 --> 00:12:56,340 la efektiva valoroj aŭ la enhavon kiu loĝas en tiu adreso. 155 00:12:56,340 --> 00:12:59,620 Plu demandoj? Tiuj estas bonaj demandoj. 156 00:12:59,620 --> 00:13:01,650 Estas multe da novaj terminologio ankaŭ. 157 00:13:01,650 --> 00:13:09,800 Estas ankaŭ speco de funky, vidante & kaj * en malsamaj lokoj. 158 00:13:09,800 --> 00:13:13,180 >> Bone. 159 00:13:13,180 --> 00:13:18,530 Do reen al problemo 33, enarkivigi mi / O. 160 00:13:18,530 --> 00:13:22,540 Tiu estis unu el tiuj problemoj kiujn mi pensas kelkaj aferoj okazis. 161 00:13:22,540 --> 00:13:25,400 Unu, estas sufiĉe nova temo. 162 00:13:25,400 --> 00:13:30,590 Ĝi estis prezentita baldaux antaux la kvizo, 163 00:13:30,590 --> 00:13:33,400 kaj tiam mi kredas ke estis ia kiel unu el tiuj vorto problemoj en matematiko 164 00:13:33,400 --> 00:13:39,720 kie al vi multe da informo, sed vi vere ne finas devi uzi barelon da ĝi. 165 00:13:39,720 --> 00:13:44,060 La unua parto de ĉi tiu problemo estas priskribi kia CSV-dosiero estas. 166 00:13:44,060 --> 00:13:50,620 Nun, CSV-dosiero, laŭ la priskribo, estas komo-disigita valoroj dosiero. 167 00:13:50,620 --> 00:13:55,300 La kialo ĉi tiuj estas tute interesa, kaj la kialo vi iam uzos ilin, 168 00:13:55,300 --> 00:14:00,800 estas, ĉar, kiel multaj el vi iam uzis stuff kiel Excel? 169 00:14:00,800 --> 00:14:03,240 Figuro plimulto de vi, probable, aŭ uzos en iu momento en via vivo. 170 00:14:03,240 --> 00:14:06,430 Vi uzas iun kiel Excel. 171 00:14:06,430 --> 00:14:10,940 Por akiri la datumojn el la Excel aŭ fari ian prilaborado per ĝi, 172 00:14:10,940 --> 00:14:17,240 se vi volas skribi C-programo aŭ Python programo, Java-programo, 173 00:14:17,240 --> 00:14:20,070 trakti kun la datumoj vi stokitaj en tie, 174 00:14:20,070 --> 00:14:23,170 unu el la plej komunaj formoj atingi ĝin estas en CSV-dosiero. 175 00:14:23,170 --> 00:14:26,850 Kaj vi povas malfermi Excel kaj kiam vi iras al la 'Konservu kiel' dialogo, 176 00:14:26,850 --> 00:14:32,840 vi povas akiri el reala CSV-dosiero. 177 00:14:32,840 --> 00:14:35,890 >> Handy scii trakti tion. 178 00:14:35,890 --> 00:14:42,010 Tiel funkcias la estas ke ĝi estas simila al - Mi volas diri, ĝi estas esence imitante al ŝtono, 179 00:14:42,010 --> 00:14:47,590 kie, kiel ni vidas tie, en la tre forlasis-plej peco, 180 00:14:47,590 --> 00:14:49,910 ni havas ĉiujn familinomojn. 181 00:14:49,910 --> 00:14:54,670 Do ni havas Malan, tiam Hardison, kaj tiam Bowden, MacWilliam, kaj tiam Chan. 182 00:14:54,670 --> 00:14:59,470 Ĉiuj familinomoj. Kaj tiam komo disigas la familinomoj de la unua nomoj. 183 00:14:59,470 --> 00:15:02,970 David Nate, Rob, Tommy, kaj Zamyla. 184 00:15:02,970 --> 00:15:06,850 Mi ĉiam konfuziĝas Robby kaj Tom. 185 00:15:06,850 --> 00:15:10,940 Kaj poste, fine, la tria kolumno estas la retadresoj. 186 00:15:10,940 --> 00:15:18,500 Kiam vi komprenos tion, la resto de la programo estas sufiĉe simpla por apliki. 187 00:15:18,500 --> 00:15:23,850 Kion ni faris por imiti ĉi sama strukturo en nia C programon 188 00:15:23,850 --> 00:15:27,510 estas ni uzis strukturo. 189 00:15:27,510 --> 00:15:30,520 Ni komencu ludi kun tiuj iom pli kiel bone. 190 00:15:30,520 --> 00:15:35,790 Ni vidis ilin por la unua iom en problemo aro 3, kiam ni pritraktas la vortaroj. 191 00:15:35,790 --> 00:15:40,290 Sed tiun bastonon struct stokas familinomo, unua nomo, kaj retmesaĝo. 192 00:15:40,290 --> 00:15:44,500 Samkiel nia CSV-dosiero estis stokante. 193 00:15:44,500 --> 00:15:47,950 Do ĉi tiu estas nur konverti de unu al alia formato. 194 00:15:47,950 --> 00:15:54,630 Ni devas konverti, en ĉi tiu kazo, bastono struct en linio, 195 00:15:54,630 --> 00:15:59,060 komo-disigita linio, ĝuste tiel. 196 00:15:59,060 --> 00:16:01,500 Ĉu tio havas sencon? You guys ĉiuj prenis la kvizo, 197 00:16:01,500 --> 00:16:07,680 tiel mi imagas ke vi almenaŭ havis tempon por pensi pri tiu. 198 00:16:07,680 --> 00:16:16,410 >> En la salajron funkcio, la problemo petas al ni prenu en - we'll zoom en sur tiu iom - 199 00:16:16,410 --> 00:16:22,480 preni en personaro strukturo, bastono struct, kun nomo s, 200 00:16:22,480 --> 00:16:30,900 kaj aldonas ĝian enhavon al nia staff.csv dosiero. 201 00:16:30,900 --> 00:16:34,230 Ĝi rezultas ke ĉi tiu estas sufiĉe simpla al uzi. 202 00:16:34,230 --> 00:16:37,430 Ni speco de ludi tie kun tiuj funkcioj iom pli hodiaŭ. 203 00:16:37,430 --> 00:16:44,510 Sed en ĉi tiu kazo, la fprintf funkcio estas vere la ŝlosilo. 204 00:16:44,510 --> 00:16:51,960 Do kun fprintf, ni povas presi, kiel vi infanoj estis uzante printf ĉi tiu tuta termino. 205 00:16:51,960 --> 00:16:55,050 Vi povas printf linion al dosiero. 206 00:16:55,050 --> 00:16:59,030 Do anstataŭ simple fari la kutiman printf alvoko kie vi donos la formato kordoj 207 00:16:59,030 --> 00:17:05,380 kaj tiam vi anstataŭi ĉiuj variabloj kun la sekva argumentoj, 208 00:17:05,380 --> 00:17:11,290 kun fprintf, via unua argumento estas anstataŭ la dosiero kiun vi volas skribi al. 209 00:17:11,290 --> 00:17:21,170 Se ni devis rigardi tion en la aparaton, ekzemple, viro fprintf, 210 00:17:21,170 --> 00:17:25,980 ni povas vidi la diferencon inter printf kaj fprintf. 211 00:17:25,980 --> 00:17:28,960 Mi zomi tie iomete. 212 00:17:28,960 --> 00:17:33,140 Do kun printf, donu ĝin al formato ŝnuro, kaj poste la posta argumentoj 213 00:17:33,140 --> 00:17:37,580 estas ĉiuj variabloj por anstataŭas aŭ anstataŭo en niajn formato kordoj. 214 00:17:37,580 --> 00:17:47,310 Dum kiu kun fprintf, la unua argumento estas ĝuste ĉi tiu dosiero * nomas rojo. 215 00:17:47,310 --> 00:17:51,800 >> Movante reen super ĉi tie por niaj salajron, 216 00:17:51,800 --> 00:17:54,550 ni jam atingis nian dosieron * rivereto malfermis por ni. 217 00:17:54,550 --> 00:17:57,810 Tion ĉi unua linio faras; ĝi malfermas la staff.csv dosiero, 218 00:17:57,810 --> 00:18:01,690 ĝi malfermas ĝin en append reĝimo, kaj ĉiuj ke tio lasis por ni fari estas 219 00:18:01,690 --> 00:18:08,640 skribi la bastonon strukturo al la dosiero. 220 00:18:08,640 --> 00:18:10,870 Kaj, vidu, cxu mi volas uzi la iPad? 221 00:18:10,870 --> 00:18:17,900 Mi uzas la iPad. Ni havas nula - Ni metu tiun sur la tablo tiel mi povas skribi iom pli bona - 222 00:18:17,900 --> 00:18:33,680 neniigas salajron kaj portas en unu argumento, bastono strukturo nomita s. 223 00:18:33,680 --> 00:18:44,120 Got nia krampoj, ni havas niajn dosiero * nomas dosiero, 224 00:18:44,120 --> 00:18:48,380 ni havas nian fopen linio donita al ni, 225 00:18:48,380 --> 00:18:51,890 kaj mi ĵus skribi ĝin kiel punktoj ĉar ĝi estas jam en la pedia. 226 00:18:51,890 --> 00:19:00,530 Kaj tiam en nia sekva linio, ni tuj faros alvokon al fprintf 227 00:19:00,530 --> 00:19:03,700 kaj ni tuj pasos en la dosiero kiun ni volas presi al, 228 00:19:03,700 --> 00:19:10,290 kaj tiam nia formato ĉeno, kiu - 229 00:19:10,290 --> 00:19:14,300 Mi lasos vin infanoj diru al mi kio gxi aspektas. 230 00:19:14,300 --> 00:19:20,500 Kion pri vi, Stella? Ĉu vi scias kio estas la unua parto de la formato string similas? 231 00:19:20,500 --> 00:19:24,270 [Stella] Mi ne estas certa. >> Bonvolu peti Jimmy. 232 00:19:24,270 --> 00:19:27,690 Ĉu vi scias, Jimmy? 233 00:19:27,690 --> 00:19:31,000 [Jimmy] Ĉu ĝi nur estos lasta? Mi ne scias. Mi ne estas tute certa. 234 00:19:31,000 --> 00:19:39,020 >> Bone. Kion pri, ĉu neniu get this ĝentila en la ekzameno? 235 00:19:39,020 --> 00:19:41,770 Ne Bone. 236 00:19:41,770 --> 00:19:47,920 Rezultas, ke ĉi tie ĉiuj ni devas fari estas ni volas ĉiu parto de nia dungitaro strukturo 237 00:19:47,920 --> 00:19:53,290 esti presita ekster kiel linio en nian arkivon. 238 00:19:53,290 --> 00:19:59,900 Ni nur uzas la kordo anstataŭo karaktero tri malsamaj tempoj ĉar ni havas familinomon 239 00:19:59,900 --> 00:20:07,160 sekvita de komo, tiam la unua nomo sekvata de komo, 240 00:20:07,160 --> 00:20:12,430 kaj tiam fine la retadreson kiu estas sekvita - kio ne estas 241 00:20:12,430 --> 00:20:15,140 persvadi sur mia ekrano - sed ĝi estas sekvata de lino karaktero. 242 00:20:15,140 --> 00:20:20,060 Do mi tuj skribos nur tie. 243 00:20:20,060 --> 00:20:23,560 Kaj tiam sekva nia formato kordoj, 244 00:20:23,560 --> 00:20:27,880 ni nur havas la anstataŭoj, kiun ni aliro uzante la skalara skribmaniero 245 00:20:27,880 --> 00:20:31,370 kiun ni vidis en problemo aro 3. 246 00:20:31,370 --> 00:20:48,820 Ni povas uzi s.last, s.first, kaj s.email 247 00:20:48,820 --> 00:20:58,990 anstataŭigi en tiuj tri valoroj en nia formato kordoj. 248 00:20:58,990 --> 00:21:06,190 Do kiamaniere kiuj iras? Sencon? 249 00:21:06,190 --> 00:21:09,700 Jes? Ne? Eble? Okay. 250 00:21:09,700 --> 00:21:14,180 >> La fina afero, ke ni faru tion, kion ni presas kaj post ni malfermis niajn dosiero: 251 00:21:14,180 --> 00:21:17,370 kiam ni malfermis dosiero, ni ĉiam devas memori por fermi ĝin. 252 00:21:17,370 --> 00:21:19,430 Ĉar alie ni devos fini filtri la memoro, 253 00:21:19,430 --> 00:21:22,500 uzante supren dosieron descriptores. 254 00:21:22,500 --> 00:21:25,950 Do por fermi ĝin, kio funkcio do ni uzas? Daniel? 255 00:21:25,950 --> 00:21:30,120 [Daniel] fclose? >> Fclose, precize. 256 00:21:30,120 --> 00:21:37,520 Do la lasta parto de ĉi tiu problemo estis adekvate fermi la dosieron, uzante la fclose funkcio, 257 00:21:37,520 --> 00:21:40,370 kiu nur aspektas tiel. 258 00:21:40,370 --> 00:21:43,880 Ne tro freneza. 259 00:21:43,880 --> 00:21:46,990 Cool. 260 00:21:46,990 --> 00:21:49,520 Do jen problemo 33 en la kvizo. 261 00:21:49,520 --> 00:21:52,480 Ni devos definitive pli dosiero / S antaŭvidi. 262 00:21:52,480 --> 00:21:55,130 Ni faros iom pli en prelego hodiaŭ, aŭ en sekcio hodiaŭ, 263 00:21:55,130 --> 00:22:01,710 ĉar tio kio okazas por formi la kernon de ĉi venonta pset. 264 00:22:01,710 --> 00:22:05,020 Ni movi sur de la kvizo je ĉi tiu punkto. Jes? 265 00:22:05,020 --> 00:22:10,880 >> [Charlotte]] Kial fclose (dosiero) anstataŭ fclose (staff.csv)? 266 00:22:10,880 --> 00:22:19,100 >> Ha. Ĉar ĝi rezultas ke - tiel la demando, kio estas granda, 267 00:22:19,100 --> 00:22:27,800 estas kial, kiam ni skribas fclose, ni skribi fclose (dosiero) stelo variablo 268 00:22:27,800 --> 00:22:33,680 kontraste al la dosiernomo, staff.csv? Ĉu tio estas korekta? Yeah. 269 00:22:33,680 --> 00:22:39,570 Do ni rigardu. Se mi ŝanĝos al mia tekkomputilo, 270 00:22:39,570 --> 00:22:45,040 kaj ni rigardu la fclose funkcio. 271 00:22:45,040 --> 00:22:51,460 Do la fclose funkcio fermas rojo kaj ĝi portas en la sagon al la rivereto, ke ni volas fermi, 272 00:22:51,460 --> 00:22:57,010 kontraste al la efektiva dosiernomo kiun ni volas fermi. 273 00:22:57,010 --> 00:23:01,620 Kaj tiu estas ĉar malantaŭ la scenoj, kiam vi faras alvokon al fopen, 274 00:23:01,620 --> 00:23:12,020 kiam vi malfermas dosieron, vi vere atribuo memoro por konservi informojn pri la dosiero. 275 00:23:12,020 --> 00:23:16,380 Do vi havas dosieron puntero kiu havas informojn pri la dosiero, 276 00:23:16,380 --> 00:23:23,080 kiel ĝi estas malfermita, lia grandeco, kie vi estas nuntempe en la dosiero, 277 00:23:23,080 --> 00:23:29,100 por ke vi povas fari legante kaj skribante alvokoj al tiu aparta loko ene de la dosiero. 278 00:23:29,100 --> 00:23:38,060 Vi finos fermante la puntero anstataŭ fermante la dosiernomo. 279 00:23:38,060 --> 00:23:48,990 >> Jes? [Daniel] Do, por uzi salajron, vi dirus - kiel faras ĝi preni la eniro de la uzanto? 280 00:23:48,990 --> 00:23:53,830 Ĉu fprintf agi kiel GetString en la senco ke ĝi devos nur atendi ke la eniro de la uzanto 281 00:23:53,830 --> 00:23:57,180 kaj peti vin tajpi ĉi tio - aŭ atendi por vi tajpi tiujn tri aferojn en? 282 00:23:57,180 --> 00:24:00,480 Aux cxu vi bezonos uzi ion por apliki salajron? 283 00:24:00,480 --> 00:24:04,100 >> Jes. Do ni ne estas - la demando, kial ni preni la eniro de la uzanto 284 00:24:04,100 --> 00:24:09,220 por apliki salajron? Kaj kion ni havas ĉi tie estas la telefonanto de pago, 285 00:24:09,220 --> 00:24:17,690 pasis en tiun bastonon struct kun ĉiuj datumoj stokitaj en la struct jam. 286 00:24:17,690 --> 00:24:22,990 Do fprintf povas simple skribi ke datumojn rekte al la dosiero. 287 00:24:22,990 --> 00:24:25,690 Ne atendante uzanto enigo. 288 00:24:25,690 --> 00:24:32,110 La uzanto jam donis la enigo de taŭge meti ĝin en ĉi bastonon struct. 289 00:24:32,110 --> 00:24:36,510 Kaj tion, kompreneble, rompus se iu el tiuj indikoj estis nula, 290 00:24:36,510 --> 00:24:40,370 do ni rulumu back up tie kaj ni rigardas nian struct. 291 00:24:40,370 --> 00:24:43,640 Ni havas ĉenon lasta, kordoj unue, kordoj retpoŝto. 292 00:24:43,640 --> 00:24:48,530 Ni nun scias, ke ĉiuj el tiuj vere, sub la kapuĉo, estas char * variabloj. 293 00:24:48,530 --> 00:24:53,470 Tio povas aŭ ne povas montrante al nula. 294 00:24:53,470 --> 00:24:55,800 Ili povas esti indikante memoro sur la havaĵon, 295 00:24:55,800 --> 00:24:59,650 eble memoro sur la stako. 296 00:24:59,650 --> 00:25:04,580 Ni ne vere scias, sed se iu el tiuj indikoj estas nulaj, aŭ nevalida, 297 00:25:04,580 --> 00:25:08,120 ke tio estos definitive frakasi nian salajron funkcio. 298 00:25:08,120 --> 00:25:11,050 Tio estis iu kiu estis speco de preter la kadro de la ekzameno. 299 00:25:11,050 --> 00:25:16,440 Ni ne zorgi pri tio. 300 00:25:16,440 --> 00:25:22,170 Granda. Okay. Do pasi de la kvizo. 301 00:25:22,170 --> 00:25:25,760 >> Ni fermu ulo, kaj ni tuj rigardi pset 4. 302 00:25:25,760 --> 00:25:34,700 Do se vi infanoj rigardi la pset spec, fojo vi povas aliri gxin, cs50.net/quizzes, 303 00:25:34,700 --> 00:25:42,730 tuj iros tra kelkaj el la sekcio problemoj hodiaŭ. 304 00:25:42,730 --> 00:25:52,240 Mi movo malsupren - sekcio de demandoj komenciĝas la tria paĝo de la pset spec. 305 00:25:52,240 --> 00:25:57,800 Kaj la unua parto petas vin iri kaj rigardi la mallongajn sur redireccionando kaj tuboj. 306 00:25:57,800 --> 00:26:02,820 Kiu estis speco de cool mallonga, tie vi iun novan, cool komandlinio lertaĵoj kiujn vi povas uzi. 307 00:26:02,820 --> 00:26:06,050 Kaj tiam ni havas kelkajn demandojn por vi ankaŭ. 308 00:26:06,050 --> 00:26:10,860 Ĉi tiu unua demando pri torentoj, al kiu printf skribas implicite, 309 00:26:10,860 --> 00:26:15,920 ni ia menciita malmulta antaŭ momento. 310 00:26:15,920 --> 00:26:22,380 Ĉi fprintf ke ni ĵus diskutis prenas en dosiero * torento kiel ĝia argumento. 311 00:26:22,380 --> 00:26:26,580 fclose prenas en dosiero * torento kiel bone, 312 00:26:26,580 --> 00:26:32,660 kaj la reveno valoro de fopen donas al vi dosiero * torento kiel bone. 313 00:26:32,660 --> 00:26:36,060 La kialo ni ne vidis tiujn antaŭ kiam ni pritraktis kun printf 314 00:26:36,060 --> 00:26:39,450 estas ĉar printf havas defaŭlta rivereto. 315 00:26:39,450 --> 00:26:41,810 Kaj la defaŭlta rivereto al kiu skribas 316 00:26:41,810 --> 00:26:45,190 vi trovos el proksimume en la mallonga. 317 00:26:45,190 --> 00:26:50,080 Do nepre rigardu ĝin. 318 00:26:50,080 --> 00:26:53,010 >> En la hodiaŭa sekcio, ni iras por paroli iomete pri GDB, 319 00:26:53,010 --> 00:26:57,720 ekde la pli familiara vi estas kun gxi, des pli oportuna vi ricevas per ĝi, 320 00:26:57,720 --> 00:27:01,390 la pli kapablaj vi estos por fakte ĉasi erarojn en viaj propraj kodo. 321 00:27:01,390 --> 00:27:05,540 Ĉi akcelas la procezon de elpurigante supren terure. 322 00:27:05,540 --> 00:27:09,230 Do uzante printf, ĉiufoje vi faros, ke vi havas recompilar vian kodon, 323 00:27:09,230 --> 00:27:13,000 vi devas kuri ĝin denove, iam vi devas movi la printf alvoko ĉirkaŭe, 324 00:27:13,000 --> 00:27:17,100 komenti el kodon, ĝi nur prenas iom da tempo. 325 00:27:17,100 --> 00:27:20,850 Nia celo estas provi kaj konvinki vin, ke kun GDB, vi povas esence 326 00:27:20,850 --> 00:27:26,810 printf ion en ajna punkto en via kodo kaj vi neniam devas recompilar ĝin. 327 00:27:26,810 --> 00:27:35,120 Vi neniam devas starti kaj observu diveni kie printf proksima. 328 00:27:35,120 --> 00:27:40,910 La unua afero por fari estas kopii tiun linion kaj akiri la sekcio kodo ekstere de la retejo. 329 00:27:40,910 --> 00:27:47,530 Mi kopias ĉi tiu linio de kodo kiu diras, "wget ​​http://cdn.cs50.net". 330 00:27:47,530 --> 00:27:49,510 Mi tuj kopii ĝin. 331 00:27:49,510 --> 00:27:55,950 Mi iros, por transiri al mia aparaton, malzomi do vi povas vidi kion mi faras, 332 00:27:55,950 --> 00:28:01,890 intergluajn ĝin en tie, kaj kiam mi batis Enter, ĉi wget komando laŭvorte estas retejo akiras. 333 00:28:01,890 --> 00:28:06,210 Ĝi tuj disbatos tiu dosiero ekstere de la Interreto, 334 00:28:06,210 --> 00:28:11,790 kaj tuj savi ĝin al la aktuala dosierujo. 335 00:28:11,790 --> 00:28:21,630 Nun, se mi listigi mia aktuala dosierujo vi povas vidi, ke mi havas ĉi section5.zip dosiero dekstre en tie. 336 00:28:21,630 --> 00:28:25,260 La maniero trakti kun tiu ulo estas maldensigi ĝin, 337 00:28:25,260 --> 00:28:27,650 kion vi povas fari en la komandlinio, ĝuste kiel ĉi tiu. 338 00:28:27,650 --> 00:28:31,880 Section5.zip. 339 00:28:31,880 --> 00:28:36,980 Tio estos maldensigi ĝin, krei la dosierujon por mi, 340 00:28:36,980 --> 00:28:40,410 ŝveligi ĉiuj enhavoj, metis ilin tien. 341 00:28:40,410 --> 00:28:47,410 Do nun mi povas eniri en mian sekcio 5 katalogo uzanta la cd komandon. 342 00:28:47,410 --> 00:28:58,310 Certe la ekrano uzante klara. Do certe la ekrano. 343 00:28:58,310 --> 00:29:02,280 Nun mi havas belan pura fina trakti. 344 00:29:02,280 --> 00:29:06,200 >> Nun, se mi listigi ĉiujn dosierojn kiujn mi vidas en ĉi tiu dosierujo, 345 00:29:06,200 --> 00:29:12,270 vi vidas, ke mi havas kvar dosieroj: buggy1, buggy2, buggy3, kaj buggy4. 346 00:29:12,270 --> 00:29:16,180 Mi ankaŭ ricevis siajn respondajn. C dosierojn. 347 00:29:16,180 --> 00:29:20,400 Ni ne intencas rigardi la. C dosierojn por nun. 348 00:29:20,400 --> 00:29:24,140 Anstataŭe, ni tuj uzi ilin kiam ni malfermas GDB. 349 00:29:24,140 --> 00:29:28,220 Ni konservis ĉirkaŭ tiel ke ni havas aliron al la efektiva fontkodo kiam ni uzas GDB, 350 00:29:28,220 --> 00:29:32,740 sed la celo de tiu parto de la sekcio estas toquetear tie kun GDB 351 00:29:32,740 --> 00:29:40,370 kaj vidi kiel ni povas uzi ĝin por kalkuli kio okazas malĝusta kun ĉiu de tiuj kvar kalesxo programoj. 352 00:29:40,370 --> 00:29:43,380 Do ni simple tuj ĉirkaŭ la ĉambron vere rapide, 353 00:29:43,380 --> 00:29:47,000 kaj mi tuj demandas iu kuri unu el la kalesxo programoj, 354 00:29:47,000 --> 00:29:54,730 kaj poste ni iros kiel grupo tra GDB, kaj ni vidos kion ni povas fari por ripari tiujn programojn, 355 00:29:54,730 --> 00:29:58,460 aŭ almenaŭ identigi kio okazas erara en ĉiu el ili. 356 00:29:58,460 --> 00:30:04,760 Ni komencu super tie kun Daniel. Ĉu vi kuras buggy1? Ni vidu kio okazos. 357 00:30:04,760 --> 00:30:09,470 [Daniel] Ĝi diras ke estas apliko kulpo. >> Jes. Ekzakte. 358 00:30:09,470 --> 00:30:12,460 Do se mi kuros buggy1, mi ricevas seg kulpo. 359 00:30:12,460 --> 00:30:16,210 Je ĉi tiu punkto, mi povus iri kaj malfermi buggy1.c, 360 00:30:16,210 --> 00:30:19,450 klopodi malkovri kio okazas erara, 361 00:30:19,450 --> 00:30:22,000 sed unu el la plej malaminda aferojn pri ĉi tiu seg kulpo eraron 362 00:30:22,000 --> 00:30:27,610 estas ke ĝi ne diras al vi sur kio linio de la programo aĵoj vere iris malbone kaj rompis. 363 00:30:27,610 --> 00:30:29,880 Vi ia devas rigardi la kodo 364 00:30:29,880 --> 00:30:33,990 kaj kalkuli uzante guess kaj kontroli aŭ printf por vidi kio okazas erara. 365 00:30:33,990 --> 00:30:37,840 Unu el la coolest aferojn pri GDB estas kiu estas vere, vere facila 366 00:30:37,840 --> 00:30:42,170 elŝeligi la linio je kiu via programo frakasas. 367 00:30:42,170 --> 00:30:46,160 Ĝi estas tute valoris por uzi ĝin, eĉ se nur por tio. 368 00:30:46,160 --> 00:30:56,190 Do por startigi supren GDB, mi tajpas GDB, kaj tiam mi donos al ĝi la vojon al la plenumebla, ke mi volas kuri. 369 00:30:56,190 --> 00:31:01,960 Jen mi tajpas gdb ./buggy1. 370 00:31:01,960 --> 00:31:06,600 Hit Eniru. Donas al mi ĉion ĉi informo pri kopirajto, 371 00:31:06,600 --> 00:31:13,000 kaj cxi tie vi vidos ĉi linio kiu diras, "Legante simbolojn de / home / 372 00:31:13,000 --> 00:31:17,680 jharvard/section5/buggy1. " 373 00:31:17,680 --> 00:31:22,060 Kaj se ĉiu iras bone, vi vidos ĝin presi mesaĝon kiu aspektas kiel ĉi tio. 374 00:31:22,060 --> 00:31:25,500 Ĝi legos simboloj, ĝi diros "Mi legis simboloj de via ruleblan dosieron," 375 00:31:25,500 --> 00:31:29,900 kaj tiam havos ĉi tiu "fakto" mesaĝo super tie. 376 00:31:29,900 --> 00:31:35,410 Se vi vidas iun alian variado de tio, aŭ vi vidas ne povis trovi la simboloj 377 00:31:35,410 --> 00:31:41,460 aŭ io simila, kion tio signifas, ke vi simple ne kompilis vian ruleblan konvene. 378 00:31:41,460 --> 00:31:49,980 Kiam ni kompilos programoj por uzi kun GDB, ni devas uzi tiun specialan-g flago, 379 00:31:49,980 --> 00:31:54,540 kaj tio farita de defaŭlta se vi kompili viajn programojn, kun nur tajpi fari 380 00:31:54,540 --> 00:31:59,320 aŭ fari kalesxo aŭ fari rekuperi, iu el tiuj. 381 00:31:59,320 --> 00:32:07,800 Sed se vi kompili permane kun Clang, tiam vi devos iri en kaj inkluzivas ke-g flago. 382 00:32:07,800 --> 00:32:10,310 >> Je ĉi tiu punkto, nun ke ni havas niajn GDB prompto, 383 00:32:10,310 --> 00:32:12,310 ĝi estas bela simpla ruli la programon. 384 00:32:12,310 --> 00:32:19,740 Ni povas aŭ tajpi kuri, aŭ ni povas simple tajpi r. 385 00:32:19,740 --> 00:32:22,820 Plej GDB komandojn povas esti mallongigita. 386 00:32:22,820 --> 00:32:25,940 Kutime al nur unu aŭ kelkaj leteroj, kiujn estas sufiĉe bela. 387 00:32:25,940 --> 00:32:30,980 Do Saad, se vi tajpas r kaj batis Enter, kio okazas? 388 00:32:30,980 --> 00:32:39,390 [Saad] I got SIGSEGV, segmentación kulpo, kaj tiam ĉio ĉi gobbledygook. 389 00:32:39,390 --> 00:32:43,650 >> Jes. 390 00:32:43,650 --> 00:32:47,990 Kiel ni vidas sur la ekrano nun, kaj kiel Saad diris, 391 00:32:47,990 --> 00:32:53,430 kiam ni tajpi kuri aŭ r kaj batis Enter, ni ankoraŭ preni la sama seg kulpo. 392 00:32:53,430 --> 00:32:55,830 Do uzante GDB ne solvas nian problemon. 393 00:32:55,830 --> 00:32:59,120 Sed ĝi donas al ni iun gobbledygook, kaj rezultas ke ĉi gobbledygook 394 00:32:59,120 --> 00:33:03,080 fakte diras ni kie okazas. 395 00:33:03,080 --> 00:33:10,680 Por analizi ĉi iom, tiu ĉi unua bito estas la funkcio en kiu ĉio okazas erara. 396 00:33:10,680 --> 00:33:20,270 Estas ĉi __ strcmp_sse4_2, kaj diras al ni ke okazas en tiu dosiero 397 00:33:20,270 --> 00:33:29,450 vokis sysdeps/i386, ĉiuj ĉi, denove, ia malordo - sed linio 254. 398 00:33:29,450 --> 00:33:31,670 Tio estas speco de malfacile analizi. Kutime kiam vi vidas aĵojn kiel ĉi tiu, 399 00:33:31,670 --> 00:33:38,770 tio signifas, ke ĝi estas seg faulting en unu el la sistemo bibliotekoj. 400 00:33:38,770 --> 00:33:43,220 Do iel rilatas al strcmp. You guys vidis strcmp antaŭe. 401 00:33:43,220 --> 00:33:52,730 Ne tro freneza, sed faras tio signifas, ke strcmp estas rompita aŭ ke estas problemo kun strcmp? 402 00:33:52,730 --> 00:33:57,110 Kion vi opinias, Aleksandro? 403 00:33:57,110 --> 00:34:04,890 [Aleksandro] Is that - estas 254 la linio? Kaj la - ne la duuma, sed ĝi ne estas lia plafonoj, 404 00:34:04,890 --> 00:34:10,590 kaj tiam ne estas alia lingvo por ĉiu funkcio. Ĉu tio estas 254 en tiu funkcio, aŭ -? 405 00:34:10,590 --> 00:34:21,460 >> Estas linio 254. Ĝi aspektas kiel en ĉi. S-dosiero, tiel ke estas asembleo kodo probable. 406 00:34:21,460 --> 00:34:25,949 >> Sed, mi supozas la plej prema afero estas, ĉar ni akiris seg kulpo, 407 00:34:25,949 --> 00:34:29,960 kaj ĝi ŝajne venas el la strcmp funkcio, 408 00:34:29,960 --> 00:34:38,030 tio ĉi implicas, tiam, ke strcmp estas rompita? 409 00:34:38,030 --> 00:34:42,290 Ĝi devus ne, espereble. Do nur ĉar vi havas segmentación kulpo 410 00:34:42,290 --> 00:34:49,480 en unu el la sistemo funkcias, tipe, ke signifas, ke vi simple ne nomis ĝin ĝuste. 411 00:34:49,480 --> 00:34:52,440 La plej rapida afero por fari eltrovi kio vere okazas 412 00:34:52,440 --> 00:34:55,500 kiam vi vidas iun freneza kiel ĉi tiu, kiam vi vidos seg kulpo, 413 00:34:55,500 --> 00:34:59,800 precipe se vi havas programon ke tio uzante pli ol nur ĉefaj, 414 00:34:59,800 --> 00:35:03,570 estas uzi retrospuro. 415 00:35:03,570 --> 00:35:13,080 Mi mallongigi retrospuro skribante bt, kontraste al la plena retrospuro vorto. 416 00:35:13,080 --> 00:35:16,510 Sed Charlotte, kio okazas kiam vi tajpas bt kaj sukceson Entajpu? 417 00:35:16,510 --> 00:35:23,200 [Charlotte] Ĝi montras al mi du linioj, la linio 0 kaj linio 1. 418 00:35:23,200 --> 00:35:26,150 >> Jes. Do linio 0 kaj linio 1. 419 00:35:26,150 --> 00:35:34,560 Ĉi tiuj estas la efektiva pilo kadroj, kiuj estis nuntempe en ludo, kiam via programo frakasis. 420 00:35:34,560 --> 00:35:42,230 Ekde la plejsupra kadro, framo 0, kaj iras al la fundo-plej, kiu estas framo 1. 421 00:35:42,230 --> 00:35:45,140 Nia plejsupra kadro estas la strcmp kadro. 422 00:35:45,140 --> 00:35:50,080 Vi povas pensi pri tio kiel simila al tiu problemo ni nur faras en la kvizo kun la indikoj, 423 00:35:50,080 --> 00:35:54,890 kie ni estis interŝanĝi pilo kadro sur ĉefa pilo kadro, 424 00:35:54,890 --> 00:35:59,700 kaj ni havis la variabloj kiuj interŝanĝa uzis sur la variabloj kiuj ĉefa uzis. 425 00:35:59,700 --> 00:36:08,440 Jen nia akcidento okazis en nia strcmp funkcio, kiu estis nomita de nia ĉefa funkcio, 426 00:36:08,440 --> 00:36:14,370 kaj retrospuro, donas al ni ne nur la funkcioj en kiujn aferojn malsukcesis, 427 00:36:14,370 --> 00:36:16,440 sed ĝi estas ankaŭ dirante al ni kie ĉiu estis nomita de. 428 00:36:16,440 --> 00:36:18,830 Do se mi rulumu super iom pli dekstre, 429 00:36:18,830 --> 00:36:26,110 ni povas vidi ke jes, ni estis sur linio 254 de ĉi strcmp-sse4.s dosiero. 430 00:36:26,110 --> 00:36:32,540 Sed la alvoko estis farita je buggy1.c, linio 6. 431 00:36:32,540 --> 00:36:35,960 Do tio signifas ke ni povas fari - estas ni povas simple iru kontroli kaj vidu kio okazas 432 00:36:35,960 --> 00:36:39,930 ĉe buggy1.c, linio 6. 433 00:36:39,930 --> 00:36:43,780 Denove, estas kelkaj manieroj por fari tion. Unu estas por eliri el GDB 434 00:36:43,780 --> 00:36:49,460 aŭ havi vian kodo malfermu en alia fenestro kaj kruco referenco. 435 00:36:49,460 --> 00:36:54,740 Tio, en kaj de sin, estas sufiĉe utila ĉar nun se vi estas en oficejo horoj 436 00:36:54,740 --> 00:36:57,220 kaj kiam vi mem havigis al seg kulpo kaj via TF la mirantaj kie ĉiu estis rompi, 437 00:36:57,220 --> 00:36:59,710 vi povas simple diri: "Ho, linio 6. Mi ne scias kio okazas, 438 00:36:59,710 --> 00:37:03,670 sed io pri linio 6 provokas mian programon por rompi. " 439 00:37:03,670 --> 00:37:10,430 La alia maniero por fari ĝin estas vi povas uzi tiun komandon nomis lerta en GDB. 440 00:37:10,430 --> 00:37:13,650 Vi povas ankaŭ mallongigi ĝin l. 441 00:37:13,650 --> 00:37:18,910 Do, se ni batis l, kion ni preni tie? 442 00:37:18,910 --> 00:37:21,160 Ni preni tuta amaso de strangaj aĵoj. 443 00:37:21,160 --> 00:37:26,030 Ĉi tiu estas la reala asembleo kodo 444 00:37:26,030 --> 00:37:29,860 kiu estas en strcmp_sse4_2. 445 00:37:29,860 --> 00:37:32,440 Ĉi aspektas ia funky, 446 00:37:32,440 --> 00:37:36,520 kaj la kialo estas duumaj ĉi estas ĉar ĝuste nun, 447 00:37:36,520 --> 00:37:40,160 GDB havas ni en kadro 0. 448 00:37:40,160 --> 00:37:43,070 >> Do aùton ni rigardas variabloj, ajna tempo ni rigardas fontkodo, 449 00:37:43,070 --> 00:37:50,530 ni rigardas fontkodon kiu rilatas al la pilo kadro ni aktuale in 450 00:37:50,530 --> 00:37:53,200 Do, por akiri ion signfa, ni devas 451 00:37:53,200 --> 00:37:57,070 movi al pilo kadro kiu faras pli senco. 452 00:37:57,070 --> 00:38:00,180 En ĉi tiu kazo, la ĉefa pilo kadro farus iom pli senso, 453 00:38:00,180 --> 00:38:02,680 ĉar tio estis fakte la kodo kiun ni skribis. 454 00:38:02,680 --> 00:38:05,330 Ne la strcmp kodo. 455 00:38:05,330 --> 00:38:08,650 La vojo vi povas movi inter kulisoj, en ĉi tiu kazo, ĉar ni havas du, 456 00:38:08,650 --> 00:38:10,430 ni havos 0 kaj 1, 457 00:38:10,430 --> 00:38:13,650 vi faru tion kun la supren-malsupren ordonojn. 458 00:38:13,650 --> 00:38:18,480 Se mi movi supren unu kadro, 459 00:38:18,480 --> 00:38:21,770 nun mi estas en la ĉefa pilo kadro. 460 00:38:21,770 --> 00:38:24,330 Mi povas movi malsupren reiri al kie mi estis, 461 00:38:24,330 --> 00:38:32,830 iru denove, iru malsupren denove, kaj iru denove. 462 00:38:32,830 --> 00:38:39,750 Se vi iam fari vian programon en GDB, vi ricevas akcidento, vi ricevas la retrospuro, 463 00:38:39,750 --> 00:38:42,380 kaj vi vidos, ke estas en iu dosiero, kiun vi ne scias kio okazas. 464 00:38:42,380 --> 00:38:45,460 Vi provu listo, la kodo ne aspektas familiaraj al vi, 465 00:38:45,460 --> 00:38:48,150 rigardu vian kadroj kaj eltrovi kie vi estas. 466 00:38:48,150 --> 00:38:51,010 Vi estas probable en la malĝusta pilo kadro. 467 00:38:51,010 --> 00:38:58,760 Aŭ almenaŭ vi en pilo kadro kiu estas ne tia, oni povas vere elpurigi. 468 00:38:58,760 --> 00:39:03,110 Nun ke ni estas en la taŭgan pilo kadro, ni estas en ĉefa, 469 00:39:03,110 --> 00:39:08,100 nun ni povas uzi la liston komando elkompreni kiel la linio estis. 470 00:39:08,100 --> 00:39:13,590 Kaj vi povas vidi gxin, tio presita ĝin por ni ĉi tie. 471 00:39:13,590 --> 00:39:19,470 Sed ni povas kolizii listigi ĉiuj la sama, kaj listo donas al ni tiu bela printaĵo 472 00:39:19,470 --> 00:39:23,920 de la reala fonto kodo kiu okazas en ĉi tie. 473 00:39:23,920 --> 00:39:26,420 >> En aparta, ni povas rigardi linio 6. 474 00:39:26,420 --> 00:39:29,330 Ni povas vidi kio okazas tie. 475 00:39:29,330 --> 00:39:31,250 Kaj ĝi aspektas kiel ni fari ĉenon komparo 476 00:39:31,250 --> 00:39:41,050 inter la ĉeno "CS50 rokoj" kaj argv [1]. 477 00:39:41,050 --> 00:39:45,700 Ion pri ĉi tio frakasi. 478 00:39:45,700 --> 00:39:54,120 Do Missy, ĉu vi havas pensojn sur kio oni povus okazas ĉi tie? 479 00:39:54,120 --> 00:39:59,400 [Missy] Mi ne scias kial estas frakasi. >> Vi ne scias kial estas frakasi? 480 00:39:59,400 --> 00:40:02,700 Jimmy, ajna pensoj? 481 00:40:02,700 --> 00:40:06,240 [Jimmy] Mi ne tute certas, sed la lasta fojo ni uzis string kompari, 482 00:40:06,240 --> 00:40:10,260 aŭ strcmp, ni havis kiel tri malsamaj kazoj sub ĝi. 483 00:40:10,260 --> 00:40:12,800 Ni ne havas ==, mi ne pensas, ĝuste en tiu unua linio. 484 00:40:12,800 --> 00:40:16,700 Anstataŭe ĝi estis disigita en tri, kaj unu estis == 0, 485 00:40:16,700 --> 00:40:19,910 estis <0, mi pensas, kaj unu estis> 0. 486 00:40:19,910 --> 00:40:22,590 Do eble io simila? >> Jes. Do tie estas tio temo 487 00:40:22,590 --> 00:40:27,200 de ni faras la komparon korekte? 488 00:40:27,200 --> 00:40:31,660 Stella? Ajna pensoj? 489 00:40:31,660 --> 00:40:38,110 [Stella] Mi ne estas certa. >> Not sure. Daniel? Pensoj? Okay. 490 00:40:38,110 --> 00:40:44,770 Ĝi rezultas kio okazas ĉi tie estas kiam ni kuris la programo 491 00:40:44,770 --> 00:40:48,370 kaj ni ekhavis la seg kulpo, kiam vi kuris de la programo por la unua fojo, Daniel, 492 00:40:48,370 --> 00:40:50,800 vi donu ajna komandlinio argumentoj? 493 00:40:50,800 --> 00:40:58,420 [Daniel] No >> No En tiu kazo, kio estas la valoro de argv [1]? 494 00:40:58,420 --> 00:41:00,920 >> Ne estas valoro. >> Ĝuste. 495 00:41:00,920 --> 00:41:06,120 Nu, ne estas taŭgaj string valoro. 496 00:41:06,120 --> 00:41:10,780 Sed estas iu valoro. Kio estas la valoro kiu prenas stokitaj en tie? 497 00:41:10,780 --> 00:41:15,130 >> A rubo valoro? >> Estas ĉu rubo valoro aŭ, en ĉi tiu kazo, 498 00:41:15,130 --> 00:41:19,930 Fine de la argv tabelo estas ĉiam finita kun nula. 499 00:41:19,930 --> 00:41:26,050 Do kio reale got stokitaj en tie estas nula. 500 00:41:26,050 --> 00:41:30,810 La alia maniero por solvi tion, anstataŭ pensi ĝin tra, 501 00:41:30,810 --> 00:41:33,420 estas klopodi presi ĝin. 502 00:41:33,420 --> 00:41:35,880 Tie estas kie mi diris ke uzi GDB estas granda, 503 00:41:35,880 --> 00:41:40,640 ĉar vi povas presi ĉiuj variabloj, ĉiuj valoroj kiujn vi volas 504 00:41:40,640 --> 00:41:43,230 uzante ĉi oportunan-dando p komando. 505 00:41:43,230 --> 00:41:48,520 Do se mi tajpas p kaj tiam mi tajpi la valoro de variablo aux la nomo de variablo, 506 00:41:48,520 --> 00:41:55,320 diru argc, mi vidas ke argc estas 1. 507 00:41:55,320 --> 00:42:01,830 Se mi volas presi argv [0], mi povas tion fari nur tiel. 508 00:42:01,830 --> 00:42:04,840 Kaj kiel ni vidis, argv [0] estas ĉiam la nomo de via programo, 509 00:42:04,840 --> 00:42:06,910 ĉiam la nomo de la plenumebla. 510 00:42:06,910 --> 00:42:09,740 Jen vi vidas ĝi estas atingis la kompletan padon nomo. 511 00:42:09,740 --> 00:42:15,920 Mi povas ankaŭ printi argv [1] kaj vidu kio okazas. 512 00:42:15,920 --> 00:42:20,890 >> Jen ni akiris tian mistika valoro. 513 00:42:20,890 --> 00:42:23,890 Ni atingis tiun 0x0. 514 00:42:23,890 --> 00:42:27,850 Memoru komence de la termino, kiam ni parolis pri deksesuma numero? 515 00:42:27,850 --> 00:42:34,680 Aŭ kiu iom demando fine de pset 0 pri kiel reprezenti 50 en deksesuma? 516 00:42:34,680 --> 00:42:39,410 La vojo ni skribi deksesumajn numerojn en CS, nur por ne konfuzi nin 517 00:42:39,410 --> 00:42:46,080 kun decimalaj nombroj, estas ni ĉiam prefikso ilin kun 0x. 518 00:42:46,080 --> 00:42:51,420 Do ĉi prefikson 0x ĉiam nur signifas interpreti la sekvan numeron kiel deksesuma nombro, 519 00:42:51,420 --> 00:42:57,400 ne kiel ĉenon, ne kiel dekuma nombro, ne kiel duuma nombro. 520 00:42:57,400 --> 00:43:02,820 Ekde la nombro 5-0 estas valida nombro en deksesuma. 521 00:43:02,820 --> 00:43:06,240 Kaj ĝi estas nombro en dekuma, 50. 522 00:43:06,240 --> 00:43:10,050 Do ĉi tiu estas kiom ni disambiguate. 523 00:43:10,050 --> 00:43:14,860 Do 0x0 per deksesumaj 0, kiu estas ankaŭ dekuma 0, duuma 0. 524 00:43:14,860 --> 00:43:17,030 Estas nur la valoron 0. 525 00:43:17,030 --> 00:43:22,630 Ĝi rezultas ke ĉi tio estas kion nula estas, efektive, en memoro. 526 00:43:22,630 --> 00:43:25,940 Nula estas nur 0. 527 00:43:25,940 --> 00:43:37,010 Ĉi tie, la elemento stokitaj en argv [1] estas nula. 528 00:43:37,010 --> 00:43:45,220 Do ni provas kompari niajn "CS50 rokoj" kordoj al nula linio. 529 00:43:45,220 --> 00:43:48,130 Do dereferencing nula, klopodante atingi aĵojn al nula, 530 00:43:48,130 --> 00:43:55,050 tiuj estas tipe tuj kaŭzos ian segmentación kulpo aŭ aliaj malbonaj aferoj okazos. 531 00:43:55,050 --> 00:43:59,350 Kaj ĝi rezultas ke strcmp ne kontrolu vidi 532 00:43:59,350 --> 00:44:04,340 ĉu vi jam pasis en valoro kiu estas nula. 533 00:44:04,340 --> 00:44:06,370 Pli ĝuste, ĵus antaŭeniras, provas fari lian aferon, 534 00:44:06,370 --> 00:44:14,640 kaj se seg kulpoj, ĝi seg kulpojn, kaj tio estas via problemo. Vi devas iri ripari ĝin. 535 00:44:14,640 --> 00:44:19,730 Vere rapide, kiom eble ni ripari tiun problemon? Charlotte? 536 00:44:19,730 --> 00:44:23,540 [Charlotte] Vi povas kontroli per se. 537 00:44:23,540 --> 00:44:32,240 Do se argv [1] estas nula, == 0, tiam revenu 1, aŭ iu [nekompreneblaj]. 538 00:44:32,240 --> 00:44:34,590 >> Jes. Do jen unu granda maniero fari ĝin, kiel ni povas kontroli vidi, 539 00:44:34,590 --> 00:44:39,230 la valoron ni baldaŭ pasos en strcmp, argv [1], ĉu nula? 540 00:44:39,230 --> 00:44:45,830 Se ĝi estas nula, tiam ni povas diri estas bone, aborti. 541 00:44:45,830 --> 00:44:49,450 >> Pli komuna maniero por fari ĉi estas uzi la argc valoro. 542 00:44:49,450 --> 00:44:52,040 Vi povas vidi ĉi tie komence de ĉefa, 543 00:44:52,040 --> 00:44:58,040 ni preterlasis tiun unuan provon kiu ni kutime faras kiam ni uzas komandlinio argumentoj, 544 00:44:58,040 --> 00:45:05,240 kiu estas por testi ĉu nia argc valoro estas kion ni atendas. 545 00:45:05,240 --> 00:45:10,290 En ĉi tiu kazo, ni atendas almenaŭ du argumentoj, 546 00:45:10,290 --> 00:45:13,660 la nomo de la programo plus unu alia. 547 00:45:13,660 --> 00:45:17,140 Ĉar ni volis uzi la dua argumento ĉi tie. 548 00:45:17,140 --> 00:45:21,350 Do havi ian provon antauxe, antaux nia strcmp alvoko 549 00:45:21,350 --> 00:45:37,390 ke provoj ĉu argv estas almenaŭ 2, ankaŭ fari la samon tiaj aferoj. 550 00:45:37,390 --> 00:45:40,620 Ni povas vidi se kiu laboras por kuri la programon denove. 551 00:45:40,620 --> 00:45:45,610 Vi povas ĉiam rekomenci vian programon ene GDB, kiu estas vere bela. 552 00:45:45,610 --> 00:45:49,310 Vi povas kuri, kaj kiam vi pasos en argumentoj al via programo, 553 00:45:49,310 --> 00:45:53,060 ilin pasas en kiam vi nomas kuri, ne kiam vi startigi supren GDB. 554 00:45:53,060 --> 00:45:57,120 Tiel vi povos teni alpreĝante vian programon kun malsamaj argumentoj ĉiufoje. 555 00:45:57,120 --> 00:46:08,080 Tiel kuras, aŭ denove, mi povas tajpi r, kaj ni vidu kio okazas se ni tajpi "saluton". 556 00:46:08,080 --> 00:46:11,140 Ĝi ĉiam demandi ĉu vi volas komenci ĝin de la komenco denove. 557 00:46:11,140 --> 00:46:17,490 Kutime, vi volas komenci ĝin de la komenco denove. 558 00:46:17,490 --> 00:46:25,010 Kaj je tiu punkto, ĝi restarts ĝin denove, presas el 559 00:46:25,010 --> 00:46:28,920 la programo kiu ni kuris, buggy1, kun la argumento saluton, 560 00:46:28,920 --> 00:46:32,720 kaj presas tiun normon eliro; diras, "Vi ricevos D," malgaja vizaĝo. 561 00:46:32,720 --> 00:46:37,610 Sed ni ne seg kulpo. Ĝi diras ke procezo eliris kutime. 562 00:46:37,610 --> 00:46:39,900 Por ke aspektas sufiĉe bone. 563 00:46:39,900 --> 00:46:43,050 Ne plu seg kulpo, ni faris estinteco, 564 00:46:43,050 --> 00:46:48,190 tiel ĝi aspektas kiel tio estis ja la seg kulpo cimo ke ni ricevas. 565 00:46:48,190 --> 00:46:51,540 Bedaŭrinde, ĝi diras ke ni estas duumaj D. 566 00:46:51,540 --> 00:46:54,090 >> Ni povas reiri kaj rigardu la kodon kaj vidi kio okazas tie 567 00:46:54,090 --> 00:46:57,980 elŝeligi kio estis - kial estis rakontanta al ni, ke ni akiris D. 568 00:46:57,980 --> 00:47:03,690 Vidu, jen estis ĉi printf dirante ke vi ricevis D. 569 00:47:03,690 --> 00:47:08,540 Se ni tajpi liston, ke vi tenas tajpi listo, ĝi gardas ripetanta tra via programo, 570 00:47:08,540 --> 00:47:10,940 tial ĝi montros al vi la unuaj kelkaj linioj de via programo. 571 00:47:10,940 --> 00:47:15,450 Tiam montros al vi la sekvaj linioj, kaj la sekvan eron kaj la sekvan eron. 572 00:47:15,450 --> 00:47:18,240 Kaj ĝi malebligos ke provante iri malsupren. 573 00:47:18,240 --> 00:47:21,180 Kaj nun ni ricevos por "vicigi nombro 16 estas el teritorio." 574 00:47:21,180 --> 00:47:23,940 Ĉar ĝi nur havas 15 liniojn. 575 00:47:23,940 --> 00:47:30,310 Se vi atingos tiun punkton kaj via scivolante, "Kion mi faru?" vi povas uzi la helpon komando. 576 00:47:30,310 --> 00:47:34,340 Uzu helpi kaj tiam donu al ĝi la nomon de komando. 577 00:47:34,340 --> 00:47:36,460 Kaj vi vidos la GDB donas al ni ĉion ĉi speco de aĵoj. 578 00:47:36,460 --> 00:47:43,870 Ĝi diras, "Kun neniu argumento, listas dek pli linioj post aŭ ĉirkaŭ la antaŭa listo. 579 00:47:43,870 --> 00:47:47,920 Listo - listas la dek linioj antaŭ - " 580 00:47:47,920 --> 00:47:52,960 Do ni provu uzi listo minus. 581 00:47:52,960 --> 00:47:57,000 Kaj kiu printas la 10 linioj antaŭa; vi povas ludi tie kun listo iom. 582 00:47:57,000 --> 00:48:02,330 Vi povas fari liston, listo - vi povas eĉ doni listigi kelkajn, kiel listo 8, 583 00:48:02,330 --> 00:48:07,500 kaj ĝi devos printi la 10 linioj ĉirkaŭ linio 8. 584 00:48:07,500 --> 00:48:10,290 Kaj vi povas vidi kio okazas ĉi tie estas vi havas simplan se alia. 585 00:48:10,290 --> 00:48:13,980 Se vi tajpas en CS50 rokoj, presas el "Vi ricevas A." 586 00:48:13,980 --> 00:48:16,530 Alie ĝi presas el "Vi ricevas D." 587 00:48:16,530 --> 00:48:23,770 Bummer vilaĝon. Bone. Jes? 588 00:48:23,770 --> 00:48:26,730 >> [Daniel] Do, kiam mi provis fari CS50 rokoj sen la citiloj, 589 00:48:26,730 --> 00:48:29,290 diras "Vi ricevas D." 590 00:48:29,290 --> 00:48:32,560 Mi bezonas la citaĵojn por akiri ĝin por labori, kial estas tio? 591 00:48:32,560 --> 00:48:38,490 >> Jes. Rezultas ke kiam - tiu ĉi estas alia amuza iom sojfabo - 592 00:48:38,490 --> 00:48:47,900 kiam vi kuras la programon, se ni ruli ĝin kaj ni entajpi CS50 rokoj, 593 00:48:47,900 --> 00:48:50,800 samkiel Daniel diris li faris, kaj vi batis Enter, 594 00:48:50,800 --> 00:48:52,870 ĝi ankoraŭ diras ni preni D. 595 00:48:52,870 --> 00:48:55,580 Kaj la demando, kial tio estas? 596 00:48:55,580 --> 00:49:02,120 Kaj ĝi rezultas ke ambaŭ niaj fina kaj GDB analizi tiujn kiel du apartaj argumentoj. 597 00:49:02,120 --> 00:49:04,800 Ĉar kiam estas spaco, ke tio implicis tiel 598 00:49:04,800 --> 00:49:08,730 la unua argumento finigxis la sekvanta argumento estas por komenci. 599 00:49:08,730 --> 00:49:13,260 La maniero por kombini tiujn en du aux sorry, en unu argumento, 600 00:49:13,260 --> 00:49:18,510 estas uzi la citilojn. 601 00:49:18,510 --> 00:49:29,560 Do nun, se ni metas ĝin en citaĵoj kaj ruli ĝin denove, ni ricevas A. 602 00:49:29,560 --> 00:49:38,780 Do nur por recap, neniu citaĵoj, CS50 kaj rokoj estas analizitaj kiel du apartajn argumentojn. 603 00:49:38,780 --> 00:49:45,320 Kun citaĵoj, ĝi estas analizitaj kiel unu argumento aro. 604 00:49:45,320 --> 00:49:53,070 >> Ni povas vidi ĉi tion kun Haltpunkto. 605 00:49:53,070 --> 00:49:54,920 Ĝis nun ni estis kuranta nia programo, kaj ĝi estas estinta kurante 606 00:49:54,920 --> 00:49:58,230 ĝis ĉu ĝi seg kulpoj aŭ sukcesoj eraron 607 00:49:58,230 --> 00:50:05,930 aŭ ĝis ĝi eliris kaj ĉiuj estis plene fajna. 608 00:50:05,930 --> 00:50:08,360 Tio ne estas nepre la plej utila afero, ĉar kelkfoje 609 00:50:08,360 --> 00:50:11,840 vi havas eraron en via programo, sed ne kaŭzante segmentación kulpo. 610 00:50:11,840 --> 00:50:16,950 Tio ne kaŭzante via programo por halti aŭ nenion tiel. 611 00:50:16,950 --> 00:50:20,730 La maniero akiri GDB paŭzi vian programon en aparta punkto 612 00:50:20,730 --> 00:50:23,260 Estas por kontrauxmeti Haltpunkto. 613 00:50:23,260 --> 00:50:26,520 Vi povas aŭ fari tion per opcio oni Haltpunkto sur funkcio nomo 614 00:50:26,520 --> 00:50:30,770 aŭ vi povas agordi Haltpunkto sur aparta linio de kodo. 615 00:50:30,770 --> 00:50:34,450 Mi ŝatas starigis breakpoints sur funkcio nomoj, ĉar - facile memorebla, 616 00:50:34,450 --> 00:50:37,700 kaj se vi efektive iru kaj ŝanĝu vian fontkodon ĝis iom, 617 00:50:37,700 --> 00:50:42,020 tiam via Haltpunkto efektive resti ĉe la sama loko en viaj kodo. 618 00:50:42,020 --> 00:50:44,760 Dum se vi uzas linio nombroj, kaj la linio nombroj ŝanĝi 619 00:50:44,760 --> 00:50:51,740 ĉar vi aldoni aŭ forigi iom da kodo, tiam via breakpoints estas ĉiuj tute ŝraŭbita supren. 620 00:50:51,740 --> 00:50:58,590 Unu de la plej komunaj aferoj mi estas metita al Haltpunkto sur la ĉefa funkcio. 621 00:50:58,590 --> 00:51:05,300 Ofte mi startigi supren GDB, mi tajpas b ĉefa, batis Enter, kaj tio estos starigis Haltpunkto 622 00:51:05,300 --> 00:51:10,630 sur la ĉefa funkcio kiu nur diras, "pauxzo la programo kiam vi komencos kuri," 623 00:51:10,630 --> 00:51:17,960 kaj aliflanken, kiam mi kuros mia programo kun, ni diru, CS50 rokoj kiel du argumentoj 624 00:51:17,960 --> 00:51:24,830 kaj batis Enter, alvenas al la ĉefa funkcio kaj li por rajto je la unua linio, 625 00:51:24,830 --> 00:51:30,620 ĝuste antaŭ ĝi taksas la strcmp funkcio. 626 00:51:30,620 --> 00:51:34,940 >> Ekde mi paŭzis, nun mi povas komenci mucking sin kaj vidi kio okazas 627 00:51:34,940 --> 00:51:40,250 kun ĉiuj de la malsamaj variabloj kiuj pasis en mian programon. 628 00:51:40,250 --> 00:51:43,670 Ĉi tie mi povas printi argc kaj vidu kio okazas. 629 00:51:43,670 --> 00:51:50,030 Vidu ke argc estas 3, ĉar ĝi estas prenita 3 malsamajn valorojn en ĝi. 630 00:51:50,030 --> 00:51:54,060 Oni ricevis la nomon de la programo, ĝi estas ekhavis la unua argumento kaj la dua argumento. 631 00:51:54,060 --> 00:52:09,330 Ni povas presi tiujn ekster per rigardante argv [0], argv [1], kaj argv [2]. 632 00:52:09,330 --> 00:52:12,030 Do nun vi povas ankaŭ vidi kial ĉi strcmp alvokon tuj malsukcesos, 633 00:52:12,030 --> 00:52:21,650 ĉar vi vidas, ke ĝi disigas la CS50 kaj la rokoj en du apartaj argumentoj. 634 00:52:21,650 --> 00:52:27,250 Je ĉi tiu punkto, unufoje vi batis Haltpunkto, vi povas daŭre pasas tra via programo 635 00:52:27,250 --> 00:52:32,920 linio por linio, kontraste ekde via programo denove. 636 00:52:32,920 --> 00:52:35,520 Do se vi ne volas komenci vian programon denove kaj nur daŭrigi de ĉi tie, 637 00:52:35,520 --> 00:52:41,970 vi povas uzi la komandon daŭrigi kaj daŭre kuros la programon al la fino. 638 00:52:41,970 --> 00:52:45,010 Samkiel ĝi faris ĉi tie. 639 00:52:45,010 --> 00:52:54,880 Tamen, se mi restartu la programo, CS50 rokoj, ĝi batas mia Haltpunkto denove, 640 00:52:54,880 --> 00:52:59,670 kaj ĉi tiu tempo, se mi ne volas ĝuste iri la tutan vojon tra la resto de la programo, 641 00:52:59,670 --> 00:53:08,040 Mi povas uzi la sekvan komandon, kiun mi ankaŭ mallongigi kun n. 642 00:53:08,040 --> 00:53:12,960 Kaj tion faros paŝo tra la programon linion por linio. 643 00:53:12,960 --> 00:53:17,530 Do vi povas rigardi kiel aĵoj ekzekuti, kiel variabloj ŝanĝo, kiel aĵoj get ĝisdatigita. 644 00:53:17,530 --> 00:53:21,550 Kiu estas bela agrabla. 645 00:53:21,550 --> 00:53:26,570 La alia cool afero estas iom ol ripetante la saman ordonon denove kaj denove kaj denove, 646 00:53:26,570 --> 00:53:30,670 se vi nur batis Entajpu - tiel ĉi tie vi vidas mi ne tajpis en nenio - 647 00:53:30,670 --> 00:53:33,780 se Mi nur batis Enter, ĝi ripetos la antaŭa komando, 648 00:53:33,780 --> 00:53:36,900 aŭ la antaŭa GDB komando kiu mi ĵus enmetita tien 649 00:53:36,900 --> 00:53:56,000 Mi povas teni bati Eniru kaj ĝi malebligos ke tretante per mia kodo linio por linio. 650 00:53:56,000 --> 00:53:59,310 Mi kuraĝigas vin infanoj iri kontrolu aliajn kalesxo programoj ankaŭ. 651 00:53:59,310 --> 00:54:01,330 Ni ne havas tempon por trairi ĉiuj ili hodiaŭ en sekcio. 652 00:54:01,330 --> 00:54:05,890 La fonta kodo estas tie, do vi povas ia vidi kio okazas 653 00:54:05,890 --> 00:54:07,730 malantaŭ la scenoj se vi iĝas vere pusxis, 654 00:54:07,730 --> 00:54:11,940 sed almenaŭ, simple praktiki booting supren GDB, 655 00:54:11,940 --> 00:54:13,940 kurante la programo ĝis ĝi rompiĝas sur vi, 656 00:54:13,940 --> 00:54:18,260 atingi la retrospuro, decidi kio funkcii la akcidento estis en, 657 00:54:18,260 --> 00:54:24,450 kio linio estis plu, presi iun variablo valoroj, 658 00:54:24,450 --> 00:54:30,140 nur tiel vi ricevas sento por tio, ĉar tio estos vere helpi vin tuj antaŭen. 659 00:54:30,140 --> 00:54:36,340 Je ĉi tiu punkto, ni tuj forlasis el GDB, kiu vi uzas quit aux simple q. 660 00:54:36,340 --> 00:54:40,460 Se via programo estas en la mezo de kurante ankoraŭ, kaj ĝi ne eliris, 661 00:54:40,460 --> 00:54:43,510 ĝi estos ĉiam demandas vin, "Ĉu vi vere vere volas forlasi?" 662 00:54:43,510 --> 00:54:48,770 Vi povas simple batis jes. 663 00:54:48,770 --> 00:54:55,250 >> Nun ni iras por rigardi la sekvanta problemo ni havas, kiu estas la kato programo. 664 00:54:55,250 --> 00:54:59,880 Se vi rigardas la mallonga sur redireccionando kaj tuboj, vi vidos ke Tommy uzas tiun programon 665 00:54:59,880 --> 00:55:07,540 kiu esence presas ĉiujn eligo de dosiero al la ekrano. 666 00:55:07,540 --> 00:55:12,660 Do se mi kuri kato, tiu estas fakte korpigita programon al la aparato, 667 00:55:12,660 --> 00:55:16,860 kaj se vi havas Mac vi povas fari tion en via Mac tro, se vi malfermas terminalo. 668 00:55:16,860 --> 00:55:25,630 Kaj ni - kato, diru, cp.c, kaj batis Eniru. 669 00:55:25,630 --> 00:55:29,640 Kio ĉi faris, se ni rulumu supren iomete kaj vidu kie ni kuris la linio, 670 00:55:29,640 --> 00:55:40,440 aŭ kie ni kuris la kato komando, ĝi laŭvorte ĵus presita ekster la enhavo de cp.c al nia ekrano. 671 00:55:40,440 --> 00:55:44,140 Ni povas ruli ĝin denove kaj vi povas meti en plurajn dosierojn kune. 672 00:55:44,140 --> 00:55:49,880 Do vi povas fari kato cp.c, kaj poste ni povas ankaŭ concatenate la cat.c dosiero, 673 00:55:49,880 --> 00:55:53,250 kiu estas la programo ni volis skribi, 674 00:55:53,250 --> 00:55:58,140 kaj ĝi devos presi ambaŭ dosieroj malantaŭo al malantaŭo al nia ekrano. 675 00:55:58,140 --> 00:56:05,490 Do, se ni rulumu supren iom, ni vidas ke kiam ni kuris ĉi kato cp.c, cat.c, 676 00:56:05,490 --> 00:56:17,110 unue presita ekster la cp-dosiero, kaj poste sub ĝin, presita ekster la cat.c dosiero dekstre cxi tie. 677 00:56:17,110 --> 00:56:19,650 Ni tuj uzos tiun por nur ricevi niajn piedojn malsekaj. 678 00:56:19,650 --> 00:56:25,930 Ludi tie kun simpla impreso al la fina, vidu kiel tiu funkcias. 679 00:56:25,930 --> 00:56:39,170 Se vi infanoj malfermi kun gedit cat.c, batis Enter, 680 00:56:39,170 --> 00:56:43,760 vi povas vidi la programon kiu ni volis skribi. 681 00:56:43,760 --> 00:56:48,980 Ni komprenis tiun belan kaldrono telero, do ni ne devas pasi tempon tajpi cxiuj eksteren. 682 00:56:48,980 --> 00:56:52,310 Ni ankaŭ kontroli la nombro de argumentoj pasis in 683 00:56:52,310 --> 00:56:56,910 Ni presi belan uzado mesaĝo. 684 00:56:56,910 --> 00:57:00,950 >> Ĉi tiu estas la speco de afero kiun, denove, kiel ni parolis pri, 685 00:57:00,950 --> 00:57:04,490 ĝi estas preskaŭ kiel muskolo memoro. 686 00:57:04,490 --> 00:57:07,190 Nur memoras teni fari la saman specon de ŝtofo 687 00:57:07,190 --> 00:57:11,310 kaj ĉiam videbligi el ia helpema mesaĝon 688 00:57:11,310 --> 00:57:17,670 por ke la homo estu kiel kuras via programo. 689 00:57:17,670 --> 00:57:21,630 Kun kato, ĝi estas bela simpla; ni nur tuj iros tra ĉiuj malsamaj argumentoj 690 00:57:21,630 --> 00:57:24,300 kiuj pasis al nia programo, kaj ni tuj presi 691 00:57:24,300 --> 00:57:29,950 ilia enhavo al la ekrano unuope. 692 00:57:29,950 --> 00:57:35,670 Por presi dosierojn al la ekrano, ni tuj faros iun tre simila 693 00:57:35,670 --> 00:57:38,120 al kio ni faris al la fino de la kvizo. 694 00:57:38,120 --> 00:57:45,350 Fine de la kvizo, ke dungi programo, ni devis malfermi dosieron, 695 00:57:45,350 --> 00:57:48,490 kaj poste ni devis presi ĝin. 696 00:57:48,490 --> 00:57:54,660 En ĉi tiu kazo, ni tuj malfermi dosieron, kaj ni tuj legis el gxi anstataŭe. 697 00:57:54,660 --> 00:58:00,630 Tiam ni iras por presi, anstataŭ al dosiero, ni tuj presi al la ekrano. 698 00:58:00,630 --> 00:58:05,830 Do presi al la ekrano vi ĉiuj faris antaŭe kun printf. 699 00:58:05,830 --> 00:58:08,290 Do tio ne tro freneza. 700 00:58:08,290 --> 00:58:12,190 Sed legante dosieron estas speco de stranga. 701 00:58:12,190 --> 00:58:17,300 Ni iros tra tiu iomete samtempe. 702 00:58:17,300 --> 00:58:20,560 Se vi infanoj reiros al tiu lasta problemo en via kvizo problemo 33, 703 00:58:20,560 --> 00:58:27,280 la unua linio kiu ni faros ĉi tie, malfermante la dosieron, estas tre simila al tio, kion ni faris tie. 704 00:58:27,280 --> 00:58:36,370 Do Stella, kion faras tiu linio aspekti, kiam ni malfermas dosieron? 705 00:58:36,370 --> 00:58:47,510 [Stella] Ĉefurbo DOSIERO *, dosiero - >> Bone. >> - Estas egala al fopen. >> Yup. 706 00:58:47,510 --> 00:58:55,980 Kiu en ĉi tiu kazo estas? Ĝi estas en la komento. 707 00:58:55,980 --> 00:59:06,930 >> Ĝi estas en la komento? argv [i] kaj r? 708 00:59:06,930 --> 00:59:11,300 >> Ekzakte. Ĝuste plu. Do Stella estas tute prava. 709 00:59:11,300 --> 00:59:13,720 Ĉi tio estas kion la linio aspektas. 710 00:59:13,720 --> 00:59:19,670 Ni tuj akiri dosieron rivereto variablo, stoki ĝin en DOSIERO *, do ĉiuj ĉapoj, 711 00:59:19,670 --> 00:59:25,720 DOSIERO, *, kaj la nomo de ĉi tiu variablo estos dosiero. 712 00:59:25,720 --> 00:59:32,250 Ni povus nomi ĝin kion ajn ni volas. Ni povus nomi ĝin first_file, aŭ file_i, kion ajn ni ŝatus. 713 00:59:32,250 --> 00:59:37,590 Kaj tiam la nomo de la dosiero estis aprobita en la komanda linio al ĉi tiu programo. 714 00:59:37,590 --> 00:59:44,450 Do ĝi estas stokita en argv [i,] kaj poste ni iras por malfermi ĉi dosieron en legu modo. 715 00:59:44,450 --> 00:59:48,100 Nun kiam ni malfermis la dosieron, kio estas la afero, ke ni ĉiam devas memori fari 716 00:59:48,100 --> 00:59:52,230 kiam ni malfermis dosieron? Fermi ĝin. 717 00:59:52,230 --> 00:59:57,220 Do Missy, kiel ni fermi dosieron? 718 00:59:57,220 --> 01:00:01,020 [Missy] fclose (dosiero) >> fclose (dosiero). Ekzakte. 719 01:00:01,020 --> 01:00:05,340 Granda. Okay. Se ni rigardas tiun fari komenton ĉi tie, 720 01:00:05,340 --> 01:00:11,940 diras, "Malfermu argv [i] kaj presi ĝia enhavo al stdout." 721 01:00:11,940 --> 01:00:15,460 >> Normo ekster estas stranga nomo. Stdout estas nur nia maniero diri 722 01:00:15,460 --> 01:00:22,880 ni volas presi ĝin al la fina, ni volas presi ĝin al cxefeligo rivereto. 723 01:00:22,880 --> 01:00:26,450 Ni povas vere forigi tiun komenton ĉi tie. 724 01:00:26,450 --> 01:00:36,480 Mi tuj kopii ĝin kaj almeti ĝin ekde tio kion ni faris. 725 01:00:36,480 --> 01:00:41,290 Je ĉi tiu punkto, nun ni devas legi la dosieron iom post iom. 726 01:00:41,290 --> 01:00:46,300 Ni diskutis kelkajn manierojn legi dosierojn. 727 01:00:46,300 --> 01:00:51,830 Kio tiuj estas viaj preferitaj ĝis nun? 728 01:00:51,830 --> 01:00:57,960 Kiuj manieroj vi vidis aŭ ĉu vi memoras, legi dosierojn? 729 01:00:57,960 --> 01:01:04,870 [Daniel] fread? >> Fread? Do fread estas unu. Jimmy, ĉu vi konas aliajn? 730 01:01:04,870 --> 01:01:12,150 [Jimmy] No >> Bone. Nope. Charlotte? Aleksandro? Ajna aliaj? Okay. 731 01:01:12,150 --> 01:01:20,740 Do la aliaj aĵoj estas fgetc, estas kiu ni uzos tre. 732 01:01:20,740 --> 01:01:26,410 Ekzistas ankaux fscanf; you guys vidi mastro ĉi tie? 733 01:01:26,410 --> 01:01:29,170 Ili ĉiuj komenciĝas per f. Ion fari kun dosiero. 734 01:01:29,170 --> 01:01:35,260 Estas fread, fgetc, fscanf. Ĉi tiuj estas ĉiuj la legadon funkcioj. 735 01:01:35,260 --> 01:01:49,120 Por skribi ni havas fwrite, ni havas fputc anstataŭ fgetc. 736 01:01:49,120 --> 01:01:58,250 Ni ankaŭ fprintf like ni vidis en la kvizo. 737 01:01:58,250 --> 01:02:01,680 Ekde ĉi tiu estas problemo kiu engaĝas legado de dosiero, 738 01:02:01,680 --> 01:02:04,940 nin tuj uzi unu el tiuj tri funkcioj. 739 01:02:04,940 --> 01:02:10,890 Ni ne intencas uzi tiujn funkciojn cxi tie. 740 01:02:10,890 --> 01:02:14,880 Ĉi tiuj funkcioj estas ĉiuj troviĝas en la norma / S biblioteko. 741 01:02:14,880 --> 01:02:17,510 Do, se vi rigardas la supro de tiu programo, 742 01:02:17,510 --> 01:02:24,110 vi povas vidi, ke ni jam inkludis la kaplinion dosiero por la normo / S biblioteko. 743 01:02:24,110 --> 01:02:27,120 Se ni volas eltrovi kiujn oni volas uzi, 744 01:02:27,120 --> 01:02:29,690 ni povas cxiam malfermi la viro paĝoj. 745 01:02:29,690 --> 01:02:34,350 Do ni povas tajpi viro stdio 746 01:02:34,350 --> 01:02:43,180 kaj legu pri la stdio enigo kaj eligo funkcioj en C. 747 01:02:43,180 --> 01:02:49,870 Kaj ni povas jam vidi ho, rigardu. Oni mencii fgetc, ĝi estas mencii fputc. 748 01:02:49,870 --> 01:02:57,220 Do vi povas sondi malsupren iom kaj rigardu, ekzemple, fgetc 749 01:02:57,220 --> 01:03:00,060 kaj rigardu lian viro paĝo. 750 01:03:00,060 --> 01:03:03,430 Vi povas vidi ke ĝi iras kune kun tuta amaso de aliaj funkcioj: 751 01:03:03,430 --> 01:03:12,640 fgetc, fgets, getc, getchar, prenas, ungetc, kaj lia eniro de karakteroj kaj kordoj. 752 01:03:12,640 --> 01:03:19,180 Do jen kiel ni legas en karakteroj kaj kordoj de dosieroj de norma enigo, 753 01:03:19,180 --> 01:03:21,990 kiu estas fundamente de la uzanto. 754 01:03:21,990 --> 01:03:24,780 Kaj jen kiel ni faras en reala C. 755 01:03:24,780 --> 01:03:30,850 Do tiu estas ne uzante la GetString kaj GetChar funkcioj 756 01:03:30,850 --> 01:03:36,840 ke ni uzis de la CS50 biblioteko. 757 01:03:36,840 --> 01:03:39,710 Ni tuj faros tiun problemon en paro da manieroj 758 01:03:39,710 --> 01:03:43,430 por ke vi povas vidi du malsamaj manieroj de fari tion. 759 01:03:43,430 --> 01:03:48,490 Tiel la fread funkcio ke Daniel menciitaj kaj fgetc estas bonaj manieroj por fari ĝin. 760 01:03:48,490 --> 01:03:53,790 Mi kredas fgetc estas iom pli facila, ĉar ĝi nur havas, kiel vi vidas, 761 01:03:53,790 --> 01:03:59,660 unu argumento, la DOSIERO * ke ni provas legi la karakteron de, 762 01:03:59,660 --> 01:04:02,740 kaj lia reveno valoro estas int. 763 01:04:02,740 --> 01:04:05,610 Kaj jen estas iom konfuza, ĉu ne? 764 01:04:05,610 --> 01:04:11,450 >> Ĉar ni estas duumaj karaktero, do kial ne ĉi tiu reveno al char? 765 01:04:11,450 --> 01:04:18,700 You guys havas ideojn pri kial ĉi eble ne revenos al char? 766 01:04:18,700 --> 01:04:25,510 [Missy respondoj, nekomprenebla] >> Jes. Do Missy estas tute prava. 767 01:04:25,510 --> 01:04:31,570 Se estas Askio, tiam ĉi tiu entjero povus esti mapita al reala char. 768 01:04:31,570 --> 01:04:33,520 Povus esti ASCII, kaj tio estas prava. 769 01:04:33,520 --> 01:04:36,220 Tio estas ĝuste tio, kio okazas. 770 01:04:36,220 --> 01:04:39,190 Ni uzante int simple ĉar ĝi havas pli bitoj. 771 01:04:39,190 --> 01:04:44,750 Ĝi estas pli granda ol char; nia char nur havas 8 bitojn, ke 1 bajto en nia 32-bita maŝinoj. 772 01:04:44,750 --> 01:04:48,520 Kaj int havas ĉiujn 4 bajtoj 'valoro de spaco. 773 01:04:48,520 --> 01:04:50,940 Kaj ĝi rezultas ke la vojo fgetc funkcias, 774 01:04:50,940 --> 01:04:53,940 se ni rulumu malsupren en nia sinopsis en cxi tiu viro paĝo iomete, 775 01:04:53,940 --> 01:05:05,000 rulumu tuta vojo malsupren. Rezultas, ke ili uzas tiun specialan valoron nomis EOF. 776 01:05:05,000 --> 01:05:09,640 Ĝi estas speciala konstanta kiel la reveno valoro de la fgetc funkcio 777 01:05:09,640 --> 01:05:14,570 kiam vi frapis la fino de la dosiero aŭ se vi ricevas eraron. 778 01:05:14,570 --> 01:05:18,170 Kaj ĝi rezultas ke fari tiujn komparojn kun EOF konvene, 779 01:05:18,170 --> 01:05:24,060 vi volas havi tiun ekstran kvanton de informo kiun vi havas en int 780 01:05:24,060 --> 01:05:28,420 kiel kontraŭ uzante char variablo. 781 01:05:28,420 --> 01:05:32,130 Kvankam fgetc estas efektive duumaj karaktero de dosiero, 782 01:05:32,130 --> 01:05:38,450 vi volas memori ke estas reveni iu kiu estas de tipo int al vi. 783 01:05:38,450 --> 01:05:41,360 Kiu diris, tio estas sufiĉe facila uzi. 784 01:05:41,360 --> 01:05:44,960 Oni tuj donos al ni karaktero, do ĉiuj ni devas fari estas subteni petante la dosiero, 785 01:05:44,960 --> 01:05:48,440 "Donu al mi la venonta signo, donu al mi la venonta signo, donu al mi la venonta signo" 786 01:05:48,440 --> 01:05:51,400 ĝis ni atingos la finon de la dosiero. 787 01:05:51,400 --> 01:05:54,730 Kaj tio estos tiri en unu signo samtempe el nia arkivo, 788 01:05:54,730 --> 01:05:56,250 kaj poste ni povas fari kion ajn ni ŝatas ĝin. 789 01:05:56,250 --> 01:06:00,160 Ni povas gardi ĝin, ni povas aldoni ĝin al ŝnuro, ni povas presi ĝin. 790 01:06:00,160 --> 01:06:04,630 Ĉu iu el tio. 791 01:06:04,630 --> 01:06:09,600 >> Zoom reen eksteren kaj tuj reen al nia cat.c programo, 792 01:06:09,600 --> 01:06:16,170 se ni tuj uzi fgetc, 793 01:06:16,170 --> 01:06:21,710 kiom eble ni alproksimigi tiun sekva linio de kodo? 794 01:06:21,710 --> 01:06:26,020 Ni tuj uzos - fread faros ion iomete malsamaj. 795 01:06:26,020 --> 01:06:32,600 Kaj ĉi-foje, ni nur tuj uzos fgetc akiri unu signo samtempe. 796 01:06:32,600 --> 01:06:40,910 Procesi tutan dosieron, kio povus ni devas fari? 797 01:06:40,910 --> 01:06:44,030 Kiom da karakteroj estas tie en dosiero? 798 01:06:44,030 --> 01:06:47,390 Estas tre. Do vi probable volas unu 799 01:06:47,390 --> 01:06:49,860 kaj poste alia kaj akiri alian kaj atingi alian. 800 01:06:49,860 --> 01:06:53,330 Kia algoritmo vi pensas, ke ni eble devus uzi ĉi tie? 801 01:06:53,330 --> 01:06:55,470 Kian -? [Aleksandro] A por buklo? >> Ekzakte. 802 01:06:55,470 --> 01:06:57,500 Iu tipo de ciklo. 803 01:06:57,500 --> 01:07:03,380 A por buklo estas fakte granda, en ĉi tiu kazo. 804 01:07:03,380 --> 01:07:08,620 Kaj kiel vi diras, ĝi sonas kiel vi deziras buklo dum la tuta dosiero, 805 01:07:08,620 --> 01:07:11,820 duumaj karaktero samtempe. 806 01:07:11,820 --> 01:07:13,850 Ajna sugestojn sur kion tio povus aspekti kiel? 807 01:07:13,850 --> 01:07:22,090 [Aleksandro, nekomprenebla] 808 01:07:22,090 --> 01:07:30,050 >> Konsentite, ĝuste diru al mi en la angla kion vi provas fari? [Aleksandro, nekomprenebla] 809 01:07:30,050 --> 01:07:36,270 Do ĉi-kaze, tio sonas kiel ni ĵus provas buklo dum la tuta dosiero. 810 01:07:36,270 --> 01:07:45,330 [Aleksandro] Do i > La grandeco de -? 811 01:07:45,330 --> 01:07:49,290 Mi supozas ke la grandeco de la dosiero, ĉu ne? La grandeco - we'll ĝuste skribi ĝin kiel ĉi tio. 812 01:07:49,290 --> 01:07:57,470 Grandeco de dosiero provizore, i + +. 813 01:07:57,470 --> 01:08:04,610 Do rezultas ke la vojo vi ĉi tion uzante fgetc, kaj ĉi estas nova, 814 01:08:04,610 --> 01:08:10,460 estas ke ne estas facila maniero por simple akiri la grandeco de dosiero 815 01:08:10,460 --> 01:08:16,979 kun tiu "sizeof" tipo de konstrui ke vi vidis antaŭe. 816 01:08:16,979 --> 01:08:20,910 Kiam ni uzas tiun fgetc funkcio, ni enkonduki ian 817 01:08:20,910 --> 01:08:29,069 nova, funky sintakson por ĉi por ciklo, kie anstataŭ uzi nur bazajn nombrilo 818 01:08:29,069 --> 01:08:33,920 iri karaktero de karaktero, ni iras al meso unu signo samtempe, 819 01:08:33,920 --> 01:08:37,120 unu signo samtempe, kaj la maniero ni scias ni fine 820 01:08:37,120 --> 01:08:41,290 ne kiam ni kalkulis certa nombro da signoj, 821 01:08:41,290 --> 01:08:49,939 sed kiam la karaktero ni eltiri estas tiu speciala fino de dosiero karaktero. 822 01:08:49,939 --> 01:08:58,689 Do ni povas fari ĉi tion - mi nomas tiun ch, kaj ni iras al pravalorizi ĝin 823 01:08:58,689 --> 01:09:08,050 kun nia unua alvoko por ricevi la unuan karakteron el la dosiero. 824 01:09:08,050 --> 01:09:14,979 Do ĉi tiu parto dekstra tie, ĉi tiu tuj akiri karaktero el la dosiero 825 01:09:14,979 --> 01:09:20,840 kaj stoki ĝin en la variablo ch. 826 01:09:20,840 --> 01:09:25,420 Ni tuj observu fari ĉi ĝis ni atingos la finon de la dosiero, 827 01:09:25,420 --> 01:09:41,170 kion ni faru por provi por la karaktero ne esti egala al tiu speciala EOF karaktero. 828 01:09:41,170 --> 01:09:48,750 Kaj tiam anstataŭ fari ch + +, kiu ĵus pliigo de la valoro, 829 01:09:48,750 --> 01:09:52,710 tial se ni legis A el la dosiero, majuskla A, diru, 830 01:09:52,710 --> 01:09:56,810 ch + + donus al ni b, kaj tiam ni volonte akiri c kaj tiam d. 831 01:09:56,810 --> 01:09:59,310 Tio klare ne kio ni volas. Kion ni volas tie 832 01:09:59,310 --> 01:10:05,830 en ĉi tiu lasta bito ni volas ricevi la venonta signo de la dosiero. 833 01:10:05,830 --> 01:10:09,500 >> Do kiel povas ni preni la venonta signo de la dosiero? 834 01:10:09,500 --> 01:10:13,470 Kiel ni atingas la unuan karakteron de la dosiero? 835 01:10:13,470 --> 01:10:17,200 [Studenta] fgetfile? >> Fgetc, aŭ, sorry, vi estis plene pravas. 836 01:10:17,200 --> 01:10:20,470 Mi misspelled ĝin prava. Do jes. 837 01:10:20,470 --> 01:10:26,240 Jen anstataŭ fari ch + +, 838 01:10:26,240 --> 01:10:29,560 ni nur iri nomi fgetc (dosiero) denove 839 01:10:29,560 --> 01:10:39,180 kaj gardi la rezulto en nia sama ch variablo. 840 01:10:39,180 --> 01:10:43,730 [Studenta demando, nekomprenebla] 841 01:10:43,730 --> 01:10:52,390 >> Tie estas kie tiuj DOSIERO * infanoj estas specialaj. 842 01:10:52,390 --> 01:10:59,070 La vojo ili laboras estas ili - kiam vi unue malfermi - kiam vi unue fari tiun fopen alvoko, 843 01:10:59,070 --> 01:11:04,260 la DOSIERO * efektive servas kiel sagon al la komenco de la dosiero. 844 01:11:04,260 --> 01:11:12,830 Kaj tiam ĉiu tempo vi nomas fgetc, ĝi movas unu signo tra la dosiero. 845 01:11:12,830 --> 01:11:23,280 Do kiam ajn vi nomas tiun, vi pliigante la dosiero puntero de unu signo. 846 01:11:23,280 --> 01:11:26,210 Kaj kiam vi fgetc denove, vi movis ĝin alian karakteron 847 01:11:26,210 --> 01:11:28,910 kaj alia karaktero kaj alian karakteron kaj alian karakteron. 848 01:11:28,910 --> 01:11:32,030 [Studenta demando, nekomprenebla] >> Kaj that's - yeah. 849 01:11:32,030 --> 01:11:34,810 Estas speco de magio ĉi sub la kapuĉo. 850 01:11:34,810 --> 01:11:37,930 Vi nur observu pliigante tra. 851 01:11:37,930 --> 01:11:46,510 Je ĉi tiu punkto, vi estas kapabla reale labori kun karaktero. 852 01:11:46,510 --> 01:11:52,150 Do kiel povas oni presi ĉi al la ekrano, nun? 853 01:11:52,150 --> 01:11:58,340 Ni povas uzi la saman printf aĵo kiun ni uzis antaŭe. 854 01:11:58,340 --> 01:12:00,330 Ke ni uzis la tuta semestro. 855 01:12:00,330 --> 01:12:05,450 Ni povas nomi printf, 856 01:12:05,450 --> 01:12:21,300 kaj ni povas pasi en la karaktero simple tiel. 857 01:12:21,300 --> 01:12:27,430 Alia maniero por fari ĝin estas anstataŭ uzi printf kaj devante fari ĉi formato kordoj, 858 01:12:27,430 --> 01:12:29,490 ni povas ankaŭ uzi unu el la aliaj funkcioj. 859 01:12:29,490 --> 01:12:40,090 Ni povas uzi fputc, kiu presas karakteron al la ekrano, 860 01:12:40,090 --> 01:12:52,580 krom se ni rigardas fputc - lasu min malzomi iomete. 861 01:12:52,580 --> 01:12:56,430 Ni vidu kion estas agrable estas portas en la karaktero kiu ni legis uzante fgetc, 862 01:12:56,430 --> 01:13:05,100 sed tiam ni devas doni ĝin rojo presi al. 863 01:13:05,100 --> 01:13:11,850 Ni povas ankaŭ uzi la putchar funkcio, kiu metos rekte al la normo eksteren. 864 01:13:11,850 --> 01:13:16,070 Do estas tuta aro da malsamaj ebloj kiujn ni povas uzi por presado. 865 01:13:16,070 --> 01:13:19,580 Ili estas ĉiuj en la norma / S biblioteko. 866 01:13:19,580 --> 01:13:25,150 Kiam ajn vi volas presi - tiel printf, implicite, presos al la speciala normo ekster rivereto, 867 01:13:25,150 --> 01:13:27,910 kiu estas kiu stdout. 868 01:13:27,910 --> 01:13:41,300 Do ni povas simple raporti al ĝi kiel speco de ĉi magio valoro, stdout en ĉi tie. 869 01:13:41,300 --> 01:13:48,410 Oops. Metu la punktokomo ekstere. 870 01:13:48,410 --> 01:13:52,790 >> Tio estas tre nova, funky informoj en ĉi tie. 871 01:13:52,790 --> 01:13:58,600 Multaj ĉi estas tre idiomáticos, en la senso ke tiu estas kodo 872 01:13:58,600 --> 01:14:05,700 kio estas skribita tiamaniere nur ĉar ĝi estas pura legi, facile legebla. 873 01:14:05,700 --> 01:14:11,520 Estas multaj malsamaj manieroj fari ĝin, multaj malsamaj funkcioj povas uzi, 874 01:14:11,520 --> 01:14:14,680 sed ni emas simple sekvi tiuj samaj mastroj super kaj super. 875 01:14:14,680 --> 01:14:20,180 Do ne miru se vi vidas kodo kiel tiu venas denove kaj denove. 876 01:14:20,180 --> 01:14:25,690 Bone. Je ĉi tiu punkto, ni bezonas rompi por la tago. 877 01:14:25,690 --> 01:14:31,300 Dankon pro veni. Dankon pro rigardante se vi estas ensalutintaj. Kaj ni vidos vin proksima semajno. 878 01:14:31,300 --> 01:14:33,890 [CS50.TV]