1 00:00:00,000 --> 00:00:02,500 [Powered by Google Translate] [Sekcio 5 - Pli Vasta] 2 00:00:02,500 --> 00:00:04,690 [Rob Bowden - Universitato Harvard] 3 00:00:04,690 --> 00:00:07,250 [Jen CS50. - CS50.TV] 4 00:00:08,990 --> 00:00:14,250 >> Kiel mi diris en mia retpoŝto, ekzistas multe da aferoj, kiujn vi povas uzi 5 00:00:14,250 --> 00:00:17,060 escepte la aparaton al reale fari la problemo aroj. 6 00:00:17,060 --> 00:00:19,910 Ni rekomendas al vi fari tion en la aparaton nur ĉar tiam ni povas pli facile helpi vin 7 00:00:19,910 --> 00:00:22,070 kaj ni scias kiel ĉio tuj funkciis. 8 00:00:22,070 --> 00:00:26,950 Sed kiel unu ekzemplon de kie vi povas fari tion se, ekzemple, vi ne havas aliron 9 00:00:26,950 --> 00:00:31,570 al aparaton aŭ vi volas labori en la Science Center kelo - 10 00:00:31,570 --> 00:00:33,090 kiu reale havas la aparaton tro - 11 00:00:33,090 --> 00:00:35,150 se vi volas labori ie ajn. 12 00:00:35,150 --> 00:00:42,370 Unu ekzemplo estas vi vidis / aŭdis SSH? 13 00:00:44,380 --> 00:00:47,780 SSH estas esence same kiel konekti al iu. 14 00:00:47,780 --> 00:00:51,340 Efektive, nun mi SSHed en la aparaton. 15 00:00:51,340 --> 00:00:54,290 Mi neniam labori rekte en la aparaton. 16 00:00:55,930 --> 00:01:01,060 Jen la aparaton, kaj se vi rigardas malsupren tie vi vidas ĉi IP adreso. 17 00:01:01,060 --> 00:01:03,650 Mi neniam labori en la aparaton mem; 18 00:01:03,650 --> 00:01:08,840 Mi ĉiam venu al iTerm2 fenestro / fina fenestro. 19 00:01:08,840 --> 00:01:15,910 Vi povas SSH al tiu IP-adreso, ssh jharvard@192.168.129.128. 20 00:01:15,910 --> 00:01:20,390 Mi memoras tiun ciferon tre facile, ĉar ĝi estas tiom bela ŝablono. 21 00:01:20,390 --> 00:01:24,920 Sed tio demandos min por mia pasvorto, kaj nun mi estas en la aparaton. 22 00:01:24,920 --> 00:01:33,060 Esence, je ĉi tiu punkto, se vi malfermis fina ene de la aparaton mem, 23 00:01:33,060 --> 00:01:36,350 ĉi interfacon, tamen vi uzus ĝin, estas ĝuste la sama 24 00:01:36,350 --> 00:01:40,010 kiel la interfaco Mi uzas super tie sed nun vi SSHed. 25 00:01:42,240 --> 00:01:44,920 Vi ne devas SSH al la aparaton. 26 00:01:44,920 --> 00:01:52,360 Unu ekzemplo de alia loko vi povis SSH al estas mi sufiĉe certas ke vi havas defaŭlte - 27 00:01:52,360 --> 00:01:55,020 Oh. Pli granda. 28 00:01:55,020 --> 00:02:01,130 Vi ĉiuj devus havi defaŭlte FAS rakontas pri la FAS-serviloj. 29 00:02:01,130 --> 00:02:06,840 Por mi, mi volus SSH al rbowden@nice.fas.harvard.edu. 30 00:02:06,840 --> 00:02:11,610 Ĝi tuj demandas al vi, ke la unua fojo, kaj vi diros jes. 31 00:02:11,610 --> 00:02:15,840 Mia pasvorto nur tuj estos mia FAS pasvorton. 32 00:02:15,840 --> 00:02:22,650 Kaj tial nun, mi SSHed al la bela serviloj, kaj mi povas fari ion mi volas ĉi tie. 33 00:02:22,650 --> 00:02:28,560 Multaj klasoj vi povus preni, kiel 124, tuj vi alŝutu stuff ĉi tien 34 00:02:28,560 --> 00:02:30,950 al reale proponi vian problemon aroj. 35 00:02:30,950 --> 00:02:34,100 Sed diru vi ne havas aliron al via aparaton. 36 00:02:34,100 --> 00:02:37,910 Tiam vi povas fari tion, kiel ĉi tie ĝi diros - 37 00:02:37,910 --> 00:02:42,160 Tiu estas nur nia sekcio de demandoj. 38 00:02:42,160 --> 00:02:45,070 Ĝi petos vin fari tion en la aparaton. 39 00:02:45,070 --> 00:02:47,790 Anstataŭe mi nur faras ĝin en la servilo. 40 00:02:47,790 --> 00:02:50,560 Mi tuj maldensigi tio. 41 00:02:50,560 --> 00:02:55,670 La problemo tuj estos ke vi kutimis uzi iun kiel gedit 42 00:02:55,670 --> 00:02:58,160 aŭ kion ajn ene de la aparaton. 43 00:02:58,160 --> 00:03:01,830 Vi ne havos ke sur la FAS-servilo. 44 00:03:01,830 --> 00:03:04,110 Ĝi estas ĉiuj nur tuj estos ĉi teksta interfaco. 45 00:03:04,110 --> 00:03:09,180 Do vi povus ĉu unu, provu lerni tekstoredaktilo ke ili ja havas. 46 00:03:09,180 --> 00:03:12,130 Ili havas Nano. 47 00:03:12,130 --> 00:03:14,990 Nano estas kutime bela facila uzi. 48 00:03:14,990 --> 00:03:19,470 Vi povas uzi vian sagojn kaj tajpu normale. 49 00:03:19,470 --> 00:03:21,250 Do tio ne peza. 50 00:03:21,250 --> 00:03:24,720 Se vi volas vere fantaziaj vi povas uzi Emacs, 51 00:03:24,720 --> 00:03:29,850 kiun mi probable ne devus esti malfermita ĉar mi eĉ ne scias kiel fermi Emakso. 52 00:03:29,850 --> 00:03:32,760 Kontrolo X, Kontrolo C? Yeah. 53 00:03:32,760 --> 00:03:35,310 Aŭ vi povas uzi Vim, kiu estas kion mi uzas. 54 00:03:35,310 --> 00:03:37,800 Kaj tial tiuj estas viaj ebloj. 55 00:03:37,800 --> 00:03:43,830 Se vi ne volas fari tion, vi povas ankaŭ, se vi rigardas manual.cs50.net-- 56 00:03:43,830 --> 00:03:45,410 Oh. 57 00:03:45,410 --> 00:03:49,920 En la PC, vi povas SSH uzante PuTTY, 58 00:03:49,920 --> 00:03:51,940 kion vi tuj devos elŝuti aparte. 59 00:03:51,940 --> 00:03:55,460 Sur Mac, vi povas simple defaŭlte uzo Terminal aŭ vi povas elŝuti iTerm2, 60 00:03:55,460 --> 00:03:58,490 kio estas kiel bela, fantazio Terminal. 61 00:03:58,490 --> 00:04:03,780 Se vi iras al manual.cs50.net vi vidos ligon al Notepad + +, 62 00:04:03,780 --> 00:04:07,120 kiu estas kiu vi povas uzi en la PC. 63 00:04:07,120 --> 00:04:13,340 Ĝi permesas SFTP de Notepad + +, kiu estas esence SSH. 64 00:04:13,340 --> 00:04:17,750 Kio ĉi lasos vin fari estas redakti viajn dosierojn loke, 65 00:04:17,750 --> 00:04:20,670 kaj poste kiam ajn vi volas savi ilin, ĝi helpos al nice.fas, 66 00:04:20,670 --> 00:04:23,670 kie vi povas poste ekzekuti ilin. 67 00:04:23,670 --> 00:04:26,880 Kaj la ekvivalenta sur Mac tuj estos TextWrangler. 68 00:04:26,880 --> 00:04:28,760 Do ĝi lasas vin fari la samon. 69 00:04:28,760 --> 00:04:32,800 Ĝi ebligas ŝanĝi dosierojn surloke kaj gardi ilin nice.fas, 70 00:04:32,800 --> 00:04:35,730 kie vi povas poste ekzekuti ilin. 71 00:04:35,730 --> 00:04:40,400 Do se vi iam kaptita sen aparaton, vi havas tiujn opciojn 72 00:04:40,400 --> 00:04:44,230 ankoraŭ fari vian problemon aroj. 73 00:04:44,230 --> 00:04:48,250 La problemo tuj estos ke vi ne tuj havos la CS50 biblioteko 74 00:04:48,250 --> 00:04:51,580 ĉar nice.fas ne defaŭlte havi tiun. 75 00:04:51,580 --> 00:04:55,970 Vi povas aŭ elŝuti la CS50 biblioteko - 76 00:04:55,970 --> 00:04:58,470 Mi ne kredas ke mi bezonas ke en ĉi tiu punkto. 77 00:04:58,470 --> 00:05:03,270 Vi povas aŭ elŝuti la CS50 biblioteko kaj kopii ĝin al nice.fas, 78 00:05:03,270 --> 00:05:07,450 aŭ mi kredas je ĉi tiu punkto ni ne uzas ĝin plu ĉiuokaze. 79 00:05:07,450 --> 00:05:12,720 Aŭ se ni faras, vi povas por la epoko esti anstataŭigi ĝin per 80 00:05:12,720 --> 00:05:18,480 la realigoj de la funkcioj en la CS50 biblioteko ĉiuokaze. 81 00:05:18,480 --> 00:05:21,370 Por ke ne devus esti tiu parto de limigo. 82 00:05:21,370 --> 00:05:23,710 Kaj tio estas tiel. 83 00:05:26,460 --> 00:05:29,820 >> Mi reiros al la aparaton nun; ni faru cxion en la aparaton. 84 00:05:29,820 --> 00:05:37,510 Rigardante nian sekcion de demandoj, komence, kiel mi diris en mia retpoŝto, 85 00:05:37,510 --> 00:05:43,620 ni devas paroli pri la mallonga vi supozis vidi. 86 00:05:43,620 --> 00:05:51,980 Ni havas la redireccionando & Pipes kaj ĉi tiuj tri demandoj. 87 00:05:51,980 --> 00:05:56,070 >> Al kiu rivereto do funkcioj kiel printf skribi defaŭlte? 88 00:05:56,070 --> 00:05:59,130 Do rivereto. Kio estas torento? 89 00:06:06,520 --> 00:06:15,100 Al torento estas esence same kiel ĝi estas nur iuj - 90 00:06:15,100 --> 00:06:21,450 Ne eĉ fonto de 1s kaj _0s_. 91 00:06:21,450 --> 00:06:24,920 La rojo ĝi estas petante tie estas normo eksteren. 92 00:06:24,920 --> 00:06:27,250 Kaj tiel normo ekster estas rivereto, ke kiam vi skribas al li, 93 00:06:27,250 --> 00:06:30,940 aperas sur la ekrano. 94 00:06:30,940 --> 00:06:36,860 Normo ekster, per rivereto, ĝi signifas ke vi ĝuste skribas 1s kaj _0s_ al ĝi, 95 00:06:36,860 --> 00:06:40,220 kaj la alia fino de normo ekster nur legas de tiu fluo. 96 00:06:40,220 --> 00:06:43,540 Estas nur ĉeno de 1s kaj _0s_. 97 00:06:43,540 --> 00:06:45,570 Vi povas skribi al la rojoj aŭ vi povas legi de fluoj 98 00:06:45,570 --> 00:06:47,950 depende kion la rivereto reale estas. 99 00:06:47,950 --> 00:06:52,800 La aliaj du defaŭlta rojoj estas normo en kaj norma eraro. 100 00:06:52,800 --> 00:06:57,540 Normo en estas kiam ajn vi GetString, ĝi estas atendas vin al eniro stuff. 101 00:06:57,540 --> 00:07:01,570 Do atendas vin, ĝi estas vere atendas sur norma en, 102 00:07:01,570 --> 00:07:04,880 kiu estas vere kion vi akiras, kiam vi tajpas en la klavaro. 103 00:07:04,880 --> 00:07:07,530 Vi tajpas en normo in 104 00:07:07,530 --> 00:07:10,050 Norma eraro estas esence ekvivalenta al normo ekster, 105 00:07:10,050 --> 00:07:13,280 sed estas specialigita en tiu kiam vi presi al norma eraro, 106 00:07:13,280 --> 00:07:16,770 vi supozas nur presi erarmesaĝojn al tiu 107 00:07:16,770 --> 00:07:20,200 tiel vi povas diferenci inter regula mesaĝojn presita al la ekrano 108 00:07:20,200 --> 00:07:24,560 kontre erarmesaĝojn depende cxu ili iris al la normo ekster aŭ norma eraro. 109 00:07:24,560 --> 00:07:28,660 Dosieroj tro. 110 00:07:28,660 --> 00:07:32,440 Normo ekster, normo, kaj norma eraro estas nur speciala torentojn 111 00:07:32,440 --> 00:07:36,810 sed vere neniu dosiero, kiam vi malfermos dosieron, ĝi fariĝas la kurento de bajtoj 112 00:07:36,810 --> 00:07:40,740 kie vi povas simple legis de tiu fluo. 113 00:07:40,740 --> 00:07:47,770 Vi, plejparte, povas nur pensi pri dosieron kiel fluo da bitokoj. 114 00:07:47,770 --> 00:07:51,190 Do kio riveretoj do ili skribas al defaŭlte? Norma eksteren. 115 00:07:51,190 --> 00:07:56,980 >> Kio estas la diferenco inter> kaj >>? 116 00:07:58,140 --> 00:08:03,710 Ĉu iu rigardi la video antauxe? Okay. 117 00:08:03,710 --> 00:08:10,960 > Tuj estos kiel vi ridirektanta en dosieroj, 118 00:08:10,960 --> 00:08:15,240 kaj >> ankaŭ tuj alidirektilo eligo en dosieroj, 119 00:08:15,240 --> 00:08:17,820 sed ĝi estas anstataŭ tuj aldonas al la arkivo. 120 00:08:17,820 --> 00:08:23,430 Ekzemple, ni diras, ke mi hazarde havas dict ĉi tie, 121 00:08:23,430 --> 00:08:27,020 kaj la sola aĵo ene de dict estas kato, kato, hundo, fiŝoj, hundo. 122 00:08:27,020 --> 00:08:31,530 Unu ordonon, kiun vi havas al la komanda linio estas kato, 123 00:08:31,530 --> 00:08:34,539 kio estas ĝuste tuj presi kio estas en dosiero. 124 00:08:34,539 --> 00:08:40,679 Do kiam mi diras kato dict, ĝi tuj presi kato, kato, hundo, fiŝoj, hundo. Tio estas ĉio kato faras. 125 00:08:40,679 --> 00:08:46,280 Tio signifas ke ĝi presis al normo ekster kato, kato, hundo, fiŝoj, hundo. 126 00:08:46,280 --> 00:08:53,240 Se mi anstataŭ volas redirekti ke al dosiero, mi povas uzi> kaj redirekti ĝin al kiom la dosiero estas. 127 00:08:53,240 --> 00:08:56,460 Mi vokos la dosiero dosiero. 128 00:08:56,460 --> 00:09:00,320 Do nun, se mi ls, mi vidos mi havas novan dosieron nomatan dosiero. 129 00:09:00,320 --> 00:09:05,700 Kaj se mi malfermos gxin, li tuj devos precize kion kato metis al la komanda linio. 130 00:09:05,700 --> 00:09:11,040 Do nun, se mi faras tion denove, tiam tuj alidirektilo la eligo en dosiero, 131 00:09:11,040 --> 00:09:13,930 kaj mi tuj havi la sama ĝusta afero. 132 00:09:13,930 --> 00:09:17,910 Do teknike, ĝi tute overrode kion ni havis. 133 00:09:17,910 --> 00:09:22,970 Kaj ni vidos ĉu mi ŝanĝu dict, mi prenis el hundo. 134 00:09:22,970 --> 00:09:29,980 Nun se ni kato dict en dosiero denove, ni havos la novan version kun hundo forigitaj. 135 00:09:29,980 --> 00:09:32,400 Do tute overrides ĝin. 136 00:09:32,400 --> 00:09:36,640 Anstataŭe, se ni uzas >>, ĝi tuj aldonas dosieron. 137 00:09:36,640 --> 00:09:40,860 Nun, malfermante dosieron, ni vidas ni havas nur la sama afero presita dufoje 138 00:09:40,860 --> 00:09:44,920 ĉar estis tie unufoje, tiam ni aldonis al la originala. 139 00:09:44,920 --> 00:09:48,130 Do, tio estas kion> kaj >> fari. 140 00:09:48,130 --> 00:09:50,580 Ĉu la sekva demandi - Ne demandu pri tio. 141 00:09:50,580 --> 00:09:59,050 >> La alia kiu ni havas estas <, kiu se> alidirektiloj normo ekster, 142 00:09:59,050 --> 00:10:01,970 00:10:12,050 Ni vidu se ni havas ekzemplon. 144 00:10:14,750 --> 00:10:16,930 Mi povas skribi unu reala rapida. 145 00:10:17,870 --> 00:10:25,700 Ni prenu ajna dosiero, hello.c. 146 00:10:56,060 --> 00:10:59,070 Relative simpla dosiero. 147 00:10:59,070 --> 00:11:03,570 Mi nur nun ĉenon kaj poste presi "Saluton" nenial la kordo Mi nur tajpis. 148 00:11:03,570 --> 00:11:07,990 Do fari saluton kaj poste. / Saluton. 149 00:11:07,990 --> 00:11:10,720 Nun ĝi estas instigante min eniri ion, 150 00:11:10,720 --> 00:11:15,070 kion signifas ĝi estas atendanta sur aĵoj esti eniris en normo in 151 00:11:15,070 --> 00:11:20,450 Do eniri kion ajn mi volas en normo in Ni nur intencas diri Saluton, Rob! 152 00:11:20,450 --> 00:11:23,310 Tiam ĝi estas videbligi al la normo ekster Saluton, Rob! 153 00:11:23,310 --> 00:11:28,860 Se mi faras. / Saluton kaj poste alidirektilo, 154 00:11:30,740 --> 00:11:34,310 cxar nun vi nur povas redirekti de dosiero. 155 00:11:34,310 --> 00:11:41,720 Do, se mi metis en iu dosiero, txt, kaj mi metis Rob, 156 00:11:41,720 --> 00:11:52,300 se mi kuros saluton kaj poste alidirektilo la dosiero txt en. / saluton, ĝi tuj diri Saluton, Rob! tuj. 157 00:11:52,300 --> 00:11:57,160 Kiam unue alvenas al GetString kaj ĝi estas atendanta sur norma en, 158 00:11:57,160 --> 00:12:01,730 normo en ne plu atendas en la klavaro por datumoj to get eniris. 159 00:12:01,730 --> 00:12:05,980 Anstataŭe, ni nomumata normo en legi de la dosiero txt. 160 00:12:05,980 --> 00:12:10,290 Kaj tiel tuj legis el la dosiero txt, kiu estas ĝuste la linio Rob, 161 00:12:10,290 --> 00:12:13,380 kaj tiam tuj presi Saluton, Rob! 162 00:12:13,380 --> 00:12:18,180 Kaj se mi volus, mi povus ankaŭ fari. / Saluton 00:12:21,500 kaj tiam la normo ke ĝi estas impreso, kiu estas Saluton, Rob!, 164 00:12:21,500 --> 00:12:24,700 Mi povas redirekti ke en lia propra dosiero. 165 00:12:24,700 --> 00:12:29,790 Mi simple nomas la dosiero saluton - ne, mi ne volas, ĉar tio estas la ruleblan - txt2. 166 00:12:29,790 --> 00:12:40,150 Nun, txt2 tuj havos la eligo de. / Saluton 00:12:43,520 >> Demandoj? 168 00:12:45,900 --> 00:12:49,090 >> Okay. Tial ĉi tie ni havas dukto. 169 00:12:49,090 --> 00:12:53,510 Pipes estas la lasta unueco de redirección. 170 00:12:53,510 --> 00:12:58,750 >> Oh. Mi supozas pli unueco de redirección estas se anstataŭ> vi faras 2>, 171 00:12:58,750 --> 00:13:01,070 ke tio redireccionando norma eraro. 172 00:13:01,070 --> 00:13:06,280 Do se iu iris al norma eraro, ĝi ne get metita en txt2. 173 00:13:06,280 --> 00:13:12,480 Sed rimarki se mi faras 2>, tiam ĝi estas ankoraŭ presi Saluton, Rob! al la komanda linio 174 00:13:12,480 --> 00:13:18,600 ĉar mi nur redireccionando norma eraro, mi ne redireccionando normo eksteren. 175 00:13:18,600 --> 00:13:22,210 Norma eraro kaj normo ekster estas malsamaj. 176 00:13:24,210 --> 00:13:27,080 Se vi volas vere skribos al norma eraro, 177 00:13:27,080 --> 00:13:35,080 tiam mi povus ŝanĝi ĉi tion al esti fprintf al stderr. 178 00:13:35,080 --> 00:13:37,850 Do printf, implicite, presas al normo eksteren. 179 00:13:37,850 --> 00:13:41,720 Se mi volas presi al cxeferarigo permane, poste mi devas uzi fprintf 180 00:13:41,720 --> 00:13:45,010 kaj precizigi kion mi volas presi al. 181 00:13:45,010 --> 00:13:49,720 Se anstataŭe mi faris fprintf stdout, tiam tio estas esence ekvivalenta al printf. 182 00:13:49,720 --> 00:13:55,530 Sed fprintf al norma eraro. 183 00:13:57,790 --> 00:14:03,650 Do nun, se mi alidirektilo ĉi tiu enen txt2, Saluton, Rob! ankoraŭ getting presita en la komanda linio 184 00:14:03,650 --> 00:14:08,270 ekde ĝi estas getting presita al norma eraro kaj mi nur redireccionando normo eksteren. 185 00:14:08,270 --> 00:14:16,420 Se mi nun alidirektilo norma eraro, nun ĝi ne get presita, kaj txt2 tuj estos Saluton, Rob! 186 00:14:16,420 --> 00:14:21,910 Do nun, vi povas presi viajn reala erarojn al norma eraro 187 00:14:21,910 --> 00:14:24,720 kaj presi viajn regulajn mesaĝojn al normo eksteren. 188 00:14:24,720 --> 00:14:31,420 Kaj tiel, kiam vi kuris, via programo, oni povas ruli ĝin kiel. / Saluton ĉi tiu tipo kun la 2> 189 00:14:31,420 --> 00:14:33,800 por ke via programo tuj kuri kutime, 190 00:14:33,800 --> 00:14:38,400 sed neniu erarmesaĝojn kiuj vi akiras vi povas kontroli poste en via eraro log, 191 00:14:38,400 --> 00:14:44,500 tiel eraroj, kaj tiam rigardi poste kaj viajn erarojn dosieron havos neniun eraroj kiu okazis. 192 00:14:45,200 --> 00:14:47,540 >> Demandoj? 193 00:14:47,540 --> 00:14:58,070 >> La lasta estas pipo, kiun vi povas pensi pri kiel preni la normo ekster de unu komando 194 00:14:58,070 --> 00:15:01,210 kaj tial estas la normo en la venonta ordono. 195 00:15:01,210 --> 00:15:05,570 Ekzemplo tie eĥo estas komandlinio afero 196 00:15:05,570 --> 00:15:11,840 kiu estas ĝuste tuj eĥon ajn mi metis kiel ĝia argumento. Mi ne mortigos citaĵoj. 197 00:15:11,840 --> 00:15:16,150 Eĥo bla, bla, bla estas ĝuste tuj presi bla, bla, bla. 198 00:15:16,150 --> 00:15:20,600 Antaŭe, kiam mi diris ke mi devis meti Rob en txt-dosiero 199 00:15:20,600 --> 00:15:28,830 ĉar mi povas nur alidirektilo txt-dosieroj, anstataŭ, / se mi eĥon Rob 200 00:15:28,830 --> 00:15:35,520 kaj tiam pipon ĝin en. / saluton, ke ankaŭ faros la sama tipo de afero. 201 00:15:35,520 --> 00:15:39,160 Ĉi prenas la eligo de ĉi komando, eĥo Rob, 202 00:15:39,160 --> 00:15:43,610 kaj uzante ĝin kiel la enigo por. / saluton. 203 00:15:44,790 --> 00:15:49,560 Vi povas pensi pri tio kiel unua alidirektilo eĥo Rob en dosieron 204 00:15:49,560 --> 00:15:54,160 kaj poste enigo enen. / saluton tiu dosiero kiu estis ĝuste outputted. 205 00:15:54,160 --> 00:15:57,850 Sed ĝi prenas la provizora dosiero el la bildoj. 206 00:16:01,890 --> 00:16:04,460 >> Demandojn sur tio? 207 00:16:04,460 --> 00:16:07,150 >> La sekva demando tuj engaĝi ĉi. 208 00:16:07,150 --> 00:16:15,310 Kio dukton povus vi uzas por trovi la nombro de unikaj nomoj en dosiero nomata names.txt? 209 00:16:15,310 --> 00:16:24,160 La komandoj nin tuj volas uzi ĉi tie estas solaj, do uniq, kaj tiam wc. 210 00:16:24,160 --> 00:16:28,840 Vi povas fari viro uniq al reale rigardu kion tiu faras, 211 00:16:28,840 --> 00:16:34,840 kaj ĝi estas nur tuj filtri apuda matching linioj de la enigo. 212 00:16:34,840 --> 00:16:40,690 Kaj viro wc tuj presi la linion, vorto, kaj bajto grafoj por ĉiu dosiero. 213 00:16:40,690 --> 00:16:43,760 Kaj la lasta nin tuj volas uzi estas varo, 214 00:16:43,760 --> 00:16:47,410 kiu iras al nur ordigi liniojn de txt-dosiero. 215 00:16:47,410 --> 00:16:58,080 Se mi faras iujn txt-dosiero, names.txt, kaj ĝi estas Rob, Tommy, Jozef, Tommy, Jozef, RJ, Rob, 216 00:16:58,080 --> 00:17:03,910 kion mi volas fari tie estas trovi la nombron de solaj nomoj en ĉi tiu dosiero. 217 00:17:03,910 --> 00:17:08,750 Do kion devus esti la respondo? >> [Studento] 4. >> Jes. 218 00:17:08,750 --> 00:17:13,780 Ĝi devus esti 4 ekde Rob, Tommy, Jozef, RJ estas la sola unika nomoj en ĉi tiu dosiero. 219 00:17:13,780 --> 00:17:20,180 La unua paŝo, se mi nur faru vorto havas names.txt, 220 00:17:20,180 --> 00:17:24,290 ĉi tiu estas efektive diri ĉion al mi. 221 00:17:24,290 --> 00:17:32,560 Tiu estas fakte impreso - Ni vidos, viro wc - newlines, vortoj, kaj bajto grafo. 222 00:17:32,560 --> 00:17:38,270 Se mi nur zorgas pri linioj, tiam mi povas nur fari wc-l names.txt. 223 00:17:41,730 --> 00:17:44,300 Do jen paŝo 1. 224 00:17:44,300 --> 00:17:50,510 Sed mi ne volas wc-l names.txt ĉar names.txt nur enhavas ĉiujn nomojn, 225 00:17:50,510 --> 00:17:54,170 kaj mi volas filtri ajna ne-solaj. 226 00:17:54,170 --> 00:18:01,200 Do, se mi faras uniq names.txt, kiu ne sufiĉe doni al mi kion mi volas 227 00:18:01,200 --> 00:18:03,760 ĉar la duobligitaj nomoj estas ankoraŭ tie. 228 00:18:03,760 --> 00:18:07,690 Kial estas tio? Kial uniq ne faras tion, kion mi volas? 229 00:18:07,690 --> 00:18:10,500 [Studento] La duobligas ne [inaudible] >> Jes. 230 00:18:10,500 --> 00:18:16,370 Memoru la viro paĝo uniq diras filtrilon apuda kongruanta linioj. 231 00:18:16,370 --> 00:18:19,680 Ili ne estas apuda, do tute ne filtri ilin. 232 00:18:19,680 --> 00:18:31,100 Se mi ordigi ilin unue, varo names.txt tuj metis ĉiujn duplikatajn linioj kune. 233 00:18:31,100 --> 00:18:34,450 Do nun speco names.txt estas tio. 234 00:18:34,450 --> 00:18:40,550 Mi tuj volas uzi tiun kiel la enigo al uniq, kiu estas | uniq. 235 00:18:40,550 --> 00:18:43,390 Tio donas al mi Jozef, RJ, Rob, Tommy, 236 00:18:43,390 --> 00:18:49,260 kaj mi volas uzi tiun kiel la enigo al wc-l, 237 00:18:49,260 --> 00:18:52,740 kiu tuj donos al mi 4. 238 00:18:52,740 --> 00:18:56,930 Kiel diras ĉi tie, kion dukton povus vi uzas? 239 00:18:56,930 --> 00:19:01,390 Vi povas fari multon kiel uzi serion da ordonoj 240 00:19:01,390 --> 00:19:05,130 kie oni uzas la eligo de unu komandon kiel la enigo al la sekvanta komando. 241 00:19:05,130 --> 00:19:08,780 Vi povas fari multon, ĝi tre lerte aĵojn. 242 00:19:08,780 --> 00:19:11,440 >> Demandoj? 243 00:19:12,910 --> 00:19:14,600 Okay. 244 00:19:14,600 --> 00:19:17,880 Estas tio por pipoj kaj redirección. 245 00:19:18,370 --> 00:19:24,090 >> Nun ni iru al la efektiva materialo, la kodigo stuff. 246 00:19:24,090 --> 00:19:29,100 Ene de ĉi PDF, vi vidos ĉi komando, 247 00:19:29,100 --> 00:19:32,950 kaj vi volas kuri ĉi komando en via aparaton. 248 00:19:36,240 --> 00:19:42,250 wget estas la komando por nur nun io el la interreto, esence, 249 00:19:42,250 --> 00:19:45,180 tiel wget kaj ĉi URL. 250 00:19:45,180 --> 00:19:49,110 Se vi iris al tiu retadreso en via retumilo, estus elŝuti tiu dosiero. 251 00:19:49,110 --> 00:19:52,510 Mi nur klakis sur ĝi, do ĝi elŝutis la dosieron por mi. 252 00:19:52,510 --> 00:19:55,650 Sed skribi wget de tiu afero ene de la fina 253 00:19:55,650 --> 00:19:58,620 Estas ĝuste tuj elŝuti ĝin en vian terminalo. 254 00:19:58,620 --> 00:20:02,750 Mi havas section5.zip, kaj vi volas descomprimir section5.zip, 255 00:20:02,750 --> 00:20:06,520 kiu tuj donos al vi dosierujo nomita section5, 256 00:20:06,520 --> 00:20:11,550 kiu iras al havi ĉiujn dosierojn nin tuj uzos hodiaŭ ene de ĝi. 257 00:20:33,380 --> 00:20:37,710 Kiel tiuj programoj 'dosiero nomoj sugestas, ili estas iom kalesxo, 258 00:20:37,710 --> 00:20:40,990 tial Via misio estas ekkompreni kial uzante gdb. 259 00:20:40,990 --> 00:20:44,560 Ĉu ĉiuj jam ili malŝarĝis / scias kiel akiri ilin elŝutebla 260 00:20:44,560 --> 00:20:47,480 en ilian aparaton? Okay. 261 00:20:47,480 --> 00:20:56,400 >> Kurante ./buggy1, ĝi diros Segmentación kulpo (kerno verŝis), 262 00:20:56,400 --> 00:21:00,500 kion ajn vi ricevas segfault, estas malbona. 263 00:21:00,500 --> 00:21:03,810 Sub kiaj cirkonstancoj vi ricevas segfault? 264 00:21:03,810 --> 00:21:08,210 [Studento] Dereferencing nula puntero. >> Jes. Do kiu estas unu ekzemplo. 265 00:21:08,210 --> 00:21:11,580 Dereferencing nula puntero vi tuj ricevas segfault. 266 00:21:11,580 --> 00:21:16,720 Kia segfault signifas ke vi tuŝis memoro vi ne devas esti tuŝi. 267 00:21:16,720 --> 00:21:21,350 Do dereferencing nula puntero tuŝas adreso 0, 268 00:21:21,350 --> 00:21:28,060 kaj esence, ĉiuj komputiloj nuntempe diri ke adreso 0 estas memoro vi ne devas esti tuŝi. 269 00:21:28,060 --> 00:21:31,920 Por ke tio dereferencing nula puntero rezultoj en segfault. 270 00:21:31,920 --> 00:21:37,210 Kiam vi hazarde ne pravalorizi puntero, tiam ĝi havas rubo valoro, 271 00:21:37,210 --> 00:21:41,520 kaj do kiam vi provas dereference ĝin, en ĉiu verŝajneco vi tuŝi memoro 272 00:21:41,520 --> 00:21:43,540 jen en la mezo de nenie. 273 00:21:43,540 --> 00:21:45,650 Se vi hazarde preni bonŝanca kaj la rubo valoro 274 00:21:45,650 --> 00:21:48,440 okazis al punkto ie en la pilo aŭ ion, 275 00:21:48,440 --> 00:21:50,820 tiam, kiam vi dereference ke puntero kiujn vi ne inicializada, 276 00:21:50,820 --> 00:21:52,730 nenio iros malbone. 277 00:21:52,730 --> 00:21:55,480 Sed se ĝi estas indikante, diru, ie inter la pilo kaj la amaso, 278 00:21:55,480 --> 00:21:59,850 aŭ ĝi estas montrante nur por ie, ke ne estis uzata de via programo ankoraux, 279 00:21:59,850 --> 00:22:02,240 tiam vi tuŝi memoro vi ne devas esti kortuŝa kaj vi segfault. 280 00:22:02,240 --> 00:22:06,370 Kiam vi skribas rekursia funkcio kaj ĝi recurses tro da fojoj 281 00:22:06,370 --> 00:22:08,720 kaj via pilo kreskas tro grandaj kaj la pilo karambolas en aĵoj 282 00:22:08,720 --> 00:22:12,270 por ke gxi ne estu karamboli kun, vi tuŝis memoro vi ne devas esti tuŝi, 283 00:22:12,270 --> 00:22:14,810 tiel vi segfault. 284 00:22:14,810 --> 00:22:17,010 Tio estas kion segfault estas. 285 00:22:17,010 --> 00:22:21,810 >> Estas ankaŭ la sama kialo ke se vi havas ĉenon kiel - 286 00:22:21,810 --> 00:22:23,930 ni reiru al la antaŭa programo. 287 00:22:23,930 --> 00:22:28,530 En hello.c--I'm just tuj faros ion alian. 288 00:22:28,530 --> 00:22:33,770 char * s = "Saluton mondo!"; 289 00:22:33,770 --> 00:22:42,310 Se mi uzas * s = io aŭ s [0] = 'X'; 290 00:22:42,310 --> 00:22:47,290 tiel faru saluton,. / saluton, kial tiu segfault? 291 00:22:48,410 --> 00:22:51,250 Kial ĉi segfault? 292 00:22:55,660 --> 00:22:57,890 Kion vi atendas pasas? 293 00:22:57,890 --> 00:23:06,640 Se mi faris printf ("% s \ n", s); kion vi atendus esti presita? 294 00:23:06,640 --> 00:23:09,930 [Studento] X saluton. >> Jes. 295 00:23:09,930 --> 00:23:15,140 La problemo estas, ke kiam vi deklaras ĉenon kiel ĉi tiu, 296 00:23:15,140 --> 00:23:18,190 s estas puntero ke tuj iros sur la pilo, 297 00:23:18,190 --> 00:23:25,880 kaj kion s indikante estas ĉi ŝnuro kiu estas enhavita en nurlega memoro. 298 00:23:25,880 --> 00:23:30,560 Do nur la nomo, nurlega memoro, vi devus ricevi la ideo 299 00:23:30,560 --> 00:23:33,010 ke se vi provas ŝanĝi kio estas en nurlega memoro, 300 00:23:33,010 --> 00:23:36,670 vi faras ion vi ne faros kun memoro kaj vi segfault. 301 00:23:36,670 --> 00:23:45,360 Tio estas vere granda diferenco inter char * s kaj char s []. 302 00:23:45,360 --> 00:23:48,790 Do char s [], nun ĉi ŝnuroj tuj estos metita sur la pilo, 303 00:23:48,790 --> 00:23:53,960 kaj la pilo estas ne legis nur, kio signifas ke ĉi tiu devus funkcii perfekte bela. 304 00:23:55,500 --> 00:23:57,370 Kaj ĝi faras. 305 00:23:57,370 --> 00:24:06,250 Memoru ke kiam mi faras char * s = "Saluton mondo!", S mem estas sur la stako 306 00:24:06,250 --> 00:24:10,390 sed s poentojn al alie, kaj ke ie ajn hazarde estas nurlega. 307 00:24:10,390 --> 00:24:15,640 Sed char s [] estas nur iun sur la stako. 308 00:24:17,560 --> 00:24:21,760 Do jen alia ekzemplo de segfault okazas. 309 00:24:21,760 --> 00:24:27,820 >> Ni vidis, ke ./buggy1 rezultis en segfault. 310 00:24:27,820 --> 00:24:31,810 En teorio, vi devus ne rigardi buggy1.c tuj. 311 00:24:31,810 --> 00:24:35,170 Anstataŭ, ni rigardos ĝin tra gdb. 312 00:24:35,170 --> 00:24:37,750 Rimarku, ke kiam vi ricevas Segmentación kulpo (kerno verŝis), 313 00:24:37,750 --> 00:24:40,850 vi ricevas tiun dosieron super tie nomas kerno. 314 00:24:40,850 --> 00:24:45,200 Se ni ls-l, ni vidos, ke kerno estas kutime sufiĉe granda dosiero. 315 00:24:45,200 --> 00:24:51,580 Tio estas la nombro de bitokoj de la dosiero, do ĝi aspektas kiel ĝi estas 250-io kilobajtoj. 316 00:24:51,580 --> 00:24:56,120 La kialo estas ke kion la kerno dump efektive estas 317 00:24:56,120 --> 00:25:01,410 estas kiam via programo frakasas, la stato de memoro de via programo 318 00:25:01,410 --> 00:25:05,230 nur gets kopiitaj kaj pasted en ĉi tiun dosieron. 319 00:25:05,230 --> 00:25:07,270 Ĝi prenas verŝis en tiun dosieron. 320 00:25:07,270 --> 00:25:13,060 Ĉi tiu programo, dum ĝi ruliĝas, okazis havi memoron uzado de ĉirkaŭ 250 kilobajtoj, 321 00:25:13,060 --> 00:25:17,040 kaj tiel tion got verŝis en ĉi tiun dosieron. 322 00:25:17,040 --> 00:25:23,630 Nun vi povas rigardi en tiu dosiero, se ni faras gdb buggy1 kerno. 323 00:25:23,630 --> 00:25:30,130 Ni povas nur fari gdb buggy1, kaj kiu nur funkciigas gdb regule, 324 00:25:30,130 --> 00:25:33,800 uzante buggy1 kiel ĝia enigo dosiero. 325 00:25:33,800 --> 00:25:38,260 Sed se vi faras gdb buggy1 kerno, tiam ĝi estas specife tuj funkciigas gdb 326 00:25:38,260 --> 00:25:40,330 per rigardas tiun kernon dosiero. 327 00:25:40,330 --> 00:25:45,560 Kaj vi diras buggy1 per gdb scias ke tiu kerno dosiero devenas la buggy1 programo. 328 00:25:45,560 --> 00:25:49,580 Do gdb buggy1 kerno tuj tuj venigi nin 329 00:25:49,580 --> 00:25:52,060 al kie la programo okazis al finiĝi. 330 00:25:57,720 --> 00:26:02,340 Ni vidas tie Programo finita kun signalo 11, Segmentación kulpo. 331 00:26:02,340 --> 00:26:10,110 Ni okazi vidi linion de muntado, kiu probable ne estas tre helpema. 332 00:26:10,110 --> 00:26:15,360 Sed se vi tajpas bt aŭ retrospuro, ke tuj estos la funkcio 333 00:26:15,360 --> 00:26:19,430 kiu donas al ni la listo de niaj aktualaj pilo kadroj. 334 00:26:19,430 --> 00:26:23,150 Do retrospuro. Ĝi aspektas kiel ni nur havas du pilo kadroj. 335 00:26:23,150 --> 00:26:26,310 La unua estas nia ĉefa pilo kadro, 336 00:26:26,310 --> 00:26:29,810 kaj la dua estas la pilo framo por tiu funkcio kiu ni hazarde estas en, 337 00:26:29,810 --> 00:26:34,440 kiu aspektas kiel ni nur havas la asembleo kodo por. 338 00:26:34,440 --> 00:26:38,050 Do ni iru returne en nia ĉefa funkcio, 339 00:26:38,050 --> 00:26:42,300 kaj por fari tion ni povos fari kadro 1, kaj mi kredas ke ni povas ankaŭ fari sube, 340 00:26:42,300 --> 00:26:45,160 sed mi preskaŭ neniam faras malsupren - aŭ supren. Yeah. 341 00:26:45,160 --> 00:26:50,710 Supren kaj malsupren. Supren alportas vin unu pilo kadro, malsupren alportas vin pilo kadro. 342 00:26:50,710 --> 00:26:53,240 Mi emas neniam uzi tiun. 343 00:26:53,240 --> 00:26:59,120 Mi nur diras specife kadro 1, kiu estas iri al la framo etikeditaj 1. 344 00:26:59,120 --> 00:27:01,750 Kadro 1 tuj venigos nin en ĉefa pilo kadro, 345 00:27:01,750 --> 00:27:05,570 kaj ĝi diras ĉi tie la linio de kodo oni hazarde estas en. 346 00:27:05,570 --> 00:27:07,950 Se ni volis paron pli linioj de kodo, ni povas diri listo, 347 00:27:07,950 --> 00:27:11,280 kaj ke tuj doni al ni ĉiuj linioj de kodo ĉirkaŭ ĝi. 348 00:27:11,280 --> 00:27:13,360 La linio ni segfaulted ĉe estis 6: 349 00:27:13,360 --> 00:27:17,360 if (strcmp ("CS50 rokoj", argv [1]) == 0). 350 00:27:17,360 --> 00:27:24,130 Se ĝi ne estas evidenta tamen, vi povas akiri ĝin rekte de ĉi tie nur pensante kial segfaulted. 351 00:27:24,130 --> 00:27:28,800 Sed ni povas porti ĝin unu paŝon kaj diris, "Kial argv [1] segfault?" 352 00:27:28,800 --> 00:27:38,830 Estu la impreso argv [1], kaj ĝi similas ke estas 0x0, kiu estas la nula puntero. 353 00:27:38,830 --> 00:27:44,750 Ni strcmping CS50 rokoj kaj nula, kaj por ke tuj segfault. 354 00:27:44,750 --> 00:27:48,280 Kaj kial argv [1] nula? 355 00:27:48,640 --> 00:27:51,280 [Studento] Ĉar ni ne donis ĝin ajna komand-linio argumentoj. 356 00:27:51,280 --> 00:27:53,390 Yeah. Ni ne donos ĝin ajna komand-linio argumentoj. 357 00:27:53,390 --> 00:27:58,460 Do ./buggy1 nur havos argv [0] esti ./buggy1. 358 00:27:58,460 --> 00:28:02,100 Oni ne tuj havas argv [1], por ke tuj segfault. 359 00:28:02,100 --> 00:28:07,450 Sed se, anstataŭe, mi faras ĝuste CS50, ĝi tuj diros Vi ricevas D 360 00:28:07,450 --> 00:28:09,950 ĉar tio kio ĝi estas supozita fari. 361 00:28:09,950 --> 00:28:15,240 Rigardante buggy1.c, ĝi estas supozitaj presi "Vi ricevos D" - 362 00:28:15,240 --> 00:28:20,820 Se argv [1] estas ne "CS50 rokoj", "Vi ricevas D", alie "Vi ricevas A!" 363 00:28:20,820 --> 00:28:25,660 Do, se ni volas A, ni bezonas tiun kompari kiel vera, 364 00:28:25,660 --> 00:28:28,710 kio signifas ke ĝi komparas al 0. 365 00:28:28,710 --> 00:28:31,100 Do argv [1] bezonas esti "CS50 rokoj". 366 00:28:31,100 --> 00:28:35,660 Se vi volas fari tion en la komandlinio, vi devas uzi \ eskapi la spaco. 367 00:28:35,660 --> 00:28:41,690 Do CS50 \ rokoj kaj Vi ricevas A! 368 00:28:41,690 --> 00:28:44,060 Se vi ne faras la backslash, kial tio ne funkcias? 369 00:28:44,060 --> 00:28:47,190 [Studento] Estas du malsamaj argumentoj. >> Jes. 370 00:28:47,190 --> 00:28:52,540 Argv [1] tuj estos CS50, kaj argv [2] tuj estos rokoj. Okay. 371 00:28:52,540 --> 00:28:56,470 >> Nun ./buggy2 tuj segfault denove. 372 00:28:56,470 --> 00:29:01,880 Anstataŭ malfermi ĝin per sia kerno dosiero, ni simple malfermi buggy2 rekte, 373 00:29:01,880 --> 00:29:05,000 tiel gdb buggy2. 374 00:29:05,000 --> 00:29:09,590 Nun se ni nur kuri nia programo, tiam ĝi tuj diri Programo ricevita signalo SIGSEGV, 375 00:29:09,590 --> 00:29:15,530 kiu estas la segfault signalon, kaj ĉi tiu estas kie okazis okazos. 376 00:29:15,530 --> 00:29:21,250 Rigardante nian retrospuro, ni vidas ke ni estis en la funkcio oh_no, 377 00:29:21,250 --> 00:29:23,900 kiu estis nomita de la funkcio Dinky, kiu estis nomita de la funkcio binky, 378 00:29:23,900 --> 00:29:26,460 kiu estis nomita de main. 379 00:29:26,460 --> 00:29:31,680 Ni povas vidi ankaŭ la argumentojn al tiuj funkcioj. 380 00:29:31,680 --> 00:29:34,680 La argumento por Dinky kaj binky estis 1. 381 00:29:34,680 --> 00:29:44,390 Se ni listigi la funkcio oh_no, ni vidas ke oh_no estas nur faras char ** s = NULL; 382 00:29:44,390 --> 00:29:47,410 * S = "BOOM"; 383 00:29:47,410 --> 00:29:50,330 Kial tio malsukcesos? 384 00:29:54,330 --> 00:29:58,380 [Studento] Vi ne povas dereference la nula puntero? >> Jes. 385 00:29:58,380 --> 00:30:06,090 Tiu estas nur diras s estas NULL, sendepende se tio okazas esti char **, 386 00:30:06,090 --> 00:30:12,070 kiu, dependante de kiom vi interpretas ĝin, povus esti puntero al puntero al ĉeno 387 00:30:12,070 --> 00:30:15,550 aŭ tabelo de kordoj. 388 00:30:15,550 --> 00:30:21,430 Estas s estas NULL, do * s dereferencing nula pointer, 389 00:30:21,430 --> 00:30:24,800 kaj tiel ĉi tiu tuj frakasi. 390 00:30:24,800 --> 00:30:27,540 Tiu estas unu el la plej rapidaj manieroj vi povas eble segfault. 391 00:30:27,540 --> 00:30:31,300 Ĝi simple deklari nulaj puntero kaj tuj segfaulting. 392 00:30:31,300 --> 00:30:34,570 Tion oh_no faras. 393 00:30:34,570 --> 00:30:43,400 Se ni iru unu kadro, tiam ni tuj eniri la funkcio kiu nomis oh_no. 394 00:30:43,400 --> 00:30:44,830 Mi bezonas fari tion sube. 395 00:30:44,830 --> 00:30:48,610 Se vi ne enigi komandon kaj vi ĵus batis Entajpu denove, 396 00:30:48,610 --> 00:30:52,350 ĝi simple ripeti la antaŭajn komandon kiun vi kuris. 397 00:30:52,350 --> 00:30:56,610 Ni estas en kadro 1. 398 00:30:56,610 --> 00:31:04,650 Printante ĉi tiu kadro, ni vidas tie estas nia funkcio. 399 00:31:04,650 --> 00:31:08,520 Vi povas batis listo denove, aŭ vi povas fari listo 20 kaj ĝi estos listigi pli. 400 00:31:08,520 --> 00:31:13,640 La funkcio Dinky diras se i estas 1, tiam iru al la oh_no funkcio, 401 00:31:13,640 --> 00:31:15,960 alie iru al la Slinky funkcio. 402 00:31:15,960 --> 00:31:18,700 Kaj ni scias i estas 1, ĉar ni okazos vidi ĉi tien 403 00:31:18,700 --> 00:31:22,560 ke Dinky nomis per la argumento 1. 404 00:31:22,560 --> 00:31:27,560 Aŭ vi povas simple presi i kaj ĝi diros i estas 1. 405 00:31:27,560 --> 00:31:33,770 Ni estas aktuale en Dinky, kaj se ni iru alia kadro, ni scias ke ni finas en binky. 406 00:31:33,770 --> 00:31:36,600 Ĝis. Nun ni estas en binky. 407 00:31:36,600 --> 00:31:41,340 Printante ĉi funkcio - la listo de antaŭ duono frakasus min - 408 00:31:41,340 --> 00:31:52,670 dividis kvazaŭ mi estas 0, tiam ni tuj nomas ĝin oh_no, alie nomas Dinky. 409 00:31:52,670 --> 00:31:57,000 Ni scias mi estis 1, do nomis Dinky. 410 00:31:57,000 --> 00:32:05,030 Kaj nun ni estas denove en ĉefa, kaj ĉefa estas ĝuste tuj estos int i = rand ()% 3; 411 00:32:05,030 --> 00:32:08,790 Tio estas ĝuste tuj donos al vi hazarda numero kiu estas ĉu 0, 1, aŭ 2. 412 00:32:08,790 --> 00:32:12,780 Ĝi okazas nomi binky kun tiu nombro, kaj ĝi revenos 0. 413 00:32:12,780 --> 00:32:16,700 Rigardante tion, 414 00:32:16,700 --> 00:32:19,880 nur promeni tra la programo permane sen kuri ĝin tuj, 415 00:32:19,880 --> 00:32:25,400 vi starigis ripozon punkto je ĉefa, kio signifas ke kiam ni kuras la programo 416 00:32:25,400 --> 00:32:31,020 via programo kuras supren ĝis batas ripozon punkto. 417 00:32:31,020 --> 00:32:35,450 Do kurante la programo, ĝi kuros kaj tiam ĝi atingos la ĉefa funkcio kaj ĉesi kuri. 418 00:32:35,450 --> 00:32:44,700 Nun ni estas ene de ĉefa, kaj paŝo aŭ apud tuj venigi nin al la sekvanta linio de kodo. 419 00:32:44,700 --> 00:32:47,050 Vi povas fari paŝon aŭ apud. 420 00:32:47,050 --> 00:32:51,800 Bati proksima, nun i estas kreita por rand ()% 3, do ni povas presi la valoro de i, 421 00:32:51,800 --> 00:32:55,280 kaj ĝi diros i estas 1. 422 00:32:55,280 --> 00:32:58,110 Nun gravas ĉu ni uzas sekva aŭ paŝo. 423 00:32:58,110 --> 00:33:01,000 Mi supozas ke gravis en la antaŭa, sed ni volus uzi poste. 424 00:33:01,000 --> 00:33:06,000 Se ni uzas paŝo, ni tretas en la funkcio, kio signifas rigardi la reala afero 425 00:33:06,000 --> 00:33:07,940 ke okazas ene de binky. 426 00:33:07,940 --> 00:33:10,510 Se ni uzas sekva, do tio signifas iri trans la funkcio 427 00:33:10,510 --> 00:33:14,070 kaj ĝuste iri al la sekvanta linio de kodo en nia ĉefa funkcio. 428 00:33:14,070 --> 00:33:17,900 Ĝuste sur tiu linio, mi estis ĉe kie diris rand ()% 3; 429 00:33:17,900 --> 00:33:21,320 se mi faris paŝon, ĝi iros en la efektivigo de rand 430 00:33:21,320 --> 00:33:25,110 kaj rigardu kio okazas tie, kaj mi povus treti tra la rand funkcio. 431 00:33:25,110 --> 00:33:26,920 Sed mi ne zorgas pri la rand funkcio. 432 00:33:26,920 --> 00:33:30,190 Mi nur volas iri al la sekvanta linio de kodo en ĉefa, do mi uzas alia. 433 00:33:30,190 --> 00:33:35,800 Sed nun mi faras zorgon pri la binky funkcio, do mi volas treti sur tio. 434 00:33:35,800 --> 00:33:37,730 Nun mi estas en binky. 435 00:33:37,730 --> 00:33:42,040 La unua linio de kodo estas dironta if (i == 0), Mi prenas unu paŝon, 436 00:33:42,040 --> 00:33:44,930 ni vidas ni finos je Dinky. 437 00:33:44,930 --> 00:33:51,620 Se ni Listo aĵoj, ni vidas ke ĝi kontrolis estas mi = 0. 438 00:33:51,620 --> 00:33:55,470 i estas ne egala al 0, do iris al la alia kondiĉo, 439 00:33:55,470 --> 00:33:59,540 kiu iras nomi Dinky (i). 440 00:33:59,540 --> 00:34:04,030 Vi povus preni konfuzita. 441 00:34:04,030 --> 00:34:07,380 Se vi ĵus rigardi tiujn liniojn rekte, eble vi pensus se (i == 0), 442 00:34:07,380 --> 00:34:10,800 bone, tiam mi prenis unu paŝon kaj nun mi estas ĉe Dinky (i), 443 00:34:10,800 --> 00:34:14,120 vi eble pensas ke devas signifi i = 0 aŭ io. 444 00:34:14,120 --> 00:34:18,980 Ne, tio nur signifas ke ĝi scias povas bati rekte al la linio Dinky (i). 445 00:34:18,980 --> 00:34:23,300 Ĉar mi estas ne 0, la sekva paŝo ne tuj enfluos en la alia. 446 00:34:23,300 --> 00:34:26,239 Else ne estas linio tuj halti en. 447 00:34:26,239 --> 00:34:31,570 Ĝi simple tuj iros al la sekvanta linio povas fakte ekzekuti, kiu estas Dinky (i). 448 00:34:31,570 --> 00:34:36,090 Tretante en Dinky (i), ni vidu se (i == 1). 449 00:34:36,090 --> 00:34:42,670 Ni scias mi = 1, do kiam ni tretas, ni scias ke ni tuj finos en oh_no 450 00:34:42,670 --> 00:34:46,489 ĉar mi = 1 nomas la funkcion oh_no, kiun vi povas treti en, 451 00:34:46,489 --> 00:34:52,969 kiu iras al starigis char ** s = al nulaj kaj tuj "BOOM". 452 00:34:54,270 --> 00:34:59,690 Kaj tiam vere rigardi la efektivigo de buggy2, 453 00:34:59,690 --> 00:35:04,590 ĉi tio, mi estas nur nun hazarda nombro - 0, 1, aŭ 2 - voko binky, 454 00:35:04,590 --> 00:35:10,610 kion se i estas 0 flamo oh_no, alie li nomas Dinky, kiu venas ĉi tien. 455 00:35:10,610 --> 00:35:18,100 Se i estas 1, nomita oh_no, alie nomas Slinky, kiu venas tien, 456 00:35:18,100 --> 00:35:20,460 se i estas 2, nomita oh_no. 457 00:35:20,460 --> 00:35:24,720 Mi eĉ ne kredas ke estas maniero - 458 00:35:24,720 --> 00:35:30,030 Ĉu iu vidas manieron de fari tiun programon kiu ne segfault? 459 00:35:30,030 --> 00:35:37,530 Ĉar se mi mankas io, se i estas 0, vi tuj segfault, 460 00:35:37,530 --> 00:35:41,250 alie vi iras al funkcio kiu se i estas 1 vi segfault, 461 00:35:41,250 --> 00:35:44,540 alie vi iros al funkcio kie se i estas 2 vi segfault. 462 00:35:44,540 --> 00:35:46,810 Do ne gravas kion vi faras, vi segfault. 463 00:35:46,810 --> 00:35:52,380 >> Mi supozas unidirekta de fiksi estus anstataŭ fari char ** s = NULL, 464 00:35:52,380 --> 00:35:55,610 vi povus malloc spaco por ke kordoj. 465 00:35:55,610 --> 00:36:04,230 Ni povus fari malloc (sizeof) - sizeof kio? 466 00:36:09,910 --> 00:36:15,190 [Studento] (char) * 5? >> Ĉu ĉi ŝajnas ne? 467 00:36:15,190 --> 00:36:21,060 Mi supozas ĉi funkcios se mi efektive kuris, sed ĝi ne estas kion mi serĉas. 468 00:36:24,400 --> 00:36:32,940 Rigardu la tipo de s. Ni aldonu int *, do int * x. 469 00:36:32,940 --> 00:36:35,600 Mi farus malloc (sizeof (int)). 470 00:36:35,600 --> 00:36:40,490 Aŭ se mi volis tabelo de 5, mi farus (sizeof (int) * 5); 471 00:36:40,490 --> 00:36:44,210 Kio se mi havas int **? 472 00:36:46,260 --> 00:36:49,140 Kion farus mi malloc? 473 00:36:49,140 --> 00:36:53,510 [Studento] Grandeco de la puntero. >> Jes. (Sizeof (int *)); 474 00:36:53,510 --> 00:36:56,960 Sama afero cxi tie. 475 00:36:56,960 --> 00:37:01,280 Mi volas (sizeof (char *)); 476 00:37:06,170 --> 00:37:12,840 Tiu tuj destini spaco por la puntero kiu notas al "BOOM". 477 00:37:12,840 --> 00:37:15,330 Mi ne bezonas destini spaco por "BOOM" mem 478 00:37:15,330 --> 00:37:17,210 ĉar ĉi tiu estas esence ekvivalenta al kion mi diris antaŭe 479 00:37:17,210 --> 00:37:20,870 char * x = "BOOM". 480 00:37:20,870 --> 00:37:27,950 "BOOM" jam ekzistas. Ĝi okazas ekzisti en la nurlega regiono de memoro. 481 00:37:27,950 --> 00:37:35,200 Sed jam ekzistas, kio signifas ĉi tiu linio de kodo, se s estas char **, 482 00:37:35,200 --> 00:37:43,900 tiam * s estas char * kaj vi opcio ĉi char * atentigi al "BOOM". 483 00:37:43,900 --> 00:37:50,040 Se mi volis kopii "BOOM" en s, tiam mi bezonus destini spaco por s. 484 00:37:55,170 --> 00:38:03,900 Mi tion faros * s = malloc (sizeof (char) * 5); 485 00:38:03,900 --> 00:38:06,210 Kial 5? 486 00:38:06,210 --> 00:38:10,860 Kial ne 4? Ĝi aspektas kiel "BOOM" estas 4 signoj. >> [Studento] La nula karaktero. 487 00:38:10,860 --> 00:38:14,580 Yeah. Ĉiuj viaj kordoj tuj bezonas la nula karaktero. 488 00:38:14,580 --> 00:38:23,590 Nun mi povas fari ion kiel strcat - Kio estas la funkcio por kopiado ĉeno? 489 00:38:23,590 --> 00:38:28,520 [Studento] cpy? >> Strcpy. 490 00:38:28,520 --> 00:38:32,700 viro strcpy. 491 00:38:36,120 --> 00:38:39,590 Do strcpy aŭ strncpy. 492 00:38:39,590 --> 00:38:43,410 strncpy estas iom pli sekura ĉar vi povas specifi ĝuste kiom da karakteroj, 493 00:38:43,410 --> 00:38:46,190 sed tie ne gravas ĉar ni scias. 494 00:38:46,190 --> 00:38:50,340 Do strcpy kaj rigardu en la argumentoj. 495 00:38:50,340 --> 00:38:53,100 La unua argumento estas nia destino. 496 00:38:53,100 --> 00:38:56,770 La dua argumento estas nia fonto. 497 00:38:56,770 --> 00:39:10,310 Ni tuj kopii en nian destinon * s la puntero "BOOM". 498 00:39:10,310 --> 00:39:19,820 Kial povus vi volas fari ĉi tion kun strcpy anstataŭ ĝuste kion ni havis antaŭ 499 00:39:19,820 --> 00:39:22,800 de * s = "BOOM"? 500 00:39:22,800 --> 00:39:28,630 Estas kialo vi volus fari tion, sed kio estas tio? 501 00:39:28,630 --> 00:39:31,940 [Studento] Se vi volas ŝanĝi ion en "BOOM". >> Jes. 502 00:39:31,940 --> 00:39:37,950 Nun mi povas fari ion kiel s [0] = 'X'; 503 00:39:37,950 --> 00:39:48,190 ĉar s poentojn al la amaso kaj tiu spaco sur la havaĵon kiun s montrante 504 00:39:48,190 --> 00:39:52,320 Estas puntero al pli spaco sur la havaĵon, kiu estas stoki "BOOM". 505 00:39:52,320 --> 00:39:55,150 Do ĉi tiu kopio de "BOOM" estas stokita en la havaĵo. 506 00:39:55,150 --> 00:39:58,780 Estas teknike du kopioj de "BOOM" en nia programo. 507 00:39:58,780 --> 00:40:03,500 Estas la unua ke tio simple donita per ĉi tiu "BOOM" string konstanto, 508 00:40:03,500 --> 00:40:09,250 kaj la dua ekzemplero de "BOOM", strcpy kreis la kopion de "BOOM". 509 00:40:09,250 --> 00:40:13,100 Sed la kopion de "BOOM" estas stokita en la amaso, kaj la amaso vi estas libera ŝanĝi. 510 00:40:13,100 --> 00:40:17,250 La amaso ne legis nur tiel, ke signifas, ke s [0] 511 00:40:17,250 --> 00:40:20,500 tuj lasu vin ŝanĝi la valoron de "BOOM". 512 00:40:20,500 --> 00:40:23,130 Ĝi okazas, por ke vi ŝanĝu la gravuloj. 513 00:40:23,130 --> 00:40:26,640 >> Demandoj? 514 00:40:27,740 --> 00:40:29,290 Okay. 515 00:40:29,290 --> 00:40:35,500 >> Pasi al buggy3, estu la gdb buggy3. 516 00:40:35,500 --> 00:40:39,840 Ni nur ruli ĝin kaj ni vidas ni preni segfault. 517 00:40:39,840 --> 00:40:46,550 Se ni retrospuro, estas nur du funkcioj. 518 00:40:46,550 --> 00:40:52,970 Se ni iras supren en nia ĉefa funkcio, ni vidas ke ni segfaulted ĉe ĉi tiu linio. 519 00:40:52,970 --> 00:41:00,180 Do ĵus rigardis tiun linion, por (_int_ linio = 0; fgets ĉi aĵoj ne egala NULL; 520 00:41:00,180 --> 00:41:03,770 linio + +). 521 00:41:03,770 --> 00:41:08,010 Nia antaŭa framo nomis _IO_fgets. 522 00:41:08,010 --> 00:41:10,720 Vi vidos ke tre kun enkonstruita en C funkcioj, 523 00:41:10,720 --> 00:41:15,350 ke kiam vi akiras la segfault, estos vere críptico funkcio nomoj 524 00:41:15,350 --> 00:41:18,090 kiel tiu _IO_fgets. 525 00:41:18,090 --> 00:41:21,770 Sed tio okazas rilatigi al ĉi fgets alvokon. 526 00:41:21,770 --> 00:41:25,850 Ie ene tie, ni segfaulting. 527 00:41:25,850 --> 00:41:30,340 Se ni rigardas la argumentoj por fgets, ni povas presi buffer. 528 00:41:30,340 --> 00:41:41,180 Ni presas kiel - Ho, ne. 529 00:41:48,980 --> 00:41:51,900 Print ne tuj funkcias precize kiel mi volas ĝin. 530 00:41:55,460 --> 00:41:58,000 Ni rigardu la reala programo. 531 00:42:02,200 --> 00:42:09,640 Buffer estas gravulo tabelo. Estas karaktero tabelo de 128 signoj. 532 00:42:09,640 --> 00:42:14,980 Do kiam mi diras print buffer, ĝi tuj presi tiujn 128 signoj, 533 00:42:14,980 --> 00:42:18,300 kion mi supozas estas kio atendas. 534 00:42:18,300 --> 00:42:21,390 Kion mi serĉis estas presi la adreson de bufro, 535 00:42:21,390 --> 00:42:23,680 sed tio ne vere diras al mi multe. 536 00:42:23,680 --> 00:42:30,770 Do kiam mi okazi diri tien x buffer, ĝi montras al mi 0xbffff090, 537 00:42:30,770 --> 00:42:38,690 kiu, se vi memoras de antaŭaj aŭ iu punkto, Oxbffff emas esti pilo-ish regiono. 538 00:42:38,690 --> 00:42:46,020 La pilo inklinas komenci ie ĝuste sub 0xc000. 539 00:42:46,020 --> 00:42:51,890 Nur vidante tiu adreso, mi scias ke buffer okazas sur la stako. 540 00:42:51,890 --> 00:43:04,500 Restartigi mian programon, kuri, ĝis, buffer ni vidis, estis tiu vico de signoj 541 00:43:04,500 --> 00:43:06,530 ke estas sufiĉe da sensignifaj. 542 00:43:06,530 --> 00:43:12,270 Tiam presi dosiero, kion signifas dosiero aspektas? 543 00:43:15,120 --> 00:43:17,310 [Studento] Nula. >> Jes. 544 00:43:17,310 --> 00:43:22,610 Dosiero estas de tipo DOSIERO *, do ĝi estas puntero, 545 00:43:22,610 --> 00:43:26,610 kaj la valoro de tiu puntero estas nula. 546 00:43:26,610 --> 00:43:33,240 Do fgets tuj provos legi de tiu puntero en nerekta vojo, 547 00:43:33,240 --> 00:43:37,320 sed por aliri ke pointer, ĝi devas dereference ĝin. 548 00:43:37,320 --> 00:43:40,550 Aŭ, por konsenti kio devus esti indikante, ĝi dereferences ĝin. 549 00:43:40,550 --> 00:43:43,810 Do ĝi estas dereferencing nula puntero kaj segfaults. 550 00:43:46,600 --> 00:43:48,730 Mi povus esti rekomencita ŝin tie. 551 00:43:48,730 --> 00:43:52,170 Se ni dispecigas ĉe nia ĉefa punkto kaj kuri, 552 00:43:52,170 --> 00:43:57,320 la unua linio de kodo estas char * dosiernomo = "nonexistent.txt"; 553 00:43:57,320 --> 00:44:00,870 Tio devus doni sufiĉe granda aludo pri kial ĉi programo malsukcesas. 554 00:44:00,870 --> 00:44:06,080 Tajpi sekva alportas mi al la sekva linio, kie mi malfermu tiun dosieron, 555 00:44:06,080 --> 00:44:11,140 kaj tiam mi tuj eniri nian linion, kie iam mi batis proksima, ĝi tuj segfault. 556 00:44:11,140 --> 00:44:16,880 Ĉu iu volas elĵetas tial ni povus segfaulting? 557 00:44:16,880 --> 00:44:19,130 [Studento] Dosiero ne ekzistas. >> Jes. 558 00:44:19,130 --> 00:44:22,250 Tiu estas supozata esti aludo 559 00:44:22,250 --> 00:44:29,570 ke kiam ajn vi malfermas dosieron vi bezonas kontroli, ke la dosiero reale ekzistas. 560 00:44:29,570 --> 00:44:31,510 Do jen, "nonexistent.txt"; 561 00:44:31,510 --> 00:44:34,700 Kiam ni fopen dosiernomo por legi, ni tiam devas eldiri 562 00:44:34,700 --> 00:44:45,870 if (dosiero == NULL) kaj diru printf ("Dosiero ne ekzistas!" 563 00:44:45,870 --> 00:44:56,340 aŭ - pli bone tamen - dosiernomo); reveno 1; 564 00:44:56,340 --> 00:45:00,300 Do nun ni kontrolu por vidi se ĝi estas NULL 565 00:45:00,300 --> 00:45:03,930 antaux vere daŭrigi kaj provante legi de tiu dosiero. 566 00:45:03,930 --> 00:45:08,800 Ni povas refari ĝin nur por vidi ke tiu verkoj. 567 00:45:11,020 --> 00:45:14,970 Mi intencis inkluzivi nova linio. 568 00:45:21,090 --> 00:45:25,290 Do nun nonexistent.txt ne ekzistas. 569 00:45:26,890 --> 00:45:30,040 Vi devus ĉiam kontroli por ĉi tiaj aferoj. 570 00:45:30,040 --> 00:45:33,870 Vi devus ĉiam kontroli por vidi se fopen revenas NULL. 571 00:45:33,870 --> 00:45:38,170 Vi devus ĉiam kontroli por certiĝi ke malloc ne revenas NULL, 572 00:45:38,170 --> 00:45:41,410 alie vi segfault. 573 00:45:42,200 --> 00:45:45,930 >> Nun buggy4.c. 574 00:45:49,190 --> 00:45:58,440 Kurante. Mi konjektas ĉi atendas enigo aŭ eble malfinio looping. 575 00:45:58,440 --> 00:46:01,870 Jes, estas malfinio looping. 576 00:46:01,870 --> 00:46:05,560 Do buggy4. Ĝi aspektas kiel ni estas senfinaj looping. 577 00:46:05,560 --> 00:46:12,590 Ni povas rompi en ĉefa, kuri nia programo. 578 00:46:12,590 --> 00:46:20,180 En gdb, tiel longe kiel la mallongigo vi uzas estas unusenca 579 00:46:20,180 --> 00:46:23,420 aŭ speciala mallongigoj kiuj ili havigas al vi, 580 00:46:23,420 --> 00:46:29,020 tiam vi povas uzi n uzi sekva anstataŭ devi tajpi ekster sekva la tuta vojo. 581 00:46:29,020 --> 00:46:33,730 Kaj nun kiam mi batis n fojon, mi povas nur bati Entajpu teni nun iros 582 00:46:33,730 --> 00:46:36,640 anstataŭ havi bati n Enter, n Enter, n Enigu. 583 00:46:36,640 --> 00:46:44,630 Ĝi aspektas kiel mi estas en ia por buklo ke tio opcio tabelo [i] al 0. 584 00:46:44,630 --> 00:46:50,510 Ĝi aspektas kiel mi neniam rompas el ĉi por buklo. 585 00:46:50,510 --> 00:46:54,780 Se mi presi i, do i estas 2, tiam mi iros proksima. 586 00:46:54,780 --> 00:46:59,250 Mi presi i, i estas 3, tiam mi iros proksima. 587 00:46:59,250 --> 00:47:05,360 Mi presi i kaj i estas 3. Tuj poste, presi i, i estas 4. 588 00:47:05,360 --> 00:47:14,520 Vere, presita sizeof (areo), do grandeco de tabelo estas 20. 589 00:47:16,310 --> 00:47:32,870 Sed ĝi aspektas kiel ekzistas iuj specialaj gdb komandon por iri ĝis io okazos. 590 00:47:32,870 --> 00:47:37,620 Estas kiel opcio kondiĉo sur la valoro de la variablo. Sed mi ne memoras kio ĝi estas. 591 00:47:37,620 --> 00:47:44,100 Do, se ni plenumas tuj - 592 00:47:44,100 --> 00:47:47,120 Kion vi diras? Kion vi alkondukis? 593 00:47:47,120 --> 00:47:50,500 [Studento] Does montri i aldoni - >> Jes. Do montri i povas helpi. 594 00:47:50,500 --> 00:47:54,530 Se ni nur montros i, ĝi metos ĉi tien kion la valoro de i estas 595 00:47:54,530 --> 00:47:56,470 do mi ne devas presi ĝin ĉiufoje. 596 00:47:56,470 --> 00:48:02,930 Se ni simple observu tuj poste, ni vidas 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5. 597 00:48:02,930 --> 00:48:08,530 Io tuj terure erara, kaj i estas reset al 0. 598 00:48:13,330 --> 00:48:22,220 Rigardante buggy4.c, ni vidas ĉion, kion okazas estas int tabelo [5]; 599 00:48:22,220 --> 00:48:26,200 por (i = 0; i <= sizeof (areo); i + +) 600 00:48:26,200 --> 00:48:28,550 tabelo [i] = 0; 601 00:48:28,550 --> 00:48:31,390 Kion ni vidas ke estas malĝusta ĉi tie? 602 00:48:31,390 --> 00:48:39,480 Kiel aludo, kiam mi estis faranta la gdb buggy4 - ni rompos ĉefa, run - 603 00:48:39,480 --> 00:48:45,980 Mi ne print sizeof (areo) nur por vidi kion la kondiĉo estas kie mi fine rompi. 604 00:48:47,690 --> 00:48:51,100 Kie mi estas? Ĉu mi kuri? 605 00:48:51,100 --> 00:48:54,280 Mi ne deklaris ankoraŭ. 606 00:48:54,280 --> 00:48:58,680 Do presi sizeof (areo) kaj tio estas 20, 607 00:48:58,680 --> 00:49:06,690 kiu atendas de post mia tabelo estas de amplekso 5 kaj ĝi estas de 5 entjeroj, 608 00:49:06,690 --> 00:49:12,410 do la tuta afero estu 5 * sizeof (int) bajtoj, kie sizeof (int) emas esti 4. 609 00:49:12,410 --> 00:49:14,780 Do sizeof (tabelo) estas 20. 610 00:49:14,780 --> 00:49:17,420 Kion tio povas farigxi? 611 00:49:17,420 --> 00:49:21,720 [Studento] Dividitaj de sizeof (int). >> Jes, / sizeof (int). 612 00:49:21,720 --> 00:49:30,630 Ĝi aspektas kiel ekzistas ankoraŭ problemo tie. Mi kredas ke tiu devus esti nur < 613 00:49:30,630 --> 00:49:36,960 pro tio ke ĝi estas sufiĉe multe ĉiam 00:49:44,860 Nun ni pensas pri kial oni efektive rompiĝis. 615 00:49:44,860 --> 00:49:53,370 Ĉu iu jam divenas kial mi retrovu al 0 por ĉiu ripeto de la ciklo? 616 00:50:01,300 --> 00:50:09,350 La sola afero ene de ĉi tie ke okazas estas ke matrico [i] estas aro al 0. 617 00:50:09,350 --> 00:50:15,350 Do iel tiu linio de kodo estas kaŭzante nia int i al esti aro al 0. 618 00:50:16,730 --> 00:50:23,130 [Studento] Could it be ĉar ĝi estas supera al la memoro de ĉi tiu parto de i 619 00:50:23,130 --> 00:50:27,970 kiam pensas ĝi estas la venonta ero de tabelo? >> [Bowden] Jes. 620 00:50:27,970 --> 00:50:33,880 Kiam ni iras preter la fino de nia tabelo, 621 00:50:33,880 --> 00:50:39,870 iel tiu spaco kiu ni supera estas supera al la valoro de i. 622 00:50:39,870 --> 00:50:48,030 Kaj do se ni rigardas buggy4, rompi ĉefa, kuri, 623 00:50:48,030 --> 00:50:53,120 ni presi la adreso de i. 624 00:50:53,120 --> 00:50:57,280 Ĝi aspektas kiel ĝi estas bffff124. 625 00:50:57,280 --> 00:51:03,930 Nun ni presas la adreson de tabelo [0]. 110. 626 00:51:03,930 --> 00:51:06,290 Kio pri [1]? 114. 627 00:51:06,290 --> 00:51:07,920 [2], 118. 628 00:51:07,920 --> 00:51:14,530 11C, 120. tabelo [5] estas bfff124. 629 00:51:14,530 --> 00:51:26,990 Do tabelo [5] havas la sama adreso kiel i, kio signifas ke tabelo [5] estas mi. 630 00:51:26,990 --> 00:51:30,720 Se ili havas la sama adreso, ili estas la sama afero. 631 00:51:30,720 --> 00:51:38,410 Do kiam ni aro tabelo [5] al 0, ni opcio i al 0. 632 00:51:38,410 --> 00:51:46,070 Kaj se vi pensas pri ĉi en terminoj de la pilo, 633 00:51:46,070 --> 00:51:55,590 int i estas deklarita unue, kion signifas i ricevas iujn spaco sur la stako. 634 00:51:55,590 --> 00:52:04,730 Tiam tabelo [5] estas atribuitaj, do tiam 20 bitokoj estas disponigataj sur la stako. 635 00:52:04,730 --> 00:52:08,400 Do mi prenas asignitaj unua, tiam tiuj 20 bitokoj get asignotaj. 636 00:52:08,400 --> 00:52:11,400 Do i okazas ĝuste antaŭ la tabelo, 637 00:52:11,400 --> 00:52:19,230 kaj pro la maniero, kiel mi diris pasintsemajne, kie teknike la pilo kreskas malsupren, 638 00:52:19,230 --> 00:52:28,520 kiam vi indekson en tabelo, ni garantias ke la 0th pozicio en la tabelo 639 00:52:28,520 --> 00:52:31,970 ĉiam okazas antaŭ la unua pozicio en la tabelo. 640 00:52:31,970 --> 00:52:35,900 Tio estas speco de kiel mi tiris ĝin pasintsemajne. 641 00:52:35,900 --> 00:52:42,210 Rimarku ke en la fundo ni havas adreson 0 kaj supre ni havas adreson Max. 642 00:52:42,210 --> 00:52:44,880 La stako estas ĉiam kreskanta sube. 643 00:52:48,100 --> 00:52:53,500 Supozu ke ni rezervu i. 644 00:52:53,500 --> 00:52:59,680 Ni rezervu entjero mi, kion signifas let la just say tien entjero mi gets asignotaj. 645 00:52:59,680 --> 00:53:06,420 Tiam ni destini nia tabelo de 5 entjeroj, kio signifas, ke sub tiu, 646 00:53:06,420 --> 00:53:11,230 ekde la pilo kreskas malsupren, tiuj 5 entjeroj get asignotaj. 647 00:53:11,230 --> 00:53:15,900 Sed pro kio arrays labori, ni garantias ke la unua pozicio en la tabelo 648 00:53:15,900 --> 00:53:22,260 ĉiam havas adreson malpli ol la dua afero en la tabelo. 649 00:53:22,260 --> 00:53:28,270 Do tabelo pozicio 0 ĉiam devas okazi unue en memoro, 650 00:53:28,270 --> 00:53:30,700 dum tabelo pozicio 1 devas okazi poste 651 00:53:30,700 --> 00:53:33,310 kaj batalarangxis pozicio 2 devas okazi post tio, 652 00:53:33,310 --> 00:53:37,900 kio signifas, ke tabelo pozicio 0 okazus ie cxi tie, 653 00:53:37,900 --> 00:53:40,690 tabelo pozicio 1 okazus super 654 00:53:40,690 --> 00:53:45,530 ĉar movante supren signifas alta adresoj ekde la maksimuma adreso estas ĉe tie. 655 00:53:45,530 --> 00:53:50,490 Do tabelo [0] cxi tie, tabelo [1] ĝis tie, tabelo [2] ĝis tie, tabelo [3] ĝis ĉi tie. 656 00:53:50,490 --> 00:53:55,620 Rimarku kiel ni antaŭe atribuis entjero mi la tuta vojo ĝis tie, 657 00:53:55,620 --> 00:54:01,040 kiel ni movos pli kaj pli en nia tabelo, ni pli kaj pli proksimajn al nia entjero mi. 658 00:54:01,040 --> 00:54:07,640 Simple tiel okazas ke tabelo [5], kiu estas unu pozicio preter nia tabelo, 659 00:54:07,640 --> 00:54:13,010 Estas ĝuste kie entjero mi pasis al asignotaj. 660 00:54:13,010 --> 00:54:16,920 Do tio estas la punkto kie oni hazarde esti bati la spaco en la stako 661 00:54:16,920 --> 00:54:21,680 kiu estis atribuitaj por entjero mi, kaj ni opcio ke al 0. 662 00:54:21,680 --> 00:54:26,160 >> Tiel estas kiel tiu funkcias. Demandoj? Yeah. 663 00:54:26,160 --> 00:54:30,710 [Studento] Ne gravas. Okay. 664 00:54:30,710 --> 00:54:33,090 [Studento] Kiel vi eviti tiujn speco de eraroj? 665 00:54:33,090 --> 00:54:41,190 Tiuj speco de eraroj? Ne uzu C kiel viaj programlingvo. 666 00:54:41,190 --> 00:54:45,840 Uzi lingvon kiu havas tabelo baroj checking. 667 00:54:45,840 --> 00:54:55,900 Tiel longe kiel vi estas zorga, vi nur bezonas eviti tuj preter la limojn de via tabelo. 668 00:54:55,900 --> 00:54:58,300 [Studento] Do jen kiam ni iris preter la limojn de via tabelo - 669 00:54:58,300 --> 00:55:01,840 [Bowden] Tie estas kie aĵoj komenci tuj malbone. >> [Studento] Ho, bone. 670 00:55:01,840 --> 00:55:05,730 Tiel longe kiel vi restu ene de la memoro destinis por via tabelo, vi estas bela. 671 00:55:05,730 --> 00:55:12,400 Sed C faras neniun eraron kontrolanta. Se mi faras tabelo [1000], ĝin volonte simple modifi ajn okazas - 672 00:55:12,400 --> 00:55:16,500 Ĝi iras al la komenco de la tabelo, tiam ĝi iras 1000 pozicioj post kaj starigos ĝin al 0. 673 00:55:16,500 --> 00:55:20,000 Ĝi ne faras neniun kontrolanta ke ho, tio ne vere havas 1000 aĵoj en ĝi. 674 00:55:20,000 --> 00:55:22,750 1000 estas maniero tie kion mi devus ŝanĝi, 675 00:55:22,750 --> 00:55:26,940 dum Java aŭ io vi ricevos tabelo el baroj indekso 676 00:55:26,940 --> 00:55:29,820 aŭ indico el baroj escepto. 677 00:55:29,820 --> 00:55:33,950 Tial multaj pli alta nivelo lingvoj havas tion 678 00:55:33,950 --> 00:55:37,340 kie se vi iros preter la limojn de la tabelo, vi malsukcesos 679 00:55:37,340 --> 00:55:40,070 por ke vi ne povas ŝanĝi tion for sube vi 680 00:55:40,070 --> 00:55:42,590 kaj tiam aĵoj iras multe pli malbone ol nur nun escepton 681 00:55:42,590 --> 00:55:44,940 dirante, ke vi iris preter la fino de la tabelo. 682 00:55:44,940 --> 00:55:50,970 [Studento] Kaj tiel ni ĵus ŝanĝis la <= al nur > [Bowden] Yeah. 683 00:55:50,970 --> 00:55:54,800 Ĝi devus esti 00:55:59,560 ekde sizeof (tabelo) estas 20, sed ni nur volas 5. >> [Studento] Ĝuste. 685 00:55:59,560 --> 00:56:04,060 Pli demandoj? Okay. 686 00:56:04,060 --> 00:56:07,380 >> [Studento] Mi havas demandon. >> Jes. 687 00:56:07,380 --> 00:56:16,440 [Studento] Kio estas la fakta tabelo variablo? 688 00:56:16,440 --> 00:56:20,000 [Bowden] Kiel kio estas tabelo? 689 00:56:20,000 --> 00:56:24,930 Array mem estas simbolo. 690 00:56:24,930 --> 00:56:31,490 Ĝi estas nur la adreson de la komenco de la 20 bitokoj ke ni referenco. 691 00:56:31,490 --> 00:56:38,070 Vi povas pensi pri tio kiel puntero, sed estas konstanta puntero. 692 00:56:38,070 --> 00:56:44,140 Apenaŭ tion get kompilitaj, la variablo tabelo ne plu ekzistas. 693 00:56:44,140 --> 00:56:48,210 [Studento] Do kiel faras ĝi trovi la grandecon de tabelo? 694 00:56:48,210 --> 00:56:54,130 Grandeco de tabelo rilatas al la grandeco de tiu bloko, ke tiu simbolo referencas al. 695 00:56:54,130 --> 00:57:01,240 Kiam mi faras ion kiel printf ("% p \ n" msgstr); 696 00:57:01,240 --> 00:57:05,140 ni ruli ĝin. 697 00:57:12,960 --> 00:57:15,530 Kion mi simple faras maljustecon? 698 00:57:15,530 --> 00:57:19,220 Array 'tabelo' deklaris tie. 699 00:57:20,820 --> 00:57:23,200 Ho, ĉe tie. 700 00:57:23,200 --> 00:57:31,250 Clang estas inteligenta, kaj okazas rimarki ke mi deklaris la tabelo kiel 5 elementoj 701 00:57:31,250 --> 00:57:34,540 sed mi indeksado en pozicio 1000. 702 00:57:34,540 --> 00:57:38,450 Ĝi povas fari tion ĉar tiuj estas nur konstantoj. 703 00:57:38,450 --> 00:57:43,370 Ĝi povas nur iri ĝis nun en rimarkante, ke mi tuj preter la limojn de la tabelo. 704 00:57:43,370 --> 00:57:46,880 Sed rimarki antaŭe kiam ni havis mi esti malĝusta, 705 00:57:46,880 --> 00:57:51,040 ĝi do ne povas determini kiom da valoroj i povus alpreni, 706 00:57:51,040 --> 00:57:55,540 tial ĝi ne povas determini kiu i tuj preter la fino de la tabelo. 707 00:57:55,540 --> 00:57:59,430 Tio estas nur Clang esti saĝa. 708 00:57:59,430 --> 00:58:03,340 >> Sed nun fari buggy4. Do kio alia mi faras malbone? 709 00:58:03,340 --> 00:58:05,970 Implice deklarante biblioteko funkcion 'printf'. 710 00:58:05,970 --> 00:58:14,960 Mi tuj volas # include . 711 00:58:14,960 --> 00:58:18,710 Okay. Nun kurante buggy4. 712 00:58:18,710 --> 00:58:24,840 Presi la valoro de la tabelo kiel Mi faris ĉi tie, presante ĝin kiel puntero 713 00:58:24,840 --> 00:58:30,060 impresoj iu kiu similas tiun - bfb8805c - kiu estas iu adreso 714 00:58:30,060 --> 00:58:33,450 jen en la stako-ish regiono. 715 00:58:33,450 --> 00:58:41,820 Array mem estas kiel puntero, sed ne estas reala pointer, 716 00:58:41,820 --> 00:58:45,410 ekde regula puntero ni povas ŝanĝi. 717 00:58:45,410 --> 00:58:54,700 Array estas nur iu konstanto. La 20 blokoj de memoro starti je adreso 0xbfb8805c. 718 00:58:54,700 --> 00:59:09,020 Do bfb8805c tra tiu adreso +20--aŭ mi supozas -20 - 719 00:59:09,020 --> 00:59:17,400 estas ĉiuj la memoro destinis por ĉi tabelo. 720 00:59:17,400 --> 00:59:20,350 Tabelo, la variablo mem ne stokas ie ajn. 721 00:59:20,350 --> 00:59:27,660 Kiam vi kompili, la tradukilo - mano ondo ĝin - 722 00:59:27,660 --> 00:59:33,060 sed la tradukilo simple uzi kie konas tabelo esti. 723 00:59:33,060 --> 00:59:36,090 Ĝi scias kie tiu tabelo komencas, 724 00:59:36,090 --> 00:59:40,910 kaj tiel ĝi povas ĉiam nur faru tion en terminoj de ofsetoj de tiu komenco. 725 00:59:40,910 --> 00:59:43,960 Ĝi ne bezonas variablo mem reprezenti tabelo. 726 00:59:43,960 --> 00:59:53,730 Sed kiam mi faras ion kiel int * p = array; nun p estas puntero kiu notas al tiu tabelo, 727 00:59:53,730 --> 00:59:57,830 kaj nun p fakte ne ekzistas sur la stako. 728 00:59:57,830 --> 01:00:01,950 Mi estas libera ŝanĝi p. Mi povas fari p = malloc. 729 01:00:01,950 --> 01:00:06,500 Do origine indikis tabelo; nun notas al iu spaco sur la monteto. 730 01:00:06,500 --> 01:00:09,620 Mi ne povas fari tabelo = malloc. 731 01:00:09,620 --> 01:00:13,710 Se Clang estas ruza, ĝi krias al mi ekde la komenco la batilo. 732 01:00:17,000 --> 01:00:21,430 Vere, mi estas bela certa gcc farus tiun ankaŭ. 733 01:00:21,430 --> 01:00:25,010 Do tabelo tipo 'int [5]' ne asignable. 734 01:00:25,010 --> 01:00:28,040 Vi ne povas atribui ion al tabelo tipo 735 01:00:28,040 --> 01:00:30,500 ĉar tabelo estas nur konstanta. 736 01:00:30,500 --> 01:00:34,760 Ĝi estas simbolo kiu referencoj tiuj 20 bajtoj. Mi ne povas ŝanĝi ĝin. 737 01:00:34,760 --> 01:00:37,690 >> [Studento] Kaj kie estas la grandeco de la tabelo stokita? 738 01:00:37,690 --> 01:00:40,670 [Bowden] Ne estas stokitaj ie ajn. Estas kiam ĝi estos kompili. 739 01:00:40,670 --> 01:00:46,310 Do kie estas la grandeco de tabelo stokita? 740 01:00:46,310 --> 01:00:51,870 Vi povas uzi nur sizeof (areo) ene de la funkcio, ke la tabelo estas deklarita mem. 741 01:00:51,870 --> 01:01:03,150 Do, se mi faras iujn funkcion, foo, kaj mi do (int tabelo []) 742 01:01:03,150 --> 01:01:10,450 printf ("% d \ n", sizeof (tabelo)); 743 01:01:10,450 --> 01:01:21,330 kaj tiam ĉi tie mi vokas foo (areo); 744 01:01:21,330 --> 01:01:24,840 ene de ĉi funkcio - ni ruli ĝin. 745 01:01:34,200 --> 01:01:36,840 Ĉi tiu estas Clang esti ruza denove. 746 01:01:36,840 --> 01:01:43,890 Oni diras al mi ke sizeof sur tabelo funkcio parametro 747 01:01:43,890 --> 01:01:46,690 revenos grandeco de 'int *'. 748 01:01:46,690 --> 01:01:55,150 Tiu estus eraro se ĝi ne estas kion mi volis okazos. 749 01:01:55,150 --> 01:01:58,960 Ni efektive elŝalti Werror. 750 01:02:14,950 --> 01:02:17,590 Averto. Avertoj estas fajna. 751 01:02:17,590 --> 01:02:19,960 Ĝi ankoraŭ kompili tiel longe, kiel ĝi havas averto. 752 01:02:19,960 --> 01:02:22,910 . / A.out tuj presi 4. 753 01:02:22,910 --> 01:02:28,650 La averto kiu generis estas klara indikilo de kio misfunkciis. 754 01:02:28,650 --> 01:02:34,120 Ĉi int tabelo estas ĝuste tuj presi sizeof (int *). 755 01:02:34,120 --> 01:02:39,790 Eĉ se mi metis tabelo [5] en tie, ĝi estas ankoraŭ apenaŭ tuj presi sizeof (int *). 756 01:02:39,790 --> 01:02:47,440 Tuj, kiam vi pasos ĝin en funkcio, la distingo inter tabeloj kaj punteros 757 01:02:47,440 --> 01:02:49,670 estas neekzistanta. 758 01:02:49,670 --> 01:02:52,640 Ĉi tio okazas al esti tabelo kiu deklaris en la pilo, 759 01:02:52,640 --> 01:02:58,300 sed tuj kiam ni pasos tiun valoron, kiun 0xbf bla, bla, bla en cxi tiun funkcion, 760 01:02:58,300 --> 01:03:03,350 tiam ĉi puntero notas al tiu tabelo sur la stako. 761 01:03:03,350 --> 01:03:08,310 Do tio signifas ke sizeof nur validas en la funkcio kiun la tabelo estis deklarita, 762 01:03:08,310 --> 01:03:11,230 kio signifas ke kiam vi kompili tiun funkcion, 763 01:03:11,230 --> 01:03:17,330 kiam Clang iras tra ĉi tiu funkcio, ĝi vidas tabelo estas int tabelo de amplekso 5. 764 01:03:17,330 --> 01:03:20,640 Tial vidu sizeof (areo). Nu, jen 20. 765 01:03:20,640 --> 01:03:26,440 Tio estas vere kiel sizeof esence laboras por preskaŭ ĉiuj kazoj. 766 01:03:26,440 --> 01:03:31,150 Sizeof estas ne funkcio; estas operatoro. 767 01:03:31,150 --> 01:03:33,570 Vi ne nomas la sizeof funkcio. 768 01:03:33,570 --> 01:03:38,280 Sizeof (int), la tradukilo ĝuste traduki ke 4. 769 01:03:41,480 --> 01:03:43,700 Got it? Okay. 770 01:03:43,700 --> 01:03:47,520 >> [Studento] Do kio estas la diferenco inter sizeof (areo) en ĉefaj kaj en foo? 771 01:03:47,520 --> 01:03:52,840 Ĉi tiu estas ĉar ni dirante sizeof (areo), kiu estas de tipo int *, 772 01:03:52,840 --> 01:03:57,120 dum la tabelo cxi tie ne estas de tipo int *, temas pri int tabelo. 773 01:03:57,120 --> 01:04:04,540 >> [Studento] Do, se vi havis la parametro en tabelo [] anstataŭ int * tabelo, 774 01:04:04,540 --> 01:04:09,230 deziras, ke signifas, ke vi ankoraŭ povis ŝanĝi tabelo ĉar nun ĝi estas puntero? 775 01:04:09,230 --> 01:04:14,250 [Bowden] Kiel tio? >> [Studento] Yeah. Ĉu vi povas ŝanĝi tabelo ene de la funkcio estas nun? 776 01:04:14,250 --> 01:04:18,420 [Bowden] Vi povus ŝanĝi tabelo en ambaŭ kazoj. 777 01:04:18,420 --> 01:04:23,130 En ambaŭ kazoj vi estas libera diri tabelo [4] = 0. 778 01:04:23,130 --> 01:04:26,590 [Studento] Sed cxu vi povas fari tabelo punkto al iu alia? 779 01:04:26,590 --> 01:04:30,230 [Bowden] Oh. Yeah. En ĉu kazo - >> [studento] Yeah. 780 01:04:30,230 --> 01:04:38,410 [Bowden] La distingo inter tabelo [] kaj int * tabelo, ekzistas neniu. 781 01:04:38,410 --> 01:04:42,570 Vi ankaŭ povas ricevi iun multdimensia tabelo ĉi tien 782 01:04:42,570 --> 01:04:47,050 por iu konvena sintakso, sed estas ankoraŭ nur puntero. 783 01:04:47,050 --> 01:04:56,400 Tio signifas ke mi estas libera fari tabelo = malloc (sizeof (int)), kaj nun notas aliloke. 784 01:04:56,400 --> 01:04:59,610 Sed gxuste kiel ke tiu funkcias por eterne kaj ĉiam, 785 01:04:59,610 --> 01:05:03,210 ŝanĝi ĉi tabelo farante ĝin indikas ion alian 786 01:05:03,210 --> 01:05:07,570 ne ŝanĝas tiun tabelo cxi tie ĉar ĝi estas kopio de la argumento, 787 01:05:07,570 --> 01:05:10,780 ĝi ne estas puntero al tiu argumento. 788 01:05:10,780 --> 01:05:16,070 Kaj efektive, same kiel pli indiko ke ĝi estas precize la sama - 789 01:05:16,070 --> 01:05:21,100 ni jam vidis kio impreso tabelo impresoj - 790 01:05:21,100 --> 01:05:31,410 kio se ni presi la adreson de la tabelo aŭ la adreson de la adreson de la tabelo 791 01:05:31,410 --> 01:05:36,290 al ĉu de tiuj? 792 01:05:41,770 --> 01:05:45,220 Ni ignoru ĉi tiun. 793 01:05:48,140 --> 01:05:51,660 Okay. Ĉi tio estas tre bone. Ĝi estas nun kuras. / A.out. 794 01:05:51,660 --> 01:06:00,220 Impreso tabelo, do presante la adreson de la tabelo, estas la sama afero. 795 01:06:00,220 --> 01:06:02,870 Array simple ne ekzistas. 796 01:06:02,870 --> 01:06:08,190 Ĝi scias, kiam vi presi tabelo, vi videbligi la simbolo kiu signifas tiuj 20 bajtoj. 797 01:06:08,190 --> 01:06:11,940 Presi la adreson de la tabelo, nu, tabelo ne ekzistas. 798 01:06:11,940 --> 01:06:17,200 Ĝi ne havas adreson, do nur presas la adreson de tiuj 20 bajtoj. 799 01:06:20,820 --> 01:06:28,150 Tuj kiam vi kompili malsupren, kiel en via kompilita buggy4. / A.out, 800 01:06:28,150 --> 01:06:30,340 tabelo estas neekzistanta. 801 01:06:30,340 --> 01:06:33,640 Punteros ekzisti. Arrays ne. 802 01:06:34,300 --> 01:06:38,060 La blokoj de memoro reprezentantaj la tabelo ankoraŭ ekzistas, 803 01:06:38,060 --> 01:06:43,270 sed la variablo tabelo kaj variabloj de tiu tipo ne ekzistas. 804 01:06:46,260 --> 01:06:50,270 Tiuj estas kiel la ĉefaj diferencoj inter tabeloj kaj punteros 805 01:06:50,270 --> 01:06:55,590 estas tiel frue kiel vi faras funkcio alvokoj, ne estas diferenco. 806 01:06:55,590 --> 01:07:00,460 Sed ene de la funkcio, ke la tabelo mem deklaris, sizeof funkcias malsame 807 01:07:00,460 --> 01:07:05,190 ekde vi videbligi la grandecon de la blokoj anstataŭ la grandeco de la tipo, 808 01:07:05,190 --> 01:07:08,950 kaj vi ne povas ŝanĝi ĝin ĉar ĝi estas simbolo. 809 01:07:08,950 --> 01:07:14,370 Presi la aferon kaj la adreso de la aĵo presas la saman aferon. 810 01:07:14,370 --> 01:07:18,480 Kaj tio estas preskaux ĝin. 811 01:07:18,480 --> 01:07:20,820 [Studento] Ĉu vi povas diri ke unu pli da tempo? 812 01:07:21,170 --> 01:07:24,170 Mi ne maltrafis ion. 813 01:07:24,170 --> 01:07:29,260 Impreso tabelo kaj adreso de tabelo presas la saman aferon, 814 01:07:29,260 --> 01:07:33,180 dum se vi presi puntero kontre la adreson de la puntero, 815 01:07:33,180 --> 01:07:36,010 la sola afero presas la adreso de kion vi indikante, 816 01:07:36,010 --> 01:07:40,360 la aliaj presas la adreso de la puntero de la pilo. 817 01:07:40,360 --> 01:07:47,040 Vi povas ŝanĝi puntero; vi ne povas ŝanĝi tabelo simbolo. 818 01:07:47,740 --> 01:07:53,270 Kaj sizeof puntero tuj presi la grandeco de tiu puntero tipo. 819 01:07:53,270 --> 01:07:57,470 Do int * p sizeof (p) tuj presi 4, 820 01:07:57,470 --> 01:08:04,110 sed int tabelo [5] print sizeof (areo) tuj presi 20. 821 01:08:04,110 --> 01:08:07,480 [Studento] Do int tabelo [5] presos 20? >> Jes. 822 01:08:07,480 --> 01:08:13,300 Tial ene de buggy4 kiam kutimis esti sizeof (areo) 823 01:08:13,300 --> 01:08:16,660 ĉi faris i <20, kio ne estas, kion ni deziris. 824 01:08:16,660 --> 01:08:20,880 Ni volas i <5. >> [Studento] Okay. 825 01:08:20,880 --> 01:08:25,569 [Bowden] Kaj poste kiam vi komencos pasante en la funkcioj, 826 01:08:25,569 --> 01:08:34,340 se ni faris int * p = array; 827 01:08:34,340 --> 01:08:39,779 ene de ĉi tiu funkcio, ni povas esence uzas p kaj batalarangxis en ĝuste la sama vojoj, 828 01:08:39,779 --> 01:08:43,710 krom la sizeof problemo kaj la ŝanĝiĝantaj problemo. 829 01:08:43,710 --> 01:08:49,810 Sed p [0] = 1; estas la sama kiel diri tabelo [0] = 1; 830 01:08:49,810 --> 01:08:55,600 Kaj tuj kiam ni diras foo (tabelo), aux foo (p); 831 01:08:55,600 --> 01:08:59,760 ene de la foo funkcio, ĉi tiu estas la sama nomita dufoje. 832 01:08:59,760 --> 01:09:03,350 Ne estas diferenco inter tiuj du alvokoj. 833 01:09:07,029 --> 01:09:11,080 >> Cxiu bona en tiu? Okay. 834 01:09:14,620 --> 01:09:17,950 Ni havas 10 minutojn. 835 01:09:17,950 --> 01:09:28,319 >> Ni provos atingi tra ĉi Hacker Typer programo, 836 01:09:28,319 --> 01:09:32,350 tiu retejo, kiu eliris lasta jaro aŭ io. 837 01:09:34,149 --> 01:09:41,100 Oni simple supozas ke kiel vi tajpas hazarde kaj presas el - 838 01:09:41,100 --> 01:09:46,729 Kion ajn dosiero okazas esti ŝarĝitaj estas kia gxi aspektas vi tajpas. 839 01:09:46,729 --> 01:09:52,069 Ĝi aspektas kiel ia mastruma sistemo kodo. 840 01:09:53,760 --> 01:09:56,890 Tion ni volas apliki. 841 01:10:08,560 --> 01:10:11,690 Vi devus havi duuma ruleblan nomata hacker_typer 842 01:10:11,690 --> 01:10:14,350 kiu prenas en sola argumento, la dosiero al "hacker tipo." 843 01:10:14,350 --> 01:10:16,480 Kurante la ruleblan devus liberigi la ekrano 844 01:10:16,480 --> 01:10:20,850 kaj poste presi unu signo de la pasinta-en dosiero ĉiufoje la uzanto premas klavon. 845 01:10:20,850 --> 01:10:24,990 Do kion ajn ŝlosila vi premas, ĝi devus forĵeti kaj anstataŭ presi karaktero de la dosiero 846 01:10:24,990 --> 01:10:27,810 tio estas la argumento. 847 01:10:29,880 --> 01:10:34,350 Mi preskaux diras al vi, kion la aĵoj kiujn ni tuj bezonas scii estas. 848 01:10:34,350 --> 01:10:36,440 Sed ni volas kontroli la termios biblioteko. 849 01:10:36,440 --> 01:10:44,840 Mi neniam uzis tiun bibliotekon en mia tuta vivo, do ĝi havas tre minimuma celoj. 850 01:10:44,840 --> 01:10:48,610 Sed ĉi tiu tuj estos la biblioteko povas uzi por forĵeti la karakteron vi batis 851 01:10:48,610 --> 01:10:52,390 kiam vi tajpas en normo in 852 01:10:56,970 --> 01:11:05,840 Do hacker_typer.c, kaj ni tuj volas # include . 853 01:11:05,840 --> 01:11:12,870 Rigardante la viron paĝo termios - I'm guessing ĝia fina VIN aŭ iu - 854 01:11:12,870 --> 01:11:16,240 Mi ne scias kiel legi ĝin. 855 01:11:16,240 --> 01:11:21,040 Rigardante tion, ĝi diras inkluzivi tiuj 2 dosierojn, do ni devos fari tion. 856 01:11:37,620 --> 01:11:46,820 >> Unua afero unue, ni volis preni en sola argumento, kiu estas la dosiero ni malfermos. 857 01:11:46,820 --> 01:11:52,420 Do kion mi volas fari? Kiel mi kontrolu vidi Mi havas sola argumento? 858 01:11:52,420 --> 01:11:56,480 [Studento] Se argc egalas ĝin. >> [Bowden] Yeah. 859 01:11:56,480 --> 01:12:21,250 Do, se (argc! = 2) printf ("uzado:% s [dosiero por malfermi]"). 860 01:12:21,250 --> 01:12:32,750 Do nun, se mi kuros ĉi sen havigi dua argumento - ho, mi bezonas la nova linio - 861 01:12:32,750 --> 01:12:36,240 vi vidos diras uzado:. / hacker_typer, 862 01:12:36,240 --> 01:12:39,770 kaj tiam la dua argumento devus esti la dosiero mi volas malfermi. 863 01:12:58,430 --> 01:13:01,260 Nun kion mi faru? 864 01:13:01,260 --> 01:13:08,490 Mi volas legi de ĉi tiu dosiero. Kiel mi legis de dosiero? 865 01:13:08,490 --> 01:13:11,920 [Studento] Vi malfermu ĝin unue. >> Jes. 866 01:13:11,920 --> 01:13:15,010 Do fopen. Kion fopen aspektas? 867 01:13:15,010 --> 01:13:22,980 [Studento] Dosiernomo. >> [Bowden] Dosiernomo tuj estos argv [1]. 868 01:13:22,980 --> 01:13:26,110 [Studento] Kaj poste kion vi volas fari kun ĝi, do la - >> [Bowden] Yeah. 869 01:13:26,110 --> 01:13:28,740 Do se vi ne memoras, vi povus simple fari viro fopen, 870 01:13:28,740 --> 01:13:32,960 kie okazas esti const char * vojon kie vojo estas dosiernomo, 871 01:13:32,960 --> 01:13:34,970 const char * modo. 872 01:13:34,970 --> 01:13:38,660 Se vi hazarde ne memoras kio modo estas, tiam vi povas serĉi modo. 873 01:13:38,660 --> 01:13:44,660 Ene de homo paĝoj, la oblikvo karaktero estas kion vi povas sercxi por aĵoj. 874 01:13:44,660 --> 01:13:49,790 Do mi tajpi / regimon serĉi modo. 875 01:13:49,790 --> 01:13:57,130 n kaj N estas kion vi povas uzi por ciklo tra la serĉo alumetoj. 876 01:13:57,130 --> 01:13:59,800 Jen ĝi diras la argumento mode punktoj al ĉeno 877 01:13:59,800 --> 01:14:01,930 komencante kun unu el la sekvaj vicoj. 878 01:14:01,930 --> 01:14:06,480 Do r, Malferma teksta dosiero por legado. Tio estas kion ni volas fari. 879 01:14:08,930 --> 01:14:13,210 Por legi, kaj mi volas konservi tion. 880 01:14:13,210 --> 01:14:18,720 La afero estas tuj estos DOSIERO *. Nun kion mi volas fari? 881 01:14:18,720 --> 01:14:21,200 Donu al mi dua. 882 01:14:28,140 --> 01:14:30,430 Okay. Nun kion mi volas fari? 883 01:14:30,430 --> 01:14:32,940 [Studento] Kontrolu se estas NULL. >> [Bowden] Yeah. 884 01:14:32,940 --> 01:14:38,690 Ajn vi malfermas dosieron, certigu ke vi sukcese povis malfermi. 885 01:14:58,930 --> 01:15:10,460 >> Nun mi volas fari tion termios stuff kie mi volas unue legis mian aktualan agordon 886 01:15:10,460 --> 01:15:14,050 kaj krom tiuj en ion, mi volas ŝanĝi mian agordojn 887 01:15:14,050 --> 01:15:19,420 ĵeti for ajna karaktero, ke mi tajpas, 888 01:15:19,420 --> 01:15:22,520 kaj tiam mi volas ĝisdatigi tiujn agordojn. 889 01:15:22,520 --> 01:15:27,250 Kaj poste en la fino de la programo, mi volas ŝanĝi al mia originala agordojn. 890 01:15:27,250 --> 01:15:32,080 Do la struct tuj estos de tipo termios, kaj mi tuj volas du el tiuj. 891 01:15:32,080 --> 01:15:35,600 La unua estas tuj estos mia current_settings, 892 01:15:35,600 --> 01:15:42,010 kaj tiam ili tuj estos mia hacker_settings. 893 01:15:42,010 --> 01:15:48,070 Unue, mi tuj volas savi mian aktualan agordon, 894 01:15:48,070 --> 01:15:53,790 tiam mi tuj volas ĝisdatigi hacker_settings, 895 01:15:53,790 --> 01:16:01,570 kaj tiam vojon al la fino de mia programo, mi volas restarigu nuna agordo. 896 01:16:01,570 --> 01:16:08,660 Do ŝparante nuna agordo, la maniero kiu funkcias, ni viro termios. 897 01:16:08,660 --> 01:16:15,810 Ni vidas, ke ni havas ĉi int tcsetattr, int tcgetattr. 898 01:16:15,810 --> 01:16:22,960 Mi pasas en termios struct por lia puntero. 899 01:16:22,960 --> 01:16:30,640 La vojo ĉi aspektos estas - I've jam forgesis kion la funkcio vokita. 900 01:16:30,640 --> 01:16:34,930 Kopiu kaj algluu ĝin. 901 01:16:39,150 --> 01:16:45,500 Do tcgetattr, tiam mi volas pasi en la struct ke mi savi la informon en, 902 01:16:45,500 --> 01:16:49,650 kiu tuj estos current_settings, 903 01:16:49,650 --> 01:16:59,120 kaj la unua argumento estas la dosiero descriptor cxar la afero mi volas savi la atributoj de. 904 01:16:59,120 --> 01:17:04,360 Kion la dosiero descriptor estas estas kiel ajn vi malfermas dosieron, ĝi ricevas dosieron descriptor. 905 01:17:04,360 --> 01:17:14,560 Kiam mi fopen argv [1], ĝi ricevas dosieron descriptor kiu vi referenco 906 01:17:14,560 --> 01:17:16,730 kiam ajn vi volas legi aŭ skribi al ĝi. 907 01:17:16,730 --> 01:17:19,220 Tio ne estas la dosiero descriptor Mi volas uzi ĉi tie. 908 01:17:19,220 --> 01:17:21,940 Estas tri dosieron descriptores vi havas implicite, 909 01:17:21,940 --> 01:17:24,310 kiu estas normo en, normo elirinte, norma eraro. 910 01:17:24,310 --> 01:17:29,960 Implicite, mi kredas ke estas normo en estas 0, normo ekster estas 1, kaj la norma eraro estas 2. 911 01:17:29,960 --> 01:17:33,980 Do kion mi volas ŝanĝi la agordojn de? 912 01:17:33,980 --> 01:17:37,370 Mi volas ŝanĝi la agordojn de kiam mi batis al gravulo, 913 01:17:37,370 --> 01:17:41,590 Mi volas ĵeti tiun karakteron for anstataŭ presi ĝin al la ekrano. 914 01:17:41,590 --> 01:17:45,960 Kio rivereto - normo en, normo ekster, aŭ norma eraro - 915 01:17:45,960 --> 01:17:52,050 respondas al aĵoj kiam mi tajpas en la klavaro? >> [Studento] Norma in >> Jes. 916 01:17:52,050 --> 01:17:56,450 Do mi povas aŭ fari 0 aŭ mi povas fari stdin. 917 01:17:56,450 --> 01:17:59,380 Mi ricevas la current_settings de normo in 918 01:17:59,380 --> 01:18:01,720 >> Nun mi volas ĝisdatigi tiuj agordoj, 919 01:18:01,720 --> 01:18:07,200 do unue mi kopii en hacker_settings kion mia current_settings estas. 920 01:18:07,200 --> 01:18:10,430 Kaj kiel structs laboro estas ĝi nur kopii. 921 01:18:10,430 --> 01:18:14,510 Ĉi kopias ĉiuj kampoj, kiel vi devus atendi. 922 01:18:14,510 --> 01:18:17,410 >> Nun mi volas ĝisdatigi kelkaj el la kampoj. 923 01:18:17,410 --> 01:18:21,670 Rigardante termios, vi devus legi tra multaj ĉi 924 01:18:21,670 --> 01:18:24,110 nur por vidi kion vi volus serĉi, 925 01:18:24,110 --> 01:18:28,210 sed la flagoj vi tuj volas serĉi estas eĥo, 926 01:18:28,210 --> 01:18:33,110 tiel eĥo Ĵetas enigo gravuloj. 927 01:18:33,110 --> 01:18:37,710 Unue mi volas establi - I've jam forgesis kion la kampoj estas. 928 01:18:45,040 --> 01:18:47,900 Ĉi tio estas kion la struct aspektas. 929 01:18:47,900 --> 01:18:51,060 Do enigo modoj mi kredas ke ni volas ŝanĝi. 930 01:18:51,060 --> 01:18:54,210 Ni rigardu la solvo por certigi tion ni volas ŝanĝi. 931 01:19:04,060 --> 01:19:12,610 Ni volas ŝanĝi lflag por malhelpi bezoni trarigardi cxiujn tiujn. 932 01:19:12,610 --> 01:19:14,670 Ni volas ŝanĝi loka modoj. 933 01:19:14,670 --> 01:19:17,710 Vi devus legi tra ĉi tiu tuta afero por kompreni kie ĉiu apartenas 934 01:19:17,710 --> 01:19:19,320 ke ni volas ŝanĝi. 935 01:19:19,320 --> 01:19:24,120 Sed estas ene de lokaj modoj, kie ni tuj volas ŝanĝi tion. 936 01:19:27,080 --> 01:19:33,110 Do hacker_settings.cc_lmode estas kio ĝi estas nomata. 937 01:19:39,630 --> 01:19:43,020 c_lflag. 938 01:19:49,060 --> 01:19:52,280 Tie estas kie ni enir bitlarĝa operatoroj. 939 01:19:52,280 --> 01:19:54,860 Ni estas speco de ekstere de tempo, sed ni iros tra ĝi realan rapida. 940 01:19:54,860 --> 01:19:56,600 Tie estas kie ni enir bitlarĝa operatoroj, 941 01:19:56,600 --> 01:19:59,950 kie mi kredas ke mi diris iam antaŭ longe ke kiam ajn oni komencas trakti kun flagoj, 942 01:19:59,950 --> 01:20:03,370 vi tuj estos uzante bitlarĝa operatoro tre. 943 01:20:03,370 --> 01:20:08,240 Ĉiu bito en la flago respondas al ia konduto. 944 01:20:08,240 --> 01:20:14,090 Do jen, ĉi flago havas aron da malsamaj aĵoj, kie ĉiuj ili signifas ion malsaman. 945 01:20:14,090 --> 01:20:18,690 Sed kion mi volas fari estas simple elŝalti la bito kiu korespondas al eĥo. 946 01:20:18,690 --> 01:20:25,440 Do por igi tiun ekstere mi faras & = ¬ EĤO. 947 01:20:25,440 --> 01:20:30,110 Fakte, mi kredas ke estas kiel tECHO aŭ iu. Mi nur tuj kontroli denove. 948 01:20:30,110 --> 01:20:34,050 Mi povas termios ĝin. Ĝi estas nur eĥo. 949 01:20:34,050 --> 01:20:38,440 ĴETAS tuj estos sola iom. 950 01:20:38,440 --> 01:20:44,230 ¬ ĴETAS tuj signifas ĉiuj bitoj estas aro al 1, kiu signifas ĉiuj flagoj estas aro al vera 951 01:20:44,230 --> 01:20:47,140 krom la ĴETAS iom. 952 01:20:47,140 --> 01:20:53,830 Por fini mian lokan flagoj kun ĉi tio, ĝi signifas ĉiuj flagoj kiuj aktuale difinitaj al vera 953 01:20:53,830 --> 01:20:56,520 ankoraŭ enkadrigeblajn por vera. 954 01:20:56,520 --> 01:21:03,240 Se mia ĴETAS flago estas metita al vera, tiam ĉi tiu estas bezone starigis al falsa la ĴETAS flago. 955 01:21:03,240 --> 01:21:07,170 Do ĉi tiu linio de kodo nur malŝaltas la ĴETAS flago. 956 01:21:07,170 --> 01:21:16,270 La aliaj linioj de kodo, mi nur kopii ilin en la intereso de tempo kaj tiam ekspliki ilin. 957 01:21:27,810 --> 01:21:30,180 En la solvo, li diris 0. 958 01:21:30,180 --> 01:21:33,880 Estas probable pli bone eksplicite diras stdin. 959 01:21:33,880 --> 01:21:42,100 >> Rimarku, ke mi ankaŭ faras ĴETAS | ICANON tie. 960 01:21:42,100 --> 01:21:46,650 ICANON referencas al iu aparta, kiu signifas kanona modo. 961 01:21:46,650 --> 01:21:50,280 Kio kanona mode rimedoj estas kutime kiam vi tajpas el la komandlinio, 962 01:21:50,280 --> 01:21:54,670 normo en ne procesi ion ĝis vi batis lino. 963 01:21:54,670 --> 01:21:58,230 Do kiam vi GetString, vi tajpi faskon da aĵoj, tiam vi batis lino. 964 01:21:58,230 --> 01:22:00,590 Tio estas, kiam ĝi estos sendita al la normo in 965 01:22:00,590 --> 01:22:02,680 Tio estas la defaŭlta. 966 01:22:02,680 --> 01:22:05,830 Kiam mi elŝalti kanona modo, nun ĉiu unuopa signo vi premas 967 01:22:05,830 --> 01:22:10,910 Estas kio gets procesis, kiu estas kutime ia malbona ĉar ĝi estas malrapida procesi tion, 968 01:22:10,910 --> 01:22:14,330 tial ĝi estas bona por buffer gxin en tuta linioj. 969 01:22:14,330 --> 01:22:16,810 Sed mi volas ĉiu karaktero esti procesita 970 01:22:16,810 --> 01:22:18,810 ĉar mi ne volas ĝin por atendi min bati linion 971 01:22:18,810 --> 01:22:21,280 antaŭ ol ĝi procesas ĉiuj karakteroj Mi estis tajpado. 972 01:22:21,280 --> 01:22:24,760 Ĉi malŝaltas kanona modo. 973 01:22:24,760 --> 01:22:31,320 Ĉi stuff simple signifas kiam fakte procesas gravuloj. 974 01:22:31,320 --> 01:22:35,830 Tio signifas procesi ilin tuj; tuj kiam mi tajpas ilin, procesi ilin. 975 01:22:35,830 --> 01:22:42,510 Kaj jen estas la funkcio kiu estas ĝisdatigi mian agordojn por normo en, 976 01:22:42,510 --> 01:22:45,480 kaj TCSA rimedoj faru ĝin nun. 977 01:22:45,480 --> 01:22:50,310 La aliaj ebloj estas atendi ĝis ĉiu kiu estas nuntempe en la rojon procesis. 978 01:22:50,310 --> 01:22:52,030 Tio ne vere gravas. 979 01:22:52,030 --> 01:22:56,920 Ĝuste nun ŝanĝos mian agordojn por esti kio ajn nuntempe en hacker_typer_settings. 980 01:22:56,920 --> 01:23:02,210 Mi supozas mi nomis ĝin hacker_settings, do ni ŝanĝas tion. 981 01:23:09,610 --> 01:23:13,500 Ŝanĝi ĉiu hacker_settings. 982 01:23:13,500 --> 01:23:16,870 >> Nun je la fino de nia programo ni tuj volas restarigu 983 01:23:16,870 --> 01:23:20,210 kio estas nuntempe ene de normal_settings, 984 01:23:20,210 --> 01:23:26,560 kiu iras al nur aspektas kiel & normal_settings. 985 01:23:26,560 --> 01:23:30,650 Rimarku Mi ne ŝanĝis iun el miaj normal_settings ekde origine atingi ĝin. 986 01:23:30,650 --> 01:23:34,520 Tiam al nur ŝanĝi ilin, mi pasas ilin je la fino. 987 01:23:34,520 --> 01:23:38,390 Ĉi tiu estis la ĝisdatigon. Okay. 988 01:23:38,390 --> 01:23:43,900 >> Nun interne de tie mi nur klarigas la kodon en la intereso de la tempo. 989 01:23:43,900 --> 01:23:46,350 Ne tiom da kodo. 990 01:23:50,770 --> 01:24:03,750 Ni vidas ni legas karakteron de la dosiero. Ni nomis ĝin f. 991 01:24:03,750 --> 01:24:07,850 Nun vi povas homo fgetc, sed kiel fgetc tuj labori 992 01:24:07,850 --> 01:24:11,910 Estas ĝuste tio okazas reveni la karaktero kiu vi ĵus legis aŭ EOF, 993 01:24:11,910 --> 01:24:15,680 kiu korespondas al la fino de la dosiero aŭ iu eraro okazas. 994 01:24:15,680 --> 01:24:19,900 Ni looping, daŭrigante legi sola karaktero de la dosiero, 995 01:24:19,900 --> 01:24:22,420 gxis ni ne plu havas signojn por legi. 996 01:24:22,420 --> 01:24:26,650 Kaj dum ni faras tion, ni atendas sur sola karaktero de normo in 997 01:24:26,650 --> 01:24:29,090 Ĉiu unuopa kiam vi tajpas ion en la komandlinio, 998 01:24:29,090 --> 01:24:32,820 ke tio legi en karaktero de normo in 999 01:24:32,820 --> 01:24:38,330 Tiam putchar estas ĝuste tuj metis la char ni legas ĉi tien el la dosieron al la normo eksteren. 1000 01:24:38,330 --> 01:24:42,890 Vi povas homo putchar, sed ĝi estas nur metante al normo eksteren, ĝi estas videbligi tiun karakteron. 1001 01:24:42,890 --> 01:24:51,600 Vi povus ankaŭ nur faru printf ("% c", c); Sama ideo. 1002 01:24:53,330 --> 01:24:56,670 Tio faros la ŝvelaĵo de nia laboro. 1003 01:24:56,670 --> 01:25:00,300 >> La lasta afero ni tuj volas fari estas simple fclose nia dosiero. 1004 01:25:00,300 --> 01:25:03,310 Se vi ne fclose, tio estas memoro fugo. 1005 01:25:03,310 --> 01:25:06,680 Ni volas fclose la dosiero ni origine malfermigxis, kaj mi pensas ke estas tio. 1006 01:25:06,680 --> 01:25:13,810 Se ni faras tion, mi jam ricevis problemojn. 1007 01:25:13,810 --> 01:25:17,260 Ni vidu. 1008 01:25:17,260 --> 01:25:19,960 Kion ĝi plendas pri? 1009 01:25:19,960 --> 01:25:30,220 Atendis 'int' sed argumento estas de tipo 'struct _IO_FILE *'. 1010 01:25:36,850 --> 01:25:39,370 Ni vidos se tiu funkcias. 1011 01:25:45,210 --> 01:25:53,540 Nur permesis en C99. Augh. Konsentite, fari hacker_typer. 1012 01:25:53,540 --> 01:25:57,760 Nun ni preni pli utilajn priskribojn. 1013 01:25:57,760 --> 01:25:59,900 Do la uzo de nedeklarita ensalutilo 'normal_settings'. 1014 01:25:59,900 --> 01:26:04,170 Mi ne nomis ĝin normal_settings. Mi vokis ĝin current_settings. 1015 01:26:04,170 --> 01:26:12,090 Do ni ŝanĝas ĉiuj tion. 1016 01:26:17,920 --> 01:26:21,710 Nun pasi argumento. 1017 01:26:26,290 --> 01:26:29,500 Mi faros ĉi 0 por nun. 1018 01:26:29,500 --> 01:26:36,720 Okay. . / Hacker_typer cp.c. 1019 01:26:36,720 --> 01:26:39,590 Mi ankaŭ ne klara la ekrano en la komenco. 1020 01:26:39,590 --> 01:26:42,960 Sed vi retrorigardas al la lasta problemo aro por vidi kiel vi certe la ekrano. 1021 01:26:42,960 --> 01:26:45,160 Ĝi simple presi iujn signojn 1022 01:26:45,160 --> 01:26:47,210 dum ĉi faras kion mi volas fari. 1023 01:26:47,210 --> 01:26:48,900 Okay. 1024 01:26:48,900 --> 01:26:55,280 Kaj pensante pri kial ĉi bezonis esti 0 anstataŭ stdin, 1025 01:26:55,280 --> 01:27:00,560 kiuj devus esti # difini 0, 1026 01:27:00,560 --> 01:27:03,890 ĉi tio plendis, ke - 1027 01:27:13,150 --> 01:27:19,360 Antaŭ kiam mi diras ke ekzistas dosiero descriptores sed tiam vi ankaŭ havas vian DOSIERO *, 1028 01:27:19,360 --> 01:27:23,210 dosiero descriptor estas nur simpla entjero, 1029 01:27:23,210 --> 01:27:26,970 dum kiu DOSIERO * havas tuta amaso da taskoj asociita kun ĝi. 1030 01:27:26,970 --> 01:27:30,380 La kialo necesas diri 0 anstataŭ stdin 1031 01:27:30,380 --> 01:27:37,480 estas ke stdin estas DOSIERO * kiu notas al tio, kiu estas referenco dosieron descriptor 0. 1032 01:27:37,480 --> 01:27:45,070 Do eĉ ĝis ĉi tie kiam mi faros fopen (argv [1], mi getting a DOSIERO * dorso. 1033 01:27:45,070 --> 01:27:51,180 Sed ie en tiu DOSIERO * estas io responda al la dosiero descriptor por tiu dosiero. 1034 01:27:51,180 --> 01:27:57,430 Se vi rigardas la viro paĝon por malferma, do mi kredas ke vi devos fari viron 3 malfermita - nope - 1035 01:27:57,430 --> 01:27:59,380 viro 2 malfermita - yeah. 1036 01:27:59,380 --> 01:28:06,250 Se vi rigardas la paĝon por malferma, malfermita estas kiel suba-nivelo fopen, 1037 01:28:06,250 --> 01:28:09,350 kaj ĝin redoni la reala dosiero descriptor. 1038 01:28:09,350 --> 01:28:12,050 fopen faras aron da aĵoj sur malferma, 1039 01:28:12,050 --> 01:28:17,640 kiuj anstataŭ reveni nur tiu dosiero descriptor revenas tuta DOSIERO * puntero 1040 01:28:17,640 --> 01:28:20,590 ene de kiuj estas niaj infanoj dosieron descriptor. 1041 01:28:20,590 --> 01:28:25,020 Do normo en raportas al la DOSIERO * aferon, 1042 01:28:25,020 --> 01:28:29,120 dum 0 raportas al nur la dosieron descriptor normo en si mem. 1043 01:28:29,120 --> 01:28:32,160 >> Demandoj? 1044 01:28:32,160 --> 01:28:35,930 [Ridas] Blew tra tiu. 1045 01:28:35,930 --> 01:28:39,140 Bone. Ni faris. [Ridas] 1046 01:28:39,140 --> 01:28:42,000 >> [CS50.TV]