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