1 00:00:00,000 --> 00:00:02,730 [Powered by Google Translate] [ДЕО 5: мање комфорни] 2 00:00:02,730 --> 00:00:05,180 [Нејт Хардисон, Универзитет Харвард] 3 00:00:05,180 --> 00:00:08,260 [Ово је ЦС50.] [ЦС50.ТВ] 4 00:00:08,260 --> 00:00:11,690 Па добродошао назад, момци. 5 00:00:11,690 --> 00:00:16,320 Добродошли у секцији 5. 6 00:00:16,320 --> 00:00:20,220 У овом тренутку, пошто је завршио квиз 0 и видевши како си урадио, 7 00:00:20,220 --> 00:00:25,770 надам се да се осећате стварно добро, јер сам био веома импресиониран резултатима у овом одељку. 8 00:00:25,770 --> 00:00:28,050 За наше онлине гледалаца, имали смо пар питања 9 00:00:28,050 --> 00:00:33,680 о последња два проблема на проблем сету - или на квизу, а. 10 00:00:33,680 --> 00:00:39,690 Дакле, ми ћемо да идемо преко оне веома брзо, тако да свако види оно што се десило 11 00:00:39,690 --> 00:00:45,060 и како да иде кроз стварне решење него само гледање самог решење. 12 00:00:45,060 --> 00:00:50,330 Ми ћемо ићи у последњих неколико проблема веома брзо, 32 и 33. 13 00:00:50,330 --> 00:00:53,240 Само, опет, тако да гледаоци могу да виде онлајн ово. 14 00:00:53,240 --> 00:00:59,080 >> Ако окренемо свом проблему 32, који се налази на страни 13, 15 00:00:59,080 --> 00:01:02,730 13 од 16, 32 Проблем је све о свопови. 16 00:01:02,730 --> 00:01:05,010 Све је око замене два цела броја. 17 00:01:05,010 --> 00:01:08,740 То је проблем који смо отишли ​​преко неколико пута у предавању. 18 00:01:08,740 --> 00:01:13,590 А овде, шта смо тражили да урадите је да брзо меморије траг. 19 00:01:13,590 --> 00:01:17,000 Да бисте попунили вредности варијабли као што су на стеку 20 00:01:17,000 --> 00:01:20,250 као код пролази кроз овај свап функцију. 21 00:01:20,250 --> 00:01:24,500 Конкретно, оно што тражимо - Идем да ставим ову иПад доле - 22 00:01:24,500 --> 00:01:29,650 посебно, оно што тражимо је ова линија бројевима овде 6 право. 23 00:01:29,650 --> 00:01:36,740 И то је бројала 6 за само суседство са претходним проблемом. 24 00:01:36,740 --> 00:01:41,720 Оно што ми желимо да урадимо је да прикаже или означи стање меморије 25 00:01:41,720 --> 00:01:46,090 јер је у време када смо изврши ову линију број 6, 26 00:01:46,090 --> 00:01:52,540 који је ефективно повратак из наше свап функцију овде. 27 00:01:52,540 --> 00:01:59,450 Ако се помицати овде доле, видели смо да је адресе свега у меморији предвиђено за нас. 28 00:01:59,450 --> 00:02:02,540 Ово је веома кључ, а ми ћемо се вратити на то у само једном тренутку. 29 00:02:02,540 --> 00:02:09,240 А онда овде доле на дну, имали смо мало меморије дијаграм који ћемо односе. 30 00:02:09,240 --> 00:02:12,490 Заправо сам ово урадио на мојој иПад. 31 00:02:12,490 --> 00:02:20,720 Зато ћу да бирате и назад између иПад и овог кода само за референцу. 32 00:02:20,720 --> 00:02:26,540 >> Почнимо. Прво, хајде да се фокусирамо на првих неколико линија главни овде. 33 00:02:26,540 --> 00:02:30,220 За почетак, ми ћемо да се покрене к на 1 и и до 2. 34 00:02:30,220 --> 00:02:33,040 Дакле, имамо два целобројне променљиве, они обојица ће бити постављени на стек. 35 00:02:33,040 --> 00:02:36,050 Ми ћемо ставити 1 и 2 у њима. 36 00:02:36,050 --> 00:02:43,150 Дакле, ако сам пребацити на мој иПад, надамо се, да видимо - 37 00:02:43,150 --> 00:02:48,660 Аппле ТВ мирроринг, и тамо идемо. Ок. 38 00:02:48,660 --> 00:02:51,670 Дакле, ако сам пребацити на мој иПад, 39 00:02:51,670 --> 00:02:56,220 Желим да се покрене к на 1 и и до 2. 40 00:02:56,220 --> 00:03:00,580 Ми то радимо сасвим једноставно писање 1 у пољу означеном к 41 00:03:00,580 --> 00:03:07,730 и 2 у оквиру обележен год. Прилично једноставно. 42 00:03:07,730 --> 00:03:11,620 Дакле, хајде да се вратимо на лаптоп, да видим шта се даље дешава. 43 00:03:11,620 --> 00:03:15,810 Дакле, ово је место где следећа линија се ствари лукав. 44 00:03:15,810 --> 00:03:28,110 Пролазимо адресу Кс и И адресу као параметре и б на свап функцију. 45 00:03:28,110 --> 00:03:32,380 Адреса од к и адресу и су ствари које не можемо да израчунавање 46 00:03:32,380 --> 00:03:36,360 без позивања на ове метком истиче право доле. 47 00:03:36,360 --> 00:03:39,750 И срећом, прва два метка бода нам рећи тачно шта су одговори. 48 00:03:39,750 --> 00:03:44,740 Адреса од к у меморији је 10, а адреса и у меморији је 14. 49 00:03:44,740 --> 00:03:51,870 Дакле, то су вредности које се прошли у што и б до врха у нашем свап функцију. 50 00:03:51,870 --> 00:04:00,760 Па опет, пребацивање назад на нашем дијаграму, ја могу написати 10 у 51 00:04:00,760 --> 00:04:07,400 и 14 у б. 52 00:04:07,400 --> 00:04:11,610 Сада, ова тачка је место где ћемо наставити са свап. 53 00:04:11,610 --> 00:04:14,520 Дакле окретањем назад на лаптоп опет, 54 00:04:14,520 --> 00:04:21,079 видимо да је начин на који функционише своп је сам први дереференце и продавница резултат у тмп. 55 00:04:21,079 --> 00:04:27,650 Дакле дереференце оператер каже: "Хеј, Треат садржај променљива као адресу.. 56 00:04:27,650 --> 00:04:33,830 Иди на све што се чува на тој адреси, и учитати га. " 57 00:04:33,830 --> 00:04:41,720 Оно што учитати из променљиве ће бити ускладиштен у наше тмп променљиве. 58 00:04:41,720 --> 00:04:45,150 Флиппинг назад на иПад. 59 00:04:45,150 --> 00:04:51,690 Ако одемо на адресу 10, знамо да је адреса 10 је варибле к 60 00:04:51,690 --> 00:04:55,480 јер смо рекли наше тачки која је адреса од к у меморији је 10. 61 00:04:55,480 --> 00:05:00,180 Дакле, можемо да идемо, добијају вредност ње, која је 1, као што видимо на нашем иПад, 62 00:05:00,180 --> 00:05:06,300 и оптерећења која у тмп. 63 00:05:06,300 --> 00:05:08,250 Опет, ово није коначни садржај. 64 00:05:08,250 --> 00:05:14,350 Идемо да ходају кроз и ми ћемо доћи до нашег коначног стања програма на крају. 65 00:05:14,350 --> 00:05:17,210 Али сада, имамо вредност 1 ускладиштен у тмп. 66 00:05:17,210 --> 00:05:19,210 >> А ту је и брзо питање овде. 67 00:05:19,210 --> 00:05:23,980 [Александар] Да ли је дереференце оператера - то је само звезда испред променљиве? 68 00:05:23,980 --> 00:05:27,600 >> Да. Дакле дереференце оператера, као што окренете назад на наше лаптоп поново 69 00:05:27,600 --> 00:05:33,780 је ова звезда испред. 70 00:05:33,780 --> 00:05:37,460 У том смислу, то је - то контрасту са оператером множења 71 00:05:37,460 --> 00:05:42,400 која захтева две ствари, а дереференце оператор унарни оператор. 72 00:05:42,400 --> 00:05:46,130 Само примењује на једној вредности насупрот бинарни оператор 73 00:05:46,130 --> 00:05:48,810 где се односи на две различите вредности. 74 00:05:48,810 --> 00:05:52,080 Дакле, то је оно што се дешава у овој линији. 75 00:05:52,080 --> 00:05:58,390 Ми учитана вредност 1 и складишти га у наш привремени целобројну променљиву. 76 00:05:58,390 --> 00:06:05,800 Следећа линија, чувамо садржај б у - 77 00:06:05,800 --> 00:06:12,630 или, тачније, чувамо садржаје који указују на б се на месту где је окренут ка. 78 00:06:12,630 --> 00:06:17,690 Ако анализирамо ово са десна на лево, ми ћемо дереференце б, 79 00:06:17,690 --> 00:06:23,580 ћемо да се обрати 14, ми ћемо да зграби цео број који је тамо, 80 00:06:23,580 --> 00:06:26,900 а онда ћемо ићи на адресу 10, 81 00:06:26,900 --> 00:06:34,240 и ми ћемо бацити резултат нашег дереференце Босне у том простору. 82 00:06:34,240 --> 00:06:40,080 Флиппинг назад на нашу иПад, где можемо направити ово мало конкретније, 83 00:06:40,080 --> 00:06:44,070 то би могло да помогне ако ја пишем овде бројеве на све адресе. 84 00:06:44,070 --> 00:06:53,820 Дакле, ми знамо да је и, ми смо на адресу 14 к је на адреси 10. 85 00:06:53,820 --> 00:07:00,180 Када смо се крећу б, ми дереференце б, идемо да зграбите вредност 2. 86 00:07:00,180 --> 00:07:08,320 Ми ћемо да ухватите ову вредност јер је вредност која живи на адреси 14. 87 00:07:08,320 --> 00:07:15,700 И ми ћемо то ставити на променљиве која живи на адреси 10, 88 00:07:15,700 --> 00:07:19,160 што је ту, што одговара нашим променљиве к. 89 00:07:19,160 --> 00:07:21,810 Дакле, можемо да урадимо мало замене овде 90 00:07:21,810 --> 00:07:35,380 где смо се ослободимо наше 1 и уместо тога написати 2. 91 00:07:35,380 --> 00:07:39,560 Дакле, све је добро и добро у свету, иако имамо сада преписан к. 92 00:07:39,560 --> 00:07:44,890 Сачували смо Кс. стару вредност у нашем тмп променљиве. 93 00:07:44,890 --> 00:07:50,210 Дакле, можемо да заврши замену са следећом линијом. 94 00:07:50,210 --> 00:07:53,030 Флиппинг назад на наш лаптоп. 95 00:07:53,030 --> 00:07:58,150 Сада све што остаје је да се садржај из нашег привременог целобројну променљиву 96 00:07:58,150 --> 00:08:05,630 и складиштите их у променљиву која живи на адреси која б се држи. 97 00:08:05,630 --> 00:08:10,230 Дакле, ми ћемо да се ефикасно дереференце б да приступ променљива 98 00:08:10,230 --> 00:08:14,340 који је на адресу коју б држи у њој, 99 00:08:14,340 --> 00:08:19,190 и ми ћемо да ствари на вредност која се држи тмп у њега. 100 00:08:19,190 --> 00:08:23,280 Флиппинг назад на иПад још једном. 101 00:08:23,280 --> 00:08:31,290 Ја могу избрисати овде ову вредност, 2, 102 00:08:31,290 --> 00:08:41,010 и уместо тога ћемо копирате 1 право у њега. 103 00:08:41,010 --> 00:08:43,059 Онда следећа линија која извршава, наравно - 104 00:08:43,059 --> 00:08:47,150 ако се окренете назад на лаптоп - је ова тачка 6, 105 00:08:47,150 --> 00:08:52,500 што је тачка у којој смо хтели да имамо дијаграм потпуно попуњена. 106 00:08:52,500 --> 00:08:58,940 Дакле окретањем назад на иПад још једном, само тако можете видети завршен дијаграм, 107 00:08:58,940 --> 00:09:06,610 можете видети да имамо 10 у, 14 у Б, 1 у тмп, 2 у Кс, и 1 у год. 108 00:09:06,610 --> 00:09:11,000 Има ли било каквих питања у вези овога? 109 00:09:11,000 --> 00:09:14,640 Да ли то има више смисла, пошто је прошао кроз њу? 110 00:09:14,640 --> 00:09:24,850 Направите мање смисла? Надам се да не. Ок. 111 00:09:24,850 --> 00:09:28,230 >> Показивачи су веома лукав тема. 112 00:09:28,230 --> 00:09:33,420 Један од момака са којима радимо има веома заједничку изреку: 113 00:09:33,420 --> 00:09:36,590 "Да бисте разумели смернице, прво морате разумети показиваче." 114 00:09:36,590 --> 00:09:40,530 Што мислим да је веома тачно. То се потрајати да се навикнем на њега. 115 00:09:40,530 --> 00:09:45,360 Цртање пуно слика, цртеж много меморијских дијаграма као што је овај су веома корисна, 116 00:09:45,360 --> 00:09:49,480 и након што прође кроз пример после пример после пример, 117 00:09:49,480 --> 00:09:54,450 да ће почети да се мало више смисла и мало више разума и мало више смисла. 118 00:09:54,450 --> 00:10:01,560 Коначно, једног дана, ви ћете имати све потпуно савладао. 119 00:10:01,560 --> 00:10:13,800 Сва питања пре него што пређемо на следећи проблем? У реду. 120 00:10:13,800 --> 00:10:18,840 Дакле, окренете назад на лаптоп. 121 00:10:18,840 --> 00:10:23,300 Следећи проблем који имамо је проблем број 33 о фајлу И / О. 122 00:10:23,300 --> 00:10:26,350 Зумирање на овом мало. 123 00:10:26,350 --> 00:10:28,710 Проблем 33 - Да? 124 00:10:28,710 --> 00:10:32,110 >> [Данијел] Управо сам брзо питање. Ова звезда, или звездицу, 125 00:10:32,110 --> 00:10:35,590 Зове се дереференцинг када користите пре звездицу. 126 00:10:35,590 --> 00:10:38,820 Како се зове кад користите амперсанд раније? 127 00:10:38,820 --> 00:10:43,140 >> Амперсендом пре него што је адреса-оператора. 128 00:10:43,140 --> 00:10:45,880 Дакле, хајде да помицати назад. 129 00:10:45,880 --> 00:10:49,310 Упс. Ја сам у зоом моду, па ја не могу баш померање. 130 00:10:49,310 --> 00:10:52,780 Ако гледамо на овом коду веома брзо овде, 131 00:10:52,780 --> 00:10:54,980 опет иста ствар се дешава. 132 00:10:54,980 --> 00:10:59,180 Ако гледамо на овом шифром овде, на овој линији где правимо позив да замени, 133 00:10:59,180 --> 00:11:10,460 амперсендом је само рекао: "добијете адресу на којој променљиве к животе." 134 00:11:10,460 --> 00:11:14,460 Када ваш компајлер саставља свој код, 135 00:11:14,460 --> 00:11:20,590 има да се заиста физички одвојити место у меморији за све ваше варијабли да живе. 136 00:11:20,590 --> 00:11:24,910 И тако шта компајлер може да уради онда када буде сачињен све, 137 00:11:24,910 --> 00:11:31,110 она зна "Ох, ставио сам к на адреси 10 год сам ставио на адреси 14.." 138 00:11:31,110 --> 00:11:34,640 То онда може попунити у овим вредностима за вас. 139 00:11:34,640 --> 00:11:44,740 Дакле, онда може - може да прође онда ово и пролазу & И у као добро. 140 00:11:44,740 --> 00:11:50,730 Ови момци добили адресу, али су, такође, када их прође у своп функцију, 141 00:11:50,730 --> 00:11:55,690 овај тип информација, ова инт * овде, говори компајлеру, 142 00:11:55,690 --> 00:12:01,350 "У реду, идемо да се тумачи ову адресу као адресу целобројне променљиве." 143 00:12:01,350 --> 00:12:05,900 Као адресе за инт, која се разликује од адресе карактера променљиве 144 00:12:05,900 --> 00:12:09,930 јер инт заузима, на 32-битном рачунару, заузима 4 бајта простора, 145 00:12:09,930 --> 00:12:13,310 док лик само заузима 1 бајт простора. 146 00:12:13,310 --> 00:12:17,310 Дакле, важно је да се зна шта је - шта живи, који тип вредности 147 00:12:17,310 --> 00:12:20,340 живи на адресу коју је добио за прошли 148 00:12:20,340 --> 00:12:22,020 Или адреса коју сте се баве. 149 00:12:22,020 --> 00:12:29,020 На тај начин, ви знате колико бајтова информација да стварно оптерећење од вашег РАМ меморије. 150 00:12:29,020 --> 00:12:31,780 А онда, да, ово дереференце оператера, као и ви тражили, 151 00:12:31,780 --> 00:12:37,200 иде и приступа информацијама на одређеној адреси. 152 00:12:37,200 --> 00:12:42,820 Тако се каже, са овом променљивој овде, третирају садржај као адресу, 153 00:12:42,820 --> 00:12:47,880 иди на ту адресу, и извуците, учитати у процесор, оптерећења у регистар 154 00:12:47,880 --> 00:12:56,340 стварне вредности или садржај који живе на тој адреси. 155 00:12:56,340 --> 00:12:59,620 Има ли још питања? То су добра питања. 156 00:12:59,620 --> 00:13:01,650 Сувише је много нових термина. 157 00:13:01,650 --> 00:13:09,800 То је такође врста функи, видећи & и * у различитим местима. 158 00:13:09,800 --> 00:13:13,180 >> У реду. 159 00:13:13,180 --> 00:13:18,530 Вратимо се проблему 33, поднесе И / О. 160 00:13:18,530 --> 00:13:22,540 Ово је био један од оних проблема који мислим пар ствари догодило. 161 00:13:22,540 --> 00:13:25,400 Један, то је релативно нова тема. 162 00:13:25,400 --> 00:13:30,590 Представљен је ускоро пред квизу, 163 00:13:30,590 --> 00:13:33,400 и онда мислим да је то било нешто као једна од оних речи проблема у математици 164 00:13:33,400 --> 00:13:39,720 где су вам дати много информација, али заправо не завршавају морају да користе гомилу тога. 165 00:13:39,720 --> 00:13:44,060 Први део овог проблема је описујући шта ЦСВ фајл. 166 00:13:44,060 --> 00:13:50,620 Сада, ЦСВ фајл, према опису, је раздвојених зарезима вредности фајл. 167 00:13:50,620 --> 00:13:55,300 Разлог су уопште занимљив, а разлог сте икада их користите, 168 00:13:55,300 --> 00:14:00,800 је, јер је, како су многи од вас икада користио ствари као Екцел? 169 00:14:00,800 --> 00:14:03,240 Графикон већина вас, вероватно, или ће користити у неком тренутку у свом животу. 170 00:14:03,240 --> 00:14:06,430 Ви ћете користити нешто као Екцел. 171 00:14:06,430 --> 00:14:10,940 Да би добили податке из Екцел табеле или да урадите било какву обраду са њом, 172 00:14:10,940 --> 00:14:17,240 ако сте желели да напишете Ц програм или Питхон програм, Јава програма, 173 00:14:17,240 --> 00:14:20,070 да се баве подацима ускладиштеним сте тамо, 174 00:14:20,070 --> 00:14:23,170 један од најчешћих начина да изађу у ЦСВ датотеци. 175 00:14:23,170 --> 00:14:26,850 И можете отворити Екцел и када одете на 'Саве Ас' дијалог, 176 00:14:26,850 --> 00:14:32,840 можете изаћи стварну ЦСВ датотеку. 177 00:14:32,840 --> 00:14:35,890 >> Ханди да знају како да се носе са тим стварима. 178 00:14:35,890 --> 00:14:42,010 Начин на који функционише је да је слично - Мислим, то је у суштини то имитирање табелу, 179 00:14:42,010 --> 00:14:47,590 где је, као што видимо овде, у врло лева комад, 180 00:14:47,590 --> 00:14:49,910 имамо све презимена. 181 00:14:49,910 --> 00:14:54,670 Дакле, имамо Малан, затим Хардисон, а затим Бовден, МацВиллиам, а затим Цхан. 182 00:14:54,670 --> 00:14:59,470 Сва презимена. А онда запета одваја презимена из прва имена. 183 00:14:59,470 --> 00:15:02,970 Дејвид, Нате, Роб, Томи и Замила. 184 00:15:02,970 --> 00:15:06,850 Ја сам увек мешају Роби и Тома. 185 00:15:06,850 --> 00:15:10,940 И онда, коначно, трећа колона је емаил адресе. 186 00:15:10,940 --> 00:15:18,500 Када схватите да је остатак програма је прилично једноставан за примену. 187 00:15:18,500 --> 00:15:23,850 Оно што смо урадили у циљу да опонашају ову исту структуру у нашем програму Ц 188 00:15:23,850 --> 00:15:27,510 се користили смо структуру. 189 00:15:27,510 --> 00:15:30,520 Ми ћемо почети да играте са њима мало више као добро. 190 00:15:30,520 --> 00:15:35,790 Ми смо их видели први мало у проблему сету 3, када смо били бави речника. 191 00:15:35,790 --> 00:15:40,290 Али ово особље струцт складишти презиме, а прво име и е-маил. 192 00:15:40,290 --> 00:15:44,500 Баш као што је наш ЦСВ датотеке је складиштење. 193 00:15:44,500 --> 00:15:47,950 Дакле, ово је само претварање из једног формата у други. 194 00:15:47,950 --> 00:15:54,630 Морамо да конвертујете, у овом случају, а струцт запослених у линији, 195 00:15:54,630 --> 00:15:59,060 раздвојених зарезима линија, баш тако. 196 00:15:59,060 --> 00:16:01,500 Да ли то смисла? Ви сте сви узети квиз, 197 00:16:01,500 --> 00:16:07,680 па замислите да сте барем имали мало времена да размислим о томе. 198 00:16:07,680 --> 00:16:16,410 >> У изнајмљивање функцији, проблем пита нас да у - ве'лл зум у овом мало - 199 00:16:16,410 --> 00:16:22,480 узети у кадровској структури, особље струцт, са име с 200 00:16:22,480 --> 00:16:30,900 и додати његов садржај нашег стафф.цсв фајл. 201 00:16:30,900 --> 00:16:34,230 Испоставило се да је то прилично једноставан за коришћење. 202 00:16:34,230 --> 00:16:37,430 Ми ћемо некако играти са овим функцијама мало висе данас. 203 00:16:37,430 --> 00:16:44,510 Али у овом случају, иф функција је заиста кључ. 204 00:16:44,510 --> 00:16:51,960 Дакле, са иф, можемо да штампамо, баш као да сте користили принтф целу ову мандат. 205 00:16:51,960 --> 00:16:55,050 Можете принтф линија у датотеци. 206 00:16:55,050 --> 00:16:59,030 Дакле, уместо да само што је уобичајена принтф позив где јој дају ниску формата 207 00:16:59,030 --> 00:17:05,380 и онда замени све променљиве са следећим аргументима, 208 00:17:05,380 --> 00:17:11,290 са иф, ваш први аргумент је уместо датотека желите да пишете. 209 00:17:11,290 --> 00:17:21,170 Ако смо били да погледамо ово у апарату, на пример, човек фпринтф, 210 00:17:21,170 --> 00:17:25,980 можемо да видимо разлику између принтф и фпринтф. 211 00:17:25,980 --> 00:17:28,960 Ја ћу увећали овде мало. 212 00:17:28,960 --> 00:17:33,140 Дакле, са иф, ми га дати стринг формат, а затим наредни аргументи 213 00:17:33,140 --> 00:17:37,580 су све варијабле за замену или замена у нашој формата низа. 214 00:17:37,580 --> 00:17:47,310 Док са иф, први аргумент је заиста овај фајл * зове поток. 215 00:17:47,310 --> 00:17:51,800 >> Померање назад овамо на нашу плату, 216 00:17:51,800 --> 00:17:54,550 Већ смо добили наш * фајл поток отворен за нас. 217 00:17:54,550 --> 00:17:57,810 То је оно што ова прва линија ради, то отвара стафф.цсв фајл, 218 00:17:57,810 --> 00:18:01,690 он га отвара у Аппенд моду, и све што је остало да урадимо јесте 219 00:18:01,690 --> 00:18:08,640 напише структуру запослених у датотеци. 220 00:18:08,640 --> 00:18:10,870 И, да видимо, да ли желите да користите иПад? 221 00:18:10,870 --> 00:18:17,900 Ја ћу користити иПад. Имамо празнину - нека се ово стави на сто, тако да могу да пишем мало боље - 222 00:18:17,900 --> 00:18:33,680 поништи запосли и узима у једној речи, а структура запослених зове с. 223 00:18:33,680 --> 00:18:44,120 Имам своје протезу, имамо нашу ФИЛЕ * зове фајл, 224 00:18:44,120 --> 00:18:48,380 имамо фопен линију дато нама, 225 00:18:48,380 --> 00:18:51,890 и ја ћу га написати као тачке, јер је већ у ПЕДИА. 226 00:18:51,890 --> 00:19:00,530 А онда на нашем следећем реду, идемо да направимо позив иф 227 00:19:00,530 --> 00:19:03,700 и ми ћемо проћи у фајлу који желимо да штампате, 228 00:19:03,700 --> 00:19:10,290 а онда наш формат стринг, који - 229 00:19:10,290 --> 00:19:14,300 Ја ћу вас момци реците ми како то изгледа. 230 00:19:14,300 --> 00:19:20,500 Како о вама, Стела? Да ли знате шта је први део формата низа изгледа? 231 00:19:20,500 --> 00:19:24,270 [Стелла] Нисам сигуран. >> Слободно питајте Јимми. 232 00:19:24,270 --> 00:19:27,690 Да ли знате, Јимми? 233 00:19:27,690 --> 00:19:31,000 [Џими] Да је само бити последњи? Не знам. Нисам сасвим сигуран. 234 00:19:31,000 --> 00:19:39,020 >> Реду. Шта кажеш, да ли неко да ово тачно на испиту? 235 00:19:39,020 --> 00:19:41,770 Но реду. 236 00:19:41,770 --> 00:19:47,920 Испада да је овде све што треба да урадите је да желимо сваки део нашег особља структуре 237 00:19:47,920 --> 00:19:53,290 да се штампа као стринг у нашем датотеке. 238 00:19:53,290 --> 00:19:59,900 Ми само користимо стринг супституција лику три различита пута, јер имамо презиме 239 00:19:59,900 --> 00:20:07,160 следи зарез, онда прво име праћено зарезом, 240 00:20:07,160 --> 00:20:12,430 и онда на крају е-маил адреса која следи - што није 241 00:20:12,430 --> 00:20:15,140 постављања на мом екрану - али то је праћено нови ред карактера. 242 00:20:15,140 --> 00:20:20,060 Тако да ћу написати само доле. 243 00:20:20,060 --> 00:20:23,560 А онда следи наш формат стринг, 244 00:20:23,560 --> 00:20:27,880 имамо само замене, које смо приступили помоћу дот нотацију 245 00:20:27,880 --> 00:20:31,370 које смо видели у проблему сету 3. 246 00:20:31,370 --> 00:20:48,820 Можемо користити с.ласт, с.фирст и с.емаил 247 00:20:48,820 --> 00:20:58,990 да замени у те три вредности у нашој формата низа. 248 00:20:58,990 --> 00:21:06,190 Па како је то иде? Смисла? 249 00:21:06,190 --> 00:21:09,700 Да? Не? Вероватно? Ок. 250 00:21:09,700 --> 00:21:14,180 >> Коначна ствар коју смо урадили пошто смо штампа и након што смо отворили нашу датотеку: 251 00:21:14,180 --> 00:21:17,370 кад смо отворили фајл, увек имамо на уму да бисте га затворили. 252 00:21:17,370 --> 00:21:19,430 Јер иначе ћемо завршити цури меморије, 253 00:21:19,430 --> 00:21:22,500 користи се фајл-дескрипторе. 254 00:21:22,500 --> 00:21:25,950 Дакле, да бисте га затворили, чија је функција да користимо? Данијел? 255 00:21:25,950 --> 00:21:30,120 [Данијел] фцлосе? >> Фцлосе, тачно. 256 00:21:30,120 --> 00:21:37,520 Дакле, последњи део овог проблема је да се правилно затворите фајл, користећи фцлосе функцију, 257 00:21:37,520 --> 00:21:40,370 који само изгледа тако. 258 00:21:40,370 --> 00:21:43,880 Не превише луд. 259 00:21:43,880 --> 00:21:46,990 Кул. 260 00:21:46,990 --> 00:21:49,520 Дакле, то је проблем 33 на квизу. 261 00:21:49,520 --> 00:21:52,480 Имаћемо сигурно више фајл И / О долази. 262 00:21:52,480 --> 00:21:55,130 Ми ћемо учинити нешто више у предавању данас, или у одељку данас, 263 00:21:55,130 --> 00:22:01,710 јер то је оно што ће се формирати већину овог предстојећег псет. 264 00:22:01,710 --> 00:22:05,020 Идемо даље са квизу у овом тренутку. Да? 265 00:22:05,020 --> 00:22:10,880 >> [Шарлот]] Зашто фцлосе (датотека) уместо фцлосе (стафф.цсв)? 266 00:22:10,880 --> 00:22:19,100 >> Ах. Јер испада да је - па се поставља питање, што је велики један, 267 00:22:19,100 --> 00:22:27,800 Зато, када пишемо фцлосе, ми писање фцлосе (датотека) стар променљиву 268 00:22:27,800 --> 00:22:33,680 за разлику од имена датотеке, стафф.цсв? Да ли је то тачно? Да. 269 00:22:33,680 --> 00:22:39,570 Дакле, хајде да погледамо. Ако бих се вратите на мој лаптоп, 270 00:22:39,570 --> 00:22:45,040 и погледајмо на фцлосе функцију. 271 00:22:45,040 --> 00:22:51,460 Дакле фцлосе функција затвара ток и потребно је у показивача до потока који желимо да се затвори, 272 00:22:51,460 --> 00:22:57,010 за разлику од стварног имена датотеке које желите да затворите. 273 00:22:57,010 --> 00:23:01,620 А то је зато што се иза сцене, када упутите позив фопен, 274 00:23:01,620 --> 00:23:12,020 када отворите датотеку, заправо додељивање меморије за складиштење информација о фајлу. 275 00:23:12,020 --> 00:23:16,380 Дакле, имате фајл показивач који има информације о фајлу, 276 00:23:16,380 --> 00:23:23,080 као што је отворен, његова величина, где се тренутно налазе у датотеци, 277 00:23:23,080 --> 00:23:29,100 тако да можете да читање и писање позиве том месту у фајлу. 278 00:23:29,100 --> 00:23:38,060 Можете завршити затварање показивача уместо затварања датотеке име. 279 00:23:38,060 --> 00:23:48,990 >> Да? [Данијел] Дакле, да би користили плату, да ли би рекли - како то добије унос корисника? 280 00:23:48,990 --> 00:23:53,830 Да ли иф понашају као ГетСтринг у смислу да ћу чекати корисничког уноса 281 00:23:53,830 --> 00:23:57,180 и замолите да куцате ово - или чекају да куцате ове три ствари? 282 00:23:57,180 --> 00:24:00,480 Или морате да користите нешто да спроведе плату? 283 00:24:00,480 --> 00:24:04,100 >> Да. Дакле, ми нисмо - питање је, како смо добили унос корисника 284 00:24:04,100 --> 00:24:09,220 у циљу спровођења плату? И шта имамо овде је саговорник за изнајмљивање, 285 00:24:09,220 --> 00:24:17,690 донесен у овом особља струцт са свим подацима који су ускладиштени у струцт већ. 286 00:24:17,690 --> 00:24:22,990 Дакле, иф је у стању да напише само да податке директно у датотеку. 287 00:24:22,990 --> 00:24:25,690 Нема чекања корисничког уноса. 288 00:24:25,690 --> 00:24:32,110 Корисник је већ дао допринос тако га правилно стављање у овом особља струцт. 289 00:24:32,110 --> 00:24:36,510 И ствари, наравно, да ли би се сломити ако било који од ових показивача били нулл, 290 00:24:36,510 --> 00:24:40,370 па смо се помицати овде и гледамо нашу струцт. 291 00:24:40,370 --> 00:24:43,640 Имамо ниске последњи, жица, жица прво поште. 292 00:24:43,640 --> 00:24:48,530 Сада знамо да сви они стварно, испод хаубе, су цхар * променљиве. 293 00:24:48,530 --> 00:24:53,470 То може или не може бити усмерена на нулл. 294 00:24:53,470 --> 00:24:55,800 Они могу бити усмерена на меморију на гомили, 295 00:24:55,800 --> 00:24:59,650 Можда меморије на стек. 296 00:24:59,650 --> 00:25:04,580 Ми стварно не знам, али ако било који од ових показивача су нула, или неважећа, 297 00:25:04,580 --> 00:25:08,120 да то ће сигурно срушити нашу функцију запосли. 298 00:25:08,120 --> 00:25:11,050 То је нешто што је мало изван оквира испита. 299 00:25:11,050 --> 00:25:16,440 Нисмо бриге око тога. 300 00:25:16,440 --> 00:25:22,170 Сјајно. Ок. Дакле, креће на из квиза. 301 00:25:22,170 --> 00:25:25,760 >> Хајде да затворимо овог момка, а ми ћемо да погледамо псет 4. 302 00:25:25,760 --> 00:25:34,700 Дакле, ако ви погледате псет спецификације, када можете да приступите, цс50.нет/куиззес, 303 00:25:34,700 --> 00:25:42,730 ћемо да прођемо кроз неколико проблема одељка данас. 304 00:25:42,730 --> 00:25:52,240 Ја скролујете доле - део питања почиње на трећој страници псет спец. 305 00:25:52,240 --> 00:25:57,800 И први део вас пита да иду и гледају на кратко преусмерава и цеви. 306 00:25:57,800 --> 00:26:02,820 Која је врста супер кратак, показује неке нове, лепе командне линије трикове које можете да користите. 307 00:26:02,820 --> 00:26:06,050 И онда имамо неколико питања за вас као добро. 308 00:26:06,050 --> 00:26:10,860 Ово прво питање о потока, на који иф пише по дефаулту, 309 00:26:10,860 --> 00:26:15,920 врста дотакли смо на само мало пре тренутак. 310 00:26:15,920 --> 00:26:22,380 То иф да смо само разговарали узима у потоку ФИЛЕ * као свој аргумент. 311 00:26:22,380 --> 00:26:26,580 фцлосе узима у потоку ФИЛЕ * као и, 312 00:26:26,580 --> 00:26:32,660 а повратна вредност фопен вам даје ФИЛЕ * ток, као добро. 313 00:26:32,660 --> 00:26:36,060 Разлог нисмо видели оне раније, када смо се већ бавили принтф 314 00:26:36,060 --> 00:26:39,450 је зато принтф има подразумевани ток. 315 00:26:39,450 --> 00:26:41,810 И подразумевани ток на који се пише 316 00:26:41,810 --> 00:26:45,190 ћете сазнати о томе у кратком. 317 00:26:45,190 --> 00:26:50,080 Дакле, дефинитивно погледајте на њега. 318 00:26:50,080 --> 00:26:53,010 >> У одељку данашњем ћемо разговарати мало о ГДБ, 319 00:26:53,010 --> 00:26:57,720 јер је више упознати сте са њим, више пракса сте добили уз њега, 320 00:26:57,720 --> 00:27:01,390 боље могућности ћете бити заиста ловити грешке у свом коду. 321 00:27:01,390 --> 00:27:05,540 Ово убрзава процес дебаговања се страховито. 322 00:27:05,540 --> 00:27:09,230 Дакле, помоћу иф, сваки пут када то морате да компајлирате свој код, 323 00:27:09,230 --> 00:27:13,000 морате да га поново покренете, понекад морате да кретати принтф позив, 324 00:27:13,000 --> 00:27:17,100 коментар из кода, то траје само неко време. 325 00:27:17,100 --> 00:27:20,850 Наш циљ је да покуша и убеди вас да са ГДБ, у суштини могу 326 00:27:20,850 --> 00:27:26,810 принтф ништа у било ком тренутку у свом коду и да никада не морате да га компајлирате. 327 00:27:26,810 --> 00:27:35,120 Ви никада нећете морати да започне и води нагађања где принтф следећи. 328 00:27:35,120 --> 00:27:40,910 Прва ствар коју треба да урадите је да копирате ову линију и добити код одељка искључивање Интернету. 329 00:27:40,910 --> 00:27:47,530 Ја копирање ову линију кода који каже, "вгет хттп://цдн.цс50.нет". 330 00:27:47,530 --> 00:27:49,510 Ја ћу да га копирали. 331 00:27:49,510 --> 00:27:55,950 Ја ћу да одем до мог апарата, умањите тако да можете видети шта радим, 332 00:27:55,950 --> 00:28:01,890 лепљење га тамо, и кад сам ударио Ентер, ово вгет команда буквално веб добити. 333 00:28:01,890 --> 00:28:06,210 То ће да се сруши овај фајл искључивање Интернета, 334 00:28:06,210 --> 00:28:11,790 и то ће га сачувате у текућем директоријуму. 335 00:28:11,790 --> 00:28:21,630 Сада, ако сам списак мој тренутни директоријум можете видети да сам добио ову сецтион5.зип фајл унутра. 336 00:28:21,630 --> 00:28:25,260 Начин да се носе са тим момком је да га унзип, 337 00:28:25,260 --> 00:28:27,650 што можете да урадите у командној линији, баш овако. 338 00:28:27,650 --> 00:28:31,880 Сецтион5.зип. 339 00:28:31,880 --> 00:28:36,980 То ће га распаковати, креирајте фолдер за мене, 340 00:28:36,980 --> 00:28:40,410 надувати све садржаја, ставите их тамо. 341 00:28:40,410 --> 00:28:47,410 Тако да сада могу да одем у рубрици 5 директоријума помоћу цд команду. 342 00:28:47,410 --> 00:28:58,310 Обришите екран помоћу јасно. Дакле, јасно је екран. 343 00:28:58,310 --> 00:29:02,280 Сада имам лепу чисту терминал да се баве. 344 00:29:02,280 --> 00:29:06,200 >> Сада, ако сам списак свих датотека које видим у овом директоријуму, 345 00:29:06,200 --> 00:29:12,270 видиш да имам четири датотеке: бугги1, бугги2, бугги3 и бугги4. 346 00:29:12,270 --> 00:29:16,180 Такође сам добио своје одговарајуће. Ц фајлове. 347 00:29:16,180 --> 00:29:20,400 Нећемо гледати на ц фајлове. За сада. 348 00:29:20,400 --> 00:29:24,140 Уместо тога, ми ћемо да их користимо када смо отворили ГДБ. 349 00:29:24,140 --> 00:29:28,220 Смо их држали око, тако да имамо приступ стварној изворни код, када користимо гдб, 350 00:29:28,220 --> 00:29:32,740 али је циљ овог дела одељка је да пртљати около са ГДБ 351 00:29:32,740 --> 00:29:40,370 и видимо како можемо да га користимо да схватим шта се дешава у реду са сваком од ова четири бугги програма. 352 00:29:40,370 --> 00:29:43,380 Дакле, ми ћемо само на око соби заиста брзо, 353 00:29:43,380 --> 00:29:47,000 и ја ћу да питам некога да покрене један од бугги програма, 354 00:29:47,000 --> 00:29:54,730 а онда ћемо ићи као група преко ГДБ, па ћемо видети шта можемо да урадимо да поправимо ове програме, 355 00:29:54,730 --> 00:29:58,460 или да се барем идентификују шта се дешава лоше у сваком од њих. 356 00:29:58,460 --> 00:30:04,760 Почнимо овде са Данила. Хоћеш ли покренути бугги1? Хајде да видимо шта се дешава. 357 00:30:04,760 --> 00:30:09,470 [Данијел] Она каже да је апликација грешка. >> Да. Управо тако. 358 00:30:09,470 --> 00:30:12,460 Дакле, ако сам покренути бугги1, ја добијем СЕГ грешку. 359 00:30:12,460 --> 00:30:16,210 У овом тренутку, могао сам да одем и отвори бугги1.ц, 360 00:30:16,210 --> 00:30:19,450 покуша да схвати шта се дешава у реду, 361 00:30:19,450 --> 00:30:22,000 али један од најважнијих ствари неподношљив о овом сегменту грешке грешке 362 00:30:22,000 --> 00:30:27,610 је да вас не кажем шта линија програма ствари заиста пошло наопако и поломио. 363 00:30:27,610 --> 00:30:29,880 Некако морате да погледате кода 364 00:30:29,880 --> 00:30:33,990 и схватити користећи погоди и проверите или принтф да види шта се дешава у реду. 365 00:30:33,990 --> 00:30:37,840 Једна од најбољих ствари о ГДБ је да је стварно лако 366 00:30:37,840 --> 00:30:42,170 да схватим линију на којој ваш програм сруши. 367 00:30:42,170 --> 00:30:46,160 То је потпуно вреди да га користи, чак и ако је само због тога. 368 00:30:46,160 --> 00:30:56,190 Тако да подигне ГДБ, куцам ГДБ, а онда сам му дати путању до програма којег желим да бежим. 369 00:30:56,190 --> 00:31:01,960 Ево куцам ГДБ ./бугги1. 370 00:31:01,960 --> 00:31:06,600 Хит Ентер. Даје ми све ове информације ауторских права, 371 00:31:06,600 --> 00:31:13,000 и овде ћете видети ову линију која гласи: "Читање симболе из / хоме / 372 00:31:13,000 --> 00:31:17,680 јхарвард/сецтион5/бугги1. " 373 00:31:17,680 --> 00:31:22,060 И ако све иде добро, видећете да одштампате поруку која изгледа овако. 374 00:31:22,060 --> 00:31:25,500 То ће прочитати симболе, то ће рећи "Ја читам симболе из извршну датотеку" 375 00:31:25,500 --> 00:31:29,900 а онда ће се овај "урадио" поруку овде. 376 00:31:29,900 --> 00:31:35,410 Ако видите неку другу варијанту ово, или видиш да није могао да пронађе симболе 377 00:31:35,410 --> 00:31:41,460 или нешто слично, што значи да сте управо нису саставили исправно своју извршну. 378 00:31:41,460 --> 00:31:49,980 Када смо саставити програме за коришћење са ГДБ, морамо да користимо тај специјалне г заставу, 379 00:31:49,980 --> 00:31:54,540 и то је урадио по дефаулту ако компајлирање програма, само куцањем направити 380 00:31:54,540 --> 00:31:59,320 или да луд или да се опорави, било од њих. 381 00:31:59,320 --> 00:32:07,800 Али, ако сте ручно састављање са кланг, онда ћете морати да иде у, а укључују да-г заставу. 382 00:32:07,800 --> 00:32:10,310 >> У овом тренутку, сада када имамо ГДБ за унос, 383 00:32:10,310 --> 00:32:12,310 то је прилично једноставно да покренете програм. 384 00:32:12,310 --> 00:32:19,740 Можемо да упишете вожњу, или можемо да Типе Р. 385 00:32:19,740 --> 00:32:22,820 Већина ГДБ команде може бити скраћен. 386 00:32:22,820 --> 00:32:25,940 Обично на само један или пар слова, што је прилично лепо. 387 00:32:25,940 --> 00:32:30,980 Дакле Саад, ако откуцате Р и ударио Ентер, шта се дешава? 388 00:32:30,980 --> 00:32:39,390 [Саад] Имам СИГСЕГВ, сегментација грешка и онда се све то Гоббледигоок. 389 00:32:39,390 --> 00:32:43,650 >> Да. 390 00:32:43,650 --> 00:32:47,990 Као што видимо на екрану сада, и као Саад рекао, 391 00:32:47,990 --> 00:32:53,430 када куцамо серију или Р и ударио Ентер, ми смо још увек добити исту грешку сек. 392 00:32:53,430 --> 00:32:55,830 Дакле, коришћењем ГДБ не решава наш проблем. 393 00:32:55,830 --> 00:32:59,120 Али то нам даје неку Гоббледигоок, и испоставило се да је то Гоббледигоок 394 00:32:59,120 --> 00:33:03,080 стварно нам каже где се то дешава. 395 00:33:03,080 --> 00:33:10,680 Да рашчланити ово мало, ово први бит је функција у којој све иде наопако. 396 00:33:10,680 --> 00:33:20,270 Постоји тај __ стрцмп_ссе4_2, и то нам говори да се то дешава у овом фајлу 397 00:33:20,270 --> 00:33:29,450 позвао сисдепс/и386, све то, опет, нека врста збрке - али линија 254. 398 00:33:29,450 --> 00:33:31,670 То је врста тешко рашчланити. Обично када видите ствари овако, 399 00:33:31,670 --> 00:33:38,770 то значи да је то сег Фаултинг у једном од система библиотека. 400 00:33:38,770 --> 00:33:43,220 Тако нешто са стрцмп. Ви сте видели стрцмп раније. 401 00:33:43,220 --> 00:33:52,730 Није превише лудо, али да ли то значи да стрцмп сломљена или да постоји проблем са стрцмп? 402 00:33:52,730 --> 00:33:57,110 Шта ти мислиш, Александра? 403 00:33:57,110 --> 00:34:04,890 [Александар] Да ли је то - је 254 линија? И - не бинарни, али то није њихова плафони, 404 00:34:04,890 --> 00:34:10,590 а онда је један језик за сваку функцију. Да ли је то 254 у тој функцији, или -? 405 00:34:10,590 --> 00:34:21,460 >> То је линија 254. Изгледа као у овом фајлу. С, тако да је монтажа код вероватно. 406 00:34:21,460 --> 00:34:25,949 >> Али, претпостављам хитније ствар је, јер смо стечен СЕГ грешку, 407 00:34:25,949 --> 00:34:29,960 и изгледа као да долази из стрцмп функције, 408 00:34:29,960 --> 00:34:38,030 да ли то значи, онда, да стрцмп је сломљен? 409 00:34:38,030 --> 00:34:42,290 То не би требало, надам се. Дакле, само зато што имате сегментирања грешку 410 00:34:42,290 --> 00:34:49,480 у једној од функција система, обично то значи да сте управо не зове исправно. 411 00:34:49,480 --> 00:34:52,440 Најбржи ствар да схватим шта се заправо дешава 412 00:34:52,440 --> 00:34:55,500 када видите нешто лудо овако, кад видиш СЕГ грешку, 413 00:34:55,500 --> 00:34:59,800 нарочито ако имате програм који је користећи више него само главни, 414 00:34:59,800 --> 00:35:03,570 је да се користи Бацктраце. 415 00:35:03,570 --> 00:35:13,080 Ја скратим Бацктраце писањем Бт, насупрот целе речи Бацктраце. 416 00:35:13,080 --> 00:35:16,510 Али Шарлота, шта се дешава када откуцате БТ и притисните Ентер? 417 00:35:16,510 --> 00:35:23,200 [Шарлот] То ми показује две линије, линија 0 и 1 ред. 418 00:35:23,200 --> 00:35:26,150 >> Да. Дакле, линија 0 и 1 ред. 419 00:35:26,150 --> 00:35:34,560 То су стварни стек оквири који су тренутно у игри када ваш програм срушио. 420 00:35:34,560 --> 00:35:42,230 Полазећи од највишег оквира, оквира 0 и иде до дна највише, што је рам 1. 421 00:35:42,230 --> 00:35:45,140 Наш највиши оквир је стрцмп оквир. 422 00:35:45,140 --> 00:35:50,080 Можете мислити о овоме као сличан том проблему смо само радили на квизу са показивачима, 423 00:35:50,080 --> 00:35:54,890 где смо заменили оквир стека на врху главног стек оквира, 424 00:35:54,890 --> 00:35:59,700 и ми смо имали променљиве које своп је користе на врху варијабли које главни је користе. 425 00:35:59,700 --> 00:36:08,440 Овде је наша несрећа се десило у нашем стрцмп функцији, која је добила наша основна функција, 426 00:36:08,440 --> 00:36:14,370 и повратно праћење нам даје не само функције у којима се ствари пропале, 427 00:36:14,370 --> 00:36:16,440 али то нам говори где је све звао из. 428 00:36:16,440 --> 00:36:18,830 Дакле, ако сам помицати по мало више на десно, 429 00:36:18,830 --> 00:36:26,110 можемо видети да, да, ми смо били на линији 254 овог стрцмп-ссе4.с фајлу. 430 00:36:26,110 --> 00:36:32,540 Али позив је направљен на бугги1.ц, линије 6. 431 00:36:32,540 --> 00:36:35,960 Значи можемо да урадимо - је можемо само да проверим и видим шта се дешава 432 00:36:35,960 --> 00:36:39,930 у бугги1.ц, линије 6. 433 00:36:39,930 --> 00:36:43,780 Опет, постоји неколико начина да се то уради. Један је да изађете из ГДБ 434 00:36:43,780 --> 00:36:49,460 или имају ваш код отворити у другом прозору и цросс референце. 435 00:36:49,460 --> 00:36:54,740 То, само по себи, је прилично згодан, јер сада ако сте на радног времена 436 00:36:54,740 --> 00:36:57,220 а ти имаш СЕГ грешку и ваш ТФ је питате где је све било разбијање, 437 00:36:57,220 --> 00:36:59,710 можете само рећи: "Ох, линија 6 Ја не знам шта се дешава., 438 00:36:59,710 --> 00:37:03,670 али нешто о линији 6 изазива мој програм да се пробије. " 439 00:37:03,670 --> 00:37:10,430 Други начин да то урадите је да можете да користите ову команду зове листа у ГДБ. 440 00:37:10,430 --> 00:37:13,650 Такође можете да га скратили са л. 441 00:37:13,650 --> 00:37:18,910 Дакле, ако смо погодили л, шта ми овде? 442 00:37:18,910 --> 00:37:21,160 Ми смо добили гомилу чудне ствари. 443 00:37:21,160 --> 00:37:26,030 Ово је стварна асемблерског кода 444 00:37:26,030 --> 00:37:29,860 који је у стрцмп_ссе4_2. 445 00:37:29,860 --> 00:37:32,440 Ово изгледа врста функи, 446 00:37:32,440 --> 00:37:36,520 а разлог ми смо све то је зато сада, 447 00:37:36,520 --> 00:37:40,160 ГДБ нас има у оквиру 0. 448 00:37:40,160 --> 00:37:43,070 >> Дакле, кад год гледамо варијабле, сваки пут гледамо изворног кода, 449 00:37:43,070 --> 00:37:50,530 гледамо кода који се односи на стек оквира тренутно смо унутра 450 00:37:50,530 --> 00:37:53,200 Дакле, да би добио ништа смисла, морамо да 451 00:37:53,200 --> 00:37:57,070 пређете на стек оквир који чини више смисла. 452 00:37:57,070 --> 00:38:00,180 У овом случају, главни стек оквир би мало више смисла, 453 00:38:00,180 --> 00:38:02,680 јер то је заправо код који смо писали. 454 00:38:02,680 --> 00:38:05,330 Није стрцмп код. 455 00:38:05,330 --> 00:38:08,650 Начин на који се креће између оквира, у овом случају, јер имамо два, 456 00:38:08,650 --> 00:38:10,430 имамо 0 и 1, 457 00:38:10,430 --> 00:38:13,650 радите то са горе и доле команди. 458 00:38:13,650 --> 00:38:18,480 Ако сам помери један оквир, 459 00:38:18,480 --> 00:38:21,770 сад сам у главном стек оквира. 460 00:38:21,770 --> 00:38:24,330 Ја могу да се померим на доле да се вратим где сам био, 461 00:38:24,330 --> 00:38:32,830 иди опет, идите опет доле, и иди поново. 462 00:38:32,830 --> 00:38:39,750 Ако сте икада урадити свој програм у ГДБ, добијате судар, добићете Бацктраце, 463 00:38:39,750 --> 00:38:42,380 и видећете да је у неком фајлу који не знате шта се дешава. 464 00:38:42,380 --> 00:38:45,460 Пробај листа, код не изгледа познато, 465 00:38:45,460 --> 00:38:48,150 погледамо своје оквире и схватити где си. 466 00:38:48,150 --> 00:38:51,010 Ти си вероватно у погрешном стек оквира. 467 00:38:51,010 --> 00:38:58,760 Или барем да сте у стек оквира који није онај који заиста можете дебуг. 468 00:38:58,760 --> 00:39:03,110 Сада када смо у одговарајућем стек оквира, ми смо у главни, 469 00:39:03,110 --> 00:39:08,100 сада можемо користити команду листу да схватим шта је била линија. 470 00:39:08,100 --> 00:39:13,590 И можете видети, то је штампан за нас овде. 471 00:39:13,590 --> 00:39:19,470 Али можемо погодио навести све исто, и лист нам даје овај леп испис 472 00:39:19,470 --> 00:39:23,920 стварног изворног кода који се дешава овде. 473 00:39:23,920 --> 00:39:26,420 >> Конкретно, можемо да погледамо на линији 6. 474 00:39:26,420 --> 00:39:29,330 Можемо видети шта се дешава овде. 475 00:39:29,330 --> 00:39:31,250 И изгледа као да правиш стринг поређења 476 00:39:31,250 --> 00:39:41,050 између стринг "ЦС50 стена" и аргв [1]. 477 00:39:41,050 --> 00:39:45,700 Нешто о томе је пад система. 478 00:39:45,700 --> 00:39:54,120 Па Мисси, да ли имате било какве мисли о томе шта би се могло дешава овде? 479 00:39:54,120 --> 00:39:59,400 [Мисси] Ја не знам зашто је то пад система. >> Не знам зашто се то пада? 480 00:39:59,400 --> 00:40:02,700 Џими, све мисли? 481 00:40:02,700 --> 00:40:06,240 [Џими] Нисам потпуно сигуран, али последњи пут користили смо низ поређења, 482 00:40:06,240 --> 00:40:10,260 или стрцмп, имали смо као три различита случаја под њега. 483 00:40:10,260 --> 00:40:12,800 Нисмо имали ==, ја не мислим, у праву у том првом реду. 484 00:40:12,800 --> 00:40:16,700 Уместо да је подељена на три, а један је био == 0, 485 00:40:16,700 --> 00:40:19,910 један је <0, ја мислим, и један је> 0. 486 00:40:19,910 --> 00:40:22,590 Можда тако нешто? >> Да. Тако да је ово питање 487 00:40:22,590 --> 00:40:27,200 од радимо исправно поређење? 488 00:40:27,200 --> 00:40:31,660 Стелла? Било која мисли? 489 00:40:31,660 --> 00:40:38,110 [Стелла] Нисам сигуран. >> Нисам сигуран. Данијел? Мисли? Ок. 490 00:40:38,110 --> 00:40:44,770 Испоставило се шта се дешава овде је када смо водили програм 491 00:40:44,770 --> 00:40:48,370 и ми смо добили СЕГ грешку, када сте покренули програм за први пут, Даниел 492 00:40:48,370 --> 00:40:50,800 Да ли сте му дати неке аргументе командне линије? 493 00:40:50,800 --> 00:40:58,420 [Данијел] Но >> Но У том случају, оно што је вредност аргв [1]? 494 00:40:58,420 --> 00:41:00,920 >> Нема вредност. >> Реду. 495 00:41:00,920 --> 00:41:06,120 Па, не постоји одговарајућа вредност ниске. 496 00:41:06,120 --> 00:41:10,780 Али, постоји нека вредност. Која је вредност која добија складишти тамо? 497 00:41:10,780 --> 00:41:15,130 >> Смеће вредност? >> Или је смеће вредност или, у овом случају, 498 00:41:15,130 --> 00:41:19,930 крај аргв низа увек престаје нулл. 499 00:41:19,930 --> 00:41:26,050 Дакле, шта се заправо добио чувају тамо је нулл. 500 00:41:26,050 --> 00:41:30,810 Други начин да се реши ово, уместо да размишља кроз, 501 00:41:30,810 --> 00:41:33,420 је да покушамо штампа га. 502 00:41:33,420 --> 00:41:35,880 Ово је место где сам рекао да је коришћење ГДБ је супер, 503 00:41:35,880 --> 00:41:40,640 јер можете одштампати све променљиве, све вредности које желите 504 00:41:40,640 --> 00:41:43,230 Коришћењем овог згодан-кицошки стр команду. 505 00:41:43,230 --> 00:41:48,520 Дакле, ако укуцамо П и онда сам упишите вредност променљиве или име променљиве, 506 00:41:48,520 --> 00:41:55,320 рецимо, аргц, видим да је аргц 1. 507 00:41:55,320 --> 00:42:01,830 Ако желим да одштампате аргв [0], ја могу то да урадим само тако. 508 00:42:01,830 --> 00:42:04,840 И као што смо видели, аргв [0] је увек име програма, 509 00:42:04,840 --> 00:42:06,910 Увек име извршне. 510 00:42:06,910 --> 00:42:09,740 Овде можете видети да има пуну путању. 511 00:42:09,740 --> 00:42:15,920 Такође можете да одштампате аргв [1] и види шта се дешава. 512 00:42:15,920 --> 00:42:20,890 >> Овде имамо ту врсту мистичног вредности. 513 00:42:20,890 --> 00:42:23,890 Имамо ову 0к0. 514 00:42:23,890 --> 00:42:27,850 Запамтите, на почетку мандата, када смо разговарали о хексадецималних бројева? 515 00:42:27,850 --> 00:42:34,680 Или да мало питање на крају псет 0 о томе како да заступа 50 у хек? 516 00:42:34,680 --> 00:42:39,410 Начин пишемо хексадецималне бројеве у ЦС, само да се не мешају се 517 00:42:39,410 --> 00:42:46,080 са децимални бројеви, је да смо их увек префикс са 0к. 518 00:42:46,080 --> 00:42:51,420 Дакле, ово 0к префикс увек само значи тумачи на следећи број као хексадецимални број, 519 00:42:51,420 --> 00:42:57,400 не као стринг, не као децимални број, а не као бинарни број. 520 00:42:57,400 --> 00:43:02,820 Пошто број 5-0 је важећи број у хексадецимални. 521 00:43:02,820 --> 00:43:06,240 И то је број у децималном, 50. 522 00:43:06,240 --> 00:43:10,050 Дакле, ово је само колико смо дисамбигуате. 523 00:43:10,050 --> 00:43:14,860 Дакле, 0к0 значи хексадецимално 0, што је такође децимално 0, бинарна 0. 524 00:43:14,860 --> 00:43:17,030 То је само вредност 0. 525 00:43:17,030 --> 00:43:22,630 Испоставило се да је то оно нула је, заправо, у меморији. 526 00:43:22,630 --> 00:43:25,940 Нула је само 0. 527 00:43:25,940 --> 00:43:37,010 Овде елеменат чувати на аргв [1] је нулл. 528 00:43:37,010 --> 00:43:45,220 Дакле, ми покушавамо да упоредите нашу "ЦС50 стена" стринг са нултом ниске. 529 00:43:45,220 --> 00:43:48,130 Дакле дереференцинг ништавним, покушавајући да приступите ствари на нулл, 530 00:43:48,130 --> 00:43:55,050 они су обично ће изазвати неку врсту сегментације квара или других лоших ствари које могу да се догоде. 531 00:43:55,050 --> 00:43:59,350 И испада да стрцмп не проверава да види 532 00:43:59,350 --> 00:44:04,340 без обзира да ли или не сте прошли у вредности која је нула. 533 00:44:04,340 --> 00:44:06,370 Уместо тога, она само иде напред, покушава да уради свој посао, 534 00:44:06,370 --> 00:44:14,640 и ако сег недостатке, она сег грешке, и то је твој проблем. Мораш да идеш поправити. 535 00:44:14,640 --> 00:44:19,730 Стварно брзо, како бисмо решили овај проблем? Цхарлотте? 536 00:44:19,730 --> 00:44:23,540 [Шарлот] Можете да проверите да ли користите. 537 00:44:23,540 --> 00:44:32,240 Дакле, ако аргв [1] је нула, == 0, а затим се вратите 1, или нешто [неразумљиво]. 538 00:44:32,240 --> 00:44:34,590 >> Да. Дакле, то је један сјајан начин да се то уради, јер можемо проверити да видимо, 539 00:44:34,590 --> 00:44:39,230 вредност ћемо ускоро да пређе у стрцмп, аргв [1], зар нулл? 540 00:44:39,230 --> 00:44:45,830 Ако је нула, онда можемо рећи реду, прекини. 541 00:44:45,830 --> 00:44:49,450 >> Чешћи начин да то урадите је да користите аргц вредност. 542 00:44:49,450 --> 00:44:52,040 Можете видети овде на почетку главног, 543 00:44:52,040 --> 00:44:58,040 изостављен тај први тест смо да смо обично радим кад користимо аргументе командне линије, 544 00:44:58,040 --> 00:45:05,240 а то је да утврди да ли или не наша аргц вредност је оно што смо очекивали. 545 00:45:05,240 --> 00:45:10,290 У овом случају, ми очекујемо најмање два аргумента, 546 00:45:10,290 --> 00:45:13,660 назив програма плус један другог. 547 00:45:13,660 --> 00:45:17,140 Зато смо о томе да користе други аргумент овде. 548 00:45:17,140 --> 00:45:21,350 Дакле, имајући пре неку врсту теста, пре нашег разговора стрцмп 549 00:45:21,350 --> 00:45:37,390 да тестови или не аргв је најмање 2, такође би урадио исту врсту ствари. 550 00:45:37,390 --> 00:45:40,620 Можемо ли да функционише тако што ћете покренути програм поново. 551 00:45:40,620 --> 00:45:45,610 Увек можете поново покренути програм у ГДБ, што је заиста лепо. 552 00:45:45,610 --> 00:45:49,310 Можете да покренете, а када прође у аргументима вашем програму, 553 00:45:49,310 --> 00:45:53,060 их прође када покренете позив, а не када се подигне ГДБ. 554 00:45:53,060 --> 00:45:57,120 На тај начин можете да задржите позивајући свој програм са различитим аргументима сваки пут. 555 00:45:57,120 --> 00:46:08,080 Тако трчите, или опет, могу Типе Р, и да видимо шта ће се десити ако откуцате "здраво". 556 00:46:08,080 --> 00:46:11,140 Увек ће вас питати да ли желите да га покренете из почетка. 557 00:46:11,140 --> 00:46:17,490 Обично, ти не желиш да крене од почетка. 558 00:46:17,490 --> 00:46:25,010 И у овом тренутку, то рестартује поново, он исписује 559 00:46:25,010 --> 00:46:28,920 програм који трчимо, бугги1, са аргументом хелло, 560 00:46:28,920 --> 00:46:32,720 и штампа ову стандардну оут, она каже, "Добићете Д", тужно лице. 561 00:46:32,720 --> 00:46:37,610 Али ми нисмо сег грешку. Он је рекао да је процес изашао нормално. 562 00:46:37,610 --> 00:46:39,900 Тако да изгледа прилично добро. 563 00:46:39,900 --> 00:46:43,050 Нема више сец крив, ми смо направили је прошлост, 564 00:46:43,050 --> 00:46:48,190 тако да изгледа као да је заиста крив сец буба које смо добијали. 565 00:46:48,190 --> 00:46:51,540 Нажалост, то нам говори да смо добијање Д. 566 00:46:51,540 --> 00:46:54,090 >> Можемо да идемо уназад и погледамо кода и видим шта се тамо дешава 567 00:46:54,090 --> 00:46:57,980 да схватим шта је било - зашто нам је говорио да смо добили Д. 568 00:46:57,980 --> 00:47:03,690 Хајде да видимо, овде је ова иф каже да имаш Д. 569 00:47:03,690 --> 00:47:08,540 Ако куцамо списак, као што чувате куцате листу, држи итератинг доле кроз свој програм, 570 00:47:08,540 --> 00:47:10,940 тако да ћу вам показати неколико првих редова вашем програму. 571 00:47:10,940 --> 00:47:15,450 Онда ћу вам показати наредних неколико линија, а следећи комад и следећи комад. 572 00:47:15,450 --> 00:47:18,240 И то ћемо наставити да покушава да иде доле. 573 00:47:18,240 --> 00:47:21,180 И сада ћемо доћи до "построје број 16 је ван опсега." 574 00:47:21,180 --> 00:47:23,940 Јер има само 15 линија. 575 00:47:23,940 --> 00:47:30,310 Ако дођете до ове тачке и ваше питају: "Шта да радим?" можете користити команду помоћи. 576 00:47:30,310 --> 00:47:34,340 Користите помоћ и онда дајте му име команде. 577 00:47:34,340 --> 00:47:36,460 И видиш ГДБ нам даје све овакве ствари. 578 00:47:36,460 --> 00:47:43,870 Он каже, "без аргумената, наводи још десет линије после или око претходном попису. 579 00:47:43,870 --> 00:47:47,920 Списак - набраја десет линија раније - " 580 00:47:47,920 --> 00:47:52,960 Дакле, хајде да покушамо помоћу листе минус. 581 00:47:52,960 --> 00:47:57,000 И да су наведени 10 линија претходна, можете се играти са листом мало. 582 00:47:57,000 --> 00:48:02,330 То можете да урадите листу, листу -, можете чак дати наведете број, као што је листа 8, 583 00:48:02,330 --> 00:48:07,500 и то ће навести 10 линија око линији 8. 584 00:48:07,500 --> 00:48:10,290 И можете видети шта се дешава овде имате једноставан ако другде. 585 00:48:10,290 --> 00:48:13,980 Ако укуцате ЦС50 стене, исписује "Добијате А." 586 00:48:13,980 --> 00:48:16,530 Иначе штампа "Добићете Д." 587 00:48:16,530 --> 00:48:23,770 Штета град. У реду. Да? 588 00:48:23,770 --> 00:48:26,730 >> [Данијел] Дакле, када сам покушао радим ЦС50 стене без наводника, 589 00:48:26,730 --> 00:48:29,290 пише "Добићете Д." 590 00:48:29,290 --> 00:48:32,560 Морао сам на цитате да се то да раде, зашто је то тако? 591 00:48:32,560 --> 00:48:38,490 >> Да. Испада да када - ово је још једна забавно мало малчице - 592 00:48:38,490 --> 00:48:47,900 Када покренете програм, ако га покрене и куцамо на ЦС50 стенама, 593 00:48:47,900 --> 00:48:50,800 баш као Данијел је рекао да јесте, а ти ударио Ентер, 594 00:48:50,800 --> 00:48:52,870 ипак каже да смо добили Д. 595 00:48:52,870 --> 00:48:55,580 А питање је, зашто је ово? 596 00:48:55,580 --> 00:49:02,120 И испоставило се да су оба наша терминал и ГДБ рашчланити их као две засебне аргумената. 597 00:49:02,120 --> 00:49:04,800 Јер када постоји простор, који је подразумевао и 598 00:49:04,800 --> 00:49:08,730 Први аргумент завршен, следећи аргумент о томе да почне. 599 00:49:08,730 --> 00:49:13,260 Начин да се комбинују оне у две или извини, у један аргумент, 600 00:49:13,260 --> 00:49:18,510 је да користите наводнике. 601 00:49:18,510 --> 00:49:29,560 Па сад, ако смо га ставили у наводнике и покрените га поново, добијамо А. 602 00:49:29,560 --> 00:49:38,780 Дакле, само да подсетимо, нема цитира, ЦС50 и стене се анализирати као две одвојене аргумената. 603 00:49:38,780 --> 00:49:45,320 Са наводницима, то је анализирати као један аргумент уопште. 604 00:49:45,320 --> 00:49:53,070 >> То се може видети са Бреакпоинт. 605 00:49:53,070 --> 00:49:54,920 До сада смо били покренут наш програм, и то је био покренут 606 00:49:54,920 --> 00:49:58,230 све док се она сег грешке или Хитс грешку 607 00:49:58,230 --> 00:50:05,930 или док је изашао и све је потпуно у реду. 608 00:50:05,930 --> 00:50:08,360 Ово није нужно најкорисније ствар, јер понекад 609 00:50:08,360 --> 00:50:11,840 имаш грешку у свом програму, али то није то изазива сегментирања грешку. 610 00:50:11,840 --> 00:50:16,950 Није изазива ваш програм да заустави или нешто слично томе. 611 00:50:16,950 --> 00:50:20,730 Начин да се ГДБ да паузирате ваш програм у одређеном тренутку 612 00:50:20,730 --> 00:50:23,260 је да поставите тачку прекида. 613 00:50:23,260 --> 00:50:26,520 Можете да урадите постављањем тачку прекида на име функције 614 00:50:26,520 --> 00:50:30,770 или можете да подесите тачку прекида на одређеном линију кода. 615 00:50:30,770 --> 00:50:34,450 Волим да подесите тачке прекида на имена функција, јер - лако за памћење, 616 00:50:34,450 --> 00:50:37,700 и ако сте заиста тамо и промените свој изворни код се мало, 617 00:50:37,700 --> 00:50:42,020 онда се ваш Бреакпоинт ће заправо остати на истом месту у вашем коду. 618 00:50:42,020 --> 00:50:44,760 Док ако користите линије бројева, и ресорна мењају и бројеви 619 00:50:44,760 --> 00:50:51,740 зато што додате или избришете неки код, а затим ваше тачке прекида су сви тотално зезнуо. 620 00:50:51,740 --> 00:50:58,590 Једна од најчешћих ствари које ја радим је поставити тачку прекида на основну функцију. 621 00:50:58,590 --> 00:51:05,300 Често ћу подигне ГДБ, ја ћу тип Б маин, притисните Ентер, и да ћу поставити тачку прекида 622 00:51:05,300 --> 00:51:10,630 на главном функцијом која само каже: "Зауставите програм чим почну да се приказују" 623 00:51:10,630 --> 00:51:17,960 и на тај начин, када сам се покрећу свој програм са, рецимо, ЦС50 стена као два аргумента 624 00:51:17,960 --> 00:51:24,830 и ударио Ентер, она добија на главну функцију, а завршава на први ред, 625 00:51:24,830 --> 00:51:30,620 пре него што се оцењује стрцмп функцију. 626 00:51:30,620 --> 00:51:34,940 >> Пошто сам застао, сада могу зачепркате около и видим шта се дешава 627 00:51:34,940 --> 00:51:40,250 са свим различитих варијабли које су прошли у свом програму. 628 00:51:40,250 --> 00:51:43,670 Овде сам да одштампате аргц и види шта се дешава. 629 00:51:43,670 --> 00:51:50,030 Видите да је аргц је 3, јер има 3 различите вредности у њему. 630 00:51:50,030 --> 00:51:54,060 То је добио име програма, она је добила први аргумент и други аргумент. 631 00:51:54,060 --> 00:52:09,330 Можемо штампати оне од стране гледајући аргв [0], аргв [1], и аргв [2]. 632 00:52:09,330 --> 00:52:12,030 Тако сада можете видети зашто је ово стрцмп позив ће да пропадне, 633 00:52:12,030 --> 00:52:21,650 јер видиш да ли поделити ЦС50 и стене у две одвојене аргумената. 634 00:52:21,650 --> 00:52:27,250 У овом тренутку, када сте ударио тачку прекида, можете наставити да прођете кроз свој програм 635 00:52:27,250 --> 00:52:32,920 ред по ред, насупрот почиње поново програм. 636 00:52:32,920 --> 00:52:35,520 Дакле, ако не желите да покренете програм поново и само наставите даље одавде, 637 00:52:35,520 --> 00:52:41,970 можете користити команду наставити и даље ће радити програм до краја. 638 00:52:41,970 --> 00:52:45,010 Баш као што је то овде урадио. 639 00:52:45,010 --> 00:52:54,880 Међутим, ако сам поново покрените програм, ЦС50 стена, она погоди опет мој тачку прекида, 640 00:52:54,880 --> 00:52:59,670 и овај пут, ако ја не желим само да одем скроз кроз остатак програма, 641 00:52:59,670 --> 00:53:08,040 Ја могу да користе следећу команду, што сам и скратили са н. 642 00:53:08,040 --> 00:53:12,960 И ово ће корак кроз програм линију по линију. 643 00:53:12,960 --> 00:53:17,530 Дакле, можете гледати како ствари извршавају, као променљиве промене, како ствари се ажурира. 644 00:53:17,530 --> 00:53:21,550 Који је прилично лепо. 645 00:53:21,550 --> 00:53:26,570 Друга ствар је кул него понављајући исту команду изнова и изнова и изнова, 646 00:53:26,570 --> 00:53:30,670 ако само притисните Ентер - ево видиш ја нисам откуцао у чему - 647 00:53:30,670 --> 00:53:33,780 ако сам ударио Ентер, то ће поновити претходну команду, 648 00:53:33,780 --> 00:53:36,900 или претходни ГДБ команда која сам ставио унутра 649 00:53:36,900 --> 00:53:56,000 Могу да ударају Ентер и то ће задржати корак кроз мој код линију по линију. 650 00:53:56,000 --> 00:53:59,310 Ја бих охрабрити ви да идете проверите остале програме Бугги као добро. 651 00:53:59,310 --> 00:54:01,330 Ми немамо времена да се кроз све њих данас у одељку. 652 00:54:01,330 --> 00:54:05,890 Изворни код је тамо, тако да можете да некако видимо шта се дешава 653 00:54:05,890 --> 00:54:07,730 иза сцене ако се стварно заглави, 654 00:54:07,730 --> 00:54:11,940 али у најмању руку, само вежбају бутовања ГДБ, 655 00:54:11,940 --> 00:54:13,940 покретања програма све док се не сломи на тебе, 656 00:54:13,940 --> 00:54:18,260 добијање Бацктраце, схватите шта функционишу судар је био у, 657 00:54:18,260 --> 00:54:24,450 шта је линија на, штампање неке променљиве вредности, 658 00:54:24,450 --> 00:54:30,140 само тако да добију осећај за то, јер то ће заиста помоћи да иде напред. 659 00:54:30,140 --> 00:54:36,340 У овом тренутку, ми ћемо престати из ГДБ, коју не користите отказ или само К. 660 00:54:36,340 --> 00:54:40,460 Ако је ваш програм је усред трчања, ипак, и није узбуђена, 661 00:54:40,460 --> 00:54:43,510 увек ће вас питати: "Јесте ли сигурни да заиста желите да изађете?" 662 00:54:43,510 --> 00:54:48,770 Можете само да удари. 663 00:54:48,770 --> 00:54:55,250 >> Сада ћемо да погледамо следећи проблем који имамо, а то је мачка програма. 664 00:54:55,250 --> 00:54:59,880 Ако гледате краткорочно на преусмерава и цеви, видећете да је Томми користи овај програм 665 00:54:59,880 --> 00:55:07,540 да у основи штампа све излаз датотеке на екрану. 666 00:55:07,540 --> 00:55:12,660 Дакле, ако сам покренути мачку, ово је заправо уграђен у програм апарата, 667 00:55:12,660 --> 00:55:16,860 и ако имате Мац можете да урадите ово на вашем Мац превише, ако отворите терминал. 668 00:55:16,860 --> 00:55:25,630 А ми - мачка, рецимо, цп.ц и притисните Ентер. 669 00:55:25,630 --> 00:55:29,640 Шта то урадио, ако помицати се мало и погледајте где смо трчали линију, 670 00:55:29,640 --> 00:55:40,440 или где смо водили мачку команду, то је само буквално штампа садржај цп.ц нашем екрану. 671 00:55:40,440 --> 00:55:44,140 Можемо га покренути поново и можете ставити у више фајлова заједно. 672 00:55:44,140 --> 00:55:49,880 Дакле, можете да урадите цп.ц мачку, а онда можемо повезати у облику ланца и цат.ц фајл, 673 00:55:49,880 --> 00:55:53,250 који је програмски смо о томе да пишем, 674 00:55:53,250 --> 00:55:58,140 и то ће штампати обе датотеке бацк то бацк на нашим екранима. 675 00:55:58,140 --> 00:56:05,490 Дакле, ако смо помицати се мало, видимо да када смо трчали ову мачку цп.ц, цат.ц, 676 00:56:05,490 --> 00:56:17,110 прво штампају цп датотеку, а затим испод њега, он одштампан на цат.ц фајл право доле. 677 00:56:17,110 --> 00:56:19,650 Ми ћемо користити ову добити само наше ноге мокро. 678 00:56:19,650 --> 00:56:25,930 Играјте се са једноставним штампањем на терминалу, погледајте како то ради. 679 00:56:25,930 --> 00:56:39,170 Ако ви отворите са гедит цат.ц, притисните Ентер, 680 00:56:39,170 --> 00:56:43,760 можете видети програм који ћемо ускоро писати. 681 00:56:43,760 --> 00:56:48,980 Ми смо укључили ову лепу котла тањир, тако да не морате да трошите време куцање све то. 682 00:56:48,980 --> 00:56:52,310 Такође проверите број аргумената донет унутра 683 00:56:52,310 --> 00:56:56,910 Ми смо одштампали леп коришћења поруку. 684 00:56:56,910 --> 00:57:00,950 >> Ово је једна од оних ствари које, опет, као да смо говорили, 685 00:57:00,950 --> 00:57:04,490 то је скоро као мишића меморије. 686 00:57:04,490 --> 00:57:07,190 Само запамтите да раде исту врсту ствари 687 00:57:07,190 --> 00:57:11,310 и увек штампање некакав користан поруке 688 00:57:11,310 --> 00:57:17,670 тако да људи знају како да покренете свој програм. 689 00:57:17,670 --> 00:57:21,630 Са мачком, то је прилично једноставан, ми смо само ћемо да прођемо кроз све различите аргументе 690 00:57:21,630 --> 00:57:24,300 који су прошли на нашем програму, а ми ћемо да одштампате 691 00:57:24,300 --> 00:57:29,950 њихов садржај ван на екрану једном у једном тренутку. 692 00:57:29,950 --> 00:57:35,670 У циљу да штампате датотеке до екрана, идемо да урадимо нешто веома слично 693 00:57:35,670 --> 00:57:38,120 шта смо урадили на крају квиза. 694 00:57:38,120 --> 00:57:45,350 На крају квиза, да запосли програм, морали смо да отворимо датотеку, 695 00:57:45,350 --> 00:57:48,490 и онда смо морали да штампате на њему. 696 00:57:48,490 --> 00:57:54,660 У овом случају, ми ћемо отворити датотеку, а ми ћемо читати из њега уместо. 697 00:57:54,660 --> 00:58:00,630 Онда ћемо да штампате, уместо у фајлу, идемо да штампате на екрану. 698 00:58:00,630 --> 00:58:05,830 Дакле, штампа на екран сви сте урадили раније са принтф. 699 00:58:05,830 --> 00:58:08,290 Дакле, то није превише луда. 700 00:58:08,290 --> 00:58:12,190 Али читање датотеке је некако чудно. 701 00:58:12,190 --> 00:58:17,300 Ми ћемо проћи кроз то мало у исто време. 702 00:58:17,300 --> 00:58:20,560 Ако ви вратите се на том последњем проблему на квизу, проблем 33, 703 00:58:20,560 --> 00:58:27,280 Прва линија која ћемо овде радити, отварање датотеке, је веома сличан ономе што смо тамо урадили. 704 00:58:27,280 --> 00:58:36,370 Па Стела, шта та линија да изгледа, када смо отворили слику? 705 00:58:36,370 --> 00:58:47,510 [Стелла] Капитал ФИЛЕ * датотека - >> реду. >> - Једнака фопен. >> Аха. 706 00:58:47,510 --> 00:58:55,980 Која је у овом случају? То је у коментару. 707 00:58:55,980 --> 00:59:06,930 >> То је у коментару? аргв [и] и Р? 708 00:59:06,930 --> 00:59:11,300 >> Тачно. Право на. Дакле, Стела је потпуно у праву. 709 00:59:11,300 --> 00:59:13,720 То је оно што линија изгледа. 710 00:59:13,720 --> 00:59:19,670 Ми ћемо добити променљиву датотеке стреам, чувајте га на ФИЛЕ *, тако да су сви поклопци, 711 00:59:19,670 --> 00:59:25,720 ФИЛЕ, *, и име овог променљиве ће бити датотека. 712 00:59:25,720 --> 00:59:32,250 Могли би га назвати год хоћемо. Могли назвати фирст_филе или филе_и, шта год желите. 713 00:59:32,250 --> 00:59:37,590 А онда име фајла донет на командној линији до овог програма. 714 00:59:37,590 --> 00:59:44,450 Дакле, то је ускладиштена у аргв [и,] и онда ћемо отворити овај фајл у прочитао режиму. 715 00:59:44,450 --> 00:59:48,100 Сада када смо отворили датотеку, шта је оно што увек морамо да се сетите да урадите 716 00:59:48,100 --> 00:59:52,230 кад смо отворили датотеку? Затворите га. 717 00:59:52,230 --> 00:59:57,220 Па Мисси, како смо затворили датотеку? 718 00:59:57,220 --> 01:00:01,020 [Мисси] фцлосе (датотека) >> фцлосе (датотека). Управо тако. 719 01:00:01,020 --> 01:00:05,340 Сјајно. Ок. Ако гледамо на то да коментар овде, 720 01:00:05,340 --> 01:00:11,940 каже, "Отвори аргв [и] и штампају своје садржаје на стдоут." 721 01:00:11,940 --> 01:00:15,460 >> Стандардни излаз је чудно име. Стдоут је само наш начин да се каже 722 01:00:15,460 --> 01:00:22,880 желимо да га одштампате на терминал, ми желимо да га одштампате на стандардни ток излаз. 723 01:00:22,880 --> 01:00:26,450 Ми заправо можемо отарасити овог коментара овде. 724 01:00:26,450 --> 01:00:36,480 Ја ћу да га копирате и налепите га, јер то је оно што смо урадили. 725 01:00:36,480 --> 01:00:41,290 У овом тренутку, сада морамо да прочита мало по мало датотеке. 726 01:00:41,290 --> 01:00:46,300 Смо разговарали смо неколико начина читања фајлова. 727 01:00:46,300 --> 01:00:51,830 Које су ваше омиљене до сада? 728 01:00:51,830 --> 01:00:57,960 Који начини сте видели или да ли се сећате, да чита фајлове? 729 01:00:57,960 --> 01:01:04,870 [Данијел] фреад? >> Фреад? Дакле фреад је један. Џими, знаш ли неке друге? 730 01:01:04,870 --> 01:01:12,150 [Џими] Но >> реду. Јок. Цхарлотте? Алекандер? Било остали? Ок. 731 01:01:12,150 --> 01:01:20,740 Дакле они други су фгетц, један је да ћемо користити много. 732 01:01:20,740 --> 01:01:26,410 Ту је фсцанф; ви погледајте овде шаблон? 733 01:01:26,410 --> 01:01:29,170 Сви они почињу са ф. Ништа са датотеком. 734 01:01:29,170 --> 01:01:35,260 Има фреад, фгетц, фсцанф. То су све читање функција. 735 01:01:35,260 --> 01:01:49,120 За писање имамо фврите, имамо фпутц уместо фгетц. 736 01:01:49,120 --> 01:01:58,250 Такође смо желели иф смо видели на квизу. 737 01:01:58,250 --> 01:02:01,680 Пошто је ово проблем који укључује читање из датотеке, 738 01:02:01,680 --> 01:02:04,940 ћемо користити једну од ове три функције. 739 01:02:04,940 --> 01:02:10,890 Нећемо да користите ове функције овде доле. 740 01:02:10,890 --> 01:02:14,880 Ове функције се све наћи у стандардној И / О библиотеке. 741 01:02:14,880 --> 01:02:17,510 Дакле, ако се осврнемо на врху овог програма, 742 01:02:17,510 --> 01:02:24,110 можете видети да смо већ били су заглавља фајл за стандардне И / О библиотеке. 743 01:02:24,110 --> 01:02:27,120 Ако желимо да сазнате који желимо да користимо, 744 01:02:27,120 --> 01:02:29,690 увек можемо отворити странице ман. 745 01:02:29,690 --> 01:02:34,350 Дакле, можемо откуцати стдио ман 746 01:02:34,350 --> 01:02:43,180 и прочитајте све о стдио улазних и излазних функција у Ц 747 01:02:43,180 --> 01:02:49,870 И већ можемо видети Ох, погледај. То је напоменути фгетц, то је поменути фпутц. 748 01:02:49,870 --> 01:02:57,220 Тако можете уронити мало и погледајте, рецимо, фгетц 749 01:02:57,220 --> 01:03:00,060 и погледај на свом ман страници. 750 01:03:00,060 --> 01:03:03,430 Можете видети да иде заједно са целом гомилом других функција: 751 01:03:03,430 --> 01:03:12,640 фгетц, фгетс, гетц, гетцхар, добија, унгетц и њен унос карактера и гудаче. 752 01:03:12,640 --> 01:03:19,180 Дакле, ово је како читамо у ликовима и гудаче од фајлова са стандардног улаза, 753 01:03:19,180 --> 01:03:21,990 која је у суштини од корисника. 754 01:03:21,990 --> 01:03:24,780 А ово је како то радимо у стварном Ц. 755 01:03:24,780 --> 01:03:30,850 Дакле, ово не користи ГетСтринг и гетцхар функције 756 01:03:30,850 --> 01:03:36,840 које смо користили из ЦС50 библиотеке. 757 01:03:36,840 --> 01:03:39,710 Ми ћемо да урадимо овај проблем у неколико начина 758 01:03:39,710 --> 01:03:43,430 тако да можете да видите две различите начине то ради. 759 01:03:43,430 --> 01:03:48,490 Оба фреад функција која Данијел помиње и фгетц су добри начини да се то уради. 760 01:03:48,490 --> 01:03:53,790 Мислим фгетц је мало лакше, јер има само, као што видите, 761 01:03:53,790 --> 01:03:59,660 један аргумент, ФИЛЕ * да ми покушавамо да чита карактер из, 762 01:03:59,660 --> 01:04:02,740 а његова вредност је повратак инт. 763 01:04:02,740 --> 01:04:05,610 А ово је мало збуњујуће, зар не? 764 01:04:05,610 --> 01:04:11,450 >> Јер ми смо све карактер, па зашто не овај повратак знак? 765 01:04:11,450 --> 01:04:18,700 Ви имате идеју о томе зашто ово не може да врати карактер? 766 01:04:18,700 --> 01:04:25,510 [Мисси одговори, неразумљиво] >> Да. Дакле, Миси је потпуно у праву. 767 01:04:25,510 --> 01:04:31,570 Ако је АСЦИИ, онда цео могло бити мапирани на стварну знак. 768 01:04:31,570 --> 01:04:33,520 Може бити АСЦИИ знак, и то је у реду. 769 01:04:33,520 --> 01:04:36,220 То је управо оно што се дешава. 770 01:04:36,220 --> 01:04:39,190 Ми користите инт једноставно зато што има више бита. 771 01:04:39,190 --> 01:04:44,750 То је већи него знак, наш карактер има само 8 битова, да је 1 бајт на нашим 32-битним машинама. 772 01:04:44,750 --> 01:04:48,520 И инт има вредност свих 4 бајта "простора. 773 01:04:48,520 --> 01:04:50,940 И испоставило се да је начин на који фгетц ради, 774 01:04:50,940 --> 01:04:53,940 ако идите доле у ​​нашој синопсису у овој ман страници мало, 775 01:04:53,940 --> 01:05:05,000 помицати скроз доле. Испоставило се да они користе ову посебну вредност зове ЕОФ. 776 01:05:05,000 --> 01:05:09,640 То је посебна стална као повратну вредност функције фгетц 777 01:05:09,640 --> 01:05:14,570 кад си ударио крај датотеке или ако добијете грешку. 778 01:05:14,570 --> 01:05:18,170 И испада да се уради ове поређења са ЕОФ правилно, 779 01:05:18,170 --> 01:05:24,060 желите да имате тај додатни количину информација које имате у инт 780 01:05:24,060 --> 01:05:28,420 насупрот помоћу цхар променљиву. 781 01:05:28,420 --> 01:05:32,130 Иако фгетц ефикасно добија карактер из фајла, 782 01:05:32,130 --> 01:05:38,450 желите да запамтите да се враћа нешто што је типа инт вама. 783 01:05:38,450 --> 01:05:41,360 То је рекао, то је прилично једноставан за коришћење. 784 01:05:41,360 --> 01:05:44,960 То ће нам дати карактер, па све што треба да урадимо је да стално постављају фајл, 785 01:05:44,960 --> 01:05:48,440 "Дај ми следећи карактер, дајте ми следећи карактер, дајте ми следећи карактер" 786 01:05:48,440 --> 01:05:51,400 док не стигнемо до краја датотеке. 787 01:05:51,400 --> 01:05:54,730 И да ће се повући у једном лику у једном тренутку из наше фајла, 788 01:05:54,730 --> 01:05:56,250 и онда можемо да радимо шта год желите са њим. 789 01:05:56,250 --> 01:06:00,160 Можемо га сачувате, можемо га додати у низу, можемо га одштампате. 790 01:06:00,160 --> 01:06:04,630 Да ли неко од тога. 791 01:06:04,630 --> 01:06:09,600 >> Зумирање назад напоље и да се вратимо на наш цат.ц програма, 792 01:06:09,600 --> 01:06:16,170 ако ћемо користити фгетц, 793 01:06:16,170 --> 01:06:21,710 како бисмо могли приступити овај следећи линију кода? 794 01:06:21,710 --> 01:06:26,020 Ми ћемо користити - фреад ће урадити нешто мало другачије. 795 01:06:26,020 --> 01:06:32,600 И овај пут, ми ћемо само користити фгетц да један карактер у једном тренутку. 796 01:06:32,600 --> 01:06:40,910 Да бисмо обрадили цео фајл, шта би ми морамо да радимо? 797 01:06:40,910 --> 01:06:44,030 Колико ликови постоје у датотеци? 798 01:06:44,030 --> 01:06:47,390 Постоји много. Дакле, вероватно желите да се један 799 01:06:47,390 --> 01:06:49,860 и онда се још и добити још и добити другу. 800 01:06:49,860 --> 01:06:53,330 Какав алгоритма мислите можда ћемо морати да овде користите? 801 01:06:53,330 --> 01:06:55,470 Који тип -? [Александар] за петљу? >> Тачно. 802 01:06:55,470 --> 01:06:57,500 Неки тип петље. 803 01:06:57,500 --> 01:07:03,380 Фор петља је заправо велика, у овом случају. 804 01:07:03,380 --> 01:07:08,620 И као што си рекао, то звучи као да желите петљу над целом датотеком, 805 01:07:08,620 --> 01:07:11,820 добијање карактер на време. 806 01:07:11,820 --> 01:07:13,850 Свака сугестија на шта би то могло изгледати? 807 01:07:13,850 --> 01:07:22,090 [Александар, неразумљив] 808 01:07:22,090 --> 01:07:30,050 >> Ок, само ми реци на енглеском оно што покушавате да урадите? [Александар, неразумљив] 809 01:07:30,050 --> 01:07:36,270 Дакле, у овом случају, то звучи као да ми само покушавамо да петљи преко целе датотеке. 810 01:07:36,270 --> 01:07:45,330 [Александар] Тако сам <величина инт? >> Величина -? 811 01:07:45,330 --> 01:07:49,290 Претпостављам величину датотеке, зар не? Величина - ве'лл само пишите га овако. 812 01:07:49,290 --> 01:07:57,470 Величина датотеке за сада, и + +. 813 01:07:57,470 --> 01:08:04,610 Тако испада да је начин на који то радите помоћу фгетц, а ово је ново, 814 01:08:04,610 --> 01:08:10,460 је да не постоји лак начин да се само добити величину датотеке 815 01:08:10,460 --> 01:08:16,979 са овим "сизеоф" типа изгради који сте видели раније. 816 01:08:16,979 --> 01:08:20,910 Када смо користили ту функцију фгетц, ми увођење неке врсте 817 01:08:20,910 --> 01:08:29,069 нови, фанки синтакса да ово петље, где уместо користећи само основну бројач 818 01:08:29,069 --> 01:08:33,920 ићи карактер по карактер, ми ћемо повући један карактер у једном тренутку, 819 01:08:33,920 --> 01:08:37,120 један знак у времену, и начин на који знамо да смо на крају 820 01:08:37,120 --> 01:08:41,290 не, када смо рачунали одређени број знакова, 821 01:08:41,290 --> 01:08:49,939 али када смо карактер извући јесте да је посебна крај датотеке карактера. 822 01:08:49,939 --> 01:08:58,689 Дакле, можемо да урадимо ово - Ја ово зовем кан, а ми ћемо га покрене 823 01:08:58,689 --> 01:09:08,050 са нашом првом позиву да добије први карактер из фајла. 824 01:09:08,050 --> 01:09:14,979 Дакле, овај део овде, ово ће да добије карактер из фајла 825 01:09:14,979 --> 01:09:20,840 и чувајте га у променљиву цх. 826 01:09:20,840 --> 01:09:25,420 Ми ћемо да радимо све док не дођемо до краја фајла, 827 01:09:25,420 --> 01:09:41,170 што радимо тестирањем за лик не сме бити једнака тој посебног карактера ЕОФ. 828 01:09:41,170 --> 01:09:48,750 И онда уместо да ради ЦХ + +, који би само повећао вредност, 829 01:09:48,750 --> 01:09:52,710 па ако прочитате А из фајла, капитала, рецимо, 830 01:09:52,710 --> 01:09:56,810 цх + + би нам б, а онда бисмо добили ц и затим д. 831 01:09:56,810 --> 01:09:59,310 То свакако није оно што ми желимо. Оно што овде желимо 832 01:09:59,310 --> 01:10:05,830 У овом последњем мало је желимо да добијемо следећи карактер из фајла. 833 01:10:05,830 --> 01:10:09,500 >> Па како бисмо добили следећи карактер из фајла? 834 01:10:09,500 --> 01:10:13,470 Како смо добили први карактер из фајла? 835 01:10:13,470 --> 01:10:17,200 [Студентски] фгетфиле? >> Фгетц, или, извини, ти си потпуно у праву. 836 01:10:17,200 --> 01:10:20,470 Ја га погрешно тамо. Тако да. 837 01:10:20,470 --> 01:10:26,240 Ево уместо да ради ЦХ + + 838 01:10:26,240 --> 01:10:29,560 ми ћемо само да позовем фгетц (фајл) поново 839 01:10:29,560 --> 01:10:39,180 и чувајте резултат у нашој истом цх променљиве. 840 01:10:39,180 --> 01:10:43,730 [Студентски питање, неразумљив] 841 01:10:43,730 --> 01:10:52,390 >> Ово је место где су ови момци филе * су посебни. 842 01:10:52,390 --> 01:10:59,070 Начин на који они раде они је - када први пут отворите - када сте први пут да тај фопен позив, 843 01:10:59,070 --> 01:11:04,260 Тхе филе * ефикасно служи као показивач на почетак фајла. 844 01:11:04,260 --> 01:11:12,830 И онда сваки пут кад зовем фгетц, креће се један карактер кроз фајл. 845 01:11:12,830 --> 01:11:23,280 Дакле, кад год зовем, ти увецава датотеке показивач један карактер. 846 01:11:23,280 --> 01:11:26,210 А када поново фгетц, ви га креће други карактер 847 01:11:26,210 --> 01:11:28,910 и још један лик и други карактер и још један лик. 848 01:11:28,910 --> 01:11:32,030 [Студентски питање, неразумљиво] >> А то је - да. 849 01:11:32,030 --> 01:11:34,810 То је врста ове магије испод хаубе. 850 01:11:34,810 --> 01:11:37,930 Само настави увецава кроз. 851 01:11:37,930 --> 01:11:46,510 У овом тренутку, ви сте у стању да се заиста ради са карактером. 852 01:11:46,510 --> 01:11:52,150 Па како бисмо одштампате ово на екрану, сада? 853 01:11:52,150 --> 01:11:58,340 Можемо користити исту ствар принтф које смо користили раније. 854 01:11:58,340 --> 01:12:00,330 То смо користили све семестар. 855 01:12:00,330 --> 01:12:05,450 Можемо принтф позива, 856 01:12:05,450 --> 01:12:21,300 и можемо проћи у карактеру тек тако. 857 01:12:21,300 --> 01:12:27,430 Други начин да то урадите је да уместо коришћења принтф и потребе да се уради овај стринг формат, 858 01:12:27,430 --> 01:12:29,490 такође можете да користите неку од других функција. 859 01:12:29,490 --> 01:12:40,090 Можемо користити фпутц, који штампа карактер на екрану, 860 01:12:40,090 --> 01:12:52,580 осим ако гледамо фпутц - дозволите ми да умањите мало. 861 01:12:52,580 --> 01:12:56,430 Ми видимо шта је лепо је то потребно у карактеру који смо прочитали користите фгетц, 862 01:12:56,430 --> 01:13:05,100 али онда морамо да га дају ток за штампање на. 863 01:13:05,100 --> 01:13:11,850 Такође можете да користите путцхар функцију која ће директно ставити на стандардну напоље. 864 01:13:11,850 --> 01:13:16,070 Дакле, постоји гомила различитих опција које можемо користити за штампање. 865 01:13:16,070 --> 01:13:19,580 Они су сви у стандардној И / О библиотеке. 866 01:13:19,580 --> 01:13:25,150 Кад год желите да одштампате - тако иф, подразумевано ће штампати на посебан стандард од потока, 867 01:13:25,150 --> 01:13:27,910 а то је да стдоут. 868 01:13:27,910 --> 01:13:41,300 Дакле, можемо само да се односи на њега као вид ове магичне вредности, стдоут овде. 869 01:13:41,300 --> 01:13:48,410 Упс. Стави зарез испред. 870 01:13:48,410 --> 01:13:52,790 >> То је много новог, фанки информација овде. 871 01:13:52,790 --> 01:13:58,600 Много тога је веома идиоматски, у смислу да је то код 872 01:13:58,600 --> 01:14:05,700 који је написан на овај начин само зато што је чист да чита, лако за читање. 873 01:14:05,700 --> 01:14:11,520 Постоји много различитих начина да се то уради, много различитих функција које можете користити, 874 01:14:11,520 --> 01:14:14,680 али смо склони да само пратите ове исте обрасце изнова и изнова. 875 01:14:14,680 --> 01:14:20,180 Дакле, немојте се изненадити ако видиш код овако долази поново и поново. 876 01:14:20,180 --> 01:14:25,690 У реду. У овом тренутку, морамо да се пробије на дан. 877 01:14:25,690 --> 01:14:31,300 Хвала што си дошао. Хвала за гледање ако сте на мрежи. И ми видимо следеће недеље. 878 01:14:31,300 --> 01:14:33,890 [ЦС50.ТВ]