1 00:00:00,000 --> 00:00:11,200 2 00:00:11,200 --> 00:00:12,580 >> DAVID Malan: Добре, добре дошъл отново. 3 00:00:12,580 --> 00:00:13,290 Това е CS50. 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 GetString и други такива функции през цялото това време са били връщане 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 >> Така че ние също така въведе valgrind, които ще започне да се използва за този проблем 17 00:00:50,360 --> 00:00:53,380 настроен, особено за следващия Проблемът определени, както добре. 18 00:00:53,380 --> 00:00:54,980 И valgrind какво прави за нас? 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 масив, и всъщност тече valgrind и принуди поведение по време на 25 00:01:14,730 --> 00:01:17,870 valgrind работи във вашата програма е работи вътре в него, вие ще получите 26 00:01:17,870 --> 00:01:21,460 съобщения като тази - "невалиден напиши на размер 4 ", което, припомни няколко 27 00:01:21,460 --> 00:01:25,880 седмици означаваше, че имах случайно като на един Int твърде далеч 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 >> Така че да успокоение във факта, че valgrind на продукцията, формата на играта, 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% от valgrind на продукция ще бъде доста голяма 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 във файл, наречен memory.c, което беше примера си играехме с 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 >> Така scanf, това дойде в Няколко форми до този момент. 49 00:02:24,080 --> 00:02:26,410 Видяхме sscanf кратко. 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 И scanf е всъщност това, което CS50 библиотеката са използвали под 53 00:02:33,130 --> 00:02:36,560 качулка от доста време, за да за да получите информация от страна на потребителя. 54 00:02:36,560 --> 00:02:40,420 >> Например, ако се насочат към CS50 Уредът тук, позволете ми да се отворят един 55 00:02:40,420 --> 00:02:45,315 Например днес, че се нарича scanf-0.c И това е супер проста. 56 00:02:45,315 --> 00:02:46,590 Това е само няколко реда код. 57 00:02:46,590 --> 00:02:50,880 Но това показва наистина колко getInt работи всичко това време. 58 00:02:50,880 --> 00:02:54,710 >> В тази програма тук, в съответствие 16 , Забележете, че I обявява вътр. 59 00:02:54,710 --> 00:02:57,270 Така че не указатели, нищо магическо там, просто Int. 60 00:02:57,270 --> 00:03:00,330 След това в ред 17, I подтикне потребител за брой, моля. 61 00:03:00,330 --> 00:03:02,930 След това в края на 18, аз използвам scanf тук. 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 >> Така че процента, разбира се, означава Int. 65 00:03:10,920 --> 00:03:14,580 Забележете какво втората аргумент на scanf е. 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 Това е полезно, тъй като осигурява scanf с адреса на х, какво прави 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 И така, стига да предоставят scanf, или всяка функция с такава карта, че 75 00:03:41,900 --> 00:03:45,840 функция може да отиде там, а и не само Посетете форума на стойност, но може да 76 00:03:45,840 --> 00:03:49,670 промените тази стойност, което е полезно, ако целите в живота на scanf е да 77 00:03:49,670 --> 00:03:53,060 сканирате принос от страна на потребителя, по-специално от клавиатурата. 78 00:03:53,060 --> 00:03:57,830 И е форматиран означава, точно като ФОРМАТ, на F означава форматиран 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 клавиатура и го съхранява вътре в X, в каквото адрес х случва да живеят в. 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 Така че се scanf 0. 85 00:04:18,570 --> 00:04:20,130 Позволете ми да отида напред и да увеличите инча 86 00:04:20,130 --> 00:04:22,960 Ще отида да изпълня този с точки, наклонена черта scanf 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 И така, едно от нещата, на CS50 библиотеката е правил за нас за някои 96 00:04:41,130 --> 00:04:43,440 време е, че reprompting и reprompting. 97 00:04:43,440 --> 00:04:49,320 >> Повторен опит фраза изземване беше в cs50.c, и това е причината, че в getInt 98 00:04:49,320 --> 00:04:51,670 библиотеката CS50 всъщност е цяло куп линии дълги, защото сме 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, буква в scanf, какво е едно нещо, което се промени из основи в 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 Аз съм с Чар *, разбира се, вместо Int. 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 Така че тя се чувства като може би това е супер просто изпълнение на GetString. 111 00:05:23,840 --> 00:05:26,010 Но аз съм отлепи назад слой на CS50 библиотека, така че аз съм 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 И след това в следващия ред, призовавам scanf, отново, като го формат код, 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 Но защо е, че вероятно OK тук? 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 >> Подобно на неща като YouTube, когато те буфериране, така да се каже, че 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 >> Така че има проблем тук обаче, защото ви казвам scanf, очакват 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 I са разпределени като буфер. 147 00:06:51,240 --> 00:06:52,450 >> Не съм нарича изчистване. 148 00:06:52,450 --> 00:06:53,940 Аз определено не съм наречен GetString. 149 00:06:53,940 --> 00:06:56,380 Така че кой знае какво е всъщност вътрешността на буфер? 150 00:06:56,380 --> 00:07:00,550 И все пак казвам scanf сляпо, там и отбеляза, независимо от потребителя написали. 151 00:07:00,550 --> 00:07:04,460 >> Така че това, което може да причини В кода ако го изпълните? 152 00:07:04,460 --> 00:07:05,700 Вероятно segfault. 153 00:07:05,700 --> 00:07:07,970 Може би не, но вероятно segfault. 154 00:07:07,970 --> 00:07:10,620 И аз казвам може би не, защото понякога и да правите, понякога 155 00:07:10,620 --> 00:07:11,380 не получи segfault. 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, scanf-1, scanf-1.в, Enter. 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 Запази, OK - 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 И сега аз ще вървим напред и тичам scanf-1, Enter. 174 00:07:49,500 --> 00:07:50,290 String моля. 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 Това не е всъщност ще segfault в този случай. 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 >> Така че ние не можем наистина лесно да предизвика segfault с това, но очевидно това 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 Е, в scanf-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 Но scanf няма да се притесняват, ако го давате името на масива, защото това, което 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 Позволете ми да намалите за момент и направи направи scanf-2, съставен OK. 205 00:09:16,800 --> 00:09:19,390 Сега нека да се има наклонена черта scanf-2. 206 00:09:19,390 --> 00:09:22,430 String моля. "Hello". И това изглежда да работи този път. 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 което е настрана scanf ще обикновено се грижи за за нас. 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 CS50 библиотека има няколко линии на дузина код, който колективно изпълнение 232 00:10:29,050 --> 00:10:32,390 GetString низ по начин, който не го правим трябва да се знае предварително какво 233 00:10:32,390 --> 00:10:33,430 потребителя ще се объркате. 234 00:10:33,430 --> 00:10:37,370 В частност, ако погледнете назад към cs50.c от преди две седмици, ще видите 235 00:10:37,370 --> 00:10:40,480 че GetString всъщност прави Не използвайте scanf по този начин. 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 И след това, което ще видите GetString прави, е всеки път, когато тя свърши, 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 >> Така че можете да използвате scanf. 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 И в крайна сметка, получаване на segfault е малко досадно. 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 Въпроси по указатели или scanf или приноса на потребителите като цяло? 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 Така че с typedef, припомни, че можем обяви вид сами, като 282 00:12:49,510 --> 00:12:51,500 синоним, като низ за Чар *. 283 00:12:51,500 --> 00:12:56,200 Но използвайки typedef и структура, ние можем създаде истински собствени структури от данни. 284 00:12:56,200 --> 00:12:59,600 >> Например, ако се върна в Gedit тук само за миг, и аз давай напред 285 00:12:59,600 --> 00:13:08,230 и да направим нещо подобно, нека да ме спаси това като, да речем, structs.c 286 00:13:08,230 --> 00:13:10,840 временно, аз съм просто ще да вървим напред и включва 287 00:13:10,840 --> 00:13:14,360 standardio.h, вътр основната невалидни. 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 Така че това е като registrarial база данни от някакъв вид. 291 00:13:24,430 --> 00:13:29,550 >> Така че, ако имам нужда от име на един ученик, I може да направи нещо като знак * име, 292 00:13:29,550 --> 00:13:31,570 и аз ще направя нещо подобно - 293 00:13:31,570 --> 00:13:34,410 Всъщност, нека да използват CS50 библиотека само за миг, за да има 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 Ние ще я държи низ, а сега GetString. 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 Добре, така че инстинктите ми са да се направи низ NAME2, получава GetString, низ 301 00:13:58,460 --> 00:14:01,370 house2 получава GetString. 302 00:14:01,370 --> 00:14:05,850 И тогава нашата трети ученик, нека да направим NAME3 GetString. 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 потребителя, или ARGV, или други подобни. 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 И нека да вървим напред и да се отворят до structs.h, и ще 333 00:15:28,730 --> 00:15:31,130 виж тази идея тук. 334 00:15:31,130 --> 00:15:34,905 Забележете, че аз съм използвал typedef, както намекна за миг преди да заявяваме 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 >> И тази структура от данни I регистрирайте ще да има две неща вътре 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 >> Така че сега, аз създадох моя собствена персонализирана данни вид, че авторите на години C 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 нататък, I превъртите 0-3. 365 00:16:51,450 --> 00:16:54,000 След това поиска от потребителя за на студента име. 366 00:16:54,000 --> 00:16:56,110 И след това да използвам GetString както преди. 367 00:16:56,110 --> 00:16:59,410 Тогава аз питам за къщата на студента, и аз използвам GetString както преди. 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 Вие сте го виждали в PSET пет ако сте хвърли в вече с растерни файлове. 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 отново, и аз просто се създаде English 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 >> GetString направих. 389 00:17:58,020 --> 00:18:00,930 И това беше мръсна малка тайна за няколко седмици, но има GetString 390 00:18:00,930 --> 00:18:03,530 е изтичане на паметта целия поставите всички семестър до този момент. 391 00:18:03,530 --> 00:18:05,990 И най-накрая ще valgrand разкрие това на нас. 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 >> Наистина трябва да се провери дали учениците скоба I точка име не 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 срещу ъгъла случай, в който GetString връща нещо като нищожна. 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 Но поне няма да segfault, както видяхме. 407 00:19:02,340 --> 00:19:05,990 >> Е, нека да направим още нещо тук. structs-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 Позволете ми да направя structs-1, който е нова версия на този. 412 00:19:17,000 --> 00:19:18,520 >> Ще я увеличите малко. 413 00:19:18,520 --> 00:19:21,620 А сега нека да тече точка наклонена черта structs-1. 414 00:19:21,620 --> 00:19:22,590 Студентски име - 415 00:19:22,590 --> 00:19:31,500 David Mather, нека да направим Rob Къркланд, нека да направим Lauren Leverett. 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 има един файл сега на моя ток директория, наречена students.csv. 419 00:19:38,930 --> 00:19:40,420 Някои от вас може да са видели тези в реалния свят. 420 00:19:40,420 --> 00:19:42,980 >> Какво е файл CSV? 421 00:19:42,980 --> 00:19:44,170 Разделени със запетаи стойности. 422 00:19:44,170 --> 00:19:46,670 Това е нещо като бедняка версия на файла Excel. 423 00:19:46,670 --> 00:19:50,580 Това е таблица от редове и колони, които можете да отворите в програма като Excel, 424 00:19:50,580 --> 00:19:51,800 или номера на Mac. 425 00:19:51,800 --> 00:19:55,180 >> И ако отворите този файл тук на Gedit, бележка - и цифрите не са там. 426 00:19:55,180 --> 00:19:57,360 Това е просто Gedit казвам ми номерата на редовете. 427 00:19:57,360 --> 00:19:59,740 Забележете, на първа линия на тази Файлът е Давид и Mather. 428 00:19:59,740 --> 00:20:01,450 Следващият ред е Rob запетая Къркланд. 429 00:20:01,450 --> 00:20:04,170 И на третия ред е Lauren запетая Leverett. 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 които могат да се отварят в програма като Excel. 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 Освен това, CSVs са всъщност супер общата само за съхранение на данни прости - 437 00:20:25,370 --> 00:20:28,940 Yahoo Finance например, ако получите борсови котировки чрез своите т. нар. 438 00:20:28,940 --> 00:20:33,180 API, безплатна услуга, която ви позволява получаването на текущата в крак с най-датата наличност 439 00:20:33,180 --> 00:20:35,650 котировките на компаниите, те даде на данни обратно в 440 00:20:35,650 --> 00:20:37,800 супер прост формат CSV. 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 >> Така че забележите аз съм за обявяване на FILE * - 446 00:20:53,630 --> 00:20:57,260 Сега, това е вид аномалия в C. По някаква причина, файла е с главни букви, 447 00:20:57,260 --> 00:21:00,690 , която не е като повечето други типове данни в C. Но това е вграден в 448 00:21:00,690 --> 00:21:02,320 тип данни, FILE *. 449 00:21:02,320 --> 00:21:05,900 И аз съм за обявяване на показалеца към файл, е как можеш да мислиш за това. 450 00:21:05,900 --> 00:21:08,070 >> FОтваряне на означава отворен файл. 451 00:21:08,070 --> 00:21:09,470 Какво файл искате да отворите? 452 00:21:09,470 --> 00:21:12,620 Искам да отворите файл, който ще произволно се обадя students.csv. 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 Какво прави втория аргумент да FОтваряне на вероятно означава това? 456 00:21:18,960 --> 00:21:21,480 Да, w за запис, може R е за четене. 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 Това е fprintf за файла ФОРМАТ. 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 Than I освободите памет, както и преди, макар и Аз трябва да се върна и да добавите 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 FОтваряне на, fprintf, неуспешно ми дава възможност за създаване на текстови файлове. 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 >> Така вихрушка турне, но вие ще получите твърде запознат с файл I/O-- 483 00:22:32,580 --> 00:22:34,960 вход и изход - с PSET пет. 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 потенциално segfault. 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 >> Много от вас в лаптопи с предприятието имат твърди дискове или SSD дискове, 509 00:23:44,890 --> 00:23:46,260 които нямат движещи се части. 510 00:23:46,260 --> 00:23:49,170 Те са по-скоро като RAM и по-малко като тези механични устройства. 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 Когато създадете файл на вашия компютър, дали това е SSD, или в 516 00:24:02,290 --> 00:24:06,610 този случай, по-старо училище твърд диск, този файл съдържа няколко бита. 517 00:24:06,610 --> 00:24:10,510 Да кажем, че това е този 0 и 1, цял куп 0s и 1s. 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 И това е с помощта на на 0s и 1s в този част от физическата поднос. 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 този начин се създаде модели на 0s и 1s. 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 My resume.doc се съхранява при място, да кажем 123. 539 00:25:14,050 --> 00:25:15,390 Аз винаги отивам за този номер. 540 00:25:15,390 --> 00:25:18,810 Но е достатъчно да се каже, че точно като в RAM, можете да вземете един твърд диск 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 плъзнете файла на вашия Mac OS Trash или вашия Windows Recycle Bin? 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 пуснете в кошчето ви или вашия Recycle Bin направи на компютър? 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 Значи щракнете два пъти върху Trash или Recycle Bin. 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 Вие знаете, че просто го плъзнете в Trash или Recycle Bin не означава, 567 00:26:18,860 --> 00:26:19,930 сте го изпразвате. 568 00:26:19,930 --> 00:26:24,110 Така че и да отидете до менюто, а вие казвате, Empty Trash или Empty Recycle Bin. 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 Компютърът забравя къде resume.doc беше. 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 Битовете, на 0s и 1s, че аз твърдя, са на мястото на някои физически аспект 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 вероятностно, тези 0s и 1s, тези магнитни частици, се използват повторно, 583 00:27:12,150 --> 00:27:16,220 нагоре или надясно, нагоре, за други файлове, 0s и 1s. 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 >> Така че, ако някога използват програми като McAfee Norton или да се опита да се възстанови 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 И понякога Norton и ще каже: файл е 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 Е, ако не е нужно нещо подобно Norton предварително инсталиран на вашия компютър, 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 Цифрови фотоапарати, търсейки 0s и 1S, че обикновено, с висока 604 00:28:13,660 --> 00:28:16,720 вероятността, представляват начало на изображението JPEG. 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 началото на JPEG. 608 00:28:25,650 --> 00:28:29,520 И ако видя същия модел отново, че най-вероятно е началото на 609 00:28:29,520 --> 00:28:32,440 друг JPEG, и друга JPEG, JPEG и друг. 610 00:28:32,440 --> 00:28:34,970 И това е типично как за възстановяване на данни ще работи. 611 00:28:34,970 --> 00:28:37,870 Какво е хубаво за JPEGs е, въпреки че самия файл формат е малко 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 става, и какви са тези 0s и 1s са, за да ви дам малко повече от една 616 00:28:53,360 --> 00:28:55,330 контекста на тази намеса. 617 00:28:55,330 --> 00:28:55,510 >> [VIDEO PLAYBACK] 618 00:28:55,510 --> 00:28:58,700 >> -Къде си PC съхранява най- от постоянните данни. 619 00:28:58,700 --> 00:29:03,390 За да направите това, данните пътува от RAM заедно с софтуерни сигнали, които разказват 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 >> [END възпроизвеждане на видео] 633 00:29:40,660 --> 00:29:42,190 >> DAVID Malan: Zoom в малко по-дълбоко в това, което е сега 634 00:29:42,190 --> 00:29:44,360 всъщност на тези плочи. 635 00:29:44,360 --> 00:29:44,720 >> [VIDEO PLAYBACK] 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 >> A модел серия от тези малки, зарядна до района на диск 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 >> [END възпроизвеждане на видео] 659 00:30:46,470 --> 00:30:47,820 >> DAVID Malan: OK, може би не. 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 И това е най-висока версия плътност, както е посочено от HD, която има 668 00:31:12,260 --> 00:31:14,240 означава преди видеота днешните HD. 669 00:31:14,240 --> 00:31:16,400 >> Standard плътност е 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 Отново, SSD дискове в по-новите компютри работят малко по-различно. 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 И сте trully просто изтрива някои броят на битовете, или магнитни частици 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 Това е един мегабайт, или да се даде, който дори не може да се вмести в типичен MP3 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 Така че нека преход до мястото, където ще бъде прекара следващите PSET, както добре. 711 00:33:13,370 --> 00:33:18,470 Така че ние вече е определен за тази страница - о, Няколко съобщения бързо. 712 00:33:18,470 --> 00:33:21,730 >> Този петък, ако искате да се присъединят CS50 за обяд, отидете на обичайното място, 713 00:33:21,730 --> 00:33:23,610 cs50.net/rsvp. 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 си TF да му кажа или какво сте мисля за за вашия проект, с 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 случайни имейл, за да ви TF да се каже точно колко далеч зад себе си в крайна 735 00:34:08,260 --> 00:34:12,360 проекта изпълнение, следвани от на CS50 Hackathon който всеки 736 00:34:12,360 --> 00:34:17,520 е поканен, който ще бъде събитие от 20:00 от едната вечер до 07:00 737 00:34:17,520 --> 00:34:19,150 Ч. на следващата сутрин. 738 00:34:19,150 --> 00:34:22,560 Pizza, както може да са споменати в седмицата нула, ще се запазят се сервира в 21:00, 739 00:34:22,560 --> 00:34:24,120 Китайска храна в 1:00 AM. 740 00:34:24,120 --> 00:34:27,929 И ако все още сте будни в 5:00 AM, ние ще ви отведе до ИХОП за закуска. 741 00:34:27,929 --> 00:34:31,310 >> Така Hackathon е един от най- незабравими преживявания в класа. 742 00:34:31,310 --> 00:34:35,290 След изпълнението се дължи и тогава кулминационната CS50 Fair. 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 И видяхме, че structs може да ни помогне допълнителна организира нашия код и да 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 И отново, това е главоболие, което GetString сделки с за вас. 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 >> Така OK, ето едно решение. 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 New компютъра тук, ясно - 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 >> DAVID Malan: преструвам. 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 I твърди преди малко, GetString решава този проблем. 845 00:39:32,280 --> 00:39:37,380 Ако искате да вмъкнете шести номер в този масив, това, което е най-малко една 846 00:39:37,380 --> 00:39:40,090 разтвор може да падне обратно на сигурно, точно както правим с GetString? 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 Това е голяма O М, защото е копирал ще ви струва някои звена на 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 GetString за вас. 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 може да бъде тук в RAM и 17 може да е тук в RAM, 866 00:40:39,570 --> 00:40:40,990 и 22 може да е тук в RAM. 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 Ако не се разпределят само Int, но възел - и от 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 самата Int, и след това, както се предлага от долната половина на правоъгълника, 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 Колко байта за Int? 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 на структура, или структура, C. 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 >> Вътре в този възел е едно цяло число N. 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 Това е нещо като глупав реалността на C. The typedef, така да се каже, не е 910 00:42:46,490 --> 00:42:47,220 случило все още. 911 00:42:47,220 --> 00:42:48,510 C е супер буквално. 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 Node, цитирам цитата възел. 916 00:42:59,060 --> 00:43:03,050 >> Но тъй като на по-многословен декларация, което направих на първа линия - 917 00:43:03,050 --> 00:43:05,340 typedef структура възел - 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 >> All Отивам да направя след това е декларират временна променлива. 941 00:44:10,350 --> 00:44:12,730 Ще го наречем PTR от Конвенцията, за показалеца. 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 равнява се равнява N, връщане вярно. 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 PSET шест, когато заредите отново, тези, 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 >> Лектор: На следващото CS50, David забрави своя база случай. 976 00:46:07,240 --> 00:46:12,770 >> DAVID Malan: И това е, как ви изпрати текстови съобщения с C. Какво по - 977 00:46:12,770 --> 00:46:14,020 >> [VARIOUS текстово съобщение УВЕДОМЛЕНИЕ SOUNDS] 978 00:46:14,020 --> 00:46:19,734