СПІКЕР 1: Привіт всім. Ми збираємося, щоб почати. Я думаю, що люди все ще йдуть бути фільтрації в. Але в цілях економії часу, тому ми можемо отримати ви, хлопці, звідси на час, ми збираємося почати. Так що ласкаво просимо до CS50 Вікторина 0 відгуків. Для тих з вас, хто не зрозумів, ще, у вас є питання на середу. Ву-ху. Якщо ви ще не почали вивчати ще й не зрозумів, що це існує поки, останні опитування і вся інформація про ваш тест знаходяться на cs50.net/quizzes. Там-то досить хороший матеріал там, Минулі вікторини від останнього 10 років, а також інформацію про це вікторини і темам , Які будуть покриті. Так що давайте почнемо. Так ви, хлопці, можливо, пам'ятаєте, перший день класу Давида були ті лампи на. Так по суті, все, що відбувається під капотом комп'ютера є зроблено в двійковій системі. Двійковій означає, що це звучить як, 0 і 1 років. Вона має два значення, можна уявити. Так само, як в перший день розділ коли Девід включив світло лампа для подання на, або 1, наш комп'ютер розуміє двійковий як 0 і 1-х, чи ні. Основи Binary. Кожне місце представлена в базі два. Таким чином, ви додайте 2 до 0 до З 1 по 2 всі, аж до. Щоб обчислити, що ваша програма є десяткової, ви просто прямуєте це рівняння Тип річ. Якщо у вас є 1 в будь-якому з цих місць, Ви помножте його на все засновувати це, додайте його, і Ви отримуєте десяткової. Так що це, як ви вважаєте до 5 в двійковому вигляді. Так само, як те, що ми робили на останній слайд, це, як ви б представляють з 1 по 5. Точно так же, так само, як ви можете додавати і відняти в десяткового або засновувати 10, або дійсно будь-яку підставу, на можна додати і відняти в двійковій системі. Точно, що ви очікували б, коли ви додати двох до, якщо вона дорівнює більше ніж 1, ви носите 1, зробити його 0, і зробити додавання таким чином, просто як можна було б очікувати з регулярним десяткове або будь-який інший бази. Прохолодний. Так як я вже говорив, все, що відбувається під капотом нашого комп'ютера робиться в 0 і 1, або бінарний. Так як же ми висловлюємо, наприклад, букв або цифр або символів? І відповідь на це ASCII. ASCII є відображенням між персонажами що ми зазвичай бачимо в Англійська мова, як сайт, B, C о, підкреслюють, тире, і нічого подібного. І він відображає, що в значення ASCII. Значення ASCII це просто число, що можна зрозуміти, комп'ютері. І так само, як ви можете зробити додавання і віднімання з числами, ви можете зробити їх зі значеннями ASCII. Таким чином, в цьому прикладі, що це буде роздрукувати? Так, так просто простір B простір C простір D. Де моя миша йти? Зверніть увагу, ви можете визначити Int на 65. І при друку, що за допомогою відсотків C, це буде інтерпретувати, що, як характер і роздрукує А. Крім того, ви можете оголосити це як символ. І коли ви роздрукувати його за допомогою відсотків C, це буде інтерпретувати, що, як відсотків D. І так само, як ви можете додати число, ви можете додати символи Значення ASCII, в цьому випадку. Так трохи покажчик для всіх. 5, у вигляді рядка, що не фактично дорівнює 5. Так як ми можемо перетворити Рядок 5 до цілого 5? Будь-які ідеї? Так. Так що, якщо у нас є 5 у вигляді рядка, ми можемо відняти 0. І що дасть нам 5. І точно так само, якщо у нас є 5 як ціле, додати, що в рядок 0. І це дає нам рядок 5. Прохолодний. Тепер згадайте назад в лекції той, де ми говорили про алгоритмів. Так як же ми насправді хочемо комп'ютер щоб робити цікаві речі? Ви знаєте, просто додавання і віднімання номери і друку речі з НЕ що цікаво. Як правило, ми хочемо, щоб наш комп'ютер до виконувати свого роду алгоритм. Щось трохи складніше ніж просто простої арифметики. Алгоритм просто крок за кроком набору інструкцій для виконання, як певний task-- так само, як рецепт. Можливо, ви пам'ятаєте перший день Клас, де Давид Підрахуємо номер людей і скільки людей були в кімнаті. Ви могли б бути використані для підрахунку один за іншим. 1, 2, 3, 4. В цьому випадку лінійний алгоритм часу. Але Давид ввів алгоритм Ви порахувати людей в номері де всі встають, ви Вимовте Число іншій особі, додати, що число, і одна людина сідає. І ви повторити це. Це один тип алгоритму. Ми можемо проаналізувати, як ефективно ап Алгоритм заснований на це під час виконання. Але ми поговоримо трохи про це трохи пізніше. Таким чином, всі алгоритми можуть також записати в псевдокоде. Псевдокод просто англійську як синтаксис, використовуваний для представлення мова програмування. Наприклад, якщо ми хотіли запитати користувача вгадати мій улюблений номер, ми псевдокод може мати як такої. Отримати користувачі думаю. Якщо здогадка вірна, сказати їм, вони праві, інакше сказати їм вони не правильно. І псевдокод це спосіб легко представляючи ідею або алгоритм. Так що тепер ми могли б насправді писати це мовою, що комп'ютер могли б розуміння. Таким чином, ми можемо записати наш псевдокод і інтерпретувати, що у вихідному коді. Поки, вихідний код повинен дотримуватися в певній синтаксисом мова програмування. І до цих пір, в CS50, ми використовували в основному в. Так що це може бути вихідний код в. Пізніше в ході, ви вночі приходять в контакт з іншими програмування Мови, як PHP. Або, якщо ви навіть приймати інші класи, вам може зробити Java, Python, або навіть OCML. Але в нашій мові з програми, це як ми могли б написати вихідний код для алгоритм псевдокод, що Я щойно описав раніше. Так як же ваш комп'ютер насправді зрозуміти, що? Як я вже говорив, це тільки дійсно розуміє нулі й одиниці. Так, як це отримати від джерела Код до того, що може бути зрозумів? Ну, у нас є що називається компілятор. Якщо ви пам'ятаєте назад в більшість psets, ви були якісь програми написано в точка C File. І тоді ви повинні ввести марку. Так що ж робити робити? Ви можете ввести марку, щоб компілювати Програма тому someone-- той, хто написав свій р набір; ймовірно David-- створив зробити файл. І що говорить зробити, щоб знати, щоб запустити свій компілятор, називається дзвін, що воля скомпілювати вихідний код об'єкта Код, який нулі й одиниці що ваш комп'ютер розуміє. Але трохи пізніше, ми підемо більш докладно про компіляторів. Так згадати PSET 0, where-- да, у вас є питання? АУДИТОРІЯ: [нерозбірливо]? СПІКЕР 1: Так. Я думаю, що вони насправді повинні бути онлайн. Так. АУДИТОРІЯ: Це як [нерозбірливо]? СПІКЕР 1: Це не так. Знаходяться на cs50.net/quizzes. АУДИТОРІЯ: Slash вікторини, слеш 2013, слеш 0, і просто натисніть через вікторини 2013 і вікторини 0, переглянути розділ слайди. СПІКЕР 1: Так, так що якщо ви, хлопці, хочете потягніть його вгору і подивитися на нього на вашому власний комп'ютер, це теж добре. Сказати, що знову. АУДИТОРІЯ: [нерозбірливо]. СПІКЕР 1: Так, [нерозбірливо] є фіктивна змінна. О, да? АУДИТОРІЯ: [нерозбірливо]? Динамік 1: Ні, страйки не так на іспиті. На жаль, її питання було, був удари по іспиту. І це не так. Так PSET 0, ви, хлопці, повинні мати всі реалізовані небудь через подряпину. І ми дізналися деякі основи програмування будівельні блоки, що використовують подряпини. Отже, давайте поглянемо на деякі з цих будівельних блоків , Які складають програму. Вперше це логічне вираз. Логічні вирази є ті, і 0-х або все, що має два можливих значення. В цьому випадку, істинним або хибним, або вимкнути, і так чи ні. Приклад простий, дуже простий, програма, яка використовує логічне вираз тут. Так для того, щоб логічних виразів в бути корисно, у нас є логічні оператори. Ці оператори, які можна використовувати порівняти певні значення. Тому у нас є і чи не дорівнює, менше або дорівнює, або більше, ніж рівні, і менше, ніж або більше, ніж. Але ці оператори не дуже корисно якщо ми не можемо об'єднати їх в умови. Так ви, хлопці, пам'ятаєте з нуля і з вашого р встановлює, що ми було умови. Вони, по суті, як вилки в логіка вашої програми, що виконує в залежності від того умова виконується. Так однією з умов, які ми мали використовувати багато разів в цьому курсі якщо, то в іншому місці, якщо, і в іншому місці умови. Ось приклад того, як Ви могли б використовувати це. Хто-небудь знає різницю між тільки за допомогою якщо заяви всіх аж віршах, якщо, ще, якщо, і ще в поєднанні? Да? АУДИТОРІЯ: [нерозбірливо]. СПІКЕР 1: Точно. Так що, якщо у мене було, якщо все, аж цьому чином, навіть якщо це умова повернення правда, він все одно буде продовжувати тестування в найближчі два. У той час як, з ще-якщо, до ELSE особистих даних, якщо один повертає істину, інші не перевіряв. Будь-які питання про те, що? Прохолодний. Таким чином, ви використовуєте, якщо-інакше з ELSE заяву, якщо ви знаєте, що він може тільки бути одним з цих випадків. Отже, ми знаємо, якщо х менше 0, це безумовно не буде більше, ніж 0. Далі, ще одним будівельним блоком що ми дізналися є петлі. У нас є три типи циклів. Для петель, в той час як петлі, і зробити в той час як петлі. І взагалі, коли ви сідаєте в то написати, ви повинні вирішити, який із трьох ви хочете використовувати. Так як же нам вирішити, який? Ми взагалі використовуємо для циклу, якщо ми знаємо, скільки разів ми хочемо ітерації через те чи скільки раз ми хочемо, щоб виконати завдання. Ми використовуємо в той час як петлі, якщо нам потрібні стан, щоб бути правдою, щоб продовжувати працювати. І ми використовуємо зробити в той час як дуже схожий на в той час як, але ми хочемо, щоб наш код для запуску на мере один раз. Так що в той час, все, що знаходиться в волю завжди виконуються хоча б один раз. У той час як, з той час, його не може працювати взагалі, якщо умова не виконана. Будь-які питання з цим? Так структура для циклу. Ви, хлопці, всі бачили це. Ви инициализировать його. У вас є свого роду стані. Так, наприклад, ми могли б ініціалізувати як для я дорівнює 0. я менше 10. І я ++. Дуже простий, що ми зробили. Деякий час циклу, так же, у вас є мати свого роду ініціалізації, свого роду стані, і свого роду оновлення. Так що ми можемо реалізувати наші циклі також як час циклу за допомогою цього. І точно так само з справ в той час як петлі, ми могли б мати деяку ініціалізацію, виконати те, оновити його, і Потім перевірте стан. Так що тепер функції. Ставимо все разом. Ми, можливо, захочете написати деякі вид функції. Загальні функції, які ви, можливо, вже бачили це головний. Основний є функцією. Він має тип значення, внутр. Він має ім'я функції, основним. І вона має аргументи, ARGC і ARGV. Так головний це просто функція. Інші функції, які ви використовували, printf-- Е є function-- GetInt, ToUpper. Але це, виявляється, був реалізовані для нас свого роду бібліотеки. Якщо ви, хлопці, пам'ятайте включаючи ця бібліотека CS50.h або Стандарт I / O бібліотека. Так, питання? Зали: основний просто притаманне с? Чи має це тільки частково [нерозбірливо]? СПІКЕР 1: Питання в тому, якщо головний притаманна в. І так, всі функції Тобто основну функцію. Це свого роду необхідні для комп'ютера знати, з чого почати виконання коду. АУДИТОРІЯ: Так ви не захотіли [нерозбірливо]? СПІКЕР 1: N: Ще питання? Прохолодний. Так само, як ви можете використовувати функцію що написано для вас, ви можете також написати свою власну функцію. Це функція, що хтось міг би написали для розрахунку обсягу з д, наприклад. Там в повертається тип тут, в цьому випадку Int, наше ім'я функції д і наші Список параметрів. І зверніть увагу, що у вас є, щоб записати дані тип параметра, який потрібно використовувати або функції не знати, які параметр повинен я бути прийняття. Так, в даному випадку, ми хочемо ціле, як наш вхід. Так чому може ми хочемо використовувати функції? Перш за все, відмінно підходить для організації. Вони допомагають розбити свій код в більш організованою шматки і зробити його було простіше читати. Спрощення. Це добре для дизайну. Коли ви читаєте шматок коду і основна функція дійсно, дуже довго, це може бути складніше Причина про те, що відбувається. Так що якщо ви розбити його на функцій, це може бути більш зручним для читання. І повторно-здатність. Якщо у вас є шматок коду, який будучи називається або запустити кілька разів, замість перезапису, що код 10 раз в основної функції, ви могли б хочете використовувати його. І тоді кожен раз, ви повинні використовувати, що шматок коду, викликати функцію. Так що тепер, якщо ми згадаємо, назад нуля, ми також говорили про декілька концепцій, один з яких різьби. Тема є поняття кратного послідовності коду виконання одночасно. Так згадайте дня, де Девід був Ви, хлопці, відрахувати кількість люди в кімнаті. По суті, що відбувається на всі з вас, хлопці були працює окремі потоки. І ці теми йшли разом щоб отримати свого роду відповідь. Точно так же в порожньому, коли у вас є кілька спрайт, може є кішка і собака. І вони були б одночасно працюють власні скрипти. Це є прикладом різьби. І інше поняття, що було введений в порожньому була події. І події, коли кілька частин ваш код спілкуватися один з одним. В нуля, це було, коли ви використовували контроль і мовлення Коли я Отримайте блоків. А також, в задачі Набір 4, ми бачили трохи подій, а також. Ви, хлопці, могли б використовувати Бібліотека Gevent. І була функція waitForClick в якому ви чекали для користувача, щоб натиснути кнопку. І ваш клацання, в цьому випадку, було б подій і чекати клік це ваш оброблювач подій. А також, по всій показ psets і працює на ваших psets, ви можливо, вступають в контакт з Деякі з цих команд. Це те, що ви набрали у ваше вікно терміналу або що вікно що з'являється на вашому г правку, істотно перейдіть комп'ютер. Так, наприклад, LS перераховує вміст каталогу. Створення каталогу створює нову папку. CD, змінити каталог. RM, видалити, видаляє файл або деякі каталог. А потім видалити каталог видаляє каталог. АУДИТОРІЯ: [нерозбірливо]? СПІКЕР 1: Так, звичайно. На жаль, питання було, якщо вас б запропонувати покласти це на шпаргалку. Це могло б допомогти. Якщо у вас є номер, ви можете поставити його на. Це також просто, як правило досить добре запам'ятати, тому що, коли ви використовуєте його Ви могли б хотіти просто Тобто він запам'ятав. Це зробить ваше життя набагато простіше. Я відповів на ваше запитання? Так що тепер, ми трохи поговорили коротко про бібліотеки. Але два головних ті, які ми були використовуючи досі в хід йдуть стандарт введення / виводу і CS50. Які речі включені в стандартній бібліотеці вводу / виводу? Так, до цих пір ми використовували Printf. В CS50, ми використовували GetInt і GetString. І тип даних рядок також відбувається , Який був оголошений в цьому CS50 бібліотеки. Ми поговоримо ще трохи в глибині про як бібліотеки працюють і як вони взаємодіяти з іншою частиною коду. Але ті, є двома основними ті, які ми вступають в контакт з до цих пір в Звичайно. Види. Це добре, щоб пам'ятати, скільки кожен тип представлений або як кількість байт кожен тип requires-- Int, 4 байта; символ, 1 байт. Поплавок становить 4 байта. Що таке подвійний? АУДИТОРІЯ: [нерозбірливо]. СПІКЕР 1: Так, так поплавок але подвоїти розмір. А як щодо тих пір? АУДИТОРІЯ: [нерозбірливо]. СПІКЕР 1: OK. Що таке довго? АУДИТОРІЯ: [нерозбірливо]. СПІКЕР 1: Так, два рази на Int. Так. АУДИТОРІЯ: [нерозбірливо]. СПІКЕР 1: Лонг [нерозбірливо]. А потім довго довго вдвічі більше, ніж. АУДИТОРІЯ: Ні, ні. Довга просто внутр. Це залежить від архітектури до [нерозбірливо] і Int мають однаковий розмір. [Нерозбірливо]. СПІКЕР 1: Так довго і Int однакові. А потім дуже довго вдвічі внутр. Прохолодний. І потім, що це останній тип? АУДИТОРІЯ: Покажчик. СПІКЕР 1: Так, так ми дізналися Трохи про покажчиків. І незалежно від того, покажчик вказуючи to-- нього може бути символ зірки або Int star-- це завжди 4 байта для покажчика. Питання про те, що? Да? АУДИТОРІЯ: [нерозбірливо]? СПІКЕР 1: Так довго і Int є те ж саме в цьому CS50 пристрою. АУДИТОРІЯ: Прилад повністю взаємозамінні. СПІКЕР 1: Так. Так потім довго довго подвійний внутр. АУДИТОРІЯ: Це 32 біт? СПІКЕР 1: 32 біт, так. АУДИТОРІЯ: Так [нерозбірливо]? СПІКЕР 1: Так, якщо це не так явно говорять, вас повинні взяти на себе 32 біт. АУДИТОРІЯ: Було б щось сказати як припускаючи Архітектура як приладу. Для 64-бітної, тільки те, що Зміна є жадає і покажчики. Як вони [нерозбірливо]. СПІКЕР 1: Да? АУДИТОРІЯ: Питання. Так на одному з практики вікторини, він просить про непідписані Int. Так як же, що визначається від Int [нерозбірливо]? СПІКЕР 1: без знака в також 4 байта. Але чим відрізняються підписаний Int і без знака Int? АУДИТОРІЯ: [нерозбірливо]. СПІКЕР 1: Право. Можна уявити негативні значення. Але як це зробити? АУДИТОРІЯ: [нерозбірливо]. СПІКЕР 1: Так, це економить 1 біт для представлення знака. Підписаний має один біт, що являє собою знак. І без знака просто всі позитивні. АУДИТОРІЯ: ОК. Так ви говорите, що номер на двох чоловік в два рази більше поплавком? СПІКЕР 1: Двомісний в два рази Розмір цілого, так. АУДИТОРІЯ: Як покажчик щоб довго довго [нерозбірливо]? СПІКЕР 1: Отже, питання в тому, як робить покажчик на довгий long-- Як це тільки чотири байти, коли дуже довго її 8 байт. Так що пам'ятайте, що це покажчик, по суті справи, на дуже базового значення. АУДИТОРІЯ: [нерозбірливо]. СПІКЕР 1: Так, так покажчик це просто осередок пам'яті. Так що не має значення, як багато місця що покажчик направлений в. Це необхідно тільки 4 байта, щоб відслідковувати з цієї комірки пам'яті. Ще питання? Прохолодний. Так останнє, що у мене є використовується стандартний висновок. Ви повинні використовувати їх часто Досить того, що ви можете згадати. Але це, коли ми використовуємо Е, наприклад. І у нас є ці наповнювачі, називалися коди формату. Так відсотків з гольця, відсотків я для междунар, і ми можемо також використовувати процентну д. Це те ж саме. Але, як правило, в CS50 ми спробуйте використати процентну I. Відсоток е для поплавка. Відсоток а.с. довго довго і відсотків с для рядка. Точно так же, ми використовували кілька ці керуючі послідовності. Наприклад, зворотну косу рису н для нової лінії. Це просто, коли ви форматування ваш код для друку ф. Да? АУДИТОРІЯ: Що таке відсотків добу протягом? СПІКЕР 1: Отже, питання є те, що відсотків на добу протягом? Відсоток г для цілих чисел. Відсоток D і I відсотків однакові. АУДИТОРІЯ: У чому різниця між зворотний слеш н і зворотний г? СПІКЕР 1: Отже, питання в чому Різниця між люфту п і люфт г? Я думаю, зворотної косою р is-- АУДИТОРІЯ: Так зворотний слеш г всього лише має на увазі, повертається в початок рядка фактично не збираюся з нового рядка. Так що, якщо ви друкуєте зворотної косою г і ви повернутися до початку рядка потім роздрукувати більше матеріалу, перезапису матеріал, який вже на [Нерозбірливо]. У той час як, н фактично йде на новий лінії і йде в [нерозбірливо]. СПІКЕР 1: Ну, будь-які інші питання? Добре. Я збираюся передати його далі, щоб Ден, який буде тривати. [Оплески] ДЕН: Всі правша. Так що я буду говорити про інший шириною Діапазон ідей з класу, які приблизно представник тижнів два і початок три тижні, починаючи з з лиття, який просто спосіб лікування значення певного типу, як значення іншого типу. Таким чином, ми можемо зробити це з символів в Інтс, спливає на цілих чисел, і довгі жадає подвоїти. Всі ці речі можна використовувати як способів лікування деякий числове значення мінус символ, як деякі інші числове значення. Таким чином, є деякі питання, з цим, з Звичайно, яких приходить, коли ви приводите речі, як поплавок на цілих чисел. Так що це трохи дивно. У нас є поплавок, який є 1,31. Помножимо його на 10 тисяч. А потім ми друкуємо його в якості міжнар. Що це вихід? 10000 раз 1,31. Так 13000, в тому, що вгадати? Зали: Я думаю, що це 10000. ДЕН: Так що я помноживши його на 10 тисяч до Я лиття його. АУДИТОРІЯ: Ох. Не було там бути один 9 і деякі 0 цифри? ДЕН: Ви, можливо, деякі дивні цифри. Так правильно, це в 1,3 рази 10000. Так ось 13000. І цей додатковий weird-- АУДИТОРІЯ: 13100. ДЕН: 13100. Спасибі, Боб. І цей додатковий weirdness-- це 9,9-- просто тому, що цього лиття закінчив округлення вниз, де воно не повинно бути. Так. АУДИТОРІЯ: лиття відбувається після все інше? ДЕН: Так тому що у мене це у пресі, це робить цей множення перед ним робить цей кастинг. АУДИТОРІЯ: [нерозбірливо]. ДЕН: Я думаю, що це поставить під першим, да, який буде 10000. Що ще? Прохолодний. Так що це 13099. Чому це відбувається? Неточність. Поплавці не ідеальні. Вони можуть тільки уявляти числа в певну кількість значущих цифр. Так що, якщо ми роздрукувати 8 SIG інжир на це поплавок, ми отримуємо свого роду потворний погляд номер. І це тому, що 1,31 не може точно бути представлений простий ступенями двійки в машині. Так що в кінці кінців приймаючи ближче думаю, що в кінцевому підсумку бути трохи низько. Сенс? ОК. Тепер, перейшли в інший спосіб робить умовні оператори, де всі ми дбаємо про те, одна змінна. Таким чином, в цьому конкретному прикладі, ми отримуючи ціле число від користувача. А потім ми дивимося на що це ціле є. Імовірно, це число від одного до чотирьох. Це те, що ми просимо. Таким чином, ви зробити перемикач ім'я змінної. Тоді ви створили випадки можна цінує це могло бути. Так випадку, якщо один, кажуть, що це низько. І тоді ви порушите вийти стану перемикача, так Ви не продовжувати. У наступному case-- так справа два і справа three-- якщо ця справа два він просто падає до Перший рядок коду він бачить, як з трехмодовом, поки не побачить перерву. Так що причина ви отримуєте випадок один на тільки друк низький тому, що I Тобто цей перерву тут. Якщо я, скажімо, ігнорувати цей break-- якщо я кинув цю breakaway-- було б надрукувати низький, і тоді було б друкувати середину, і тоді було б зламати. Так перерви є важливою частиною з перемикання умови і вони повинні бути там. Будь-які випадки, які явно не обумовлено обробляються за замовчуванням Справа в комутаторі і повинні бути подані. АУДИТОРІЯ: Так 1, 2, 3, і 4 буде н? ДЕН: Значення, н може бути. Так. Да? АУДИТОРІЯ: Отже, коли у вас є що [нерозбірливо]? ДЕН: Ви б надрукувати низький, а потім було б надрукувати середину, і то було б зламати. Зал: А чому б роздрукувати середній якщо [нерозбірливо]? ДЕН: Так що все під випадку до перерви потрапляє під. Так справа один принт під випадок один, як це наступні друковані. Да? АУДИТОРІЯ: [нерозбірливо]? ДЕН: Так це число лише приватним значення, ця змінна можна взяти, чи не так? Чи має це сенс? Так. АУДИТОРІЯ: [нерозбірливо]? ДЕН: Так, справа два друкуватиме середнього, а потім розбити. АУДИТОРІЯ: [нерозбірливо]? ДЕН: Я думаю, що будь-який? Які ще типи даних Ви можете перейти? АУДИТОРІЯ: Ви можете перемикатися по відношенню до будь-яких типів даних. Але це значить тільки нічого над символів і Інтс і все в такому дусі, що, оскільки якщо ви перемиканні покажчик що насправді не має сенсу, перемикання навантажень, якщо він навіть давайте Ви робите це, бо з плаваючою крапкою в точності, ви не будете дійсно хочу зробити це в будь-якому випадку. Так в значній мірі, всього Інтс і символи і все в такому дусі. ДЕН: Так, це коли у вас є явне значення, що ви знаєте, я думаю, що, може бути що перехід насправді корисно. Добре? ОК. Сфера є діапазон, що заявив змінна поширюється. Таким чином, в цій маленькій шматок коду у мене є, було б повно помилок. А причина в тому, я оголосив цю Int я в рамках цього циклу. А потім я намагаюся посилатися, що я за межами, що для сфери петлі. Так в основному, ви можете думати про рамки як усі, що ви оголошуєте з всередині набору фігурних дужках тільки існує в тих фігурні дужки. А якщо спробувати і використовувати цю змінну за межами тих фігурні дужки, ви будете отримаєте помилку від компілятора. Да? АУДИТОРІЯ: Так що це один не працює? ДЕН: Це не працює, так. Рядки. Рядок символ *. Вони точно так же. Вони просто покажчики на символи. І будь-які рядки, які ви повинні повинні закінчитися із зворотного косою риси нульовою, який знаходиться всього з конвенція. Вона називається NULL термінатор. І NULL-- капітал N, капітал U, капітал L, капіталу L-- це не те ж саме, NULL термінатор. Це покажчик. Це символ. Вони дуже різні. Пам'ятайте це. Це буде на вікторині, напевно. Я не бачив вікторину. Да? АУДИТОРІЯ: Так NULL, скажімо, покажчик? ДЕН: Так. АУДИТОРІЯ: Що робить [нерозбірливо]? ДЕН: Якщо, скажімо, Танос викликається, коли вам не вистачає пам'яті, щоб отримати незалежно від розміру ви просите, Танос повернеться NULL. Це, в основному, всякий раз, коли функція повинна повертати покажчик, ви потрібно перевірити проти NULL, тому що NULL є досить good-- це, свого роду, значення сміття. Це нульовий наскільки покажчики йти. Всякий раз, коли ви викликаєте функцію, що повертає покажчик. Ви будете хотіти, щоб перевірити, що упевнений, що цей курсор не NULL тому NULL є дуже поширеним явищем. Це свого роду повернення сміття. Так що якщо щось не йдуть прямо, просто повернути NULL замість. АУДИТОРІЯ: [нерозбірливо]? ДЕН: Так, і що це таке. АУДИТОРІЯ: [нерозбірливо]? ДЕН: Заклинання, так як це. Це NULL термінатор. Це рядкова N-U-L-L, якщо ви правопис його. АУДИТОРІЯ: І я просто пішов тому і перевірив його. І якщо ви спробуєте поставити з плаваючою крапкою Значення в перемикач, він буде кричати на вас кажучи, твердження вимагає вираз цілого типу. DAN: Там ви йдете. Але так, який було питання? АУДИТОРІЯ: [нерозбірливо]? ДЕН: Так столиця N, капітал U, капітал L, капіталу L є актуальною з річчю. Це покажчик NULL і буде розглядатися тільки в якості таких. Ви ніколи не спробувати і заклинання NULL характер і подивитися будь іншого шляху, крім цього. Да? АУДИТОРІЯ: Так повернення на персонаж макс або то в примітках, чи так втілюють ту ж саму функцію як [нерозбірливо]? АУДИТОРІЯ: Так ви маєте на увазі повернення сЬаг макс від GetChar, або те, що це? АУДИТОРІЯ: Так. АУДИТОРІЯ: Так, так що загальне термін для всіх тих речей, дозорні значення. Так як повернення целочисленное макс від GetInt і символ макс від GetChar, це повинен бути, як, все в порядку, якщо ці речі повертаються до нас, Щось пішло не так. Для покажчиків, ми як раз є це дозорного значення, що кожен погоджує. І це те, що вам повернутися коли справи йдуть погано. Так символ макс це те, що ми використовуємо щоб являти собою щось як NULL або GetChar. АУДИТОРІЯ: Так що, якщо ви тестируете GetChar, може ви просто покласти NULL? Б, що змінити ситуацію? ДЕН: Ви не могли б просто перевірити NULL. Ви повинні були б перевірити сЬаг макс тому Значення, що повертається з функції персонаж не є покажчиком. Да? АУДИТОРІЯ: задає це питання для довжини рядка. Які включають в себе нульової символ чи що? DAN: Ні І це насправді, як довжина рядка знає, щоб зупинити, тому що він проходить через Ваш масив символів до він бачить порожній символ. А потім це як, все Добре, я зробив. АУДИТОРІЯ: [нерозбірливо] п'ять? ДЕН: Доброго б п'ять. Так. Так масиви безупинні блоки пам'яті. Вони мають миттєвий доступ, кажучи Ім'я масиву, а потім, в кучерявих дужки, що індекс ви хочете піти щоб, вони індексуються з нуля через довжина масиву мінус 1. І вони оголошені по типу річ, яка ви зберігаєте в Масив, ім'я масиву, а потім що розмір цього масиву. Так що це символ масив довжини шість, що має ці значення. Да? АУДИТОРІЯ: [нерозбірливо]? ДЕН: Так. АУДИТОРІЯ: [нерозбірливо]? ДЕН: Якщо у вас є те, що відбувається в масив вже зробив. Таким чином, ви можете вказати це замість цього як, скажімо, символ, що назва вашої масив, порожні дужки дорівнює кучеряве готуватися H кома E кома L коми L кому O кома NULL характер і фігурна дужка. Це також буде працювати в якості декларації. АУДИТОРІЯ: [нерозбірливо]? ДЕН: Тоді ви повинні мати розмір вже зробив. АУДИТОРІЯ: [нерозбірливо]? ДЕН: Так. Всі правша. Аргументи командного рядка є одним із способів отримання даних від користувача в якості Аргументи головний. Головна приймає два аргументи. Число аргументів, що в даний час пройшли вздовж командного рядка і вектор рядків або масив рядків з усіх аргументів. Так що, якщо я, скажімо, називається така функція, як точка з 1 простору, 2 простору, три, агдс буде 4. І агду 0 буде точка з. Argv1 буде 1. argv2 б 2. argv3 буде 3, в цьому конкретному випадку. Да? АУДИТОРІЯ: [нерозбірливо]? ДЕН: останній елемент в масиві бо масив довжиною агдс плюс один з ARGB, останній елемент є покажчиком NULL. Це агдс плюс 1. Таким чином, у разі, що я тільки що сказав, це буде агду 0 є точка з. агду 1 січня argv2 є 2. агду 3 є 3. агду 4, який є одним більше, ніж агдс буде NULL. І це NULL покажчик. Так. І це тому, що рядок символ зірка покажчик. Таким чином, він повинен бути того ж типу. Да? АУДИТОРІЯ: Два питання. Так один, в чому різниця між Ця та інші GetString ніж одного типу в призначеному для користувача двигуна? І два, це зберігається в Ваше недавнє пам'яті? Так як, GetString б бути [нерозбірливо]? ДЕН: Де це зберігається? Я не знаю, де він зберігається. АУДИТОРІЯ: Так, насправді, ви знаєте, як будь-який функціонувати ви називаєте це аргументи зберігаються в стеці? Так агдс і агду аргументи в основний і вони в стеці, або дійсно трохи вище, що ви думаєте, як початок стека. Те, що було інша частина питання? АУДИТОРІЯ: Так в чому ж [нерозбірливо]? ДЕН: Так, це просто інший спосіб отримання даних від користувача. Ця пісня трохи більш ефективним і це зручніше для сценаріїв, тому що вас може просто передати аргументи ваш головний Функція замість того, щоб чекати, для користувачів, якщо у вас немає ніяких користувачів. АУДИТОРІЯ: І так, отримати рядка буде [нерозбірливо]. Було б зберігати речі вам потрібно. ДЕН: Да? АУДИТОРІЯ: [нерозбірливо]? ДЕН: Так, агду 0 завжди включає точка слеш виклику функції. Да? АУДИТОРІЯ: [нерозбірливо]? ДЕН: Так, кожен з аргументів закінчилася в NULL характеру, тому що вони є рядками. АУДИТОРІЯ: [нерозбірливо]? ДЕН: Так, агду агдс є покажчиком NULL. АУДИТОРІЯ: [нерозбірливо]? ДЕН: О, так. Так, шкода. АУДИТОРІЯ: Так [нерозбірливо]? ДЕН: Таким чином, питання, якщо у вас командного рядка точка слеш точку з 1, 2, б кількість командного рядка Аргументи бути два або було б три? Зали: Я думаю, що це не має великого значення. Я, як правило, говорять, о, ви не пройшли будь-які аргументи командного рядка, коли, Очевидно, ви викликали функцію. Так що я, як правило, усно виключити Функція з командного рядка Аргументи хоча це включені в ARGV. ДЕН: Але якщо це було на test-- yeah-- а також, якщо ви говорите, то як агдс дорівнює 3, ви знаходитесь в безпечній стоячи. Да? АУДИТОРІЯ: [нерозбірливо]? ДЕН: Я думаю, що якщо замість виклику цього в ARGC і струнних агду дужках але зберіг ті ж типи і просто називається їм щось інше, як і б, чи буде це все ще працює? І це було б як і раніше працювати, Ви б просто-- замість використання argc-- Ви б використовувати і б. Да? АУДИТОРІЯ: [нерозбірливо]? ДЕН: Отже питання GetString є збираєтеся зберігати пам'ять в купі тому GetString є символ *. Він зберігає пам'ять в купі, бо називає тепер Танос в фактичний Реалізація GetString. ОК, як рухатися далі. Безпека. Таким чином, щоб бути по-справжньому безпечним, ви не покладатися на немає один, і ви не дозволить жодній доступ до будь-якого Вашої інформації, і саме тому кожен будує свої власні машини, їх власні операційні системи, всі їх програми з нуля, і, очевидно, не підписатися під будь-яким іншим машин через Інтернет. Так комп'ютери небезпечно. Вони насправді. Ми повинні довіряти іншим людям. А ідея безпеки є те, що ви намагаючись обмежити кількість Довіра, яку вам потрібно. І одним із засобів ви, що через криптографії. Криптографія, по суті, у нас є секрети. Іноді ми повинні пройти наші секрети разом через, скажімо, інтернет або інші речі. І ми не хочемо, щоб люди знати ці секрети. Таким чином, ми зашифрувати наші секрети в дорозі що ми сподіваємося, що ніхто не може з'ясувати. Таким чином, ми used-- через ході цієї class-- речі, як шифр Цезаря і [Нерозбірливо], які є дуже, дуже небезпечні способи шифрування речі. Їх легко зрозуміти, що вони і що ваші дані знаходяться. Реальний світ використовує набагато більш складні схеми шифрування. І ми не зможемо отримати в набагато більше, ніж це. Налагодження. GDB є кращим. Я збираюся це підкреслити ще раз. Використовуйте GDB весь час кожен Час у вас є проблеми. Команди, які є корисними в GDB є зламати, які ви передаєте рядок число, ім'я функції, по суті де в коді ви хочете зупинити, і бути в змозі взяти під контроль. Друк займає змінну і друкує все, що змінна в тому, що точка у виконанні. Далі переміщує виконання а також один крок. І крок кроки всередині функції у вашому виконанні. Інші речі працювати, який є, як ви насправді запустити свій код. Продовжити приймає всі заходи, необхідні щоб дістатися до наступної точки зупину. І є багато, багато інших. Шукайте їх. Вони прекрасно. Да? АУДИТОРІЯ: [нерозбірливо]? ДЕН: Так, який є відладчик. Так відладчик це програма, яка дозволяє налагоджувати програму. Це не програма, яка знаходить помилки для Ви, тим не менш, що було б здорово. І останнє, для мене є пошук. Так типів пошуку, що ми говорили про цього класу лінійний пошук, який є тільки, що ви дивитеся через кожен елемент простору пошуку, один елемент, в той час, поки ви не знайдете те, що Ви шукаєте або поки ви не досягнете край вашої простору пошуку, при якому момент ви сказати, що ви не могли знайти елемент, який ви шукали. І це займає в кращому випадку постійне час, який є 0 1, і в гіршому випадку лінійних Час, який дорівнює 0 н. Бінарний пошук, який необхідний брудні елементи. Ви йдете в середині ваших елементів, см, якщо елемент ви шукаєте більше або менше, ніж елемент що ви в середині. Це це більше, ви говорите, що дно з цієї категорії простір це ваш поточне місце розташування, середній, і ви перезапустити процес. Якщо він менше, ви подивіться сказати що the-- да, в чому справа? АУДИТОРІЯ: [нерозбірливо]? ДЕН: Так. Будь-який вид роду, який вчили в клас справедлива гра для тіста. [Сміх] ДЕН: А те, що у вас не було зробити це для набору проблем, це справедливо Гра для випробування. АУДИТОРІЯ: Чи можемо ми піти по ньому, як to-- ДЕН: Це вже не буде більше. СПІКЕР 2: Фактичний код для [Нерозбірливо] на study.cs50.net. Так що, якщо ви подивіться на проблеми практики на сторінці сортування злиттям з study.cs50.net, є код для реалізації сортування злиттям. Таким чином, ви не повинні здійснювати це себе сьогодні ввечері. Але переконайтеся, що ви розумієте його, а ніж просто запам'ятовуючи його. АУДИТОРІЯ: [нерозбірливо]? СПІКЕР 2: На сторінці сортування злиттям на study.cs50.net, існує практика Проблема, що, якщо ви клацніть по Проблема, в самому кінці є Рішення, яке є злиття Реалізація роду. Але переконайтеся, що ви розумієте його а не просто запам'ятовувати його або копіюючи її вниз. АУДИТОРІЯ: І абсолютно справедливо Проблема для здачі іспиту буде щось на зразок ось список. Що це список виглядати після один крок Обрані роду або сортування вставками або будь-який інший. Один повний ітерація списку. Так що навіть якщо ви не в кінцевому підсумку потрібно Код для нього, ви повинні зрозуміти, це достатньо, щоб знати, як це відбувається щоб бути зміни цього масиву. DAN: Ось це для мене. [Оплески] LUCAS: Привіт всім. Мене звуть Лукас. Я збираюся говорити про рекурсії, все рослини, які ми витягли, і трохи всіх покажчиків. ОК? Отже, перш за все, рекурсія. Що це означає сказати, що функція є рекурсивної? АУДИТОРІЯ: Дзвінки себе. LUCAS: ОК, називає себе, так. Так любите цю фотографію, наприклад. Це як на картинці всередині картини і так далі. Так, наприклад, ви можете have-- Дана що говорив про бінарного пошуку. Один із способів, в яких двійковий пошук рекурсивна є те, що ви намагаючись знайти ряд. Так ви йдете в середині. І тоді ви переконаєтеся, що цифри там В зліва і справа. І потім, якщо ви дізналися номер буде ліворуч, це те ж саме річ, як раз робити пошук, але тільки зліва від списку. Так ось, як це звучить як це рекурсивна. Так ось чому ви, хлопці, є рекурсивна рішення для сортування злиттям. Отже, ось приклад. Так скажімо, що я хочу, щоб вибрати всі числа від 1 до п. Я розумію, що сума п число п плюс н мінус 1 до 1. Але тоді, якщо я дивлюся на п мінус 1 плюс н мінус 2 плюс 1, це те ж саме поняття, як підсумовують номера до н мінус 1. Тому я можу сказати суму рівній сумі дорівнює п плюс сума п мінус 1. Чи має це сенс? І я також би щось ще називається базовий варіант, який є те, що Сума чисел на нулю дорівнюватиме нулю. Тому, як тільки я доберуся до числа нулю, я перестанемо вважати. Чи має це сенс? Так ось приклад того, як Я можу реалізувати це. Так що у мене цю функцію в деяких. Це займає ціле п. Так ось я спочатку перевіряю, якщо п менше або дорівнює нулю. Таким чином, якщо це менш або дорівнює нулю, я повернути нуль, який є нашим базовим сценарієм. В іншому випадку, я можу просто повернутися н плюс сума чисел від один до н мінус один. Сенс? ОК. Так ось, як це виглядає. У вас є суму 2 рівних 2 плюс сума 1. І деякі з 1 1 плюс Сума 0, який є 0. Сенс? Так що, якщо ми подивимося на стопку ваш Програма, це те, що він виглядає. По-перше, у нас є основною функцією. І тоді основна функція називається сума 2. І тоді сума 2 збирається сказати, о, сума 2 дорівнює 2 плюс сума одного. Так що я додати суму 1 в стек. І сума 1 збирається назвати суму 0, який також буде додано в стек. І тоді кожен з цих ті, які на другий доведеться повернутися до того, як інші можуть продовжувати йти. Так, наприклад, тут, сума 0, Спочатку збирається повертати 0. А потім вибрати суму 1. Тоді сума 1 збирається повернутися 1 сумі 2. І, нарешті, сума 2 буде повернутися 3 до основної. Чи має це сенс? Це дійсно важливо, щоб зрозуміти, як стек працює і спробувати побачити, якщо це має сенс. Отже, сортування. Так чому ж сортування важливо, в першу чергу? Чому ми повинні дбати? Будь? Наведіть мені приклад? Да? АУДИТОРІЯ: [нерозбірливо]. LUCAS: Так, добре. Таким чином, ви можете шукати більш ефективно. Це хороший спосіб. Так, наприклад, у нас є багато речі, насправді, в нашому житті, що сортуються. Наприклад, словники. Це дуже важливо, щоб все слова в якийсь порядок, що ми можете отримати доступ легко. Так ось, що він говорив. Ви можете шукати більш ефективно. Подумайте про те, як важко було б мати словник, в якому слова знаходяться в випадковому порядку. Ви повинні дивитися на, в значній мірі, кожне слово, поки не знайдете слово, яке ви шукаєте. Якщо ви використовуєте Facebook також, коли Ви дивіться на ваших друзів, ви побачите, що Facebook покласти ваші ближче один знаходиться на вершині тих що ви не говорите с, що набагато. Якщо ви пройти весь шлях до дна список друзів, ви будете бачити люди, що ви, мабуть, навіть не пам'ятайте, що ви друзі с. І це тому, що Facebook сортів ваші друзі, засновані на тому, як закрити ви до них. Так організації даних. Також Pokemon. Отже, ви бачите, що все Покемонів мають номери. І це, як легко спосіб доступу до даних. АУДИТОРІЯ: Доступ Pokemon. LUCAS: Так. АУДИТОРІЯ: [нерозбірливо]. LUCAS: Так. Отже, вибір роду. Сортувати Вибір збирається вибрати маленький несортоване значення списку кожен час у кожній ітерації. Це ніби як те, що ви робите у вашій голові, коли ви намагаєтеся впорядкувати список під рукою. В принципі, все, що вам зробити, це подивитися для найменшого числа. Ви ставите його в відсортованому списку. І тоді ви подивіться на Наступний найменше число. І тоді ви продовжуєте робити , Що і так далі. Так вибір роду в основному ви виберіть щоразу найменший несортоване значення. Покладіть в кінці упорядковано частину списку. І продовжувати робити це. Так що давайте швидко побачити, що як це виглядає. Так ось упорядковано і несортоване список. Таким чином, для упорядковано зі списку, це спочатку порожній. А потім я збираюся вибрати найменше число тут, який є 2. Так що я отримати номер 2, і я поставив на початку списку. А потім я дивлюся на наступний маленький елемент, який є 3. Так що я поклав його в кінці з відсортованого списку. І тоді я продовжувати робити це. Я вважаю, 4 і поклав його в кінці. Знайти 5 і поклав його в кінці. І подивимося, як все ті часи, що Я говорю покласти його в кінець, в основному, обмін двох значень. ОК? І тоді останнє, ви просто є ще один елемент. Так що це вже відсортовані. Отже, сортування вставками. Внесені роду ви будете мати також що річ у тому, сортуються і несортоване список. Єдине, що кожен раз, що Ви додаєте елемент в упорядковано Список, ви просто вибрати елемент, який знаходиться в передній частині несортоване список. А потім ви збираєтеся знайти, що Положення це повинно бути у відсортований частину списку. Давайте подивимося, що це так це має більше сенсу. Тобто спочатку, наприклад, я намагаюся вставити номер три в відсортований частину списку. Так що список не має нічого. Тому я можу тільки поставити номер 3. Тепер я хочу, щоб додати номер 5 в відсортований частину списку. Так я дивлюся на числа 5. Я помічаю, що це більше, ніж 3. Так що я знаю, що це має бути після 3. Так що я поклав 3 і 5. Тоді я хочу вставити номер 2. Я помічаю, що число 2 насправді останній потім як 3 і 5. Так що я насправді повинні поставити все це чином на початку списку. Так що я повинен, начебто, перекласти всі елементи в відсортованому списку, тому я можу звільнити місце для числа 2. Потім я бачу номер 6. Я бачу, що це має бути після 5. Так що я поклав його там. І, нарешті, я дивлюся на числа 4. І я помічаю, він повинен бути між 3 і 5. І тоді я поклав його туди і зрушення всі інші елементи. Сенс? Bubble Сортувати. Так бульбашкового сортування в основному те, що ви збирається do-- ми називаємо це міхур Сортувати тому що ви йдете через list-- це насправді краще, якщо я просто показати Хочете ето-- і ви збираєтеся порівнювати сусідні числа. І ви збираєтеся обміняти їх позиції, якщо вони не в правильному порядку. Так в основному, що збирається відбудеться тут, наприклад, у вас є 8 і 6. Ви знаєте, що порядок сортування буде насправді бути 6 і 5, чи не так? Так що ви збираєтеся поміняти накази. Потім я бачу 8 і 4 тут. І я роблю те ж саме. Я поміняти знову. І, нарешті, 2 і 8. Я також поміняти їх місцями. Вона називається Bubble Сортувати бо після кожен з цих ітерацій, насправді, Найбільша кількість у списку отримує все шлях до кінця списку. Чи має це сенс? Тому що він тримає заміни його і переміщення його вправо. Отже, це друга ітерація. Було б те ж саме. Я зроблю один своп і то останній. Я, що немає свопи і список сортується. Таким чином, в Bubble Сортувати, ми в основному тримати переживає списку і перекачки речі, поки я не помітив, що я не робив будь-які свопи роблять цю ітерацію, яка означає, що список вже відсортований. Сенс? Давайте трохи поговоримо про час роботи. Так ви, хлопці, пам'ятайте Великий O, Omega, і Тета? Да? Добре, що Великий О, в першу чергу? АУДИТОРІЯ: [нерозбірливо]. LUCAS: Так, це називається гіршому випадку виконання, який просто означає, що це скільки ви очікуєте програму взяти для запуску. Як, з точки зору of-- в цьому case-- п. Число елементів в Список в гіршому випадку. Мовляв, в гіршому випадку. Таким чином, для Bubble Сортувати, наприклад, У нас є великі O н площі. Чому у нас, що? Чому Bubble Сортувати Big O н квадрат? АУДИТОРІЯ: [нерозбірливо]. LUCAS: Так, так в гіршому випадку буде що я повинен буду зробити п ітерацій. Таким чином, кожен з ітерацій збирається привести до найбільшого елемент в кінець зі списку. Так в гіршому випадку є те, що у мене є зробити цю річ п раз. І для кожного з тих часів, я повинен зробити п свопи тому що я повинен порівняти кожен з двох елементів. Так ось чому він н квадрат бо це п раз п. Тоді, вибір роду також н площі тому, що для кожної ітерації, я повинен дивитися на кожного елемента у списку. А потім знайти найменший, Це означає, що я повинен переглядати п елементів. І що я повинен зробити, що п раз, тому що Я повинен вибрати все п елементів. Сортування вставками також н площі бо в гіршому випадку буде бути, один, я повинен вставити п чисел, чи не так? Так що я вже знаю, що я збираюся мати п ітерацій. Але для кожного з цих чисел, якщо б мені довелося дивитися на всі номери в відсортований список і поклав його всю дорогу в передній, що буде н площі бо це буде п раз п раз. Сенс? Як щодо омега? АУДИТОРІЯ: [нерозбірливо]. LUCAS: Це в кращому випадку. Так що це, як, в багато разів для сортування, в кращому випадку є коли список вже відсортований. Таким чином, ви дійсно не мають нічого робити. Bubble Сортувати має кращий сценарій н. Як ви, хлопці, знаєте, чому? АУДИТОРІЯ: [нерозбірливо]. LUCAS: Так, якщо вам відслідковувати Чи раціон даних було ніяких свопів або ні, якщо у вас є щось на зразок встановлений в правда, якби була ітерації, якщо Список вже відсортовані, в основному, що трапиться, я буду спробуйте поміняти кожен два сусідніх елементів. Я збираюся бачити, що немає свопи. І я просто повернути відразу. Так це значить, що я просто повинен був пройти через список один раз. Так що це н тому я дивлюся в п елементів. Чому вибір роду п квадрат? Так, навіть якщо список відсортований, для Кожна ітерація вибору роду, я повинні вибрати мінімальний елемент. Отже, що означає, що у мене є, щоб шукати на всіх елементів в несортоване перерахувати і знайти мінімум для кожної ітерації. Чи має це сенс? І вставки меч п, тому що в справа, що я намагаюся вставити номера і всі номери, коли я спробуйте вставити їх, я бачу, що вони знаходяться в правильному положенні. Я не повинен піти перевірити всі інші Цифри в несортоване список. Так ось чому він буде н. Сенс? І що тета? АУДИТОРІЯ: [нерозбірливо]. LUCAS: Що, вибачте? Скажіть це ще раз. АУДИТОРІЯ: [нерозбірливо]. LUCAS: Точно. Таким чином, ви можете бачити, що тільки вибір зберігається в Merge роду мають thetas. І це тому, що у вас є тільки тета якщо обидва Big O і Омега однакові. ОК. І, нарешті, сортування злиттям є в лог п. А потім, як казав Ден, сортування злиттям ніби як таким же чином, що ви бінарний пошук. Таким чином, ви отримаєте список. І ви збираєтеся розрізати навпіл. І тоді ви скоротити їх в невеликих половинок. І тоді ви об'єднаєте їх. Ви, хлопці, пам'ятайте, що, чи не так? ОК, як він говорив. ОК, покажчики. Так що це покажчик? АУДИТОРІЯ: [нерозбірливо]. LUCAS: адреса. ОК. Я знаю, що Девід показує купу відео Бінки і речі, що вказують один до одного. Але мені подобається думати, покажчиків лише як адреса. Так що це змінна, яка буде зберігати адреси. Так що це просто це спеціальна змінна тобто задовго чотири байти. Пам'ятайте, що покажчик до чого це завжди чотири байти довгі для нашої 32-біт Машина так і у випадку з прилад. І це якраз має місце змінної всередині нього. ОК, так що ця пам'ять, в основному. Таким чином, кожен блок пам'яті насправді має етикетка, яка є адреса slotty пам'яті. Отже, що означає, що в мене може бути покажчик, який вказує на будь-який з цих адрес. Так що причина, чому ми будемо використовувати покажчики є якщо мені доведеться запам'ятовувати розташування що конкретна змінна пам'яті. І ви, хлопці, пам'ятайте, що один з тих, випадки були, якщо у мене є функція якщо у мене є насправді хочу, щоб ви своп для дійсних чисел, я насправді повинні послати покажчик. Чи не змінна. Ви, хлопці, чи пам'ятаєте ви, що? Різниця between-- як називається? Виклик за значенням і виклику за посиланням, чи не так? ОК, да. Так що телефонуйте за значенням. Коли ви просто відправити змінну функціонувати ви просто відправивши значення. Таким чином, ви насправді відправки копія змінної. І ваша програма не могла піклуватися менше о, якщо та ж змінна фактично робить копію. І, закликаючи посилання означає, що Я насправді направлення копії покажчик на цю змінну. Так це значить, що я посилаю Розташування цієї змінної. Так відчуваю я маю розташування змінна, коли я дзвоню функція з покажчиками, я в змозі насправді змінити дані, які були в основний. Сенс? Хоча, покажчик є копією, покажчик все ще має реальну адресу змінна, що я хочу змінити. Сенс? Так створення покажчиків. Пам'ятайте, покажчик завжди є тип, який він, вказуючи щоб потім зірочку. І тоді ви поставити ім'я. Так що пам'ятайте, що всякий раз, коли у вас є всі зірки, це як покажчик на що все, що змінна введіть що ви мали. Таким чином, тут, в зірку, наприклад, це покажчик і ціле число. І тоді символ зірка покажчик символ зірки і так далі. Да? АУДИТОРІЯ: Що робити, якщо у нас є покажчик на п зніматися х. Я знаю, що створює покажчик на х. Чи означає це також оголосити х ціле? LUCAS: ОК, так що, коли ви говорите, н-зірковий х, ви не створюєте покажчик змінна х. Ви створюєте покажчик з ім'ям х. АУДИТОРІЯ: [нерозбірливо]. LUCAS: Тому коли я кажу н зоряний х, я кажучи, гей, в пам'яті, я збираюся отримати один з цих трьох коробок. І я хочу сказати, що, що буде х, який є буде покажчик. І щось цікаве про покажчики є те, що ми говоримо, що у них є 4 байта для 32-бітної машині. І причина, що пояснюється тим, що 4 байта 32-біт. І машини, які 64 біт насправді є покажчики адреси , Що в 64 бита. Так це просто означає, що розмір адреси в машині відрізняється. Так Зіставлення і разименованія. Є два оператора, що ви, хлопці, повинні пам'ятати. Перший амперсанд. Другою зіркою. Не лякайтеся цієї зірки і це зірки, бо пам'ятаєте, що, в цей випадок, у вас є п зірку. Це як все це разом. Там немає н Space Star. Так це значить, що це тип. Пам'ятайте, що, коли у вас є змінна зірка, ти говорити про тип. Коли у вас є тільки зірку, а потім Ім'я змінної, це означає, що ви разименованія покажчика, який означає, що ви дивитеся на покажчик, знайти адресу, це вказуючи на, збирається на цю адресу, і, дивлячись на всякий раз, коли у вас там. Тому я кажу своїм студентам, що, коли у вас є зірки, ви повинні думати, що це абревіатура змісту. Так що якщо у вас є вказівник, і ви зробити зірку покажчик, це зміст покажчика. Так ви йдете в те, що він, вказуючи на і подивитися на постійному утриманні. І амперсанд те ж саме речі, як адресу. Так що, якщо у мене є змінна A-- як, давайте сказати, що я зробив Int дорівнює 3-- якщо я хочу, щоб знайти адресу, що змінна пам'яті, я можу просто зробити амперсанд. Так що це адреса. Сенс? Так ось приклад. Це відсутній целочисленное б і целочисленное гр. Так Int дорівнює 3 означає, що Я збираюся піти в пам'яті. І я збираюся знайти слот і справа тут число 3. А потім Int б дорівнює 4. Я збираюся зробити те ж саме. До пам'яті і поставити ряд 4 в одному з ящиків. І Int дорівнює 5. Знайти іншу коробку і поставити ряд 5. Так що ж це лінія робиш? н зірка річних дорівнює амперсанд а. Таким чином, в першу чергу, н зіркою на рік. Що він робить? АУДИТОРІЯ: [нерозбірливо]. LUCAS: Так, так н зірка річних, перший, оголошує покажчик під назвою річних. А потім він присвоєння значення вказівника адресу. Так амперсанд. Тоді, якщо я зірка Pb, що це зірка рь? Ой, вибачте. Це також відсутня. н зірка рь. Я маю на увазі зірки шт. Мені дуже шкода. Це те ж саме. Але зараз я добре ар створення покажчик б, а потім покажчик на с. Да? АУДИТОРІЯ: [нерозбірливо]? LUCAS: Так. Так що, якщо ви йдете в пам'яті і ви йдете в вікно, це позначення для річних, ви насправді збирається побачити адресу. ОК? Да? АУДИТОРІЯ: [нерозбірливо]? LUCAS: Так, покажчик є адресою. Ніколи не забувайте, що. Це як найважливіший частина про покажчики. Там в зберіганні та адреса деякої змінної. Що ще? Ще питання? ОК. Так Покажчики та масиви. Пам'ятайте, що, коли я роблю десяткового масив 3, в основному, те, що я роблю, я, начебто з, оголосивши в покажчик. Так масив ніби як покажчик на особливе місце в пам'яті, в якій я виділено три слоти для цілих чисел. Чи має це сенс? Тому, коли я роблю целочисленное масив 3, то, що я робить, в основному, є створення трьох слоти в пам'яті. Так що я просто знайти три слота в пам'яті. Так що, якщо я роблю, то, зіркою масиву, його в основному означає зміст масиву, що означає стерти покажчик, я йду до того місця, що це, вказуючи на, і я поставив номер один. А потім, якщо я зірка масив плюс 1, що те ж саме, як робити масив кронштейни один, який просто означає, я йду в місце, яке він, вказуючи на. І тоді плюс 1 марки мені перейти на одну позицію. Так я йду на цю посаду, фактично, і поставити номер два. І ось, нарешті, коли я роблю Масив плюс 2, я йду туди, де яке вказує масиву в. А потім я перейду до блоків пам'яті. І тоді я поклав тут число три. Да? АУДИТОРІЯ: Так зірка масив просто кажучи найперший пункт. І ви можете додати 1, тільки тому, що ми тільки дійсно посилаючись, що перший адресу. LUCAS: Так. Чому ми, наприклад, сказати, масив 0, масив 1, і масив 2? Я говорю, навіщо ти 0, 1, 2, 3, а не 1, 2, 3? Однією з причин є, одним, комп'ютер програмісти воліють, щоб почати починаючи з 0. Два, тому що, коли ви робите масив 0, це те ж саме, роблять масив плюс 0, що означає, я йду в що позиція, і я не пропускати будь-які блоки пам'яті. Так що я не переміщати будь-які блоки пам'яті. Да? АУДИТОРІЯ: [нерозбірливо]? LUCAS: Так вона просить, що є робити різницю між це чи робити Танос. Одне з відмінностей полягає в тому цілочисельний масив 3 створенні Масив в стеці. І коли я роблю Танос, його створює в купі. Чи має це сенс? Так як же Танос насправді працює? Так чому ж ми навіть потрібно використовувати Танос? Ваш компілятор роду діячів зі всіх змінні, які ви оголошені. І він створює простір для всіх з них в стеці. Так всі змінні збираються бути де в стеці. Так ось змінні оточення. Так в основному, місця для цих змінних в пам'яті виділяється на час компіляції. Так це значить, що ваш комп'ютер має знати всі ці змінні заздалегідь. Для цього не потрібно знати, що значення ви збираєтеся покласти в них. Але для цього потрібно знати, як обсяг пам'яті вам потрібно. Але тепер давайте уявимо, що, наприклад, ви створюєте масив або приймати Рядок, ви приймаєте від користувача. Ви не знаєте, як довго рядок буде, наприклад. Так ви не знаєте точно, скільки блоки пам'яті ви виділяєте, чи не так? Так що насправді не має сенсу для Ви сказати покласти 100 символів. А що потім, якщо користувач пише 150? Ви збираєтеся бути п'яним. Так в основному, ви не можете бути впевнені в тому, як обсяг пам'яті потрібно виділити при компіляції програми. Ви просто знаєте, що на час роботи. Так ось чому у вас купу. Так купа матиме пам'ять що ви виділення під час Тривалість виконання програми. Так в основному, коли ви робите Танос, що Ви робите виділяє пам'ять в виконання, що означає, що ви вирішивши право в той момент, що вам повинні мати цю пам'ять. Так ось, коли ви виділяючи його. Чи має це сенс? Так що пам'ятайте, стек має змінні що створюються на час компіляції. А потім купа має змінні що створюються, як ви йдете з Танос, наприклад. АУДИТОРІЯ: [нерозбірливо]? LUCAS: Так GetString є називатиму Танос. Дозвольте мені говорити про Танос, і Я поясню GetString. Так Танос те ж саме як розподіл пам'яті. Так він збирається виділити пам'яті в купі. І він збирається повертати покажчик на де, що пам'ять була виділена в. Отже, коли ви do-- тут example-- н зірка покажчик. А потім покажчик дорівнює Танос розмір дюймових раз 10. Я створюю покажчик. І тоді я ставлю це покажчик значення покажчика, що Malloc дає мені. Ось я і питаю Танос ви можете виділити простір для 10 цілих чисел. Ось що він говорив. І Танос дає мені покажчик до того місця. Сенс? ОК. Я І GetString є, в основному, роблять телефонуйте в Танос так що ви можете виділити пам'яті під час виконання. Завжди пам'ятайте, щоб перевірити на нуль тому Танос збирається повернутися нуль якщо він не може виділити пам'ять. Давайте припустимо, що ви просите смішно обсяг пам'яті. Комп'ютер не буде можливість виділяти так багато. Так Танос тільки збирається повернутися нуль. Так завжди пам'ятати, щоб перевірити, якщо покажчик, який ви отримали від Танос є NULL чи ні, тому що, якщо це, можна бути разименованія покажчика і викликаючи побічних помилки. І, нарешті, не забудьте Ваш вільної пам'яті. Malloc створює пам'ять в купі. І ви повинні звільнити пам'ять перш ніж програма закінчується. Добре, це все для мене. На жаль, Роб. Завдяки. [Оплески] LUCAS: Будь останні питання перед Роб приходить? Ні? Да? АУДИТОРІЯ: я не бачив це один онлайн. Ви завантажили його ще? LUCAS: Я думаю, що Дейв завантаження його найближчим часом. DAVE: Це буде розміщена. LUCAS: Це буде онлайн. АУДИТОРІЯ: Це залежить. LUCAS: Це залежить? ОК. Да? АУДИТОРІЯ: [нерозбірливо]? LUCAS: Так, ви повинні звільнити всіх пам'ять, яка поміщається в купі. АУДИТОРІЯ: [нерозбірливо]? LUCAS: Так. Всякий раз, коли у вас є культури Танос, Ви повинні мати культуру безкоштовно після припинення використання цієї змінної. Так Танос і вільні завжди разом. Їх кращі друзі. Так. Роб? ROB: Я піду швидко. А також відео буде миритися. У мене є мікрофон на. Отже, тиждень п'ять матеріал. Перше, що ми повинні це стек. Так що пам'ятайте, що є тільки один стек кадрів в разі активного виклику функції. Ми побачимо, що в секунду. А також пам'ятати, що насправді відбувається в кожному кадрі стека збираються бути локальні змінні наших функцій, аргументи, які передаються в наш функції, поряд з парою інші речі, які ви дійсно не потрібно турбуватися о. Так ось приклад програми, де, сповіщення, основною є printfing повернення Значення Foo 4. Foo тільки збирається повернутися Значення бар 4 коми 6. І бар збирається встановити деякі місцеві змінна п дорівнює 4 рази 6. А потім повернутися н. Отже, давайте поглянемо на стек на протязі фактичний ітерації цієї програми. Таким чином, є підстава нашого стека. Пам'ятайте, що стек росте вгору. Так в нижній частині нашого стека, ми є фрейм стека для основного. При запуску програми, головним завжди буде в Дно нашої стека. І те, що всередині нашого стек викликів для основної? Таким чином, навіть при тому, що не існує ніякого місцевого змінні в основному, як я вже говорив, ми агдс і RGV займаючи місце всередині основного кадру стека. Так головний тепер збирається викликати функцію Foo. А це значить, Foo збирається отримати свій власний кадр стека. Так що тепер ми всередині функція Foo. І те, що потрібно йти в фрейм стека класу Foo? Ну, Foo має аргументів н. І н дорівнює 4 с, що те, що Основний проходить як аргумент Foo в. Так що тепер Foo збирається назвати бар. Що бар доведеться всередині його 'кадру стека? Він має х, рівне 4 Y, рівним шести. Це ще не все, що ми збираємося мати в кадрі стека, тому що бар також має локальну змінну п. І н ми збираємося встановити рівним 24. Так що тепер бар збирається повернутися н. Так бар повертається 24 до кадр стека щось. І тому, що бар тепер повертається, що означає, що ми вискакують кадр стека для панелі з стека. Так вся пам'ять, що бар був використовуючи тепер з стека. Тепер, Foo також збирається повернутися 24 на головну. Так що тепер Foo повертається, пам'ять що Foo використовував у своїй ' кадр стека також пішов. А тепер, головний збирається подзвонити Printf. Так Е є тільки одна функція. Коли ми називаємо Е, це буде другий фрейм стека для Printf виклик функції. Що ми передаємо Printf? Це те, що збирається піти на його кадру стека. Принаймні, ми передаємо що відсотків я зворотну косу риску н і аргумент 24. Це може мати більше в це кадр стека якщо Е, трапляється, використовуючи деякі локальні змінні. Ми не знаємо. Але все, що йде в Е-их стек викликів. Це збирається виконати Printf. Тоді Е зроблено. Він повернеться. Нарешті, головний робиться. Головна повернеться. І тоді наша програма. Да? АУДИТОРІЯ: Ви бачите [нерозбірливо] Аргументи [нерозбірливо] параметри? ROB: Так що є тонка різниця між аргументами і параметрами. І дійсно, в загальній кажуть, люди, як правило, просто змішувати їх весь час. Але параметри формальне назвати речі. Так агдс і агду є Параметри На головну. Аргументи, що ви насправді пройти в якості цих параметрів. Так що, коли я дзвоню Foo з 4, 4 це аргумент я передаю в. І параметр N, всередині Foo, приймає значення 4 з 4 був аргумент. АУДИТОРІЯ: [нерозбірливо]? ROB: н є локальною змінною в бар. н раніше місцевого до Foo, але це параметр, щоб Foo. Це не локальна змінна. Да? АУДИТОРІЯ: [нерозбірливо]? ROB: Foo просто викликає бар і повернення безвідносно штрих віддачу. АУДИТОРІЯ: [нерозбірливо]? ROB: Так, просто щоб подивитися, багаторазового стек кадрів. Да? Зал: А чому був Foo називається до Printf? ROB: Чому Foo викликається перед Printf? Так що я міг мати, а не, то зробили як Int х дорівнює Foo з 4 а потім друкується х. Але замість цього, я суміщав функції подзвонити в аргумент Е. Але зверніть увагу, що ми не можемо насправді виконати виклик не PRINTF поки ми з'ясувати, що Foo 4 є. Так що ми збираємося оцінити цей. І тільки один раз, що робиться збираються повернутися і оцінити це. Да? АУДИТОРІЯ: Оскільки і бар [нерозбірливо] Значення, чому б нам не мати [нерозбірливо]? ROB: Вони повністю повинні бути внутр. Це не був спійманий за кілька проходів. Так і повинно бути Int бар і Int Foo, так як обидва з них повертаються цілі. Пустота, тільки якщо вони не збираються повернутися фактичні значення. Да? АУДИТОРІЯ: Якщо ви мали рядок вище повернення [нерозбірливо]? ROB: лінія над натомість? АУДИТОРІЯ: Так. Як якщо б ви зробили Е і [нерозбірливо], буде роздрукувати два рази? ROB: Так всередині Foo? Якби ми мали Printf прямо тут? АУДИТОРІЯ: Так. ROB: Так що, якщо у нас був PRINTF право тут, будуть друкуватися один раз. Так ми називаємо Foo раз прямо тут, тоді ми будемо вдарив Printf. Тоді ми будемо називати бар. А потім Foo повернеться. І ось саме. Ми тільки коли стикаються з Е один раз. Да? АУДИТОРІЯ: [нерозбірливо] Е виклику Foo, бо ми перші називаючи Printf а потім ми передаємо аргументи. ROB: Так в теорії, чи не Е виклику Foo? Так ні. Просто порядок, що з буде виконати ці речі є, перш ніж ми зможемо викликати функцію, всі аргументи до функції повинні бути повністю оцінені. Так як це повністю оцінені? Так, це просто рядок. Це просто значення. Тоді ми повинні повністю оцінити це. Як тільки це буде зроблено, тепер все її аргументи оцінюються. І тепер ми можемо зробити телефонуйте в Е. Да? АУДИТОРІЯ: Одне питання. Якщо у вас є функція пустот, повинні у вас є зворотний коми? ROB: Ви не повернення коми якщо у вас є функція пустот. ОК. Так що тепер деякі купа матеріал. Так купи, як ми збираємося мати справу з управління динамічною пам'яттю. І це безпосередньо контрастує з стек, який ми б назвали автоматичний управління пам'яттю. Так в стеці, ви ніколи не повинні справу з тим, як локальних змінних штовхають і виштовхується все ці кадри стека і все таке. Ви не повинні турбуватися про це. Це автоматичний. Так купа вручну. І [нерозбірливо] надходить з цих функцій Танос безкоштовно. Так от ще програма. Все, що ми робимо, mallocing цілим числом. Ми зберігати його в зоряному х. Звичайно, ми повинні перевірити щоб побачити, якщо х є недійсним. Тоді ми йдемо просто встановити, що х вказує на 50. Друкуйте те, що х вказує на, друк х, а потім безкоштовно х. Так як це насправді буде виглядати якщо ми подивимося на нашу стека і купи? Таким чином, ми почнемо знову. У нижній частині нашої стек, як і раніше. Пам'ятайте, що тебе купа безпосередньо виступає проти стек? Таким чином, ми будемо мати верх нашого купи там. Так в нижній частині нашого стека, у нас є наш кадр стека для основного. Це має місце для ARGC, ARGV, і ми тепер мають локальну змінну х, які є Int зірка. Отже, ми збираємося для перебору за допомогою цієї програми. Перше, що ми маємо, заклик до Танос. Таким чином, ми робимо виклик Танос. Malloc є функцією. Це збирається отримати кадр стека. Що ми переході до Malloc? Це збирається йти всередину з кадру стека. Ми проходження розмір п, що на 4. Так що передається Танос. Що Танос робити? Вона захоплює нас деякий простір в купі. Отже, ми збираємося піти в купі. І ми збираємося захопити 4 байта з купи. Так що давайте просто дати, що довільну адресу. 0x123 Просто робити вигляд, що це адреса, який знаходиться на купі. Так що ж таке насправді всередині, що область пам'яті в адресному Ox123? Сміття. Таким чином, ми ще не записали нічого в ній. Таким чином, наскільки ми знаємо, його може бути що завгодно. Ви не повинні вважати, що це нульовий. Це, швидше за все, не дорівнює нулю. Так що тепер Malloc повертається. І що ж нам робити, коли Malloc повертається? Покладемо, що він повертає. Покладемо х, рівні, що вона повертається. Так що ж це повернення? Це повернення 0x123 так як це адреса блоку пам'яті, який нього просто виділяється в купі. Так повернутися 0x123 х тепер збирається бути встановлений дорівнює 0x123, які, образно, ми часто малювати як х, мають фактичне стрілка, що вказує на цей блок. Але х просто зберігати цю адресу. Так що тепер ми повинні перевірити, якщо х є недійсним. Це не нуль. Ми робимо вигляд, що що Танос вдалося. Так що тепер зірка х дорівнює 50. Так зірка пам'ятає це означає піти на цю адресу. Так 0x123 Ми збираємося піти на цю адресу. Так що підводить нас там. Що ми робимо за цією адресою? Ми зберігання 50. Таким чином, після цієї лінії, тобто те, що речі будуть виглядати. Так що тепер це вже не сміття там. Тепер ми знаємо, що 50 полягає в тому, Зокрема адресу, тому що ми встановлюємо його в тому, що. ОК? Так що тепер ми збираємося друкувати ф. Отже, спочатку ми збираємося друкувати зірки х. Так що ж таке зірка х? Знову ж, зірка х означає піти річ, яка х вказує на. Так х зберігання 0x123 Перейти до цього. Ми отримуємо 50. Так роздрукувати е, що. А це значить, що це збирається друкувати 50. А потім, що повертає. І тоді у нас є друга Printf. Тепер ми відсотків р. Якщо ви ще не бачили його, що це просто, як ви надрукувати покажчик. Тому у нас є процентне I, відсотків е, і всі ті, які вже. Так відсотків р, друкувати покажчик. Так х є покажчиком. Так що, якщо ми збираємося друкувати х собі, Ми друкуємо те, що насправді всередині х, що 0x123 Таким чином, перший друк е збирається друкувати 50. Друга печатка е збирається друкувати 0x123 Да? АУДИТОРІЯ: Ви користуєтеся відсотків х надрукувати покажчик? ROB: Так що ви використовуєте відсотків х надрукувати покажчик? Таким чином, ви можете, але відсотків х просто, взагалі, для, як якщо у вас є деякі ціле, і ви хочете надрукувати це як шістнадцяткове. От тільки, як ти це робиш. Беручи до уваги, відсотків г буде роздрукувати у вигляді десяткових чисел. Це були ми отримати відсотків м я просто ціле. відсотків р спеціально для покажчиків. Так х є покажчиком. Ми хочемо використовувати процентну р. Але відсотків х міг працювати. Да? АУДИТОРІЯ: [нерозбірливо]? ROB: Так. По крайней мере, для цього call-- тому я не включати його в тут. Але ці два аргументи обов'язково всередині цього кадру стека поряд з будь-якими локальних змінних Е, трапляється, використовуючи. І тоді, при наступному виклику PRINTF зараз всередині Printf кадр стека є відсотків р зворотний слеш н і незалежно від значення х, яке є 0x123. Да? АУДИТОРІЯ: [нерозбірливо]? ROB: Це буде друкувати то який виглядає наступним чином. АУДИТОРІЯ: [нерозбірливо]. ROB: Так він друкує його в адресному формі. Це схоже на адресу. Да? АУДИТОРІЯ: [нерозбірливо]? ROB: Чому що? АУДИТОРІЯ: [нерозбірливо]? ROB: Чому це покажчик 4 байта? Таким чином, є ціла купа з 0-их перед цим. Так що це дійсно 0x0000000123. На 64-бітної системі, не було б ціла купа більш нулів. Да? АУДИТОРІЯ: [нерозбірливо]. ROB: Отже, перший Е збирається print-- АУДИТОРІЯ: [нерозбірливо]. ROB: Так, це буде роздрукувати що х вказує на. Зірка каже, що це річ вказуючи. Захопіть його. Так що ж це, вказуючи на? 50. Захопіть його. Це те, що ми збираємося друкувати. Беручи до уваги, наступний, ми просто друк х собі. Що знаходиться всередині F? 0x123. ОК. І ось, нарешті, у нас є вільна. Що ми передаємо звільнити? Ми проходження х. У той час я фактично відображається це в кадрі стека. Так ми передаємо значення 0x123 звільнити. Так що тепер безкоштовно знає, все в порядку, Я повинен йти до купи і безкоштовно, що пам'ять. Це вже не використовувати те, що є за адресою 0x123. Так безкоштовно збирається випустити що з купи. Тепер наша купа знову порожній. У нас немає ніяких витоків пам'яті. Тепер безкоштовно повернеться. Зверніть увагу, що до цих пір х 0x123. Але що тепер не дійсні пам'яті. Ми повинні більше разименовиванія х. Да? Зали: повернутися 0 зайвим? ROB: Є RETUREN 0 зайвим? Так. Ми просто покласти, що там, бо у нас є повернення один для повітря. Так що це, як, так, дозволяє включати повернення 0. Да? АУДИТОРІЯ: [нерозбірливо]? ROB: Таким чином, після вільних х, що станеться, якщо ми спробі разименованія покажчика? Цілком можливо, що все йде як треба. Цілком можливо, що ми все одно отримаєте 50. Можливо, також, що ця пам'ять в даний час використовується для іншого. Так що це невизначене поведінку. І не визначено означає нічого може трапитися. Да? АУДИТОРІЯ: [нерозбірливо]? ROB: Ні, так що якщо ви призначаєте х на інше. Так що, якщо тут ми сказали х дорівнює Танос то else-- Танос розмір event-- те, що вихідний блок пам'яті не звільняється. І ми офіційно втратив його. Тобто витік пам'яті. Ми втратили всі посилання в цьому блоці пам'яті. Так що немає ніякого способу, ми можемо або звільнити його. Отже, потім повернутися 0 кошти зробили. Гаразд, так переповнення стека. У чому ідея тут? Так що пам'ятайте, купа йде вниз. Стек зростає. Так що це був приклад з лекції, Я думаю, де основним тільки збирається Викликайте цю функцію Фу, яка збирається називати себе рекурсивно над і знову і знову. Так стек кадрів збираються працювати точно так же. Таким чином, ми збираємося почати з головної в якості нижнього кадру стека. Тоді головний збирається подзвонити Foo, який збирається отримати кадр стека. Тоді Foo збирається подзвонити Foo знову, яка збирається отримати другий фрейм стека. І тоді знову, і знову, і знову, і знову, поки, зрештою, ми не запустити в купу. Так що це, як ми отримуємо переповнення стека. І в цей момент, ви SEG несправність. Або ви дійсно SEG провини перед ця точка, але так. АУДИТОРІЯ: дампа пам'яті чи ж, як SEG вини? ROB: Таким чином, ви побачите сегментацію Ядро вина скидали. Ви отримуєте дамп коли Ви SEG несправність. І це як звалище все вміст вашої поточної пам'яті так що ви можете спробувати і визначити чому ви SEG порушеними. Да? АУДИТОРІЯ: [нерозбірливо]? ROB: Так засіб помилки сегментації є переповнення стека. Так що не обов'язково. Сегментація вина означає, що ви дотики пам'яті таким чином, Ви не повинні бути. Так один із способів такого випадку, коли Ви переповнення стека, ми починаємо зворушливо пам'яті таким чином, що ми не повинні бути. Да? АУДИТОРІЯ: [нерозбірливо]? ROB: Так всередині нескінченного циклу. Мовляв, це як рекурсивної нескінченного петлі і таким чином ми отримуємо ще один фрейм стека кожного разу. Але тільки всередині регулярним нескінченна, а одно-- добре, давайте навіть не друкувати F-- щось робити. Незалежно. Ми не збираємося отримувати другий фрейм стека. Ми просто будемо продовжувати зациклення над цієї однієї інструкції. Стек не росте. Це те, що кожен рекурсивний виклик дає нам фрейм стека. Ось чому ми отримуємо переповнення стека. Да? АУДИТОРІЯ: Так що, якщо ви сказали, щоб отримати в той час як цикл, а потім [нерозбірливо]? ROB: Так що якщо всередині той час циклу був Е, ви все ще буде НЕ SEG вина. Я просто не хочу, щоб заплутати речі. Було б цикл. Ви б отримати єдину стопку кадр для Printf. Тоді Е повернеться. Тоді ви знову б петлю. Ви б отримати єдину стопку кадр для Printf. Це повернеться. Одномісний кадр стека. Так ви не отримуєте це нескінченне нагромадження кадри стека. АУДИТОРІЯ: [нерозбірливо]? ROB: Так. Так що це переповнення стека відбувається тому жоден з них дзвінки на Foo повертаються. Так що, якщо ми повернемося, то ми б починають втрачати кадри стека. І тоді ми б не переповнення стека. І ось чому вам потрібен базовий варіант для ваших особистих функцій. Да? АУДИТОРІЯ: Чи є даний потенційний розмір і стек для купи ж для всі програми? ROB: Грубо. Чи є даний потенційний розмір стека і купа однакові для всіх програм? Грубо. Існує деяка рандомізації до де починається стека і де купа починається. Якщо вам пощастило мати купу глобальні змінні і речі, ви могли б забрати з деякого простору для купи. На 64-бітної системі, ви практично мають нескінченну пам'ять. Там просто так багато. Між 32 біт і 64 біт, що значна різниця. Ви збираєтеся отримати набагато більше стек і купа місця на 64-бітної Система бо просто більше адрес, які вони можуть використовувати. Але на індивідуальної системи, вона буде бути приблизно така ж кількість стека і купа простір. Добре. Так останнє, що є компіляція. Таким чином, ви повинні знати цей процес. Є чотири великі кроки. Таким чином, перший слід легко запам'ятати. Попередня обробка. Він має префікс попередньо в ньому. Так справа доходить до всього іншого. Важливо пам'ятати, хеш. Так хеш визначає та хеш включає у всіх тих. Це все попередньо процесор директиви. Це ті речі, що попередньої обробки піклується о. Отже, що ж попередньо процесор робити? Це дійсно тупий річ. Все це здатне всі з них копіювання, і вирізати і вставляти операції. Так хеш включає стандартний i0 точка годину. Що це робить? Це захоплення стандартний i0 точка годину подати і вставити його у верхній там, де вона говорить хеш включає Стандарт i0 точка ч. І будь-який хеш визначити, що ми бачив, що те, що робиш? Його копіювання значення, що хеш визначено визначається як і вставка, що скрізь, де ви використовуєте значення. Так препроцесор просто робить дійсно Операції, засновані простий текст. Він нічого не робить смарт. Так все інше більш складним. Так що тепер препроцесор зробити, ми насправді компіляції. Отже, що ж компіляції на увазі? Тепер ми збираємося з С-код в коді збірки. Да? АУДИТОРІЯ: [нерозбірливо]? ROB: Так, ми зловили, що. Так компіляції. Ми збираємося від с до збірки. Так що це фактична зміна мови. Компіляція себе означає перехід від на мові високого рівня в нижче рівень мови. І с є мовою високого рівня в порівнянні з зібрання. Що таке збірка? Його інструкції, які, в значній багато, зробив для вашого процесора. Але комп'ютер все ще робить не розумію збірку. Це розуміє лише нулі й одиниці. Так що наступний крок це збірка, яка приводить нас від цих інструкцій, ваш процесор розуміє і фактично переводить їх, щоб одиниці і нулі. Так C до збірки в двійковий. Але у мене немає виконуваний ще. Так що думайте бібліотеки CS50. Ми надали вам довічного для це CS50 бібліотека, яка має GetString і GetInt і все таке. Але CS50 library-- в і з в тому: чи не є виконуваним. Це не має головну функцію. Це просто купа двійковий що ви можете використовувати. Так зв'язування як ми збираємо всі з цих різних бінарних файлів в фактичний виконуваний файл. Той, який ви можете ввести точка слеш точку з. Так що це, як файл, який написав, - все, що ваша програма is-- Цезар точка с. Але тепер він був складений вниз в двійковий. Так Цезар точка о. І це наша CS50 бібліотеки бінарний. І вони поєднуючись в єдиний виконуваний файл. Да? АУДИТОРІЯ: [нерозбірливо]? ROB: Отже, спочатку включають, пам'ятайте, хеш включають фактично попередньої обробки крок. Але це окрема. Якщо ви не використовуєте будь-які функції, які знаходяться за межами вашого одному файлі, то, ні, ви не повинні пов'язати нічого так у вас є все. Тим не менш, Е ув'язується в. Якщо Ви ніколи не використовувати Printf, це те, що , Який повинен бути пов'язаний в тому що ви не пишете, що. І справді, Е автоматично пов'язані в. Ви знаєте, як в командному рядку або коли ви вводите зробити, ви бачите, що є тире л CS50, який має посилання в бібліотеці CS50? Printf, і все в такому дусі, що відбувається , Пов'язані автоматично. Будь-які інші питання по темі? АУДИТОРІЯ: [нерозбірливо]? ROB: Зв'язування? У нас є цілий букет різні бінарні файли. Це канонічний приклад що ми використовуємо це бібліотека CS50. Ми зібрали і дано вам в двійковий для цього CS50 бібліотеки. Ви хочете використовувати GetString у вашій програмі. Так ви йдете і використовувати GetString. Але без мого довічним коді для GetString, при компіляції коду вниз, ви не змогли запустити свій Програма тому GetString Рядок ще не повністю визначені. Це тільки при посиланні на мій двійковий що містить GetString що тепер, все Добре, я можу насправді виконати GetString. Мій файл завершена. І я можу запустити цей. Да? АУДИТОРІЯ: Чи конвертувати лінковку бінарний до виконуваним? Так що навіть якщо у вас немає друга бібліотеки, чи не буде ще буде необхідно перевести [Нерозбірливо]? ROB: Так виконуваний як і раніше в двійковій системі. Це просто об'єднання ціле купа виконуваних файлів. АУДИТОРІЯ: Величезне спасибі. ROB: Немає проблем. Ще питання? В іншому випадку, ми все готово. Добре. Завдяки. [Оплески] Зали: Спасибо. ROB: Так.