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