[Музички] Дејвид Џ MALAN: Во ред. [Смеа] Добредојде назад. Ова е CS50. И ова на крајот од неделата пет. И до сега, ние сме доста е земајќи здраво за готово дека постојат постои овој компајлер, ѕвекот, дека сте се повикува по пат на ова други алатка наречена Направете дека некако магично го претвора вашиот изворен код во објектно код, нули и единици дека вашите компјутери процесорот, централна единица за обработка, всушност, го разбира. Но излегува има голем број што е случува под хаубата во помеѓу влез и излез. И јас би сакал да предложам дека ние месо дека во малку повеќе детали во овие четири чекори, имаат нешто што се нарекува претходна обработка, нешто наречен составувањето, што го видовме, нешто што се нарекува монтажа, и нешто што се нарекува поврзува. Па до сега, во некои од нашите програми, имавме остри вклучува. Повеќе неодамна имавме некои остри дефинира за константи. Значи излегува дека оние нешта кои се префикс со хаш симбол или на фунтата симбол се пред-процесор директиви. Тоа е само фенси начин да се каже тоа е линија на кодот кој е всушност претворени во нешто друго пред компјутер дури и се обиде да ги конвертирате вашите програма во нулите и. На пример, остар вклучува стандардни I / O. Ж, доста едноставно значи одат Ајде, го дофати содржината на датотеки stdio.h и ставете ги во право, таму. Значи без нулите и во тој момент сеуште. Тоа е навистина само измена. И тоа е направено за време на т.н. претходна обработка фаза, кога ќе всушност се кандидира ѕвекот или конкретно Направи во повеќето случаи. Па сето ова се случува Првиот автоматски досега. Потоа доаѓа компилација чекор. Но, сме премногу едноставната компилација. Составувањето на програмата навистина значи да се да ја од нешто како Ц, изворниот код ние сме биле пишување, надолу да се нешто што се нарекува собранието. Собранието јазик е на пониско ниво јазик, кој, за среќа, ние нема имаат многу прилика да пишувам овој семестар. Но тоа е на најниско ниво во смисла дека вие буквално почнете со пишување додаде и одземе се и множете се и оптоварување од меморијата и зачувате на меморија, многу основни инструкции кои компјутерот, под капакот на моторот, всушност разбира. И на крај, монтажа зема дека јазикот на нулите и дека ние сме биле опишувајќи досега. И навистина на крај, тука е и т.н. поврзување фаза, која ние ќе види во само еден миг, кој ги комбинира Вашиот нулите и со нули и оние други луѓе пред имаш креирано. Па сметаат дека овој супер едноставна програма. Тоа беше од недела 1. Тоа само рече, Здраво Светот, на екранот. Ние се стрча ова преку ѕвекот. Или ние трчаше низ Направете кој трчаше ѕвекот. И outputted во времето кога некои нули и единици. Но излегува постои една преодна чекор. Ако одам над тука - Упс, не сакате да го видам уште. Ако одам над тука на мојот апарат и јас се отвори hello.c, тука е дека истата програма. И она што јас ќе одам да направите во мојот терминал прозорец тука е, ќе одам да се кандидира ѕвекот, а не се направи, што автоматизира сите четири оние кои се чекорите за нас. И јас ќе одам да направите ѕвекот-S и тогаш hello.c и потоа внесете. И можам да добијам трепка брзо повторно, што е добро. И сега во малку поголем прозорец, Одам да се отвори gedit тука. И јас одам да се отвори датотеката која, Излегува, се нарекува hello.s овој ги содржи тој асемблерски јазик Јас од порано. И ова е она што се нарекува собранието јазик, прилично ниско ниво инструкции кои Интел процесор или што е тоа што е внатре разбира. И МОВ е за потег. Повикот е за повик, на многу ниско ниво функција. под е за одземање. Па кога ќе имаат посебен процесорот внатре на вашиот компјутер, она што го прави различни, наспроти други процесори на пазар, се што инструкциите се разбира и често како ефикасно тоа е, колку брзо тоа е во извршување на некои на оние инструкции. Сега за повеќе информации за ова, можете да ги следната есен CS61 во колеџот. Но, тука имаме, на пример, неколку идентификатори кои би можеле да изгледаат познатите. hello.c е името на програмата. . Текст - таму не е многу на интерес постои само сега, да се потсетиме дека текстот сегмент, почнувајќи од понеделник, е местото каде што во меморијата на вашиот програма всушност завршува. Па тоа е барем нејасно запознаени таму. Тука, се разбира, е да се спомене од нашите главни функција. Лизгање надолу, овие се однесуваат на нештата наречен регистри, многу мали парчиња на меморија внатрешноста на вашиот вистински процесорот. И ако јас дојдете долу дури и понатаму, гледам некој вид индиректни споменување на ASCII. И таму, навистина, е дека низа, Здраво, запирка, светот. Па скратам приказната, ова е случува за вас, автоматски, под хауба сето ова време. И она што се случува е навистина еднаш сте работи ѕвекот, или по пат на Направи, ти си добивање прво, од изворен код, т.н. асемблер јазикот. Тогаш ѕвекот е конвертирање овој собир јазик сведува на оние кои и нули. И ова е слајд дека почнавме нашата дискусија во недела 0 на - а потоа недела 1 натаму. А потоа, конечно, и оние нули и единици се комбинирани со нулите и од оние библиотеки ние сме биле преземање здраво за готово како Стандардна I / O или Стринг библиотека, па дури и на CS50 библиотека. Така да се наслика оваа слика повеќе визуелно, имаме hello.c. И тоа, се разбира, го користи на printf функција да се каже, Здраво светот. Компилација чекор што е потребно надолу за да таа датотека ние само видов hello.s, дури и иако тоа е обично избришани автоматски за вас. Но тоа е асемблерски код во средината чекор. А потоа кога ќе се соберат на собранието јазик, така да се каже, тоа е кога ќе се оние оние кои и нули. Па ние сме zoomed во ефикасно денес на она што ние сме биле преземање здраво за готово, значи дека ќе изворниот код да се спротивстават код. Но на крај, сега кога истата слика - ајде да се бутам во текот на на левата страна. И се напомене дека во првите таму Јас спомнав stdio.h. Тоа е датотека која ние сме вклучени во речиси сите програми што сум напишал. И тоа е датотека чии содржини се копија атипичен, ефикасно на врвот на вашиот код. Но излегува дека, на компјутер систем некаде, таму е веројатно една stdio.c датотека која некој напишал години пред која спроведува сите функции кои беа прогласени за во stdio.h. Сега, во реалноста тоа не е веројатно на вашиот Mac или вашиот компјутер или дури и во CS50 апаратот е сурова C код. Некој веќе го составил и вклучени . O датотека за објектниот код или. На датотека, која се однесува на споделена библиотека и тоа е се пре-инсталиран и претходна Составувач за вас. Но, да претпоставиме дека постои навистина постои на нашиот компјутер stdio.c паралелно со ѕвекот. Вашиот код е се состави и склопени. stdio.c Додади кодот е се компилирани и составуваат, така што овој последен чекор, долу тука, имаме некако линк, така да се каже, вашиот нули и единици со неговите или нејзините нули и единици во една едноставна програма со која конечно е наречен само Здраво. Значи тоа е сите на магија, тоа е се случува досега. И ќе продолжи да ги преземат овие процеси здраво за готово, но сфати има многу сочни детали случува во позадината таму. И тоа е она што го прави вашиот компјутер со Intel внатре особено различни. Така, на тој белешка, ако би сакал да ни се придружат за ручек овој петок, не одат на вообичаено место cs50.net/rsvp, 13:15 овој петок. И сега неколку пораки. Па ние имаме некои добри вести. И ние имаме некои лоши вести. Започнете со некои добри вести овде. [Стенка] Сите во право. Па, тоа е технички одмор, па тоа не е толку како подарок од нас. Но, тогаш на лошите вести се разбира. [Стенка] Поминав многу време на овие анимации. [Смеа] Ќе има преглед на сесијата ова доаѓа понеделникот. Тоа се случува да биде во 05:30. Ние ќе ве потсетам на сите овие детали преку е-маил на курсот веб-сајт во само неколку дена. Тоа ќе биде снимен и ставени на располагање набргу потоа. Па ако не може да го направи тој понеделник ноќ слот, не се грижи. Секции овој следната недела ќе исто така се фокусира на преглед за квиз. Ако вашиот дел е во понеделник, што е навистина универзитет одмор, ние ќе уште се сретнат во секција. Ако едноставно не може да го направи тој делот, бидејќи си оди подалеку, тоа е во ред. Присуствува на недела или вторник дел или мелодија-во делот Џејсон, кој е достапни на интернет. Значи, повеќе лоши вести. Па според наставната програма, имаме предавање следниот петок. Но добрата вест - јасно, сум поминал премногу време за тоа. [Смеа] Ќе добие англиска следната предавања во петокот. Така што ќе биде подарок за нас, така што навистина може да имаат убав одмор во помеѓу оваа недела и две недели оттаму. Па нема предавања следната недела, само мал малку квизот, за што треба да биде заострува возбудени. Па ајде сега го свртиме нашето внимание нешто што е навистина повеќе визуелни и повеќе возбудлив и да се постави на сцената за она што се случува за да биде на хоризонтот во само неколку недели време. По првиот квиз, ние ќе го вклучите се фокусира на нашиот проблем поставува на друг домен специфичен проблем, дека на криминолошки науки или безбедносни поопшто. Всушност, традицијата со овој проблем собата е за мене едно од настава колеги или издавачи да одат низ кампусот преземање на некои фотографии од идентификува, но не очигледно луѓе, места или работи, тогаш секоја година јас некако успеваат да избришете случајно или корумпирани дигитални медиуми картичка тоа е во внатрешноста на нашата камера. Но нема ништо страшно. Јас може да оди напред и да го приклучиш дека во мојот компјутер. Јас може да направи форензички сликата од него, па да се каже, со копирање на нули и оние надвор од таа мемориска картичка, без разлика дали тоа е SD картичка или Compact Flash картичка или она што сте запознаени со. А потоа можеме да го предаде тоа. И така предизвик, меѓу другите работи за вас, ќе биде да се напише C кодот кој го обновува целиот куп на JPEG слики за мене и да се открие ќе биде оние луѓе, места, или предмети. И ние исто така ќе разговараме, во овој проблем постави и во деновите што доаѓаат, за графика поопшто. Сме ги користат, а се разбира, за се пробие. Но, сте вид на зема здраво за готово постои овие високо ниво поими на правоаголници и ovals. Но под капакот на моторот постојат пиксели. И сте имале да започне размислување за нив. Или ќе за p-сет 4 треба да се размислува за јазот помеѓу вашиот тули, како брзо сте топката се движи низ на екранот за се пробие. Па таму е овој поим на точки на вашиот екран и тоа е доаѓаат во игра веќе. Сега она што го гледате, сепак, е она што ќе го добиете на екранот на компјутерот. Ако некогаш сте се гледаше некои добри или лоша телевизија, шансите се тие доста третираат публиката како технофобите кои навистина не знаат многу за компјутери. И така тоа е многу лесно за полицијата детектив да кажам, може да ви исчисти дека за мене? Или подобрување, нели? Подобрување е како зуи збор во повеќето било криминал поврзани со шоуто. А реалноста е ако се земе една многу матно слика на осомничениот прави нешто лошо, не можете да само го подобрат. Вие не може да зумирате бескрајно. Не можете да видите во трепкаат на нечија око кои извршиле дека особено криминал, и покрај Преваленцијата на овој на ТВ. И така со тоа, ајде да ги мотивира дека претстојните проблем во собата со еден поглед на некои емисии со кои можете може да биде запознаен. [Видео репродукција] -Во ред. Сега, ајде да се добие добар поглед на вас. Тоа-Hold. Работи таа назад. -Чекај малку. Одат право. -Има. Замрзнување на тоа. -Комплетна екран. -Во ред. Замрзнување на тоа. -Стегнете на тоа, ќе ти? -Вектор во на тој и тој од страна на задното тркало. -Зум во право тука на ова место. -Со право на опрема, сликани може да се зголеми и изострен. -Што е тоа? -Тоа е подобрување на програмата. -Може да ви јасно дека која било? -Не знам. Ајде да го подобрат. -Подобрување на делот А-6. -Јас засилиле детали и - -Мислам дека е доволно за да се подобрат. Порака тоа да мојот екран. -Подобрување на рефлексија во нејзиното око. -Ајде да се кандидира тоа преку видео подобрување. -Едгар, можете да го подобрат ова? -Држи се. -I've работи на овој рефлексија. Некој-е рефлексија. -Рефлексија. -Има рефлексија на лицето на човекот. -На рефлексија. -Има рефлексија. -Зголемување на огледалото. -Можете да се види одраз. -Може да ви го подобри имиџот од тука? -Може да ви го подобрат тука? -Може да ви го подобрат? -Може да ви го подобрат? -Може ли подобри ова? -Може да ви го подобрат? -Почекај секунда, јас ќе се подобри. -Зголемување на вратата. -X10. -Зум. [Смеа] -Вселат -Чекај, да престане. -Стоп. Тоа-пауза. Ротирање на 75 степени околу на вертикалната молам. [Смеа] -Престани, и назад до делот за врата повторно. -Имаш слика подобрувач кои можат да битмапа? -Можеби можеме да го користиме на Pradeep Сен метод за да ја видите во Windows. -Овој софтвер е држава на уметноста. -Иконата вредност е исклучено. -Со вистинската комбинација на алгоритми. -Тој е донесена осветлување алгоритми за да се на следното ниво и можам да ги користите за да подобрување на оваа фотографија. -Заклучи на и зголемување на z-оската. -Подобрете. -Подобрете. -Подобрете. Замрзнување и подобрување. [Крај видео репродукција] Дејвид Џ MALAN: Значи Проблем Постави 5 е она што лежи пред таму. Па ние наскоро ќе добие подобро разбирање на тоа кога и зошто можете да и нашите не може да го подобри на тој начин. Но, прво, да се врати нашето внимание на некои од градежни блокови ние ќе треба да биде во можност да раскажуваме таа приказна. Па се потсетиме дека ние привлече оваа слика на Понеделник и малку минатата недела. И ова го опишува изгледот на работите во меморијата на вашиот компјутер кога извршува некои програма. Технолошки сегмент до врвот, се потсетиме, се однесува со реалните нули и единици кои ја сочинуваат вашата програма. Има, под тоа, некои иницијализира или деиницијализира податоци, кои обично се однесува на работи како константи или жици или глобални променливи кои имаат е прогласена во однапред. Тука е и грамада, но ние ќе се назад кон тоа во малку. И потоа, тука е магацинот. Слично на магацинот на коцки во кафетеријата, ова е местото каде меморија добива слоевит и слоевит секогаш кога го направи она што во програмата? Она што е на магацинот користите за? Да? Јавете се на функција. Секое време да се јавите на функција, тоа е даден на треска на меморија за своите локални променливи или нејзините параметри. И сликовито, можеме да видиме дека со секој последователни функција наречена, кога повици повика се Б Ц повици Д, тие се слоевит врз оџакот. И во рамките на секоја од овие парчиња меморија е во суштина уникатен обемот за таа функција, која, се разбира, е проблематична, ако сакате да го предаде од една функција на друга А парче на податоците кои што сакате да мутира или промена. Па што беше нашето решение за овозможување на А функција претставен од страна на еден оџак обликувате да ја промените меморијата во внатрешноста на друга магацинот рамка? Како да направите овие две разговор еден на друг? Па по пат на совети или адреси, кои, повторно, само се опише каде во меморија, по пат на специфични залак број, особено вредност може да се најде. Па се потсетиме на последниот пат премногу продолживме приказната и погледна на прилично кабриолет програма. И оваа програма е кабриолет за неколку причини, но најмногу загрижувачки еден е затоа што тоа не успее да се провери што? Да, тоа не успее да се провери на влез. Е жал? Ако тоа е повеќе од 12 карактери. Толку многу умно, кога повикувате memcopy, кои, како што сугерира името, само копии меморија од својата втора аргумент во својот прв аргумент. Третиот аргумент, многу умно, е проверил за да бидете сигурни дека ќе не копирате повеќе од, во овој случај, должината на бар, број на карактери, во дестинација, што е ова низа C. Но, проблемот е во тоа што ако C сама по себе не е доволно голема да се справи со тоа? Сте ќе треба да го копирате бројот на бајти дека сте биле дадени. Но, она што, всушност, имаат повеќе бајти отколку ти што имаш простор за? Па, оваа програма е многу глупаво само слепо продолжува да се земе она што е дадени, здраво обратна коса црта 0 е голем, ако стрингот е краток доволно, како пет карактери. Но, ако тоа е всушност 12 карактери или 1200 карактери, видовме последен пат дека сте само ќе целосно пребришете меморија која не припаѓа на тебе. И најлош случај, ако ги избрише тој црвени дел таму дека ние наречен се врати адреса - ова е само каде што компјутерот автоматски, за вас, зад сцени, tucks далеку 32-битна вредност која потсетува тоа на она адреса што треба се врати кога foo, ова друга функција, е направено извршување. Тоа е леб трошка на сорти на кои тој се враќа. Ако ги избрише тој, потенцијално, ако сте лошо момче, да би можеле потенцијално преземе некој компјутер. И ќе повеќето сигурно паѓањето тоа во повеќето случаи. Сега овој проблем е само влошува како почнавме да зборуваме за меморија управување со поопшто. И Примерок, за распределбата на меморија, е функција која може да се користат да се распредели меморија кога не знаеме однапред дека ние би можеле да треба некои. Така, на пример, ако одам назад на апаратот тука. И јас се отворат од последниот пат hello2.c, потсетиме оваа програма тука, која изгледаше малку нешто како ова, само три линии - наведе вашето име, а потоа Стринг име, на левата страна, е еднаква на getstring. А потоа ние го испечатите, на корисникот име. Значи ова беше супер едноставна програма. Да биде јасно, дозволете ми да оди напред и направи здраво-2. Јас ќе одам да направите точка коса црта здраво-2. Наведете го вашето име - Давид. Enter. Здраво Дејвид. Се чини да се работи во ред. Но, она што навистина се случува под хауба тука? Прво нека кора назад некои слоеви. Стринг е само синоним ние сме реализира за што? Char ѕвезда. Па ајде да се направи тоа малку повеќе arcane но повеќе технички точно дека оваа е знак ѕвезда, што значи дека име, да, е променлива. Но, она што име продавници е адресата на char, која се чувствува малку чудно бидејќи јас сум добивање на врати стринг. Јас сум добивање назад повеќе знаци не е знак. Но, се разбира, треба само првиот на Char адреса да се сетам каде што цела низа е затоа зошто? Како да дознаам каде на крајот на на стрингот е познавањето на почетокот? Обратна коса црта нула. Така е и со овие две индиции да дознаам пред почетокот и на крајот на која било низа се, толку долго како што тие се правилно формирани со тоа ништовен терминатор, што обратна коса црта нула. Но, ова е повик getstring. И излегува дека getstring сето ова време е вид на мамење за нас. Тоа го прави ова работа, да бидете сигурни, добивање на стринг од корисникот. Но каде е таа меморија доаѓаат од? Ако се вратиме на сликата тука и применуваат дефиницијата од само момент пред, дека магацинот е местото каде што меморија оди кога функции се нарекуваат, Со таа логика, кога ќе се јавите getstring, а потоа напишете во Д-А-В-јас-D Enter, каде што е D-А-В-I-Д обратна коса црта нула чуваат, врз основа на Приказната ние сме ни кажа сега? Се чини да се биде во магацинот, нели? Кога ќе се јавите добиете низа ќе добие малку парче од меморијата на магацинот. Па Таа стои на разумот дека Д-А-В-I-Д обратна коса црта нула се чуваат таму во оџак. Но, чекајте, getstring се враќа дека низа, така да се каже, што значи тоа е послужавник од кафетеријата е симната од магацинот. И ние, изјави последен пат дека штом функција се враќа, а вие се земе дека послужавник, така да се каже, во близина на магацинот, што може да се претпостави за остатоците од дека меморијата? Јас вид на нив redrew како прашалници затоа што тие ефикасно да стане непознати вредности. Тие може да се користи кога некои Следниот функција се нарекува. Со други зборови, ако ние се случи да се складираат - Јас ќе подготви брзо слика тука на магацинот. Ако се случи да биде цртање на дното од мојата меморија сегмент, а ние ќе се каже дека ова е место на меморија окупирана од главниот а можеби ARG в и ARG v и нешто друго во програмата, кога getstring се нарекува, веројатно getstring добива парче меморија тука. А потоа Д-А-В-I-Д некако завршува во оваа функција. И јас одам да ги поедноставуваат. Но ајде да претпоставиме дека својата Д-А-В-I-Д обратна коса црта нула. Значи ова многу бајти се користат во рамката за getstring. Но штом getstring поврати, рече последен пат дека оваа меморија над тука сите станува - woops! - сите станува ефективно избришани. И можеме да размислуваме за ова сега како прашање марки, бидејќи кој знае она што се случува да стане од таа меморија. Всушност, јас многу често го нарекуваат функции освен getstring. И штом јас го нарекувам некои други функција од getstring, можеби не во оваа конкретна програма ние само погледнав на но некои други, секако некои други функција може да заврши се дава овој следната самото место во магацинот. Па не може да биде дека getstring продавници Д-А-В-I-Д на магацинот, бидејќи јас ќе веднаш го изгуби пристапот до неа. Но ние знаеме тие getstring враќа само она? Тоа не е се враќаат да мене шест карактери. Она што е навистина се враќаат се можеме да заклучиме последен пат? На адресата на првиот. Така некако, кога побаравте getstring, тоа е распределба на парче меморија за стрингот дека корисниците тип и потоа враќање адреса од неа. И излегува дека кога ќе сакате да го функционира за алоцирање на меморија во овој начин и се врати на лицето кое се нарекува таа функција, на адреса на дека парче на меморија, можете апсолутно не може да го стави во магацинот на дното, бидејќи функционално тоа е само случува да не стане твое многу брзо, така што веројатно може да се погоди каде ние сме веројатно нема да го фрли наместо тоа, т.н. грамада. Така што помеѓу дното на вашата меморија е распоред и на врвот на својата меморија е распоред се бројни сегменти. Една од нив е на магацинот, и веднаш над неа е грамада. И грамада е само поинаков парче на меморија која не се користи за функции кога тие се наречени. Се користи за подолг рок меморија, кога сакаш една функција да го зграби некои меморија и да бидат способни да се откажам од неа без да се губи контрола над него. Сега можете да можеби веднаш види дека ова не е нужно совршен дизајн. Како вашата програма распределени меморија на магацинот, или како ти се јавам повеќе и повеќе функции, или како што ги распредели меморија на грамада со Примерок исклучи како getstring е тоа, што јасно се чини дека се неизбежни проблем? Во право. Како и фактот дека овие стрели се укажува на едни со други не создава добри предуслови. И навистина, ние многу брзо би можеле да се сруши програмата во било кој број на начини. Всушност, мислам дека ние би можеле да имаат направиле ова случајно еднаш. Или ако не, нека го направи тоа намерно сега. Дозволете ми да оди напред и да пишува супер брзо програма наречена dontdothis.c. И сега јас ќе одам во тука и се остри вклучуваат stdio.h. Ајде да прогласи функција foo зема без аргументи, што е означена како и од страна на неважечки. И единственото нешто foo се случува да направите е да повик foo, која, најверојатно, не е најпаметните идеја, но тоа да биде така. Ковни главниот неважечки. Сега единственото нешто главни се случува да направите е да се јавите на foo, како и. И само за клоци, јас ќе одам да си пред тука и да кажам printf "Здраво од foo ". OK. Значи, ако јас не направи грешки, Направи dontdothis точка коса црта. И ајде да го направиме тоа во поголем прозорец - точка коса црта, dontdothis. Ајде. Ух ох. Очигледно, можете да го направите тоа. По ѓаволите. OK. Чекаат. Стојат од страна. Дали ние - Ние не го користите со создавам. [Воздишки] Знам, но јас мислиме дека само избришан тоа. Ух, да. По ѓаволите. Се реши овој Роб. Што? Тоа е многу едноставна. Да, ние се сврте оптимизација исклучување. Добро, стојат чао. Сега се чувствувам подобро. OK. Сите во право. Па ајде да го прекомпајлирате ова - Ве натера да dontdothis. Можеби ќе треба да ја преименувате оваа да dothis.c во само еден миг. Таму ќе одиме. Ви благодарам. OK. Значи фактот дека сум бил печатење нешто беше, всушност, само забавување на процесот со кој ние ќе ја достигнеме таа точка. OK. Phew! Значи она што е, всушност, се случува? Причината таму, само како настрана, е прави ништо во однос на влезни и излез тенденција да биде побавен, бидејќи мора да пишувате знаци на екранот, тоа мора да дојдете. Па скратам приказната, имаше јас всушност се случи толку нестрпливи, ќе имаме видел ова крајниот резултат, како и. Сега дека добив возење на печатење-up прозорци, ние го видите веднаш. Па зошто се случува ова. Па, едноставно објаснување, се разбира, е дека foo веројатно не треба да да се себеси се нарекува. Сега со општи термини, ова е рекурзија. И мислевме неколку недели Пред рекурзивен е добро. Рекурзијата е овој магичен начин на изразување на себеси супер посочно. И тоа само работи. Но постои клучна карактеристика на сите на рекурзивен програми ние разговаравме за и погледна досега, која е дека тие имаат што? А база случај, кој беше некои хард кодирани случај што рече, во некои ситуации не повик foo, што е јасно не е случај тука. Значи она што е навистина се случува во смисла на оваа слика? Па, кога главната повици foo, тоа добива парче од меморијата. Кога foo повици foo, таа добива парче меморија. Кога foo повици foo, таа добива парче. Тоа добива парче. Тоа добива парче. Бидејќи foo никогаш не се враќа. Ние никогаш не сме бришење еден од оние рамки од оџакот. Па ние сме дува низ грамада не, да се спомене и кој знае што друго, и ние сме пречекорување на границите на нашата т.н. сегмент на меморија. Грешка одат сегментација лажни. Па решение постои јасно не го направите тоа. Но поголем импликација е дека, да, има апсолутно е некоја граница, дури и ако тоа не е добро дефинирана, за тоа како многу функции можете да се јавите во програма, колку пати функција може да се јавите. Па дури иако ние не проповеда рекурзија бидејќи ова потенцијално магичен нешто пред неколку недели за сигма функција, и кога ќе го добиеме податоци структури и CS50, ќе видите други апликации за тоа, тоа не е значи дека се најдоброто нешто. Затоа што ако функцијата се нарекува себеси, себеси се нарекува, дури и ако има база случај, ако не погоди која база случај за 1000 повици или 10.000 повици, од страна на тоа време можеби сте снема простор на вашиот т.н. стек и хит некои други сегменти на меморија. Па тоа не е премногу е дизајн трампа помеѓу елеганција и помеѓу робусноста на вашиот особено имплементација. Значи има уште недостатоци или друг gotcha на она што ние сме е тоа досега. Кога се јавив getstring - дозволете ми да се врати во здраво-2. Забележете дека јас го повикувам getstring, кој се враќа на адреса. И ние тврдиме дека денес адреса е од грамада. И сега сум печатење на низа на таа адреса. Но, ние никогаш не сум се нарекува спротивно на getstring. Ние никогаш не сум имал да calll функција како ungetstring, каде што рака напред дека меморијата. Но искрено ние најверојатно требало да биде. Бидејќи ако ние ги прашуваат компјутерот за меморија, по пат на некој како getstring но никогаш не го даде назад, сигурно дека премногу е обврзан да доведе до проблеми со кои можеме снема меморија. И всушност, може да се погледне за овие Проблемите со нова алатка чија употреба е малку криптичната да напишеш. Но, дозволете ми да оди напред и поздравниот тоа до на екранот во само еден миг. Одам да се оди напред и да ја стартувате Valgrind со параметар чиј прв команда линија аргумент е името на таа програма здраво-2. И за жал тоа е Излезот е atrociously комплексни за да нема добра причина. Па ќе видиме сето тоа неред. David е во државна моето име. Значи, тоа е програма всушност работи. И сега ние се добие овој резултат. Па Valgrind е сличен во дух да gdb. Тоа не е дебагерот сама за себе. Но, тоа е Memory тајна. Тоа е програма која ќе се кандидира на вашиот програма и да ти кажам, ако праша компјутер за меморија и никогаш не го предаде назад, а со тоа значи дека имате меморија излегуваат во јавноста. И меморија протекување имаат тенденција да биде лошо. И ви е корисниците на компјутери имаат веројатно се чувствува тоа, дали имате Mac или PC. Дали некогаш сте се користи вашиот компјутер за додека не и рестартира во неколку дена, или сте само што влегов многу програми трчање, и проклето нешто забавува до мелење запре, или барем тоа е супер досадни за користење, бидејќи сè што само доби супер бавно. Сега може да биде било кој број на причини. Тоа може да биде бесконечна јамка, на бубачка во код некој, или, едноставно, тоа може да значи дека сте користење на повеќе меморија, или се обидува да, од твоите компјутер, всушност има. А можеби постои баг во некои програма кои постојано прашува за меморија. Прелистувачи со години беа познати по ова, барајќи повеќе и повеќе меморија но никогаш не ја предавање назад. Навистина, ако имаш само ограничен количина на меморија, не можете да побарате бесконечно многу пати за некои од дека меморијата. И така она што го гледате тука, иако повторно излез Valgrind е непотребно сложени да се загледувам во прво, ова е интересен дел. Грамада - во употреба на излез. Па тука е колку меморија беше во употреба во грамада на време мојата програма излезе - очигледно шест бајти во еден блок. Па ќе одам да се бранува моите раце во она што еден блок е. Сфатете го тоа е само парче, повеќе технички збор за парче. Но шест бајти - она што се шест бајти кои се 'уште се во употреба? Токму така. Д-А-В-I-Д обратна коса црта нула, пет писмо име, плус нула терминатор. Значи оваа програма Valgrind забележав дека јас праша за шест бајти, очигледно, од страна на начин на getstring, но никогаш им даде назад. И во Всушност, ова не може да биде толку Очигледно, ако мојата програма не е три линии, но тоа е 300 линии. Па ние всушност може да даде друга команда линија аргумент да Valgrind да го прават тоа повеќе опширниот. Тоа е малку досадно да се запамети. Но, ако го направам - ајде да видиме. Излегуваат во јавноста - Беше тоа излегуваат во јавноста - дури и јас не се сеќавам што е тоа исклучување рака. - Течење проверка еднаква полна. Да, ви благодарам. - Течење проверка еднаква полна. Enter. Истата програма се извршува. Напишете Дејвид повторно. Сега гледам малку повеќе детали. Но под грамада резиме, која е идентична со четири - ах, ова е вид на убаво. Сега Valgrind е, всушност, бараат малку потешко во мојот код. И тоа е велејќи дека, очигледно, Примерок на линија - ние одзумирате. На линија - ние не се види она што линија е тоа. Но Примерок е првиот виновник. Има еден блог во Примерок. Сите нели? Добро, нема. Нели? Се јавив getstring. getstring очигледно повици Примерок. Па што линија од кодот е очигледно виновен за поседување распределени оваа меморија? Ајде да се претпостави дека секој кој пишува Примерок е околу доволно долго дека тоа е не по нивна вина. Така што е веројатно рудникот. getstring во cs50.c - така што е поднесе некаде на компјутер - во согласност 286 се чини дека е виновникот. Сега да претпоставиме дека cs50 е околу за пристоен износ на време, па ние премногу се неизбежен. И така тоа не е веројатно во getstring дека вирусот се наоѓа, туку во здраво-2.в линија 18. Па ајде да ги разгледаме во она што таа линија 18 беше. Ох. Некако оваа линија не е нужно кабриолет, само по себе, но тоа е причината зад таа меморија течење. Па супер едноставно, што би интуитивно да биде решение овде? Ако бараме меморија, никогаш не биле давајќи назад, а што се чини дека да се биде проблем, бидејќи со текот на времето мојот компјутер може да снема меморија, може да го забави надолу, лоши работи може да се случи, и, што е едноставен интуитивен решение? Само да го даде назад. Како да се ослободи дека меморијата? Па, за среќа тоа е прилично едноставна да речеме слободно име. А ние никогаш не го направиле тоа порано. Но вие во суштина може да се мисли на слободен како спротивност на Примерок. бесплатни е спротивно на доделување меморија. Па сега дозволете ми да го прекомпајлирате ова. Направи здраво-2. Дозволете ми да го кандидира повторно. здраво-2 Давид. Па се чини да работат во токму на ист начин. Но, ако јас се вратиме на Valgrind и повторно да се кандидира дека истата команда на моето ново состави програма, пишување во мое име како порано - убаво. Грамада резиме - во употреба на излез - нула бајти во нула блокови. И ова е супер убаво, сите грамада блокови беа ослободени. Нема протекување се е можно. Така доаѓа, не со проблем Постави 4, но со проблем Постави 5, криминолошки науки и наваму, тоа исто така ќе стане мерка за исправноста на вашиот програма, без разлика дали или не сте или немаат меморија протекување. Но, за среќа, не само што може да се причина преку нив интуитивно, која е, веројатно, лесен за мали програми но потешко е за поголеми програми, Valgrind, за оние кои се поголеми програми, може да ви помогне да се идентификуваат на одреден проблем. Но, има еден друг проблем кои би можеле да се појават. Дозволете ми да се отвори оваа датотека тука, што е, повторно, малку едноставен пример. Но, ајде да се фокусираат на она оваа програма го прави тоа. Ова се нарекува memory.c. Ние ќе ја објавите ова подоцна денеска во zip на изворниот код на денешниот ден. И ќе забележите дека имам функција наречена ѓ која се без аргументи и не враќа ништо. Во линија 20, јас сум очигледно за прогласување на покажувач на int и нарекувајќи го х. Јас сум доделување е враќање вредноста на Примерок. И само за да бидат јасни, колку бајти сум Јас веројатно добивање назад од Примерок во оваа ситуација? Веројатно 40. Каде да се добие дека од? Па, ако се потсетиме дека int е често 4 бајти, барем тоа е во апаратот, 10 пати 4 е очигледно 40. Па Примерок се враќа на адреса на парче меморија и зачувување на таа решавање конечно во х. Значи да биде јасно, што тогаш се случува? Па, дозволете ми да се вратиш назад за нашите слика тука. Дозволете ми да не само исцртување на дното на моето меморија на компјутерот, дозволете ми да оди напред и да подготви целата правоаголник што претставува сите од моите RAM меморија. Ние ќе кажам дека на оџакот е на дното. И таму е текст сегмент во на деиницијализира податоци. Но јас сум само ќе апстрактни оние други работи далеку како точка, точка точка. Јас сум само ќе се однесуваат на оваа како грамада на врвот. А потоа на дното на оваа слика, да претставуваат главни, јас ќе одам да го даде парчиња меморија на магацинот. За ѓ, јас одам да го даде парче од меморијата на магацинот. Сега, имав можност да се консултираат мојот изворниот код се повторно. Кои се локални променливи за главните? Очигледно ништо, па дека парче е ефикасно празни или дури и не толку големи како сум го извлечат. Но, во ѓ, јас имам една локална променлива, кој се нарекува х. Па ќе одам да се оди напред и да даде ѓ парче меморија, нарекувајќи го х. И сега Примерок од 10 пати 4, Па 40 Примерок, каде е таа меморија доаѓаат од? Ние не сме подготвени слика како тоа порано. Но ајде да претпоставиме дека тоа е ефикасно доаѓаат од тука, па едно, два, три, четири, пет. И сега ми треба 40 од овие. Па јас само ќе го направите точка, точка, точка да покажам дека има дури и повеќе меморија се враќаат од грамада. Сега што е адресата? Ајде да избереме нашите произволни решавање, како и секогаш - Ox123, иако тоа е веројатно нема да биде нешто сосема друго. Тоа е адресата на првиот бајт во меморија која Прашувам Примерок за. Значи во кратки, еднаш линија 20 извршува, она што е буквално чуваат внатре на x тука? Ox123. Ox123. И Волот е неинтересен. Тоа само значи тука е хексадецимален број. Но она што е клучот е во тоа што јас сум продавница во х, што претставува локална променлива. Но нејзината тип на податоци, повторно, е обраќање на инт. Па, јас ќе одам да ги чувате Ox123. Но, повторно, ако тоа е малку премногу Слободна непотребно, ако јас дојдете назад, можеме да апстрактни овој далеку доста разумно и само велат дека x е покажувачот во тој парче на меморија. OK. Сега прашањето на дофат на раката е следното - линија 21, што се испоставува, е кабриолет. Зошто? Е жал? Тоа не мора - велат дека уште еднаш. Па, тоа не го прави бесплатно. Па тоа е вториот, но. Значи има еден друг, но специјално на линијата 21. Токму така. Оваа едноставна линија код е само buffer overflow, тампон пребрзувањето. А тампон само значи парче на меморија. Но тоа парче на меморија е на големината 10, 10 цели броеви, што значи дека ако ние индекс во неа со помош на синтаксички шеќер на низа нотација, на плоштадот загради, ќе имате пристап до x заградата 0 x заградата 1 x, заградата точка, точка, точка. x заградата 9 е најголем. Значи, ако јас правам X заградата 10, каде Јас сум, всушност, оди во меморијата? Па, ако имам 10 int - ајде всушност привлече сите од овие овде. Така што беше во првите пет. Еве другите пет ints. Така х заградата 0 е тука. x заградата 1 е тука. x заградата 9 е тука. x заградата 10 е тука, што значи јас ти го кажувам, во линија 21, на компјутерот да се стави на број, каде? Бројот 0, каде? Па, тоа е 0, да. Но само на фактот дека нејзиниот 0 е вид на случајност. Тоа би можело да биде број 50, за сите ние се грижиме. Но ние се обидуваме да го стави во х заградата 10, каде што е тоа прашалник е составен, кои не е добра работа. Оваа програма може многу добро несреќата, како резултат. Сега, ајде да одиме напред и да се види дали ова е, всушност, она што се случува. Направи меморија, бидејќи на датотеката се нарекува memory.c. Ајде да одиме напред и да ја стартувате на програмата меморија. Па добивме среќа, всушност, се чини. Ние се насмевна. Но, ајде да видиме дали можеме сега се кандидира Valgrind. На прв поглед, мојата програма може се чини дека се совршено точни. Но дозволете ми да се кандидира Valgrind со - Течење проверка еднаква на целосна меморија. И сега кога ќе ја извршите оваа - интересна. Невалиден пишуваат на големина од 4 на линија 21 од memory.c. Линија 21 од memory.c е кој? Ох, интересно. Но, чекајте. Големина 4, што е тоа што се однесуваат на? Јас само што еден пишуваат, но тоа е на големината 4. Зошто е 4? Тоа е затоа што тоа е int, која е, пак, четири бајти. Па Valgrind пронашле бубачка дека јас, обѕрне на мојот код, не. А можеби и ТФ би или не би. Што Но Valgrind сигурно покажа дека ние сме направиле грешка таму, дури и иако имаме среќа, и компјутерот одлучи, еј, јас не одам да се сруши само затоа што сте допреле еден бајт, еден int вреди на меморија што не сте го сториле всушност поседува. Па, што друго е кабриолет тука. Адреса - ова е лудо барате адреса во хексадецимална. Тоа само значи некаде во грамада е нула бајти по блок на големина 40 е распределени. Дозволете ми да зумирате од тука и да се види дали ова е малку повеќе корисни. Интересна. 40 бајти се дефинитивно изгубени во загуба рекорд 1 од 1. Повторно, повеќе зборови отколку што е корисен. Но врз основа на нагласени линии, каде што треба јас веројатно се фокусирам внимание за уште еден баг? Личи на линија 20 од memory.c. Значи, ако ние се вратиме на линија 20, тоа е онаа што може идентификувани порано. И тоа не е нужно кабриолет. Но ние имаме овој промени својата ефекти. Па како можам да се поправи најмалку еден од оние грешки? Што можев да сторам по линија 21? Јас не можеше да стори без х, така е да им ја вратам таа меморија. И како можам да го надминете овој баг? Јас дефинитивно треба да се обратите не 0 подалеку од. Па дозволете ми да се обиде и повторно да се кандидира тоа. Жал ми е, дефинитивно оди нема 9 подалеку од. Направи меморија. Дозволете ми реприза Valgrind во поголем прозорец. А сега гледам. Убаво. Сите грамада блокови беа ослободени. Нема протекување се е можно. И до над тука, нема спомнување повеќе од неправилен право. Само за да добие алчен, и ајде да види дали уште една демонстрација не оди како што е планирано - Јас не ќе имаат среќа пред еден миг. И фактот дека ова е 0 е можеби непотребно погрешно. Ајде да направите 50, донекаде произволна број, бидете меморија точка коса црта меморија - уште ќе имаат среќа. Ништо не паѓа. Претпоставувам дека само се направи нешто навистина глупави, и јас 100. Дозволете ми да римејк меморија, точка коса црта меморија - се насмевна повторно. Како за 1000? ints пошироко, грубо, каде што треба да биде? Направи меморија - По ѓаволите. [Смеа] OK. Ајде да не збрка околу повеќе. Повторување меморија. Таму ќе одиме. Сите во право. Па очигледно ви индекс 100.000 ints подалеку, каде што треба да се во меморија, лоши работи се случуваат. Значи ова не е очигледно тешко, брзо правило. Бев вид на користење на судењето и грешки за да одам таму. Но ова е затоа што, скратам приказната, меморијата на вашиот компјутер е исто така се поделени во овие нешта наречени сегменти. И, понекогаш, на компјутерот, всушност, ви ја даде малку повеќе меморија отколку што побара. Но, за ефикасност, тоа е само полесно да се добиете повеќе меморија, но само да ви кажам дека сте добивање на дел од него. И ако добиете среќа понекогаш, затоа, можеби ќе бидете во можност да се допре меморија која не припаѓа на тебе. Имате никаква гаранција дека она што вредност ќе се стави таму ќе останат таму, бидејќи компјутерот се уште смета дека тоа не е твое, но тоа не е нужно ќе да ја погоди уште еден сегмент од меморијата во компјутер и да предизвикаат грешка како овој овде. Сите во право. Било какви прашања, тогаш на меморија? Сите во право. Ајде да ги погледнеме тука, а потоа, во нешто ние сме биле преземање за доделена за сосема извесно време, што е во оваа датотека се нарекува cs50.h. Значи ова е некоја датотека. Овие се само куп коментари до врвот. И можеби ќе имаат погледна ова ако ти појдов наоколу на апаратот. Но излегува дека цело време, кога ние се користи за употреба стринг како синоним, средствата со кои ние прогласи дека синоним беше со ова клучен збор typedef, за видот дефиниција. И ние сме во суштина велејќи направи стринг синоним за знак ѕвезда. Дека средствата со кои на магацинот создаде овие обука тркала познат како на стрингот. Сега тука е само прототип за getchar. Ние би можеле да го видел, но тоа е навистина она што го прави тоа. getchar зема без аргументи, се враќа знак. getdouble зема без аргументи, враќа двојно. getfloat зема без аргументи, се враќа плови, и така натаму. getint е тука. getlonglong е тука. И getstring е тука. И тоа е тоа. Оваа пурпурна линија е уште еден препроцесори директивата, бидејќи на hashtag на почетокот од неа. Сите во право. Па сега дозволете ми да одат во cs50.c. И ние нема да зборуваме премногу долго за ова. Но, за да ви даде увид на она што е се случува сето ова време, дозволете ми да одат на - ајде да направиме getchar. Па getchar е претежно коментари. Но, тоа изгледа вака. Па ова е вистинската функција getchar дека ние сме биле земајќи здраво за готово постои. И иако не сме го користите овој еден кои често, ако некогаш, тоа е најмалку релативно едноставна. Така, тоа е вреди да донесе брз поглед тука. Па getchar има бескрајна јамка, намерно толку очигледно. Таа потоа ги повикува - и ова е еден вид на убаво повторна употреба на код ние самите напиша. Во него се повикува getstring. Затоа што тоа го прави значи да се добие знак? Па, што би можело да се обиде да добие цела линија на текст од корисникот и а потоа само се погледне во едно од оние карактери. Во согласност 60, тука е малку малку здрав разум чек. Ако getstring врати нула, ајде да не продолжи. Нешто тргнало наопаку. Сега ова е нешто досадни, но конвенционален во C. знак макс веројатно претставува она што само врз основа на нејзиното име? Тоа е постојана. Тоа е како на нумеричка вредност на Најголемата знак може да претставуваат со еден залак, што е веројатно бројот 255, што е најголем број претставуваат осум битови, почнувајќи од нула. Па јас сум го користите ова, во оваа функција, кога пишувам овој код, само затоа што ако нешто тргне наопаку во getchar но нејзината цел во животот е да се врати знак, треба некако да биде во можност да се сигнал на корисникот дека нешто тргнало наопаку. Ние не можеме да се вратат нула. Излегува дека ништовни е покажувач. И повторно, getchar има да се врати знак. Па на конвенцијата, ако нешто тргне во ред, е вас, програмер, или во овој случај, мене со библиотеката, имав на само одлучи произволно, ако нешто тргне наопаку, ќе одам да се се врати на бројот 255, што е навистина значи дека ние не може, корисникот не може да напишеш ликот претставена од страна на број 255, бидејќи имавме ја украдете како т.н. стража вредност на претставува проблем. Сега излегува дека ликот 255 не е нешто што можете да напишете во вашата тастатура, па не е ни голема работа. Корисникот не забележите дека Сум украдени овој лик. Но ако некогаш се види во човекот страници на компјутерски систем некои повикување на сите капи постојано како оваа што вели, во случај на грешка оваа постојана сила да се врати, тоа е се некои човечки направив години беше произволно одлучи да се врати оваа специјална вредност и го наречеме постојана во случај нешто тргне наопаку. Сега магија се случува овде долу. Прво, јас сум прогласување во согласност 67 два лика, C1 и C2. А потоа во линија 68, има всушност линија на кодот кој е потсетува на нашиот пријател printf, со оглед на тоа што мора проценти акредитиви во наводници. Но се забележи она што се случува овде. sscanf значи низа скенирање - значи скенирање на форматиран стринг, ergo sscanf. Што значи тоа? Тоа значи дека ќе се пренесат и на sscanf стринг. И линија е она што корисникот видови внатре Ќе помине да sscanf формат низа како ова што го кажува scanf она што се ви се надева на корисникот внесе внатре Тогаш помине во адресите на две делови од меморијата, во овој случај, бидејќи имам две променливи. Па јас сум ќе го даде адресата на C1 и адресата на В2. И се сети дека ви даде функција на адреса на некои променлива, што е импликација? Што може таа функција направите како резултат на што му дава на адресата на променлива, што е спротивно на на променливата себе? Тоа може да го промени тоа, нели? Ако сте имале некој карта на физички адреса, тие можат да одат таму и не што сакаат на таа адреса. Истата идеја тука. Ако ние се пренесат и на sscanf, адресата на две делови од меморијата, дури и овие мали малку делови од меморијата, C1 и C2, но ние го каже адресата на нив, sscanf да го промени. Па цел sscanf во животот, ако ги читаме човекот страница, е да го прочитате она што корисникот чука со, се надеваме на корисникот да мора внесе во карактерот, а можеби и друг карактер, и без оглед на корисник внеле, првиот карактер оди тука, вториот лик оди овде. Сега, како настрана, ова, и што би само знам ова од документација, фактот дека јас се стави празно место има само значи дека не ми е грижа ако корисникот хитови на Space за неколку пати пред тој или таа зема карактер, јас ќе одам да се игнорира било бело простор. Така што, знам од не беше измерена. Фактот дека постои втора% c проследено со бел простор е, всушност, намерно. Сакам да бидам во можност да детектира ако корисникот зезнав или не соработуваат. Па јас сум надевајќи се дека корисникот само ја внеле во еден карактер, па затоа јас сум надевајќи се дека дека sscanf е само ќе се врати вредност 1 затоа што, повторно, ако јас ги прочитав документацијата, цел sscanf во животот е да се вратат на бројот на варијабли кои беа исполнети со корисникот влез. Јас помина со две променливи адреси, C1 и C2. Јас сум надевајќи се дека, сепак, дека само еден од ги добива убиени, бидејќи ако sscanf се враќа 2, она што е веројатно импликација логично? Дека корисникот не само што ми даде еден карактер како Му реков или неа. Тие веројатно напишани на најмалку два лика. Значи, ако јас наместо немаа вториот % C, јас само имаше еден, што искрено ќе биде повеќе интуитивна пристап, мислам дека прв поглед, вие нема да бидете во можност да се открие ако корисникот е ви даваат повеќе влез отколку што навистина го сакаа. Па ова е имплицитна форма на грешка проверка. Но забележите тоа што го правам тука. Откако јас сум сигурен дека корисникот ми даде едно карактер, јас ослободи линија, прави спротивно на getstring, кои за возврат користи Примерок, а потоа ќе се вратам Ц1, ликот што јас се надевав на корисник предвидени и само се предвидени. Толку брз увид, туку било какви прашања на getchar? Ние ќе се вратам на некои од другите. Па, дозволете ми да оди напред и да го сторат тоа - Претпоставувам дека сега, само да ги мотивираме нашите дискусија во една недела плус време, овој е датотека наречена structs.h. И повторно, ова е само дел на нешто што е пред нас. Но известување дека многу на ова е коментар. Па дозволете ми да се потенцира само Интересните дел за сега. typedef - тука е дека истите клучен збор повторно. typedef ние ги користиме да го прогласи низа како посебен тип на податок. Можете да го користите typedef да се создаде сосема нов типови на податоци кои не постојат кога Ц бил измислен. На пример, int доаѓа со C. знак доаѓа со C. двојно доаѓа со C. Но, нема поим на еден студент. А сепак тоа ќе биде прилично корисно да се биде можност да се напише програма која ги зачувува во променлива, матичен број на студентот, нивното име, и нивната куќа. Со други зборови, три парчиња на податоци, сакал int и стринг и друга низа. Со typedef, што е прилично моќна за ова и на клучни зборови sturct за структура, можете, на програмерот во 2013 година, всушност може да се дефинира свој на типови на податоци кои не постојат години пред, но кои одговараат на вашите цели. И така тука, во линии 13 преку 19, ние сме за прогласување на новиот тип на податоци, како на int, но нарекувајќи ја студент. И во внатрешноста на оваа променлива ќе има три нешта - на број, стринг, и низа. Па можете да мислам на она што е навистина се случи тука, иако ова е малку на поедноставување за денес, еден ученик е во суштина оди да изгледа вака. Нејзината ќе биде парче на меморија со проект, име поле, и куќа поле. А ние ќе бидеме во можност да ги користат оние делови од меморија и пристап до нив како што следи. Ако одам во struct0.c, тука е релативно долго, но по шема, на кодот кој го користи овој нов трик. Значи прво, дозволете ми да привлече вашето внимание на интересни делови до врвот. Остро ги дефинира студенти 3, објавува постојана наречен студенти и доделува тоа произволно број 3, само па морам три студенти со користење оваа програма за сега. Тука доаѓа Main. И известување, како можам да се изјасни низа на студентите? Па, јас само го користите истата синтакса. Зборот студент е очигледно ново. Но студентот, класа, држач студенти. Така, за жал, има многу на повторна употреба на термини тука. Ова е само еден број. Значи ова е како да кажеш три. Класа е само она што сакам да се јавите на променлива. Јас би можеле да го наречеме студенти. Но класа, ова не е класа во објектно ориентирано Јава вид на патот. Тоа е само една класа од учениците. И податоци за видот на секој елемент во таа низа е студент. Па ова е малку различен и од нешто да се каже како овој, тоа е само - Сакам да кажам дека ми даде три студенти и повик таа низа класа. Сите во право. Сега тука е четири јамка. Овој човек е познат - iterate од нула на до три. И тука е нова фигура на синтакса. На програмата ќе ме натера, човекот, да го даде на студентот Проект, кој е int. И тука е синтакса со кои можете да чување нешто во проект областа на локација класа заградата I. Значи оваа синтакса не е нова. Ова само значи да ми даде на осмата студент во класата. Но овој симбол е нова. До сега, ние сме не може да се користи точка, барем во кодот вака. Ова значи дека одат на struct познат како студент и го стави нешто таму. Слично на тоа, во овој следната линија, 31, одете напред и го стави она што на корисникот видови за името тука и она што го прават за куќа, една иста работа, да оди напред и го ставив во. куќа. Значи она што не оваа програма на крајот направам? Можете да видите малку закачка таму. Дозволете ми да оди напред и да прават structs 0 точка коса црта struct 0, проект студентот 1, велат Дејвид Mather, студент проект 2. Роб Киркланд, студент проект 3. Lauren Leverit - и единственото нешто што оваа програма го направи, што е само сосема произволна, е Сакав да направам нешто со овие податоци, сега што сум нè научи како да се користете structs, е јас само имаше овој екстра јамка овде. Јас iterate преку низа на студентите. Јас се користат нашите, можеби сега запознаени пријател, низа споредба, stircomp да проверете е куќата 8-ми студентот еднаква на Mather? И ако е така, само печати нешто произволно се допаѓа, да, тоа е. Но, повторно, само ми дава можности да се користи и повторна употреба и повторна употреба оваа нова точка нотација. Па кој се грижи, нели? Доаѓа со студентска програма е донекаде произволна, но излегува дека ние може да направи корисни работи со Ова, на пример како што следи. Ова е многу посложен struct во C. Тоа е се здобија со десетина или повеќе полиња, малку cryptically име. Но, ако некогаш сте слушнале за графика формат на датотека наречена битмапа, BMP, тоа Излегува дека на bitmap формат на датотека доста личи дека ова. Тоа е глупаво малку Smiley Face. Тоа е мала слика која јас сум зумира на прилично голема, така што можев да видам секој на поединечни точки или пиксели. Сега, излегува можеме да претставуваат црна точка со, да речеме, бројот 0. И бела точка со бројот 1. Значи со други зборови, ако сакате да се подготви Smiley Face и спаси таа слика во компјутер, е доволно за складирање на нули и оние кои изгледаат како оваа, каде што, повторно, оние кои се бели и нули се црни. И заедно, ако ефикасно се препашете на оние кои и нули, имате мрежа на пиксели, и ако постават нив и надвор, имате една симпатична малку Smiley Face. Сега, bitmap формат на датотека, BMP, е ефективно дека под хаубата, но со повеќе пиксели сот што ќе всушност може да претставува бои. Но кога ќе имаат пософистицирани формати на датотеки како BMP и JPEG и GIF со која може да биде запознаен, оние додадени фајлови: на дискот обично не само имаат оние кои и нули за пиксели, но тие имаат некои метаподатоци, како и - мета, во смисла дека не е навистина податоци, но тоа е корисно да се имаат. Па овие полиња тука се подразбира и ќе видиме ова во повеќе детали во P-сет 5, кој пред нулите и дека претставуваат пиксели во сликата, има еден куп на метаподатоци како големината на сликата и ширината на сликата. И ќе забележите сум кубење исклучи некои произволни работи тука - ширина и висина. Малку брои и некои други работи. Значи има некои метаподатоци во датотеки. Но со разбирање како датотеки се поставени во овој начин, можете да всушност потоа манипулираат со сликите, закрепне слики од дискот, големината на сликите. Но вие не може секогаш подобрување на нив. Ми требаше фотографија. Па се вратив да RJ тука, кој те видов на екранот сосема извесно време пред. И ако јас се отвори Воведни тука, ова е она што се случува ако се обидете да зумирате и подобрување RJ. Тој не е добивање на било подобро навистина. Сега Воведни е вид на замаглување тоа малку, само да се замачкаат Фактот дека RJ не се особено подобрена, кога ќе зумирате внатре А ако го направи тоа на овој начин, види плоштади? Да, дефинитивно може да се види плоштадите на проектор. Тоа е она што го добивате кога ќе се подобри. Но, во разбирање на тоа како нашите RJ или Smiley Face се спроведува ќе ги споделите со нас всушност пишува код кој манипулира овие работи. И мислев дека сум се стави крај на оваа белешка, со 55 секунди на подобрување тоа е, Јас се осмелуваат, велат доста погрешно. [Видео репродукција] -Тој е лажење. За тоа што, не знам. -Па што го знаеме ова? -Тоа на 09:15 Реј Santoya беше на банкомат. -Значи, прашањето е она што правеше тој на 9:16? -Снимање на девет милиметар во нешто. Можеби тој ја виде снајперист. -Или работи со него. -Чекај. Вратете се назад едно. -Што гледате? -Донеси лицето нагоре, цел екран. -Очилата. -Има рефлексија. -Тоа е безбол Neuvitas тим. Тоа е нивното лого. -И тој зборува за оној кој е облечен дека јакна. [Крај видео репродукција] Дејвид Џ MALAN: Ова ќе биде проблем Постави 5. Ние ќе се видиме следната недела. МАШКИ звучник: На следниот CS50. [Штурците чврчорење] [Музички]