1 00:00:00,000 --> 00:00:00,309 2 00:00:00,309 --> 00:00:02,350 [? DAN ARMADARAS:?] Saluton, Mi estas [? Dan Armadaras?]. 3 00:00:02,350 --> 00:00:04,410 Hodiaŭ, ni tuj gxemados elpuriganta. 4 00:00:04,410 --> 00:00:06,697 Ne nur estas ni iranta paroli pri iuj teknikoj, 5 00:00:06,697 --> 00:00:09,280 sed ankaŭ ni tuj rigardi iuj de la karakterizaĵoj enhavis 6 00:00:09,280 --> 00:00:14,170 ene de la CS50 IDE kiuj permesas vi facile elpurigi programon. 7 00:00:14,170 --> 00:00:16,272 >> Nur unu ekzemplo de iu kiu povas iri malbone 8 00:00:16,272 --> 00:00:18,730 kaj ĝi estas efektive io ke ni jam vidis antaŭe. 9 00:00:18,730 --> 00:00:23,200 En tiu kazo, ĉi tiu estas C programon kiu akceptas entjero de la uzanto, 10 00:00:23,200 --> 00:00:27,580 dividu ĝin per du, kaj provizas la eligo reen al la uzanto. 11 00:00:27,580 --> 00:00:30,610 Nun de kion ni vidis pli frue en prelegoj, 12 00:00:30,610 --> 00:00:34,370 ni scias ke tio vere kaŭzas specifaj tipoj de problemoj de divido 13 00:00:34,370 --> 00:00:35,860 Kiam ni havas neparaj. 14 00:00:35,860 --> 00:00:40,330 >> Specife, ni simple forĵeti nenion post la dekuma punkto. 15 00:00:40,330 --> 00:00:43,170 Nun, ni scias ke ĉi hazarde estas la kazo. 16 00:00:43,170 --> 00:00:47,430 Kaj se ni kuras ĝi, ni povas konfirmi niaj suspektoj, unue, per kompilado. 17 00:00:47,430 --> 00:00:50,460 Kaj tiam, per kurado kaj enirante nepara nombro. 18 00:00:50,460 --> 00:00:51,720 >> Tio estas nenio nova. 19 00:00:51,720 --> 00:00:54,490 Sed tiu estas fakte ekzemplo de cimo kiu 20 00:00:54,490 --> 00:00:58,810 povas ekzisti ene de pli granda programo ke iĝas pli malfacila spuri. 21 00:00:58,810 --> 00:01:02,640 Eĉ kvankam ni scias kion la demando estas, la vera quid de la afero 22 00:01:02,640 --> 00:01:06,250 povus esti provanta identigi specife kie la eraro, 23 00:01:06,250 --> 00:01:09,750 identiganta kion tiu problemo estas, kaj tiam fiksi ĝin. 24 00:01:09,750 --> 00:01:14,400 Do disponigi tion kiel ekzemplo de kio povus esti io 25 00:01:14,400 --> 00:01:19,030 ke ni jam scias sed povas enterigita ene de aliaj elementoj de la kodo. 26 00:01:19,030 --> 00:01:23,090 >> Do malferminte tiun alian fonton kodo dosieron kiel ekzemplo, 27 00:01:23,090 --> 00:01:27,165 tiu divido problemo estas nun parto de pli granda programo. 28 00:01:27,165 --> 00:01:29,040 Ankoraŭ povus esti iom iom penadis, kaj ni 29 00:01:29,040 --> 00:01:31,076 eble povus facile identigi ĝin, speciale 30 00:01:31,076 --> 00:01:32,450 ekde ni ĵus diskutis tion. 31 00:01:32,450 --> 00:01:38,250 Sed ni povas diveni ke ĉi problemo povas ekzisti sur pli granda skalo. 32 00:01:38,250 --> 00:01:45,450 >> Se mi kompilos tion kaj nun kuri, tajpu neparan numeron, 33 00:01:45,450 --> 00:01:49,816 ni povas vidi ke ni ne ricevas precize la eligo ke ni atendus. 34 00:01:49,816 --> 00:01:51,690 En ĉi tiu aparta kazo, ni povus diri ke ni 35 00:01:51,690 --> 00:01:56,060 volas rakonti ĉiujn la nombroj ekde unu ĝis kelkaj specifaj nombro. 36 00:01:56,060 --> 00:01:58,130 Kaj ni povas vidi ke ni havas varion de temoj 37 00:01:58,130 --> 00:02:03,880 tie se ni elirigi, simple, 0 kaj 1 kiam ni ofertas enigaĵoj de 5. 38 00:02:03,880 --> 00:02:07,380 >> Do ni jam scias ke tie estas problemo tie. 39 00:02:07,380 --> 00:02:11,662 Sed ni ne scias precize kie tiu temo vere ekzistas. 40 00:02:11,662 --> 00:02:13,620 Nun unu el la manieroj kiuj ni povas provi ripari ĉi 41 00:02:13,620 --> 00:02:15,745 Estas iu kiun ni havas jam estis enmetita. 42 00:02:15,745 --> 00:02:18,880 Ni povas nur uzi ĝin sur pli granda skalo. 43 00:02:18,880 --> 00:02:21,680 >> On line 14, ni havas ĉi printf funkcio, 44 00:02:21,680 --> 00:02:25,620 kiu nin permesas presi la stato de diversaj pecoj de informo. 45 00:02:25,620 --> 00:02:28,880 Kaj tiu estas iu kiu vi devus utiligi ene de via programo 46 00:02:28,880 --> 00:02:33,100 provi elkompreni ĝuste kio estas okazanta en diversaj linioj de kodo. 47 00:02:33,100 --> 00:02:36,350 Do eĉ se tio ne estas la elirita fino ke ni efektive 48 00:02:36,350 --> 00:02:39,830 volas produkti el tiu programo, ni ankoraŭ 49 00:02:39,830 --> 00:02:42,300 havu iom debug deklaroj kie ni 50 00:02:42,300 --> 00:02:46,970 povas provi elkompreni ĝuste kio okazas ene de nia kodo. 51 00:02:46,970 --> 00:02:51,210 >> Do en ĉi tiu kazo, mi volas printf kun la debug etikedo. 52 00:02:51,210 --> 00:02:53,540 En tiu kazo, estas nur debug kordo 53 00:02:53,540 --> 00:02:56,840 ke mi estas supren-metante tiel ke ĝi iĝas tre klara en la eligo de mia kodo 54 00:02:56,840 --> 00:02:59,200 kio estas ke mi volas montri. 55 00:02:59,200 --> 00:03:04,410 Kaj eligo tie la nombro ke ni komputita. 56 00:03:04,410 --> 00:03:06,800 >> En tiu kazo, mi povus volas scii precize 57 00:03:06,800 --> 00:03:11,380 kio okazas antaŭ kaj post kelkaj specifaj kalkulado. 58 00:03:11,380 --> 00:03:16,224 Do mi povus uzi printf antaŭ kaj post tiu linio de kodo. 59 00:03:16,224 --> 00:03:18,640 En tiu kazo, mi povus eĉ fari ĝin iomete pli klara 60 00:03:18,640 --> 00:03:21,960 dirante debug antaŭ kaj debug post tiom 61 00:03:21,960 --> 00:03:26,540 ke mi ne konfuzas min kun multoblaj linioj kiuj aspektas identaj. 62 00:03:26,540 --> 00:03:32,290 >> Nun se ni rekompili ĉi kaj kuri , tajpu kelkajn kiel kvin pli, 63 00:03:32,290 --> 00:03:35,090 ni povas vidi ke ni havas nun eligo antaŭ kaj post 64 00:03:35,090 --> 00:03:40,670 kaj trovas ke ni ne faris klaran divido aŭ klara havantaj la nombron 65 00:03:40,670 --> 00:03:43,680 ke ni efektive volas fari. 66 00:03:43,680 --> 00:03:48,660 Nun en ĉi tiu kazo, ĉi tiu estas Ne vere klara eligo. 67 00:03:48,660 --> 00:03:52,440 Ĝi ne estas vere klara rezulto tiu ni volas el ĉi tiu aparta programo. 68 00:03:52,440 --> 00:03:54,427 >> Kaj tiu estas, denove, iomete elpensis. 69 00:03:54,427 --> 00:03:57,510 Sed, eble, unu el la aĵoj kiuj ni povus fari se la especificación diris 70 00:03:57,510 --> 00:04:01,900 ke ni volas dividi tion 2 kaj aldonu 1-- tiel en aliaj vortoj, 71 00:04:01,900 --> 00:04:04,550 ni volas rondigi up-- tiam ni sciu ke ni povis 72 00:04:04,550 --> 00:04:08,060 fari ke aparta afero, en ĉi tiu kazo. 73 00:04:08,060 --> 00:04:14,010 Nun tie ni scias ke ni estos povos aldoni 1 al nia duonigita nombro. 74 00:04:14,010 --> 00:04:16,490 >> Ni rekompili ĉi kaj certigu, ke 75 00:04:16,490 --> 00:04:18,860 kondutas la maniero kiun ni volas. 76 00:04:18,860 --> 00:04:21,980 Ni povas vidi ke nun antaŭ havante, ni havas la nombro 5. 77 00:04:21,980 --> 00:04:26,620 Post havi, ni havas la nombro 3, kiun laŭ nia specifo, 78 00:04:26,620 --> 00:04:29,292 estas kion ni volis fari. 79 00:04:29,292 --> 00:04:31,000 Sed se ni rigardas la eligo tie, ni povas 80 00:04:31,000 --> 00:04:33,760 vidu ke ni havu alian cimo entute, kiuj estas 81 00:04:33,760 --> 00:04:36,940 ke ni komencas nia conteo de 0. 82 00:04:36,940 --> 00:04:39,390 >> Nun ree, ĉi tio estas iu ke ni vidis en la pasinteco 83 00:04:39,390 --> 00:04:42,500 kaj ni povas ripari tute senhezite. 84 00:04:42,500 --> 00:04:44,790 Sed en ĉi tiu kazo, ni ankaŭ havis la profito 85 00:04:44,790 --> 00:04:48,940 uzi la printf deklaro rekte ene de la por buklo 86 00:04:48,940 --> 00:04:52,930 scii precize kie ke eraro estis okazanta. 87 00:04:52,930 --> 00:04:55,150 Do printf deklaroj estas tre utila en helpanta 88 00:04:55,150 --> 00:04:57,940 vi determini kie, ĝuste en via fontkodo, 89 00:04:57,940 --> 00:05:00,620 specifa eraro estas okazanta. 90 00:05:00,620 --> 00:05:03,650 >> Kaj ĝi estas ankaŭ grava al kompreni ke, kiel ni skribas kodo, 91 00:05:03,650 --> 00:05:06,052 ni havu supozoj pri la stato de programo. 92 00:05:06,052 --> 00:05:08,510 Aŭ ni havu supozoj pri kio programero 93 00:05:08,510 --> 00:05:13,020 estas fakte ĝentila aŭ malĝusta kiam poste kiel ni konstruas sur tiu programo 94 00:05:13,020 --> 00:05:15,950 kaj fari parton de kompleksaj kaj grandaj programo 95 00:05:15,950 --> 00:05:19,700 ke ni konscias ke kelkaj aspekto de kiu estas fakte kalesxon. 96 00:05:19,700 --> 00:05:22,680 >> Uzante printf povas vere helpi mallarĝigi malsupren kaj identigi 97 00:05:22,680 --> 00:05:26,430 la regionoj de programo kiu eble ne esti kondutas precize la vojon, kiun ni 98 00:05:26,430 --> 00:05:29,500 atendi, bazita sur nia supozoj. 99 00:05:29,500 --> 00:05:31,460 Sed estas aliaj iloj havebla, tiel, 100 00:05:31,460 --> 00:05:34,860 kiuj nin permesas provi figuro el kie eraro estas okazanta 101 00:05:34,860 --> 00:05:39,930 kaj ankaŭ, specife, kion okazas ene de la programo. 102 00:05:39,930 --> 00:05:41,990 >> Do uzante printf estas tre utila, kiam ni volas 103 00:05:41,990 --> 00:05:45,900 identigi specifajn areojn de programo kiu havas kelkaj cimoj. 104 00:05:45,900 --> 00:05:47,730 Sed ĝi ankaŭ iĝas teda post iom da tempo. 105 00:05:47,730 --> 00:05:50,500 En tiu kazo, ĉi tiu estas relative simpla programo 106 00:05:50,500 --> 00:05:52,750 kun nur unu aŭ du variabloj. 107 00:05:52,750 --> 00:05:57,260 Kaj ĝi iĝas tre facila por ni presi la valoro de tiuj variabloj 108 00:05:57,260 --> 00:05:59,670 en la kunteksto de la pli granda programo. 109 00:05:59,670 --> 00:06:02,670 >> Sed ni havu malsamajn programo kiu havas multajn variablojn. 110 00:06:02,670 --> 00:06:06,530 Kaj eble ne tute tiel facila uzi printf 111 00:06:06,530 --> 00:06:10,120 provi taksi kion estas okazanta al ĉiu el tiuj variabloj 112 00:06:10,120 --> 00:06:13,590 kiel la programo estas ekzekuti. 113 00:06:13,590 --> 00:06:16,960 Tie estas programo kiu ekzistas nomata erarserĉilo programo. 114 00:06:16,960 --> 00:06:20,320 En tiu kazo, kiu ni volas uzo estas la GNU erarserĉilo, aŭ GDB, 115 00:06:20,320 --> 00:06:24,260 kiu permesas nin inspekti la interna funkciadon de programo en multe pli 116 00:06:24,260 --> 00:06:25,700 detala maniero. 117 00:06:25,700 --> 00:06:28,810 >> Ni povas fakte ekzekutas GDB de la komandlinio 118 00:06:28,810 --> 00:06:35,370 tie per simple tajpante GDB kaj la komando kiu ni volas elpurigi. 119 00:06:35,370 --> 00:06:37,550 En tiu kazo, rakonti. 120 00:06:37,550 --> 00:06:41,650 Nun en ĉi tiu kazo, ni povas vidi ke ĝi nin al prompto kiu diras GDB. 121 00:06:41,650 --> 00:06:44,020 Kaj ni povas reale ekzekuti comandos por GDB 122 00:06:44,020 --> 00:06:48,260 por fakte komenci ekzekuton de la programo, halti ĝin ĉe certaj punktoj, 123 00:06:48,260 --> 00:06:51,060 taksi la variablojn kaj inspekti la variablojn kiuj 124 00:06:51,060 --> 00:06:54,152 ekzistas en la programo stato en tiu aparta momento, 125 00:06:54,152 --> 00:06:55,110 kaj tiel plu kaj tiel antaŭen. 126 00:06:55,110 --> 00:06:57,240 Ĝi provizas multan potencon al ni. 127 00:06:57,240 --> 00:06:59,960 >> Sed ĝi nur do okazas ke la CS50 IDE ankaŭ 128 00:06:59,960 --> 00:07:05,870 disponigas GUI aŭ uzanto interfaco por GDB ke 129 00:07:05,870 --> 00:07:11,120 permesas nin fari tion sen bezoni la komandlinio interfaco ajn 130 00:07:11,120 --> 00:07:13,560 aŭ ĉe ĉiuj paraj. 131 00:07:13,560 --> 00:07:16,930 La vojo ke mi povas aliri ke estas uzante la debug butono 132 00:07:16,930 --> 00:07:20,120 ĉe la plejsupro de la CS50 IDE. 133 00:07:20,120 --> 00:07:24,280 Nun en la pasinteco, kion ni havas vidita estas ke ni uzas la komandon 134 00:07:24,280 --> 00:07:27,660 linio kompili kaj poste ekzekuti programon. 135 00:07:27,660 --> 00:07:29,790 >> La debug butono faras ambaŭ de tiuj paŝoj. 136 00:07:29,790 --> 00:07:34,380 Sed ankaŭ Venigu la erarserĉilo langeton ekstremdekstro 137 00:07:34,380 --> 00:07:38,280 kiu permesas nin inspekti vario de propraĵoj de la programo 138 00:07:38,280 --> 00:07:40,500 kiel estas efektiviganta. 139 00:07:40,500 --> 00:07:44,280 Se mi klakas debug, en ĉi kazo, ĝi Venigu 140 00:07:44,280 --> 00:07:48,230 nova langeto en la konzolo fenestro ĉe la malsupro. 141 00:07:48,230 --> 00:07:51,160 >> Kaj vi povas vidi ke ĉi langeto havas iuj informoj ĉe la plejsupro. 142 00:07:51,160 --> 00:07:52,670 Kaj ni povas grandparte ignoras tion. 143 00:07:52,670 --> 00:07:54,800 Sed unu el la aĵoj ke ni volas rimarki 144 00:07:54,800 --> 00:07:57,170 estas ke ĝi eligas la sama afero ke ni 145 00:07:57,170 --> 00:08:03,000 akirus se ni provis kuri fari sur la C programon en la fina fenestro. 146 00:08:03,000 --> 00:08:06,230 >> Tie, ni povas vidi ĝi estas kurante Clang, kaj ĝi havas varion de flagoj, 147 00:08:06,230 --> 00:08:12,660 kaj ĝi kompili nia count.c dosiero, kiu estis la elektita langeto tiutempe 148 00:08:12,660 --> 00:08:15,100 ke mi batis debug. 149 00:08:15,100 --> 00:08:18,010 Do tiu estas tre utila ĉar nun uzante ĉi debug butonon, 150 00:08:18,010 --> 00:08:23,280 ni povas samtempe kompili kaj tiam ekzekuti la programon kiu ni efektive 151 00:08:23,280 --> 00:08:24,460 volas kuri. 152 00:08:24,460 --> 00:08:27,880 >> Unu el la flagoj kiuj estas grava, en tiu kazo, 153 00:08:27,880 --> 00:08:30,190 ni reale estis uzanta por la plej longa tempo 154 00:08:30,190 --> 00:08:32,450 sed ankaŭ ĵus faris kelkajn mano svingante [inaudible], kiu 155 00:08:32,450 --> 00:08:33,820 Estas ĉi tie. 156 00:08:33,820 --> 00:08:35,790 En tin, ĝi diras -ggdb3. 157 00:08:35,790 --> 00:08:38,570 158 00:08:38,570 --> 00:08:41,250 En tiu kazo, kion ni estas rakontanta tin, nia tradukilo, 159 00:08:41,250 --> 00:08:43,820 estas ke ni volas kompili nia programo. 160 00:08:43,820 --> 00:08:46,810 Sed ankaŭ provizi kion estas nomata simbolo informo 161 00:08:46,810 --> 00:08:50,940 por ke la tradukilo fakte havas aliron al multa la suba informo 162 00:08:50,940 --> 00:08:52,610 enhavis ene de la programo. 163 00:08:52,610 --> 00:08:55,260 >> Pli specife, la nombro de funkcioj kiujn mi havas, 164 00:08:55,260 --> 00:08:58,000 la nomoj de tiuj funkcioj, la variabloj, la tipoj 165 00:08:58,000 --> 00:09:01,730 ke tiuj variabloj, kaj gamo de aliaj aferoj kiu helpos la erarserĉilo 166 00:09:01,730 --> 00:09:04,350 elfari lian funkciadon. 167 00:09:04,350 --> 00:09:06,600 Nun tie estas io alia tio estas grava mencii 168 00:09:06,600 --> 00:09:10,280 kiam ni diskutis kurado programon en tiu maniero. 169 00:09:10,280 --> 00:09:13,660 >> Rimarku ke havas reale alportis novan langeton en nia konzolo 170 00:09:13,660 --> 00:09:14,780 laŭ la fundo. 171 00:09:14,780 --> 00:09:18,600 Ni ne plu devas interagi rekte kun la fina fenestro. 172 00:09:18,600 --> 00:09:21,420 Sed tiu nova langeto estas fakte terminalprograo. 173 00:09:21,420 --> 00:09:26,710 Ĝi nur estas specifaj por la kurado programo kiun ni kreis. 174 00:09:26,710 --> 00:09:29,270 >> Rimarku ke en la profundeco, en kombino kun iuj eligo 175 00:09:29,270 --> 00:09:33,500 per Clang la tradukilo kaj GDB, kion ni povas grandparte ignoras, 176 00:09:33,500 --> 00:09:37,570 ĝi fakte montras la eligo de nia programo je la tre fundo. 177 00:09:37,570 --> 00:09:41,240 Nun estas grave realigi ke unu fenestro ja 178 00:09:41,240 --> 00:09:43,360 montros al vi la eligo de via programo 179 00:09:43,360 --> 00:09:47,190 sed ankaŭ povas akcepti enigon por ke programo, ankaŭ. 180 00:09:47,190 --> 00:09:49,260 >> Do avizo kiu diras bonvolu enmeti numeron, 181 00:09:49,260 --> 00:09:53,050 kiu estas la sama eligo ke ni devis havis en la terminala fenestro antaŭe. 182 00:09:53,050 --> 00:09:55,510 Sed gxi nun montris en tiu nova langeto. 183 00:09:55,510 --> 00:09:56,550 Mi povas enigo numero. 184 00:09:56,550 --> 00:10:00,900 Kaj ĝi efektive funkcion kiel ni atendas 185 00:10:00,900 --> 00:10:05,890 montrante al ni niajn debug, eligo, la eligo ke povus esti kalesxo, 186 00:10:05,890 --> 00:10:07,010 kiel ni vidis antaŭe. 187 00:10:07,010 --> 00:10:10,460 Kaj en la fundo, ĝi efektive havas iun aldonan eligo 188 00:10:10,460 --> 00:10:14,550 el MEP nur diras ke ĉi programo kompletigis. 189 00:10:14,550 --> 00:10:16,655 >> Nun kiel vi vidis en tiu aparta kuri tra, 190 00:10:16,655 --> 00:10:19,370 ĝi ne estis aparte utila ĉar eĉ 191 00:10:19,370 --> 00:10:23,740 kvankam ni havis la erarserĉilo menuo venu supren, tiu estis ankoraŭ kurado programo. 192 00:10:23,740 --> 00:10:26,790 Ĉe neniu punkto faris reale paŭzi ekzekuto por ni 193 00:10:26,790 --> 00:10:30,767 povi inspekti ĉiujn la variabloj enhavis ene. 194 00:10:30,767 --> 00:10:32,850 Estas io alia ke ni devas fari por 195 00:10:32,850 --> 00:10:36,910 akiri GDB rekoni ke ni volas paŭzi ekzekuto de la programo 196 00:10:36,910 --> 00:10:42,820 kaj ne nur permesus al procedi kutime kiel ni farus en iu alia kazo. 197 00:10:42,820 --> 00:10:45,530 >> Por paŭzi ekzekuto, en iu specifa linio, 198 00:10:45,530 --> 00:10:47,830 ni devas krei kio estas nomata ripozon punkto. 199 00:10:47,830 --> 00:10:52,670 Kaj ripozon punkto estas tre facile kreis en ĉi CS50 IDE prenante vian muson 200 00:10:52,670 --> 00:10:57,090 kaj klakante rekte maldekstren de iu specifa numero de linio. 201 00:10:57,090 --> 00:10:59,920 Iam mi faros tion, ruĝa punkto aperas, kiu indikas 202 00:10:59,920 --> 00:11:02,300 ke tiu linio estas nun ripozon punkto. 203 00:11:02,300 --> 00:11:07,540 >> Kaj la venontan fojon ke mi kuras GDB, ĝi ĉesos ekzekuto en tiu paŭzo punkto 204 00:11:07,540 --> 00:11:10,280 kiam atingas tiun linion de kodo. 205 00:11:10,280 --> 00:11:12,230 Nun tiu estas grava afero realigi 206 00:11:12,230 --> 00:11:16,140 ke ĝi ne estas nepre la kazo ke ĉiu linio de kodo 207 00:11:16,140 --> 00:11:17,880 estas reale atingebla. 208 00:11:17,880 --> 00:11:23,780 Se mi estus krei funkcion tien, por example-- malplenon f-- 209 00:11:23,780 --> 00:11:31,230 kaj nur faru pres linio here-- saluton world-- se mi neniam nomas tiun funkcion, 210 00:11:31,230 --> 00:11:34,770 tio estos la kazo ke, se mi starigis ripozon punkto ĉi tie, 211 00:11:34,770 --> 00:11:36,220 la funkcio neniam nomos. 212 00:11:36,220 --> 00:11:38,310 Kaj do, ĉi aparta ripozon punkto 213 00:11:38,310 --> 00:11:43,040 neniam reale paŭzi ekzekuto de la programo. 214 00:11:43,040 --> 00:11:48,020 >> Do diru ke mi ĝuste krei ripozon punkto sur iu linio de kodo 215 00:11:48,020 --> 00:11:50,340 ke efektive estos ekzekutitaj. 216 00:11:50,340 --> 00:11:53,470 Nun en ĉi tiu kazo, ĉi tiu estas la unua linio en la ĉefa funkcio. 217 00:11:53,470 --> 00:11:56,630 Do ĝi certe estos la kazo ke, tuj kiam mi komencas ekzekuton, 218 00:11:56,630 --> 00:11:58,580 la unua linio estos atingita. 219 00:11:58,580 --> 00:12:00,230 GDB estos paŭzi ekzekuto. 220 00:12:00,230 --> 00:12:04,100 Kaj poste, mi povos interagi kun la erarserĉilo. 221 00:12:04,100 --> 00:12:08,480 >> Vi povas agordi multnombraj linioj kiel breakpoints, se vi ŝatus. 222 00:12:08,480 --> 00:12:11,365 Ni povas ankaŭ krei linion supren tie en tiu segmento de kodo 223 00:12:11,365 --> 00:12:12,490 ke neniam estos atingita. 224 00:12:12,490 --> 00:12:14,744 Kaj ni povas ankaŭ agordi unu plua sube. 225 00:12:14,744 --> 00:12:16,660 La kialo ke ni farus volas fari tion ni 226 00:12:16,660 --> 00:12:19,119 iri en iomete pli detalo en nur momento. 227 00:12:19,119 --> 00:12:21,660 Do nun, mi povas simple malŝalti tiuj aldonaj rompo punktoj 228 00:12:21,660 --> 00:12:24,940 tiel ke ni povas rigardi kion okazas kiam mi havos unu solan paŭzo 229 00:12:24,940 --> 00:12:27,650 punkto en mia programo. 230 00:12:27,650 --> 00:12:29,410 Mi faris kelkajn ŝanĝoj al tiu programo. 231 00:12:29,410 --> 00:12:30,750 Do mi devas savi ĝin. 232 00:12:30,750 --> 00:12:34,490 Mi klaku debug por ke mi povas komenci la compilación kaj tiam 233 00:12:34,490 --> 00:12:36,880 ekzekuto de la erarserĉilo. 234 00:12:36,880 --> 00:12:40,632 >> Ni vidos ke, post momentoj, la linio kiu ni selektita kiel la paŭzo 235 00:12:40,632 --> 00:12:43,360 punkto estas emfazita en flava. 236 00:12:43,360 --> 00:12:47,440 Ni povas ankaŭ rimarki ke en la supra dekstra en la debug panelo 237 00:12:47,440 --> 00:12:50,940 ke la paŭzo ikono turnis en malgrandan teatraĵo ikono. 238 00:12:50,940 --> 00:12:54,710 Tio signifas ke ni havas paŭzo ekzekuto, en ĉi tiu aparta kazo. 239 00:12:54,710 --> 00:12:57,840 Kaj bati la Play butonon estus nin permesas rekomenci ekzekuton 240 00:12:57,840 --> 00:13:00,000 en tiu specifa punkto. 241 00:13:00,000 --> 00:13:03,240 >> Rimarku ke estas paro de aliaj butonoj havebla en ĉi debug panelo, 242 00:13:03,240 --> 00:13:04,220 ankaŭ. 243 00:13:04,220 --> 00:13:09,470 Transpaŝi, kiu min permesas ekzekuti tiu linio de kodo 244 00:13:09,470 --> 00:13:14,030 kaj transpaŝas al tiu linio al la apud unu, kiu, en tiu kazo, 245 00:13:14,030 --> 00:13:17,060 signifus ke la printf komunikaĵo estas ekzekutita. 246 00:13:17,060 --> 00:13:22,310 Kaj ĝi tiam paŭzi ekzekuto ĉe linio 13, kiel tia. 247 00:13:22,310 --> 00:13:25,090 >> Kaj estas ankaŭ paŝo en funkcio, kiun 248 00:13:25,090 --> 00:13:28,950 Estas utile se mi kreis alian funkcioj aliloke en la fontkodo. 249 00:13:28,950 --> 00:13:31,420 Kaj mi volas eniri tiuj funkcioj prefere ol 250 00:13:31,420 --> 00:13:33,050 ekzekuti tiu funkcio kiel tuto. 251 00:13:33,050 --> 00:13:37,279 Sed ni povos rigardi pli ĉe la ŝtupo en funkcio en nur momento. 252 00:13:37,279 --> 00:13:40,320 Nun rimarki iuj aliaj aĵoj kiuj reale ekzistas ene ĉi debug panelo. 253 00:13:40,320 --> 00:13:44,110 >> Ni havas ĉi panelo nomata voki pilo, kiu montras al ni 254 00:13:44,110 --> 00:13:45,300 kie ĝuste ni estas. 255 00:13:45,300 --> 00:13:48,550 En tiu kazo, ni estas interne de la ĉefa funkcio. 256 00:13:48,550 --> 00:13:50,880 Nia skribo estas nomita count.c. 257 00:13:50,880 --> 00:13:53,820 Kaj ni hazarde estas sur linio 13, kolumno unu, kiu 258 00:13:53,820 --> 00:13:58,950 estas ĝuste kion la emfazita regiono de la fontkodo indikas, kiel bone. 259 00:13:58,950 --> 00:14:02,435 >> Nun rimarkas ke ankaux montras sub la loka variablo sekcio 260 00:14:02,435 --> 00:14:06,710 ĉiuj variabloj kiuj ekzisti ene de ĉi tiu funkcio. 261 00:14:06,710 --> 00:14:08,930 Estas grave noti ke ĉiuj el la variabloj 262 00:14:08,930 --> 00:14:12,580 aperos en tiu loka variablo sekcio ene de funkcio, 263 00:14:12,580 --> 00:14:14,380 eĉ antaŭ ol ili estas difinitaj. 264 00:14:14,380 --> 00:14:19,160 Ni povas vidi ĉi tie ke ni havas variablo nomata num, havas aprioran valoron de 0, 265 00:14:19,160 --> 00:14:21,280 kaj estas de tipo int. 266 00:14:21,280 --> 00:14:24,110 >> Nun antaŭ ni efektive pravalorizi ĉiuj el tiuj variabloj, 267 00:14:24,110 --> 00:14:26,685 ni ne estas nepre guaranteed vidi valoron de 0. 268 00:14:26,685 --> 00:14:29,200 Kaj depende aliaj ekzekutoj ke vi plenumis 269 00:14:29,200 --> 00:14:32,020 kaj la stato de via memoro, kiam vi efektive ruli tiun programon, 270 00:14:32,020 --> 00:14:34,605 vi eble trovos ke vi ne vidas valoroj de 0 271 00:14:34,605 --> 00:14:36,550 kaj, anstataŭe, iuj aliaj freneza nombroj. 272 00:14:36,550 --> 00:14:38,390 >> Sed ne maltrankviliĝu pri tio. 273 00:14:38,390 --> 00:14:44,610 Oni ne tuj esti adekvataj ĝis vi fakte pravalorizi la valoro. 274 00:14:44,610 --> 00:14:49,630 Nun en ĉi tiu kazo, ni povas vidi ke Mi plenumis iuj eligoj. 275 00:14:49,630 --> 00:14:52,131 Kaj mi, nun, paŭzis ekzekuto. 276 00:14:52,131 --> 00:14:53,880 Sed en ĉi tiu kazo, kio Mi vere deziras fari 277 00:14:53,880 --> 00:14:58,060 estas nun transpaŝas tiu linio de kodo por ke mi povas reale 278 00:14:58,060 --> 00:15:04,390 konsulti la uzanto por ke int ke ni volas uzi en nia programo. 279 00:15:04,390 --> 00:15:07,060 >> Nun en ĉi tiu kazo, kiam Mi trafis transpaŝas, avizo 280 00:15:07,060 --> 00:15:11,940 ke la Paŭzo aŭ prefere la Rekomenci butono ŝanĝis al ĉi Paŭzi butono 281 00:15:11,940 --> 00:15:14,022 ĉar tiu kodo estas reale ekzekuti. 282 00:15:14,022 --> 00:15:15,730 Kio okazas nun estas ke ĝi estas 283 00:15:15,730 --> 00:15:21,630 atendis nin enigi iu informo kiel ni povas vidi per nia eligo teksto 284 00:15:21,630 --> 00:15:23,600 ĉe la malsupro. 285 00:15:23,600 --> 00:15:25,787 >> Do ĝuste nun, ĉi tiu estas ne efektive paŭzis, 286 00:15:25,787 --> 00:15:28,620 kvankam, ia, aperas esti ĉar nenio okazas. 287 00:15:28,620 --> 00:15:32,360 Sed ĝi nur do okazas ke en mia specifa kazo sur linio 13, 288 00:15:32,360 --> 00:15:34,210 Mi atendas uzanto enigo. 289 00:15:34,210 --> 00:15:39,130 Kaj tiel GDB ne povas inspekti programon kiel ĝi kuras. 290 00:15:39,130 --> 00:15:43,370 >> La sekvantan fojon ke mi eniras iom input-- do mi eniru ke numero 5, 291 00:15:43,370 --> 00:15:46,140 kiel ni vidis en la past-- batis Reveno, kaj ni 292 00:15:46,140 --> 00:15:51,430 rimarkos ke, tuj, GDB paŭzoj kaj, denove, ĝi reliefigas la sekva linio. 293 00:15:51,430 --> 00:15:55,320 Sed rimarki ke nun, kiel rezulto de nia inputting valoron, 294 00:15:55,320 --> 00:15:58,930 ni ĝisdatigis tiun valoron interne de niaj lokaj variabloj, kiuj 295 00:15:58,930 --> 00:16:05,560 estas tre utile scii precize kion tio nombro en memoro. 296 00:16:05,560 --> 00:16:10,650 >> Nun mi povas permesi ĉi programo por daŭrigi ludi ĝis la fino de lia ekzekuto 297 00:16:10,650 --> 00:16:12,570 trafante Rekomenci. 298 00:16:12,570 --> 00:16:16,410 Ni povas vidi ke tre rapide faras la programon finpoluro ekzekutinte 299 00:16:16,410 --> 00:16:19,790 kun la sama eligo ke ni havis antaŭe, la erarserĉilo fermas, 300 00:16:19,790 --> 00:16:23,170 kaj nun ĉi programo haltis tute. 301 00:16:23,170 --> 00:16:25,320 >> Mi montros ke nur por la celoj de vidi kion 302 00:16:25,320 --> 00:16:27,280 okazas kiam ni efektive trafis Rekomenci. 303 00:16:27,280 --> 00:16:30,640 Sed ni efektive tuj volas reveni en ĉi tiun programon 304 00:16:30,640 --> 00:16:33,820 tiel ke ni povas provi debug precize kio okazas. 305 00:16:33,820 --> 00:16:37,980 Nun ke mi uzas la erarserĉilo, mi povas ne bezonas tiujn debug printf deklaroj. 306 00:16:37,980 --> 00:16:43,860 >> Do mi povis forigi ilin, mi faros nun nur reiri al nia simpla kodo 307 00:16:43,860 --> 00:16:45,950 ke ni havis antaŭ momento. 308 00:16:45,950 --> 00:16:48,790 Kiam mi savi la plani kaj ekzekuti ŝin, 309 00:16:48,790 --> 00:16:53,700 ĝi, denove, iri al tiu komenca rompi punkto kiun mi havis sur linio 11. 310 00:16:53,700 --> 00:16:57,700 Kaj mi povos inspekti mian variabloj kiel mi volas fari. 311 00:16:57,700 --> 00:17:00,695 >> Ĝi nur do okazas ke ĉi parto ne estas tre interesa, 312 00:17:00,695 --> 00:17:04,364 Kaj mi scias ke mi iros presi ĉi tiun komunikaĵon. 313 00:17:04,364 --> 00:17:05,280 Bonvolu enigi nombron. 314 00:17:05,280 --> 00:17:08,099 Kaj tiam, mi scias, ke mi tuj demandi la uzanton por ke entjero. 315 00:17:08,099 --> 00:17:13,329 Do eble mi vere volas movi miajn rompi punkto iomete pli malsupren. 316 00:17:13,329 --> 00:17:16,710 >> Vi povas forigi rompo punktoj klakante, denove, rekte 317 00:17:16,710 --> 00:17:18,460 maldekstren de tiu numero de linio. 318 00:17:18,460 --> 00:17:22,200 Ke ruĝa punkto malaperos, indikante ke tio ripozon punkto estas nun irita. 319 00:17:22,200 --> 00:17:24,780 Nun en ĉi tiu kazo, ekzekuto estis paŭzis. 320 00:17:24,780 --> 00:17:27,770 Kaj tiel ĝi ne vere tuj rekomenci en tiu aparta kazo. 321 00:17:27,770 --> 00:17:30,210 Sed mi povas agordi ripozon atentigi iomete poste. 322 00:17:30,210 --> 00:17:33,880 >> Kiam mi nun rekomencas mian kodo, ĝi rekomencos kaj diri 323 00:17:33,880 --> 00:17:36,190 la punkto de tiu ripozon punkto. 324 00:17:36,190 --> 00:17:37,374 Denove, mi batis Rekomenci. 325 00:17:37,374 --> 00:17:39,040 Ne ŝajnas kiel io okazas. 326 00:17:39,040 --> 00:17:41,450 Sed tio estas pro mia kodo atendas enigo. 327 00:17:41,450 --> 00:17:47,900 Mi eniros en numero 5, batis Enter, kaj nun la sekvanta paŭzo punkto estos frapita. 328 00:17:47,900 --> 00:17:50,570 >> Nun en ĉi tiu kazo, ĉi estas la linio de kodo 329 00:17:50,570 --> 00:17:53,820 ke, antaŭe, ni sciis pasis al esti kalesxon. 330 00:17:53,820 --> 00:17:57,590 Do ni taksi kio okazas pri tiu preciza punkto en tempo. 331 00:17:57,590 --> 00:18:02,620 Kiam linio estas reliefigita, ĉi linio ne jam estis ekzekutita. 332 00:18:02,620 --> 00:18:06,490 Do en tiu kazo, ni povas vidi ke mi havas kelkajn, kiuj 333 00:18:06,490 --> 00:18:11,610 Mi havas entjero nomis num kiuj havas valoron 5. 334 00:18:11,610 --> 00:18:15,090 Kaj mi tuj estos elfaranta iuj math sur tiun numeron. 335 00:18:15,090 --> 00:18:20,130 >> Se mi ne transpaŝas tio, ni povas rimarkos ke la valoro por num 336 00:18:20,130 --> 00:18:23,780 ŝanĝiĝis laŭ la aritmetiko ke ni reale faris. 337 00:18:23,780 --> 00:18:26,810 Kaj nun ke ni estas ene de tiu por buklo 338 00:18:26,810 --> 00:18:29,090 aŭ nun ke la por buklo mem estas reliefigita, 339 00:18:29,090 --> 00:18:32,450 ni vidas ke ni havas novan variablo nomis i ke 340 00:18:32,450 --> 00:18:35,370 tuj estos uzita en tiu por buklo. 341 00:18:35,370 --> 00:18:38,230 >> Nun memoru antaŭ tiu mi menciis ke foje vi 342 00:18:38,230 --> 00:18:43,470 tuj vidos ia freneza nombroj kiel defaŭltan antaŭ tiu nombro 343 00:18:43,470 --> 00:18:45,530 aŭ ke variablo estas fakte pravalorizitaj. 344 00:18:45,530 --> 00:18:49,040 Ni povas vidi ke precize tie en la ĉi ŝanĝiĝema 345 00:18:49,040 --> 00:18:51,345 vokis i, kiu havas ne ankoraŭ pravalorizitaj 346 00:18:51,345 --> 00:18:53,560 tiutempe de kolorigo. 347 00:18:53,560 --> 00:18:57,070 Sed ni povas vidi ke ĝi havas iun numeron ke ni ne reale atendi. 348 00:18:57,070 --> 00:18:57,620 >> Estas bone. 349 00:18:57,620 --> 00:18:59,661 Ne maltrankviliĝu pri ĝi ĉar ni havas ne reale 350 00:18:59,661 --> 00:19:04,970 pravalorizitaj tiun ciferon ĝis mi transpaŝas tiu linio kaj la valoro 351 00:19:04,970 --> 00:19:08,560 i estis pravalorizitaj al la valoro 1. 352 00:19:08,560 --> 00:19:11,400 Do por vidi ke tio estas vere la kazo, ni ne transpaŝas. 353 00:19:11,400 --> 00:19:14,420 Ni nun povas vidi ke tiu linio estis ekzekutita. 354 00:19:14,420 --> 00:19:17,000 Kaj ni nun reliefigante ĉi printf linio. 355 00:19:17,000 --> 00:19:22,230 >> Kaj ni nun povas vidi kiel niaj valoroj de i kaj 3 ŝanĝis super tempo. 356 00:19:22,230 --> 00:19:26,450 Ĉi tio estas tre utila por fari, fakte, estas transpaŝas linioj ree. 357 00:19:26,450 --> 00:19:30,480 Kaj vi povas trovi kion reale okazas ene de via por buklo 358 00:19:30,480 --> 00:19:33,660 Kaj kio okazas al la variabloj ene de tiu por buklo 359 00:19:33,660 --> 00:19:39,200 kiel tiu programo ekzekuto okazas unu paŝon samtempe. 360 00:19:39,200 --> 00:19:41,110 >> Nun ĉe ĉi tiu punkto, mi transpaŝis nur sufiĉe 361 00:19:41,110 --> 00:19:44,210 ke mi nun estas ĉe la fino de mia programo. 362 00:19:44,210 --> 00:19:46,980 Se mi ne transpaŝas ke, ĝi volo fakte ĉesi ekzekuto 363 00:19:46,980 --> 00:19:48,860 kiel ni vidis en la estinteco. 364 00:19:48,860 --> 00:19:52,110 Lasu min rekomenci tion, plue, do ke mi povas atentigi io alia ekstere, 365 00:19:52,110 --> 00:19:53,320 ankaŭ. 366 00:19:53,320 --> 00:19:55,350 >> En tiu kazo, estas nun demandas min, denove, 367 00:19:55,350 --> 00:19:57,100 por nombro, kiu Mi, denove, eniru. 368 00:19:57,100 --> 00:20:00,300 Sed tiu tempon, mi tuj eniros en pli granda nombro tiel ke la por buklo 369 00:20:00,300 --> 00:20:02,540 estos persisti pli fojojn. 370 00:20:02,540 --> 00:20:06,090 En tiu kazo, mi tuj eniri valoron de 11. 371 00:20:06,090 --> 00:20:08,390 >> Nun denove ĉar mi metis ripozon punkto ĉe linio 15, 372 00:20:08,390 --> 00:20:10,490 ĝi tuj reliefigi tiun linion. 373 00:20:10,490 --> 00:20:12,980 Ni povas vidi ke nia numero 11 estas korekte 374 00:20:12,980 --> 00:20:15,560 reprezentitaj en nia loka variabloj. 375 00:20:15,560 --> 00:20:22,460 Stepping super tio, ni povas nun rigardi kion okazas al nia valoro de i 376 00:20:22,460 --> 00:20:25,680 kiel ni procedas ene de tiu por buklo. 377 00:20:25,680 --> 00:20:31,960 Gets incremented ĉiufoje ni atingi la supron de tiu por buklo. 378 00:20:31,960 --> 00:20:35,110 >> Nun unu el la aĵoj kiuj povus utila fari dum ekzekuto 379 00:20:35,110 --> 00:20:40,490 de tiu programo estas por mi fakte ŝanĝi la variablojn flumezo vidi 380 00:20:40,490 --> 00:20:42,450 kio okazas al mia programo. 381 00:20:42,450 --> 00:20:46,540 En tiu kazo, mi povas fakte duobla alklaku la valoro. 382 00:20:46,540 --> 00:20:48,040 Rimarku ke ĝi iĝas tekstujon. 383 00:20:48,040 --> 00:20:50,280 >> Nun mi povas eniri malsamajn taksas entute 384 00:20:50,280 --> 00:20:55,700 vidi kiel mia programo kondutas kiam mi ŝanĝis tiu variablo. 385 00:20:55,700 --> 00:20:59,560 Nun en ĉi tiu kazo, la variablo i nun enhavas la valoron 10. 386 00:20:59,560 --> 00:21:02,810 Sed la programo estas ankoraŭ paŭzis en ekzekuto. 387 00:21:02,810 --> 00:21:07,610 Kiam mi transpaŝas, mi vidas ke la valoro i, kiun mi eniris kiel 10, 388 00:21:07,610 --> 00:21:12,170 ne estas pli granda ol la valoro de num, kiu tuj kaŭzas la por buklo 389 00:21:12,170 --> 00:21:14,240 halti ekzekuti. 390 00:21:14,240 --> 00:21:16,210 >> Nun tio ne estas la sola tial vi farus 391 00:21:16,210 --> 00:21:19,450 volas modifi la variablo en tiu loko. 392 00:21:19,450 --> 00:21:22,210 Vi povus reale volas provi modifi ĝin tiel 393 00:21:22,210 --> 00:21:24,590 ke vi povas daŭrigi ekzekuto de buklo 394 00:21:24,590 --> 00:21:27,370 aŭ por ke vi povas modifi iu valoro antaŭ ĝi 395 00:21:27,370 --> 00:21:32,630 atingas iun specifan aron de aritmetiko ke vi intencas plenumi. 396 00:21:32,630 --> 00:21:36,210 >> Do nun ke ni efektive ŝanĝi la valoro de i kiel la programo ekzekutis, 397 00:21:36,210 --> 00:21:39,540 ĝi kaŭzis la por buklo esi antaŭtempe ĉar, subite, i 398 00:21:39,540 --> 00:21:42,770 pasis al esti pli granda ol la valoro de num, signifante ke tiu por buklo 399 00:21:42,770 --> 00:21:45,410 jam ne bezonis esti ekzekutita. 400 00:21:45,410 --> 00:21:48,780 Plui, ĝi pasis al esti la kazo ke ni ŝanĝis la valoro de i 401 00:21:48,780 --> 00:21:53,270 kiam la linio 17 estis elstarigita, kiu estis la punkto en tempo 402 00:21:53,270 --> 00:21:56,280 ke la por buklo ekzekuto efektive estanta taksita. 403 00:21:56,280 --> 00:22:00,210 >> Se mi ŝanĝis la valoron de Mi sur malsama linio, diru 19 404 00:22:00,210 --> 00:22:03,360 ni vidis malsamajn konduto ĉar linion 19 volus 405 00:22:03,360 --> 00:22:08,310 esti ekzekutita antaŭ la buklo kondiĉo estis reevaluated. 406 00:22:08,310 --> 00:22:11,900 Nun ĉe ĉi tiu punkto, mi estas, denove, fine de tiu programo. 407 00:22:11,900 --> 00:22:15,707 Kaj mi povas permesi tion al procedi permesus mian programon esi nature. 408 00:22:15,707 --> 00:22:18,290 Sed estas paro de aferoj kiuj estas gravaj por forpreni 409 00:22:18,290 --> 00:22:19,960 de tiu aparta diskuto. 410 00:22:19,960 --> 00:22:22,490 Vi devas taksi viajn proprajn supozojn 411 00:22:22,490 --> 00:22:24,710 pri kiel la kodo devas konduti. 412 00:22:24,710 --> 00:22:28,220 Ajna tempo vi pensas ke iu peco de kodo vi scias sekvinbero al labori, 413 00:22:28,220 --> 00:22:30,940 kiuj povus esti ruĝa flago iri reen kaj taksi, kaj vi suferos 414 00:22:30,940 --> 00:22:33,470 ke via supozo de ke kodo estas funkcianta 415 00:22:33,470 --> 00:22:38,290 estas fakte vera por kiom ĝi estas esprimita en via fontkodo. 416 00:22:38,290 --> 00:22:41,300 >> Sed eĉ pli al punkto estis, kiam ni uzas la erarserĉilo, 417 00:22:41,300 --> 00:22:43,920 vi povas meti breakpoints ĉe malsamaj linioj de kodo, 418 00:22:43,920 --> 00:22:48,110 pro kio la erarserĉilo al paŭzi ekzekuto ĉe ĉiu el tiuj linioj 419 00:22:48,110 --> 00:22:52,210 por ke vi povas taksi la memoro aŭ eĉ ŝanĝi ĝin en loko. 420 00:22:52,210 --> 00:22:55,630 Kaj cetere, memoru, ke vi povas krei plurajn breakpoints por ke vi 421 00:22:55,630 --> 00:23:00,390 povas ankaŭ rekomenci ekzekuton, skip super grandaj partoj de kodo, 422 00:23:00,390 --> 00:23:04,790 kaj gxi devos aŭtomate paŭzi ĉe la sekvanta paŭzo punkto. 423 00:23:04,790 --> 00:23:07,760 >> Ekzistas fakte pli progresintaj karakterizaĵoj de la erarserĉilo, ankaŭ. 424 00:23:07,760 --> 00:23:10,170 Sed ni devos raporti vin al iuj sekvaj filmetoj 425 00:23:10,170 --> 00:23:14,090 por vere turmentus aparte kiel uzi tiuj apartaj funkcioj. 426 00:23:14,090 --> 00:23:15,990 Por nun, dankon tre multe por rigardanta. 427 00:23:15,990 --> 00:23:18,080 Kaj bonŝancon elpuriganta.