1 00:00:00,000 --> 00:00:03,381 >> [За възпроизвеждане на музика] 2 00:00:03,381 --> 00:00:10,626 3 00:00:10,626 --> 00:00:11,610 >> [Възпроизвеждане на видео] 4 00:00:11,610 --> 00:00:13,640 >> -Той Лъже. 5 00:00:13,640 --> 00:00:14,380 >> -За какво? 6 00:00:14,380 --> 00:00:17,182 >> -Не знам. 7 00:00:17,182 --> 00:00:19,990 >> -Значи Това, което знаем? 8 00:00:19,990 --> 00:00:23,145 >> -Това В 9:15, Ray Santoya беше на банкомат. 9 00:00:23,145 --> 00:00:23,644 -Да. 10 00:00:23,644 --> 00:00:27,030 Така че въпросът е, какво правеше той в 9:16? 11 00:00:27,030 --> 00:00:29,720 >> -Shooting На 9 милиметър в нещо. 12 00:00:29,720 --> 00:00:31,540 Може би е видял снайпериста. 13 00:00:31,540 --> 00:00:33,412 >> -Или Се работи с него. 14 00:00:33,412 --> 00:00:34,340 >> -Wait. 15 00:00:34,340 --> 00:00:36,200 Върнете се едно. 16 00:00:36,200 --> 00:00:36,975 >> -Какво виждаш? 17 00:00:36,975 --> 00:00:44,400 18 00:00:44,400 --> 00:00:47,805 >> -Bring Лицето си до пълен екран. 19 00:00:47,805 --> 00:00:48,680 >> -His Очила. 20 00:00:48,680 --> 00:00:50,060 >> -Има Е отражение. 21 00:00:50,060 --> 00:01:00,455 22 00:01:00,455 --> 00:01:02,280 >> -Това Е бейзболния отбор Nuevitas. 23 00:01:02,280 --> 00:01:03,110 Това е тяхното лого. 24 00:01:03,110 --> 00:01:05,820 >> -И Той говори за всеки, който носи, че якето. 25 00:01:05,820 --> 00:01:06,670 >> [END PLAYBACK] 26 00:01:06,670 --> 00:01:07,628 >> DAVID Malan: Добре. 27 00:01:07,628 --> 00:01:11,210 Това е CS50 и това е малко по- на [недоловим], с която сте 28 00:01:11,210 --> 00:01:12,890 рекламни кампании с проблем зададете четири. 29 00:01:12,890 --> 00:01:16,606 Днес ние започваме да изглежда малко по- дълбоко в тези неща, наречени указатели, 30 00:01:16,606 --> 00:01:18,480 която въпреки че е доста тайнствена тема, 31 00:01:18,480 --> 00:01:20,813 Оказва се, че това ще да бъде средство, чрез което ние 32 00:01:20,813 --> 00:01:24,320 може да започне изграждането и монтажа много по-сложни програми. 33 00:01:24,320 --> 00:01:28,150 Но го направихме на миналата сряда по пътя на някои claymation първия. 34 00:01:28,150 --> 00:01:30,190 Така че това, изземване, е Binky и ние го използва 35 00:01:30,190 --> 00:01:33,148 да погледнете в програма, която наистина не направи нищо интересно, 36 00:01:33,148 --> 00:01:34,950 но го е направил разкрие някои проблеми. 37 00:01:34,950 --> 00:01:38,570 Така че, за да започне днес, защо не ходим бързо през някои от тези стъпки, 38 00:01:38,570 --> 00:01:41,920 опитайте се да се дестилират в условия на човека точно това, което става тук 39 00:01:41,920 --> 00:01:45,410 и защо това е лошо, а след това преминете и действително да започне изграждането на нещо 40 00:01:45,410 --> 00:01:46,309 с тази техника? 41 00:01:46,309 --> 00:01:48,350 Така че това са първите, две линии в тази програма 42 00:01:48,350 --> 00:01:51,340 и от гледна точка на лаик, какво правят тези две линии? 43 00:01:51,340 --> 00:01:55,600 Някой, който е разумно комфортна с какво се е обявена на екрана? 44 00:01:55,600 --> 00:01:58,340 45 00:01:58,340 --> 00:02:00,120 Какви са тези две линии правят? 46 00:02:00,120 --> 00:02:02,070 Това не е всичко, което различно от една седмица 47 00:02:02,070 --> 00:02:03,611 но има някои нови специален символ. 48 00:02:03,611 --> 00:02:04,152 Да? 49 00:02:04,152 --> 00:02:05,628 Обратно там. 50 00:02:05,628 --> 00:02:07,092 >> АУДИТОРИЯ: Деклариране указатели? 51 00:02:07,092 --> 00:02:08,050 DAVID Malan: Кажете отново? 52 00:02:08,050 --> 00:02:08,860 АУДИТОРИЯ: Деклариране указатели? 53 00:02:08,860 --> 00:02:11,776 DAVID Malan: Деклариране и указатели нека го прецизира малко повече. 54 00:02:11,776 --> 00:02:14,050 АУДИТОРИЯ: [недоловим] адрес х и тогава у. 55 00:02:14,050 --> 00:02:15,300 DAVID Malan: И тогава адрес. 56 00:02:15,300 --> 00:02:18,550 Така че, специално това, което правим е ние се обявява две променливи. 57 00:02:18,550 --> 00:02:21,252 Тези променливи, обаче, ще да бъде от тип INT звезда, която 58 00:02:21,252 --> 00:02:23,210 по-специално означава, те ще се съхранява 59 00:02:23,210 --> 00:02:26,450 адреса на едно цяло число, съответно, х и у. 60 00:02:26,450 --> 00:02:27,660 Сега има някакви ценности? 61 00:02:27,660 --> 00:02:32,621 Има ли някакви реални адреси в тях две променливи в този момент? 62 00:02:32,621 --> 00:02:33,120 Не. 63 00:02:33,120 --> 00:02:35,030 Това е просто така наречените ценности боклук. 64 00:02:35,030 --> 00:02:38,120 Ако не всъщност присвоява променлива, каквато е била в RAM 65 00:02:38,120 --> 00:02:42,224 преди това ще се напълни с нули и такива, както на тези променливи. 66 00:02:42,224 --> 00:02:44,140 Но ние все още не знаем какви са те и това е 67 00:02:44,140 --> 00:02:47,060 ще бъде от ключово значение за това защо Binky загубил главата си миналата седмица. 68 00:02:47,060 --> 00:02:49,980 >> Така че това беше claymation въплъщение на това 69 00:02:49,980 --> 00:02:53,580 при която имате само две променливи, малки кръгли парчета от глина, 70 00:02:53,580 --> 00:02:57,330 който може да съхранява променливи, но като на увити стрелките показват, 71 00:02:57,330 --> 00:03:00,640 те не са действително сочи до всяка точка познат. 72 00:03:00,640 --> 00:03:03,670 Така че тогава имахме тази линия, а това е нов миналата седмица, изчистване на паметта 73 00:03:03,670 --> 00:03:07,130 разпределение, който е само на един луксозен начин за разказване на операционната система, Linux 74 00:03:07,130 --> 00:03:09,750 или Mac OS или Windows, хей, дайте ми малко памет, 75 00:03:09,750 --> 00:03:11,780 и всичко, което трябва да кажа, операционната система 76 00:03:11,780 --> 00:03:14,699 е това, когато той пита за памет. 77 00:03:14,699 --> 00:03:16,990 Това няма да е грижа какво започваш да правиш с него, 78 00:03:16,990 --> 00:03:19,786 но трябва да кажа, оперативната система за какво по пътя на изчистване. 79 00:03:19,786 --> 00:03:20,286 Да? 80 00:03:20,286 --> 00:03:21,078 >> АУДИТОРИЯ: Колко? 81 00:03:21,078 --> 00:03:21,994 DAVID Malan: Колко? 82 00:03:21,994 --> 00:03:25,280 Колко в байтове, и така, това, отново, скалъпена например, е просто казвам, 83 00:03:25,280 --> 00:03:27,360 дайте ми размера на инт. 84 00:03:27,360 --> 00:03:30,550 Сега, размерът на INT е четири байта или 32 бита. 85 00:03:30,550 --> 00:03:32,850 Така че това е просто начин на казвайки, хей, операционна система, 86 00:03:32,850 --> 00:03:37,290 ми даде четири байта памет че мога да използвам на мое разположение, 87 00:03:37,290 --> 00:03:40,560 и по-конкретно, какво прави изчистване възвръщаемост по отношение 88 00:03:40,560 --> 00:03:41,795 на това парче от четири байта? 89 00:03:41,795 --> 00:03:44,110 90 00:03:44,110 --> 00:03:44,860 АУДИТОРИЯ: Адрес? 91 00:03:44,860 --> 00:03:45,901 DAVID Malan: Адресът. 92 00:03:45,901 --> 00:03:47,580 Адресът на това парче от четири байта. 93 00:03:47,580 --> 00:03:48,190 Точно. 94 00:03:48,190 --> 00:03:51,430 И така, това е, което се съхранява в крайна сметка в х и това е защо ние наистина не 95 00:03:51,430 --> 00:03:55,240 интересува какво броят на които адрес, е, дали това е OX1 или ОХ2 96 00:03:55,240 --> 00:03:57,110 или някакъв загадъчен шестнадесетичен адрес. 97 00:03:57,110 --> 00:03:59,850 Ние просто се грижи картинно че тази променлива х сега е 98 00:03:59,850 --> 00:04:01,630 посочвайки, че парче от паметта. 99 00:04:01,630 --> 00:04:05,570 Така че стрелката представлява указател, или По-специално, адрес на паметта. 100 00:04:05,570 --> 00:04:09,120 Но отново, ние не обикновено се грижат какви са тези действителните адреси са. 101 00:04:09,120 --> 00:04:11,780 Сега, тази линия се казва това, което от гледна точка на лаик? 102 00:04:11,780 --> 00:04:14,330 Star х получава 42 запетая. 103 00:04:14,330 --> 00:04:17,390 Какво означава това? 104 00:04:17,390 --> 00:04:18,200 Искаш ли да отидеш? 105 00:04:18,200 --> 00:04:20,102 Не драскайте врата си. 106 00:04:20,102 --> 00:04:22,360 >> АУДИТОРИЯ: Адресът на х е в 42. 107 00:04:22,360 --> 00:04:24,300 >> DAVID Malan: Адресът на х е при 42. 108 00:04:24,300 --> 00:04:25,190 Не точно. 109 00:04:25,190 --> 00:04:28,485 Толкова близо, но не съвсем, защото има звездата, която е префикс тази х. 110 00:04:28,485 --> 00:04:29,860 Така че ние трябва да се ощипвам малко. 111 00:04:29,860 --> 00:04:31,032 Да? 112 00:04:31,032 --> 00:04:36,044 >> АУДИТОРИЯ: Стойността, че показалка х сочи е 42. 113 00:04:36,044 --> 00:04:36,710 DAVID Malan: OK. 114 00:04:36,710 --> 00:04:40,840 Стойността че показалеца х е посочвайки, да кажем, е 42, 115 00:04:40,840 --> 00:04:44,165 или казано по друг начин, звездата х казва, отидете на каквото и адрес 116 00:04:44,165 --> 00:04:48,340 е в х, независимо дали е 1 Oxford Улица или 33 Oxford Street 117 00:04:48,340 --> 00:04:51,850 или OX1 или ox33, каквото че цифров адрес, е, 118 00:04:51,850 --> 00:04:54,380 звезден х е dereferencing на х. 119 00:04:54,380 --> 00:04:57,297 Така че отивам на този адрес и след това пуснати на броя 42 там. 120 00:04:57,297 --> 00:04:59,380 Така че би било равностоен начин да се каже, че. 121 00:04:59,380 --> 00:05:01,860 Така че това е всичко наред и след това ние ще представлява картината 122 00:05:01,860 --> 00:05:05,370 както следва, където сме добавили 42-да, че парче от четири 123 00:05:05,370 --> 00:05:09,370 байтове на дясната ръка, но тази линия беше мястото, където нещата се объркват 124 00:05:09,370 --> 00:05:11,120 и главата Binky е изскочил разстояние в този момент, 125 00:05:11,120 --> 00:05:15,290 защото се случват лоши неща, когато можете сочен стойности за боклук 126 00:05:15,290 --> 00:05:18,210 или сте сочен за недействителна указатели, и аз казвам невалидни 127 00:05:18,210 --> 00:05:21,020 защото в този момент в история, това, което е вътре в у? 128 00:05:21,020 --> 00:05:24,440 Каква е стойността на у основава за последните няколко стъпки? 129 00:05:24,440 --> 00:05:25,360 Да? 130 00:05:25,360 --> 00:05:26,115 Какво е това? 131 00:05:26,115 --> 00:05:26,990 >> АУДИТОРИЯ: An адрес. 132 00:05:26,990 --> 00:05:28,460 DAVID Malan: An адрес. 133 00:05:28,460 --> 00:05:31,910 Тя трябва да бъде един адрес но аз го инициализира? 134 00:05:31,910 --> 00:05:32,800 Така че аз все още не съм. 135 00:05:32,800 --> 00:05:35,430 Така че това, което е известно, че там? 136 00:05:35,430 --> 00:05:37,590 Това е просто някаква стойност боклук. 137 00:05:37,590 --> 00:05:41,500 Тя може да бъде всеки адрес от нула до 2 милиарда, ако имате две участия на RAM, 138 00:05:41,500 --> 00:05:44,289 или нула до 4 милиарда, ако сте имам четири гигабайта RAM. 139 00:05:44,289 --> 00:05:46,080 Това е някаква ценност боклук, но проблемът е, 140 00:05:46,080 --> 00:05:48,200 че операционната система, ако това не ви е дал 141 00:05:48,200 --> 00:05:51,140 че парче от паметта конкретно че вие ​​се опитвате да отиде, 142 00:05:51,140 --> 00:05:54,650 това е като цяло ще причини това, което сме виждали като вина сегментация. 143 00:05:54,650 --> 00:05:57,810 Така че в действителност, всеки от вас, които имат бореше с проблеми на работното време 144 00:05:57,810 --> 00:06:00,393 или проблеми, които е по- обикновено с опитвам да разбера 145 00:06:00,393 --> 00:06:02,150 сегментация вина, че по принцип означава, 146 00:06:02,150 --> 00:06:05,017 можете да започнете да докосвате един сегмент от памет, която не трябва да бъде. 147 00:06:05,017 --> 00:06:07,350 Можете да започнете да докосвате памет, която операционната система не е 148 00:06:07,350 --> 00:06:10,450 да ви е позволено да се докоснат, независимо дали е като отидете твърде далеч в масив 149 00:06:10,450 --> 00:06:12,870 или като се започне сега, дали това е, защото сте докосвате 150 00:06:12,870 --> 00:06:14,780 памет, която току-що е някаква ценност боклук. 151 00:06:14,780 --> 00:06:18,230 >> Така че правим звезден х тук се нещо неопределено поведение. 152 00:06:18,230 --> 00:06:22,030 Никога не трябва да го направя, защото коефициентите са, програмата просто ще се срине, 153 00:06:22,030 --> 00:06:24,050 защото вие казвате, отидете на този адрес 154 00:06:24,050 --> 00:06:27,000 и вие нямате представа къде този адрес в действителност. 155 00:06:27,000 --> 00:06:30,300 Така че операционната система е вероятно ще се разбие вашата програма 156 00:06:30,300 --> 00:06:33,840 като резултат и наистина, това е какво се е случило там, за да Binky. 157 00:06:33,840 --> 00:06:37,210 Така че в крайна сметка, Binky фиксирана този проблем с това. 158 00:06:37,210 --> 00:06:38,909 Така че самата програма е погрешно. 159 00:06:38,909 --> 00:06:41,450 Но ако нещо продължат напред и изпълни тази линия вместо това, 160 00:06:41,450 --> 00:06:45,580 ш е равно х просто означава, каквото адрес е х, също го сложи в ш. 161 00:06:45,580 --> 00:06:48,740 >> И така картинно, ние сме представено с това две стрелки 162 00:06:48,740 --> 00:06:51,570 от х и у посочващо от на същото място. 163 00:06:51,570 --> 00:06:55,760 Така семантично, х е равно на х, защото и двете от тези, 164 00:06:55,760 --> 00:07:00,300 са еднакви съхранение адрес, ерго сочеше 42, 165 00:07:00,300 --> 00:07:04,910 и сега, когато ти казват звезда у, отидете на адрес в у, 166 00:07:04,910 --> 00:07:06,790 това е с интересен страничен ефект. 167 00:07:06,790 --> 00:07:10,320 Така адреса в Y е едно и също нещо като адрес в х. 168 00:07:10,320 --> 00:07:15,060 Така че, ако се каже, отидете на адрес в у и промяна на стойността до 13, 169 00:07:15,060 --> 00:07:17,140 кой друг е засегнат? 170 00:07:17,140 --> 00:07:21,100 X е, буква Г, така да се каже, следва да бъдат засегнати, както добре. 171 00:07:21,100 --> 00:07:24,340 >> И наистина, как Ник извади тази снимка в claymation беше точно това. 172 00:07:24,340 --> 00:07:28,665 Въпреки, че ние следваме показалеца у, ние в крайна сметка на същото място, 173 00:07:28,665 --> 00:07:32,780 и така, ако бяхме да отпечатате от х или у pointee му, 174 00:07:32,780 --> 00:07:35,720 тогава ние ще видите, че стойността на 13. 175 00:07:35,720 --> 00:07:37,927 Сега, аз казвам pointee да бъде в съответствие с видеото. 176 00:07:37,927 --> 00:07:39,760 Програмистите, за да ми знание, всъщност никога не 177 00:07:39,760 --> 00:07:42,460 казват думата pointee, това, което е посочено 178 00:07:42,460 --> 00:07:44,650 най-, но с оглед на последователността с видеото, осъзнават 179 00:07:44,650 --> 00:07:47,520 това е всичко, което е означаваше, че при това положение. 180 00:07:47,520 --> 00:07:54,190 Така че всички въпроси по claymation или указатели или изчистване, просто все още? 181 00:07:54,190 --> 00:07:54,850 Не? 182 00:07:54,850 --> 00:07:55,470 Всичко е наред. 183 00:07:55,470 --> 00:07:58,560 >> Така че без по-нататъшно приказки, нека да разгледаме 184 00:07:58,560 --> 00:08:00,700 в случаите, когато това е в действителност се използва за известно време. 185 00:08:00,700 --> 00:08:03,580 Така че ние сме имали тази библиотека CS50 че има всички тези функции. 186 00:08:03,580 --> 00:08:06,810 Използвали сме GetInt много, GetString, Вероятно GetLongLong-рано 187 00:08:06,810 --> 00:08:09,840 в моя PSet една или така, но какво действително се случва? 188 00:08:09,840 --> 00:08:12,920 Е, нека хвърлим един бърз поглед под капака на една програма, която 189 00:08:12,920 --> 00:08:17,017 вдъхновява защо ние ви дам CS50 библиотека, и наистина като на миналата седмица, 190 00:08:17,017 --> 00:08:18,850 ние започнахме като тези, обучение колела изключен. 191 00:08:18,850 --> 00:08:21,080 Така че това вече е сортиран на аутопсия на това, 192 00:08:21,080 --> 00:08:23,690 продължава вече вътре в библиотеката CS50, 193 00:08:23,690 --> 00:08:27,250 въпреки че ние сега ще започнат да се движат далеч от него за повечето програми. 194 00:08:27,250 --> 00:08:29,460 >> Така че това е една програма, наречена scanf 0. 195 00:08:29,460 --> 00:08:30,510 Това е супер кратко. 196 00:08:30,510 --> 00:08:33,909 Тя просто има тези линии, но това въвежда функция, наречена scanf 197 00:08:33,909 --> 00:08:36,909 че ние всъщност ще видим в миг вътре в библиотеката CS50, 198 00:08:36,909 --> 00:08:38,600 макар и в малко по-различна форма. 199 00:08:38,600 --> 00:08:41,330 Така че тази програма по линия 16 е обявяване на променлива х. 200 00:08:41,330 --> 00:08:43,150 Така че ми даде четири байта за пад. 201 00:08:43,150 --> 00:08:45,750 Той е бил казвам за употреба, номер, моля, и след това 202 00:08:45,750 --> 00:08:49,010 това е интересен линия, която всъщност обвързва миналата седмица 203 00:08:49,010 --> 00:08:49,790 и този. 204 00:08:49,790 --> 00:08:53,230 Scanf, а след това забележите това отнема форматен, точно като ФОРМАТ, 205 00:08:53,230 --> 00:08:57,480 % и означава инт, а след това отнема втори аргумент, който изглежда малко 206 00:08:57,480 --> 00:08:58,260 фънки. 207 00:08:58,260 --> 00:09:01,880 Това е амперсанд х, и да се припомни, ние само видях тоя път миналата седмица. 208 00:09:01,880 --> 00:09:03,465 Какво означава амперсанд х представлява? 209 00:09:03,465 --> 00:09:06,210 210 00:09:06,210 --> 00:09:08,450 Какво означава амперсанд направи в C? 211 00:09:08,450 --> 00:09:08,950 Да? 212 00:09:08,950 --> 00:09:10,024 >> АУДИТОРИЯ: Адресът на. 213 00:09:10,024 --> 00:09:11,190 DAVID Malan: Адресът на. 214 00:09:11,190 --> 00:09:13,190 Така че това е точно обратното на оператора на звезда, 215 00:09:13,190 --> 00:09:17,270 като има предвид, операторът на звездата казва, отидете на този адрес, на оператора амперсанд 216 00:09:17,270 --> 00:09:20,280 казва, разбера адрес на тази променлива, 217 00:09:20,280 --> 00:09:23,530 и така че това е ключов, защото целта scanf в живота 218 00:09:23,530 --> 00:09:26,320 е да се сканира на потребителя вход от клавиатурата, 219 00:09:26,320 --> 00:09:29,970 в зависимост от това, което той или тя видове, а после четат вход, който потребителя 220 00:09:29,970 --> 00:09:32,970 в променлива, но ние Видях в последните две седмици 221 00:09:32,970 --> 00:09:36,080 че този суап функция, която ние Опитах без усилие да приложат 222 00:09:36,080 --> 00:09:37,110 Просто разбито. 223 00:09:37,110 --> 00:09:42,470 Припомнете си, че с функцията за размяна, ако ние просто обявена А и Б, както цели числа, 224 00:09:42,470 --> 00:09:47,040 ние го успешно сменяте две променливи в тялото на суап 225 00:09:47,040 --> 00:09:50,080 Просто обичам с млякото и ОВ, но веднага след като се върна за размяна, 226 00:09:50,080 --> 00:09:55,200 това, което е резултат по отношение на х и у, оригиналните стойности? 227 00:09:55,200 --> 00:09:55,700 Нищо. 228 00:09:55,700 --> 00:09:56,200 Да. 229 00:09:56,200 --> 00:09:59,754 Нищо не се случи това време, защото суапове променят само своите локални копия, 230 00:09:59,754 --> 00:10:01,670 която е да се каже, всичко, този път, когато ние сме 231 00:10:01,670 --> 00:10:04,010 били минаваща през доводи до функции, ние сме 232 00:10:04,010 --> 00:10:05,939 просто преминаване копия на тези доводи. 233 00:10:05,939 --> 00:10:07,980 Можете да го направите с тази каквото си искате с тях, 234 00:10:07,980 --> 00:10:10,890 но те ще имат не осъществяване на първоначалните стойности. 235 00:10:10,890 --> 00:10:13,650 Така че това е проблем, ако можете искат да имат функция като scanf 236 00:10:13,650 --> 00:10:17,170 в живота, чиято цел е да сканирате въвеждане на потребителя от клавиатурата 237 00:10:17,170 --> 00:10:22,010 и след попълване на бланки, така да се се каже, че е, да се даде като променлива х 238 00:10:22,010 --> 00:10:25,410 на стойност, защото, ако бях на мястото да просто минават х да scanf, 239 00:10:25,410 --> 00:10:28,790 ако считате, логиката на последния седмица, scanf може да прави каквото иска 240 00:10:28,790 --> 00:10:33,100 с копие от х, но не можех постоянно се променят, освен ако х даваме 241 00:10:33,100 --> 00:10:37,120 scanf карта на съкровище, така да се каже, където х бележи място, при което 242 00:10:37,120 --> 00:10:41,860 минаваме в адреса на х, така че scanf може да отиде там и всъщност промяна 243 00:10:41,860 --> 00:10:42,920 стойността на х. 244 00:10:42,920 --> 00:10:45,080 И така наистина, всичко че тази програма прави 245 00:10:45,080 --> 00:10:53,180 ако правя scanf 0, в моя източник Указател 5м направи scanf 0, 246 00:10:53,180 --> 00:10:57,730 дот наклонена черта scanf, номер моля, 50, благодаря за 50. 247 00:10:57,730 --> 00:11:01,020 >> Така че това не е всичко, че интересно, но това, което се случва в действителност 248 00:11:01,020 --> 00:11:04,820 е, че веднага след като аз наричам scanf тук, стойността на х 249 00:11:04,820 --> 00:11:06,410 е постоянно променя. 250 00:11:06,410 --> 00:11:08,335 Сега, това изглежда хубаво и добро, а в действителност, това 251 00:11:08,335 --> 00:11:11,200 Изглежда, че ние наистина не се нуждаят на CS50 библиотеката вече всичко. 252 00:11:11,200 --> 00:11:13,960 Например, нека да тичам Това още веднъж тук. 253 00:11:13,960 --> 00:11:15,750 Позволете ми да го отвори за секунда. 254 00:11:15,750 --> 00:11:20,600 Нека се опитаме редица моля и вместо да каже 50 както преди, 255 00:11:20,600 --> 00:11:22,810 нека просто кажа не. 256 00:11:22,810 --> 00:11:24,000 OK, това е малко странно. 257 00:11:24,000 --> 00:11:25,270 ДОБРЕ. 258 00:11:25,270 --> 00:11:28,680 И само някои глупости тук. 259 00:11:28,680 --> 00:11:31,170 Така че това не изглежда да справят грешни ситуации. 260 00:11:31,170 --> 00:11:33,620 Така че ние трябва да минимално старт добавянето на някои за проверка на грешки 261 00:11:33,620 --> 00:11:37,460 за да се уверите, че потребителят има въвели в действителен брой като 50, 262 00:11:37,460 --> 00:11:40,720 защото очевидно пишете думи не се разпознава като проблематично, 263 00:11:40,720 --> 00:11:42,020 но вероятно трябва да бъде. 264 00:11:42,020 --> 00:11:46,450 >> Нека да погледнем тази версия сега това е моят опит да reimplement GetString. 265 00:11:46,450 --> 00:11:48,437 Ако scanf има всичко това функционалност вградена, 266 00:11:48,437 --> 00:11:51,270 защо са ни били рекламни кампании с тях обучение колела като GetString? 267 00:11:51,270 --> 00:11:55,450 Е, тук е може би моята собствена проста версия на GetString 268 00:11:55,450 --> 00:12:00,766 при който преди седмица, че може да съм казал, дайте ми низ и го наричат ​​буфер. 269 00:12:00,766 --> 00:12:03,390 Днес, аз отивам да се започне само казвайки Чар звезда, която, изземване, 270 00:12:03,390 --> 00:12:04,400 това е просто синоним. 271 00:12:04,400 --> 00:12:06,629 Тя изглежда страшно, но това е точно същото нещо. 272 00:12:06,629 --> 00:12:09,420 Така че ми даде променлива, наречена буфер че това ще се съхранява низ, 273 00:12:09,420 --> 00:12:12,780 кажете низа за употреба, моля, и след това, точно както и преди, 274 00:12:12,780 --> 00:12:17,760 нека се опитаме да заеме този урок scanf % и този път, а след това преминава в буфер. 275 00:12:17,760 --> 00:12:19,310 Сега, бърза проверка здрав разум. 276 00:12:19,310 --> 00:12:22,120 Защо ли не съм казвайки амперсанд буфер този път? 277 00:12:22,120 --> 00:12:25,190 278 00:12:25,190 --> 00:12:26,625 Заключим от предишния пример. 279 00:12:26,625 --> 00:12:28,000 АУДИТОРИЯ: Char звезда е указател. 280 00:12:28,000 --> 00:12:29,920 DAVID Malan: Точно така, защото този път, Чар 281 00:12:29,920 --> 00:12:34,080 звезда вече е указател, на един адрес, по дефиниция на тази звезда е там. 282 00:12:34,080 --> 00:12:37,530 И ако scanf очаква един адрес, достатъчно е само да премине в буфер. 283 00:12:37,530 --> 00:12:39,260 Не е нужно да се каже амперсанд буфер. 284 00:12:39,260 --> 00:12:42,177 За любознателните, бихте могли направя нещо подобно. 285 00:12:42,177 --> 00:12:43,510 Тя ще има различно значение. 286 00:12:43,510 --> 00:12:47,240 Това ще ви даде по-показалка към указател, който всъщност 287 00:12:47,240 --> 00:12:50,050 валиден нещо в C, но за Сега, нека да го прости 288 00:12:50,050 --> 00:12:51,750 и да запази историята последователно. 289 00:12:51,750 --> 00:12:54,100 Аз съм просто ще премине в буфер и това е правилно. 290 00:12:54,100 --> 00:12:56,487 Проблемът обаче е, това. 291 00:12:56,487 --> 00:12:58,820 Нека да вървим напред и да стартирате тази програма след съставянето на този списък. 292 00:12:58,820 --> 00:13:00,902 Направи scanf 1. 293 00:13:00,902 --> 00:13:02,610 Дявол да го вземе, ми е съставител улов на моя грешка. 294 00:13:02,610 --> 00:13:04,090 Дай ми една секунда. 295 00:13:04,090 --> 00:13:05,460 Звън. 296 00:13:05,460 --> 00:13:06,990 Да речем, scanf-1.в. 297 00:13:06,990 --> 00:13:10,880 298 00:13:10,880 --> 00:13:11,380 ДОБРЕ. 299 00:13:11,380 --> 00:13:12,720 Ето. 300 00:13:12,720 --> 00:13:14,280 Трябва ми. 301 00:13:14,280 --> 00:13:16,750 CS50 ID има разнообразен конфигурационни настройки 302 00:13:16,750 --> 00:13:18,280 че ви защити срещу себе си. 303 00:13:18,280 --> 00:13:21,300 Имах нужда да забраните тези от използвате трясък ръчно този път. 304 00:13:21,300 --> 00:13:22,140 Така че моля, низ. 305 00:13:22,140 --> 00:13:25,560 Отивам да вървим напред и да объркат в любимата ми свят здрасти. 306 00:13:25,560 --> 00:13:26,490 OK, за нищожна. 307 00:13:26,490 --> 00:13:27,700 Това не е това, което написах. 308 00:13:27,700 --> 00:13:29,690 Така че това е показателно за нещо е погрешно. 309 00:13:29,690 --> 00:13:33,920 Нека да вървим напред и да объркат в един наистина дълъг низ. 310 00:13:33,920 --> 00:13:37,210 Благодаря за нищожна и аз не знам ако аз отивам да бъде в състояние да го разбият. 311 00:13:37,210 --> 00:13:40,240 Нека се опитаме малко копие паста и да видим дали това ще помогне. 312 00:13:40,240 --> 00:13:43,290 Просто поставете много от това. 313 00:13:43,290 --> 00:13:47,310 Това определено е по-голяма низ от обичайното. 314 00:13:47,310 --> 00:13:51,450 Нека просто наистина го напиша. 315 00:13:51,450 --> 00:13:51,950 Не. 316 00:13:51,950 --> 00:13:52,650 Мамка му. 317 00:13:52,650 --> 00:13:53,480 Командата не е намерена. 318 00:13:53,480 --> 00:13:54,550 Така че това е свързано. 319 00:13:54,550 --> 00:13:56,440 Това е, защото аз поставили някои лоши герои, 320 00:13:56,440 --> 00:13:59,780 но това се оказва не се ходи на работа. 321 00:13:59,780 --> 00:14:03,510 >> Нека се опитаме още веднъж, защото това е по-забавно, ако ние всъщност го разбият. 322 00:14:03,510 --> 00:14:09,116 Нека да напишете това и сега, аз съм ще копирате един наистина дълъг низ 323 00:14:09,116 --> 00:14:10,990 а сега нека да видим дали можем може да се срине това нещо. 324 00:14:10,990 --> 00:14:14,235 Забележете, че пропуснахме пространства и нови линии и запетая 325 00:14:14,235 --> 00:14:16,035 и всички фънки герои. 326 00:14:16,035 --> 00:14:16,535 Enter. 327 00:14:16,535 --> 00:14:21,090 328 00:14:21,090 --> 00:14:22,880 И сега мрежата е просто, че бавно. 329 00:14:22,880 --> 00:14:27,460 I задържан Command-V твърде дълго, ясно. 330 00:14:27,460 --> 00:14:28,190 Мамка му! 331 00:14:28,190 --> 00:14:29,260 Командата не е намерена. 332 00:14:29,260 --> 00:14:29,780 >> ДОБРЕ. 333 00:14:29,780 --> 00:14:32,240 Е, въпросът е, Въпреки това следното. 334 00:14:32,240 --> 00:14:36,910 И така, какво всъщност ще с тази декларация 335 00:14:36,910 --> 00:14:39,240 овъгляване звезда буфер по линия 16? 336 00:14:39,240 --> 00:14:41,820 Така че това, което съм аз все когато Декларирам указател? 337 00:14:41,820 --> 00:14:47,440 All аз съм се е четири байт стойност на наречен буфер, но това, което е вътре в него 338 00:14:47,440 --> 00:14:49,540 в момента? 339 00:14:49,540 --> 00:14:50,930 Това е просто някаква стойност боклук. 340 00:14:50,930 --> 00:14:54,170 Защото всеки път, когато се декларира променлива в C, това е просто някаква стойност боклук, 341 00:14:54,170 --> 00:14:56,220 и ние се започне да се спъне в тази реалност. 342 00:14:56,220 --> 00:14:59,720 Сега, когато аз кажа scanf, отидете на този адрес 343 00:14:59,720 --> 00:15:01,520 и сложи каквито и видовете потребителски в. 344 00:15:01,520 --> 00:15:06,400 Ако потребителят пише в здравей свят, добре, къде мога да го сложите? 345 00:15:06,400 --> 00:15:07,750 Buffer е на стойност един боклук. 346 00:15:07,750 --> 00:15:11,510 >> Така че това е нещо като стрела това е като посочи кой знае къде. 347 00:15:11,510 --> 00:15:13,880 Може би това е сочейки точно тук, в паметта ми. 348 00:15:13,880 --> 00:15:16,560 И така, когато потребителят видове в света Здравейте, 349 00:15:16,560 --> 00:15:22,380 програмата се опитва да постави на низ здравей свят наклонена черта 0 350 00:15:22,380 --> 00:15:23,910 в това парче памет. 351 00:15:23,910 --> 00:15:27,070 Но с висока степен на вероятност, но очевидно не 100% вероятност, 352 00:15:27,070 --> 00:15:30,440 компютърът ще се срине след това програмата, защото това не е 353 00:15:30,440 --> 00:15:32,490 памет I следва да бъде позволено да се докоснат. 354 00:15:32,490 --> 00:15:36,330 Така накратко, тази програма е опорочено за точно поради тази причина. 355 00:15:36,330 --> 00:15:38,070 Аз принципно не правя това, което? 356 00:15:38,070 --> 00:15:42,366 Какви стъпки трябва да се пропусне, точно като ние пропуснахме с първи пример Binky си? 357 00:15:42,366 --> 00:15:42,866 Да? 358 00:15:42,866 --> 00:15:43,710 >> АУДИТОРИЯ: разпределение на паметта? 359 00:15:43,710 --> 00:15:45,001 >> DAVID Malan: разпределение на паметта. 360 00:15:45,001 --> 00:15:48,400 Аз не съм всъщност разпределя всеки спомен за този низ. 361 00:15:48,400 --> 00:15:50,270 Така че можем да се определи това в няколко начина. 362 00:15:50,270 --> 00:15:52,700 One, ние можем да го прости и в действителност, сега вие сте 363 00:15:52,700 --> 00:15:55,116 ще започне да видят замъгляване на границите между това, което 364 00:15:55,116 --> 00:15:58,520 масив е, какво низ е, какво е Чар звезда е, какво масив от символи 365 00:15:58,520 --> 00:15:59,020 е. 366 00:15:59,020 --> 00:16:02,450 Ето втори пример с участието на струнни инструменти и известие 367 00:16:02,450 --> 00:16:05,690 всичко, което съм правил на линия 16 е, вместо да каже 368 00:16:05,690 --> 00:16:09,530 че буфер ще бъде Чар звезда, указател към парче от паметта, 369 00:16:09,530 --> 00:16:14,057 Отивам да дам много активно себе буфер за 16 знака, 370 00:16:14,057 --> 00:16:16,390 и в действителност, ако сте запознати с термина буфериране 371 00:16:16,390 --> 00:16:20,570 Вероятно от света на видео, където видеоклип е буфериране, буфериране, 372 00:16:20,570 --> 00:16:21,175 буфериране. 373 00:16:21,175 --> 00:16:22,550 Е, каква е връзката тук? 374 00:16:22,550 --> 00:16:24,960 Е, Inside на YouTube и във вътрешността на видео плейъри 375 00:16:24,960 --> 00:16:27,200 обикновено е масив това е по-голям от 16. 376 00:16:27,200 --> 00:16:30,340 Тя може да бъде масив от размера на един мегабайта, може би 10 мегабайта, 377 00:16:30,340 --> 00:16:34,330 и в този масив прави за сваляне изтеглите цял куп от байтове, 378 00:16:34,330 --> 00:16:37,500 цял куп мегабайта видео и видео плейъра, 379 00:16:37,500 --> 00:16:40,930 YouTube или който и да е, започва четене на байтове, от които масив, 380 00:16:40,930 --> 00:16:43,530 и всеки път, когато видят Думата буфериране, буфериране, 381 00:16:43,530 --> 00:16:46,350 това означава, че играчът има Стигнахме до края на този масив. 382 00:16:46,350 --> 00:16:50,430 Мрежата е толкова бавно, че не разполага с презарежда масива с повече байта 383 00:16:50,430 --> 00:16:55,610 и така сте извън бита за да се покаже на потребителя. 384 00:16:55,610 --> 00:16:59,430 >> Така буфер е способен мандат тук, в която това е просто масив, парче от паметта. 385 00:16:59,430 --> 00:17:02,530 И това ще го оправя защото се оказва, 386 00:17:02,530 --> 00:17:07,410 че можете да лекува масиви, като че те са адреси, въпреки че буфер 387 00:17:07,410 --> 00:17:10,710 е просто символ, това е поредица от символи, буфер, 388 00:17:10,710 --> 00:17:14,760 това е полезно за мен, програмист, може да премине името си около 389 00:17:14,760 --> 00:17:17,079 като че ли бяха показалеца, като че ли 390 00:17:17,079 --> 00:17:21,000 са били на адреса на парче памет за 16 символа. 391 00:17:21,000 --> 00:17:24,530 Така че това е да казвам, че може да премине на scanf точно тази дума 392 00:17:24,530 --> 00:17:30,670 и така сега, ако направя тази програма, направи scanf 2, точка 2, наклонена черта scanf, 393 00:17:30,670 --> 00:17:35,386 и напишете Здравей, свят, Въведете, че time-- 394 00:17:35,386 --> 00:17:37,590 >> Хм, какво се е случило? 395 00:17:37,590 --> 00:17:39,340 String моля. 396 00:17:39,340 --> 00:17:41,430 Какво съм направил погрешно? 397 00:17:41,430 --> 00:17:43,800 Здравей, свят, буфер. 398 00:17:43,800 --> 00:17:44,705 Здравей Свят. 399 00:17:44,705 --> 00:17:48,201 400 00:17:48,201 --> 00:17:49,420 Ах, аз знам това, което прави. 401 00:17:49,420 --> 00:17:49,920 ДОБРЕ. 402 00:17:49,920 --> 00:17:51,628 Така че това е четене до първото пространство. 403 00:17:51,628 --> 00:17:55,680 Така че нека да мамят само за миг и кажа аз просто исках да объркате нещо 404 00:17:55,680 --> 00:18:01,408 много дълго, като това е едно дълго изречение, това е едно, две, три, четири, пет, 405 00:18:01,408 --> 00:18:04,420 шест, седем, осем, девет, 10, 11, 12, 13, 14, 15, 16. 406 00:18:04,420 --> 00:18:05,300 ДОБРЕ. 407 00:18:05,300 --> 00:18:07,600 Това е наистина едно дълго изречение. 408 00:18:07,600 --> 00:18:10,710 Така че това изречение е по-дълъг от 16 символа 409 00:18:10,710 --> 00:18:13,670 и така, когато ударих Enter, какво ще се случи? 410 00:18:13,670 --> 00:18:16,940 Е, в този случай на история, бях обявен за буфер 411 00:18:16,940 --> 00:18:22,190 действително да е масив с 16 символа готови да отидете. 412 00:18:22,190 --> 00:18:27,426 Така един, два, три, четири, пет, шест, седем, осем, девет, 10, 11, 12, 13, 14, 413 00:18:27,426 --> 00:18:29,440 15, 16. 414 00:18:29,440 --> 00:18:34,410 Така 16 знака, а сега, когато съм Прочети в нещо като това е дълъг 415 00:18:34,410 --> 00:18:43,950 изречение, какво ще се случи, е че аз отивам да прочетете в това е дълъг 416 00:18:43,950 --> 00:18:49,660 S-E-N-T-E-N-C-E, изр. 417 00:18:49,660 --> 00:18:52,270 >> Така че това е умишлено нещо лошо, че аз 418 00:18:52,270 --> 00:18:55,060 запази написването на отвъдното границите на моя масив, 419 00:18:55,060 --> 00:18:56,660 извън границите на моя буфер. 420 00:18:56,660 --> 00:19:00,100 Можех да получите късмет и програмата ще продължи бягане и не ми пука, 421 00:19:00,100 --> 00:19:03,450 но най-общо казано, това наистина ще се срине моята програма, 422 00:19:03,450 --> 00:19:06,440 и това е грешка в моя кодирате момента стъпя 423 00:19:06,440 --> 00:19:08,576 отвъд границите на тази гама, защото аз 424 00:19:08,576 --> 00:19:10,450 не знам дали това е непременно ще се разбие 425 00:19:10,450 --> 00:19:12,120 или ако аз съм просто ще получите късмет. 426 00:19:12,120 --> 00:19:15,750 Така че това е проблем, защото в този случай, тя не изглежда да работи 427 00:19:15,750 --> 00:19:20,931 и нека да изкуши съдбата тук, въпреки че логическо устройство изглежда понасят доста малко 428 00:19:20,931 --> 00:19:21,430 на-- 429 00:19:21,430 --> 00:19:22,040 >> Ето. 430 00:19:22,040 --> 00:19:23,240 И накрая. 431 00:19:23,240 --> 00:19:26,470 Така че аз съм единственият, който може да види това. 432 00:19:26,470 --> 00:19:29,630 Така че аз просто трябваше много забавно да пишете от много дълго действително израза 433 00:19:29,630 --> 00:19:32,800 че тя със сигурност превишена 16 байта, защото аз 434 00:19:32,800 --> 00:19:38,050 въвели в тази луда дълго мулти-лайн израза, а след това забележите какво се е случило. 435 00:19:38,050 --> 00:19:41,110 Програмата се опита да го отпечатате и след това имам вина сегментация 436 00:19:41,110 --> 00:19:44,430 и сегментационни грешки е, когато нещо като това се случва 437 00:19:44,430 --> 00:19:47,650 и операционната система казва не, не може да се пипне, че паметта. 438 00:19:47,650 --> 00:19:49,570 Отиваме да убие програмата напълно. 439 00:19:49,570 --> 00:19:51,180 >> Така че това изглежда проблематично. 440 00:19:51,180 --> 00:19:54,540 Аз бях подобри програмата, при която поне има някаква памет, 441 00:19:54,540 --> 00:19:58,000 но това би било да се ограничи на функцията за получаване GetString 442 00:19:58,000 --> 00:20:00,780 нанизи от някои крайни дължина 16. 443 00:20:00,780 --> 00:20:04,200 Така че, ако искате да подкрепи по-дълго изречения от 16 знака, 444 00:20:04,200 --> 00:20:04,880 С какво се занимаваш? 445 00:20:04,880 --> 00:20:07,970 Е, можете да увеличите Размер на този буфер до 32 446 00:20:07,970 --> 00:20:09,190 или че изглежда вид кратко. 447 00:20:09,190 --> 00:20:12,260 Защо не можем просто да то 1000, но за бутане. 448 00:20:12,260 --> 00:20:17,100 Какъв е отговорът на интуитивно Просто се избягва този проблем, като прави 449 00:20:17,100 --> 00:20:20,660 ми буфер-голяма, като 1000 символа? 450 00:20:20,660 --> 00:20:23,470 С реализацията GetString този начин. 451 00:20:23,470 --> 00:20:27,130 Какво е добро или лошо тук? 452 00:20:27,130 --> 00:20:28,033 Да? 453 00:20:28,033 --> 00:20:30,574 АУДИТОРИЯ: Ако превърже много на пространството и да не я използват, 454 00:20:30,574 --> 00:20:33,500 тогава няма да може да преразпредели това пространство. 455 00:20:33,500 --> 00:20:34,500 DAVID Malan: Абсолютно. 456 00:20:34,500 --> 00:20:38,480 Това е разточителство, доколкото ако не го направите действително се нуждаят от тези 900 байта 457 00:20:38,480 --> 00:20:41,057 и все още сте с молба за 1000 общо, така или иначе, 458 00:20:41,057 --> 00:20:44,140 ти си просто отнема повече памет компютъра на потребителя, отколкото трябва да, 459 00:20:44,140 --> 00:20:45,740 и в крайна сметка, някои от които вече сте срещнали 460 00:20:45,740 --> 00:20:47,620 в живота, че когато сте използвате много програми 461 00:20:47,620 --> 00:20:50,470 и те изяжда много памет, Това всъщност може да повлияе на 462 00:20:50,470 --> 00:20:52,220 и работата на потребителя на компютъра. 463 00:20:52,220 --> 00:20:56,090 Така че това е нещо като мързелив разтвор, със сигурност, и обратно, 464 00:20:56,090 --> 00:21:00,140 това е не само разточителство, какъв проблем все още остава, дори ако аз направя моя буфер 465 00:21:00,140 --> 00:21:02,100 1000? 466 00:21:02,100 --> 00:21:02,600 Да? 467 00:21:02,600 --> 00:21:04,475 >> АУДИТОРИЯ: The струна е с дължина 1001. 468 00:21:04,475 --> 00:21:05,350 DAVID Malan: Точно така. 469 00:21:05,350 --> 00:21:08,280 Ако си низ е с дължина 1001, имате точно същия проблем, 470 00:21:08,280 --> 00:21:10,705 и от моя аргумент, бих Просто след това да го направи 2000, 471 00:21:10,705 --> 00:21:12,830 но вие не знаете в напредне колко голям трябва да бъде, 472 00:21:12,830 --> 00:21:16,890 и все пак, аз трябва да компилирате програмата ми преди да позволите на хората да използват и изтегляне 473 00:21:16,890 --> 00:21:17,390 това. 474 00:21:17,390 --> 00:21:21,490 Така че това е точно типът неща, които библиотечните опитва CS50 475 00:21:21,490 --> 00:21:24,750 за да ни помогне с и ние ще само поглед в някои от базовия изпълнението 476 00:21:24,750 --> 00:21:29,790 тук, но това е CS50 точка C. Това е файла, който е бил на CS50 IDE 477 00:21:29,790 --> 00:21:31,420 всички тези седмици, които сте използвали. 478 00:21:31,420 --> 00:21:34,280 Това е предварително компилирани и сте го използва автоматично 479 00:21:34,280 --> 00:21:38,780 от природата на наличието на непокрит L CS50 флаг с трясък, 480 00:21:38,780 --> 00:21:42,300 но ако аз превъртете надолу през всички тези функции, ето GetString, 481 00:21:42,300 --> 00:21:44,636 и само за да ви даде по- вкус на това, което се случва, 482 00:21:44,636 --> 00:21:46,760 нека хвърлим един бърз поглед към относителната сложност. 483 00:21:46,760 --> 00:21:48,870 Това не е супер дълги функция, но ние не го направи 484 00:21:48,870 --> 00:21:52,530 трябва да се мисли усилено за всички как да отида за получаване струни. 485 00:21:52,530 --> 00:21:55,660 >> Така че тук е моят буфер и I Очевидно тя се инициализира с нула. 486 00:21:55,660 --> 00:21:57,990 Това, разбира се, е едно и също нещо като Чар звезда, 487 00:21:57,990 --> 00:22:00,585 но реших в прилагане на библиотеката CS50 488 00:22:00,585 --> 00:22:02,460 че ако искаме да да бъде напълно динамичен, 489 00:22:02,460 --> 00:22:05,770 Аз не знам предварително колко голяма струнни потребители ще искате да получите. 490 00:22:05,770 --> 00:22:08,140 Така че аз отивам да започнете само с празен низ 491 00:22:08,140 --> 00:22:11,507 и аз отивам да се изгради колкото памет, както аз трябва да се поберат в низа на потребителя 492 00:22:11,507 --> 00:22:13,340 и ако аз не разполагат с достатъчно, аз отивам да попитам 493 00:22:13,340 --> 00:22:15,010 операционната система за повече памет. 494 00:22:15,010 --> 00:22:17,510 Отивам да се движат техните низ в по-голяма парче памет 495 00:22:17,510 --> 00:22:21,847 и аз отивам да се освободи или да освободи недостатъчно голяма част от паметта 496 00:22:21,847 --> 00:22:23,680 и ние просто ще да направите това итеративно. 497 00:22:23,680 --> 00:22:25,570 >> Така че един бърз поглед, тук е просто една променлива 498 00:22:25,570 --> 00:22:28,780 с които аз отивам да следите от капацитета на моя буфер. 499 00:22:28,780 --> 00:22:30,071 Колко байта мога да се побере? 500 00:22:30,071 --> 00:22:32,070 Ето една променлива с п което аз отивам да се запази 501 00:22:32,070 --> 00:22:36,200 следи колко байта са всъщност в буфера или че потребителят е въвел. 502 00:22:36,200 --> 00:22:39,900 Ако не сте виждали това и преди, може да се определи, че дадена променлива като инт 503 00:22:39,900 --> 00:22:46,370 е грозен, който както подсказва и името, означава, че е не е отрицателен, и защо да го 504 00:22:46,370 --> 00:22:50,590 Аз някога искам да се занимавам уточняващи че едно цяло число не е просто едно цяло число, 505 00:22:50,590 --> 00:22:52,540 но това е неподписан инт? 506 00:22:52,540 --> 00:22:55,064 Това е неотрицателно инт. 507 00:22:55,064 --> 00:22:56,355 Какво означава [недоловим] означава? 508 00:22:56,355 --> 00:22:58,910 >> АУДИТОРИЯ: Тя е описващ сума памет, която може да бъде [недоловим]. 509 00:22:58,910 --> 00:22:59,660 >> DAVID Malan: Да. 510 00:22:59,660 --> 00:23:03,710 Така че, ако кажа, грозен, това всъщност е който ви дава един бит на допълнителна памет 511 00:23:03,710 --> 00:23:07,440 и изглежда някак глупаво, но ако има един бит на допълнителна памет, която 512 00:23:07,440 --> 00:23:09,940 означава, че имате два пъти повече стойности, които могат да представляват, 513 00:23:09,940 --> 00:23:11,570 тъй като тя може да бъде 0 или 1. 514 00:23:11,570 --> 00:23:14,660 Така че по подразбиране, едно цяло число може да бъде приблизително отрицателно 2 милиарда чак 515 00:23:14,660 --> 00:23:16,030 до положителен 2000000000. 516 00:23:16,030 --> 00:23:18,540 Това са големи диапазони, но тя все още е вид разточителство 517 00:23:18,540 --> 00:23:21,280 ако само се грижи за размери, които просто интуитивно 518 00:23:21,280 --> 00:23:24,620 трябва да бъде не-отрицателно или положително или 0, и след това, 519 00:23:24,620 --> 00:23:28,884 защо си губиш 2000000000 възможните стойности за отрицателни числа 520 00:23:28,884 --> 00:23:30,300 ако никога няма да ги използвам? 521 00:23:30,300 --> 00:23:35,350 Така че като кажа, грозен, сега ми инт може да бъде между 0 и грубо 4 милиарда. 522 00:23:35,350 --> 00:23:39,280 >> Така че тук е просто едно цяло число C по причини, ние няма да влязат в точно сега, както и 523 00:23:39,280 --> 00:23:42,280 защо това е вместо пад на Чар, но тук е 524 00:23:42,280 --> 00:23:44,630 същността на това, което се случва на, и някои от вас 525 00:23:44,630 --> 00:23:48,340 може да се използва, например, fgetc функция, дори и в PSet четири 526 00:23:48,340 --> 00:23:51,580 или по-късно, ние ще го видите отново в проблем зададете пет, 527 00:23:51,580 --> 00:23:55,410 fgetc е хубаво, защото, както е името вид, нещо като arcanely предполага, 528 00:23:55,410 --> 00:23:57,940 това е функция, която получава характер и това е така, 529 00:23:57,940 --> 00:24:00,690 това, което е коренно различна за това, което правим в GetString 530 00:24:00,690 --> 00:24:03,110 е, че ние не използвате scanf по същия начин. 531 00:24:03,110 --> 00:24:07,550 Ние просто пълзящи по стъпка-по-стъпка над каквото и потребителят е въвел, 532 00:24:07,550 --> 00:24:10,970 защото винаги можем да разпределите Чар и така можем винаги безопасно 533 00:24:10,970 --> 00:24:15,599 Посетете един Чар в даден момент, и магията започва да се случи тук. 534 00:24:15,599 --> 00:24:17,890 Отивам да превъртите надолу, за да средата на тази функция 535 00:24:17,890 --> 00:24:20,360 само накратко да Ви представим тази функция. 536 00:24:20,360 --> 00:24:22,670 Голяма като има изчистване функция, има 537 00:24:22,670 --> 00:24:27,740 функция презаделяне където презаделяне ви позволява да преразпредели парче памет 538 00:24:27,740 --> 00:24:29,570 и да я направи по-голяма или по-малка. 539 00:24:29,570 --> 00:24:33,060 Така дълга история кратко и с вълна от ръката ми за днес, 540 00:24:33,060 --> 00:24:35,620 знаем, че това, което GetString прави, е, че е нещо като 541 00:24:35,620 --> 00:24:39,720 на магически расте или свиване буфер като потребител 542 00:24:39,720 --> 00:24:41,440 видове в неговата или нейната низ. 543 00:24:41,440 --> 00:24:43,962 >> Така че, ако потребителят на къса връв, този код 544 00:24:43,962 --> 00:24:45,920 само разпределя достатъчно памет, за да се поберат в низа. 545 00:24:45,920 --> 00:24:48,086 Ако потребителят държи типизиране както аз отново и отново го е направил 546 00:24:48,086 --> 00:24:50,330 и отново, добре, ако буфер първоначално този голям 547 00:24:50,330 --> 00:24:53,310 и програмата разбира, за Чакай малко, аз съм на пространството, 548 00:24:53,310 --> 00:24:55,410 то се случва да се удвои размерът на буфера 549 00:24:55,410 --> 00:24:59,110 и след това да се удвои размера на буфера и код, който прави удвояването, 550 00:24:59,110 --> 00:25:03,170 ако погледнем тук, това е Просто тази хитра една подложка. 551 00:25:03,170 --> 00:25:06,830 Може да не съм виждал този синтаксис и преди, но ако ти кажа звезда равни, 552 00:25:06,830 --> 00:25:10,470 това е същото нещо като казвайки пъти капацитета 2. 553 00:25:10,470 --> 00:25:13,390 Така че просто продължава да се удвои капацитета на буфера 554 00:25:13,390 --> 00:25:17,480 и след това казва презаделяне да даде Самата че много повече памет. 555 00:25:17,480 --> 00:25:19,720 >> Сега, като се отмени, има са други функции в тук 556 00:25:19,720 --> 00:25:23,680 че ние няма да изглежда в подробности освен да се покаже в GetInt, 557 00:25:23,680 --> 00:25:26,150 ние използваме GetString в GetInt. 558 00:25:26,150 --> 00:25:28,192 Ние проверяваме, че това не е нищожна, които, изземване, 559 00:25:28,192 --> 00:25:30,400 е специална стойност, която означава нещо се обърка. 560 00:25:30,400 --> 00:25:31,233 Ние сме на паметта. 561 00:25:31,233 --> 00:25:32,310 По-добре се проверява за това. 562 00:25:32,310 --> 00:25:33,710 И ние върне стойност страж. 563 00:25:33,710 --> 00:25:37,850 Но аз ще се отложи за коментарите по отношение Затова и след това ние използваме този братовчед на scanf 564 00:25:37,850 --> 00:25:42,100 наречено sscanf и се оказва, че sscanf, или низ scanf, 565 00:25:42,100 --> 00:25:45,310 Позволява ви да погледнете на линията, която потребителят е въвел в и ви разочарова 566 00:25:45,310 --> 00:25:49,610 го анализира по същество и това, което съм правиш тук е Казвам sscanf, 567 00:25:49,610 --> 00:25:54,440 анализират независимо потребителят трябва въведена и се уверете% аз, 568 00:25:54,440 --> 00:25:59,250 там е цяло число в него, и ние няма да получите в днешния точно защо има и 569 00:25:59,250 --> 00:26:03,760 а% в тук, но това по-накратко позволява нас, за да се открие, ако потребителят е въвел 570 00:26:03,760 --> 00:26:06,050 в нещо фалшиво след броя. 571 00:26:06,050 --> 00:26:11,766 Така че причината, поради която GetInt и GetString ви кажа, за да опитате отново, опитайте отново, опитайте отново 572 00:26:11,766 --> 00:26:13,640 се дължи на всички този код сме написали, 573 00:26:13,640 --> 00:26:17,900 Това е вид на гледаш вход на потребителя в като се уверите, че е изцяло цифров 574 00:26:17,900 --> 00:26:21,700 или това е действително с плаваща Точка на стойност или други подобни, 575 00:26:21,700 --> 00:26:24,233 в зависимост от това каква стойност функционират, който използвате. 576 00:26:24,233 --> 00:26:25,060 >> Уф. 577 00:26:25,060 --> 00:26:25,710 ДОБРЕ. 578 00:26:25,710 --> 00:26:27,592 Това беше една хапка но въпросът тук е, 579 00:26:27,592 --> 00:26:29,550 че причината ние имахме тези обучителни колела 580 00:26:29,550 --> 00:26:32,880 е така, защото най-ниското ниво, Има толкова много неща, които 581 00:26:32,880 --> 00:26:35,674 може да се обърка, че ние искахме да се справят с изпреварващо 582 00:26:35,674 --> 00:26:38,090 тези неща със сигурност в първите седмици от класа, 583 00:26:38,090 --> 00:26:42,230 но сега с PSet четири и пет и PSet отвъд ще видите, че това е по-до 584 00:26:42,230 --> 00:26:45,570 ви, но и вие сте по-способни за решаване на тези видове проблеми 585 00:26:45,570 --> 00:26:47,180 себе си. 586 00:26:47,180 --> 00:26:51,770 Всякакви въпроси относно GetString или GetInt? 587 00:26:51,770 --> 00:26:52,630 Да? 588 00:26:52,630 --> 00:26:55,130 >> АУДИТОРИЯ: Защо бихте се удвои капацитета на буфера 589 00:26:55,130 --> 00:26:57,630 а не само увеличаване на то с точната сума? 590 00:26:57,630 --> 00:26:58,100 >> DAVID Malan: Добър въпрос. 591 00:26:58,100 --> 00:27:00,474 Защо да се удвои капацитетът на буфера за разлика 592 00:27:00,474 --> 00:27:02,800 просто да го увеличава от някои постоянна величина? 593 00:27:02,800 --> 00:27:03,900 Това беше решение на дизайн. 594 00:27:03,900 --> 00:27:08,590 Ние току-що реши, че тъй като тя е склонна да да е малко по-скъпо време-разумно да попитам 595 00:27:08,590 --> 00:27:10,440 операционната система за паметта, ние не го направи 596 00:27:10,440 --> 00:27:13,210 искаш да свършиш заемайки ситуация, за големи струни 597 00:27:13,210 --> 00:27:14,960 че ние задавахме отново и отново на операционната система 598 00:27:14,960 --> 00:27:17,500 и отново в бърза последователност за памет. 599 00:27:17,500 --> 00:27:20,387 Така че ние просто реши, донякъде произволно, но ние се надяваме, разумно, 600 00:27:20,387 --> 00:27:22,720 че, знаеш ли какво, нека опитайте да получите напред от себе си 601 00:27:22,720 --> 00:27:25,520 и само да го удвои, така че ние се намали количеството на пъти 602 00:27:25,520 --> 00:27:29,010 ние трябва да се обадите или изчистване презаделяне, но общо решение 603 00:27:29,010 --> 00:27:31,820 обадите в отсъствието на знаейки това, което потребителите може да искате да напишете инча 604 00:27:31,820 --> 00:27:33,600 И двата начина могат да бъдат спорни. 605 00:27:33,600 --> 00:27:35,430 Може да се каже добър. 606 00:27:35,430 --> 00:27:39,240 >> Така че нека да разгледаме няколко на други странични ефекти на паметта, 607 00:27:39,240 --> 00:27:41,610 неща, които могат да се объркат и инструменти, които можете да 608 00:27:41,610 --> 00:27:43,880 използвате, за да се изравнят тези видове грешки. 609 00:27:43,880 --> 00:27:47,800 Оказва се, всички от вас, въпреки че check50 не Ви е казал толкова, 610 00:27:47,800 --> 00:27:50,050 са били писмено бъги код от една седмица 611 00:27:50,050 --> 00:27:53,630 дори и ако всички тестове са check50 преминали, и дори ако вие и вашият TF 612 00:27:53,630 --> 00:27:56,010 са супер уверена, че кода си работи както е предвидено. 613 00:27:56,010 --> 00:27:59,190 Вашият код е бъги или опорочено с това, че всички от вас, 614 00:27:59,190 --> 00:28:02,540 при използване на библиотека CS50, са изтичане памет. 615 00:28:02,540 --> 00:28:06,040 Вие сте били с молба операционната система за памет в повечето програми 616 00:28:06,040 --> 00:28:08,850 което сте написали, но сте всъщност никога не го върнат. 617 00:28:08,850 --> 00:28:12,110 Ти нарече GetString и GetInt и GetFloat, 618 00:28:12,110 --> 00:28:15,270 но с GetString, вие сте никога не нарича unGetString или Дай 619 00:28:15,270 --> 00:28:19,890 String Back или други подобни, но сме виждали че GetString прави достатъчно памет 620 00:28:19,890 --> 00:28:22,810 чрез изчистване или това функция презаделяне, който е само на 621 00:28:22,810 --> 00:28:25,670 много сходни по дух, и все пак, ние сме били 622 00:28:25,670 --> 00:28:28,629 молба на операционната система за памет и памет отново и отново 623 00:28:28,629 --> 00:28:29,670 но никога не ги дават обратно. 624 00:28:29,670 --> 00:28:33,550 >> Сега, като се отмени, се оказва, че когато програмата се затваря, всички на паметта 625 00:28:33,550 --> 00:28:34,870 се освобождава автоматично. 626 00:28:34,870 --> 00:28:36,150 Така че това не е било огромна сделка. 627 00:28:36,150 --> 00:28:38,590 Това няма да се прекъсне IDE или забави нещата, 628 00:28:38,590 --> 00:28:40,670 Но когато правят програми обикновено изтече памет 629 00:28:40,670 --> 00:28:42,170 и те са се кандидатира за дълъг период от време. 630 00:28:42,170 --> 00:28:45,640 Ако някога сте виждали глупавите плажна топка в Mac OS или пясъчния часовник 631 00:28:45,640 --> 00:28:51,160 на Windows, където това е вид забавя или мисли или мислене 632 00:28:51,160 --> 00:28:53,770 или просто наистина започва да се забави до пълзене, 633 00:28:53,770 --> 00:28:56,960 че е много вероятно би могло да бъде в резултат на теч с памет. 634 00:28:56,960 --> 00:28:59,970 Програмистите, които са написали софтуерът, който използвате 635 00:28:59,970 --> 00:29:03,570 попитайте на операционната система за памет на всеки няколко минути, всеки час. 636 00:29:03,570 --> 00:29:05,570 Но ако работите на софтуер, дори ако това е 637 00:29:05,570 --> 00:29:08,680 минимизиран в компютъра си за часове или дни наред, 638 00:29:08,680 --> 00:29:11,980 може да се кандидатства за повече и по- памет и всъщност никога не го използвате 639 00:29:11,980 --> 00:29:15,180 и така си код може да бъде, или програми може да има изтичане на памет, 640 00:29:15,180 --> 00:29:18,350 и ако започнете да протекат с памет, има по-малко памет за други програми, 641 00:29:18,350 --> 00:29:21,220 и ефектът е забави всичко надолу. 642 00:29:21,220 --> 00:29:23,600 >> Сега, това е далеч един от най-бруталните програми 643 00:29:23,600 --> 00:29:26,350 вие ще имате възможности да се движи в CS50 доколкото 644 00:29:26,350 --> 00:29:31,650 като мощността му е още по-езотерична, отколкото трясък или направи или някой от командата 645 00:29:31,650 --> 00:29:35,930 програми линия сме управлявани преди, но за щастие, вградени в неговата продукция 646 00:29:35,930 --> 00:29:39,810 е някои супер полезни съвети, които ще бъде от полза както за PSet четири 647 00:29:39,810 --> 00:29:41,510 или със сигурност PSet пет. 648 00:29:41,510 --> 00:29:44,250 Така valgrind е инструмент които могат да бъдат използвани да изглежда 649 00:29:44,250 --> 00:29:46,930 за изтичане на памет във вашата програма. 650 00:29:46,930 --> 00:29:48,570 Това е относително лесно да се работи. 651 00:29:48,570 --> 00:29:51,420 Стартирате valgrind и след това, дори макар че е малко многословно, 652 00:29:51,420 --> 00:29:54,440 пробив пробив проверка на течове се равнява на пълно, а след това Дот 653 00:29:54,440 --> 00:29:56,320 наклонена черта и името на вашата програма. 654 00:29:56,320 --> 00:30:00,010 Така valgrind тогава ще стартирате програмата и в самия край на програма 655 00:30:00,010 --> 00:30:02,240 използвате, преди да го напуска и дава още една бърза, 656 00:30:02,240 --> 00:30:04,980 то се случва да анализирате програма, докато е работила 657 00:30:04,980 --> 00:30:07,740 и кажете, че съм ви изтече всяка памет и още по-добре, 658 00:30:07,740 --> 00:30:10,610 Знаете ли, че докосва памет не принадлежи на вас? 659 00:30:10,610 --> 00:30:13,700 Тя не може да хване всичко, но това е доста добър начин за улавяне на повечето неща. 660 00:30:13,700 --> 00:30:19,700 >> Така че ето един пример от моята като бягане тази програма, като тече valgrind, 661 00:30:19,700 --> 00:30:21,470 на програма, наречена памет, и аз отивам 662 00:30:21,470 --> 00:30:24,730 да подчертаят линиите, които са в крайна сметка представлява интерес за нас. 663 00:30:24,730 --> 00:30:27,690 Така че има още повече отвличане на вниманието че съм изтрит от слайда. 664 00:30:27,690 --> 00:30:30,930 Но нека просто да видим какво това програма е в състояние да ни каже. 665 00:30:30,930 --> 00:30:34,800 Това е в състояние да ни казва неща като невалиден запис с размер 4. 666 00:30:34,800 --> 00:30:38,020 С други думи, ако докоснете памет, конкретно 4 байта памет 667 00:30:38,020 --> 00:30:40,350 че не трябва да има, valgrind мога да ви кажа, че. 668 00:30:40,350 --> 00:30:41,660 Невалиден запис с размер 4. 669 00:30:41,660 --> 00:30:43,640 Можете докосна четири байта че не трябва да има. 670 00:30:43,640 --> 00:30:44,840 Къде го направихте? 671 00:30:44,840 --> 00:30:45,900 Това е красотата. 672 00:30:45,900 --> 00:30:50,000 Дот Memory в ред 21 е мястото, където прецаках и затова е полезно. 673 00:30:50,000 --> 00:30:53,410 Много прилича GDB, тя може да помогне ви насочи към действителната грешка. 674 00:30:53,410 --> 00:30:57,170 >> Сега, това е малко по- многословно, ако не е объркващо. 675 00:30:57,170 --> 00:31:01,307 40 байта в 1 полета са определено изгубени в рекордна загуба 1 от 1. 676 00:31:01,307 --> 00:31:02,140 Какво означава това? 677 00:31:02,140 --> 00:31:05,920 Е, това просто означава, че сте поискали 40 байта и никога не го е дал назад. 678 00:31:05,920 --> 00:31:08,930 Можете нарича изчистване или да ви нарича GetString и операционната система 679 00:31:08,930 --> 00:31:12,450 ти 40 байта, но никога не ви е дал освободил или освобождава памет, която, 680 00:31:12,450 --> 00:31:15,400 и да бъдем честни, ние никога не сме се покаже как да върне паметта. 681 00:31:15,400 --> 00:31:17,910 Оказва се, че там е супер проста функция, наречена безплатно. 682 00:31:17,910 --> 00:31:21,170 Взема един аргумент, нещото искате да освободите или да даде назад, 683 00:31:21,170 --> 00:31:23,430 но 40 байта, както изглежда, в тази програма 684 00:31:23,430 --> 00:31:27,300 са били изгубени в ред 20 от паметта Дот гр. 685 00:31:27,300 --> 00:31:28,650 >> Така че нека да видим тази програма. 686 00:31:28,650 --> 00:31:31,020 Това е супер безполезен. 687 00:31:31,020 --> 00:31:33,980 Това само показва, тази грешка. 688 00:31:33,980 --> 00:31:34,920 Така че нека да разгледаме. 689 00:31:34,920 --> 00:31:39,920 Ето основните и основни, забележка, обаждания функция, наречена F и след това се връща. 690 00:31:39,920 --> 00:31:41,550 Така че не всичко, което интересно. 691 00:31:41,550 --> 00:31:42,664 Какво е да направя? 692 00:31:42,664 --> 00:31:44,330 Забележете, аз не се занимавам с прототип. 693 00:31:44,330 --> 00:31:46,520 Исках да пази кода възможно най-незначително. 694 00:31:46,520 --> 00:31:49,530 Така че сложих е над основната и това е добре, разбира се, 695 00:31:49,530 --> 00:31:51,500 за кратки програми като тази. 696 00:31:51,500 --> 00:31:56,910 Така е не връща нищо и прави Не приемайте нищо, но тя не направи това. 697 00:31:56,910 --> 00:31:59,620 Той декларира, който много прилича в примера Binky, 698 00:31:59,620 --> 00:32:02,682 указател нарича х, което се случва за съхраняване на адреса на инт. 699 00:32:02,682 --> 00:32:03,890 Така че това е лявата ръка. 700 00:32:03,890 --> 00:32:07,230 На английски език, това, което е най- дясна страна правиш? 701 00:32:07,230 --> 00:32:09,770 Някой? 702 00:32:09,770 --> 00:32:13,665 Какво е това, това за нас? 703 00:32:13,665 --> 00:32:14,651 Да? 704 00:32:14,651 --> 00:32:16,623 >> АУДИТОРИЯ: [недоловим] пъти размера на инт 705 00:32:16,623 --> 00:32:19,175 което е 10 пъти, че [недоловим] 706 00:32:19,175 --> 00:32:20,800 DAVID Malan: Доброто и нека да обобщим. 707 00:32:20,800 --> 00:32:25,480 Така отпусне достатъчно място за 10 числа или 10, което е с размерите на инт, 708 00:32:25,480 --> 00:32:29,340 това е четири байта, така че 10 пъти 4 е 40, така че дясната страна, че аз съм 709 00:32:29,340 --> 00:32:33,930 Осветената е да ми даде 40 байта и съхраняване на адреса на първия байт 710 00:32:33,930 --> 00:32:34,940 в х. 711 00:32:34,940 --> 00:32:38,380 И сега на последно място и тук е мястото, където тази програма е бъгав, какво е 712 00:32:38,380 --> 00:32:41,540 лошо в ред 21 на базата на тази логика? 713 00:32:41,540 --> 00:32:45,197 714 00:32:45,197 --> 00:32:46,280 Какво не е наред с линия 21? 715 00:32:46,280 --> 00:32:46,780 Да? 716 00:32:46,780 --> 00:32:49,550 АУДИТОРИЯ: Не можете да индекс в х [недоловим]. 717 00:32:49,550 --> 00:32:50,300 DAVID Malan: Да. 718 00:32:50,300 --> 00:32:52,270 Аз не трябва индекс в х подобно. 719 00:32:52,270 --> 00:32:53,850 Така синтактично, това е ОК. 720 00:32:53,850 --> 00:32:56,990 Какво е хубаво е, много като теб може да лекува името на масив 721 00:32:56,990 --> 00:33:01,080 като че ли това е указател, по подобен начин могат да се отнасят с теб показалец, сякаш това е 722 00:33:01,080 --> 00:33:06,425 масив, и така мога синтактично казват х конзола нещо, х скоба аз, 723 00:33:06,425 --> 00:33:07,800 но 10 е проблематично. 724 00:33:07,800 --> 00:33:09,096 Защо? 725 00:33:09,096 --> 00:33:10,910 >> АУДИТОРИЯ: Защото това не е вътре. 726 00:33:10,910 --> 00:33:12,390 >> DAVID Malan: Това не е вътре, че парче от паметта. 727 00:33:12,390 --> 00:33:15,306 Какво е най-голямата стойност I следва се поставя в тези квадратни скоби? 728 00:33:15,306 --> 00:33:16,870 9, 0 до 9. 729 00:33:16,870 --> 00:33:18,160 Заради нула индексиране. 730 00:33:18,160 --> 00:33:20,190 Така 0 до 9 ще се оправи. 731 00:33:20,190 --> 00:33:23,960 Bracket 10 не е добро и но, припомни обаче, всеки път, 732 00:33:23,960 --> 00:33:27,017 Изглежда не мога да се опита да направи CS50 IDE катастрофа, като се въведе фалшиви ценности, 733 00:33:27,017 --> 00:33:29,100 тя не винаги да си сътрудничат, и наистина, често 734 00:33:29,100 --> 00:33:31,460 получите късмет, само защото операционната система не се 735 00:33:31,460 --> 00:33:35,467 забележите, че сте все така леко мине известно парче от паметта, 736 00:33:35,467 --> 00:33:38,300 защото ти остана в рамките на технически сегмента си, но повече за това 737 00:33:38,300 --> 00:33:40,940 в операционните системи клас, и така нещо подобно 738 00:33:40,940 --> 00:33:43,000 можеше много лесно остават неразкрити. 739 00:33:43,000 --> 00:33:48,120 Вашата програма никога няма да се блъсне последователно, но може би от време на време. 740 00:33:48,120 --> 00:33:50,610 >> И така, нека се опитаме valgrind по този въпрос, и ето 741 00:33:50,610 --> 00:33:52,870 където ще изпаднете от изхода за миг. 742 00:33:52,870 --> 00:34:00,810 Така че се памет проверка valgrind течове се равнява на пълен точков наклонена черта памет. 743 00:34:00,810 --> 00:34:03,040 И тук е защо аз обещавам това ще смаже. 744 00:34:03,040 --> 00:34:05,700 Ето какво valgrind, ето какво програмист, няколко години по-ago- 745 00:34:05,700 --> 00:34:08,469 реши, че би било добра идея за изхода да изглежда така. 746 00:34:08,469 --> 00:34:09,750 Така че нека да има смисъл от това. 747 00:34:09,750 --> 00:34:13,120 Така че по целия път от лявата страна- страна без никакви основания 748 00:34:13,120 --> 00:34:16,620 е ID на процеса на програмата ние просто тичам, уникалният идентификатор 749 00:34:16,620 --> 00:34:18,030 за програмата ние просто избяга. 750 00:34:18,030 --> 00:34:19,738 Ние заличава че от слайда, но има 751 00:34:19,738 --> 00:34:22,190 е полезна информация тук. 752 00:34:22,190 --> 00:34:24,684 >> Нека да превъртите до самия връх. 753 00:34:24,684 --> 00:34:25,600 Тук е мястото, където започнахме. 754 00:34:25,600 --> 00:34:27,040 Така че това не е чак толкова много продукция. 755 00:34:27,040 --> 00:34:30,429 Ето, че невалиден запис с размер 4 на ред 21. 756 00:34:30,429 --> 00:34:31,760 Е, това, което беше ред 21? 757 00:34:31,760 --> 00:34:34,500 Line 21 е точно това и че има смисъл 758 00:34:34,500 --> 00:34:37,290 че аз съм в валидно написването 4 байта, защото аз съм 759 00:34:37,290 --> 00:34:40,389 опитвайки се да сложи това число, който може да бъде всичко, 760 00:34:40,389 --> 00:34:42,370 то просто се случва да бъде нула, но аз се опитвам 761 00:34:42,370 --> 00:34:44,940 да го постави на място, който не принадлежи на мен. 762 00:34:44,940 --> 00:34:50,900 Освен това, тук долу, 40 байта в една блокове определено са загубили в рекордно 1. 763 00:34:50,900 --> 00:34:56,500 Това е, защото, когато аз наричам изчистване тук, аз всъщност никога не освободи паметта. 764 00:34:56,500 --> 00:34:58,140 >> Така че как можем да поправя това? 765 00:34:58,140 --> 00:35:02,970 Нека да вървим напред и да е малко по-безопасно и да направим 9 там и да ме тук безплатно х. 766 00:35:02,970 --> 00:35:04,820 Това е най-новата функция за днес. 767 00:35:04,820 --> 00:35:11,520 Ако аз сега изпълнете отново направи памет дот наклонена черта, нека да тичам valgrind върху него отново, 768 00:35:11,520 --> 00:35:14,990 максимизиране моя прозорец и натиснете Enter. 769 00:35:14,990 --> 00:35:16,900 Сега, това е добре. 770 00:35:16,900 --> 00:35:19,590 Те погребват добрата новина в цялата продукция. 771 00:35:19,590 --> 00:35:20,810 Всички натрупаш блокове бяха свободни. 772 00:35:20,810 --> 00:35:23,604 Ще се върнем към това, което купчината е, но не са възможни течове. 773 00:35:23,604 --> 00:35:25,520 Така че това е просто още един инструмент за вашия комплект инструменти 774 00:35:25,520 --> 00:35:30,220 с която можете да започнете да откриете грешки сега като че. 775 00:35:30,220 --> 00:35:34,532 >> Но нека да видим какво повече може да се обърка тук. 776 00:35:34,532 --> 00:35:38,890 Нека сега да преход действително решаване на проблема. 777 00:35:38,890 --> 00:35:42,440 Като настрана, ако това ще облекчи малко от объркване или напрежение, 778 00:35:42,440 --> 00:35:43,430 това е вече смешно. 779 00:35:43,430 --> 00:35:46,400 780 00:35:46,400 --> 00:35:46,900 Да. 781 00:35:46,900 --> 00:35:49,040 Това е доста добър. 782 00:35:49,040 --> 00:35:50,890 Защото са указатели адреси и адреси 783 00:35:50,890 --> 00:35:53,098 като цяло са по споразумение написана с шестнадесетичен. 784 00:35:53,098 --> 00:35:54,650 Ха, ха, това е смешно сега. 785 00:35:54,650 --> 00:35:58,390 Във всеки случай, така че да позволи сега действително решаване на проблем. 786 00:35:58,390 --> 00:36:00,840 Това е супер, супер ниско ниво до този момент, 787 00:36:00,840 --> 00:36:03,950 и всъщност можем да направим полезно неща с тези детайли от ниско ниво. 788 00:36:03,950 --> 00:36:06,710 >> Така че ние въведохме няколко седмици Преди понятието масив. 789 00:36:06,710 --> 00:36:09,177 Масивът е хубаво, защото това е трудно да се почисти нашия код 790 00:36:09,177 --> 00:36:11,760 защото ако исках да напиша програма с множество студенти 791 00:36:11,760 --> 00:36:15,270 или няколко имена и къщи и общежития и колежи и всичко това, 792 00:36:15,270 --> 00:36:19,430 бихме могли да съхранявате всичко по- чисто вътре в масив. 793 00:36:19,430 --> 00:36:23,039 Но предлагам един недостатък на масив досега. 794 00:36:23,039 --> 00:36:26,080 Дори и да не съм го страдал себе си в една програма, просто инстинктивно, 795 00:36:26,080 --> 00:36:30,870 това, което е лошо нещо около един масив, може би? 796 00:36:30,870 --> 00:36:32,337 Чух някои шумове. 797 00:36:32,337 --> 00:36:34,170 АУДИТОРИЯ: Това е трудно за промяна на размера. 798 00:36:34,170 --> 00:36:36,128 DAVID Malan: Това е трудно за промяна на размера. 799 00:36:36,128 --> 00:36:38,660 Вие не можете да променяте размера на масив, в действителност, само по себе 800 00:36:38,660 --> 00:36:43,040 в C. Можете да отпусне още масив, премести всичко от стария 801 00:36:43,040 --> 00:36:45,380 в новото, а сега има някои допълнително пространство, 802 00:36:45,380 --> 00:36:47,469 но това не е като едно език като Java или Python 803 00:36:47,469 --> 00:36:49,760 или произволен брой други езици, с които някои от вас 804 00:36:49,760 --> 00:36:52,070 може да е запознат, където можете може просто да поддържа добавянето неща 805 00:36:52,070 --> 00:36:53,930 втръсване до края на масив. 806 00:36:53,930 --> 00:36:57,880 Когато имате масив от размер 6, която е неговия размер, 807 00:36:57,880 --> 00:37:01,970 и толкова много харесвам идеята по-рано като буфер с определен размер, 808 00:37:01,970 --> 00:37:05,940 ще трябва да отгатне от портата какъв размер искаш да бъдеш? 809 00:37:05,940 --> 00:37:07,880 Ако Предполагам твърде голям, можете да започнете да губите пространство. 810 00:37:07,880 --> 00:37:10,950 Ако Предполагам твърде малък, можете Не може да съхранява тези данни, най-малко 811 00:37:10,950 --> 00:37:12,940 без много повече работа. 812 00:37:12,940 --> 00:37:18,180 >> Така че днес, благодарение на указатели, което можем започнете шев заедно нашия собствен потребителски 813 00:37:18,180 --> 00:37:20,989 структури от данни, и по- Всъщност, тук е нещо, 814 00:37:20,989 --> 00:37:23,030 че изглежда малко по- загадъчен на пръв поглед, 815 00:37:23,030 --> 00:37:26,440 но това е, което ние ще се обадя на свързан списък, и неговото име вид обобщава 816 00:37:26,440 --> 00:37:26,940 това. 817 00:37:26,940 --> 00:37:29,550 Това е списък с номера, или в този случай, списък с номера, 818 00:37:29,550 --> 00:37:33,480 но тя може да бъде списък с нищо, но това е свързано заедно по пътя на стрели, 819 00:37:33,480 --> 00:37:36,380 и просто да вземе предположение с каква техника 820 00:37:36,380 --> 00:37:38,310 отиваме, за да може да бод заедно, 821 00:37:38,310 --> 00:37:42,540 нещо като пуканки с конец, на свързани списъци правоъгълници тук? 822 00:37:42,540 --> 00:37:43,936 Неговите номера? 823 00:37:43,936 --> 00:37:45,560 Каква е функцията на базовия език? 824 00:37:45,560 --> 00:37:46,350 >> АУДИТОРИЯ: A показалка. 825 00:37:46,350 --> 00:37:47,308 >> DAVID Malan: A показалка. 826 00:37:47,308 --> 00:37:51,700 Така че всеки един от тези стрели тук представлява указател или просто един адрес. 827 00:37:51,700 --> 00:37:54,590 Така че, с други думи, ако искам да съхранява списък с номера, 828 00:37:54,590 --> 00:37:59,040 Не мога просто да го съхранява, ако искам способността да расте и да се свие 829 00:37:59,040 --> 00:38:00,990 моята структура данни в масив. 830 00:38:00,990 --> 00:38:03,000 Така че аз трябва да има малко повече изтънченост, 831 00:38:03,000 --> 00:38:05,720 но забележете, че това снимка вид подсказва 832 00:38:05,720 --> 00:38:08,650 че ако сте просто имам малко теми свързващ всичко заедно, 833 00:38:08,650 --> 00:38:13,100 може би не е толкова трудно да се направи място между две от тези правоъгълници 834 00:38:13,100 --> 00:38:16,750 или две от тези възли, тъй като ние ще започнем наричайки ги, поставете нов възел, 835 00:38:16,750 --> 00:38:19,547 и след това с някаква нова тема, просто Отървете се от три възли заедно, 836 00:38:19,547 --> 00:38:22,880 първата, последната, и този, че просто поставя в средата. 837 00:38:22,880 --> 00:38:26,000 >> И наистина свързан списък, за разлика от масив, е динамична. 838 00:38:26,000 --> 00:38:27,840 Тя може да расте и може да свие и да не го направите 839 00:38:27,840 --> 00:38:32,434 Трябва да знаете, или грижи предварително как много данни, което ще се съхраняват, 840 00:38:32,434 --> 00:38:35,600 но се оказва, че трябва да бъдем малко по- внимателни за това как да се приложи това. 841 00:38:35,600 --> 00:38:39,070 Така че нека първо разгледаме как ние прилагаме едно от тия малките правоъгълници. 842 00:38:39,070 --> 00:38:40,690 Това е лесно да се приложи инт. 843 00:38:40,690 --> 00:38:44,000 Можете само да кажа, инт п и след това вие получавате 4 байта за едно цяло число, 844 00:38:44,000 --> 00:38:49,089 но как мога да получа едно цяло число, го наричат ​​п, а след това и показалеца, нека го наречем следващата. 845 00:38:49,089 --> 00:38:50,880 Можем да наречем тези неща, всичко, което искате 846 00:38:50,880 --> 00:38:53,590 но имам нужда от една структура потребителски данни. 847 00:38:53,590 --> 00:38:54,257 Да? 848 00:38:54,257 --> 00:38:57,020 >> АУДИТОРИЯ: Ampersand [недоловим]. 849 00:38:57,020 --> 00:39:00,940 >> DAVID Malan: Така амперсанд ние ще използваме, за да получите на адреса на един възел потенциално. 850 00:39:00,940 --> 00:39:02,740 Но ние трябва друг черта на C за 851 00:39:02,740 --> 00:39:06,700 за да ми даде възможност за създаване на този обичай правоъгълник, този обичай 852 00:39:06,700 --> 00:39:08,919 променлива, ако щете, в паметта. 853 00:39:08,919 --> 00:39:09,710 АУДИТОРИЯ: A структура на. 854 00:39:09,710 --> 00:39:10,626 DAVID Malan: A структура на. 855 00:39:10,626 --> 00:39:14,310 Спомнете си от миналата седмица, ние въведохме структура на това сравнително проста дума 856 00:39:14,310 --> 00:39:16,254 че ни позволява да направим нещата по този начин. 857 00:39:16,254 --> 00:39:18,420 C не дойде с данни структура, наречена студент. 858 00:39:18,420 --> 00:39:22,190 Той идва с инт и плувка и Чар и такава, но тя не идва с ученик, 859 00:39:22,190 --> 00:39:26,750 но можем да създадем тип студент данни, студент структура, с този синтаксис 860 00:39:26,750 --> 00:39:27,250 тук. 861 00:39:27,250 --> 00:39:28,350 И вие ще видите това отново и отново. 862 00:39:28,350 --> 00:39:30,426 Така че не се притеснявайте за запаметяването на ключовите думи, 863 00:39:30,426 --> 00:39:33,300 но ключовата дума, която е важна е просто на факта, че ние казахме структура на 864 00:39:33,300 --> 00:39:37,590 и след това ние го нарече ученик и вътре на ученика е име и къща 865 00:39:37,590 --> 00:39:39,390 или общежитието или други подобни. 866 00:39:39,390 --> 00:39:41,980 >> И така, сега и днес, нека да предложи това. 867 00:39:41,980 --> 00:39:45,240 Добавих няколко думи, но ако искам да приложат този правоъгълник, който е 868 00:39:45,240 --> 00:39:48,440 имам и двете едно цяло число и показалка, знаеш ли какво, аз съм 869 00:39:48,440 --> 00:39:51,540 ще обявят структура на нарича възел. 870 00:39:51,540 --> 00:39:55,630 Аз също съм, вътре в него, щях да кажа че една възлова точка, това правоъгълник, има INT 871 00:39:55,630 --> 00:39:59,730 и ние ще го наричаме и п има следващата показалеца. 872 00:39:59,730 --> 00:40:02,540 И това е малко по-многословен, но ако си мислиш за него, 873 00:40:02,540 --> 00:40:07,300 стрелките, които бяха в картината преди малко са от какъв тип данни? 874 00:40:07,300 --> 00:40:12,330 При всеки от тези стрелки сочи до какъв тип структура на данните? 875 00:40:12,330 --> 00:40:14,332 Това не е просто да посочи едно цяло число само по себе си. 876 00:40:14,332 --> 00:40:16,165 Тя посочи към Цялата правоъгълна нещо 877 00:40:16,165 --> 00:40:18,720 и че правоъгълна нещо, казахме, се нарича възел. 878 00:40:18,720 --> 00:40:21,720 И така, ние вид трябва да рекурсивно определи това като 879 00:40:21,720 --> 00:40:26,270 че една възлова точка, ние трябва да кажем, ще съдържа едно цяло число, наречено п 880 00:40:26,270 --> 00:40:31,070 и показалеца наречените следващата и тип структура данни, за които 881 00:40:31,070 --> 00:40:35,770 че показалецът точки е очевидно ще бъде структура на възел. 882 00:40:35,770 --> 00:40:41,550 >> Така че това е дразнещо многословно и само за да бъде педантичен, 883 00:40:41,550 --> 00:40:44,100 причината, поради която ние не можем Просто казвам това, което честно казано 884 00:40:44,100 --> 00:40:46,860 изглежда много по-разбираеми, е така, защото припомни, че C Прочети 885 00:40:46,860 --> 00:40:48,710 нещата горе до долу, от ляво на дясно. 886 00:40:48,710 --> 00:40:54,120 Това не е да изчакаме да вземем точка и запетая че действително съществува възела дума. 887 00:40:54,120 --> 00:40:57,980 Така че, ако искаме да имаме този вид цикличен позоваване вътре на данните 888 00:40:57,980 --> 00:41:02,120 структура, което трябва да направим това, когато ние казваме структура на възел в горната част, която 889 00:41:02,120 --> 00:41:06,770 ни дава по-дълъг начин да се опише тази нещо, а след това вътре казваме структура на възел, 890 00:41:06,770 --> 00:41:09,560 и след това в най-последния ред ние казваме, всичко е наред, C, между другото, 891 00:41:09,560 --> 00:41:12,060 просто се обадете цялата тази проклета нещо възел и да се спре 892 00:41:12,060 --> 00:41:14,360 с помощта на ключовата дума Struct напълно. 893 00:41:14,360 --> 00:41:18,030 Така че това е просто някак синтактичен трик, който в крайна сметка ни позволява да създадете 894 00:41:18,030 --> 00:41:21,370 нещо, което изглежда точно като този. 895 00:41:21,370 --> 00:41:25,010 >> Така че, ако приемем, сега можем да приложат това нещо в C, 896 00:41:25,010 --> 00:41:28,040 как правим в действителност започнете преминаващи този? 897 00:41:28,040 --> 00:41:32,360 Ами, всъщност, всичко, което трябва да направите, е обхождане от ляво на дясно и просто 898 00:41:32,360 --> 00:41:35,960 вид поставете възли или изтриване на възли или търсене на неща, където искаме, 899 00:41:35,960 --> 00:41:39,560 но да се направи това, да вървим напред и да направи нещата малко по-реално, защото това 900 00:41:39,560 --> 00:41:42,560 е било досега супер ниско ниво. 901 00:41:42,560 --> 00:41:45,700 Дали някой буквално искал да бъде на първо място? 902 00:41:45,700 --> 00:41:46,200 ДОБРЕ. 903 00:41:46,200 --> 00:41:47,092 Хайде нагоре. 904 00:41:47,092 --> 00:41:47,800 Как се казваш? 905 00:41:47,800 --> 00:41:48,499 >> DAVID: Дейвид. 906 00:41:48,499 --> 00:41:49,290 DAVID Malan: Дейвид. 907 00:41:49,290 --> 00:41:49,998 Приятно ми е. 908 00:41:49,998 --> 00:41:50,960 Аз също. 909 00:41:50,960 --> 00:41:52,450 Всичко е наред. 910 00:41:52,450 --> 00:41:53,990 И ние се нуждаем от номер 9. 911 00:41:53,990 --> 00:41:55,240 Не е толкова добър, колкото първия, може би. 912 00:41:55,240 --> 00:41:56,430 OK, номер 9. 913 00:41:56,430 --> 00:41:59,667 Редица 17, моля. 914 00:41:59,667 --> 00:42:01,000 Нека да се върнем малко по-нататък. 915 00:42:01,000 --> 00:42:03,980 Брой 22, моля, и Какво ще кажете за по-назад 916 00:42:03,980 --> 00:42:06,344 ако мога да видя никакви ръце с всичката светлина, или не. 917 00:42:06,344 --> 00:42:08,010 Някой се доброволец точно там. 918 00:42:08,010 --> 00:42:08,968 Искате ли да излезе? 919 00:42:08,968 --> 00:42:10,450 Вашият предмишницата е насилствено качвах. 920 00:42:10,450 --> 00:42:12,340 OK, 17. 921 00:42:12,340 --> 00:42:13,690 22. 922 00:42:13,690 --> 00:42:15,120 26 се слиза. 923 00:42:15,120 --> 00:42:18,450 Бихте някой друг искал да forcefully-- Хайде нагоре. 924 00:42:18,450 --> 00:42:21,030 Разрешава се действително доброволец. 925 00:42:21,030 --> 00:42:23,330 >> Така много бързо, ако вие може да подредите 926 00:42:23,330 --> 00:42:26,550 Просто обичам себе си възлите на екрана. 927 00:42:26,550 --> 00:42:27,510 Благодаря. 928 00:42:27,510 --> 00:42:29,234 И вие ще бъдете 26. 929 00:42:29,234 --> 00:42:30,650 Всички правилни и бързи запознанства. 930 00:42:30,650 --> 00:42:32,139 Така че аз съм Дейвид и вие също сте? 931 00:42:32,139 --> 00:42:32,680 DAVID: Дейвид. 932 00:42:32,680 --> 00:42:33,721 DAVID Malan: А вие сте? 933 00:42:33,721 --> 00:42:34,229 JAKE: Джейк. 934 00:42:34,229 --> 00:42:34,729 Сю: Сю. 935 00:42:34,729 --> 00:42:35,229 ALEX: Alex. 936 00:42:35,229 --> 00:42:36,475 RAPHAEL: Рафаел. 937 00:42:36,475 --> 00:42:37,100 TAYLOR: Taylor. 938 00:42:37,100 --> 00:42:37,466 DAVID Malan: Taylor. 939 00:42:37,466 --> 00:42:37,590 Отлично. 940 00:42:37,590 --> 00:42:39,810 Така че това са нашите доброволци за днес и да тръгнат напред 941 00:42:39,810 --> 00:42:43,090 и измести малко по този начин, и просто отидете напред и да запази 942 00:42:43,090 --> 00:42:47,024 държите вашите номера като сте или си Първият знак и с помощта на лявата си ръка, 943 00:42:47,024 --> 00:42:48,940 давай напред и просто изпълнение тези стрели, просто 944 00:42:48,940 --> 00:42:51,360 така, че лявата ръка е буквално сочейки към каквото и да трябва да посоча 945 00:42:51,360 --> 00:42:54,610 най-, и се даде някаква стая, така че визуално можем да видим ръцете си всъщност 946 00:42:54,610 --> 00:42:58,120 посочващо, а може просто да посоча вид на земята е добре. 947 00:42:58,120 --> 00:43:03,040 >> Така че тук имаме свързан списък на една, две, три, четири, пет възлови точки в началото, 948 00:43:03,040 --> 00:43:05,860 и забележи имаме тази специална показалеца в началото кой е 949 00:43:05,860 --> 00:43:09,770 ключ, защото ние трябва да следим на списъка на цялата дължина по някакъв начин. 950 00:43:09,770 --> 00:43:13,590 Тези момчета, въпреки че те са оставени надясно, да се върна обратно в паметта, 951 00:43:13,590 --> 00:43:15,950 те всъщност може да бъде навсякъде в паметта на компютъра. 952 00:43:15,950 --> 00:43:18,240 Така че тези момчета могат да бъдат стои някъде на сцената 953 00:43:18,240 --> 00:43:20,960 и това е добре, стига да сте всъщност сочи към един друг, 954 00:43:20,960 --> 00:43:22,770 но за да пазят нещата чисто и просто, ние ще 955 00:43:22,770 --> 00:43:25,728 просто да ги изготвят от ляво на дясно, като това, но може да има големи празнини 956 00:43:25,728 --> 00:43:26,790 между тези възли. 957 00:43:26,790 --> 00:43:30,710 >> Сега, ако искам да всъщност вмъкнете някои нова стойност, да вървим напред и да направим това. 958 00:43:30,710 --> 00:43:33,720 Ние имаме възможност сега да избере друг възел. 959 00:43:33,720 --> 00:43:39,820 Кажете нека да започнем с mallocing 55. 960 00:43:39,820 --> 00:43:41,320 Някой би ли нещо против да бъде изчистване? 961 00:43:41,320 --> 00:43:42,280 OK, хайде нагоре. 962 00:43:42,280 --> 00:43:42,992 Как се казваш? 963 00:43:42,992 --> 00:43:43,700 RAINBOW: Rainbow. 964 00:43:43,700 --> 00:43:44,050 DAVID Malan: Rainbow? 965 00:43:44,050 --> 00:43:44,810 Всичко е наред. 966 00:43:44,810 --> 00:43:46,600 Изчистване Rainbow. 967 00:43:46,600 --> 00:43:47,450 Хайде нагоре. 968 00:43:47,450 --> 00:43:51,610 Така че сега ние трябва да се запитаме алгоритмично, където можем да сложим 55. 969 00:43:51,610 --> 00:43:53,610 Така че всички ние знаем, Очевидно, когато тя вероятно 970 00:43:53,610 --> 00:43:55,401 принадлежи, ако ние се опитваме да запази тази сортирани 971 00:43:55,401 --> 00:43:58,299 и ако вие може да отнеме една крачка назад, така че ние не падне 972 00:43:58,299 --> 00:43:59,590 на сцената, че ще бъде страхотно. 973 00:43:59,590 --> 00:44:01,420 Така че всъщност, Rainbow, започнем отначало тук с мен, 974 00:44:01,420 --> 00:44:04,200 защото ние като компютърът вече могат да само вижте една променлива в даден момент. 975 00:44:04,200 --> 00:44:05,190 Така че, ако това е първия възел. 976 00:44:05,190 --> 00:44:07,160 Забележете, че той не е един възел, той е просто една показалка, 977 00:44:07,160 --> 00:44:10,270 и затова той е съставен, за да бъде само размера на показалеца, не 978 00:44:10,270 --> 00:44:11,780 един от тези пълни правоъгълници. 979 00:44:11,780 --> 00:44:16,650 Така че ние ще се проверява по всяко итерация е 55 по-малко от 9? 980 00:44:16,650 --> 00:44:17,150 Не. 981 00:44:17,150 --> 00:44:19,060 Е 55 по-малко от 17? 982 00:44:19,060 --> 00:44:19,720 Не. 983 00:44:19,720 --> 00:44:20,800 По-малко от 22? 984 00:44:20,800 --> 00:44:22,020 По-малко от 26? 985 00:44:22,020 --> 00:44:23,390 По-малко от 34? 986 00:44:23,390 --> 00:44:25,890 И така, сега, очевидно Rainbow принадлежи към края. 987 00:44:25,890 --> 00:44:27,270 Така че да е ясно и какво е вашето име, Тейлър? 988 00:44:27,270 --> 00:44:27,895 >> TAYLOR: Taylor. 989 00:44:27,895 --> 00:44:32,510 DAVID Malan: Така сред Тейлър лява ръка и ръцете Rainbow е тук, 990 00:44:32,510 --> 00:44:38,324 чиято ръка трябва да се отбележи в това, което в За да въведете 55 в този списък? 991 00:44:38,324 --> 00:44:39,240 Какво трябва да направим? 992 00:44:39,240 --> 00:44:39,700 Да? 993 00:44:39,700 --> 00:44:41,140 >> АУДИТОРИЯ: ръка на Тейлър Необходимо е да се отбележи лявата. 994 00:44:41,140 --> 00:44:41,680 >> DAVID Malan: Точно така. 995 00:44:41,680 --> 00:44:43,800 Така вмъкване на възел в края на списъка 996 00:44:43,800 --> 00:44:47,140 е доста проста, защото просто Taylor трябва да се отбележи, вместо към земята 997 00:44:47,140 --> 00:44:49,640 или ние ще го наричаме нищожна, нищожна е нещо отсъствието 998 00:44:49,640 --> 00:44:51,640 указател или на специална нулев указател, вие сте 999 00:44:51,640 --> 00:44:53,740 Ще посоча с лявата си ръката на Rainbow и след Rainbow, 1000 00:44:53,740 --> 00:44:55,910 Къде трябва да си ляв ръката вероятно посоча? 1001 00:44:55,910 --> 00:44:56,570 Първа. 1002 00:44:56,570 --> 00:45:00,140 Това не е добре, ако ръката й е нещо на сочеше тук или сортиране на всеки 1003 00:45:00,140 --> 00:45:00,640 по какъв начин. 1004 00:45:00,640 --> 00:45:02,407 Това щеше да се счита стойност на боклука, 1005 00:45:02,407 --> 00:45:04,240 но ако тя сочи към някои известна стойност, ние ще 1006 00:45:04,240 --> 00:45:07,360 го наричат ​​нула или нула, това е ОК защото имаме план в тази 1007 00:45:07,360 --> 00:45:09,390 и ние знаем, списъкът е завършена. 1008 00:45:09,390 --> 00:45:11,550 >> Така че това, което е още една сравнително прост случай? 1009 00:45:11,550 --> 00:45:13,125 Можем ли изчистване 5? 1010 00:45:13,125 --> 00:45:14,010 Хайде нагоре. 1011 00:45:14,010 --> 00:45:14,782 Как се казваш? 1012 00:45:14,782 --> 00:45:15,490 TIFFANY: Tiffany. 1013 00:45:15,490 --> 00:45:16,000 DAVID Malan: Съжалявам? 1014 00:45:16,000 --> 00:45:16,470 TIFFANY: Tiffany. 1015 00:45:16,470 --> 00:45:16,880 DAVID Malan: Tiffany. 1016 00:45:16,880 --> 00:45:17,110 Всичко е наред. 1017 00:45:17,110 --> 00:45:19,071 Tiffany е malloced със стойността 5. 1018 00:45:19,071 --> 00:45:19,570 Хайде нагоре. 1019 00:45:19,570 --> 00:45:23,820 Това е един сравнително лесно също, но нека разгледаме цел на операциите сега. 1020 00:45:23,820 --> 00:45:25,820 Това беше доста лесно с Тейлър в края. 1021 00:45:25,820 --> 00:45:30,302 Номер 5, разбира се, по-малко от 9, и така имаме Дейвид, имаме Tiffany, 1022 00:45:30,302 --> 00:45:31,260 и какво е вашето име? 1023 00:45:31,260 --> 00:45:31,680 >> JAKE: Джейк. 1024 00:45:31,680 --> 00:45:32,470 >> DAVID Malan: Джейк. 1025 00:45:32,470 --> 00:45:34,300 Tiffany, Джейк, и Дейвид. 1026 00:45:34,300 --> 00:45:36,580 Чия ръка следва да се актуализира на първо място? 1027 00:45:36,580 --> 00:45:39,260 1028 00:45:39,260 --> 00:45:40,590 Какво искаш да правим тук? 1029 00:45:40,590 --> 00:45:45,244 Има няколко възможни начина, но Има също така и един или повече погрешни начини. 1030 00:45:45,244 --> 00:45:46,620 >> АУДИТОРИЯ: Започнете с лявата. 1031 00:45:46,620 --> 00:45:47,800 >> DAVID Malan: Започнете с най-лявата. 1032 00:45:47,800 --> 00:45:49,008 Кой е най-лявата тук тогава? 1033 00:45:49,008 --> 00:45:49,700 АУДИТОРИЯ: Първо. 1034 00:45:49,700 --> 00:45:50,366 >> DAVID Malan: OK. 1035 00:45:50,366 --> 00:45:53,781 Така че започнете с първата и когато правиш искате да актуализирате ръцете на Давид да бъдат? 1036 00:45:53,781 --> 00:45:54,780 АУДИТОРИЯ: към 5. 1037 00:45:54,780 --> 00:45:55,446 DAVID Malan: OK. 1038 00:45:55,446 --> 00:45:59,026 Така Давид, буква в пет или Tiffany тук и сега? 1039 00:45:59,026 --> 00:46:01,072 >> АУДИТОРИЯ: Tiffany сочи към 9? 1040 00:46:01,072 --> 00:46:04,030 DAVID Malan: Perfect, с изключение на Binky главата просто вид падна, нали? 1041 00:46:04,030 --> 00:46:06,820 Защото това, което не е наред с тази снимка буквално? 1042 00:46:06,820 --> 00:46:08,070 АУДИТОРИЯ: Нищо не сочи. 1043 00:46:08,070 --> 00:46:09,945 DAVID Malan: Нищо не е сочейки към Джейк сега. 1044 00:46:09,945 --> 00:46:13,360 Ние буквално сираче 9 и 17, и ние сме буквално 1045 00:46:13,360 --> 00:46:18,450 изтече цялата памет, защото от актуализиране на ръката на Давид първо, това е 1046 00:46:18,450 --> 00:46:21,660 глоба, доколкото това е правилно сочеше Tiffany сега, 1047 00:46:21,660 --> 00:46:25,410 но ако никой не е имал далновидни, за да посоча Джейк, 1048 00:46:25,410 --> 00:46:27,490 тогава сме загубили цялост на този списък. 1049 00:46:27,490 --> 00:46:28,200 Така че нека да отмените. 1050 00:46:28,200 --> 00:46:30,950 Така че това е нещо добро за спъне но нека да поправи сега. 1051 00:46:30,950 --> 00:46:33,624 Какво трябва да направим първо, а? 1052 00:46:33,624 --> 00:46:34,124 Да? 1053 00:46:34,124 --> 00:46:35,791 >> АУДИТОРИЯ: Tiffany трябва да сочи към 9? 1054 00:46:35,791 --> 00:46:37,582 DAVID Malan: Аз не мога се получи, че в близост до вас. 1055 00:46:37,582 --> 00:46:38,720 Кой трябва да се отбележи в 9? 1056 00:46:38,720 --> 00:46:39,220 >> АУДИТОРИЯ: Tiffany. 1057 00:46:39,220 --> 00:46:39,390 >> DAVID Malan: Добре. 1058 00:46:39,390 --> 00:46:41,200 Така че трябва да Tiffany първа точка в 9. 1059 00:46:41,200 --> 00:46:43,550 Така че трябва да се Tiffany на същата стойност 1060 00:46:43,550 --> 00:46:45,820 Давид, който изглежда съкратени за миг, 1061 00:46:45,820 --> 00:46:48,820 но това е добре, защото сега, втора стъпка, можем да актуализираме ръката на Давид 1062 00:46:48,820 --> 00:46:52,680 да посочи в Тифани, а след това, ако Именно това се чисти нещата 1063 00:46:52,680 --> 00:46:55,740 като че това е вид като пролет, Сега това е правилното поставяне. 1064 00:46:55,740 --> 00:46:56,700 Така отлична. 1065 00:46:56,700 --> 00:46:57,970 Така че сега сме почти там. 1066 00:46:57,970 --> 00:47:01,075 Нека да вмъкнете един последен стойност, като стойността 20. 1067 00:47:01,075 --> 00:47:03,010 Ако можехме да изчистване един последен доброволец? 1068 00:47:03,010 --> 00:47:04,140 Хайде нагоре. 1069 00:47:04,140 --> 00:47:06,224 Така че това е малко по-сложно. 1070 00:47:06,224 --> 00:47:08,390 Но наистина, кодът сме писмено, макар и устно, 1071 00:47:08,390 --> 00:47:10,610 е просто като да имаш един куп ако условията на предприятието, нали? 1072 00:47:10,610 --> 00:47:12,318 Имахме състояние проверка дали то принадлежи 1073 00:47:12,318 --> 00:47:13,840 в края, може би началото. 1074 00:47:13,840 --> 00:47:15,940 Ние трябва някаква линия да намери място в центъра. 1075 00:47:15,940 --> 00:47:17,400 Така че нека да се направи, че с това, което ти е името? 1076 00:47:17,400 --> 00:47:17,700 >> ERIC: Eric. 1077 00:47:17,700 --> 00:47:18,340 >> DAVID Malan: Ерик? 1078 00:47:18,340 --> 00:47:18,660 Ерик. 1079 00:47:18,660 --> 00:47:19,368 Приятно ми е. 1080 00:47:19,368 --> 00:47:20,490 Така че ние имаме 20. 1081 00:47:20,490 --> 00:47:21,220 По-малко от пет? 1082 00:47:21,220 --> 00:47:21,530 Не. 1083 00:47:21,530 --> 00:47:22,160 По-малко от девет? 1084 00:47:22,160 --> 00:47:22,410 Не. 1085 00:47:22,410 --> 00:47:23,050 По-малко от 17? 1086 00:47:23,050 --> 00:47:23,550 Не. 1087 00:47:23,550 --> 00:47:23,740 ДОБРЕ. 1088 00:47:23,740 --> 00:47:25,701 Той принадлежи тук и Вашите имена отново са? 1089 00:47:25,701 --> 00:47:26,200 Сю: Сю. 1090 00:47:26,200 --> 00:47:26,880 DAVID Malan: Сю. 1091 00:47:26,880 --> 00:47:27,379 ALEX: Alex. 1092 00:47:27,379 --> 00:47:28,790 DAVID Malan: Sue, Алекс, а? 1093 00:47:28,790 --> 00:47:29,290 ERIC: Eric. 1094 00:47:29,290 --> 00:47:30,120 DAVID Malan: Eric. 1095 00:47:30,120 --> 00:47:32,140 Трябва да се актуализира първата чиито ръце? 1096 00:47:32,140 --> 00:47:32,930 >> АУДИТОРИЯ: Eric. 1097 00:47:32,930 --> 00:47:33,429 ДОБРЕ. 1098 00:47:33,429 --> 00:47:35,200 Така че Ерик трябва да посочи къде? 1099 00:47:35,200 --> 00:47:35,930 На 22. 1100 00:47:35,930 --> 00:47:36,430 Good. 1101 00:47:36,430 --> 00:47:38,180 И сега какво следва? 1102 00:47:38,180 --> 00:47:40,800 Sue след това може да се отбележи най-Eric и сега, ако вие просто 1103 00:47:40,800 --> 00:47:44,077 направи някои помещение, което е добре визуално, сега ние сме направили вкарването. 1104 00:47:44,077 --> 00:47:47,160 Така че нека сега разгледаме един въпрос, но Благодаря ви много за нашите доброволци. 1105 00:47:47,160 --> 00:47:48,090 Много добре направено. 1106 00:47:48,090 --> 00:47:50,831 Можете да запазите тези, ако искате. 1107 00:47:50,831 --> 00:47:54,140 И ние имаме един прекрасен подарък, ако раздяла всеки, който искате да вземете стрес топка. 1108 00:47:54,140 --> 00:47:56,030 Нека само да мине този надолу. 1109 00:47:56,030 --> 00:47:58,430 Така че какъв е храна за вкъщи от това? 1110 00:47:58,430 --> 00:48:02,430 Това изглежда да е невероятно дотолкова, доколкото имаме сега 1111 00:48:02,430 --> 00:48:06,360 въвежда алтернатива на решетка, която не е толкова ограничено 1112 00:48:06,360 --> 00:48:07,780 за масив от някои фиксиран размер. 1113 00:48:07,780 --> 00:48:09,380 Те могат да растат динамично. 1114 00:48:09,380 --> 00:48:13,220 >> Но много като сме виждали от седмици минало, ние никога не се получи нищо безплатно, 1115 00:48:13,220 --> 00:48:15,740 като със сигурност има компромис тук. 1116 00:48:15,740 --> 00:48:18,890 Така че с главата на свързан списък, е тази динамика? 1117 00:48:18,890 --> 00:48:21,590 Тази способност да растат и честно казано, можехме да направим за изтриване 1118 00:48:21,590 --> 00:48:23,570 и може да се свие, когато е необходимо. 1119 00:48:23,570 --> 00:48:24,710 Каква цена плащаме? 1120 00:48:24,710 --> 00:48:28,510 1121 00:48:28,510 --> 00:48:30,340 Два пъти повече пространство, на първо място. 1122 00:48:30,340 --> 00:48:34,010 Ако погледнете на снимката, вече не Аз съм съхраняване списък от цели числа. 1123 00:48:34,010 --> 00:48:36,740 Аз съм съхраняване списък на числа плюс указатели. 1124 00:48:36,740 --> 00:48:38,240 Така че аз съм удвояване на размера на пространството. 1125 00:48:38,240 --> 00:48:40,740 Сега, може би това не е такава голяма работа 4 байта, 8 байта, 1126 00:48:40,740 --> 00:48:43,160 но със сигурност може да се добавят за големи масиви от данни. 1127 00:48:43,160 --> 00:48:45,570 Какво е друг недостатък? 1128 00:48:45,570 --> 00:48:46,070 Да? 1129 00:48:46,070 --> 00:48:48,010 >> АУДИТОРИЯ: Ние трябва да тях преминават един по един. 1130 00:48:48,010 --> 00:48:48,760 DAVID Malan: Да. 1131 00:48:48,760 --> 00:48:50,260 Ние трябва да ги преминават един по един. 1132 00:48:50,260 --> 00:48:53,860 Знаеш ли какво, дадохме тази супер удобна функция на квадратен скоба 1133 00:48:53,860 --> 00:48:57,240 бройна система, по-правилно известен като произволен достъп, 1134 00:48:57,240 --> 00:48:59,280 където просто можем да скочи на индивид елемент 1135 00:48:59,280 --> 00:49:01,470 но сега, ако аз все още имах моите доброволци тук, 1136 00:49:01,470 --> 00:49:04,660 ако исках да открие най- номер 22, не мога просто 1137 00:49:04,660 --> 00:49:06,620 скочи до скоба нещо нещо. 1138 00:49:06,620 --> 00:49:10,530 Аз трябва да гледам през списъка, много по- като нашите търсещите примери линейно, 1139 00:49:10,530 --> 00:49:12,260 да се намери броя 22. 1140 00:49:12,260 --> 00:49:14,340 Така че ние като че ли са платили цената там. 1141 00:49:14,340 --> 00:49:16,430 Но ние можем все пак решаване на други проблеми. 1142 00:49:16,430 --> 00:49:18,587 >> Всъщност, нека представим само няколко визуализации. 1143 00:49:18,587 --> 00:49:20,920 Така че, ако сте били до Dining Hall Mather наскоро, 1144 00:49:20,920 --> 00:49:23,320 ще припомним, че тяхната купчини тави като този, 1145 00:49:23,320 --> 00:49:26,300 ние назаем от тях Annenberg преди клас. 1146 00:49:26,300 --> 00:49:28,930 Така че тази купчина от подноси, все пак, е представител действително 1147 00:49:28,930 --> 00:49:30,860 на структурата на данните на компютърните науки. 1148 00:49:30,860 --> 00:49:32,910 Има структурата на данните по компютърни науки 1149 00:49:32,910 --> 00:49:38,010 известен като комин, който много добре се поддава на точно тази визуална. 1150 00:49:38,010 --> 00:49:41,380 Така че, ако всяка от тези тави не е тава, но като брой и исках 1151 00:49:41,380 --> 00:49:45,010 за съхраняване на номера, I може да постави един тук, 1152 00:49:45,010 --> 00:49:48,320 и аз може да постави нов тук, и да продължи да ги съберете накуп номера 1153 00:49:48,320 --> 00:49:53,180 на върха на един от друг, и това, което е потенциално полезна за този 1154 00:49:53,180 --> 00:49:55,450 е, че това, което е влиянието на тази структура данни? 1155 00:49:55,450 --> 00:49:58,045 Кое число мога да извадя първо най-удобно? 1156 00:49:58,045 --> 00:50:00,640 1157 00:50:00,640 --> 00:50:03,030 Най-скоро една постави на там. 1158 00:50:03,030 --> 00:50:06,430 >> Така че това е, което ние наричаме в компютърни науки структура данни LIFO. 1159 00:50:06,430 --> 00:50:08,070 Последен вътре, първо се изважда. 1160 00:50:08,070 --> 00:50:10,800 И ние ще видим след дълго защо които биха могли да бъдат полезни, но за сега, 1161 00:50:10,800 --> 00:50:12,200 Просто помисли за имота. 1162 00:50:12,200 --> 00:50:15,158 И това е нещо глупаво ако смятате за това как трапезарията го прави. 1163 00:50:15,158 --> 00:50:17,910 Всеки път, когато чисти тави и сложи най-пресните тези на върха, 1164 00:50:17,910 --> 00:50:22,160 бихте могли да имат по-рано чиста но в крайна сметка много мръсна и прашна 1165 00:50:22,160 --> 00:50:24,360 табла на самото дъно ако никога всъщност 1166 00:50:24,360 --> 00:50:26,820 стигнем до дъното на това стак, защото просто 1167 00:50:26,820 --> 00:50:29,380 продължават да отправят новото и чистите тези на върха му. 1168 00:50:29,380 --> 00:50:31,840 Същото нещо може да се случи в супермаркет също. 1169 00:50:31,840 --> 00:50:35,450 Ако имате витрина на мляко и всеки път, CVS 1170 00:50:35,450 --> 00:50:37,610 или който и да получава повече мляко, просто бутам млеката 1171 00:50:37,610 --> 00:50:39,880 вече имате на гърба и сложите новите отпред, 1172 00:50:39,880 --> 00:50:43,088 започваш да имат някои доста груба мляко в края на структурата на данните, 1173 00:50:43,088 --> 00:50:46,390 защото тя винаги е на дъното, или еквивалентно тя винаги е на гърба. 1174 00:50:46,390 --> 00:50:50,407 >> Но има и друг начин да се мисли за редят на опашка данни и например това. 1175 00:50:50,407 --> 00:50:53,490 Ако вие сте един от тези хора, които харесва да се подредят извън магазина на Apple 1176 00:50:53,490 --> 00:50:55,610 когато един нов продукт идва , вие вероятно сте 1177 00:50:55,610 --> 00:50:58,780 не се използва данни стак структура, защото вие 1178 00:50:58,780 --> 00:51:03,070 ще отблъсне всеки друг, който е редят на опашка, за да закупите някои нова играчка. 1179 00:51:03,070 --> 00:51:06,610 По-скоро, вие сте вероятно използва каква структура от данни 1180 00:51:06,610 --> 00:51:10,050 или каква система в реалния свят? 1181 00:51:10,050 --> 00:51:13,493 Надяваме се, че това е линия, или по- правилно или повече British-подобни, опашка. 1182 00:51:13,493 --> 00:51:17,700 И се оказва, опашката е и структура на данните по компютърни науки, 1183 00:51:17,700 --> 00:51:19,700 но опашка има много различна собственост. 1184 00:51:19,700 --> 00:51:20,820 Това не е LIFO. 1185 00:51:20,820 --> 00:51:21,990 Последен вътре, първо се изважда. 1186 00:51:21,990 --> 00:51:22,800 Пази Боже. 1187 00:51:22,800 --> 00:51:24,280 Това е вместо FIFO. 1188 00:51:24,280 --> 00:51:26,110 Първо, първа изходяща. 1189 00:51:26,110 --> 00:51:27,970 И това е нещо добро за справедливост заради " 1190 00:51:27,970 --> 00:51:30,428 Със сигурност, когато сте облицовка до супер рано сутринта. 1191 00:51:30,428 --> 00:51:33,400 Ако отида там на първо място, вие искам да се махна първо, както добре. 1192 00:51:33,400 --> 00:51:35,880 >> И така, всички тези данни конструкции, опашки и стекове 1193 00:51:35,880 --> 00:51:39,220 и букети от другите, оказва ли мога да мисля за това като просто масив. 1194 00:51:39,220 --> 00:51:41,820 Това е масив, може би фиксиран размер 4, но това щеше 1195 00:51:41,820 --> 00:51:44,990 да бъде вид хубаво, ако бихме могли просто да се трупат тави почти безкрайно висока, ако искаме 1196 00:51:44,990 --> 00:51:46,780 има толкова много тави или номера. 1197 00:51:46,780 --> 00:51:48,840 Така че може би ние искаме да използването на свързан списък тук 1198 00:51:48,840 --> 00:51:51,800 но компромисът ще бъде потенциално, че имаме нужда от повече памет, 1199 00:51:51,800 --> 00:51:55,930 отнема малко повече време, но ние не ограничават височината на купчината, 1200 00:51:55,930 --> 00:51:59,550 много като витрина на Mather може да ограничи размера на пакета, 1201 00:51:59,550 --> 00:52:03,117 и така това са решения на дизайна или възможности, които съществуват за нас в крайна сметка. 1202 00:52:03,117 --> 00:52:04,950 Така че с тези данни структури, които сме започнали 1203 00:52:04,950 --> 00:52:09,360 виждам нови горна граници потенциално от това, което преди това беше супер бързо 1204 00:52:09,360 --> 00:52:11,260 и къде ще оставим разстояние днес и къде 1205 00:52:11,260 --> 00:52:13,200 ние ще се надяваме да стигнем до е в сряда, ние ще 1206 00:52:13,200 --> 00:52:15,740 започнете да погледнете за данни структура, която ни позволява да търсите 1207 00:52:15,740 --> 00:52:18,260 чрез данни в дневника време край отново. 1208 00:52:18,260 --> 00:52:21,470 И ние видяхме, че си спомняте, в нула седмица и един с двоично търсене или пропаст 1209 00:52:21,470 --> 00:52:22,180 и владей. 1210 00:52:22,180 --> 00:52:26,240 Той се връща и още по-добре, Светия Граал за тази сряда 1211 00:52:26,240 --> 00:52:29,510 ще бъде да излезе с най- структура от данни, която работи наистина 1212 00:52:29,510 --> 00:52:32,070 или теоретично в константно време, при което 1213 00:52:32,070 --> 00:52:34,760 няма значение колко милиони или милиарди неща 1214 00:52:34,760 --> 00:52:38,470 имаме в структурата на данните, тя ще предприеме нас константно време, може би една стъпка 1215 00:52:38,470 --> 00:52:41,387 или две стъпки или 10 стъпки, но постоянни брой стъпки 1216 00:52:41,387 --> 00:52:42,970 да се търси чрез които структурата на данните. 1217 00:52:42,970 --> 00:52:46,300 Това наистина ще бъде Светия Граал но повече за това в сряда. 1218 00:52:46,300 --> 00:52:49,045 Ще се видим тогава. 1219 00:52:49,045 --> 00:52:53,704 >> [За възпроизвеждане на музика] 1220 00:52:53,704 --> 00:56:08,448