Джейсон Хіршхорна: Ласкаво просимо А5, все. У нас є захоплююча тиждень попереду нас, в основному, тому що є так багато нового стикається в цій кімнаті. Це чудово. Багато хто з вас тут випадково, який ще краще. Так що, сподіваюся ви будете тримати приєдналися до нас. На цьому тижні ми збираємося витратити основна частина розділі готується до вікторині. Так за нашому порядку денному, ми збираємося говорити трохи про ресурсах для класу, а й для вікторини, а потім, знову ж таки, витрачати більшу частину класу розмови про питання. Після того, як ми закінчили відповідати на ваші питання, або якщо ваші питання природно, привести нас до деякого кодування, я є проблеми зразки з проміжних виборах минуле, яке ми будемо кодувати живуть в розділі разом, що також виховувати деякі інші хороші теми для покриття. Отже, спочатку, як ми пройшли через для останні пару тижнів, щоб нагадати вам, хлопці, є тонна ресурсів з даного курсу. Багато хто з них буде неймовірно корисним для вас, як ви будете продовжувати вчитися на вікторині 0, тому що це у вівторок вдень. Так що всі з вас були вчиться на деякий час. Є конспекти лекцій і джерело код, який ви повинні обов'язково перевірити. Дивитися шорти. Перевірте study.cs50.net. А потім, перераховані нижче, ряд інших ресурсів. Знову ж, вікторина 0 завтра на 1 годину. Якщо ви ще не зробили цього, перевірте поза Про Вікторина 0 документа про Домашня сторінка Звичайно, щоб з'ясувати, де ви приймаючи вікторини. Вікторина починається в 1:10 і закінчується 70 хвилин по тому. Так що якщо ви тільки після 1:10, ви збирається отримати, що набагато менше хвилин ніж 70 пройти тест. Тому переконайтеся, що ви там на час. Якщо ви розширення студент або є деякі інші міркування тестування, це може бути не в 1:00 завтра. Але, знову ж, перевірити Про Вікторина 0 документ, щоб переконатися, що ви знаєте, коли ви приймаєте вікторину. Я написав 75 ​​хвилин тут. Я думаю, що це право, а не 70. Вона охоплює весь матеріал від тижня 0 лекцію минулого тижня в середу. І знову ж, для цієї вікторині, за що документ, ви отримуєте один двосторонній і 8 1/2 на 11 аркуші паперу, який ви отримуєте використовувати як нотаток під час вікторини. Багато людей, якщо не більшість людей, мають виявили, що єдиний найкорисніший спосіб вчитися для вікторини є зробити дослідження лист, один-тент, своїх власних. Так що дивіться на останні з них, якщо ви бачили в минулому ті. Зверніться до друзів, щоб бачити те, що вони поміщають на них. Але руки вниз, кращий спосіб ви можете дослідження, щоб пройти через все, і звести його до того, що повинні або не належить на цьому аркуші папір, тому що це просто дуже корисний спосіб для вас, щоб переконатися, ви збираєтеся через все і трохи знайомі з ним. Більшість людей, ми знаходимо, хоча вони вже аркуш паперу сидить поруч з ними на вікторині, не включайте до нього, тому що, знову ж таки, що дуже Процес проходження інформації допомогло їм навчитися. Хто-небудь є які-небудь питання про вікторині 0? Має всіх - Я не збираюся робити підняттям рук. Не беріть в голову. Я збирався запитати, хто почав вивчати. Але я не хочу, щоб вас все не підняти руки. Так як я вже сказав - так, Аві, йти вперед. AVI: Що буде корисна річ поставити на одну пейджер? СТУДЕНТ: Це залежить від вас. Джейсон Хіршхорна: Ви отримуєте використовувати своє судження. Корисні речі, щоб покласти на одну пейджер, якщо ви не впевнені про великий O виконання різних видів пошуку і види, вважай це на там в зручно денді діаграми. Таким чином, якщо ви попросили, щоб на вікторина, вам не потрібно, щоб спробувати з'ясувати це поза або причина через виконання. Ви можете просто скопіювати його. Якщо ви подивитеся на вікторина минулому, багато раз, там працює часу питання. Так що було б прикладом гарної річ, щоб поставити на свій однієї пейджер. Інші хороші речі, щоб надіти, якщо ви плутають про те, щоб оголосити Функція або те, що різні частини Оголошення функції є, написати що ні на є, загальна версія а потім, можливо приклад. Якщо ви збентежені про покажчики, схема, як покажчики робота ймовірно, дуже корисно. Якщо ви збентежені про рекурсії, а спробувати рекурсивную функцію там може також виявитися дійсно корисними. Чи означає це, дати вам деякі ідеї? AVI: Ви повинні розуміти, Весь процес компіляції, як , Як це все працює? Джейсон Хіршхорна: Всі , Яка була покрита міг показати на вікторині. Питання - але знову ж, деякі речі будуть зважений мірою, ніж інші. Деякі речі придумали знову і знову в класі, в лекція, і розділ. Інші речі не мають придумати, що часто. Ми багато говорили про # включити і -Л-то і те, що ті, значить, в процес компіляції. Ми багато говорили про GDB, чіплятися, ці різні прапори, які ми використовуємо, коли ми збираємо і те, і те, що make15, наприклад, дійсно означає і дійсно робить. Ми не будемо говорити, як багато про кожен крок у процес компіляції. У нас ще говорили про це. Так що це ще те, що ви повинні бути знайомі з. Але знову ж, ми не збираємося бути - речі, які приходять частіше, в класі , Швидше за все, щоб придумати більш часто і більш сильно зважений на вікторині. Круто. Будь-які інші питання про вікторині 0? ОК, так що я поклав список теми на дошці. Я пройшов через навчальну програму. Я пройшов через розділі огляду від вчора ввечері, і ці слайди придумати з неповного списку питань , Коли ми розглянули досі в CS50 і речі, які могли б з'являються на вікторині. Так що я не збираюся пройти через кожен з них. Це займе набагато більше часу, ніж ми маємо зараз. Але я поставити це тут, ми сподіваємося пробіжку ваша пам'ять, як до речей, які можуть бути чи не бути так добре знайомі з вами. І я хотів би провести більшу частину розділ відповідаючи на ваші питання про Ці теми, теми, які тут не розглядаються. Ми можемо написати псевдокод. Ми можемо написати реальний код переконатися, що ви - Я можу відповісти на ваше запитання і допомогти все принципово зрозуміти Багато з цих питань, так що ви будете почувати себе підготовлені і комфортно буде в вікторина завтра. Так що читайте за списком. Ви, сподіваюся, прийшли до розділу з деякими питаннями, а також. Коли ви будете готові, підніміть руку і ми почнемо. Майте на увазі, питання у вас є, немає дурних питань. Ми чули, що багато. І питання у вас є, я готовий зробити ставку, багатьом іншим людям і сиджу тут і дивитися онлайн є також. Таким чином, ви можете тільки допомогти людям , Задаючи питання. Маркус. Маркус: Між стека і купа, чи є попередньо виділено відсоток пам'яті, який визначається як це для стека або купи? Чи як це працює, точно? Джейсон Хіршхорна: Хороше питання. Я збираюся назад простежити небагато. Лі всіх - будь ласка, будьте чесними. Я знаю, я прошу вас, щоб підняти ваш рукою перед своїми однолітками. Але є люди, які вважають, незручно зі стеком і купою і хотіли б перейти, що і що ті, значить? Підніміть руку, якщо - ОК. Спасибо. Таким чином, ми збираємося піти стопку і купа дійсно швидко, а потім перейти в відповідаючи на ваше запитання. Так що, якщо ми витягнути коробку представляти пам'яті на вашому комп'ютері, що деякі речі, які йдуть в цьому полі? Головна. Основна функція. Де головний йти? СТУДЕНТ: [нерозбірливо]. Джейсон Хіршхорна: Так ми будемо покласти головний тут. Що ще йде в цьому полі? СТУДЕНТ: Функції, які ви називаєте. Джейсон Хіршхорна: Функції що ми називаємо. І куди вони йдуть? СТУДЕНТ: У стеці. Джейсон Хіршхорна: Вони перейти в стек. Так що ми збираємося називати це річ тут стек. І нагорі, у нас є купа. Так пам'ять не коробка так само, як це. Але це насправді дуже схожі. Це збирається бути багато коробок над і більше, залежно від розміру вашого комп'ютер або наскільки велика ваша пам'ять. У котирувань кінець цитати "дна" це стек. І є кілька речей, , Які йдуть в стек. А ті, залежить від функцій у вас є у вашому коді. У вас завжди є одна функція у вашому Код називають основним, так що завжди розділ тут, в стек присвячена основним. Ці розділи в стеку називаються кадри стека. При виклику іншої функції, скажімо основний викликає бінарну функцію пошуку, ми ставимо іншу рамку в стек. Зокрема, ми збираємося пожертвувати частину пам'яті на нашому комп'ютер для зберігання бінарний пошук Часовий змінні і запустити виконуваний файл Пошук коду. Так ми називаємо бінарний пошук. У цьому шматку пам'яті, ми збираємося для зберігання своїх локальних змінних. Ми збираємося зберігати свої Printf дзвінки. Що б не сталося, що функція зберігатимуться прямо там. Довічного пошуку збирається виконувати. Вона збирається завершити виконання. Що таке слово в C, що означає що функція повинна завершити її виконання? СТУДЕНТ: Повернення. Джейсон Хіршхорна: Повернення. Тому, коли ви бачите оператор повернення, кінці функції коли вона потрапляє, що. Так бінарний пошук вдарить його повернення. Ця частина пам'яті буде істотно бути звільнені до. А головне повернеться до виконання. Так головний призупинить де б було, виклик бінарний пошук, отримати значення, що повертається, і продовжити виконання. Цей стек кадру піде. Якщо ми називаємо рекурсивную функцію, яка це функція, яка називає себе більш і більше, ми могли б отримати - сказати, що ми зробив бінарний пошук рекурсивно. Ми могли б отримати бінарний пошук версію один, бінарний пошук двох, бінарний пошук три, бінарний пошук чотири, бінарний пошук п'ять. А потім ця остання бінарний пошук п'ять вийде на базовий варіант, і стек кадри будуть повертатися і продовжувати закриття поки ми не повернемося до основної. Ми можемо піти по рекурсії в небагато. Але все це є, якщо ви виклику декількох функцій одночасно, там буде кілька стека кадрів в стек. Куча, з іншого боку, до тут, не для функцій, задля локальних змінних. Це для динамічно розподіляється змінні. Таким чином, ці змінні, які можуть бути ініціалізації в будь-який основний або функціонувати, що основні виклики. Ніде в коді, вони можна ініціалізувати. І для ініціалізації динамічно розміщена змінна. Яку функцію в C ми використовуємо? СТУДЕНТ: Malloc. Джейсон Хіршхорна: Malloc. Ви називаєте Танос. Ви отримуєте простір пам'яті. І цей простір пам'яті є в купі. І цей простір пам'яті залишається там, поки не дзвонити безкоштовно. Так динамічно виділені змінні в купа буде існувати до тих пір, як ви хочу, щоб вони існують, і вони не будуть не піду, поки ви явно сказати їм, щоб піти. Ви можете створити їх в одній функції. Стек, які функціонують в рамка піде. Але, що змінна буде як і раніше існують в купі, поки не буде звільнений, потенційно тією функцією, яка називається бінарний пошук або будь-який інший. Так що ті купи змінні залишитися там так довго, як ви хочете їм залишатися там. І вони отримують поставити тут. А потім наступний отримує покласти там. Вони тримають наповнюється в, і вони там залишайтеся, поки не дзвонити безкоштовно. І по суті, купа і стек, отримувати на питання Маркуса, зростати назустріч один одному. І якщо вони біжать один в одного, ви, використовується всю пам'ять у вашому комп'ютер, і ваша програма буде кинути тому що ви не маєте більше пам'яті залишили у використанні. У проміжках між ними існує потенційно іншого. Але для рамки даного курсу, ви не потрібно турбуватися про це. Так що була відповідь на ваше запитання. Не турбуйтеся про це. Але це було довгий відповідь. Все, що вам потрібно знати, купа і стек буде - один починається на дні. Стек робить. Купа там нагорі. Вони будуть рости ближче один до одного. І якщо вони стосуються, це проблема. Ви не вистачило пам'яті. А крім того, на додаток до знаючи, де вони, що зберігається в обидва стека і купи. Кертіс. CURTIS: Коли вони стикаються, є те, що переповнення стека? Джейсон Хіршхорна: Коли вони стикаються, це не переповнення стека. Переповнення стека є інша область що ми можемо перейти, якщо ви хочете. Добре, ми ще повернемося до цього трохи пізніше. СТУДЕНТ: Яке слово називається коли вони б'ють один одного, стек і купа? Джейсон Хіршхорна: В даний час, нема про що турбуватися. Просто знайте - Я відповім на це питання після занять. Якщо вони стикаються один з одним, у нього скінчилися пам'яті, тому що немає більш простір там. СТУДЕНТ: На жаль, те, що вина сегмент? Джейсон Хіршхорна: Сегмент Несправність може бути викликана для - це залежить, чому називається SEG вини автора. Іноді, ваш переповнення стека, воно буде кажуть сегмент звинуватити як помилки. СТУДЕНТ: А як щодо разименованія нульовий змінної? Це помилка сегмент? Джейсон Хіршхорна: разименованія порожній покажчик - Отже, якщо у вас є вказівник, який вам встановити дорівнює нулю, покажчики, нагадаємо, адреси пам'яті та не зберігайте як їх значення. І порожній покажчик, по суті, зберігання 0, 0-й звернутися в цієї змінної. Так 0x, 0, 0, 0, 0, і так далі. Це 0-й адресу в пам'яті, що це не в нашій картині, це там десь, ось захищені на комп'ютері. Нам не дозволяють доторкнутися до неї. Так що, коли ваша програма це виконання, якщо щось намагається піти в пам'яті адреса 0, він знає, що тобто пусте значення. Вона знає, ніщо не повинно бути там. Так що, якщо ви намагаєтеся використовувати щось є і лікувати щось подібне там або намагається йти в це місце, ви збирається отримати провину сегм або помилку. Я відповів на ваше запитання? А тепер ми повернемося до переповнення стека. Речі в стеці, а ви, хлопці, бачив, в - намалюємо близько план кадру стека. Чи всі можуть бачити, що? Так у нас є фрейм стека. Ми економимо масив в якості місцевого змінна в цій функції. Так би мовити, наш масив має п'ять місць. Всі п'ять з них будуть збережені в цьому кадрі стека. Якщо ми почнемо писати за Межі даного масиву - тому, якщо ми почнемо писати в, скажемо, що це 0. Такі показники п'ять нашого масиву. Якщо ми почнемо писати в індекс 5, який ми не маємо, коли у нас є масив розміром 5, ми починаємо писати в індекс 6, 7, 8, 9, ми можемо отримати стек Помилка переповнення. Взагалі це не - ви, ймовірно, потрапити в біду якщо ви йдете на один. Але в цілому, ви отримаєте в всього клопоту, якщо ви йдете на себе багато і ви йдете до цих пір більше, що ви пишете над зворотною адресою, що Функція, яка знаходиться за адресою Дно кадру стека. Тому що, чи не так? Ви - у - вибачте. Чи не "тому що прямо." У кадрі стека, у вас є Ваші локальні змінні. У самому низу стека кадр зворотну адресу. Ось де функція йде, коли все закінчиться. І якщо ви перезаписати, що повернення адресу, то, коли цей фрейм стека, коли ви збираєтеся через стек кадр і виконання кожного рядка, ви збирається йти на новий зворотної адреси що там написано, а не Фактичний один. І ось як ми бачили деякі порушення правил безпеки може трапитися з комп'ютерами. Так переповнення стека, коротше кажучи, це коли Ви перезаписати участь в стеку ви повинні використовувати, місцевий Мінлива ви повинні використовувати, і зокрема, коли ви починаєте перезапису важливі речі, як зворотну адресу. І ось, коли ви отримаєте повідомлення про помилку. Або, може бути, навіть ви могли б почати навіть писати в - кажуть бінарний пошук був прямо над основним. Якщо ви переписав багато, вам міг би написати в основний. Але в цілому, ви отримуєте повідомлення про помилку і Потім, тому що комп'ютер знає Ви робите те, що ви не повинні робити. Так. СТУДЕНТ: У чому різниця між переповнення стека і переповнення буфера? Джейсон Хіршхорна: Переповнення буфера є більш загальним типом то, що я тільки що описав. СТУДЕНТ: Так переповнення стека є приклад переповнення буфера. Джейсон Хіршхорна: Абсолютно вірно. Це масив ми можемо думати про якість буфера, простір для речей, щоб входити Це переповнення буфера. Ми могли б переповнення буфера. Якби не було буфер, який там часто є масивом купа, і ми переписав ці межі, то ми б є переповнення буфера. І виходить за рамки цього курсу, вони виявлені трохи по-іншому. Компілятор має особливе способи виявлення друг. Але переповнення буфера є більш загальним тип, що я описав, який був переповнення буфера. Хіба що відповісти на ваше запитання? Солодкий. Чи були інші питання, пов'язані в стек або в купі? Так. СТУДЕНТ: я знаю, у вас є, щоб звільнити рядків тому що вони в купі і ви не хочете, щоб витік пам'яті. Але у вас є, щоб звільнити глобальні змінні і все в такому дусі? Або вони автоматично звільняються? Джейсон Хіршхорна: Хороше питання. Таким чином, в CS50.H, ми створюємо цю річ ти кликав рядок. Рядок дійсно те, що? СТУДЕНТ: Чар зірка. Джейсон Хіршхорна: символ зірки, покажчик в символ, покажчик на масив символів. Це те, що рядок. Так що ми повинні звільнити його, так як GetString, який ми використовували багато - Рядок імені дорівнює GetString - що mallocs для нас деяка кількість пам'яті на купи, а потім повертає покажчик на Перший символ, що рядок, символ зірки. Так нібито, якщо ви не були писати безкоштовно на будь-якому з ваших рядків що ви назвали досі, у вас є протікала деяку кількість пам'яті. Звичайно, ми не говорили про це, так що ніхто не добрався в Біда за це. Але йти вперед, так. При виклику GetString, ви mallocing деякий простір в купі. І якщо ви не дзвоніть безкоштовно пізніше, що Рядок, у вас є витік пам'яті. Це відповідь на ваше запитання? Так СТУДЕНТ: Таким чином, щоб зробити це, ми використовуємо безкоштовно прямо перед поверненням? Мовляв, в рамках, я думаю, якщо ми говоримо, як, тап_п, в Обсяг коду, це в тих фігурні дужки, прямо перед - Ви знаєте, де ви б зазвичай ставлять повернення. Ви поставити безкоштовно до цього? Джейсон Хіршхорна: Таким чином, ви можете поставити безкоштовно куди ви хочете поставити безкоштовно. Тому що ці виділяються динамічно змінні, тому що вони можуть жити за рамки зокрема Функція, якщо ви телефонуєте Танос в окрему функцію, наприклад, GetString, ви можете зателефонувати безкоштовно в основний. Вам не потрібно називати його в конкретній функції де Танос називається. Але ви повинні назвати його до основних декларацій. І це дійсно залежить. Це залежить від того, чому ви malloced, що простір в першу чергу. Деякі люди будуть називати звільнити досить швидко. Деякі люди ніколи не будуть дзвонити безкоштовно до кінець своєї програми. І вони будуть проходити через безкоштовно все. Це залежить від того, чому ви назвали Танос. СТУДЕНТ: А що б ви сказали, якщо ви назвали використання GetString? Ви б сказав, що безкоштовно і що? Джейсон Хіршхорна: Так синтаксис безкоштовно просто безкоштовно, відкриті дужка, недалеко Хлопець, і ім'я покажчика. Так що якщо ви пишете рядок рівних ім'я GetString, ви ставите ім'я тут. Це ім'я покажчика. І він знає, щоб звільнити цю пам'ять. СТУДЕНТ: Так що, коли він звільняє цю пам'ять, покажчик раніше вказує на те місце, в пам'яті? Чи це покажчик також звільняється від адреса, який він вказує. Джейсон Хіршхорна: Ми повинні спробувати це. Ми повинні кодувати що. Давайте повернемося, коли ми доберемося до кодування, і давайте код, який. І якщо ви хочете, щоб з'ясувати відповідь до того, що ви також можете код, який в той же час. Але це велике питання. СТУДЕНТ: Чи можна безкоштовно щось занадто рано? Таким чином, ви все ще це потрібно для вашої програми, і ви звільнили, що обсяг пам'яті? Джейсон Хіршхорна: Так. Це можливо, якщо ви безкоштовно щось і тоді ви використовувати його знову, ви будете зіткнетеся з помилкою. Але це на вас, тому що ви звільнили щось, а потім назвав його пізніше. Так, щоб було помилкою програміста. Але так. Ви могли б написати, що. Є ще питання по - Так. СТУДЕНТ: Так що якщо ви, як передбачається, тільки звільнити його в цілому до Програма закінчується, чи означає це, якщо Програма закінчується, і ви не звільнити його, що пам'ять ще виділяється? Джейсон Хіршхорна: Якщо ваша програма закінчується і ви забудьте звільнити щось, то що пам'ять була виділена протягом час життя вашої програми. Коли ваша програма повністю закривається, що пам'ять не збирається щоб залишитися там назавжди. Комп'ютер досить розумний, щоб знати, , Що, коли програма закривається, це повинні позбутися від усіх пам'яті, що був пов'язаний з цією програмою. Тим не менш, є інструменти можна запускати за програмою для виявлення, якщо, коли Програма завершена, ви забули щоб звільнити пам'ять. І для вашого наступного проблеми встановити, де ви будете використовувати Танос і використання покажчики, ви будете запускати цей запрограмувати на вашу програму, щоб побачити, якщо, коли основні повертається, ви були деякі речі, які залишилися unfreed. Так що вони не збираються залишатися malloced назавжди у вашому комп'ютері. Це було б марнотратно, тому що дуже швидко, комп'ютери б не вистачити пам'яті. Але якщо вони не працюватиме до кінця вашого запрограмувати і вони не звільнені і ваш Програма виходить, що як і раніше є проблемою що цей інструмент допоможе вам в рішенні. СТУДЕНТ: Це Valgrind? Джейсон Хіршхорна: Це називається Valgrind. І ви будете - СТУДЕНТ: Але ми не повинні знати, що для вікторини, хоча? Я маю на увазі, це було говорили про трохи в лекції. Джейсон Хіршхорна: Так Valgrind це ім'я цього інструменту. Знаючи, що вона робить це достатньо для вікторини. Але ви не використовували його ще на вашому Проблема встановити, тому що у нас не було Проблема набір, який явно мав справу з Танос або ви використовуєте Танос. Таким чином, ви ще не використали Valgrind. Але ви будете використовувати його рано , Ніж пізніше. СТУДЕНТ: Чи можете ви повторити що Valgrind є? Джейсон Хіршхорна: Вибачте? СТУДЕНТ: Чи можете ви повторити, що Мета Valgring є? Джейсон Хіршхорна: Valgrind це ім'я - як GDB допомагає вам налагодження програми, Valgrind допомагає вам зрозуміти, якщо речі не були звільнені коли закривається ваша програма. Таким чином, ви будете запустити його на вашій програмі. І ваша програма виходить, і він буде говорити, ваша програма називається Танос це багато раз для цього багато байт, і ви тільки називається вільним це багато разів. І так ви залишили ці багато байт без звільнення. Чи це буде сказати, що ви звільнили все. Хороша робота. СТУДЕНТ: ОК. І це називається Valgring? ДЖЕЙСОН Hirschhorn: V-A-L-G-R-I-N-D. СТУДЕНТ: Питання про покажчики. Так сказати, що ви н зірки х одно щось. Це дорівнює, що ви кладете там, в тому, що те, що будучи покласти всередину що х вказує на, або покажчик х? Джейсон Хіршхорна: Чи можете ви повторити питання? Чи можемо ми зробити це в той час ви це говорите? СТУДЕНТ: У вікторині, насправді, той, який ви послали нас, як це було, символ зірки правда дорівнює CS50 скелі, чи не так? Так це значить, що, що CS50 скелі це те, що правда вказує на? Джейсон Хіршхорна: Так ви говорите про сЬаг зірки в рядок, як це працює? Так. ОК. Давайте намалюємо це тут. [СТОРОНА РОЗМОВА] Джейсон Хіршхорна: Так ця змінна буде з символьного типу зірки. Наскільки велика змінна з символьного типу зірки? Скільки байт? СТУДЕНТИ: Чотири. Джейсон Хіршхорна: Це чотири байти. Скільки права є змінною з типу десяткового зірки? СТУДЕНТИ: Чотири. Джейсон Хіршхорна: Чотири байта. Якщо це покажчик, то це завжди чотири байти, так як покажчики, їх значення є адреса пам'яті. І адреси пам'яті на CS50 Прилад чотири байти. Тому, коли ми називаємо GetString або коли ми скажімо, імя_строкі дорівнює, а потім в подвійні лапки поставити рядок, ми вкладаємо - ну, це трохи по-іншому. Ми зробимо GetString як приклад. Або символ зірки щось дорівнює рядок. На жаль, дати мені приклад які ви прочитали? СТУДЕНТ: символ зірки правда дорівнює "CS50 камені" в подвійні лапки. Джейсон Хіршхорна: Так що це зірка, це ми будемо називати цей змінну х для нашого спільні цілі. Ми створили змінну х. Це тип символ зірки. Це покажчик на серії символів. Так тут - Так що це, як це буде працювати в пам'яті. Це буде зберігати адресу пам'яті. Було б зберігати адреса пам'яті перший символ в масиві. А потім, коли ви слідували покажчик, ви б отримати перший символ. І якщо ви читаєте цю річ, як рядок, ваш комп'ютер розумний досить знати, читати все це справа поки він не потрапляє в зазор 0. Але якщо ви читаєте йому характер в час, так що ви ітерації цей рядок, то ви тільки що прочитали характер, в той час, поки ви не дійдете до зворотний слеш 0. Це не може відповісти на ваші Питання, однак. СТУДЕНТ: Так, але у вас немає malloced, що простір але для цього покажчика. Джейсон Хіршхорна: Так що я не зовсім впевнений, саме те, що ви дивитеся на, тому що я не робив, що вікторину. Це мав бути корисними ресурсів з іншого TF. Якщо ви створюєте рядок на стек або як локальної змінної, воно буде просто масив звинувачень, а не як правило, символ зірки вказуючи на інший рядок. Але я не знаю. Це може бути дороговказом на інший рядок в стеку, а також. Так. СТУДЕНТ: я знаю, що вам потрібно виділити пам'ять, якщо покажчик отримувати оголошений всередині іншої функції. Ви повинні зробити те ж саме, якщо це був оголошений всередині основної, ви використовуєте його всередині основної? Джейсон Хіршхорна: Так що, так. Ви можете оголосити покажчик на будь адреса пам'яті в пам'яті. Це може бути адреса пам'яті місцевий змінна, хоча найчастіше, люди не заявляють адреси пам'яті в локальних змінних, тому що вони йдуть далеко, як тільки що функція повертає, які Тому ми, як правило Malloc речі. Але так, ви могли б оголосити покажчик в іншій локальної змінної. Це просто правило, не робиться. Але я можу поглянути на що певна річ після занять. Так. СТУДЕНТ: Я думаю, що це свого роду з того, що просять. Це здається дивним, щоб бути ініціалізації покажчик не так адресу, але як те, що здається вартості. Схоже, CS50 є те, що всередині річ будучи вказав на і НЕ фактична адреса, чи не так? Джейсон Хіршхорна: Так от не так, однако. Це не те, що відбувається. При оголошенні сЬаг зірку, це адреса пам'яті. Покажчики всі адреси пам'яті вказуючи на щось інше. Це щось ще може бути на стек, але майже завжди знаходиться на купи, як ми побачимо це використовується. Але імя_строкі дорівнює подвійній лапки "GetString," ми бачимо, що і ми можете подивитися, що і код, який. GetString рядок не зберігається в ця змінна, або як рядок ім'я не зберігається в тому, що змінна, тому що це не так, як покажчики працювати. Чи має це сенс? СТУДЕНТ: Так. Джейсон Хіршхорна: ОК. Будемо сподіватися, що це не було заплутаною нікому. Але якщо це так, ми можемо подивитися на неї ще раз в небагато, тому що ми насправді відбувається кодувати те, що, ми сподіваємося, роботи з рядками і допоможе вам відчувати себе більш комфортно з ними. Будь-які інші питання, пов'язані з їх теми або інші теми, які Я покладу назад? І - Прямо зараз. Так, Олден. ALDEN: Так що це не має ніякого відношення, але ми можемо просто піти на дуже швидко, що ми повинні знати, про різницю між 32 і 64-розрядна машина? Джейсон Хіршхорна: Так. Так 32 біта, скільки байт? ALDEN: Це чотири байти. Джейсон Хіршхорна: Це чотири байти. І 64 біта, скільки байт? СТУДЕНТ: Вісім. Джейсон Хіршхорна: Вісім байт. Отже, ще раз, вісім біт на один байт. Ваш CS50 прилад 32-розрядна машина. Так адреси пам'яті чотири байти. Є 2 до 32 адреси пам'яті. Від 0 до 2 в 32 мінус 1. І я не впевнений, але це ймовірно, сфера, що вам потрібно знаю для 32-бітної машині, що пам'ять адреси, знову ж, довго чотири байти, і це максимальна сума адрес пам'яті. Крім того, типи даних - це може бути щось, як добре, що це варто відзначити. Розмір типу даних залежить від машина ви працюєте з. Так символ, один символ, то, як кількість байт на нашому CS50 приладу? Один байт. І це насправді один байт, як добре на 64-бітної машині. І більшість типи даних і той же номер байтів на обох машинах. Але деякі типи даних будуть відрізнятися на обох машинах. Так що було б потенційно Єдине, що вам потрібно знати. Але навіть те, що, як мені здається, є за межами - Я майже впевнений,, якщо озирнутися назад на старі вікторини, він говорить, припустимо, для проблеми ви за допомогою кодування 32-розрядна машина. Але є, щоб йти разом з, що в якщо вам цікаво, чи є типи даних, які аналогічні Розмір на всіх машинах. Якщо ви бачили щось подібне uint32_t, ви можете або не бачили, що. Це тип даних. Це говорить, 32 біта незалежно від того, на якій машині це на. Тому, коли люди пишуть портативний Код, вони, ймовірно, не буде використовувати цілими. Вони замість цього використовувати ці інші дані типи, що вони знають, буде те ж саме Розмір на кожній машині. Мадху. Мадху: у мене було питання про процес компіляції. Так що якщо ви пишете програму, яка використовує бібліотека як CS50 або щось так, я знаю, що ця бібліотека повинен в якийсь момент, бути зібрано і пов'язано дюйма Але скільки з цього відбувається під час складання вашої програми? Яка частина цього процесу бібліотеки відбувається, коли ви складання власної програми? Джейсон Хіршхорна: Отже, давайте перейдемо Зазвичай кроки цього процесу. Ви пишете. C файл. У вашому. C File, ви # включити ваш бібліотеки заголовка, наприклад, cs50.h. Що робить, що різке включають лінія зробити для вашої програми? Akchar. AKCHAR: Він додає прототипи функції з заголовка файли в бібліотеках. Джейсон Хіршхорна: Абсолютно вірно. Це додає ці прототипи функцій в код. Тому, коли ваш код складається у на ранніх стадіях, компілятор знає що ці функції дійсно існують, і що в іншому місці вони були визначені. В. Ч файли не включають визначення для цих функцій або, як вони дійсно працюють. Cs50.h просто включає щось, що говорить GetString реальна річ, яка може трапитися. І standardio.h каже Е є реальна річ, яка може трапитися. Так що ваша з мовою з цим. Заголовка файл запускається перетворився на деякі машиночитаемой код, який в кінцевому підсумку отримує перетворився в двійковий Код, 0 і 1 в. І це код, який в кінцевому рахунку запускається на виконання. -Л CS50 лінії - наприклад, коли ви пишете Clang - а потім ви включаєте-л CS50, введенні, що дюйма І ви бачите, що. Коли ви пишете зробити, ви будете бачити, що лінія тут. І ми побачимо, що через секунду, коли ми кодувати чи пізно, коли ми коду. Але що-л CS50 лінія робить щось трохи відрізняється від # Включити cs50.h. Що це-л CS50 лінії робити? Аві? AVI: Я хочу сказати, що вона пов'язує бібліотека з функцією називати, як і. Ø файлів. Джейсон Хіршхорна: Отже, дуже близько, якщо не спот-он. -Л CS50 приймає двійковий файл і об'єднує його з вашим двійковий файл. Так cs50.h, немає ніякого сенсу в перетворенні cs50.h від мови C в двійкову кожен раз, коли він використовується. Це було б нерозумно, тому що буде витрачати багато часу. Так що вже складено і перетворився на виконуваний файл. І тепер він збирається бути об'єднані з файлом в кінці. Так що ті 1 і 0 збираєтеся злитися з вашим них і 0 в кінці. Так що тепер ви будете насправді є реальна 1 і 0, які визначають, яким GetString, наприклад, працює, або як Е, наприклад, працює. І для отримання додаткової інформації, є короткі компілятори, Нейт дає, що ви повинні перевірити, що йде через ці кроки. Але - Так. СТУДЕНТ: Чи є вони завжди в ущільнювальні файли. коли вони у вигляді бібліотеки, готовий бути об'єднані, пов'язані - як вони в двійковому коді? Джейсон Хіршхорна: ОК. Що - СТУДЕНТ: Це завжди має місце для бібліотеки, коли ви зв'язати їх? Джейсон Хіршхорна: Так. Так що є. И файли, які будуть машинний код, який також буде загадковими для вас. Вам не потрібно турбуватися про них. Але в цілому, так, вони будуть бути в. про файли готові до роботи. СТУДЕНТ: Отже, коли ви вантажити до бібліотека, ви тільки вантажимо . Год і. О? Ви не вантажимо. Гр або. С. Джейсон Хіршхорна: Так - і це в цій короткій, а також, якщо ця інформація, здається, приходить трохи швидко. Але мало компіляторів говорить про це, а також. Коли ви вантажте бібліотеку, якщо ви ставите . Ч, файл заголовка, тих, прототипи функцій, а також 1-х і 0-х, це все, що потрібно дати. Вам не потрібно, щоб дати як Функція працює,. З файл. Так як точка абстракції, або вказати інтерфейси, точка, в цьому SPL, переносима бібліотека Стенфорд, це для вас, щоб не турбуватися про те, як нові GRect працює, або як рухатися робіт, або як додати робіт. Все, що вам потрібно знати, що додати є функцією, що ви можете використовувати, і він робить це. Таким чином, ви дійсно не потрібно знати, як це написано в C. потрібно просто знаю, ось функції, то, що вони зробити, і ось'S 1 і 0 коли ви дійсно хочете їх використовувати. Круто. Є ще питання по компіляторів або інші теми на дошці? СТУДЕНТ: У мене є питання про реалізації рекурсивних функцій. Питання про рекурсії. У мене було відчуття, що б придумати. Так що давайте швидко пройти рекурсія з певним Наприклад, факторіал. Тому що це приклад, який часто з'являється або використовується щоб проілюструвати рекурсію. Таким чином, "4!" читається як 4 факторіала. І що 4 факторний означає? Що це робити? Як розрахувати 4 факторіала? 4 рази 3 раз 2 раз 1. Так ще один спосіб написати 4 факторіала є, щоб написати це. 4 рази 3 факторний. Тому що 3 факторіал 3 рази 2 раз 1. Так в 4 рази 3 факторіал 4 раз 3 раз 2 раз 1. Ось чому факторний є відмінним кандидат на рекурсії, тому що це Зрозуміло, що є щось, що відбувається знову і знову і знову на меншу кількість речей до ви дійдете до кінця. Коли ви досягнете 1, 1 факторіал 1. Ви не можете піти набагато далі. 0 факторний також визначається як 1. Тому, коли ви отримуєте 1 або 0, ви зрештою, і ви можете почати йти назад. Так що, якщо ми хотіли написати рекурсивний Функція для обчислення факторіала, ми збираємося написати деякі псевдокод, що зараз. Перш, ніж ми написати, що псевдокод - Я дам вам, хлопці пару хвилин написати псевдокод або просто думаю, про це - Є дві речі, кожні рекурсивна функція потребує. Які ці дві речі? Джек: Він повинен називати себе. Джейсон Хіршхорна: Ной? О, Джек. Йдемо далі. Джек: Він повинен називати себе. Джейсон Хіршхорна: Так рекурсивний функція повинна рекурсивний виклик, подзвонити в собі. Це одна. І те, що інша справа? Джек: базовий варіант. Джейсон Хіршхорна: базовий варіант. Базова випадок, ось, коли ми зупиняємося. Так що ваша функція викликається. Базовий варіант стоїть на першому місці. Ви хочете знати, якщо ви в кінці. І якщо ви не в кінці, ви зробити свій рекурсивний виклик. І ви йдете через цю функцію знову, перевірити базовий варіант знову. Якщо ви ще не кінець, ви робите другий рекурсивний виклик, і так далі, і так далі. Ось чому рекурсивні функції завжди потрібні ці базові випадки і ті, рекурсивні виклики. Якщо у вас немає рекурсивний виклик, це НЕ буде рекурсивна функція. Якщо у вас не було базовий варіант, Ви пішли б назавжди і там не було б закінчення. І базовий варіант завжди на першому місці, тому що ви завжди хочете, щоб перевірити якщо ви в кінці першого. Тому, перш ніж зробити деякі псевдокод, чому Ви не знайдіть хвилинку, щоб подумати про як рекурсивний факторіала було б написано? Крім того, як багато хто, як ви робите, лист це на аркуші паперу є те, що ви будете мати, щоб зробити на вікторині завтра. Так, ймовірно, хороша практика, щоб зробити що код ви пишете вниз на лист паперу - або ви можете зробити це. Ви знаєте, де крапки з комою. Ви пам'ятаєте синтаксис. Тому що ви не в змозі мати компілятор сказати ви зробили помилку. Крім того, в цьому напрямку, завтра, коли Ви кодування проблеми, якщо ви кинулися за час, або якщо ви дуже плутати, як ви, як передбачається, написати певну річ в с, це належало б вам написати псевдо-код або писати коментарі в а. Тому що є часткове кредит на Багато питань щодо вікторини. Так що ви можете бути поспіху, або ви може просто плутати. Дати в коментарях або псевдо-код часто способи, які ви може отримати частковий кредит. Так що не залишити щось порожній на вікторині. Там немає покарання за покласти речі дюйма Справді, вважаючи в псевдо-код або коментарі збирається допомогти грейдер з'ясувати, якщо ви насправді знаєте, що Ви говорите про, і, можливо, нагороду Ви деяка часткова заслуга в цьому. Також в цьому напрямку, писати ясно. Якщо ми можемо насправді не те, що ви пишете, ми не збираємося називати тебе опівночі завтра до фігури те, що ви написали. Ми просто збираємося зняти окуляри. Пишіть ясно, щоб ми могли почути, вірніше, ми можемо прочитати, що ви написали. І якщо він говорить, дві пропозиції, чи не написати абзац. Дотримуйтесь інструкцій. Пишіть ясно. І писати в цих зауважень або псевдокод для питань, які могли б Нагорода часткове кредит. Добре, давайте повернемося до факторіала. Тому у нас є функція факторіала. Якби я був насправді пишу це в C, що мені потрібно поставити перед ім'ям функції? Повертається тип, який, у цьому так, ми дамо йому Int. А потім у фігурних дужках, є те, що відбувається в фігурних дужках для функція? СТУДЕНТИ: Тип аргументу. Джейсон Хіршхорна: Її аргументи. Так факторний, ймовірно, приймати аргумент. Це, напевно, тільки взяти один аргумент. І ми скажемо це займе ціле число, зване х. І знову, при написанні прототип функція або записи функцію в коді перед його визначення, вам написати тип даних і ім'я ця змінна тільки для цієї функції. Таким чином, ви можете передати деяку кількість в це функція, вона називатиметься х всередині. У нас є функцію факторіала. Нам потрібно дві речі, базовий варіант і рекурсивний виклик. Що таке базовий варіант для факторіала? Хтось, хто її написав, і хто не має говорять ще, що є базовим чохол для факторіала? СТУДЕНТ: Якщо п менше ніж 2, повернути 1. Джейсон Хіршхорна: Якщо п менше 2, повернути 1. Мені це подобається, тому що це піклується про 0 і 1. Так зробимо х <2, повернути 1. Якщо нас пройшло 0, якщо ми отримаємо пройшло 1, ця функція буде негайно повернути 1. Якщо нас минув певний число, більше або дорівнює 2, ми збираємося є наш рекурсивний виклик. І так як це те, що буде працювати? Може хтось ще, хто працював над цим які поки не говорять, дайте мені рекурсивний виклик для цієї функції в псевдокоде? Якщо ми отримати пройшло в числа х і це більше, ніж 2, то ми хочемо зробити? Ми також приклад написано на сторона, яка може дати вам підказку. СТУДЕНТ: Зателефонуйте х разів Факторіал х мінус 1? Джейсон Хіршхорна: Абсолютно вірно. Ми збираємося повернутися х разів Факторіал х мінус 1. І, що, хоча я і написав, в основному, те, що ви сказали, англійською мовою, це факторіала буде викликаний знову. Це буде виконуватися на х мінус 1. Це буде повернутися з деякого цілого, і то він буде розмножуватися ці два разом, і це значення буде повернувся до того, що називається це факторіала, які могли б ще один екземпляр це факторіала. Так що це приклад рекурсивної Функція, дуже просто рекурсивна функція. Але більшість з них буде так. Якщо ви хотіли б хорошу рекурсивним виклик для вікторини, спробуйте кодування бінарний пошук рекурсивно. Тому що, якщо ви зробили бінарний пошук для Проблема встановити три, ви, ймовірно, зробив це багаторазово в циклі. Але це також може бути записана рекурсивно. Ви будете потребувати, щоб написати власний окрема функція, яка приймає деякі різні аргументи командного рядка - або не аргумент командного рядка, деякі різні тільки регулярні аргументи. Але ви могли б написати бінарний пошук рекурсивно, а також. СТУДЕНТ: Таким чином, ви, можливо, також написав, замість х мінус 1, ви може також написав х мінус мінус, або ви могли б написано мінус мінус х. Ви можете просто пояснити дуже швидко, чому ті були б різні речі, як те, що різниця між х мінус мінус і мінус мінус х? Джейсон Хіршхорна: Ні, я не буду вдаватися в це. Але я буду говорити з вами про це після того, як клас. х мінус мінус, мінус мінус х зменшення х на 1. Але вони роблять це трохи по-іншому. Але я не хочу вдаватися в це. Інші питання про рекурсії або ця функція? Це не зовсім навіть псевдокод. Ось в принципі і код в C можна було б написати для цього. OK, будь-які інші питання про теми тут? Так. СТУДЕНТ: У мене є короткий список з плаваючою точкою і точність. Джейсон Хіршхорна: Плаваючий точки і точність. Може хтось дуже швидко дати мені короткий виклад з плаваючою точкою і точність? Ви всі повинні були зробити це для вашого Проблема встановити, так що ви все знайомі з нею. Або, може бути, не всі з вас. Будь? Дайте мені почали пляма. З плаваючою точкою і точність. У чому проблема? Так. Вікторія? VANESSA: Ванесса. Джейсон Хіршхорна: Ванесса. Вибачте. VANESSA: Там тільки кінцеве число чисел, які можуть бути представлені тому що ви перебуваєте на, в нашому так, 32-розрядна система. Таким чином, ви частково повинні складають деякі цифри. Джейсон Хіршхорна: Так от Абсолютно вірно. Є тільки певну кількість числа, які можуть бути представлені. Якщо помножити два дуже великих чисел, це може переповнити кількість просторів у вас є, щоб представляти цілим числом. Ось чому іноді ми використовуємо давним замість Int. Це має більше простору. Це може тримати більшу кількість. Точності з плаваючою комою має відношення до , Але також має відношення до Справа в тому, що десяткові цифри не завжди представляється. Вибачте. Дозвольте мені сказати це назад вгору. Десяткове число 1.0 не завжди представлені як ви очікували б, 1,000000000. Це іноді представлений у вигляді 1,000000001 або 0,999999999. Це може бути навіть 89 кинутий десь там. Так що ті десяткові цифри не представлені так само, як ви б очікувати, що вони повинні бути представлені. Таким чином, у проблемі набір - це було два? - Проблема встановити два, де ми мали справу з числа з плаваючою точкою, коли ми хотіли їм представляти саме те, що ми хотіли їм представляти, число пенні, або кількість центів, помножимо їх на 100. Ми оточили їх. А потім ми відрізали все після коми. Це було для того, щоб вони були б фактично рівні саме те, що ми хотіли їм рівнятися. Тому що, коли ви берете те, що це плавати і перетворити його на междунар, ви відрізати все, щоб права десяткового дробу. Тому що є деякі з плаваючою точкою неточність, 100.000 може бути представлений у вигляді +99,999999999. І якщо ви просто відрізати все, щоб право відразу ж, ви збираєтеся отримати неправильний номер. Так. СТУДЕНТ: У мене було питання про приведення. Який порядок це відбувається в? Якщо ви хочете зробити поплавок, кронштейни, 1 розділений на 10, вона робить 1 ділиться на 10, потім отримати 0,1, а потім увімкніть це у зверненні? Джейсон Хіршхорна: Якщо ви робите плавати 1 ділиться на 10 - СТУДЕНТ: Так, а потім складає - Ну, було б нормально є його рівним в - Так. Ви хочете, щоб зробити його плавати, чи не так? Джейсон Хіршхорна: Отже, ми збираємося використовувати це, щоб безпосередньо перейти у з'ясування того, відповіді на ці питання через кодування. Тому що ви, ймовірно, є багато ці дрібні питання, і це хороший спосіб для їх вирішення через кодування. Так що ми збираємося, щоб закодувати це прямо зараз, а потім ми збираємося повернутися і код на питання, ви повинні були. Таким чином, перший рядок - Я не мав написати його - що це Перше, що ми хочемо зробити, коли ми відкрити новий файл в Gedit? СТУДЕНТ: Увімкніть. Джейсон Хіршхорна: Увімкніть що? СТУДЕНТ: бібліотека CS50. Джейсон Хіршхорна: ОК. Що ще ми повинні включити? Ми просто збираємося, щоб перевірити, що відбувається , Коли ви приводите щось поплавком. Але те, що ми повинні включити, якщо ми збираюся написати програму на С? СТУДЕНТ: Standard I / O. Джейсон Хіршхорна: stdio.h. Ми насправді не потрібно, для цього Програма, cs50.h, хоча це завжди корисно включити його. Але ми завжди повинні stdio.h. СТУДЕНТ: При кодуванні в С? Джейсон Хіршхорна: При кодуванні в С. Так що я зберегти його, як це. Гр файлу. Я отримати деякі цікаві підсвічування синтаксису. Я написав порожнечу всередині основної. Що недійсним на увазі? СТУДЕНТ не несе ніякої аргументи командного рядка. Джейсон Хіршхорна: відпадає кошти, в цьому випадок, головний не несе ніякої аргументи командного рядка. В інших випадках, це означає, що функції не приймає аргументи командного рядка. Або функція, якби мені довелося писати порожнечу основних (недійсними), що б сказав основні років не повертаються нічого. Так недійсними просто нічого не означає. Що б я написати, якби я приймати аргументи командного рядка? СТУДЕНТ: внутр дуги з рядок дуги проти Джейсон Хіршхорна: внутр агдс рядок агду. Чи так це? СТУДЕНТ: Це символьні зірка ARGV дужки. Джейсон Хіршхорна: Таким чином, ви могли б написати Рядок ARGV кронштейни або символ зірки агду дужки, але ви повинні дужки. Тому агду є масивом рядків, пам'ятаю. Це не просто одна струна. Так рядок агду є, ось це один рядок називається агду. Рядок ARGV дужках, ось масив рядків. Так внутр агдс рядок ARGV дужки буде те, що я , Ймовірно, написати. Таким чином, ви хотіли зберегти як цілого числа? СТУДЕНТ: Так, ціле число. Або у зверненні. Джейсон Хіршхорна: У поплавком? Мовляв, поплавок х дорівнює 1 ділиться на 10. Джейсон Хіршхорна: ОК. Як мені роздрукувати поплавок в Printf? Що? СТУДЕНТ% е. Джейсон Хіршхорна:% е. Що ціле? г, або я. Що рядок? СТУДЕНТ: с. Джейсон Хіршхорна: с. Як я можу отримати нову лінію? СТУДЕНТ: Зворотній коса риса н. Джейсон Хіршхорна: Що мені повернутися якщо основні траси правильно? СТУДЕНТ: 0. Чи потрібно мені написати цю лінію, хоча? СТУДЕНТ: Ні. Добре, ми не будемо писати, то. Чи всі можуть прочитати, що? Це виглядає трохи мала. Чи всі можуть побачити, чи повинні Я зробити його більше? Я думаю, що для камери, ми зробимо це трохи більше, однако. Джейсон Хіршхорна: Якщо я хочу, щоб перетворити це . C файл у виконуваний файл, що я пишу? СТУДЕНТ: Зробіть тест. Джейсон Хіршхорна: Вибачте? СТУДЕНТ: Зробіть тест. Джейсон Хіршхорна: Зробіть тест. Ми говорили про ця лінія раніше. Clang. Що брязкіт? Назва компілятором. Що це лінія? СТУДЕНТ: Установка його на використання GDB. Джейсон Хіршхорна: Набори це на використанні GDB. Ця лінія, що це таке? СТУДЕНТ: Вихідний код. Джейсон Хіршхорна: Це Вихідний файл,. З файл. Що означають ці дві лінії робити? Або ці зо два не лінії. СТУДЕНТ: Він називає це тест. Джейсон Хіршхорна: Так тире про каже, назвати його щось по-іншому. І ось ви телефонуєте його випробування. Якщо у мене не було, що в, що б це назвати це? СТУДЕНТ: a.out. Джейсон Хіршхорна: a.out. Що це робити? СТУДЕНТ: Посилання на математичну бібліотеку. Джейсон Хіршхорна: Він пов'язує в математичній бібліотеки. Ми не включали математична бібліотека, але так як це настільки часто, вони вже написано марка завжди включати математична бібліотека. І так само, це включає в себе бібліотека CS50. Отже, якщо ми перерахуємо, у нас тепер є виконуваний званий тест. Щоб виконати його, я пишу тест. Я бачу, що мій плаваючою точкою, Як і очікувалося, дорівнює 0. Чи означає це, - так - СТУДЕНТ: Тоді, якщо ви поклали плавати зараз, як ви привести його поплавця - Джейсон Хіршхорна: Cast від 1 до поплавця? СТУДЕНТ: Ні, кинув повний річ - да. Якщо ви тільки що зробили, що, б які роблять його 0,1? Джейсон Хіршхорна: Добре, таким чином дуже швидко, 1 ділиться на 10, ті цілі розділена. Тому, коли ви розділите цілі, вони 0, і ви економите, що 0 в плавати, бо слеш просто цілочисельне ділення. Так що тепер ми повороту щось у зверненні. Давайте подивимося, що станеться. Ми зробимо тест. Так що тепер ми бачимо, що, що коса риса не було цілочисельне ділення було плаваючою точка розподілу. Тому що один з її аргументів був кинутий у зверненні. Так що тепер це вже говорив, ставитися до цього поділ, як ми маємо справу з плаваючі точки, а не з цілими числами. І таким чином ми отримуємо відповідь ми очікуємо. Давайте подивимося, що відбувається - упс. Якби я хотів, щоб надрукувати більше десяткові плями, як я міг це зробити? СТУДЕНТ: Точка точка е, або стільки, скільки знаків після коми, як ви хочете. Джейсон Хіршхорна: Так що я роздрукувати 10 десяткові плями. І тепер ми бачимо, що ми отримуємо деякі дивні речі. І це сходить на ваше запитання про плаваючою комою неточність. Там у дивні речі зберігаються тут. ОК, чи означає це відповідь на ваше запитання? Що ще ви хочете швидко кодувати? СТУДЕНТ: Я просто хотів, щоб побачити або ні, якщо ви звільнили деякий покажчик, ще чи що покажчик зберігали в це також адреса, якою вона була вказуючи на раніше. Джейсон Хіршхорна: ОК, так давайте зробимо це. Чара зірка PTR, це створює змінну називається PTR з символьного типу зірки. Як написати Танос? Олден? ALDEN: Просто Танос. Але тоді він повинен бути розмір і в цьому випадку, я думаю, ви б вказувати на символ. Так що це буде символ. Джейсон Хіршхорна: ОК, так що більше загалом, всередині - давайте редагування. Усередині Танос, ви хочете, щоб ряд байтів в купі. Як правило, те, що ми бачили, що ми робити це ми збираємося Malloc рядка, наприклад, або масиви цілих чисел. Так що якщо ми хочемо 10 цілих чисел, або 10 символи, 10 дасть нам 10. А потім розмір символів дасть нам, що розмір символів, які в цей випадок 1 байт. Ми отримуємо 10 байт. Якби ми мали написати розмір Int, що дасть нам 40 байт. Так в більш загальному, всередині Танос є кількість байт ви хочете. У цьому випадку ми отримуємо 1 байт. Які здається дивним використання з Танос, але для нашого мети має сенс. Так що є що. Ми збираємося дзвонити безкоштовно. Ми від нього позбавитися, і ми використовуємо PTR знову. І що ж ви хочете перевірити? СТУДЕНТ: Я просто хотів перевірити, чи є чи ні, чи було щось всередині нього. Джейсон Хіршхорна: Так чи він вказав ні до чого? СТУДЕНТ: Так, точно, чи є він як і раніше була адреса пам'яті. Джейсон Хіршхорна: Отже, ви хочете щоб перевірити значення PTR? СТУДЕНТ: Так, саме так. Джейсон Хіршхорна: Що я пишу тут якщо я хочу перевірити значення точка - що це, Йорданія сказав, значення? Або те, що зберігається всередині PTR? СТУДЕНТ: адреса пам'яті. Джейсон Хіршхорна: адреса пам'яті. Так що якщо я пишу тільки в цьому, воно буде дайте мені значення PTR. І як я можу роздрукувати адреса пам'яті? Що рядок формату для адреси пам'яті? СТУДЕНТ% р. Джейсон Хіршхорна:% р. % С є рядком. % Р для покажчика. Чи так це? Це правильно. Так PTR одно - вона досі щось у ньому. Це, ймовірно, більш цікаве питання. Що це лінія робити? СТУДЕНТ: Seg несправності. Джейсон Хіршхорна: Що? СТУДЕНТ: Я думаю, що SEG недоліки. Джейсон Хіршхорна: Хм? СТУДЕНТ: Я думаю, що це SEG несправність. Джейсон Хіршхорна: Так ця лінія з коду, зірки PTR, що робить зірка на увазі? СТУДЕНТ: Зміст. Джейсон Хіршхорна: Так. До отримати вміст. Так що це буде йти в пам'ять звернутися туди і дати мені це. Я використовував% о прямо тут, тому що там зберігаються символи. Таким чином, ми збираємося піти на цей адресу ми тільки що бачив - або це, ймовірно, буде трохи відрізняється в цьому раз, коли ми запустити програму. Але ми підемо за цією адресою які ми знаємо все ще існує і подивитися, що там. Так що не SEG несправність. Це просто не дають нам нічого. Це, можливо, насправді дає нам щось, ми просто не можемо побачити його. І це сходить до цієї ідеї - і ми не збираємося, щоб отримати занадто багато в це, тому що це за межами Обсяг цього курсу. Але ми говорили про прямо тут, якщо ми вийшов за межі масиву на 1, ми не могли б потрапити в біду. Іноді, коли ви просто піти на 1, ви робите щось неправильно, і ви може потрапити в біду. Але ви не завжди потрапляють в неприємності. Це залежить, скільки про поганий речі ви робите, ви збираєтеся потрапити в біду. Який не повинен сказати, бути неакуратним з вашим кодом. Але це сказати, програма не буде завжди кинути палити, навіть якщо ви йдете куди-небудь ти не повинен йти. Хорошим прикладом цього є, багато люди в їхні проблеми набір 3, які був 15, не перевіряв Межі борту. Таким чином, ви дивилися наліво, подивився на Добре, подивився на вершину, подивився на дно. Але ви не переконаєтеся в тому, верхня був насправді відбувається, щоб бути на борту. І багато людей, які зробили це, і Виявилося, що в їх програма працювала відмінно, тому що, де, що дошка була зберігаються в пам'яті, якщо ви пішли один над ним або перевірити, що пам'ять адресу, не було нічого, особливо жахливо про це, так що ваша програма не була збирається кричати на вас. Але ми все одно зняти окуляри, якщо ви не переконаєтеся, що, так як вам робили те, що ви не були повинен робити, і ви могли б отримали в біді. Розбіжності, проте, ви, ймовірно, цього не зробили. Так що це, щоб показати, що, так, ми все ще можемо йти до неї. І ми не отримуємо в Біда в цьому випадку. Якби ми спробували зробити читати Наступні 100 символів, ми б ймовірно, потрапити в біду. І ви можете написати читання наступного 100 символи, якщо ви хочете, роблячи деякі роду цикл. Так. СТУДЕНТ: Так як ми були призначені, що простір фактичне значення, ми не були б насправді бути в змозі бачити нічого. Може бути, спробувати його з установкою, що так само як і в С або ще що-небудь? Джейсон Хіршхорна: Хороше питання. Як мені встановити це значення - що рядок коду я пишу на лінії сім робити те, що ви сказали? СТУДЕНТ: Зірка PTR дорівнює одній цитата C кінець одинарні лапки. Джейсон Хіршхорна: Так це покласти персонаж, с, в цьому місці, бо знову, що зірка означає піти в туди. І при використанні на лівій стороні Оператор присвоювання, що становить підписати, ми не збираємося, щоб отримати, що значення так як встановлено, що значення. Тепер давайте подивимося, що станеться. Ми покласти щось є і це було там. Ми назвали безкоштовно. Деякі речі, ймовірно, сталося в купі. Так що це не там більше. Але знову ж, ми не отримуємо в проблему йти туди. Я роблю це в коді, щоб проілюструвати що багато з них питання, які у вас є, що вони дійсно цікаво відповідає багато часу. І вони дійсно хороші питання. І ви можете зрозуміти їх на свій власний, якщо, наприклад, ми не в розділі. Так. СТУДЕНТ: Тому що ти не посилає покажчик у будь-якому місці, ви повинні використовувати Танос? Джейсон Хіршхорна: Так це сходить на ваш початковий питання. [? ?] Невже це всього лише локальна змінна? Malloc тут не те, що переконливими. Використання Танос тут не що переконливим, тому що це просто локальна змінна. СТУДЕНТ: Так не могли б ви зробити символ зірки PTR дорівнює Привіт? Джейсон Хіршхорна: Ох. Так що ми збираємося тепер повернутися на ваш початковий питання. Я думаю, що ви не були задоволені з моєю відповіддю. ОК? Як це? СТУДЕНТ: Так. Зачекайте. Джейсон Хіршхорна: А де Ви хочете роздрукувати? Таким чином ми будемо роздрукувати рядок, як це? СТУДЕНТ: Цікаво. Джейсон Хіршхорна: Так що це говорить, що це Аргумент має тип характеру. Так це має бути характер. СТУДЕНТ: Просто бере перший. Джейсон Хіршхорна: Так що це це те, що я сказав раніше. Як я вже сказав, це не зберігання рядок всередині змінної покажчика. Це зберігання - СТУДЕНТ: Перше значення рядка. Джейсон Хіршхорна: адреса перше значення рядка. Якби ми мали роздрукувати це, ми отримання значення всередині покажчик. І ми будемо бачити, що це, справді, адреса пам'яті. Чи має це сенс? Вибачте. Зачекайте, Я відповів на ваше Питання, однак? СТУДЕНТ: Так. Джейсон Хіршхорна: Цей рядок коду є створення рядок і потім ще один змінна-вказівник, який вказує в цьому рядку, що масив. Так. СТУДЕНТ: Так що, якщо ми пішли один спогад звернутися далі, буде отримуємо ч? Чи була вона зберігається у вигляді рядка? Джейсон Хіршхорна: Мовляв, ми зробили - так що це цінний зробити. Це арифметика, які ви, хлопці, бачили раніше, і повинні бути відносно комфортно. Це схоже на те, писати - якщо ми повинні були написати цей рядок коду, ми бачили нотації масиву раніше. Це повинно дати нам другий Значення в цьому масиві, ч. Якби ми зробили це, це повинно також дати нам друге значення в цьому масиві. Тому що це буде не в пам'ять адресу першого річ, але адреса пам'яті речі один старше. І тоді зірка оператор разименовивает що покажчик. І знову ж, давайте подивимося. Ми отримуємо ч знову. СТУДЕНТ: Що саме робить разименовать означає? Джейсон Хіршхорна: Dereference є химерне слово для піти. К, що і отримати те, що там є разименовивать покажчик. Це просто химерне слово для цього. СТУДЕНТ: Якби ми хотіли друку вся рядок, міг ми зробити амперсанд покажчик? Джейсон Хіршхорна: Добре, ми збирається зупинятися тут. Ми збираємося закінчується. Ampersand дає адресу розташування, тому, коли ви робите амперсанд з змінна, це дає вам адресу де зберігається ця змінна. Ampersand покажчик дасть вам адреса PTR де PTR знаходиться в пам'яті. Ми не збираємося йти на з цим прикладом. Ви можете з'ясувати це речі на свій розсуд. Але знову ж, це може бути навіть на межі трохи понад те, що вам потрібно знати для обсяг цього середньостроковій перспективі - або цей тест, а. Вибачте. Ми збираємося рухатися далі, тому що я б подобається робити одну проблему кодування перед час минув. І ми збираємося запрограмувати те, що я думаю, є найбільш переконливим з них приклади, atoi. Так що це було питання про вікторина два роки тому. І у мене є його на дошці тут. Люди запитали щодо вікторини - їм дали трохи більше tesxt в питання, але я усунені Текст, тому що це було непотрібним для наших цілей зараз. Це було лише деякі фон від того, що atoi зробив. Але ви всі знаєте, і дуже знайомі з atoi. Я пропоную вам закодувати це на аркуші паперу. Я також пропоную вам використовувати стратегію що ми перейшли багато в нашому розділі. По-перше, переконайтеся, що ви розумієте, що atoi робить. Намалюйте або придумати деякі уявний образ нього в голові. Далі, виписати псевдокод для цього. На вікторині, якщо все, що ви отримуєте, псевдокод, принаймні, ви покласти щось вниз. А потім відобразити цю псевдокод на С. Якщо у вас є чек у вашому псевдокод, як перевірити, якщо щось є 1, що відображається на, якщо стан і так далі. І, нарешті, код програми в С. Так повернемося до atoi і зайняти п'ять хвилин закодувати це на аркуші папір, яка, ймовірно, про кількість часу, ви б взяти на вікторина для кодування atoi. Від п'яти до 15 хвилин, від п'яти до 12, від п'яти до 10 хвилин, про розмір раз, коли ви витратили б на це Питання в вікторині. Так що беріть п'ять хвилин, будь ласка. І якщо у вас є які-небудь питання, підняти ваша рука, і я прийду навколо. [SIDE БЕСІДИ] Джейсон Хіршхорна: Отже, що було п'ять хвилин. Це було, мабуть, близько розмірі раз, коли ви витратили б на тому, що на вікторині, може бути, нижня межа того часу. Ми будемо Нагадаємо в небагато. Почнемо кодування це. І якщо ми не отримуємо все шляхом, Відповіді на цей і цей питання вікторини доступні, знову ж таки, Осінь 2011, коли це питання з'явився на вікторині. І це коштувало вісім очок на вікторині то. Вісім очок знаходиться на високому кінці кількість точок щось стоїть. Більшість питань знаходяться в діапазоні від одного до шести очок. Так що це більш складним Питання, звичайно. Хто-небудь може починайте мене? Як правило, те, що ми збираємося хотіти зробити з цим функціонувати atoi, логічно? Що ми хочемо зробити? Так що ми збираємося написати деякі псевдокод. СТУДЕНТ: Перетворення символів в цілих числах. Джейсон Хіршхорна: Перетворення символів в цілих числах. ОК. Так скільки символів ми будете потребувати, щоб пройти? СТУДЕНТ: Всі з них. СТУДЕНТ: Всі персонажі в рядку. Джейсон Хіршхорна: Всі символи в рядку. Так що, якщо ми хотіли піти через кожен символ в рядку, що це річ, в С ми бачили, що дозволило нам пройти через кожен символ в рядку? СТУДЕНТИ: для петлі. Джейсон Хіршхорна: для петлі. Так що ми збираємося для перебору кожен символ в с. Тоді що ми будемо хотіти зробити коли ми отримуємо специфічний характер? Скажімо, у нас ви отримуєте прийняв 90. Ми отримуємо 9. Це символ. Що ми хочемо зробити з що характер 9? СТУДЕНТ: відняти його з характеру 0? СТУДЕНТ: Додати 0? Джейсон Хіршхорна: Відніміть це від характеру 0? СТУДЕНТ: Так. Джейсон Хіршхорна: Чому Ви хочете це зробити? СТУДЕНТ: [нерозбірливо] значення. Його внутр значення. Джейсон Хіршхорна: Отже, ми беремо характер 9, відняти його з характер 0, щоб отримати фактичне ціле 9. Солодкий. І як ви знаєте, що характер 9 мінус 0 персонаж 9? Що діаграма ти дивитися? СТУДЕНТ: Є логічно дев'ять місця між 9 і 0. Або ви могли б подивитися на таблицю ASCII. Джейсон Хіршхорна: таблиця ASCII. Але так, ви праві, а також. Таким чином, ми віднімаємо 0. Так що тепер у нас є ціле 9. І те, що ми хочемо робити з цим? Якщо у нас є 90, це перше ціле ми, що ми хочемо зробити? СТУДЕНТ: я б поставив в тимчасовому цілого масив, то зробити математику до нього пізніше, щоб зробити його в кінці. Джейсон Хіршхорна: ОК. СТУДЕНТ: Ви можете почати в кінці масив, а потім рухатися вперед так що кожен раз, коли ви рухатися вперед, помножити його на 10. Джейсон Хіршхорна: ОК. Це звучить, як досить переконливі ідея. Ми можемо почати в кінці нашого масиву, і ми можемо використовувати strleng. Ми можемо використовувати strleng тут. Ми отримаємо довжину нашої рядка. Ми починаємо в кінці. І + перший, ми просто вважати, що ціле число, і, можливо, ми створюємо як Новий ціла змінна нагорі, де ми зберігаємо всі. Таким чином, ми петля через кожен символ вхід з з задом наперед, ми віднімаємо 0, і то візьмемо його, і залежно від де він знаходиться, ми множимо його на ступінь 10. Тому що перший, що ми помножити крайню праву цифру по? СТУДЕНТ: 10 до 0. Джейсон Хіршхорна: 10 до 0. Що Помножимо другий правий характер по? СТУДЕНТ: [нерозбірливо]. Джейсон Хіршхорна: Що? СТУДЕНТ: 10 до 1. Джейсон Хіршхорна: 10 до 1. Третій-правий персонаж? СТУДЕНТ: 10 до 2. Джейсон Хіршхорна: 10 до 2. СТУДЕНТ: Вибачте, я не розумію, що ми робимо тут. Джейсон Хіршхорна: ОК, давайте повернемося, то. Так що ми збираємося, щоб отримати пройшло в рядку. Тому що ми пишемо atoi. Таким чином, ми отримати пройшло в рядку. Скажімо, у нас ви отримуєте пройшло в рядку 90. Перше, що ми збираємося зробити, це встановити новий ціла змінна, що ми просто хочу, щоб створити в якості нашого нового цілого числа. Це те, що ми збираємося повернутися в кінці. Ми повинні пройти через кожен символ в рядок, тому що ми вирішили, що ми повинні торкнутися кожного і потім додати його в наш новий цілого числа. Але ми не можемо просто додати його у вигляді числа. Ми не можемо просто взяти 9 і додати 9 до нашої цілого числа. Це залежить від того, яке місце це в рядку. Ми збираємося потрібно помножити це на ступінь 10. Тому що, як база 10 робіт. Так що ми збираємося, щоб отримати фактичне характер, або фактичний ціле число, шляхом вирахування характер 0 від характеру 9, як ми зробили з віднімання символів капіталу з будь-якого характеру ми мали в одному з ці проблеми. Тому ми насправді отримати число від 0 до 9 збережений як дійсне число, і ми будемо помножити його на ступінь 10 в залежності від того, де ми знаходимося в рядок. А потім ми збираємося додати його назад в наш новий цілої змінної. Так що ж це буде виглядати буде бути - ми будемо малювати тут. Якщо нас передаються в рядку 90 - СТУДЕНТ: [нерозбірливо]. Джейсон Хіршхорна: Але atoi приймає рядок. Так що ми збираємося пройти через проведення. Ми будемо отримати пройшло 90. Ми йдемо від задньої до передньої. Беремо 0. СТУДЕНТ: Мені дуже шкода. Може бути, це нерозумно. Якщо ми стаємо пройшло в рядку, чому 90 те, що ми отримувати передані в? Оскільки 90 є цілим числом. Джейсон Хіршхорна: Тому що atoi бере рядок і перетворює його в ціле уявлення цього рядка. Але рядок 90 не є цілим числом 90 або № 90. Рядок 90 є масивом з двох, або три символи, швидше, 9 характер, 0 характер, і зворотний слеш 0 характер. І ми пишемо atoi тому, що для Наприклад, коли ви берете на себе команду Аргумент лінія, і вона зберігається в агду, він зберігається у вигляді рядка. Але якщо ви хочете, щоб розглядати його як числа, вам потрібно перетворити його в Фактичне число. Який ми зробили одну з наших проблемних множин. Який ми зробили в ряді з наших проблемних множин. Все, що взяв ціле як аргумент командного рядка. Так ось чому наша функція atoi приймає рядок. Отже, ще раз, у нашому прикладі, ми збирається взяти останній. Ми збираємося відняти характер 0 з нього, тому що персонажі 0 віднімається за характером 0 дає фактичне число 0, відповідно до ASCII математика, що ми робимо. Тому що персонажі представлені у вигляді відрізняється від їх фактичне - характер, наприклад, в нижньому регістрі 97. Це не - ой! Це не все, що можна було б очікувати щоб це було, 0, наприклад. Таким чином, ви повинні відняти характер, щоб отримати 0. Так що ми збираємося зробити, що тут щоб отримати реальне число. А потім ми збираємося помножити його на ступенем 10 залежно від того, де знаходиться в рядок, а потім прийняти, що і додати його в наш заповнювача змінна, щоб ми могли придумати наша остаточна нова ціле. Чи означає це, має сенс для всіх? Так що ми не збираємося, щоб закодувати це прямо зараз, тому що ми отримувати мало часу. Я прошу вибачення за термінах, що. Але це те, що, як ми сподіваємося, ви б бути в змозі зробити на вікторині - на принаймні, отримати цей псевдокод виписали. І потім, якщо б ми мали написати псевдокод, насправді, ми могли б зробити це досить швидко. Кожен рядок коментарів, які ми ми писали тут перекладається як про одна лінія C коду. Оголошення нову змінну, листи петля, деякі віднімання, деякі множення, а деякі призначення. Ми б, ймовірно, також хочуть, щоб написати зворотну лінію. Ми могли б також хочу поставити деякі перевірки в тут. Так. СТУДЕНТ: Так чи можемо ми розглядати з як реальну рядок? Тому що я знаю, що це просто адресу. Мовляв, як би ви отримати довжину рядок передається через? Джейсон Хіршхорна: Так як же Довжина рядка? STRLEN. СТУДЕНТ: STRLEN, так. Але ви можете покласти сек як Аргумент для цього? Джейсон Хіршхорна: Так STRLEN приймає символ зірку. І випливає, що сЬаг зірку, і це продовжує відлік, поки він не потрапляє в зворотний слеш 0. STRLEN було насправді один з інших програм, які ми збиралися коду. Ось ще один хороший один для коду. Це один трохи легше, тому що, якщо Ви будете думати про те, що концептуально - Я тільки що сказав це вголос - STRLEN наступним покажчик і продовжує йти і вважаючи і не відстежувати до ви досягнете зворотну косу риску 0. СТУДЕНТ: ОК, отримав його. Джейсон Хіршхорна: Так краще удачі на вікторині 0 завтра. Якщо у вас є які-небудь питання, я буду бути поза після цього. Не соромтеся, пишіть мені. Зверніться до вашого власного TF, якщо ви не в моєму розділі, або отримати мій електронною поштою, якщо ви хочете його. Якщо ви хочете хвилюватися і просто відправити мені електронною поштою, Freakout лист, я буду відправити тебе назад, як, усміхнене обличчя, або, як, жарт або щось. Так що не соромтеся зробити це також. Удачи знову, і я буду бачити вас усіх на наступному тижні.