[За възпроизвеждане на музика] DAVID J. Malan: Добре. [СМЯХ] Добре дошъл. Това е CS50. А това в края на седмицата пет. И до сега, ние сме доста много са приемали за даденост, че има съществува този компилатор, звъня, че сте били позоваването чрез тази друг инструмент, наречен Уверете се, че по някакъв начин магически превръща вашия изходния код в обектен код, единиците и нулите че си компютри CPU, централната процесор, всъщност разбира. Но се оказва, че има номер, който е става под капака в между входа и изхода. И бих искал да Ви предложа плът че в малко по-подробно в тези четири стъпки, има нещо, наречено предварителна обработка, нещо нарича компилиране, което сме видели, нещо, наречено сглобяване и нещо, наречено свързване. Така че до момента, в някои от нашите програми, сме имали остър включва. Съвсем наскоро имахме някои остри определя за константи. Така се оказва, че тези неща, които имат за префикс хеш символ или лирата символ са предварително процесор директиви. Това е просто един луксозен начин на казвайки, че е линия на кода, който е всъщност превръща в нещо друго преди компютър, дори се опитват да конвертирате вашите програма в нули и единици. Например, рязко включва стандартната I / O. Ч, доста много просто означава, отидете напред, вземете съдържанието на файловете stdio.h и да ги поставите там. Така че няма нули и единици в този момент все още. Това е наистина само една смяна. И това е направено по време на така наречената предварителна обработка етап, когато можете всъщност тече звъня или специално Уверете се в повечето случаи. Така че всичко това се случва първо автоматично до този момент. След това идва и компилация стъпка. Но ние сме били опростени компилация. Съставяне на програма наистина означава да Вземете го от нещо като C, на изходния код, ние сме били писмено, надолу за нещо, наречено събрание. Събрание език е по-ниско ниво език, който, за щастие, няма да са много по повод на пиша този семестър. Но това е най-ниското ниво в смисъл, че буквално започна да пиша събира и изважда и да се размножават и да заредите от паметта и запишете на паметта, много основни инструкции, че един компютър, под предния капак, всъщност разбира. На последно място, сглобяване отнема този език с нули и единици, които ние сме били описва този момент. И наистина накрая, има така наречената свързваща фаза, които ние ще виж в един момент, който съчетава Вашите нули и единици с нули и тези на други хора, преди да сте създали. Така смятат, че това супер проста програма. Той беше от седмица 1. Той току-що каза, Hello World, на екрана. Направихме това чрез звъня. Или ние се завтече през него Уверете който се проведе звъня. И изведена в момента, когато някои нули и единици. Но се оказва, че е междинна стъпка. Ако отида тук - Извинете, не Искам да го видя, все още. Ако отида тук, за да си уреди и аз се отворят hello.c, тук е, че същата програма. И това, което ще направя в моя терминал прозорец тук е, че ще тече звъня, а не производител, който автоматизира всички четири тези стъпки, за нас. И аз ще направя звън-S и тогава hello.c и след това въведете. И получавам мига бързо отново, което е добре. И сега в малко по-голям прозорец, Ще се отвори Gedit тук. И аз отивам да отвори файл, който, Оказва се, се нарича hello.s това съдържа този асемблер Аз по-рано. И това е, което се нарича събрание език, сравнително ниско ниво инструкциите, които ви Intel CPU или каквото и да е, че е вътре разбира. И MOV е постъпка. повикване за призовава, на много ниско ниво функция. под е за изваждане. Така че, когато имате определен CPU вътре на компютъра си, какво прави различни, в сравнение с други процесори на пазар, който е инструкции, които той разбира и често колко ефективно го е, колко бързо тя е в изпълнение на някои на тези инструкции. Сега за повече по този въпрос, можете да вземете Следващата есен CS61 в колежа. Но тук имаме, например, няколко идентификатори, които може да ви се стори познато. hello.c е името на програмата. . Текст - там не е много на интереси има Просто сега, припомни, че текстът сегмент, като от понеделник, е мястото, където в паметта на програмата всъщност завършва. Така че това е най-малко неясно запознати там. Тук, разбира се, е да се споменава на основната ни функция. Превъртите надолу, те се отнасят до неща наречените регистри, много малки парченца вътрешна памет на действителните си CPU. И ако превъртите надолу дори Освен това, виждам някаква косвено споменаване на ASCII. И, наистина, е, че низ, Здравейте, запетая света. Така че, дълга история накратко, това е случва за вас, автоматично, под капака всичко това време. И какво се случва наистина е веднъж ви е свършило звъня, или под формата на Уверете се, сте се първо, от изходния код, на така наречените асемблер. После звъня е конвертирането на това събрание език до нули и единици. И това е слайд, който започнахме нашата дискусия в Седмица 0 по - и след 1 седмица на. И накрая, тези нули и единици се комбинират с единиците и нулите от тези библиотеки, които сме приемали за даденост, като Standard I / O или String библиотека или дори CS50 на библиотеката. Така че да нарисува тази картина още визуално, ние имаме hello.c. И това, разбира се, използва ФОРМАТ функционира да кажа, здравей свят. Съставянето стъпка отнема до този файл, току-що видяхме hello.s, дори макар, че е обикновено се изтриват автоматично за вас. Но това е монтаж код в средата стъпка. И тогава, когато съберем на събрание език, така да се каже, че е, когато получите тези нули и единици. Така че ние увеличени ефективно днес това, което сме приемали за даденост, означава ще изходния код към обектния код. Но накрая, сега, че една и съща картина - нека си го бутам към от лявата страна. И имайте предвид, че в началото има Споменах stdio.h. Това е файл, който сме включили в почти всички програми, които сме написали. И това е файл, чието съдържание се поставя копие, ефективно върха си код. Но се оказва, че на компютър системата някъде, има вероятно по stdio.c файл, че някой пише година Преди това изпълнява всички функции, които са били декларирани в stdio.h. Сега в действителност вероятно не е на вашия Mac или вашия компютър или дори в CS50 уреда е сурова код C. Някой вече го е съставило и включени . О файл за обектен код или. На файл, който се позовава на споделена библиотека , който е бил предварително инсталиран и предварително изготвя за вас. Но да предположим, че наистина съществува на нашия компютър stdio.c паралелно с звъня. Вашият код е да бъдат съставени и сглобени. stdio.c лидер код се компилират и сглобени, така че тази последната стъпка, тук долу, ние трябва да по някакъв начин връзка, така да се каже, си нули и единици с неговите или нейните нули и единици в една проста програма, която в крайна сметка е наречен просто Hello. Така че това е всичко, на магията, която е се случва до този момент. И ще продължи да предприема тези процеси за даденост, но осъзнават, има много пикантни подробности става под там. И това е, което прави компютър с Intel отвътре особено важно. Така че на тази бележка, ако искате да присъединете се към нас за обяд в петък, трябва да излизат на обичайната cs50.net/rsvp място, 13:15 този петък. И сега няколко съобщения. Така че ние имаме добри новини. И ние имаме лоши новини. Започнете с някои добри новини тук. [Стенеха] Добре. Е, това е технически почивка, така че това не е толкова много, подарък от нас. Но лошата новина, разбира се. [Стенеха] Прекарах много време на тези анимации. [СМЯХ] Ще има сесия преглед идния понеделник. Това ще бъде най-17:30. Ние ще ви напомни на всички тези детайли по електронната поща на курса сайт само за няколко дни път. Той ще бъде заснет и се предоставят скоро след това. Така че, ако не може да направи, че понеделник Слот за нощ, не се притеснявайте. Секции това следващата седмица също ще се фокусира върху оценка за тест. Ако си част е в понеделник, което е наистина университета почивка, ние ще все още се срещат в раздел. Ако просто не може да направи това раздел, защото започваш далеч, това е добре. Участие в неделя или вторник раздел или мелодия-в раздел на Джейсън, който е достъпни онлайн. Така че, по-лоши новини. Така съгласно учебната програма, имаме лекция следващия петък. Но добрата новина - Ясно е, че съм прекарал твърде много време в това. [СМЯХ] Ще затвори Следващи лекции в петък. Така че това ще бъде подарък за нас, така че наистина може да имат хубава почивка в между тази седмица и от две седмици оттам. Така че без лекции следващата седмица, само една малка малко викторина, за които трябва да бъде в става все по-развълнувани. Така че нека сега обърнем вниманието си към нещо, което е наистина по-визуални и по-вълнуващо и да постави на сцената за това, което ще бъде на хоризонта само за няколко седмици време. След първия тест, ще се превърне в Фокусът на проблемни групи в друга домейн конкретен проблем, че на съдебна медицина или за сигурност като цяло. Всъщност традицията с този проблем комплект е за мен един от най- преподаване колега или КО да пресечем кампуса, като някои снимки на разграничими, но не са очевидни хора, места или неща, тогава всяка година I някак си успяват да случайно изтриване или корумпирани цифровата карта медиите , че е вътре в нашата камера. Но не е голяма работа. Мога да отида напред и да включите че в компютъра ми. Мога да направя съдебномедицински образ на него, така че да се каже, чрез копиране на нули и тези край на тази карта с памет, независимо дали си на SD карта или компактна флаш карта или каквото и да си запознат. И тогава можем да предаде това. И така, предизвикателство, наред с други неща за вас, ще бъде да напишете C код, който възстановява цял куп JPEG файловете за мен и ще бъде разкрити тези хора, места или неща. И ще говорим в този проблем установени, и в идните дни, за графики като цяло. Ние сме ги използвали, а разбира се, за да избухне. Но ти вид се приема за даденост съществува тези високи понятия ниво на правоъгълници и овали. Но под предния капак има пиксела. И ти трябваше да започне мисля за тези. Или ще за р-комплект 4 трябва да се мисли за разликата между вашите тухли, как бързо топката, което се движи по екрана, за да избухне. Така че това понятие на точки от екрана, това е влезе в игра вече. Сега това, което виждате, все пак, е това, което можете да получите на екрана на компютъра. Ако някога сте гледания някоя стока или лошо TV, шансовете са те почти лечение на публиката като technophobes , които наистина не знам много за компютри. И така, това е много лесно за полицията детектив, за да кажа, може да почистване, че за мен? Или повишаване, нали? Подобряване е като бръмча дума в Най-всеки, свързано с престъпления шоу. А реалността е, ако приемате много размазани снимка на заподозрения правиш нещо лошо, не можеш Просто го засили. Вие не можете да я увеличите безкрайно. Вие не можете да видите в блясъка на някого око, който е извършил това специално престъпление, въпреки разпространението на тази по телевизията. И така, с това нека да мотивира, че бъдещият проблем, установен с поглед към няколко концерта, с който могат да бъдат запознати. [VIDEO PLAYBACK] -OK. Сега, нека да се получи добър поглед към вас. Го-Hold. Пусни го обратно. -Чакай малко. Отиди надясно. -Има. Freeze това. -Цял екран. -OK. Freeze това. -Притегнете по този въпрос, ще ти? Vector-в на този човек от задно колело. -Zoom в точно тук на това място. -С правилната техника, на изобразената може да бъде разширен и заточени. -Какво е това? -Това е аксесоар програма. -Може ли да се разбере, че до всеки? -Не знам. Нека да го засили. -Подобряване на раздел А-6. -I подобрени детайла и - -Мисля, че е достатъчно да се повиши. Освободете го да ми екран. -Подобряване на отражение в очите. -Нека да стартирате тази през видео аксесоар. -Едгар, може ли да подобри това? -Дръж се. -I've работи по този размисъл. -Някой размисъл. -Reflection. -Има размисъл на лицето на мъжа. -The размисъл. -Има размисъл. -Увеличаване на огледалото. -Можете да видите отражение. -Може ли да се изгради образ от тук? -Можеш ли да го подобри точно тук? -Може ли да го подобри? -Може ли да го подобри? -Може ли да подобри това? -Може ли да го подобри? -Изчакай малко, ще подобри. -Увеличаване на вратата. -X10. -Zoom. [СМЯХ] -Преместване инча -Чакай, спри. -Stop. IT-пауза. -Завъртане на 75 градуса около вертикалната моля. [СМЯХ] -Спрете, и обратно към част за вратата отново. -Имате изображение подобрител , които могат да растерна графика? -Може би трябва да използвате Pradeep Sen Начин да се види в прозорците. -Този софтуер е състоянието на техниката. -Иконата стойност е изключен. -С правилната комбинация на алгоритми. -Той е взел осветление алгоритми, за да следващото ниво и да мога да ги използвате, за да подобрите тази снимка. -Заключване на и разширяване на Z-ос. -Подобряване. -Подобряване. -Подобряване. Замръзване и подобряване. [END възпроизвеждане на видео] DAVID J. Malan: Така Проблем Set 5 е това, което предстои там. Така че ние скоро ще получите по-добро разбиране кога и защо можете да и нашата не може да подобри по този начин. Но първо, нека да се върне вниманието ни на някои от градивните блокове ще трябва да бъде в състояние да кажа, че историята. Така се припомни, че ние привлече тази картина на Понеделник и малко по-миналата седмица. И това описва разположението на нещата в паметта на компютъра, когато използвате някоя програма. Технологичният сегмент до върха, изземване, се отнася действителните нули и единици които съставят програмата си. Има, по-долу, че някои инициализира или неинициализирани данни, които обикновено се отнася до неща като константи или струни или глобални променливи, които имат били обявени предварително. Има куп, но ще дойдем върна на това след малко. И тогава там е стека. Много прилича на купчина тави в кафене, това е мястото, където паметта получава пластове и пластове, когато правиш това, което в програмата? Какво е стека ползване? Да? Обадете се на функция. Всеки път, когато се обадя функция, тя е дава частица от паметта за неговото локални променливи или неговите параметри. И картинно, ние виждаме, че с всеки последователни функция, наречена, когато A призовава В извиква C призовава D, те се разслоява върху стека. И в рамките на всяка от тези парчета памет е по същество уникален обхвата за тази функция, която, разбира се, Проблематично е, ако искате да се раздават от една функция в друга Парче на данните, които го искат да мутира или да се промени. И така, какво е нашето решение да се даде възможност Функцията представлява от един стак рамка за промяна на вътрешна памет на друга стека кадър? Как тези двамата разговарят помежду си? Така чрез указатели или адреси, което, отново, просто опишете къде в памет, с помощта на определен ухапване номер, специално стойност може да се намери. Така спомням последния път, твърде продължихме историята и в нея доста лоша програма. И тази програма е бъгав за няколко причини, но най-тревожен е един тъй като не проверите какво? Да, тя не успява да се провери на входа. Съжаляваме? Ако е повече от 12 символа. Така че, много изящно, когато се обаждате memcopy, които, както подсказва и името, просто копия памет от втория си довод в първия си аргумент. Третият аргумент, много изящно, е проверени, за да се уверите, че не копиране повече от, в този случай, продължителността на бар, броя на символите, в местоположението, което е тази масив C. Но проблемът е, че това, което ако C себе си не е достатъчно голям да се справиш с това? Отиваш да копирате броя на байта, че сте били дадени. Но какво всъщност трябва повече байта отколкото имате място за? Е, тази програма много глупава просто сляпо продължава да предприеме каквото и да е предвид, здравей наклонена черта 0 е чудесно, ако низ е кратък достатъчно, като пет символа. Но ако това е всъщност 12 знака или 1200 символа, видяхме последния път че просто ще напълно презапише памет, която не принадлежи на вас. И най-лошия случай, ако презапишете червена част там, че се обадихме на обратен адрес - това е само когато компютърът автоматично, за вас, зад сцени, басти като гост на 32-битова стойност, която напомня се на това, което би трябвало адрес се върне, когато Foo, тази друга функция, се прави изпълняващата. Това е една троха хляб на видове , за които се връща. Ако презапишете, потенциално, ако ти си лошо момче, да може потенциално поеме нечий компютър. И сигурно ще катастрофата е в повечето случаи. Сега този проблем е само изостря тъй като ние започнахме да говорим за памет управление като цяло. И изчистване, за разпределение на паметта, е функция, която можем да използваме, за да разпределят памет, когато ние не знаем предварително че може да се наложи някои. Така, например, ако се върна на уреда тук. И аз се отворят от последния път hello2.c, спомням тази програма тук, който изглеждаше малко нещо като това, само три линии - посочва името си, след низ име, в ляво, равен getstring. И след това да го отпечатате, името на потребителя. Така че това е супер проста програма. За да бъде ясно, нека да вървим напред и да направи здравей-2. Отивам да направя точка наклонена черта здравей-2. Посочете Вашето име - David. Enter. Здравейте Дейвид. Това изглежда да работи OK. Но това, което наистина се случва под капака тук? Първо нека да свали някои слоеве. String е просто синоним ние сме осъзнах за какво? Char звезда. Така че нека да го правят малко по-мистериозен но технически правилно повече, че това е знак звезда, което означава, че име, да, е променлива. Но какво име магазините е адресът на на Чар, който се чувства малко странно защото аз се връщам низ. Аз съм се върна множествена символа не е Чар. Но, разбира се, вие се нуждаете само от първия Чар на адрес да се помни, когато целия низ е така, защото защо? Как да разбера, когато в края на низ е да се знае от самото начало? Обратно наклонената черта нула. Така че с тези две улики ви разбера преди началото и в края на всеки низ са, толкова дълго, тъй като те са правилно оформена с които нищожна терминатор, че наклонена черта нула. Но това се обажда getstring. И се оказва, че getstring през цялото това време е било вид измама за нас. Той е правил това на труда, за да се уверите, удар с низ от потребителя. Но къде е това памет били идва? Ако се върнем на снимката тук и прилага определението от само преди малко, че топчето е мястото, където паметта отива, когато функциите се наричат, по тази логика, когато ти се обадя getstring, и след това въведете D-A-V-I-D Въведете, където е D-A-V-I-D наклонена черта нула съхраняват, въз основа на история сме ни каза досега? Изглежда, че е в стека, нали? Когато се обадите получите низ получите Малко парче от паметта на стека. Така че, очевидно е, че D-A-V-I-D наклонена черта нула се съхранява има в стека. Но почакайте, getstring връща че низ, така да се каже, което означава, това е тава от кафенето е взето от стека. И ние казахме миналия път, че веднага след като функцията връща, и да приемете, че тава, така да се каже, от стека, което може да ви поеме около останките на този спомен? Някак ги преначерта като въпросителни знаци защото те ефективно се неизвестни стойности. Те могат да бъдат използвани при някои Следващата функция се нарича. С други думи, ако се случи да бъдат съхраняване - Ще се направи бърза снимка тук на стека. Ако се случи да бъде изготвянето на дъното на моята памет сегмент, и ще кажем, че това е мястото на паметта заета от главната и може би арг C и арг V и нещо друго в програмата, когато getstring се нарича, вероятно getstring получава парче памет тук. И тогава D-A-V-I-D някак озовава в тази функция. И аз отивам да опростява. Но нека приемем, че си D-A-V-I-D наклонена черта нула. Така че това много байта се използват в рамката за getstring. Но веднага след като getstring връща, ние каза миналия път, че тази памет над тук всичко става - woops! - всичко се превръща в ефективно изтрити. И ние можем да мислим за това сега като въпрос марка, защото кой знае какво ще стане с този спомен. Всъщност, аз много често наричат ​​функции различни от getstring. И веднага след като аз наричам някои други функция от getstring, може би не в тази конкретна програма, ние просто погледна но в друг, със сигурност някои други функция може да се свърши се дава следващото място в стека. Така че това не може да е толкова getstring магазини D-A-V-I-D в стека, защото бих веднага губят достъп до нея. Но ние знаем, те getstring връща само какво? Това не е връщане към ми шест символа. Това, което е наистина завръщането си ние заключаваме, последния път? Адресът на първия. Така че някак си, когато ми се обади getstring, това е разпределяне на парче памет за низа, че потребителите тип и след това се връщат адрес на него. И се оказва, че когато искате да функционира да бъде заделена памет в този начин и връщането на лицето, което нарича тази функция, адреса на че парче от паметта, сте абсолютно не може да го постави в стека в дъното, защото това е просто функционално да не ти стане много бързо, така че можете да се досещате, където ние вероятно ще го хвърля Вместо това, така наречената купчина. Така между дъното на паметта на оформление и горната част на паметта на оформлението са цял куп сегменти. Един от тях е на стека, и правото по-горе е на куп. И грамада е просто различен парче памет, която не се използва за функции когато те се наричат. Той е използван за по-дълъг срок на паметта, когато искате една функция, за да вземете някои памет и да може да се придържа към него без да губи контрол над него. Сега бихте могли може би веднага се види, че това не е непременно перфектен дизайн. Както вашата програма заделената памет на стека, или като ти се обадя по-и повече функции или докато се разпредели памет в хийпа с изчистване думата, тъй като getstring прави, това, което ясно изглежда неизбежен проблем? Точно така. Подобно на това, че тези стрелки са насочени един към друг не предвещава нищо добро. И наистина, бихме могли много бързо катастрофата програма във всяка редица начини. Всъщност, мисля, че може да се наложи направил това случайно веднъж. Или ако не, нека го направим умишлено сега. Позволете ми да отида напред и да пиша супер бързо на програма, наречена dontdothis.c. И сега аз ще отида в тук и рязко се включват stdio.h. Да декларират функция Foo отнема без аргументи, което е обозначен както от невалидни. И единственото нещо, Foo ще направите, е повикване Foo, който вероятно не е най-умната идея, но така да бъде. Ent основната невалидни. Сега единственото нещо, основната ще да направите е да се обадя Foo, както добре. И просто за забавление, аз ще отида напред тук и да кажа ФОРМАТ "Hello от Foo. " OK. Така че, ако не е правил грешки, Направи dontdothis точка наклонена черта. И да го направим в по-голяма прозореца - точка наклонена черта, dontdothis. Хайде. Ъъъ. Очевидно, можете да направите това. Дявол да го вземе. OK. Изчакайте. Готовност. Смятате ние - Ние го използвате с Уверете. [Въздишки] Знам, но аз мислим просто заличава това. Ъ-ъ, да. Дявол да го вземе. Решете този Rob. Какво? Това е много проста. Да, ние се обърнахме оптимизация на разстояние. OK, щанд чао. Сега се чувствам по-добре. OK. Добре. Така че нека да компилирате това - Направи ли dontdothis. Може би трябва да преименувате това да dothis.c в един момент. Ето. Благодаря. OK. Така че фактът, че бях печат нещо беше всъщност само забавяне на процеса, чрез който ние щяха да стигнат до тази точка. OK. Пфу! Така че това, което всъщност се случва? Причината там, само като настрана, е прави нищо по отношение на приноса и изход е по-бавна, защото трябва да напишете знака на екрана, това трябва да преминете. Така че, дълга история кратко, имах действително стана толкова нетърпелив, ние ще трябва виждал този краен резултат, както добре. Сега, когато имам път на печат прозорци, ние го видя веднага. Така че, защо се случва това. Е, просто обяснение, разбира се, е, че Foo би не трябва да да се обажда. Сега в общи линии, това е рекурсия. И ние решихме, че след няколко седмици Преди рекурсивни е добро. Рекурсията е този магически начин на изразява себе си супер накратко. И тя просто работи. Но има една основна характеристика на всички рекурсивните програми за които се говори около и погледна към този момент, която е, че те са имали какво? A базовия модел, което е известно твърди кодирани случай, че се казва в някои ситуации не поставят Foo, което е ясно случая не е така. Така че това, което наистина се случва от гледна точка на тази снимка? Е, когато основният призовава Foo, тя получава парче от паметта. Когато Foo Foo призовава, той получава парче памет. Когато Foo Foo призовава, той получава парче. Той получава парче. Той получава парче. Защото никога не се връща Foo. Ние никога няма да бъдете изтриване един от тези, рамки от комина. Така че духаше през куп не, да спомена кой знае още какво, и ние превишаване пределите на нашата така наречените сегмент на паметта. Грешка отидете сегментация неверни. Така че разтворът има явно не го прави. Но по-голямата Изводът е, че, да, има абсолютно известно ограничение дори и ако не е добре определена, за това как много функции, които можете да се обаждате в програма, колко пъти на функция може да се обадите. И въпреки, че сме направили проповядват рекурсия тъй като това потенциално вълшебно нещо, което един Преди няколко седмици за сигма функция, и когато стигнем данните структури и CS50, ще видите друг приложения за нея, тя не е непременно най-доброто нещо. Защото, ако една функция извиква сама себе си, нарича себе си, дори и да има база случай, ако не се удари, че базовия модел за 1000 повиквания или 10 000 повиквания, от това време може да сте изчерпване на стая на вашия т.нар стека и хит някои други сегменти на паметта. Така че това също е дизайнерски компромис между елегантност и между устойчивостта на вашата конкретна изпълнение. Така че има и друг недостатък или Още нещо, за което сме правил до този момент. Когато се обадих getstring - позволете ми да се върна в здравей-2. Забележете, че се обаждам getstring, която се връща на адрес. И ние твърдят днес, че адрес е от куп. И сега аз съм отпечатване на низ на този адрес. Но никога не сме се нарича обратното на getstring. Ние никога не сме имали да Танцувам функция като ungetstring, къде си ръка назад че паметта. Но честно казано ние вероятно е трябвало да бъде. Защото, ако продължават да питат на компютъра за паметта, чрез някой като getstring никога, но го връщат обратно, със сигурност това също е на път да доведе до проблеми с което ни се свърши паметта. И в действителност, може да се търсят тези проблеми с нов инструмент, чието използване е малко загадъчен да въведете. Но нека да вървим напред и да го пръска нагоре на екрана в един момент. Аз ще отида напред и да тичам Valgrind с параметър, чиято първа команда Онлайн аргумент е името на тази програма здравей-2. И за съжаление това е продукция е отвратително Комплексът без основателна причина. Така ние виждаме цялата тази бъркотия. Дейвид е държавна името ми. Така че това е програмата действително работи. И сега ние се този изход. Така Valgrind е подобен в духа на GDB. Това не е дебъгер по себе си. Но това е памет за проверка. Това е програма, която ще пускате програма и да ви кажа, ако зададе компютър за памет и никога не я подаде назад, като по този начин означава, че имате изтичане на памет. И изтичане на памет са склонни да бъдат лоши. И ти е потребителите на компютри имат вероятно се усещат това, дали имате Mac или PC. Били ли сте някога използвали компютъра докато не рестартира и в няколко ден, или просто трябва много програмите, които работят, и проклетото нещо забавя на смилане спре, или поне това е супер досадно да се използва, защото всичко просто имам супер бавно. Сега, може да бъде всяка редица причини. Тя може да бъде един безкраен цикъл, бъг в някой код, или по-просто, това би могло да означава, че използвате по- памет, или се опитват да, отколкото си компютър всъщност има. И може би има грешка в някоя програма които продължават да питат за памет. Браузъри за година са известни с това, искаме повече и повече памет , но никога не я подаде обратно. Разбира се, ако имате само ограничен размера на паметта, не можете да зададете безкрайно много пъти за част от тази памет. И така, това, което виждате тук, въпреки че отново изход Valgrind е ненужно сложни, за да погледне Първо, това е най-интересната част. Heap - в използването на изход. Така че тук е колко памет е в употреба в купчина в време програмата ми излезе - очевидно шест байта в един блок. Така че аз ще да размахва ръцете си на каква блок е. Мислете за това е просто парче, по- техническа дума за парче. Но шест байта - Какви са шестте байтове, които все още са в употреба? Точно така. D-A-V-I-D наклонена черта нула, пет писмо име плюс нула терминатор. Така че тази програма Valgrind забелязах, че поиска шест байта, както изглежда, от начин на getstring, но никога не Даде им обратно. И в действителност, това може да не е толкова Очевидно, ако моята програма не е три линии, но това е 300 линии. Така че ние всъщност може да даде друга команда аргумент линия Valgrind да да стане по-многословен. Това е малко досадно да се помни. Но ако го направя - нека да видим. Leak - Беше ли изтече - дори не си спомням какво е изключен ръка. - Течове проверка равнява пълно. Да, благодаря ви. - Течове проверка равнява пълно. Enter. Същата програма се изпълнява. Въведете David отново. Сега виждам малко по-подробно. Но под купчина резюме, в което е идентичен с четири - ах, това е нещо хубаво. Сега Valgrind всъщност търсите малко по-трудно в моя код. И се казва, че, както изглежда, изчистване на ред - ние отдалечаване. В ред - ние не виждаме какво линията е то. Но изчистване е първият обвиняем. Има един блог, в изчистване. Ясно ли е? OK, не. Така ли е? Обадих getstring. getstring очевидно призовава изчистване. Така че това, което ред код е очевидно е виновен за това, че разпределени тази памет? Да приемем, че всеки, който пише изчистване е бил наоколо достатъчно дълго, че това е не по тяхна вина. Така че това е може би моето. getstring в cs50.c - така че е подават някъде на компютъра - в съответствие 286 изглежда е виновника. Сега нека предположим, че CS50 е наоколо за прилична сума от време, така че ние също са безпогрешни. И така, вероятно не е в getstring че е бъг, а по-скоро в здравей-2.в линия 18. Така че нека да разгледаме това, че линията е 18. О. Някак си тази линия не е задължително бъги, сам по себе си, но това е причината зад това изтичане на памет. Така че, просто супер, какво би интуитивно да бъде решение тук? Ако питате за памет, никога не са били като го обратно, и че изглежда проблем, тъй като с течение на времето моя компютър могат да изчезнат от паметта, може да забави надолу, лоши неща може да се случи, е, каква е интуитивният решение? Просто го върна. Как да се освободи този спомен? Е, за щастие това е съвсем проста да кажем безплатно име. И никога не сме го и преди. Но по същество може да мисли за безплатно като противоположност на изчистване. безплатно е обратното на разпределяне на паметта. Така че сега нека да прекомпилирате. Направи здравей-2. Нека да го стартирате отново. здравей-2 David. Така че изглежда да работят в точно по същия начин. Но ако се върна да Valgrind и изпълнете отново че същата команда на моя наскоро изготвя програма, пишете в името ми, както и преди - Ница. Heap резюме - в използването на изход - нули при нулева блокове. И това е супер хубаво, всички натрупам блокове бяха освободени. Няма течове са възможни. Така че идва, а не с проблем Set 4, но с проблем Set 5, по съдебна медицина, и по-нататък, това също ще стане Мярка за правилността на своя програма, независимо дали сте или не сте или не разполагат с изтичане на памет. Но за щастие, не само можете да разсъждаваме чрез тях интуитивно, които е, може би, лесен за малки програми но по-трудно за по-големи програми, Valgrind, за тези по-големи програми, може да ви помогне да определите конкретния проблем. Но има и един друг проблем, които могат да възникнат. Позволете ми да се отворят този файл тук, което е, отново, малко прост пример. Но нека да се съсредоточи върху това, което прави тази програма. Това се нарича memory.c. Ние ще публикуваме това по-късно днес в цип на изходния код на днешния ден. И забелязвам, че имам нарича функция е, че не приема аргументи и не връща нищо. В ред 20, аз съм явно обявяване на указател към Int и наричайки я х. Аз възлагане е завръщането стойност на изчистване. И само за да бъде ясно, колко байта съм Аз може би се връща от изчистване в тази ситуация? Вероятно 40. Откъде черпиш, че от? Е, ако си спомняте, че едно цяло число е често 4 байта, най-малко е в уреда, 10 пъти 4 е очевидно 40. Така изчистване се връща адрес на парче памет и съхранение, които справяне в крайна сметка в х. Така че да е ясно, какво след това се случва? Е, нека да се върнете обратно да ни снимка тук. Нека не просто изготвя дъното на душата паметта на компютъра, нека да вървим напред и изготвя целия правоъгълник, който представлява съвкупност от всички ми RAM. Ще кажа, че топчето е на дъното. А има и текст сегмент в на неинициализирани данни. Но аз съм просто ще абстрактни тези, други неща, след като точка, точка точка. Аз съм просто ще се позове на тази като грамада на върха. И след това в долната част на тази снимка, да представлява основен, аз ще да му се даде филийки памет в стека. За е, аз ще го дам парче на паметта на стека. Сега, аз имам да се консултира ми изходния код отново. Какви са локални променливи за основен? Очевидно нищо, така че парче е ефективно празни или дори не е толкова голям, както съм го изготвен. Но е, имам локална променлива, който се нарича х. Така че аз ще отида напред и да е парче от паметта, като го нарече х. И сега изчистване на 10 пъти 4, Така изчистване 40, къде е, че памет идва? Ние не сме привлече снимката подобно преди. Но да предположим, че това е ефективно идва от тук, така че един, две, три, четири, пет. И сега имам нужда 40 от тях. Така че аз просто ще направя точка, точка, точка, за да показват че има дори и повече памет връщаща се от куп. Сега какъв е адреса? Да избираме произволно справяне както винаги - Ox123, въпреки че вероятно ще да бъде нещо съвсем различно. Това е адресът на първия байт памет, която Питам за изчистване. Така че в кратко, след ред 20 изпълнява, това, което е буквално съхраняват във вътрешността на х тук? Ox123. Ox123. И Ox е безинтересно. Това просто означава, тук е шестнадесетично число. Но това, което е важното е, че това, което съм магазин в X, който е локална променлива. Но си тип данни, отново, е адрес на вътр. Е, аз отивам да съхранявате Ox123. Но отново, ако това е малко прекалено усложнява излишно, ако превъртите назад, можем абстрактно това далеч доста разумно и просто да кажа, че х е указател към това парче на паметта. OK. Сега въпросът под ръка е следното - линия 21, се оказва, че е бъгав. Защо? Съжаляваме? То не трябва - казват, че още веднъж. Е, това не е така безплатно. Така че това е второто, но. Така че има един друг, но конкретно по линия 21. Точно така. Този прост ред на кода е просто препълване на буфер, буфер превишаване. A буфер просто означава, парче от паметта. Но това парче на паметта е с размер 10, 10 числа, което означава, че ако Индексът в него с помощта на синтактична захар на масив нотация, на площада скоби, имате достъп до х скоба 0 х 1 х скоба, скоба точка, точка, точка. х скоба 9 е най-голямата. Така че, ако го направя х скоба 10, когато Всъщност ще в паметта? Е, ако имам 10 вътр - нека всъщност изготвя всички от тези тук. Така че това е първият пет. Ето останалите пет цели числа. Така х скоба 0 е тук. х конзола 1 е тук. х скоба 9 е тук. х скоба 10 е тук, което означава, казвам, в ред 21, на компютъра да се постави номер къде? Броят 0 къде? Е, това е 0, да. Но фактът, че си 0 е нещо като съвпадение. Тя може да бъде броят 50, за всички ни е грижа. Но ние се опитваме да го сложи на х скоба 10, което е, когато това въпросителен знак е изготвен, който не е нещо добро. Тази програма може много добре катастрофа като резултат. Сега, да вървим напред и да видим дали това е, наистина, какво се случва. Направи памет, тъй като файл се нарича memory.c. Да вървим напред и да тичам програмата памет. Така че извадихме късмет, всъщност, изглежда. Имахме късмет. Но нека да видим дали можем вече да пускат Valgrind. На пръв поглед, моята програма може изглежда да е съвсем верен. Но нека тече Valgrind с - Течове проверка равнява пълно на паметта. И сега, когато стартирате тази - интересно. Невалиден пиша с размер 4 на линия 21 от memory.c. Line 21 от memory.c е коя? О, интересно. Но чакайте. Размер на 4, което е, че предвид? Аз само не пиша, но е с размер 4. Защо е 4? Това е, защото това е едно цяло число, което отново е четири байта. Така Valgrind открили грешка, че аз, погледна моя код, не съм. И може би си TF биха или не биха. Какво Но Valgrind със сигурност установи, че ние сме направили грешка там, дори въпреки че извадихме късмет, и компютърът реши, нали, аз няма да се срине само защото сте докоснали един байт, един Int струва на паметта, че не сте действително си. Е, какво друго е бъгав тук. Адрес - Това е луда търсите адрес в шестнадесетичен вид. Това просто означава, някъде в грамада е нулеви байта след блок на площ 40 се разпределя. Нека да я увеличите тук и да видим дали това е малко по-полезни. Интересно. 40 байта определено са загубили до загуба записа 1 от 1. Отново, повече думи, отколкото е полезно тук. Но въз основа на маркираните линии, къде трябва да се съсредоточи вероятно ми внимание за още един бъг? Прилича на линия 20 от memory.c. Така че, ако се върнем към ред 20, това е един, който сте открили по-рано. И това не е непременно бъги. Но ние имаме това обратно своите ефекти. Е, как да коригира най-малко един от тези грешки? Какво можех да направя, след ред 21? Не можех да направя без X, така е да върне този спомен. И как да го оправя този бъг? Аз определено трябва да отидете не по-далеч от 0. Така че нека да се опита да извърши отново това. Съжаляваме, определено отидете не по-далеч от 9. Направи памет. Нека разясняване Valgrind в по-голям прозорец. А сега погледнете. Ница. Всички натрупам блокове бяха освободени. Няма течове са възможни. И до тук по-горе, не се споменава повече от невалиден право. Просто, за да получите алчни, и нека виж, ако друга демонстрация не отива по предназначение - Аз съм се късметлия преди малко. И факта, че това е може би е 0 ненужно подвеждащи. Нека просто да направя 50, а до известна степен спорно брой, марка памет точка наклонена черта памет - все още се късметлия. Нищо не се е трясък. Да предположим, че просто правя нещо наистина глупаво, и аз правя 100. Нека римейк памет, точка наклонена черта памет - Извадихме късмет отново. Какво ще кажеш за 1000? целочислени отвъд, грубо, къде трябва да бъде? Направи памет - Дявол да го вземе. [СМЯХ] OK. Нека не бърникам вече. Повтаряне на паметта. Ето. Добре. Така че очевидно сте индекса 100000 целочислени отвъд, където трябва да са били в памет, се случват лоши неща. Така че това очевидно не е силен, бърз правило. Бях вид използване опити и грешка да отида там. Но това е така, защото, дълга история кратко, на вашия компютър с памет също е разделено в тези неща, призова сегменти. И понякога, компютърът действително ви е дал малко повече памет отколкото си поиска. Но за ефективност, това е просто по-лесно да получите повече памет, но само да ви кажа че сте се част от него. И ако имаш късмет, понякога, затова, че може да бъде в състояние да се докоснат памет, която не принадлежи на вас. Вие нямате гаранция, че това, което стойността поставите там ще остане там, защото на компютъра все още мисли, че не е твоя, но това не е непременно ще да удари друг сегмент на памет в компютър и предизвика такава грешка този тук. Добре. Всякакви въпроси, след това в паметта? Добре. Нека да разгледаме тук, а след това, в нещо, което съм бил като за предоставена от доста време, който е в този файл, наречен 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 два знака, С1 и С2. И след това в ред 68, всъщност има линия на кода, който е напомня на нашият приятел ФОРМАТ, имайки предвид, че няма процента Cs в кавички. Забележете какво се случва тук. sscanf означава низ сканиране - означава сканирате форматиран низ, значи sscanf. Какво означава това? Това означава, че преминава към sscanf низ. А линията е независимо потребителят пише инча Вие се премине към sscanf формат низ тази, която разказва какви са scanf Надяваш ли се потребителят е въвел инча След това трябва да мине-в адресите на две блокове памет, в този случай, защото имам две контейнери. Така че аз ще го дам на адрес С1 и С2 адрес. И припомни, че ви даде функция на адрес на някаква променлива, какво е Последици? Какво може да направи тази функция в резултат на което му адреса на променлива, за разлика от самата променлива? Тя може да го промени, нали? Ако имаше някой, на картата на физическа адрес, те могат да отидат там и да направя каквото си искат на този адрес. Същата идея тук. Ако се премине към sscanf, адреса на две блокове памет, дори и тези малки малки блокове памет, C1 и C2, но ние го кажа адреса от тях, sscanf да го промените. Така че целта sscanf в живота, ако прочетем на човек страница, е да прочетете това, което потребителя написали в, надявам за потребителя като въвели в характер и може би друг характер, и независимо от потребителя написали, първия знак отива тук, вторият знак се поставя тук. Сега, като настрана, това, и бихте знам само това от документацията, факта, че сложих празно място там просто означава, че не ми пука, ако ръководство удари Space бар няколко пъти, преди той или тя отнема характер, аз отивам да се игнорира всяко празно пространство. Така че, аз знам от документацията. Фактът, че има втори в% последван от празно пространство е всъщност умишлено. Искам да бъда в състояние да открие, ако потребителят прецаках, нито оказаха съдействие. Така че аз се надявам, че потребителят само въвели в един символ, затова се надявам че sscanf само ще върне стойност 1, защото, отново, ако Четох документацията, целта sscanf в живота е да се върнете в брой променливи, които се попълват с потребителски вход. Минах през две променливи адреси, C1 и C2. Надявам се обаче, че само един от тях е убит, защото ако sscanf връща 2, какво е вероятно Последици логично? Това ръководство не само ми даде една характер като му казах, или нея. Те вероятно сте написали в малко два знака. Така че, ако вместо това не са имали втори % C, аз просто трябваше един, който честно казано би било по-интуитивно подход, мисля, че на пръв поглед, че няма да бъде в състояние да открива ако потребителят е ви дава повече данни, отколкото сте всъщност исках. Така че това е косвена форма от проверка за грешки. Но забележете какво правя тук. След като аз съм сигурен, че потребителят ми даде една характер, I освободи линията, прави обратното на getstring, което от своя страна използва изчистване, а след това се върна C1, характера, че се надявам на ползвател и само при условие. Така бърз зърна само, но Въпроси по getchar? Ще се върнем към някои от другите. Е, нека да вървим напред и да направите това - Предполагам, че сега, само за да ни мотивира обсъждане на седмица плюс времето, това е файл, наречен structs.h. И отново, това е просто вкус за нещо, което предстои. Но забележете, че много за това е коментари. Така че нека да маркирате само интересната част за сега. typedef - има същата дума отново. typedef използваме, за да декларират низ като специален тип данни. Можете да използвате typedef да се създаде нова типове данни, които не са съществували, когато C е изобретен. Например, вътр идва с C. Чар идва с C. двойно идва с C. Но че няма понятие за един студент. И все пак би било доста полезно да бъде в може да се напише програма, която съхранява в променлива, ID номер на студента, своето име, и къщата им. С други думи, три парчета на данни, като едно цяло число и низ и друг низ. С typedef, което е доста мощен за това и ключовата дума sturct за структура, като програмисти през 2013 г., всъщност може да определи свой собствен на типове данни, които не са съществували години преди, но които отговарят на вашите цели. И тук, в редове от 13 до 19 г. ние сме за обявяване на нов тип данни, като едно цяло число, но като го нарече ученик. И вътре в тази променлива ще е три неща - едно цяло число, низ, и низ. Така че можеш да се сетиш какво е наистина се е случило тук, въпреки че това е малко на опростяване за днес студент по същество ще да изглежда по този начин. Неговата ще бъде парче памет с ID, име поле и поле къща. И ние ще бъдем в състояние да използват тези парчета памет и достъп до тях, както следва. Ако отида в struct0.c, тук е относително дълъг, но след модел, на кода, който използва този нов трик. Така че, първо, нека да насоча вниманието ви до интересните части до върха. Sharp определя студенти 3, декларира постоянни наречени студенти и правоприемници тя произволно номер 3, само така че имам трима студенти използващи тази програма за сега. Тук идва Main. И забележете, как да се декларират масив от учениците? Е, аз просто използвайте същия синтаксис. Думата ученик е очевидно нова. Но студентите, класа, скоба студенти. Така че за съжаление има много за повторна употреба на термините тук. Това е просто число. Така че това е като да кажеш, три. Клас е само това, което искам да се обадя на променлива. Мога да го наричат ​​учениците. Но клас, това не е клас в обектно-ориентирано вид Java на пътя. Това е просто един клас ученици. И типа данни на всеки елемент в този масив е студент. Така че това е малко по-различна и да не каже нещо по този начин, това е просто - Казвам, дайте ми трима студенти и наричат ​​този клас масив. Добре. Сега тук е четири цикъла. Този е запознат - обхождане от нула до три. И тук е новото парче на синтаксис. Програмата ще ме подкани, на човека, да му се даде студент ID, което е Int. И тук е синтаксис, с които можете да съхранява нещо в ID областта на Местоположение клас скоба I. Така този синтаксис не е нова. Това просто означава, дайте ми осми студент в класа. Но този символ е нов. До този момент, ние сме не може да се използва точка, най-малко в код, подобен на този. Това означава, отидете на структура, известна като студент и сложи нещо там. По същия начин, в този нов ред, 31, проверете напред и сложи независимо от клавиатурата на наименование, тук и това, което правят за къща, на едно и също нещо, давай напред и сложи в него. къща. Така че това, което прави тази програма в крайна сметка да направя? Можете да видите малко закачка там. Позволете ми да отида напред и да правят structs 0 точка наклонена черта структурата на 0, ID студента 1, казват David Mather, студент ID 2. Rob Къркланд, студент ID 3. Lauren Leverit - и единственото нещо, тази програма е, който е само на напълно произволно, се Исках да направя нещо с тези данни, сега, че съм ни научи как да използвате structs, е аз просто трябваше тази допълнителна линия тук. I обхождане на масив от студенти. I използва нашия, може би сега близък приятел, низ сравнение, stircomp да Проверката е осмият ученик къща равна на Mather? И ако е така, да го разпечатате нещо произволно харесва, да, това е. Но отново, просто ми дава възможности за използване и повторно използване и повторно тази нова нотацията с точка. Така че на кого му пука, нали? Очаквайте с един студент програма е известна степен условно, но се оказва, че можем да направим полезни неща с това, например, както следва. Това е много по-сложна структура в C. Той има една дузина или повече полета, малко загадъчно име. Но ако някога сте чували за графика формат наречен растерна графика, BMP, тя Оказва се, че на растерна графика файлов формат почти изглежда, че това. Това е глупава усмивка на лицето. Това е малко изображение, което съм увеличени в на доста голям, така че можех да видя всяка на отделните точки или пиксели. Сега се оказва, можем да представляват черна точка с, да речем, на номер 0. И една бяла точка с номер 1. Така че с други думи, ако искате да нарисувате Smiley лицето и да спаси това изображение в компютър, е достатъчно да се съхранява и нули тези, които изглеждат така, къде, отново, такива са бели и нули са черни. И заедно, ако има действителен а опасват от единици и нули, че имате мрежа от пиксели, а ако се ги, имате един сладък малко Smiley лицето. Сега, растерна графика файлов формат, BMP, е ефективно, че под предния капак, но с повече пиксели СОТ, че действително могат да представляват цветове. Но когато имаш по-сложни файлови формати като BMP JPEG и GIF и , с които може да сте запознати, тези, файлове на диск обикновено не само имат нули и единици за пикселите, но те имат някои метаданни, както и - мета в смисъл, че не е много данни, но това е полезно да има. Така че тези области тук се предполага, и Ще видим това по-подробно в P-комплект 5, че преди нули и единици, които представляват пиксели в изображението, има един куп метаданни като на размера на изображението и ширината на изображението. И забележи съм скубане на разстояние около произволни неща тук - ширина и височина. Брой битови и някои други неща. Така че има някои метаданни във файл. Но с разбирането как файловете са определени в този начин, всъщност можете да след това да обработвате изображения, възстановяване на снимки от диск, преоразмерявате изображения. Но не е задължително да подобряване тях. Имах нужда от снимка. Затова се върнах към RJ тук, които сте видяли на екрана, преди известно време. И ако се отворят Keynote тук, това е какво се случва, ако се опитате да увеличите и повишаване RJ. Той не става по-добре наистина. Сега Keynote е вид размива го малко, само за да се замазват Фактът, че RJ не получава особено засилено, когато увеличите инча И ако го направя по този начин, виж площадите? Да, определено може да видите квадратите на проектор. Това е, което ще получите, когато подобри. Но в разбирането как нашата RJ или Smiley лицето се реализира ще ни пуснат всъщност пишат код, който манипулира тези неща. И аз мислех, че ще приключи на тази бележка, с 55 секунди на едно засили това е, Смея, да кажем по-скоро подвеждаща. [VIDEO PLAYBACK] -Той лъже. За това, аз не знам. -Е, какво знаем? -Това в 9:15 Ray Santoya е на банкомата. -Така че въпросът е какво правеше той в 9:16? -Стрелба деветмм в нещо. Може би той видя снайперист. -Или се работи с него. -Чакай. Върнете се едно. -Какво виждаш? -Носете си с лицето нагоре, на цял екран. -Очилата му. -Има размисъл. -Това е бейзбол Neuvitas отбор. Това е тяхното лого. -И той говори на всеки, който е носиш това яке. [END възпроизвеждане на видео] DAVID J. Malan: Това ще бъде Проблем Set 5. Ние ще се видим следващата седмица. MALE SPEAKER: На следващото CS50. [Щурците свиреха] [За възпроизвеждане на музика]