JASON Hirschhorn: Welcome да A5, всички. Ние имаме една вълнуваща седмица напред от нас, най-вече, защото има толкова много нови изправена в тази стая. Това е чудесно. Много от вас са тук по случайност, което е дори по-добре. Така че се надяваме, че ще продължаваме да се присъедини към нас. Тази седмица ние ще прекарат по-голямата част от раздел подготовка за теста. Така че на нашия дневен ред, ние ще говорим малко за ресурси за този клас, но също така и за теста, и след това, отново, прекарват по-голямата част от класа приказки за въпроси. След като сме готови отговорите си въпроси, или ако вашите въпроси естествено ни доведе до някои кодиране, I има примерни задачи от изпити минало, което ние ще се код на живо в раздел заедно, които също доведе до някои други добри теми да покрие. Така че, на първо място, тъй като ние сме вече за на последните няколко седмици, за да ви напомня, момчета, има един тон на ресурси на разположение за този курс. Много от тях ще бъде изключително полезно до вас, докато продължават да се учат за викторина 0, защото това е вторник следобед. Така че всички от вас са били учи за малко. Има записки от лекции и източник код, който трябва да Определено се провери. Гледайте шорти. Вижте study.cs50.net. И тогава, изброени по-долу, редица на други ресурси. Отново, викторина 0 е утре в 01 часа. Ако не сте го направили вече, проверете изложени на About Quiz 0 документ за Разбира началната страница, за да разбера където сте като викторина. Тестът започва в 01:10 часа и завършва 70 минути по-късно. Така че, ако се появи след 01:10, ти си ще се получи, че много по-малко минути от 70 да вземе теста. Така че се уверете, че сте там навреме. Ако сте студент, разширение или имат някои други съображения за изпитване, то може да не е в 01 часа утре. Но отново, проверете За викторина 0 документ, за да се уверете, че не знаеш кога сте като викторина. Написах 75минути тук. Мисля, че това е право, а не 70. Тя обхваща целия материал от една седмица 0 да лекция миналата седмица в сряда. И отново, за този тест, на който документ, можете да получите един двустранен и 8 1/2 от 11 лист хартия, че получавате да се използва като бележки по време на теста. Много хора, ако не и повечето хора, имат установено, че единственият най-полезен начин да учи за теста е да се да направи проучване на баланса дадено един-Сидер, на техните собствени. Така че погледнете последните такива, ако сте видели последните такива. Докоснете се до приятели, за да видим какво те слагат на техните. Но ръцете надолу, най-добрият начин можете да проучване е да мине през всичко и омаловажавам това до какво трябва или не трябва не принадлежи на този лист хартия, защото това е просто една наистина полезен начин за вас да се уверете, че , което става чрез всичко и има някои запознати с него. Повечето хора, които намираме, въпреки че те са листа хартия седи в непосредствена близост до тях на теста, не включвайте към него, тъй като, отново, че много процес на преминаване през информацията им е помогнала да го научат. Дали някой има някакви въпроси за викторина 0? Разполага с всички - Аз няма да направя с вдигане на ръка. Няма нищо. Щях да попитам кой Започнах да изучавам. Но аз не искам да ви направи не всичко вдигнете ръце. Така че, както казах - да, Ави, давай напред. AVI: Какво би било полезно нещо да постави на едно-пейджъра? STUDENT: Това е до вас. JASON Hirschhorn: Можете да получите да използват вашата преценка. Полезни неща, за да поставят на едно-пейджър ако сте объркани за голямото О Времетраене на различни видове търсения и какви ли не, сложи това там в удобен конте диаграма. По този начин, ако бъдете помолени, че на викторина, че не е нужно да се опита и фигура то навън или причина през време на работа. Можете просто да го копирате. Ако се вгледате в викторини минало, много пъти, има текущи въпроси от време. Така че е пример на добра нещо, за да се сложи на една-пейджър. Други добри неща, за да се облека, ако сте объркани за това как да се декларира функция или какво различните части на декларацията на функцията са, напиши че там, общ версия и тогава може би един пример. Ако сте объркани за указатели, диаграма за това как указатели работа е вероятно наистина полезно. Ако сте объркани за рекурсия, а опитате рекурсивно функция там да бъде наистина полезен би могъл да се окаже. Ли това, че ще ви даде някои идеи? AVI: Трябва да се разбере Целият процес на съставяне, като как това всички произведения? JASON Hirschhorn: Всичко че е покрита може се появи на теста. Въпроси - но пак, някои неща, които ще бъдат претеглена силно от други. Някои неща са дошли отново и отново в клас, в лекция, и точка. Други неща, които не са излезе, че често. Говорихме много за # включват и -Л нещо и какво означава тези, в процеса на компилация. Говорихме много за GDB, се придържат, тези различни флагове, които ние използваме, когато ние съставят нещо, и това, което make15, например, наистина означава и наистина го прави. Ние не говорим толкова много за всяка една стъпка в процеса на компилация. Ние сме все още говореше за това. Така че това е още нещо, което трябва да е запознат с. Но отново, ние няма да бъде - неща, които се появяват по-често в клас е по-вероятно да излезе повече често и да бъде по-силно претеглени на теста. Cool. Всякакви други въпроси за викторина 0? ОК, така че сложих списък на теми на дъската. Минах през учебната програма. Минах през секцията за преглед от снощи и тези слайдове да излезе с един неизчерпателен списък от теми че ние сме обхванати досега в CS50 и неща, които биха могли се появи на теста. Така че аз не отивам да мине през всеки един от тях. Това ще отнеме много повече време, отколкото имаме сега. Но сложих това до тук, за да се надяваме, че бутам паметта си като към неща, които могат да или не може да бъде толкова запознат с вас. Много бих искал да прекара по-голямата част от раздел отговори на вашите въпроси за Тези теми, теми, които не са обхванати тук. Можем да напишем псевдо код. Ние може да напише реално код за да се гарантира, че вие ​​- Не мога да отговоря на въпроса ви и да ви помогне всички коренно се разбере Много от тези теми, така че вие ​​ще се чувствате подготвени и комфортно да навлиза в утре теста. Затова четете над списъка. Вие се надяваме, са дошли в раздел с някои въпроси, както добре. Когато сте готови, вдигнете ръката си и ние ще започнем. Имайте предвид, въпроси, които имате, че няма глупави въпроси. Чували сме, че много. И въпросите, които имате, аз съм готов да се обзаложим, много други хора, както седя тук и да гледам онлайн има, както добре. Така че може само да помогне на хората чрез задаване на въпроси. Marcus. MARCUS: Между стека и грамада, има ли предварително разпределени процент на паметта, която е определена като това е за комина или за купчината? Или как става това, по-точно? JASON Hirschhorn: Great въпрос. Отивам да се проследи назад малко. Дали всички - моля да бъда честен тук. Знам, че те моля да вдигнете ръка пред своите връстници. Но има хора, които се чувстват чувстваше некомфортно на стека и Купчината и биха искали да отидат през този и какво означава това? Вдигнете ръка, ако - OK. Благодаря. Така че ние ще отидем над купчината и купчината наистина бързо и след това премести в отговорите на въпроса ви. Така че, ако ние извади кутия да представлява с памет на вашия компютър, какви са някои неща, които отиват в тази кутия? Main. А основната функция. Откъде идва основният отидете? STUDENT: [недоловим]. JASON Hirschhorn: Така че ние ще постави главната тук. Какво друго отива в тази кутия? STUDENT: Функциите, които ви се обаждат. JASON Hirschhorn: Функциите което ние наричаме. И къде отиват те? STUDENT: В стека. JASON Hirschhorn: Те отидете в стека. Така че ние ще наричаме това нещо тук стека. И до върха, имаме куп. Така че паметта не е кутия точно като това. Но това всъщност е доста сходен. Това ще бъде много кутии над и повече, в зависимост от това колко е голяма вашата компютър, е или колко е голяма вашата памет е. В кавички "дъното" е стека. И има няколко неща, които отиват в стека. И тези, които зависят от функциите Имате ли в кода си. Винаги има една функция във вашата код, наречен главен, така че винаги има раздел надолу тук, в стека посветена на главната. Тези секции в стека се наричат ​​стека рамки. Когато ти се обадя и друга функция, да кажем основната призовава бинарна функция за търсене, ние поставяме друга рамка на стека. По-специално, ние ще дари парче памет на нашия компютър, за да се съхранява двоично търсене на местно променливи и да стартирате изпълнимия файл на код за търсене. Така че ние наричаме двоично търсене. В това парче памет, отиваме да съхранява своите локални променливи. Отиваме да съхранявате своите ФОРМАТ разговори. Каквото и да стане, тази функция е ще трябва да се съхранява там. Binary търсене ще се изпълни. Това се случва, за да завършите изпълнение. Каква е думата в C, който показва че дадена функция трябва да завърши изпълнението му? STUDENT: Върни. JASON Hirschhorn: Завръщане. Така че всеки път, когато те видя изявление възвръщаемост, Краищата на функционалните когато го удари това. Така двоично търсене ще се появи неговото връщане. Тази част от паметта ще същество бъде освободена. И основната ще се върне към изпълнение. Така че основната ще направи пауза, където беше, повикване двоично търсене, да получите някои върнатата стойност, и да продължи изпълнението. Тази купчина рамка ще си отиде. Ако ние наричаме рекурсивен функция, която е функция, която нарича себе си над и отново, ние може да получи - ние казваме, Направих двоично търсене рекурсивно. Ние може да получи двоично търсене версия едно, двоично търсене две, двоично търсене три, четири двоично търсене, двоично търсене пет. И тогава този последен двоично търсене пет ще удари основния случай, и топчето рамки, ще се върна и да пазят затваряне докато се върнем към основното. Можем да отидем в рекурсия малко. Но всичко това е да се каже, ако сте призовава множество функции в даден момент, Ще бъда там множествена стак кадъра в стека. Купчината, от друга страна, се тук, не е за функции, не за локални променливи. Това е за динамично разпределени променливи. Така че това са променливи, които могат да бъдат инициализира в двата главната или функция, която основните разговори. Навсякъде в кода си, те може да се инициализира. И за да се инициализира динамично разпределени променлива. Каква функция в C да използваме? STUDENT: изчистване. JASON Hirschhorn: изчистване. Ти наричаш изчистване. Можете да получите пространство на паметта. И това пространство на паметта е на куп. И това пространство на паметта остава там, докато ти се обадя безплатно. Така динамично разпределени променливи в грамада ще съществува толкова дълго, колкото можете искам те да съществуват, и те няма да си отиде, докато не е изрично да им кажа да си отиде. Можете да ги създаде в една функция. Стак Тази функция е Рамката ще си отиде. Но това все още ще съществува променлива в купчината, докато не бъде освободен, потенциално от функцията, която се нарича двоично търсене или нещо такова. Така че тези куп променливи остават там толкова дълго, колкото искате те да останат там. И те се поставят тук. И след това на следващия един получава сложил там. Те продължават да стават все попълнени, и те остане там, докато ти се обадя безплатно. И по същество, на куп и стека, Как да стигнем до въпрос Маркъс, растат един към друг. И ако те работят в една друга, вие сте използва всичката памет във вашата компютър, и вашата програма ще се откажат защото не е нужно повече памет оставя да се използват. Между тях има потенциално други неща. Но за обхвата на този курс, вие не е нужно да се притеснявате за това. Така че това е отговорът на вашия въпрос. Не се тревожете за това. Но това беше отдавна отговора. Всичко, което трябва да знаете е грамада и топчето ще - един започва от дъното. Стекът прави. Купчината е там горе. Те ще растат по-близо един до друг. И ако те докосна, че е проблем. Вие се наредиха на паметта. Но също така, в допълнение към знае къде те са това, което се съхранява в двете стека и купчина. Къртис. CURTIS: Когато те се сблъскват, е, че за препълване на стека? JASON Hirschhorn: Когато те се сблъскват, това не е препълване на стека. A препълване на стека е различна област че можем да отидем, ако искате да. Добре, ще се върна на това след малко. STUDENT: Какво е думата, наречен когато те удари друг, стека и на куп? JASON Hirschhorn: За сега, не се притесняваш. Просто знам - Аз ще отговоря на този въпрос след края на тренировката. Ако те управляват един в друг, да избяга на паметта, защото няма по- пространство там. STUDENT: Съжаляваме, какво е виновен един сегмент? JASON Hirschhorn: A сегмент Вината може да се нарича за - това зависи защо се нарича грешката на сегмента. Понякога си препълване на стека, че ще казват сегмента вина, тъй като грешките. Студентът: Ами dereferencing нулев променлива? Това ли е виновен за сегмента? JASON Hirschhorn: Dereferencing нулев указател - ОК, така че ако имате указател, че сте определя като равна на нула, показалки, изземване, магазин адреси на паметта като техните стойности. И нулев указател е по същество съхраняване на 0, 0-та справяне в тази променлива. Така 0x, 0, 0, 0, 0, и така нататък. Това 0-ти адрес в паметта, която не е в нашата представа, че е там горе някъде, че е резервиран за компютъра. Не ни е позволено да го докосна. Така че, когато вашата програма изпълнява, ако нещо се опитва да отиде в паметта адрес 0, тя знае, че че е празна стойност. Той знае, нищо не трябва да бъде там. Така че, ако се опитате и да се използва нещо там и лечение на нещо подобно там или Опитвам се да отида до това място, вие сте Ще получите сегмента вина или грешка. Това отговаря ли на въпроса ти? И сега ще се върнем до препълване на стека. Нещата в комина, като вие имате виждали преди, по - нека да се направи в близост съставени от една купчина рамка. Всеки ли може да се види, че? Така че ние имаме нашия стак рамка. Спасяваме масив в като местен променлива в тази функция. Да предположим, че нашият масив има пет места. Всички пет от тези, които ще се съхраняват в тази купчина рамка. Ако започнете да пишете на отвъдното границите на този масив - Така че, ако ние започнем да пишем в, нека да кажем, че е 0. Това са пет индекси на нашия масив. Ако започнете да пишете в индекс 5, който ние нямаме, когато имаме масив с размер 5, ние започнете да пишете в индекс 6, 7, 8, 9, ние можем да получите Stack Overflow грешка. Като цяло това не е - най-вероятно ще получите в беда ако отидеш от едно. Но като цяло, вие ще получите в най-неприятности, ако отидеш от много и ще отида толкова далеч над това ти пиша над връщане адреса на това функция, която се намира в долната част на рамката стак. Защото, нали? Вие - в - Съжалявам. Не ", защото наред." В рамките стак, имате Вашите локални променливи. В самото дъно на стека рамка е обратен адрес. Това е, когато функцията отива, когато всичко свърши. И ако я презапишете връщане адрес, тогава, когато това стека рамка, когато ти започваш чрез стека рамка и изпълнение на всяка линия, вие сте ще отиде в новия си адрес за връщане , което е написано там, вместо на застроена един. И това е начина, по който съм виждал някои нарушения на сигурността може да се случи с компютри. Така препълване на стека, накратко, е, когато презапишете страна в топчето вие трябва да използвате, местният променлива, което се очаква да се използва, и по-специално, когато започнете презаписване важни неща, като обратен адрес. И това е мястото, където ще получите съобщение за грешка. Или може би дори бихте могли да започнете дори в писмен вид - казват двоично търсене е точно над главния. Ако презаписано от много, вие би могъл да напише в главната. Но като цяло, можете да получите грешка преди след това, тъй като компютърът знае правиш нещо, което не трябва да се прави. Да. STUDENT: Каква е разликата между препълване на стека и препълване на буфера? JASON Hirschhorn: препълване на буфера е по-общ вид това, което току-що описах. УЧЕНИК: Значи една препълване на стека е пример за препълване на буфера. JASON Hirschhorn: Точно така. Това е масив, можем да мислим като един буфер, пространство за неща, за да ходят инча Това е препълване на буфера стак. Ние може да има един куп препълване на буфера. Ако е буфер, който често е масив на куп, и ние презаписано от тези граници, тогава ние ще има един куп препълване на буфера. И извън обхвата на този курс, те са открити малко по различен начин. Компилаторът има специален начини за откриване на всяка. Но препълване на буфера е по-общ вид на това, което е описано, което е препълване на буфера стак. Знаете, че отговоря на въпроса ти? Sweet. Имаше ли някакви други въпроси, свързани до комина или на куп? Да. STUDENT: Знам, че трябва да свободни струни защото те са в купчината и вие не искате да протекат памет. Но не трябва да се освободи глобални променливи и подобни неща? Или са те автоматично освободен? JASON Hirschhorn: Добър въпрос. Така че в CS50.H, ние създаваме това нещо за вас нарича низ. Низ е наистина това, което? STUDENT: Char звезда. JASON Hirschhorn: A Чар звезда, показалка до даден символ, указател към набор от символи. Това е, което е низ. Така че ние трябва да го освободи, защото getstring, които ние използвахме много - име низ равнява getstring - че mallocs за нас някои памет на трупа и след това се връща указател към първа характер на тази низ, Чар звезда. Така че, уж, ако не сте били писането безплатно на някоя от вашите струни че ти се обадих досега, имате е изтичане на паметта. Разбира се, ние не сме говорили за него, така че никой не се е намерила в неприятности за да го прави. Но върви напред, да. Когато ти се обадя getstring, ти си mallocing малко място на куп. И ако не се обаждате безплатно по-късно, че низ, имате изтичане на памет. Това отговаря ли на въпроса? Да STUDENT: Така да направим това, ние използваме свободно право преди завръщането? Подобно, в обхвата на, предполагам, ако ние казваме, като, INT главната, в рамките на обхват от кода, която е в рамките на тези фигурни скоби, точно преди - Знаете ли къде си искате обикновено слагам замяна. Да ви постави безплатно преди това? JASON Hirschhorn: Така че можете да сложите безплатно навсякъде, където искате да поставите безплатно. Защото това са динамично разпределени променливи, тъй като те могат живеят извън обхвата на конкретен функция, ако ти се обадя изчистване в отделна функция, например, getstring, можете да се обадите безплатно в основния. Не е нужно да го нарека в специфичната функция където изчистване се нарича. Но нали трябва да го наричат преди основните възвръщаемост. И това наистина зависи. Тя зависи от това защо malloced че пространство на първо място. Някои хора ще се обаждат освободи доста бързо. Някои хора няма да се обаждате безплатно до В края на програмата си. И те ще отидат чрез и безплатно всичко. Тя зависи от това защо сте се обадили изчистване. Студентът: А какво ще кажете ако сте се обадили използване getstring? Ще кажа свободно какво? JASON Hirschhorn: Така синтаксиса безплатно е просто безплатно, отворени Paren, близо скоба, и името на показалеца. Така че, ако ти пиша струнни име равни getstring, да поставите име тук. Това е името на показалеца. И тя знае, че, за да освободите памет. STUDENT: Така че, когато го освобождава, че паметта, показалецът все още сочи към това място в паметта? Или е показалеца и изпразнени от адреса, че да сочи към. JASON Hirschhorn: Ние трябва да се опитаме това. Ние трябва да се кодира това. Нека да се върна, когато стигнем до кодиране, и нека да се кодира това. И ако искате да разберете отговора на това, че може също така да кодира междувременно. Но това е чудесен въпрос. STUDENT: Възможно ли е да безплатно нещо твърде скоро? Така че все още нужда от него за вашата програма, и ти остави това пространство памет? JASON Hirschhorn: Да. Възможно е, ако нещо безплатно и след това да го използвате отново, ще тичам в грешка. Но това е за вас, защото сте освободен нещо и след това да го нарича по-късно. Така че това е грешка на програмист. Но да. Ти би могъл да напише това. Всякакви други въпроси, свързани с - Да. STUDENT: Така че, ако се предполага, че само го освободи като цяло преди началото на Програмата приключва, това означава ли, ако на Програмата приключва и не го освободи, че паметта е все още разпределят? JASON Hirschhorn: Ако вашата програма завършва и сте пропуснали да освободи нещо, а след това че паметта е разпределена в целия на живота на вашата програма. Когато вашата програма се затваря напълно, че паметта не се случва да остане там завинаги. Компютърът е достатъчно умен, за да знам че когато програмата се затваря, то трябва да се отървете от всички на паметта, която е свързано с тази програма. Все пак, има инструменти, с които могат да работят относно програма за откриване, ако, когато програма приключи, сте забравили да освободите памет. И за следващия си проблем зададете където което ще се използва изчистване и използване указатели, ще се работи тази програмирате на вашата програма, за да видите, ако, когато основните данни, сте имали някакъв неща, които бяха оставени unfreed. Така те няма да останат malloced завинаги във вашия компютър. Това би било разточителство, защото много бързо, компютри да излязат от паметта. Но ако те продължат до края на своя програмирате и те не са освободени и си програма излиза, че е все още е проблем че този инструмент ще ви помогне да се отговори. STUDENT: Това Valgrind? JASON Hirschhorn: Това е наречен Valgrind. И ще бъде - STUDENT: Но ние не трябва да знаете че за теста, все пак? Искам да кажа, той е говорил за малко в лекция. JASON Hirschhorn: Така Valgrind е името на този инструмент. Знаейки това, което той прави, е достатъчно за теста. Но вие не сте го използва още на вашия проблем зададете, защото не сме имали проблем набор, който е изрично разгледан с изчистване или Използвате ли изчистване. Така че все още не са използвани Valgrind. Но вие ще го използвате по-рано по-скоро, отколкото по-късно. STUDENT: Можете ли да повторите какво Valgrind е? JASON Hirschhorn: Моля? STUDENT: Можете ли да повторите това, което целта на Valgring е? JASON Hirschhorn: Valgrind е името - като GDB ви помага да развенчава вашата програма, Valgrind ви помага да разбера, ако неща, които не са били освободени щом програмата се затваря. Така че ще го изпълни на вашата програма. И програмата ви излезе, и тя ще каже Вашата програма, наречена изчистване това много пъти за това много байта, и ви наречени свободни само това много пъти. И така сте оставили тези много байта без да бъдат освободени. Или ще кажеш, че съм освободен всичко. Добра работа. STUDENT: OK. И тя се нарича Valgring? JASON Hirschhorn: V-A-L-G-R-I-N-D. STUDENT: Актуален въпрос за указатели. Да предположим, че сте п звезда х е равно на нещо. Това се равнява, каквото сте пускането там, е, че това, което се поставя вътре какво х сочи, или показалеца на х? JASON Hirschhorn: Можете ли да повторя въпроса? Можем ли да го направи, докато го кажа? STUDENT: В теста, всъщност, на едно ни изпрати, беше като, Чар звезден истина се равнява CS50 скали, нали? Така че, не означава, че това, че CS50 скали е каква е истината сочи? JASON Hirschhorn: Значи говорим за Чар звезда в низ, как която работи? Да. OK. Да се ​​направи това тук. [SIDE РАЗГОВОР] JASON Hirschhorn: Така че тази променлива ще бъде от тип Чар звезда. Колко голяма е променлива от тип Чар звезда? Колко байта? СТУДЕНТИ: четири. JASON Hirschhorn: Това е четири байта. Колко човека е променлива от тип Int звезда? СТУДЕНТИ: четири. JASON Hirschhorn: Четири байта. Ако това е указател, то е винаги четири байта, понеже указатели, тяхното стойност е адрес в паметта. И адреси на паметта на CS50 уред са дълги четири байта. Така че, когато ние наричаме getstring, или когато ние да речем, stringname равни, а след това в двойни кавички пуснати низ, ние поставяме - Е, това е малко по-различна. Ние ще направим getstring като пример. Или Чар звезда нещо е равна на низ. Съжаляваме, дай ми пример че сте прочели? STUDENT: Чар звезда истина се равнява на "CS50 скали" в двойни кавички. JASON Hirschhorn: Така че тази звезда, това ние ще се обадя на тази променлива х за нашия общи цели. Ние създадохме променлива наречена х. Това е тип Чар звезда. Това е указател към серия от знаци. Така че тук долу - Така че това е начина, това би работят в паметта. Това ще се съхранява адрес на паметта. Тя ще се съхранява адреса на паметта на първия знак в масива. И тогава, когато сте следвали показалеца, бихте получи първия знак. И ако четете това нещо като низ, компютърът ви е умен достатъчно, за да знам, прочетете цялото това нещо , докато тя стигне до ответна реакция 0. Но ако сте го четете характер на известно време, така че сте итерации чрез този низ, тогава просто ще прочета характер в даден момент, докато не стигнем до наклонена черта 0. Това може да не отговоря на въпрос, все пак. Студентът: Да, но все още не сте malloced това пространство Все още за този показалка. JASON Hirschhorn: Така че аз не съм съвсем сигурен точно това, което търсите в, защото аз не направи това викторина. Това е трябвало да бъде полезен ресурс от друга TF. Ако желаете да създадете низ от подредят или като локална променлива, тя ще просто да бъде масив от такси, а не обикновено Чар звезда сочейки друг низ. Но аз не знам. Това може да е указател към друга низ в стека, както добре. Да. STUDENT: Знам, че трябва да разпредели памет, ако показалецът е Първи обявен вътре на друга функция. Трябва ли да направи същото нещо, ако това е да бъде обявен във вътрешността на главен, Вие го използвате вътре в главната? JASON Hirschhorn: Така че, да. Можете да декларирате указател към всеки адрес памет в паметта. Това може да бъде адрес на паметта на местно променлива, че често, хората не декларират адреси на паметта до локални променливи, защото те отиват далеч след като тази функция връща, които Ето защо ние обикновено изчистване неща. Но да, бихте могли да декларира указател към друга локална променлива. Това по принцип не е просто направено. Но аз мога да погледна в този нещо специфично след клас. Да. STUDENT: Мисля, че това е нещо като на какво се иска. Това ми се струва странно да се инициализиране указател не като адрес, но тъй като това, което изглежда като стойност. Тя изглежда като най-CS50 е това, което е вътре нещо се посочи и а не на реалната адрес, нали? JASON Hirschhorn: Така че това е не е така, все пак. Това не е това, което се случва. Когато Вие декларирате Чар звезда, това е адрес на паметта. Показалки са всички адреси на паметта сочейки към нещо друго. Това нещо друго може да бъде на стак, но почти винаги е на натрупам в начина, по който ще видите, че се използва. Но stringname равнява двойно цитат "Getstring", можем да видим, че и ние може да погледнете през това и код, който. getstring низ не се записва в тази променлива, или каквато и да е низ име не се записва в тази променлива, а не защото това е начина, указатели работят. Това прави ли смисъл? Студентът: Да. JASON Hirschhorn: OK. Надяваме се, че това не е объркваща за никого. Но ако е било, ние можем да го погледнете отново след малко, защото ние всъщност ще да се кодира нещо, което ще се надяваме работа с низове и да ви помогне да се чувствате по-удобно с тях. Всякакви други въпроси, свързани с тези теми или други теми, които Ще сложа обратно? И - точно сега. Да, Алдън. ALDEN: Така че това е напълно несвързани, но можем ли просто да отидем наистина бързо това, което ние трябва да знаем за разликата между 32 и 64-битова машина? JASON Hirschhorn: Да. Така че 32 бита е колко байта? ALDEN: Това е четири байта. JASON Hirschhorn: Това е четири байта. И 64 бита е колко байта? STUDENT: Eight. JASON Hirschhorn: Осем байта. Така че отново, осем бита е един байт. Вашият уред е CS50 32-битова машина. Така памет адреси са дълги четири байта. Има 2 до 32 адреси на паметта. 0 до 2 до 32 минус едно. И аз не съм положителен, но това е вероятно в обхвата на това, което трябва да знаете за 32-битова машина, че паметта адреси са, отново, дълги четири байта, и това е максималната сума, на адреси на паметта. Също така, типове данни - това може да е нещо като добре, че си струва да се отбележи. Размерът на тип данни зависи от на машината, което работим. Така че един знак, един символ, е как много байта на нашия CS50 уред? Един байт. И това е всъщност един байт като и на 64-битова машина. И повечето типове данни са същия брой на байтове на двете машини. Но някои типове данни ще бъдат различни на двете машини. Така че ще бъде потенциално Единственото нещо, което трябва да знаете. Но дори и това, според мен, е извън границите - Аз съм почти сигурен, ако погледнете назад най-старите викторини, той казва, да предположим за кодиране проблеми, които използвате 32-битова машина. Но има, за да отиде заедно с това в случай, че проявявате интерес, има типове данни, които са еднакви размер на всички машини. Ако сте виждали подобно нещо uint32_t, вие може или не може Не съм го гледал. Това е тип данни. Това се казва, да бъде 32 бита без значение това устройство е на. Така че, когато хората пишат преносим код, те вероятно няма да използва цели числа. Те вместо това ще използваме тези други данни типове, че те знаят, ще бъдат същите размер на всяка една машина. Маду. Маду: Имах въпрос за процеса на компилация. Така че, ако сте написването на програма, която използва библиотека като CS50 или нещо така, аз знам, че тази библиотека трябва да, в някакъв момент, да бъде компилиран и свързан инча Но колко от това се случва по време на съставянето на вашата програма? Каква част от този процес библиотека се случва, когато сте съставяне на собствена програма? JASON Hirschhorn: Така че нека да отидем по принцип стъпките от този процес. Можете да напишете. В файл. Във вашия. В файл, можете # включват вашия колекторни библиотеки, например, cs50.h. Какво означава, че рязко да включва Онлайн направя, за да си програма? Akchar. AKCHAR: Тя добавя прототипи на функциите от заглавието файлове в библиотеките. JASON Hirschhorn: Точно така. Той добавя, тези функционални прототипи до вашия код. Така че, когато си код се компилира в ранните етапи, компилаторът знае че тези функции наистина съществуват, и че някъде те са определени. . З файлове не включват определения за тези функции, или как те действително работят. Cs50.h просто включва нещо, което казва getstring е истинско нещо, което може да се случи. И standardio.h казва ФОРМАТ е истинско нещо, което може да се случи. Така че си в езика с това. Хедър файл, ще бъде превърнат в някои машинно четим код, който в крайна сметка , ще бъде превърнат в двоичен код, 0 и 1 на. И това е кодът, който в крайна сметка се изпълни. The-л CS50 линия - например, когато пишете звъня - и след това да включите-л CS50, пишете, че инча И вие виждате, че. Когато пишете направите, вие ще вижте тази линия тук. И ние ще видим, че в една секунда, когато ние код или по-късно, когато ние код. Но, че л-CS50 Онлайн прави нещо малко по-различно, отколкото В # включват cs50.h. Какво значи това-л CS50 линия направя? Ави? AVI: Искам да кажа, че го свързва библиотеката на функцията обадя, като о. файлове. JASON Hirschhorn: Така че много близо, ако не спот-он. The-л CS50 отнема двоичен файл и тя се слива с вашия двоичен файл. Така cs50.h, че няма смисъл в превръщането cs50.h от C език за двукомпонентни всеки единствен път тя се използва. Това би било глупаво, защото това ще губите много време. Така той вече е бил съставен и се превърна в един изпълним. И сега тя ще се слеят с файла си в края. Така че тези 1 и 0 ще да се слеят с вашите хора и 0 към края. Така че сега вие всъщност ще трябва действителното 1 и 0, които определят как getstring, например, работи, или как ФОРМАТ, например, работи. А за повече информация, има кратки компилатори, че Нейт дава, че трябва да се провери, че отива чрез тези стъпки. Но - Да. STUDENT: те винаги са в о файлове. , когато те са във формата за библиотека, готови да се слеят, свързан - като те са в двоичен код? JASON Hirschhorn: OK. Какво - STUDENT: Това винаги е така за библиотеките, когато ги свързват? JASON Hirschhorn: Да. Така че има. И файлове, които ще бъдат машинен код, който ще бъде загадъчен за вас. Не е нужно да се притеснявате за тях. Но като цяло, да, те ще бъде инча о файлове, готови да отидете. STUDENT: Така че, когато се изпращат на библиотека, мислиш ли, единственият кораб на. ч и. о? Вие не достави. Век или. Те години. JASON Hirschhorn: Така че - и това е в този кратък, както и, ако е тази информация изглежда да идва един малко бързо. Но в краткосрочен на компилатори говори за това, както добре. Когато кораб, библиотека, ако кораб на час., заглавната част на файла, тези функционални прототипи и 1-те и 0, това е всичко, което трябва да се даде. Не е нужно да се даде как функция работи, на. в файла. Тъй като точката на абстракция, или точка APIs, точката, в тази SPL, преносимия библиотеката Stanford, това е за да не се притеснявате за това как новите GRect работи, или как се движат делата, или как да добавите произведения. Всичко, което трябва да знаете е, че добавка е функция, която можете да използвате, и го прави това. Така че наистина не е нужно да знаем как то е написано в C. Ти просто трябва да знам, тук са функциите, това, което те направи, и тук са за 1 и 0 когато наистина искате да ги използвате. Cool. Всякакви други въпроси, свързани с компилатори или други въпроси на дъската? STUDENT: Аз имам един въпрос на прилагане рекурсивни функции. Актуален въпрос за рекурсия. Имах чувството, че ще излезе. Така че нека да преминете бързо през рекурсия със специфичен Например факториел функция. Тъй като това е например, че често идва нагоре или се използва за да илюстрира рекурсия. Така че "четири!" се чете като 4 факториел. И какво общо има четири факториел предвид? Какво означава, че правя? Как се изчислява четири факториел? 4 пъти 3 пъти два пъти 1. Така че друг начин за писане на четири факториел е да се напише това. 4 пъти 3 факториел. Защото три факториел е 3 пъти два пъти 1. Така че четири пъти 3 факториел е 4 пъти 3 пъти два пъти 1. Ето защо факториел е страхотен кандидат за рекурсия, защото това е ясно, че има нещо, което се случва отново и отново и отново на по-малък брой неща, докато стигнете до края. Когато стигнете до 1, 1 факториел е 1. Вие не може да отиде много по-далеч. 0 факторен се определя също като 1. Така че, когато стигнем до 1 или 0, ти си в края, и ще можете да започне да се върна нагоре. Така че, ако искаме да се напише рекурсивна функция за изчисляване на факториел, отиваме да пиша някакъв pseudocode за това сега. Преди да напиша, че pseudocode - Аз ще дам момчета за няколко минути да напиша кода за псевдо или просто мисля, за това - има две неща, на всеки рекурсивна функция се нуждае. Какви са тези две неща? JACK: Трябва да се обадя. JASON Hirschhorn: Ной? О, Джак. Давай напред. JACK: Трябва да се обадя. JASON Hirschhorn: Така рекурсивно функция се нуждае от рекурсивно повикване, призовавам към себе си. Това е едно. И това, което е другото нещо? JACK: A базов модел. JASON Hirschhorn: A базов модел. A базов модел е, тук е, когато спрем. Така че вашата функция получава обади. Базовата случай е на първо място. Искате ли да знаете, ако сте в края. И ако не сте в края на краищата, вие направи си рекурсивно повикване. И ти мине през тази функция отново, проверите вашата база случай отново. Ако ти не си до края, вие правите друг рекурсивно повикване, и така нататък, и така нататък. Ето защо рекурсивни функции винаги нужда от тези базови случаи и тези, рекурсивни повиквания. Ако не разполагате с рекурсивно повикване, то не би било рекурсивна функция. Ако не сте имали база случай, вие ще отиде завинаги и няма да има край. И основния случай винаги е на първо място, защото вие винаги ще искате да проверите ако сте в края на първо място. Така че, преди да се направят някои pseudocode, защо не ви отнеме минута, за да си помисля как рекурсивен факториел функция ще бъдат написани? Също така, колкото сте прави, писане то върху лист хартия е това, което ще трябва да правя на теста утре. Така че най-вероятно е добра практика да се направи сигурен кода пишеш надолу върху лист хартия - или можете да направите това. Знаеш ли къде и запетаите са. Помниш ли на синтаксиса. Тъй като не сте в състояние да имат съставител кажа сте направили грешка. Също така, по тези линии, утре, когато сте кодиране проблеми, ако се спусна за време, или ако сте много объркани за това как вие трябва да напишете нещо специално в C, то ще ви подобава да пишат псевдо-код или напишете коментари в, както добре. Защото има частично кредитиране за Много от въпросите на теста. Така че може да бъде прибързано, или може просто да се бърка. Писане на коментари или псевдо-код често са начини, които можете може да получите частичен кредит. Така че не оставя нещо без нищо от викторината. Няма никакви санкции за пускането неща инча В действителност, въвеждането на псевдо-код или коментари ще помогне на оценяващата разбера, ако действително знаете какво говориш, а може би и награда вас някои частично кредитиране за това. Също така по тези линии, пишете на кирилица. Ако не можем да наистина това, което пишете, ние няма да ти се обадя в полунощ утре фигура какво сте написали. Ние просто ще свалиш точки. Пишете на кирилица за да можем да чуем, или по-скоро, можем да прочетем какво е написал. И ако тя казва две изречения, Не пишете на параграф. Следвайте инструкциите. Пишете на кирилица. И напишете в тези коментари или pseudocode за въпроси, които биха могли награда за частично кредитиране. ОК, нека ние отидем при факториел. Така че ние имаме функция факториел. Ако аз трябваше да всъщност пиша това в C, какво трябва да се сложи пред името на функцията? Типът на връщане, която в този случай, ние ще го дам вътр. И тогава вътре в къдрави скоби, е това, което става вътре в къдравите скоби за функция? СТУДЕНТИ: тип аргумент. JASON Hirschhorn: Неговите аргументи. Така че вероятно ще факториел вземе аргумент. Той най-вероятно ще отнеме само един аргумент. И ние ще кажем, че ще отнеме цяло число, наречено X. И отново, когато пишете на прототипа на функция или писане на функцията в кода си, преди да я дефинирате, вие напиши типа данни и името на тази променлива само за тази функция. Така че може да премине през няколко номера в тази функция, тя ще бъде по-нататък х вътрешно. Ние разполагаме със факториел функция. Имаме нужда от две неща, на база случай и рекурсивно повикване. Какво е най-благоприятният сценарий за факториел? Някой, който го написа и кой не е Все още се говори, това, което е в основата калъф за факториел? STUDENT: Ако н е по-малко от 2, върнете 1. JASON Hirschhorn: Ако н е по-малко от 2, върнете 1. Харесва ми, че, тъй като това се грижи за 0 и 1. Така че ние ще направим х <2, върнете 1. Ако ни премина 0, ако получите преминал една, тази функция ще незабавно да върне едно. Ако ние се предава някои число по-голямо малка или равна на 2, ние ще Разполагаме със рекурсивно повикване. И така, как е, че ще се получи? Може ли някой друг, който е работил по този който все още не е говорил ми даде рекурсивно повикване за тази функция в pseudocode? Ако ни премина в редица х и е по-голяма от 2, какво искаме да направим? Ние също така са пример написани на страна, която може да ви даде съвет. STUDENT: Обадете х пъти факториел на х минус 1? JASON Hirschhorn: Точно така. Отиваме да се върне х пъти факториела на х минус 1. И това, въпреки че аз написах, По принцип, това, което каза на английски, тази функция факториел ще се нарича отново. Тя ще изпълни на х минус 1. Тя ще се завърне с някои цяло число, и тогава тя ще се размножават тези две заедно, и тази стойност ще бъде се завръща в каквото и нарича това факториел функция, която би могла да бъде друга инстанция на тази функция факториел. Така че е пример за рекурсивно функция, много прости рекурсивни функции. Но повечето от тях ще бъде като този. Ако искате да получите по-добра рекурсивни Предизвикателството за теста, опитайте кодиране двоично търсене рекурсивно. Защото, ако си направил двоично търсене за проблем зададете три, най-вероятно го е направил итеративно в последно време контур. Но той може да бъде написана рекурсивно. Ще трябва да напишете своето собствено отделна функция, която отнема известно различни аргументи от командния ред - или не аргументи от командния ред, някои различни просто редовни аргументи. Но можете да напишете двоично търсене рекурсивно, както добре. STUDENT: Така бихте могли също писмено, вместо X минус 1, те могли също писмено х минус минус, или бихте могли да имат писмено минус минус х. Можеш ли да обясниш защо наистина бързо тези, които биха били различни неща, като това, което е разликата между х минус минус и минус минус х? JASON Hirschhorn: Не, аз не съм ще отидат в това. Но аз ще говоря с теб за това, след като клас. х минус минус, минус минус х декрементира х с 1. Но те го правят малко по-различно. Но аз не искам да навлизам в това. Други въпроси за рекурсия или тази функция? Това не е наистина дори pseudocode. Това е в основата на кодекса в C ще можете да пишете за това. Добре, някакви други въпроси за теми тук? Да. STUDENT: Имам бърз стъпки на плаваща запетая и прецизност. JASON Hirschhorn: Плаващ точка и прецизност. Може ли някой наистина бързо дайте ми стъпки на плаваща запетая и точност? Всички вие трябва да направите това за вашия проблем настроен, така че всички сме запознат с него. Или може би не всички от вас. Някой? Дай ми започна място. Плаваща запетая и прецизност. Какъв е проблемът? Да. Виктория? Ванеса: Ванеса. JASON Hirschhorn: Ванеса. Извинете. Ванеса: Има само ограничен брой на числа, които могат да бъдат представени защото сте на, в нашия случай 32-битова система. Така че ви вид трябва да направи някои номера. JASON Hirschhorn: Така че това е точно така. Има само определено количество числа, които могат да бъдат представени. Ако умножите две много големи числа, може да прелее сумата места трябва да представляват цяло число. Ето защо понякога ние използваме дълго, дълго, вместо на вътр. Това има повече пространства. Това може да побере по-голям брой. Плаваща точност трябва да се направи с това, но също така трябва да се направи с факт е, че десетични числа са не винаги представени. Извинете. Позволете ми да сложа обратно нагоре. Десетичната броя 1.0, не е винаги представени като може да се очаква, 1,000000000. Понякога представени като 1,000000001 или 0,999999999. Тя може да бъде дори 89 хвърлена някъде там. Така че тези десетични числа не са представени точно като теб би очакваме от тях да бъдат представени. Така че в определен проблем - е две - проблем зададете два, когато се занимавахме с числа с плаваща запетая, когато ние искахме тях да представлява точно това, което искахме тях да представлява броя на пари, или на броя на цента, ние ги умножава по 100. Ние ги закръгля. И тогава ние отсече всичко зад десетичната запетая. Това е да се гарантира, че те ще всъщност равна точно това, което искахме тях да е равно. Защото, когато се вземе нещо, което е поплавък и да го превърне в едно цяло число, вие отсече всичко на правото на десетичната точка. Защото има някои с плаваща запетая неточност, 100,000 може да бъде представени като 99,999999999. А ако просто отсече всичко, за да правото веднага, ти започваш да се получите грешен номер. Да. STUDENT: Имах въпрос за леене. Какво поръчка, тя се случи в? Ако искате направите плувка, скоби, един разделен от 10, няма да го направя едно разделено на 10, след това получи 0,1, след това включете то в плувка? JASON Hirschhorn: Ако го направите поплавък 1 разделено на 10 - Студентът: Да, и след това се равнява - добре, това ще нормално Трябва да го равна по - Да. Вие искате да го плувка направи, нали? JASON Hirschhorn: ОК, така че ние ще използвате, че да Segue в фигуриращ отговорите на тези въпроси чрез кодиране. Тъй като най-вероятно ще има много тези минути въпроси, както и един добър начин за решаването им е чрез кодиране. Така че ние ще се кодират това точно сега, и след това отиваме да се върна и кодирането на въпрос, който е имал. Така че, на първа линия - Не трябваше да го написали - това, което е първото нещо, което искаме да направим, когато сме отваряне на нов файл в Gedit? STUDENT: Включи. JASON Hirschhorn: Включи какво? STUDENT: CS50 библиотека. JASON Hirschhorn: OK. Какво друго трябва да включва? Ние просто ще се провери какво се случва когато хвърли нещо на плувка. Но това, което ни е нужно да се включат, ако сме ще напише програма C? STUDENT: Standard I / O. JASON Hirschhorn: stdio.h. Ние всъщност не е нужно, за тази програма, cs50.h, въпреки че това е винаги е полезно, за да го включите. Но ние винаги се нуждаят stdio.h. STUDENT: При кодиране в C? JASON Hirschhorn: При кодиране в C. Така че аз го запишете като този. В файл. Аз получите някои хубаво оцветяване на синтаксиса. Написах нищожен вътре главната. Какво означава нищожен предвид? STUDENT: не поема никаква аргументи от командния ред. JASON Hirschhorn: отпада средства, в това случай, основната не поема никаква аргументи от командния ред. В други случаи, това означава, че функцията не отнема аргументи от командния ред. Или функцията, ако трябва да пиша за невалидни Основната (недействителни), че ще каже на главните не връщат нищо. Така нищожен просто означава нищо. Какво щях да пиша, ако аз трябваше да вземат аргументи от командния ред? STUDENT: INT дъга в низ дъга ст. JASON Hirschhorn: INT argc низ ARGV. Така ли е? STUDENT: Това е харак звезда ARGV скоби. JASON Hirschhorn: Така че можете да напишете низ ARGV скоби или Чар звезда ARGV скоби, но имате нужда от скобите. Защото ARGV е масив от низове, не забравяйте. Това не е просто един низ. Така низ ARGV е, тук е един низ наречен ARGV. String ARGV скоби е, тук е масив от низове. Така вътр argc низ ARGV скоби ще бъде нещо, което съм вероятно ще пиша. Така че исках да запишете в цяло число? Студентът: Да, цяло число. Или в налични средства. JASON Hirschhorn: В плувка? Подобно, флоат х е равно на 1, разделена на 10. JASON Hirschhorn: OK. Как да разпечатате поплавък в ФОРМАТ? Какво? STUDENT:% F. JASON Hirschhorn:% F. Какво е цяло число? г или аз. Какво е низ? STUDENT: а. JASON Hirschhorn: а. Как мога да получа нов ред? STUDENT: Обратно наклонена черта п. JASON Hirschhorn: Какво да се върне ако основните писти правилно? STUDENT: 0. Трябва ли да пиша тази линия, все пак? Студентът: Не. ОК, ние няма да го пиша, тогава. Всеки ли може да прочете това? Той изглежда малко малък. Всеки ли може да видите, или трябва Правя го по-голям? Мисля, че за камерата, ние ще направим го прави малко по-големи, все пак. JASON Hirschhorn: Ако искам да се превърне това . C файла в един изпълним, какво мога да пиша? STUDENT: Направете тест. JASON Hirschhorn: Моля? STUDENT: Направете тест. JASON Hirschhorn: Направете тест. Ние говорехме за тази линия по-рано. Звъня. Какво е трясък? Името на компилатора. Каква е тази линия? STUDENT: тя създава за използване на GDB. JASON Hirschhorn: Комплекти то за използване на GDB. Тази линия, какво е това? STUDENT: Source код. JASON Hirschhorn: Това е най- източник файл, на. в файла. Какво правят тези две линии? Или тези две линии не. STUDENT: той го кръщава тест. JASON Hirschhorn: Така тире о казва, го наречете нещо различно. И ето ти го нарече тест. Ако аз не са имали, че в, какво ще го наречете това? STUDENT: a.out. JASON Hirschhorn: a.out. Какво прави това? STUDENT: Връзки по математика библиотеката. JASON Hirschhorn: Тя свързва в математика библиотеката. Ние не включва математика библиотеката, но тъй като това е толкова често, че са писмено марка винаги да включва по математика библиотеката. И също така, това включва библиотеката CS50. ОК, така че ако ние списък, сега ние имаме изпълним нарича тест. За да го изпълни, аз пиша тест. Виждам, че си с плаваща запетая, както се очаква, е равно на 0. Дали това - така - STUDENT: Тогава, ако си сложиш плувка сега, като го хвърли като плувка - JASON Hirschhorn: Cast от 1 до плувка? Студентът: Не, хвърли пълна нещо - Да. Ако просто направи това, би че то 0.1 направи? JASON Hirschhorn: ОК, така че наистина бързо, 1, разделена на 10, които са числа се делят. Така че, когато се разделят числа, те са 0, и вие сте спестяване, че 0 в плува, защото наклонената черта е просто число дивизия. Така че сега ние се превръщаш нещо в налични средства. Да видим какво ще стане. Ние ще направим тест. Така че сега ние виждаме, че тази черта не е целочислено деление, тя плуваше точка дивизия. Тъй като един от нейните аргументи са били хвърлени на плувка. Така че сега тя казваше, лечение на това разделение като си имаме работа с плаващи точки, а не с числа. И така, ние получите отговор очакваме. Да видим какво ще се случи - Опа. Ако исках да отпечатате повече десетични петна, как бих могъл да го направя? STUDENT: Point точка е, или най-много знака след десетичната запетая, колкото искате. JASON Hirschhorn: Така че аз отпечатате 10 знака след десетичната петна. И сега виждаме, че сте се някои странни неща. И това се връща към вашия въпрос за плаваща запетая неточност. Има странни неща се съхраняват тук. ОК, значи това отговоря на въпроса ви? Какво друго искате за кодиране бързо? STUDENT: Аз просто исках да видя дали не, ако освободи някои показалка, дали това все още е показалеца съхранява в това адреса на това, което беше сочейки рано. JASON Hirschhorn: OK, така че нека да направим това. Char звезда PTR, това създава променлива наречен PTR от тип Чар звезда. Как да напиша изчистване? Алдън? ALDEN: Just изчистване. Но след това тя трябва да бъде размера на, и в този случай, предполагам, че ще да се посочи Чар. Така че това ще бъде знак. JASON Hirschhorn: ОК, така че по- генерично, Inside - нека да редактирате. Inside изчистване, искате броя байтове на куп. Като цяло, това, което сме виждали, че сме правите, е, че ще изчистване низове, например, или масиви от числа. Така че, ако искаме 10 числа, или 10 символа, 10 ще ни дадат 10. И тогава размер на символа ще даде ни, че размерът на символа, който в този случай е един байт. Ние получаваме 10 байта. Ако трябва да напишете размера на ПНА, Това ще ни даде 40 байта. Така че по-обширно, вътре на изчистване е броят на байта, което искате. В този случай, ние сме все едно байт. Което изглежда като странно ползване на изчистване, но за нашата цели има смисъл. Така че там е това. Отиваме да се обаждате безплатно. Ние се отървете от него и ние използваме PTR отново. И какво искате да проверите? STUDENT: Аз просто исках да се провери дали или не е имало нищо вътре в него. JASON Hirschhorn: Така че независимо дали го насочи към нещо? Студентът: Да, точно така, дали тя все още има адрес в паметта. JASON Hirschhorn: Значи вие искате да проверите стойността на PTR? Студентът: Да, точно така. JASON Hirschhorn: Какво да напиша тук ако искам да проверите стойността на точка - това, което е, Йордания каза, стойността? Или какво се съхранява вътре на PTR? STUDENT: A адрес памет. JASON Hirschhorn: A адрес от паметта. Така че, ако аз пиша само това, че ще ми даде стойността на PTR. И как мога да разпечатате адрес с памет? Какво е низ за форматиране за адрес с памет? STUDENT:% р. JASON Hirschhorn:% п. % S е низ. % Р за показалеца. Така ли е? Това е правилно. Така PTR равнява - тя все още има нещо в него. Това е вероятно по- интересен въпрос. Какво означава тази линия направя? STUDENT: Seg грешки. JASON Hirschhorn: Какво? STUDENT: Мисля, че SEG грешки. JASON Hirschhorn: Хм? STUDENT: Мисля, че ще SEG вина. JASON Hirschhorn: Така че тази линия на код, звезда PTR, какво е звездата в предвид? STUDENT: Съдържание на. JASON Hirschhorn: Да. Отиди да получите съдържанието на. Така че това ще отидете на паметта адреса там и ми даде това. Използвах% в точно тук, тъй като има се съхраняват там символи. Така че ние ще отидем до този адрес, ние Току-що видях - или тя най-вероятно ще бъде малко по-различно този път, когато стартирате програмата. Но ние ще отидем на този адрес , които ние знаем, все още съществува и да видим какво има там. Така че това не е SEG вина. Той просто не ни даде нищо. Това може да са всъщност ни е дал нещо, ние просто не може да го види. И това се връща към тази идея - и ние не започваш да се получи твърде много в това, защото това е по силите на обхват на този курс. Но ние говорихме за тук, ако ние отиде отвъд границите на масива от 1, ние не може да получите в беда. Понякога, когато просто отидете на разстояние от 1, че правиш нещо нередно, и вие може да получите в беда. Но не е нужно винаги да получите в беда. Зависи колко лошо нещо ли да, ти започваш да се получи в беда. Което не е да се каже, да бъде помия с вашия код. Но това е да се каже, програмата няма да винаги се откажат, дори ако отидете някъде че не трябва да отида. Един добър пример за това е, че много от хора в техния проблем, определени 3, които е 15, не е проверила на границите на съвета. Така че ви погледна наляво, погледна към Добре, погледна към върха, погледна на дъното. Но ти не се провери, за да видите, ако на върха всъщност ще бъде на дъската. И много от хората, които направиха това и Оказа, че в тяхната програма работи перфектно, защото, където беше, че на борда съхраняват в паметта, ако отиде един над него или проверен, че паметта адрес, не е имало нищо особено ужасно за това, така че вашата програма не е ще ти викам. Но ние все пак ще свалиш точки, ако вие не проверите това, защото вие правехме нещо, което не са били трябваше да направя, и вие може да имате намерила в беда. Коефициентите са, все пак, най-вероятно не. Така че това е, за да се покаже, че, да, Все още можем да отидем до него. И ние няма да получиш в проблеми в този случай. Ако ние се опитахме да направим прочетете следващите 100 символа, ние бихме вероятно да получите в беда. И вие можете да кодирате четене следващия 100 знаци, ако искате, като направите някои нещо за контур. Да. STUDENT: Тъй като сме били възложени, че пространство на действителната стойност, не бихме действително да бъде в състояние да се види нищо. Трябва ли да го пробвам с настройката, че равна на искал в или нещо такова? JASON Hirschhorn: Great въпрос. Как да задам тази стойност - какъв ред код да напиша на линия седем да правя това, което каза? STUDENT: Star PTR равнява единствен цитат C края апостроф. JASON Hirschhorn: Така че това е пускането характер, в, на това място, защото отново, че звезда означава, отидете там. И когато се използват от лявата страна на оператор за присвояване, това се равнява на подпише, ние няма да се получи, че стойност толкова много, както е тази стойност. Сега нека да видим какво ще стане. Ние поставяме нещо там и тя беше там. Обадихме безплатно. Някои неща може би се е случило на куп. Така че това не е там вече. Но отново, ние не получавате в беда за да ходя там. Правя това в код, за да илюстрира че много от тях въпроси, които имате, те са наистина интересно отговори на много време. И те са наистина добри въпроси. И вие можете да ги разбера по собствения си, ако, например, ние не сме в раздел. Да. STUDENT: Защото не сте изпращането на показалеца навсякъде, ти трябва да използвате изчистване? JASON Hirschhorn: Така че това се връща към първоначалния си въпрос. [? ?] Дали е само една локална променлива? Изчистване тук не е толкова убедителна. Използването на изчистване тук не е че непреодолими, защото това е само локална променлива. УЧЕНИК: Значи може да ви направи Чар звезден PTR равнява 'Здравей'? JASON Hirschhorn: Oh. Така че ние ще се върнем сега към първоначалния си въпрос. Мисля, че не са доволни с моя отговор. OK? Подобно на това? Студентът: Да. Изчакайте. JASON Hirschhorn: И къде искате да отпечатате? Така че ние ще отпечата низ така? STUDENT: Интересно. JASON Hirschhorn: Така че това казва, че това аргумент е от вида на характера. Така че това трябва да бъде герой. STUDENT: Just заема първо един. JASON Hirschhorn: Така че това е това, което казах преди. Както казах, това не е съхраняване на низ вътре променлива показалка. Това е съхраняване - STUDENT: Първата стойност на низа. JASON Hirschhorn: Адресът на първата стойност на низа. Ако трябва да отпечатате този, ние сме получаване на стойност вътре показалка. И ще видите, че е наистина, адрес в паметта. Това прави ли смисъл? Извинете. Чакай, Това отговаря ли на въпрос, все пак? Студентът: Да. JASON Hirschhorn: Тази линия на код е създаване на низ и след това друг променлива показалка, че Сочи на този низ, този масив. Да. STUDENT: Така че, ако ние отидохме една памет справяне с по-нататък, ще вземем ч? Има го били съхранявани като низ? JASON Hirschhorn: Както ние направихме - така че това е ценно да се направи. Това е точка аритметика, която ви момчета не сте виждали преди и трябва да бъде сравнително комфортно. Това е равносилно на писане - ако трябва да пиша този ред код, сме виждали масив нотация преди. Това трябва да ни даде втори стойност в този масив, з. Ако сме направили това, това също трябва да се даде ни на втората стойност в този масив. Защото това е не ще спомена адрес на първото нещо, но памет адрес на нещо, което човек свърши. И тогава dereferences на звезда оператора че показалка. И отново, нека да видим. Ние получаваме ч отново. STUDENT: Какво точно прави сочен предвид? JASON Hirschhorn: сочен е фантазия дума за отидете. Отиди на които и да получите това, което е там е сочен показалка. Това е просто една фантазия дума за това. STUDENT: Ако искахме да печат целия низ, бихме могли направи амперсанд показалка? JASON Hirschhorn: ОК, ние сме Ще пауза тук. Ние ще свърши тук. Ampersand дава адреса на място, така че, когато правиш амперсанд на променлива, той ви дава адреса където се съхранява тази променлива. Ampersand показалка ще ви даде на адрес на PTR PTR където е в паметта. Ние няма да отидат на с този пример. Можете да разбера тези нещата по своему. Но пак, това може да бъде дори граничеща с малко извън това, което трябва да знаете за обхвата на тази средносрочна - или този тест, по-скоро. Извинете. Ние ще продължим, защото бих искал да направя едно кодиране проблем преди време изтече. И ние ще се кодират какво мисля е най-наложителни от тях примери, atoi. Така че това е въпрос на викторина преди две години. И аз го имам на борда тук. Хората бяха помолени от теста - те са били дадени малко повече tesxt в въпроса, но аз елиминира текст, защото не е било необходимо за нашите цели в момента. Това беше просто някакъв фон върху това, което atoi направих. Но всичко, което знаят и са много запознати с atoi. Предлагам ви да кодирате този върху лист хартия. Аз също предлагам да използвате стратегията че сме преминали през много в нашата секция. Първо, уверете се, че сте разбрали какво atoi се справя. Нарисувайте картина или излезе с някои мисловен образ на това в главата си. На следващо място, напишете pseudocode за това. На теста, ако всичко, което получавате, е pseudocode, поне сложите нещо надолу. И след това на картата, че pseudocode върху C. Ако има проверка във вашата pseudocode, като проверите дали нещо е 1, който съпоставя върху един, ако състояние и така нататък. И най-накрая, кода на програмата в C. Така че да се върнем към atoi и да вземе пет минути да се кодира тази на лист хартия, която е най-вероятно за период от време, вие ще поемат по- викторина за кодови atoi. Пет до 15 минути, пет до 12, пет до 10 минути, е за размера на време, че ще похарчите за това въпрос в теста. Така че отделете пет минути, моля те. И ако имате някакви въпроси, ще повиши ръката си и аз ще дойда на мача. [РЕАКЦИИ РАЗГОВОРИ] JASON Hirschhorn: ОК, така че че беше на пет минути. Това е вероятно за размера на време, че ще похарчите за това на викторина, може би най-ниския край на това време. Ще обобщим след малко. Нека да започнем кодиране това. И ако ние не се получи през целия път, отговори на това и това викторина с въпроси са на разположение, отново, Fall 2011 е, когато този въпрос се яви на теста. И тя е на стойност осем точки на теста и след това. Осем точки е на високо края на сума на точките нещо си струва. Повечето въпроси са в диапазона с един до шест точки. Така че това е по-голямо предизвикателство въпрос, със сигурност. Някой може ли да ме разбирайте започна? Като цяло, какво ще да искате да правите с този функционира atoi, логично? Какво искаме да направим? Така че ние ще да напиша някои pseudocode. STUDENT: Конвертиране на героите в числа. JASON Hirschhorn: Конвертиране на героите в числа. OK. Така че колко знака ние сме ще трябва да мине през? STUDENT: Всички от тях. STUDENT: Всички герои в низа. JASON Hirschhorn: Всички символи в низа. Така че, ако искаме да мине през всеки знак в низ, това, което е нещо, в C, които сме виждали, че е позволила от нас да мине през всеки знак в низ? СТУДЕНТИ: A за контур. JASON Hirschhorn: А за контур. Така че ние ще използваме цикъла всеки герой в ите. Тогава какво ние ще искате да направите, , когато стигнем до конкретен знак? Да кажем, че сте се прие 90. Взимаме 9. Това е характер. Какво искаме да правим с този характер 9? STUDENT: тя се изважда от характера 0? STUDENT: Добави 0? JASON Hirschhorn: Извадете то от характера 0? Студентът: Да. JASON Hirschhorn: Защо искате да направите това? STUDENT: [недоловим] стойност. Нейната стойност вътр. JASON Hirschhorn: ОК, така че ние приемаме характер 9, тя се изважда от 0 характер, за да получите действителното число 9. Sweet. И откъде знаеш, че характерът 9 минус 0 герой е 9? Какво диаграма Погледна ли? STUDENT: Има логично девет места между 9 и 0. Или можете да погледнете таблицата на ASCII. JASON Hirschhorn: ASCII таблица. Но, да, вие сте правилно, както добре. Така че ние се изважда 0. Така че сега ние имаме числото 9. И това, което искаме да правим с това? Ако имаме 90, това е първото цяло число ние, какво искаме да направим? STUDENT: Аз вложих във временен число масив, след това направете математика, за да го по-късно, за да го направи в края си. JASON Hirschhorn: OK. STUDENT: Можете да започнете в края на масива и след това се премести напред, така че всеки път, когато се движите напред, вие го умножете по 10. JASON Hirschhorn: OK. Това звучи като доста убедителна идея. Ние може да започне в края на нашия масив, и ние можем да използваме strleng. Ние можем да използваме strleng тук. Ще получите дължината на нашия низ. Започваме в края. А + на първия милион, ние просто приемете, че число, а може би и ние създаваме като нова променлива число до върха, където ние сме съхраняване всичко. Така че ние контур през всеки знак в и от отзад напред, ние изваждаме 0 и след това ние го приемаме, и в зависимост от където и да е, ние го умножете с мощност от 10. Защото първото, което правим размножават най-дясната характер от? STUDENT: 10 до 0. JASON Hirschhorn: 10 до 0. Какво ще се умножава втора -дясната характер от? STUDENT: [недоловим]. JASON Hirschhorn: Какво? STUDENT: 10 към 1. JASON Hirschhorn: 10 към 1. Характерът на трети-дясната? STUDENT: 10 към 2. JASON Hirschhorn: 10 към 2. STUDENT: За съжаление, аз не разбирам какво правим тук. JASON Hirschhorn: OK, нека се върнем тогава. Така че ние ще получим преминал в низ. Защото ние сме писмено atoi. Така че ние се предава в низ. Да кажем, че сте се предава в низа 90. Първото нещо, което ще направите, е да настроите нов число променлива, която сме просто ще се създаде като нашата нова число. Това е, което ние ще да се върне в края. Ние трябва да мине през всеки герой в низ, защото сме преценили че ние трябва да се докосне всеки един и след това го добавите към нашия нов число. Но ние не можем просто да го добавите като число. Ние не може просто да вземе 9 и добави 9 до нашия число. Тя зависи от това какво място тя е в низа. Ще трябва да се размножават му от власт на 10. Защото това е начина база 10 творби. Така че ние ще получим реалната характер, или действително число номер, чрез изваждане характер 0 от 9 характер, както направихме с изваждане характер капитал A от каквото и характер имахме в един от тези проблеми. Така че ние всъщност ще получите номер от 0 до 9 записан като реално число, а ние ще умножете го с мощност от 10 в зависимост къде сме ние в низа. И тогава ние ще го добавите обратно в нашата нова целочислена променлива. И така, какво ще изглежда така би се - ние ще рисувате върху тук. Ако ни премина в низа 90 - STUDENT: [недоловим]. JASON Hirschhorn: Но atoi отнема низ. Така че ние ще да мине през стопанството. Ще се предава в 90. Ходим от задната към предната част. Ние се възползват от 0. STUDENT: Съжалявам. Може би това е глупаво. Ако сте се предава в низ, защо е 90, което сме Първи премина в? Тъй като 90 е цяло число. JASON Hirschhorn: Защото atoi отнема низ и го превръща в цяло число представяне на този низ. Но низа 90 не е цяло число 90 или 90 броя. Низът 90 е масив от два или три символа, по-скоро, на 9 характер, 0 характер, и обратно наклонена 0 характер. И пишем atoi, защото за Например, когато ви отведе на командата аргумент линия, и е записан в ARGV, тя е записана като низ. Но ако искате да се отнасяме към него като число, трябва да го конвертирате в един действителното число. Кои сме направили един от нашите проблемните комплекти. Кои сме направили в редица на нашия проблем комплекти. Всеки, който пое цяло число като аргумент от командния ред. Така че това е защо нашата функция atoi Отнема низ. Така че отново, в нашия пример тук, ние сме Ще отнеме последната една. Отиваме за изваждане на характера 0 от играта, тъй като знаците 0 извадена от характера 0 дава действителния брой 0, съгласно на ASCII математика, което правим. Защото героите са представени като различна от действителната им - на характер на, например, малки букви а е 97. Това не е - Опа! Това не е всичко, което можеше да се очаква да бъде 0, например. Така че трябва да се изважда характер, която да получи 0. Така че ние ще направим това тук за да получите действителния брой. И тогава ние ще го умножете по мощност на 10 в зависимост от това къде е в низа, а после приемете, че и да го добавите към нашите притежател място променлива, така че ние може да излезе с нашата крайна ново число. Има ли, че има смисъл да се всички? Така че ние няма да се кодира тази точно сега, защото сме получаване на кратко време. Извинявам се за времето на това. Но това е, което, надявам се, бихте да може да се направи на теста - в много малко, се получи това pseudocode изписано. И след това, ако бяхме да напишете pseudocode, всъщност, бихме могли да направим това доста бързо. Всяка линия на коментари ние писахме тук се превежда като около една линия на C код. Обявяването на нова променлива, писане контур, някои изваждане, някои умножение и някои задача. Бихме вероятно също да искате да напиши линия за връщане. Ние може също да искате да се сложи някои проверки тук. Да. УЧЕНИК: Значи можем да се отнасяме а като действителната низ? Защото знам, че това е просто един адрес. Например, как ще получите дължината на низа да се прехвърлят през нея? JASON Hirschhorn: Е, как е направил дължината на низ? Strlen. STUDENT: strlen, да. Но може да ви постави и като аргумент за това? JASON Hirschhorn: Така strlen Отнема Чар звезда. И от това следва, че Чар звезда, и го продължава броенето докато стане на наклонена черта 0. strlen е всъщност една от другите програми, ние щяха да се код. Това е още една добра един до код. Това е един малко по-лесно, защото, ако ти започваш да мислиш за това концептуално - Току-що го каза на глас - strlen следва указател и ще поддържа и броене и следенето, докато стигнете обратно наклонена черта 0. STUDENT: OK, имам го. JASON Hirschhorn: Така че най-доброто от Успех на викторина 0 утре. Ако имате някакви въпроси, аз ще бъде извън след това. Чувствайте се свободни да се свържете с мен. Докоснете се до моя собствен TF ако сте които не са в моята секция, или да си взема имейл, ако го искате. Ако искате да се побърквам и просто да изпратите ми имейл, имейл и споделяйте, аз ще ви изпрати обратно, като, усмивка на лицето, или нещо като шега или нещо подобно. Така че не се колебайте да направите това, както добре. Успех отново, и аз ще виждате всички следващата седмица.