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