ЈАСОН Hirschhorn: Добредојдовте да А5, секого. Имаме возбудлива недела пред нас, главно бидејќи има толку многу нови се соочува во оваа соба. Тоа е прекрасно. А многу од вас се тука случајно, што е уште подобро. Па се надевам дека ќе се задржи ни се придруживте. Оваа недела ние ќе потроши најголемиот дел од делот се подготвува за квиз. Така на нашата агенда, ние ќе зборуваме малку за ресурси за класа, но исто така и за квизот, а потоа, повторно, поминуваат најголемиот дел од класа зборува за прашања. Откако ќе завршиш одговарање на вашите прашања, или ако вашите прашања природно нè доведе до некои кодирање, јас имаат примерок проблеми од midterms минатото дека ние ќе кодот во живо во делот заедно дека, исто така, доведе до некои други добри теми да се покрие. Значи прво, како што ние си помина низ за изминатите неколку недели да ве потсетам момци, има еден тон на ресурси достапни за овој предмет. Многу од нив ќе биде неверојатно корисна да ви како ќе продолжи да учат за квиз 0, бидејќи тоа е вторник попладне. Па сите сте биле студирање за малку. Постојат скрипти и извор код кој што треба дефинитивно одјавување. Види шорцеви. Проверете study.cs50.net. А потоа, се наведени подолу, голем број на други ресурси. Повторно, квиз 0 е утре на 01:00. Ако не сте го направиле тоа веќе, проверете надвор од За Квиз 0 документ за почетната страница од пребарувачот разбира да дознаам каде сте преземање на квизот. На квизот започнува во 01:10 и завршува 70 минути подоцна. Значи, ако се појавиш по 01:10, ти си ќе се добие дека многу помалку минути од 70 да се земе на квизот. Така осигурајте се дека сте таму на време. Ако сте за продолжување студент или имаат некои други тестирање размислувања, не може да биде во 01:00 утре. Но, повторно, проверете За Квиз 0 документ да бидете сигурни дека знаете кога сте преземање на квизот. Напишав 75 ​​минути тука. Мислам дека е во право, не 70. Таа ги опфаќа сите материјали од недела 0 да предавање минатата недела во средата. И повторно, за овој квиз, по што документ, ќе добиете еден два еднострани и 8 1/2 од 11 лист хартија што ќе се добие да се користи како белешки за време на квизот. Многу луѓе, ако не повеќето луѓе, имаат Откривме дека еден најкорисен начин да учат за квизот е да се направи студија на состојба, а една извити, на своите. Значи се погледне во оние минатото ако сте виделе оние минатото. Допрат до пријатели да се види она што тие се стави на нивна. Но рацете надолу, најдобар начин можете да студија е да се оди преку сè и омаловажавам тоа се сведува на она што или треба треба не припаѓа на таа состојба на хартија, бидејќи тоа е само навистина корисен начин за вие да бидете сигурни дека си минува низ сè и имате некои блискоста со неа. Повеќето луѓе, ќе најдеме, иако тие имаат лист хартија седи право до нив на квиз, не се претвори на тоа, затоа што, повторно, дека многу процесот на одење преку информации помогна нив се учи. Дали некој има било какви прашања за квиз 0? Има сите - Јас не одам да се направи со кревање раце. Никогаш умот. Јас требаше да прашам кој почна да студираат. Но не сакам да го направам сите не се подигне вашите раце. Значи како што реков - Да, Ави, повелете. Ави: Што ќе биде корисна работа да се стави на една пејџер? Студент: Тоа е до вас. ЈАСОН Hirschhorn: Ќе добиете го користите вашиот пресудата. Корисни работи да се стави на една пејџер, ако сте збунети околу големите О траење на различни видови на пребарувања и сорти, се стави дека таму во корисна конте табелата. На тој начин, ако биде побарано тоа на квиз, вие не треба да се обиде и фигура тоа надвор или причина преку траење. Можете само да го ископирате надолу. Ако се погледне на квизови минатото, многу пати, има трчање време прашања. Така што ќе биде пример за добра нешто што треба да се стави на вашиот еден-пејџер. Други добри работи да се стави на, ако сте збунети околу тоа како да прогласат функција или она што различните делови на функција декларација се, напишете дека таму, генеричка верзија а потоа можеби еден пример. Ако сте збунети околу покажувачи, дијаграм за тоа како совети работа е веројатно навистина корисни. Ако сте збунети околу рекурзија, а ги тестираат рекурзивен функција таму исто така може да се докаже да биде навистина од голема помош. Дали тоа ви даде некои идеи? AVI: Треба да се разбере целата составувањето процес, како како тоа сите работи? ЈАСОН Hirschhorn: Сè што што е покриен би можеле да се појави на квизот. Прашања - но повторно, некои работи ќе биде бројат во голема мера од другите. Некои работи се излезе повторно и повторно во класа, во предавање, и секција. Други работи не се излезе дека често. Зборувавме многу за # вклучи и -L нешто и она што тие значат во компилација процес. Зборувавме многу за GDB, се држат, оние кои се различни знамиња кои ги користиме кога ние ги собере нешто, и она што make15, на пример, навистина значи и навистина го прави тоа. Не сме се зборува толку многу за на секој чекор во компилација процес. Ние сме се уште зборуваше за тоа. Па тоа е уште нешто што треба да биде запознаен со. Но, повторно, ние нема да биде - нешта што доаѓаат почесто во класа се со поголема веројатност да дојде до повеќе често и да бидат повеќе во голема мера бројат на квизот. Кул. Било други прашања за квиз 0? OK, па јас се стави на листа на теми на табла. Отидов преку наставната програма. Отидов преку преглед секција од минатата ноќ и оние слајдови да се излезе со неисцрпна листа на теми дека ние сме опфатени досега во CS50 и работи кои би можеле се појави на квизот. Па јас не одам да се оди преку секој еден од нив. Дека ќе бидат потребни многу повеќе време отколку што го имаме сега. Но јас се стави ова овде горе да се надевам бутване вашата меморија, како на нешта кои може да или не може да биде како се запознаат со вас. И јас би сакал да го поминат најголемиот дел од делот одговарање на вашите прашања во врска со овие теми, теми кои не се опфатени овде. Ние може да напише псевдо код. Ние може да напише вистинската шифра да се осигура дека - Можам да одговорам на вашето прашање и да помогне сите фундаментално разбирање на Многу од овие теми, па ќе се чувствувате подготвени и удобно да навлегуваме во утре на квизот. Па прочитајте во врска со листата. Се надевам дошле да секција со некои прашања, како и. Кога ќе бидете подготвени, кренете рака и ние ќе да започнете. Имајте на ум, прашања што ги имате, не постојат глупави прашања. Ние сме слушнале дека многу. И прашањата што ги имате, јас сум подготвен да се обложи, многу други луѓе и седи тука и гледање онлајн имаат, како и. Така што само може да им помогне на луѓето со поставување на прашања. Маркус. Маркус: Помеѓу магацинот и грамада, постои пред-распределени процентот на меморијата која е дефинирана како ова е за на магацинот или за грамада? Или Како ли тоа работа, точно? ЈАСОН Hirschhorn: Велики прашање. Одам да се врати трага малку. Не сите - Ве молиме бидам искрен тука. Знам дека сум те прашам да се подигне вашиот рака пред своите врсници. Но постојат луѓе кои се чувствуваат непријатно со магацинот и грамада и би сакале да одите во текот на овој и она што тие значат? Кренете рака ако - OK. Ви благодарам. Па ние ќе одиме во текот на магацинот и грамада навистина брзо, а потоа се преселат во одговарање на вашето прашање. Значи, ако ние го извлече кутија за да ги претставуваат меморијата на вашиот компјутер, она што се некои работи кои одат во ова поле? Главната. А главната функција. Каде главните одиме? СТУДЕНТСКИ: [нечујни]. ЈАСОН Hirschhorn: па ние ќе стави главната овде долу. Што друго се случува во ова поле? Студент: На функции кои ти се јавам. ЈАСОН Hirschhorn: Функциите што ние го нарекуваме. И каде што тие одат? СТУДЕНТСКИ: Во оџак. ЈАСОН Hirschhorn: Тие одат во магацинот. Па ние ќе да се јавите оваа нешто овде долу на магацинот. И до врвот, имаме куп. Па меморијата не е кутија исто како и оваа. Но тоа е всушност прилично слични. Тоа се случува да биде многу кутии во текот и одново, во зависност колку е голема вашиот компјутер е или колку е голема вашата меморија е. Во понуда-unquote "дното" е на магацинот. И постојат повеќе нешта кои одат на магацинот. И оние зависи од функциите имате во вашиот код. Секогаш имаш една функција во вашиот код наречен главни, па секогаш постои секција овде во магацинот посветен на главната. Овие делови во магацинот се нарекуваат магацинот рамки. Кога ќе се јавите друга функција, велат дека главната нарекува бинарен функција за пребарување, ќе стави друга рамка на магацинот. Поконкретно, ние ќе се донираат парче меморија на нашиот компјутер за чување бинарни пребарување е локалната променливи и да се кандидира на бинарни Барај код. Па ние го нарекуваме бинарни пребарување. Во оваа парче на меморија, ние ќе за чување на локални променливи. Ние ќе ги сочува printf повици. Она што се случува, дека функцијата е ќе треба да се чуваат таму. Бинарни пребарување се случува да се изврши. Тоа се случува да се заврши извршување. Што е зборот во C, кој означува дека функцијата треба да ја заврши својата извршување? СТУДЕНТСКИ: Враќање. ЈАСОН Hirschhorn: Враќање. Значи секогаш кога ќе ја видите враќање изјава, функцијата завршува кога хитови тоа. Па бинарни пребарување ќе погоди нејзиното враќање. Овој дел од меморијата ќе суштина бидат ослободени до. И главните ќе се врати во извршување. Значи главната ќе испуштам каде беше, повик бинарни пребарување, се некои повратната вредност, и продолжи извршување. Ова магацинот рамка ќе замине. Ако ние го нарекуваме рекурзивен функција, која е функција која се нарекува себеси над и повеќе, ние би можеле да добијат - кажеме дека сме направи бинарни пребарување рекурзивно. Ние би можеле да добијат бинарни пребарување верзија еден, бинарни пребарување две, бинарни пребарување три, бинарна пребарување четири, бинарни пребарување пет. А потоа и оваа финална бинарни пребарување пет ќе го погоди база случај, и на магацинот рамки ќе се вратиме и да ја задржите затворање додека ние се вратиме на главната. Можеме да одиме во текот на рекурзијата во малку. Но, сето ова е да се каже, ако сте повикувајќи на повеќе функции во исто време, ќе има повеќе магацинот рамки на магацинот. Грамада, од друга страна, на тука, не е за функции, не за локални променливи. Тоа е за динамички доделени променливи. Значи овие се променливи кои можат да бидат иницијализира или во главната или функционираат дека главната повици. Било каде во вашиот код, тие може да се иницијализира. И да се иницијализира динамички распределени променлива. Што функција во C ние ги користиме? Студент: Примерок. ЈАСОН Hirschhorn: Примерок. Ти се јавам Примерок. Ќе добие простор од меморијата. И дека простор на мемориската е на грамада. И дека простор на мемориската останува таму се додека ти се јавам бесплатно. Така динамички доделени променливи во грамада ќе постои се додека можете сакате да ги да постојат, и тие нема да си отиде, додека не се експлицитно да им каже да си оди. Можете да ги создаде во една функција. Магацинот дека функцијата рамка ќе замине. Но таа променлива уште ќе постои во грамада се додека не се ослободи, потенцијално од страна на функција која се нарекува бинарни пребарување или whatever. Па оние грамада променливи останат таму онолку долго колку што сакате тие да останат таму. И тие се стави тука. А потоа следниот добива стави таму. Тие Продолжувам да добивам пополнети, и тие остане таму додека не се јавам бесплатно. И суштински, грамада и магацинот, да дојдеме до прашањето на Marcus, расте еден кон друг. И ако тие работат еден во друг, сте користи до сите меморија во Вашиот компјутер, и вашата програма ќе се повлече затоа што не имате било какви повеќе меморија оставени да го користите. Меѓу нив, постојат потенцијално други работи. Но, за обемот на овој курс, ќе не треба да се грижите за тоа. Така што беше одговорот на вашето прашање. Не грижете се за тоа. Но, тоа беше долг одговор. Сите што треба да знаете е грамада и магацинот нема - еден ќе почне на дното. Магацинот прави. Грамада е таму горе. Тие ќе се зголеми до една со друга. И ако тие допир, тоа е проблем. Да истрча на меморија. Но, исто така, во прилог на знаејќи каде тие се, она што се чува во двете магацинот и грамада. Кертис. CURTIS: Кога се судираат, е дека магацинот претекување? ЈАСОН Hirschhorn: Кога се судираат, тоа не е оџакот претекување. Магацинот претекување е различна област дека можеме да одиме над ако сакате да. Во ред, ќе се вратам на тоа во малку. Студент: Што е зборот наречен кога тие хит едни со други, магацинот и грамада? ЈАСОН Hirschhorn: За сега, не се грижи за. Само знам - Јас ќе одговорам на тоа прашање по класа. Ако тие трчаат во едни со други, да истрча на меморија, бидејќи нема повеќе простор таму. СТУДЕНТСКИ: За жал, она што е сегмент грешка? ЈАСОН Hirschhorn: Еден сегмент грешка може да се нарекува за - тоа зависи зошто се нарекува сегмент вина е. Понекогаш, вашиот магацинот претекување, тоа ќе велат сегмент грешка како грешка. Студент: Што dereferencing нула променлива? Е дека сегменти грешка? ЈАСОН Hirschhorn: Dereferencing е нулти покажувачот - Добро, па ако имате показател дека сте еднаков на нула, совети, да се потсетиме, продавница мемориски адреси како и нивните вредности. И е нулти покажувачот е во суштина чување на 0, 0-та решавање во таа променлива. Па 0x, 0, 0, 0, 0, итн. Дека 0-та адреса во меморијата, тоа не е во нашата слика, тоа е, таму горе некаде, тоа е се задржани за компјутер. Ние не си дозволи да го допрат. Значи, кога вашата програма извршување, ако нешто се обидува да одат на меморија адреса 0, таа знае дека кој е празна вредност. Таа не знае ништо треба да биде таму. Па ако се обидете и да го користите нешто таму и лекување на нешто како таму или се обидуваат да одат на таа локација, ќе бидете ќе се добие сегмент грешка или грешка. Дали тоа одговори на вашето прашање? И сега ние ќе се вратиш да магацинот претекување. Работи во магацинот, како вие момци имаат видел, во - да подготви блиски up на магацинот рамка. Може сите да се види тоа? Па ние имаме магацинот рамка. Ние сме заштеда низа во како локален променлива во оваа функција. Така велат нашите низа има пет точки. Сите пет од тие ќе се чуваат во таа магацинот рамка. Ако почнеме пишување надвор од границите на оваа низа - Значи, ако ние почнам да пишувам во, да речеме дека е 0. Тоа се пет индекси на нашата низа. Ако почнеме пишување во индекс 5, кој ние немаме кога имаме низа од големината 5, ние започнуваме пишување во Индекс 6, 7, 8, 9, ние може да се добие Стак Претекување грешка. Општо земено тоа не е - веројатно ќе добиете во неволја ако поминат по една. Но, генерално, ќе добиете во повеќето проблеми ако одите во текот на многу а ти оди толку далеку над тоа ти пишувам во текот на повратната адреса на таа функција, која се наоѓа во дното од оџакот рамка. Бидејќи, нели? Вас - во - Жал ми е. Не ", бидејќи во право." Во магацинот рамка, имате Вашиот локални променливи. На самото дно на магацинот рамка е враќање адреса. Тоа е каде што функцијата оди кога тоа е готово. И ако ги избрише тој се врати адреса, а потоа кога тоа оџакот рамка, кога ќе одиш преку оџакот рамка и извршување на секоја линија, ти си ќе одат на вашиот нов враќање адреса тоа е напишано таму, наместо на Крај на една. И тоа како сме виделе некои нарушувањата на безбедноста може да се случи со компјутери. Па магацинот претекување, накусо, е кога ќе ја пребришете дел во магацинот си требал да го користите, локалната променлива си требал да го користите, и особено кога ќе почнете да пребрише важни работи како на врати адреса. И тоа е местото каде што ќе добиеш грешка. Или можеби дури и можете да започнете дури и пишување во - велат бинарни пребарување беше право над главниот. Ако overwrote многу, би можела да напише во главната. Но, генерално, ќе добиете грешка пред тогаш, затоа што компјутерот знае правиш нешто што не треба да се прави. Да. Студент: Што е разликата меѓу магацинот претекување и на buffer overflow? ЈАСОН Hirschhorn: Buffer overflow е повеќе генерички тип на она што јас сум само што е опишано. Студент: Значи магацинот претекување е пример на buffer overflow. ЈАСОН Hirschhorn: Токму така. Ова е низа можеме да размислуваме за како тампон, простор за работите да одат внатре Ова е оџакот buffer overflow. Ние би можеле да имаат еден куп buffer overflow. Ако имаше тампон, кој таму често е низа на куп, и ние overwrote оние граници, тогаш ние би имаат еден куп buffer overflow. И надвор од опсегот на овој курс, тие се откриени малку поинаку. Компајлерот има посебни начини за откривање на секоја од нив. Но на buffer overflow е повеќе генерички тип на она што е опишано, која беше магацинот buffer overflow. Дали дека одговори на вашето прашање? Слатка. Беа таму било какви други прашања поврзани со на оџак или грамада? Да. СТУДЕНТСКИ: Знам дека треба да се слободно жици затоа што тие се во грамада а вие не сакате да излегуваат во јавноста меморија. Но, дали треба да се ослободи глобални променливи и работи како што? Или се тие автоматски ослободени? ЈАСОН Hirschhorn: Добро прашање. Па во CS50.H, ние ја креирате оваа работа за да те повика стринг. А низа е навистина она? Студент: Char ѕвезда. ЈАСОН Hirschhorn: N знак ѕвезда, покажувач на карактерот, покажувач на низа на карактери. Тоа е она што на стрингот е. Значи ние треба да се ослободи, бидејќи getstring, која ние се користи многу - Стринг име е еднаква на getstring - дека mallocs за нас некои меморија на грамада а потоа се враќа покажувач на првиот карактер на таа стринг, на знак ѕвезда. Па навидум, ако не сте биле пишување слободен за било која од вашите жици дека сте се нарекува досега, имате протекување некои меморија. Се разбира, ние не се зборуваше за тоа, па никој не е дојден во проблеми за тоа го правам. Но оди напред, да. Кога ќе се јавите getstring, ти си mallocing некои простор на грамада. И ако не се јавите бесплатно подоцна дека стринг, имаш меморија течење. Дека одговори на вашето прашање? Да Студент: Значи да го стори тоа, ние ги користиме слободно пред да се врати? Како, во рамките на, претпоставувам ако ние велиме, како, int главната, во рамките на обемот на кодот кој е во рамките на тие тркалезните загради, непосредно пред - знаеш каде сакате обично се стави враќање. Да ви стават слободни пред тоа? ЈАСОН Hirschhorn: Значи може да се стави слободен секаде каде што сакате да се стави бесплатно. Бидејќи тие се динамички доделени променливи, бидејќи тие може да живеат надвор од опсегот на одредена функција, ако ти се јавам Примерок во посебна функција, на пример, getstring, можете да се јавите бесплатно во главните. Вие не треба да го наречеме во специфична функција каде Примерок се нарекува. Но вие не треба да го наречеме пред главната враќа. И тоа навистина зависи. Тоа зависи зошто ви malloced дека простор на прво место. Некои луѓе ќе се јавите ослободи прилично брзо. Некои луѓе нема да се јавите бесплатно, додека на крајот од нивната програма. И тие ќе поминат низ и слободни сè. Тоа зависи зошто те повика Примерок. Студент: А што би рекле ако наречен употреба getstring? Што би рекол слободно што? ЈАСОН Hirschhorn: Значи синтаксата за слободен е едноставно слободна, отворена paren, во близина paren и името на покажувачот. Па ако напишете Стринг име еднаквите getstring, ќе се стави име тука. Тоа е името на покажувачот. И тоа знае да се ослободи таа меморија. Студент: Значи, кога станува ослободува дека меморијата, покажувачот сеуште покажува кон тоа место во меморијата? Или е покажувач, исто така, се празнат на на адресата на која се укажува на. ЈАСОН Hirschhorn: Ние треба да се обидеме тоа. Ние треба да ги шифрираат тоа. Ајде да се врати кога ќе стигнеме во кодирање, и ајде код кој. И ако сакате да дознаам одговорот тоа, исто така можете да кодот, кој во меѓувреме. Но тоа е големо прашање. СТУДЕНТСКИ: Дали е можно да се слободен нешто прерано? Па се уште е потребно за вашата програма, а вие ослободен дека мемориски простор? ЈАСОН Hirschhorn: Да. Тоа е можно, ако сте слободни нешто , а потоа можете да ја користите повторно, ќе извршувате во грешка. Но, тоа е на вас, затоа што се ослободува нешто, а потоа го нарече подоцна. Така што беше грешка на програмерот. Но да. Можете да напишете тоа. Повеќе прашања во врска - Да. Студент: Значи, ако треба само да слободна, таа воопшто пред Програмата завршува, дали тоа значи ако Програмата завршува и ти не го ослободи, дека меморијата е сеуште распределени? ЈАСОН Hirschhorn: Ако вашата програма завршува и да заборавите да се ослободи нешто, тогаш дека меморијата е доделен текот векот на траење на вашата програма. Кога вашата програма се затвора во целост, дека меморијата не се случува да остане таму засекогаш. На компјутер е доволно паметни да знаат дека кога на програмата се затвора, треба да се ослободи од сите на меморијата што бил поврзан со таа програма. Сепак, постојат алатки можете да го извршите на програмата да се открие ако, кога програмата ќе заврши, сте заборавиле да се ослободи некои меморија. И за вашиот следен проблем постави каде што ќе биде со користење Примерок и користење на совети, ќе се работи овој Програмата на вашата програма да се види дали, кога главната враќа, сте имале некои работи кои биле оставени unfreed. Па тие нема да останат malloced засекогаш во вашиот компјутер. Тоа би било непотребно, затоа што многу брзо, компјутери ќе снема меморија. Но, ако тие трае до крајот на вашиот програма и тие не се ослободени и вашата Програмата излегува, тоа е уште еден проблем дека оваа алатка ќе ви помогне да се обрати. СТУДЕНТСКИ: Дали е тоа Valgrind? ЈАСОН Hirschhorn: Тоа е наречен Valgrind. И ќе биде - Студент: Но, ние не треба да се знаат дека за квиз, иако? Мислам, тоа беше зборуваше за малку кај предавање. ЈАСОН Hirschhorn: Значи Valgrind е името на таа алатка. Знаејќи го она што го прави тоа е доволно за квизот. Но вие не го користат уште на вашиот проблем во собата, бидејќи ние не сме имале Проблемот сет кој експлицитно се занимаваа со Примерок или со користење Примерок. Па не сте го користеле Valgrind уште. Но ќе го користите порано отколку подоцна. СТУДЕНТСКИ: Можете ли да го повтори што Valgrind е? ЈАСОН Hirschhorn: Молам? СТУДЕНТСКИ: Можете ли да го повтори она што целта на Valgring е? ЈАСОН Hirschhorn: Valgrind е името - како GDB ви помага да debug вашата програма, Valgrind ви помага да дознаам ако работите не се ослободени кога вашата програма се затвора. Па ќе се пушта и на вашата програма. И вашата програма излегува, и тоа ќе го каже вашата програма наречена Примерок ова многу пати за ова многу бајти, а вие само наречени слободни ова многу пати. И така си замина овие многу бајти без да бидат ослободени. Или тоа ќе кажам сте ослободени сè. Добра работа. Студент: OK. И се вика Valgring? JASON Hirschhorn: V-A-L-G-R-I-N-D. Студент: Прашањето за совети. Така велат дека имаат N ѕвезда x е еднаква на нешто. Тоа е еднакво, што и да се стави таму, е тоа што она што се стави внатре што x е да се покажува, или покажувачот на X? ЈАСОН Hirschhorn: Може да ви го повторам прашањето? Можеме да го нацрта тоа додека го кажеш? СТУДЕНТСКИ: Во квиз, всушност, оној што ни испрати, тоа беше како, знак ѕвезда вистината еднаква CS50 карпи, нели? Па дали тоа значи дека CS50 карпи е она што вистината е да се покажува? ЈАСОН Hirschhorn: Значи зборуваме за знак ѕвезда во низа, како што работи? Да. OK. Ајде да се подготви овој овде. [СТРАНА РАЗГОВОР] ЈАСОН Hirschhorn: Значи оваа променлива ќе биде од типот char ѕвезда. Колкава е променлива од типот char ѕвезда? Колку бајти? СТУДЕНТИ: Четири. ЈАСОН Hirschhorn: Тоа е четири бајти. Колку права е променлива од типот int ѕвезда? СТУДЕНТИ: Четири. ЈАСОН Hirschhorn: Четири бајти. Ако тоа е покажувач, тогаш тоа е секогаш четири бајти, бидејќи покажувачи, нивните вредност е мемориска адреса. И меморија адреси на CS50 апаратот четири бајти долго. Значи, кога ние го нарекуваме getstring, или кога да речеме, stringname еднаква, а потоа во двојни наводници стави стринг, ние се стави - добро, тоа е малку различен. Ние ќе направиме getstring како пример. Или знак ѕвезда нешто еднакво стрингот. Жал ми е, дај ми го на пример да го прочитате? СТУДЕНТСКИ: знак ѕвезда вистината еднаква на "Cs50 карпи" во наводници. ЈАСОН Hirschhorn: Значи оваа ѕвезда, овој ќе го наречеме оваа променлива x за нашите генерички цели. Ние направивме променлива наречена х. Тоа е тип char ѕвезда. Тоа е покажувач кон низа на карактери. Толку долу тука - Значи ова е како тоа ќе работат во меморија. Ова ќе се сместат мемориска адреса. Тоа ќе се сместат на мемориската адреса на првиот карактер во низа. А потоа, кога ќе следи покажувачот, ќе добие првата карактер. И ако сте читањето на оваа работа како низа, вашиот компјутер е паметен доволно за да знам, да се прочита целата оваа работа додека таа добива да реакции 0. Но, ако сте го читање карактер на време, па ти си процесирањето преку овој стринг, тогаш само ќе прочитате карактер во време додека не стигнете до обратна коса црта 0. Дека не може да одговори на вашите прашање, иако. Студент: Да, но вие не треба malloced тој простор уште за тоа покажувач. ЈАСОН Hirschhorn: Па јас не сум сосема сигурен токму она што го барате, бидејќи јас не го направат тој квиз. Што требаше да биде корисен ресурси од друг ТФ. Ако се создавање на низа на магацинот или како локална променлива, тоа ќе само да биде спектар на обвиненија наместо генерално char ѕвезда што укажува друг стринг. Но јас не го знам. Тоа би можело да биде покажувач на друг низа на магацинот, како и. Да. СТУДЕНТСКИ: Знам дека треба да се алоцира меморија ако покажувачот е добивање прогласена во внатрешноста на друга функција. Дали треба да го прават истото, ако тоа е да биде прогласена во внатрешноста на главниот, ќе го користите во внатрешноста на главниот? ЈАСОН Hirschhorn: Така да. Можете може да прогласи покажувачот на било меморија адреса во меморијата. Тоа може да биде на мемориската адреса на локален променлива, иако многу пати, луѓето не се изјасни мемориски адреси на локалните променливи, бидејќи тие одат далеку еднаш таа функција се враќа, која е причината зошто ние обично Примерок работи. Но да, може да прогласи покажувач на друга локална променлива. Тоа е само обично не е направено. Но, можам да ги разгледаме во тоа специфична работа по класа. Да. Студент: Мислам дека ова е еден вид на она што се бара. Тоа не изгледа чудно да се иницијализацијата покажувач не како адреса, но како што изгледа како вредност. Изгледа дека CS50 е она што е внатре нешто се вперени кон и не на реалните адреса, нели? ЈАСОН Hirschhorn: Значи тоа е не е случај, иако. Тоа не е она што се случува. Кога ќе прогласат знак ѕвезда, тоа е мемориска адреса. Покажувачи се сите мемориски адреси што укажува на нешто друго. Дека нешто друго би можеле да бидат на магацинот, но речиси секогаш е на грамада во начинот на кој ние ќе се види тоа се користи. Но stringname еднаква на двојно цитат "Getstring", можеме да видиме дека и ние може да се погледне преку тоа и кодот кој. getstring низа не се зачувани во таа променлива, или што и низа името не се зачувани во кои променлива, не затоа што тоа е како совети работа. Дали тоа има смисла? Студент: Да. ЈАСОН Hirschhorn: OK. Се надевам, дека не беше збунувачки за никого. Но, ако тоа беше, ние може да се погледне во него повторно во малку, бидејќи ние сме всушност ќе да кодот нешто што се надевам дека ќе работи со жици и помогне да се чувствувате повеќе удобно со нив. Било какви други прашања во врска со овие постојат теми или други теми кои Јас ќе се стави се врати? И - токму сега. Да, Alden. ALDEN: Значи ова е сосема неповрзани, но може да ние само одиме во текот навистина брзо она што треба да знаете за разликата помеѓу 32 и 64-битна машина? ЈАСОН Hirschhorn: Да. Па 32 битови е колку бајти? ALDEN: Тоа е четири бајти. ЈАСОН Hirschhorn: Тоа е четири бајти. И 64 битови е колку бајти? СТУДЕНТСКИ: Осум. ЈАСОН Hirschhorn: Осум бајти. Значи, повторно, осум битови е еден бајт. Вашиот CS50 апаратот е 32-битна машина. Значи мемориски адреси се четири бајти долго. Постојат 2 до 32 меморија адреси. 0 до 2 до 32 минус 1. И јас не сум позитивен, но тоа е веројатно обемот на она што треба да знаат за 32-битна машина, дека меморијата адреси се, повторно, четири бајти долги, и тоа е максималниот износ меморија адреси. Исто така, типови на податоци - ова може да биде нешто како Па тоа е вреди да се напомене. Големината на податочен тип зависи машината си работат со. Па знак, еден лик, е како многу бајти на нашата CS50 апаратот? Еден бајт. А тоа е всушност еден бајт како и на 64-битна машина. И повеќето типови на податоци се исти број на бајти на двете машини. Но, некои типови на податоци ќе бидат различни на двете машини. Така што ќе биде потенцијално Единственото нешто што треба да знаеш. Но дури и тоа, мислам, е надвор од границите - Јас сум речиси позитивни, ако се погледне назад во старите квизови, што се вели, се претпостави за кодирање проблеми сте користење 32-битна машина. Но, постојат, за да одат заедно со тоа во случај да сте заинтересирани, постојат типови на податоци кои може да бидат исти големина на сите машини. Ако сте виделе нешто слично uint32_t, ќе може или Не сум ја видел тоа. Тоа е тип на податок. Дека е велејќи дека, да биде 32 бита, без разлика што машина ова е за. Така, кога луѓето се пишува преносни кодот, тие веројатно нема да се користи ints. Тие наместо ќе ги користат овие други податоци типови кои тие знаат да бидат исти големината на секоја машина. Madhu. Madhu: Имав прашање за компилација процес. Значи, ако сте пишување програма која користи библиотека како CS50 или нешто како што, знам дека таа библиотека мора, во некоја точка, да биде Составувач и се поврзани внатре Но колку од тоа ќе се случи за време на компилација на вашата програма? Кој дел од таа библиотека процес се случува кога сте составувањето на сопствена програма? ЈАСОН Hirschhorn: Па ајде да одиме во текот Општо земено чекорите на овој процес. Ќе напишете вашиот. В датотека. Во вашиот живот. В датотека, можете # вклучите вашиот насловот библиотеки, на пример, cs50.h. Што значи дека остар вклучуваат линија направите за вашата програма? Akchar. AKCHAR: Таа додава прототипи на функциите од насловот слики во библиотеките. ЈАСОН Hirschhorn: Токму така. Таа додава оние функција прототипи во кодот. Значи, кога вашиот код се собрани во раните фази, компајлерот знае дека навистина постои на овие функции, и дека некаде тие се дефинирани. На. Ж датотеки не ги вклучуваат дефиниции за овие функции или како тие всушност работат. Cs50.h само вклучува нешто што вели getstring е вистинска работа дека може да се случи. И standardio.h вели printf е вистински нешто што може да се случи. Така да твојот в јазик со ова. Насловот датотека добива претвори во некои машински-читлив код, кој на крајот добива претвори во бинарен код, 0 и 1 е. И тоа е код кој на крајот добива погубен. -L cs50 линија - на пример, кога сте пишување ѕвекот - а потоа ќе вклучуваат-л cs50, ќе напишете дека внатре И ќе се види тоа. Кога пишувате направи, да ќе види дека линијата тука. И ние ќе се види дека во втората, кога ние код или подоцна, кога ние код. Но тоа-l cs50 линија прави нешто малку поинаква од на # вклучуваат cs50.h. Што значи дека-l cs50 линија направам? Ави? Ави: Сакам да кажам дека тоа го поврзува библиотеката на функцијата јавете се, како. o датотеки. ЈАСОН Hirschhorn: Значи многу блиски, ако не на самото место-на. -L cs50 зема бинарна датотека и спои со вашиот бинарна датотека. Па cs50.h, не постои точка во вртење cs50.h од јазикот Ц за да Бинарни секој едно време тоа е се користи. Тоа би било глупо, затоа што ќе потроши многу време. Па тоа е веќе подготвено и се претворила во извршна. А сега тоа се случува да биде споена со вашето досие на крајот. Па оние 1 и 0, се случува да се логирате со вашата оние и 0 на крајот. Па сега вие всушност ќе имате вистинските 1 и 0, со кои се дефинира како getstring, на пример, работи, или како printf, на пример, работи. И за повеќе информации, има краток компајлери дека Нејт дава дека треба да проверите што оди преку овие чекори. Но - Да. Студент: Дали тие секогаш во о датотеки. кога тие се во библиотеката форма, подготвени да се спои, поврзани - како тие се во бинарен код? ЈАСОН Hirschhorn: OK. Што - СТУДЕНТСКИ: Дали е тоа секогаш случај за библиотеките кога ќе ги поврзе? ЈАСОН Hirschhorn: Да. Па таму е. На датотеки, кои ќе бидат машина код, кој исто така ќе биде криптичната за вас. Вие не треба да се грижите за нив. Но генерално, да, тие ќе да бидат во. O датотеки подготвени да одите. Студент: Значи, кога ќе брод во библиотека, дали само брод на. h и. o? Вие не брод на. В или. Е. ЈАСОН Hirschhorn: Значи - и ова е во овој краток како и, ако овие информации се чини дека доаѓа од малку брзо. Но кратко на компајлери зборува за тоа како добро. Кога ќе брод библиотека, ако бродот на. h, хедер датотека, оние функција прототип, и на 1 и 0, тоа е се што треба да се даде. Вие не треба да се даде како функција работи, на. в датотека. Бидејќи точката на апстракција, или точка API-јата, поентата на ова SPL, преносни библиотека Стенфорд, тоа е за да не се грижи за тоа како нови GRect работи, или како се движат работите, или како да додадете дела. Сите што треба да знаете е дека додаток е функција која може да се го користите, и тоа го прави ова. Така што навистина не треба да знаат како тоа е напишан во C. Вие само треба да Знаете, тука се и функциите, она што тие се направи, и тука се е 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, ти си на крајот, и може да тргнат назад. Значи, ако сакавме да се напише рекурзивна функција за пресметување на факториел, ние ќе пишуваат некои pseudocode за тоа. Пред да се напише дека pseudocode - Јас ќе ви даде момци неколку минути да се напише на псевдо код или само мислам за тоа - постојат две работи секој рекурзивен функција потреби. Кои се тие две работи? ЖАК: Таа треба да се јавам. ЈАСОН Hirschhorn: Ное? Ох, Џек. Оди напред. ЖАК: Таа треба да се јавам. ЈАСОН Hirschhorn: Значи рекурзивен функцијата треба рекурзивен повик, повик за себе. Тоа е една. И она што е на другата работа? ЖАК: А база случај. ЈАСОН Hirschhorn: А база случај. А база случај е, тука е кога ќе престане. Така да твојот функција добива се нарекува. Основното сценарио се случи прво. Сакате да знаете ако сте на крајот. И ако не сте на крајот, ќе направите вашиот рекурзивен повик. И ќе поминат низ оваа функција, повторно, проверете ја вашата база случај повторно. Ако не сте на крајот, ќе се направи друг рекурзивен повик, и така натаму, и така натаму. Тоа е зошто рекурзивен функции секогаш треба оние база случаи и оние рекурзивните повици. Ако немате рекурзивен повик, нема да биде рекурзивен функција. Ако не имаат база случај, ќе одат засекогаш и нема да има крај. И на база случај секогаш на прво место, затоа што секогаш ќе сакате да се провери ако сте на крајот во прв план. Па пред да направите некои pseudocode, зошто не ве однесе една минута да се размислува за како рекурзивен факториел функција ќе бидат напишани? Исто така, колку што вие го правите, пишување тоа надвор на лист хартија е што ви се случува да мора да направи на квизот утре. Па веројатно добра пракса да се направи сигурни дека кодот сте пишување долу на лист хартија - или можете да го направите тоа. Знаете каде запирки се. Се сеќавате на синтакса. Затоа што не си бидат во можност да имаат компајлерот ви каже направено грешка. Исто така, заедно оние линии, утре, кога имате кодирање проблеми, ако се упатиле за време, или ако сте многу збунет за тоа како вие би требало да се пишуваат на одредена работа во C, тоа ќе ви подобавам да се напише псевдо-код или пишуваат коментари како добро. Бидејќи има делумна заслуга за многу прашања на квизот. Па можеби ќе се брзаше, или можете само може да се мешаат. Пишувајќи во коментари или псевдо-код често се начини на кои можете може да се добијат делумен кредит. Па не остави нешто празно на квизот. Нема казни за ставање работите внатре Всушност, пуштање во псевдо-кодот или коментари ќе им помогне на човек кој степенува дознаам ако навистина знаете што зборуваш, а можеби и награда вас некои делумна заслуга за тоа. Исто така заедно оние линии, пишува јасно. Ако ние навистина не може да она што го пишувам, ние нема да ти се јавам на полноќ утре да фигура од она што сте го напишале. Ние сме само ќе да полета поени. Напиши јасно, така што може да се слушне, или подобро, ние може да го прочитате она што сте го напишале. И ако тоа вели дека две реченици, не напише став. Следете ги инструкциите. Напиши јасно. И напишете во овие коментари или pseudocode за прашања кои би можеле да Наградата делумно кредит. Добро, ајде да одиме на факториел. Па ние имаме функција факториел. Ако јас да се всушност пишува овој во C, што ми треба да се стави пред името на функцијата? Типот возврат, што, во овој случај, ние ќе го даде Инт. А потоа внатре во големи загради, е она што се случува во внатрешноста на тркалезните загради за функција? Студентите: Аргумент тип. ЈАСОН Hirschhorn: нејзините аргументи. Па факториел веројатно ќе преземе аргумент. Тоа ќе веројатно само се еден аргумент. И ние ќе велат дека тоа ќе се цел број наречен x. И повторно, кога пишувате на прототип на функција или пишување на функција во вашиот код пред дефинирањето тоа, вие пишува типот податоци и името на таа променлива за таа функција само. Така да може да помине некое број во овој функција, тоа ќе бидат наведени како x внатрешно. Ние имаме факториел функција. Ние треба две работи, база случај и рекурзивен повик. Што е база случај за факториел? Некој кој го напишал надвор и кој не е уште зборува, што е основа случај за факториел? Студент: Ако n е помалку од 2, врати 1. ЈАСОН Hirschhorn: Ако n е помалку од 2, се врати 1. Ми се допаѓа тоа, бидејќи тоа се грижи за 0 и 1. Па ние ќе го стори x <2, се врати 1. Ако ние се донесе 0, ако добиеме помина 1, оваа функција ќе веднаш да се врати 1. Ако добиеме положиле некои број поголем или еднаква на 2, ние ќе имаме рекурзивен повик. И така, како е тоа оди на работа? Може некој друг кој работеше на овој кои се уште не зборува ми даде рекурзивен повик за оваа функција во pseudocode? Ако ние се донесе во голем број x и тоа е поголема од 2, што сакаме да направам? Ние исто така имаме пример напишани на страна која може да ви даде совет. СТУДЕНТСКИ: Повик x пати факториел од x минус 1? ЈАСОН Hirschhorn: токму во право. Ние ќе се вратат х пати факториел од x минус 1. И дека, иако јас го напишав горе, Во суштина, она што се вели во англиски, овој факториел функција ќе се нарекува повторно. Тоа ќе се изврши на X минус 1. Тоа ќе се вратат со некои цел број, и тогаш тоа ќе се мултиплицираат овие две заедно, и таа вредност ќе биде врати на она што се нарекува овој факториел функција, која може да биде уште една инстанца на овој факториел функција. Па тоа е еден пример на рекурзивен функција, многу едноставна рекурзивен функција. Но, повеќето од нив ќе биде вака. Ако сакате да добар рекурзивен предизвик за квизот, обидете кодирање бинарни пребарување рекурзивно. Бидејќи ако не бинарни пребарување за Проблемот се утврдени три, најверојатно тоа го правеше iteratively подолго време јамка. Но исто така може да бидат напишани рекурзивно. Сте ќе треба да напишете своја сопствена посебна функција која трае некое различни командната линија аргументи - или не командната линија аргументи, некои различни само редовни аргументи. Но може да пишуваат бинарни пребарување рекурзивно, како и. Студент: Значи вие би можеле да имаат исто така напишани, наместо на x минус 1, можете би можеле да имаат исто така напишани x минус минус, или би можеле да имаат напишано минус минус х. Може да ви само објасни навистина брзо зошто оние ќе бидат различни нешта, како што разликата е помеѓу x минус минус и минус минус X? ЈАСОН Hirschhorn: Не, јас не сум одам да си во тоа. Но јас ќе зборувам со вас за тоа по класа. x минус минус минус минус x Намалување x од 1. Но тие го прават тоа малку поинаку. Но, јас не сакам да одам во тоа. Други прашања во врска со рекурзија или оваа функција? Тоа не е навистина дури и pseudocode. Тоа е во основа го кодот во C ќе пишувам за ова. Добро, било какви други прашања за теми овде? Да. СТУДЕНТСКИ: Имам еден брз преглед на подвижна запирка и прецизност. ЈАСОН Hirschhorn: Пловечки точка и прецизност. Може некој навистина брзо ми даде преглед на подвижна запирка и прецизност? Сите вас мораше да го направи тоа за вашиот проблем во собата, па вие ќе бидете сите запознаени со него. Или можеби не сите од вас. Некој? Дај ми почна место. Подвижна запирка и прецизност. Што е проблемот? Да. Викторија? VANESSA: Ванеса. ЈАСОН Hirschhorn: Ванеса. Жал. VANESSA: Има само ограничен број на броеви кои може да се претстави затоа што ти си на, во нашата случај, 32-битен систем. Па можете вид на мора да сочинуваат некои броеви. ЈАСОН Hirschhorn: Значи тоа е точно во право. Има само одредена количина на броеви кои може да се претстави. Ако множете две многу големи броеви, тоа би можело да претекување на износот на празни места што треба да претставуваат цел број. Тоа е зошто понекогаш ние ги користиме долго долго наместо Инт. Кој има повеќе простор. Дека може да се одржи поголем број. Подвижна запирка прецизност има врска со тоа, но, исто така, треба да се прави со Фактот дека децимални броеви се не секогаш застапени. Жал. Дозволете ми да го стави ова назад. На децимален број 1,0 не е секогаш претставен како што би очекувале, 1,000000000. Тоа понекогаш е претставен како 1,000000001 или 0,999999999. Тоа би можело да биде дури 89 фрлени таму некаде. Па оние децимална броеви не се претставен токму како што би очекувам од нив да бидат претставени. Па во проблем постави - тоа беше две - проблем го поставите две, каде што се занимаваа со броеви со подвижна запирка, кога сакавме ги претставуваат токму она што сакавме да ги претставуваат, бројот на пени, или бројот на центи, ние ги множи со 100. Ние ги заоблени. А потоа ние отсечени што зад децималната запирка. Тоа беше да се осигура дека тие би всушност еднаков токму она што сакавме нив да се изедначи. Затоа што кога ќе се земе нешто што е Носете и завртите го во int, можете отсечени сè да се право на децимална точка. Затоа што има некои подвижна запирка непрецизност, 100,000 би можеле да бидат претставен како 99,999999999. И ако само отсечени сè да право веднаш, си оди за да добие погрешен број. Да. СТУДЕНТСКИ: Имав прашање за кастинг. Она што цел го прави тоа да се случи во? Ако би го сторила плови, загради, 1 поделена од 10, не го прават тоа 1 поделено со 10, потоа да 0,1, а потоа се сврти го во плови? ЈАСОН Hirschhorn: Ако го направите плови 1 поделено со 10 - Студент: Да, и потоа еднаква на - Па, тоа ќе нормално имаат еднакви во - Да. Сакате да го плови направи, нели? ЈАСОН Hirschhorn: Добро, така што ние ќе треба да користите дека за да segue во пронајдат одговорите на овие прашања преку кодирање. Затоа што веројатно ќе имаат многу Овие минута прашања, и добар начин да ги реши преку кодирање. Па ние ќе го кодот ова право сега, а потоа ние ќе се вратиме и кодот на прашањето сте имале. Па на првата линија - Јас не треба да го напишана - што е првото нешто што сакаме да правиме кога ќе отвори нова датотека во gedit? СТУДЕНТСКИ: Вклучете. ЈАСОН Hirschhorn: Вклучете што? Студент: CS50 библиотека. ЈАСОН Hirschhorn: OK. Што друго треба да ги вклучиме? Ние сме само ќе да се провери што се случува кога ќе го дадат нешто да плови. Но, она што ние треба да се вклучат ако ние сме ќе напише C програма? СТУДЕНТСКИ: Стандардна I / O. ЈАСОН Hirschhorn: stdio.h. Ние всушност не треба, за овој програма, cs50.h, иако тоа е секогаш е корисно да се вклучи. Но ние секогаш треба stdio.h. СТУДЕНТСКИ: Кога кодирање во C? ЈАСОН Hirschhorn: Кога кодирање во C. Па јас го зачувате како ова. В датотека. Јас добиете некои убави синтакса за нагласување. Напишав празнина во внатрешноста главната. Што значи празнина значи? Студент: не презема командната линија аргументи. ЈАСОН Hirschhorn: празнина средства, во овој случај, главните не презема командната линија аргументи. Во други случаи, тоа значи дека функцијата не се командната линија аргументи. Или функцијата, ако јас се да се напише празнина главната (празно), што би рекол главниот е не се враќа ништо. Па празнина само значи ништо. Што би се напише ако јас се да земе командната линија аргументи? СТУДЕНТСКИ: int лак в низа лак против ЈАСОН Hirschhorn: int argc низа argv. Е тоа право? СТУДЕНТСКИ: Тоа е знак ѕвезда argv голема заграда. ЈАСОН Hirschhorn: Значи можете да напишете низа argv заграда или знак ѕвезда argv загради, но ви треба голема заграда. Бидејќи argv е низа на стрингови, се сеќавам. Тоа не е само еден стринг. Па низа argv е, тука е еден стринг наречен argv. Стринг argv загради е, тука е низа на стрингови. Па int argc низа argv загради ќе биде нешто што јас најверојатно, ќе пишувам. Па си сакал да ги зачувате во цел број? Студент: Да, цел број. Или во плови. ЈАСОН Hirschhorn: Во плови? Како, плови x е еднаква на 1 поделено со 10. ЈАСОН Hirschhorn: OK. Како можам да испечатите плови во printf? Што? Студент:% f. ЈАСОН Hirschhorn:% f. Што е цел број? d или i. Што е стринг? СТУДЕНТСКИ: S. ЈАСОН Hirschhorn: S. Како можам да добијам нова линија? Студент: Обратна коса црта n. ЈАСОН Hirschhorn: Што ми се врати ако главните работи правилно? СТУДЕНТСКИ: 0. Дали треба да се напише таа линија, иако? СТУДЕНТСКИ: Не Добро, ние нема да го напише, тогаш. Може да се прочита дека сите? Тоа изгледа малку мала. Може сите да се види, или треба да Јас го направи тоа поголема? Мислам дека за камера, ќе направиме тоа е малку поголем, иако. ЈАСОН Hirschhorn: Ако сакам да го претвори ова . В поднесе во извршна, што можам да пишувам? СТУДЕНТСКИ: Направете тест. ЈАСОН Hirschhorn: Молам? СТУДЕНТСКИ: Направете тест. ЈАСОН Hirschhorn: Направете тест. Ние се зборува за оваа линија порано. Ѕвекот. Што е ѕвекот? Името на компајлерот. Што е оваа линија? СТУДЕНТСКИ: Поставува го за употреба на gdb. ЈАСОН Hirschhorn: колекции го за употреба на gdb. Оваа линија, што е тоа? Студент: изворниот код. ЈАСОН Hirschhorn: Тоа е изворна датотека, на. в датотека. Што прават овие две линии направам? Или овие не две линии. СТУДЕНТСКИ: Тоа имиња го тестираат. ЈАСОН Hirschhorn: Значи цртичка o вели, именува тоа нешто поинаку. И тука си нарекувајќи тест. Ако јас не го имаат тоа во, што ќе го именува ова? Студент: a.out. ЈАСОН Hirschhorn: a.out. Што значи тоа го прават? Студент: Линкови математика библиотека. ЈАСОН Hirschhorn: Таа поврзува во математика библиотека. Ние не вклучуваат математика библиотека, но бидејќи тоа е толку честа појава, тие имаат напишано направи да секогаш се вклучени математика библиотека. И исто така, ова вклучува библиотеката CS50. OK, па ако ние листа, сега имаме извршна нарекува тест. Да ја изврши, јас се напише тестот. Гледам дека мојот подвижна запирка, како што се очекуваше, е еднаква на 0. Дали тоа - па - Студент: Потоа, ако се стави плови сега, како ви се дадени како плови - ЈАСОН Hirschhorn: Леано 1 до плови? СТУДЕНТСКИ: Не, фрли целосна работа - Да. Ако само го направи тоа, би кои го прават тоа 0,1? ЈАСОН Hirschhorn: Добро, па навистина брзо, 1 поделено со 10, тоа се броеви се поделени. Па кога ќе делат цели броеви, тие се 0, а ти си заштеда дека 0 во плови, бидејќи коса црта е само цел број поделба. Па сега ние сме вртење нешто во плови. Ајде да видиме што се случува. Ќе се направи тест. Па сега можеме да видиме дека црта не беше број поделба, тоа беше лебдат точка на поделба. Бидејќи една од неговите аргументи биле фрлени плови. Па сега тоа го кажувам, третира овој поделба како ние сме се занимаваат со лебдат поени, а не со цели броеви. И така ќе го добиеме одговорот што очекуваме. Ајде да видиме што се случува - Упс. Ако сакав да печати повеќе децимална спотови, како би можеле да го направам тоа? СТУДЕНТСКИ: Точка точка F, или како што многу децимални места, колку што сакате. ЈАСОН Hirschhorn: Па јас печати 10 децимална дамки. И ние сега гледаме ние сме добивање некои чудни нешта. И дека се навраќа на вашето прашање за подвижна запирка непрецизност. Има чудни работи се чуваат во тука. Добро, не дека одговори на вашето прашање? Што друго не сакате да кодот брзо? СТУДЕНТСКИ: Јас само сакав да видам дали или не, ако се ослободува некои покажувач, дали тоа покажувач уште се чуваат во тоа адресата на она што беше укажувајќи на претходно. ЈАСОН Hirschhorn: Добро, па ајде направите тоа. Char ѕвезда кон меморија, ова создава променлива наречен кон меморија од типот char ѕвезда. Како можам да се напише Примерок? Alden? ALDEN: Само Примерок. Но, тогаш тоа мора да биде големината на, и во овој случај, претпоставувам дека ќе се укажува на знак. Значи тоа би било знак. ЈАСОН Hirschhorn: Добро, толку повеќе генерички, внатре - ајде да се уреди. Внатре Примерок, сакате бројот на бајти на грамада. Општо земено, она што сум го видел, дека ние сме прави е ние ќе Примерок жици, на пример, или низи на цели броеви. Значи, ако сакаме 10 броеви, или 10 карактери, 10 ќе ни даде 10. А потоа големината на карактери ќе им даде нас дека големината на карактери, кои во овој случај е 1 бајт. Добиеме 10 бајти. Ако ние требаше да се напише големината на int, дека ќе ни даде 40 бајти. Па повеќе генерички, во внатрешноста на Примерок е бројот на бајти сакате. Во овој случај, ние сме добивање 1 бајт. Кој изгледа како чуден употреба на Примерок, но за нашите цели го прави смисла. Па таму е тоа. Ние ќе се јавите бесплатно. Ние се ослободи од неа и ние ги користиме кон меморија повторно. И она што не сакате да се провери? Студент: Сакав само да се провери дали или не постои ништо во него. ЈАСОН Hirschhorn: Значи, дали тоа укажува на нешто? Студент: Да, точно, без разлика дали се уште има мемориска адреса. ЈАСОН Hirschhorn: Значи сакате да се провери вредноста на кон меморија? Студент: Да, точно. ЈАСОН Hirschhorn: Што ми пишуваат тука ако сакам да се провери вредноста на точка - што е, Јордан рече, вредност? Или она што се чува во внатрешноста на кон меморија? Студент: А мемориската адреса. ЈАСОН Hirschhorn: А мемориската адреса. Значи, ако јас напишам само тоа, тоа ќе ми даде вредноста на кон меморија. И како можам да испечатите меморија адреса? Што е формат стринг за мемориска адреса? СТУДЕНТСКИ:% стр. ЈАСОН Hirschhorn:% стр. % S е стринг. % P за покажувач. Е тоа право? Дека е во право. Па кон меморија еднаква на - се уште има нешто во неа. Ова е веројатно повеќе интересно прашање. Што значи дека линијата направам? Студент: сег грешки. ЈАСОН Hirschhorn: Што? Студент: Мислам дека тоа СКГ грешки. ЈАСОН Hirschhorn: Hm? Студент: Мислам дека ќе СКГ вина. ЈАСОН Hirschhorn: Значи оваа линија код, ѕвезда кон меморија, што не ѕвездата значи? Студент: Содржина на. ЈАСОН Hirschhorn: Да. Оди да се добие содржината на. Значи ова се случува да одат во меморија решавање таму и ми даде тоа. Јас се користи% c токму тука, бидејќи таму се ликови чуваат таму. Па ние ќе да се оди на таа адреса ќе само видов - или тоа најверојатно ќе биде малку поинаква овој време ние ја стартувате програмата. Но ќе одиме на таа адреса кои знаеме се уште постои и да видиме што е таму. Така што не СКГ вина. Тоа едноставно не ни даде ништо. Тоа би можело да всушност ни даде нешто, ние едноставно не може да го види тоа. И дека се навраќа на оваа идеја - и ние нема да добие премногу во ова, бидејќи тоа е надвор од опсегот на овој курс. Но ние разговаравме за токму тука, ако ние отиде надвор од границите на низата од 1, ние не би можеле да се во неволја. Понекогаш, кога само одам од 1, правиш нешто лошо, и можете би можеле да се во неволја. Но, вие не секогаш се во неволја. Тоа зависи колку од лоша работа е што го прават тоа, си оди за да се добие во неволја. Што не е да се каже, да се невешт со вашиот код. Но, тоа е да се каже, на програмата нема да секогаш да престанам, дури и ако одите некаде Не треба да се оди. Еден добар пример за тоа е, многу луѓе во нивниот проблем постави 3, кој беше 15, не провери дали границите на одборот. Па сте виделе на лево, погледна на право, погледна кон врвот, изгледаше на дното. Но вие не се провери да се види дали на врвот беше всушност ќе биде на табла. И многу луѓе што го сторија тоа и се претвори дека во нивната програма работел совршено, бидејќи каде што одборот беше складирани во меморијата, ако отиде еден над неа или ја проверуваа меморија адреса, немаше ништо особено ужасно за тоа, па вашата програма не беше ќе се развикам. Но ние, сепак, ќе ги тргнеме поени ако ти не се провери тоа, затоа што се прави нешто што не беа би требало да се направи, и вие би можеле да имаат добивано и во неволја. Шансите се, иако, најверојатно не. Па ова е да се покаже дека, да, ние се уште може да оди до неа. И ние не сме добивање на проблеми во овој случај. Ако ние се обидовме да го прочитате следните 100 карактери, би веројатно се во неволја. И можете да го кодот читање на следните 100 карактери, ако сакате со правење на некои вид на за телефонска линија. Да. Студент: Бидејќи бевме доделен кои простор вистински вредност, ние не би всушност ќе биде во можност да се види ништо. Треба да се обидеме со поставување дека еднакво како C или нешто? ЈАСОН Hirschhorn: Велики прашање. Како можам да ја постави таа вредност - што линија код можам да пишувам на линија седум да го стори она што го рече? Студент: Стар кон меморија еднаква на еден Цитат в заврши една понуда. ЈАСОН Hirschhorn: Значи тоа е ставање карактер, c, на таа локација, бидејќи повторно, дека ѕвездата значи одат до таму. И кога се користи на левата страна на задача оператор, кој е еднакво потпише, ние нема да се добие таа вредност толку многу како што таа вредност. Сега да видиме што се случува. Ние се стави нешто таму и тоа беше таму. Што се нарекува бесплатно. Некои нешта веројатно се случило на грамада. Па тоа не е таму веќе. Но, повторно, ние не сме добивање на во неволја за да одиме таму. Го правам ова во кодот за да се илустрира дека многу од овие прашања кои ги имате, тие се навистина интересно одговори на многу време. И тие се навистина добри прашања. И можете да ги дознаам на свој, ако, на пример, ние не сме во секција. Да. СТУДЕНТСКИ: Бидејќи вие не сте праќање на покажувачот било каде, дали треба да се користете Примерок? ЈАСОН Hirschhorn: Значи ова се навраќа на својата првична прашање. [? ?] Тоа е само локална променлива? Примерок тука не е толку привлечни. Употребата на malloc тука не е дека огромна, бидејќи тоа е само една локална променлива. Студент: Значи може да ви направи знак ѕвезда кон меморија еднаква на здраво? ЈАСОН Hirschhorn: О. Па ние ќе се сега се врати на својата првична прашање. Мислам дека не се задоволни со мојот одговор. Во ред? Како тоа? Студент: Да. Чекаат. ЈАСОН Hirschhorn: А каде Дали сакате да испечатите? Па ние ќе испечатите низа, како тоа? Студент: Интересно. ЈАСОН Hirschhorn: Значи ова вели дека ова аргументот има тип на карактер. Па ова треба да биде лик. Студент: Само зема првиот. ЈАСОН Hirschhorn: Значи ова е она што реков порано. Како што реков, тоа не е чување на низа внатре променлива покажувач. Тоа е чување - СТУДЕНТСКИ: На првите вредност на стрингот. ЈАСОН Hirschhorn: Адресата на првата вредност на стрингот. Ако ние требаше да се печати ја оваа, ние сме добивање на вредност во покажувачот. И ќе видиме што е, навистина, меморија адреса. Дали тоа има смисла? Жал. Чекај, не дека одговори на вашите прашање, иако? Студент: Да. ЈАСОН Hirschhorn: Оваа линија код е создавање на низа и потоа уште променлива покажувач кој е покажувајќи на таа низа, таа низа. Да. Студент: Значи, ако отидовме една мемориска решавање понатаму, ќе го добиеме часот? Е тоа беше се чуваат како стринг? ЈАСОН Hirschhorn: Како, ние го сторивме - па ова е вредно да се направи. Ова е точка аритметика, која вие момци видовме пред и треба да биде релативно удобно со. Ова е слично на пишување - ако ние требаше да ја напишам оваа линија код, видовме низа нотација порано. Ова треба да ни даде втора вредност во оваа низа, х. Ако ние го сторивме тоа, овој исто така треба да се даде ни втората вредност во таа низа. Бидејќи тоа не се случува на мемориската адресата на првиот работа, но меморија адресата на работа една завршена. А потоа ѕвездата оператор dereferences дека покажувач. И повторно, ајде да видиме. Добиеме ж повторно. Студент: Што точно значи dereference значи? ЈАСОН Hirschhorn: Dereference е фенси збор за да одат. Оди до кој и да добијат што е таму е да dereference покажувач. Тоа е само фенси збор за тоа. Студент: Ако сакавме да печати целата низа, може да ги направи го симболот покажувачот? ЈАСОН Hirschhorn: Добро, ние сме ќе застанеме малку овде. Ние ќе се обидеме да се стави крај тука. Симболот ви дава на адреса на локација, па кога ќе се направи симболот на променлива, тоа ви дава на адреса која се чуваат таа променлива. Симболот покажувачот ќе ви даде адреса на кон меморија, каде што кон меморија е меморија. Ние нема да оди на со овој пример. Можете да дознаам овие работите на свој. Но, повторно, ова може дури и да се граничи со малку подалеку од она што ви треба да знаете за од опсегот на овој среднорочен - или овој квиз, наместо. Жал. Ние ќе се обидеме да се движат натаму, бидејќи јас би како да направите една кодирање проблем пред времето е горе. И ние ќе се обидеме да го кодот што мислам е на повеќето релевантни на овие примери, atoi. Така што ова е прашање на квиз пред две години. И јас го имам на одборот овде. Луѓето беа прашани за квиз - тие беа дадени малку повеќе tesxt во прашањето, но јас елиминираше текст, бидејќи тоа е непотребно за нашите цели сега. Тоа беше само некоја позадина на она што atoi направив. Но сите знаеме и се многу запознаени со atoi. Јас Ви препорачуваме да го кодот на оваа на лист хартија. Јас, исто така препорачуваме да го користите стратегија дека ние сме поминале над многу во нашата секција. Прво, осигурајте се дека ви е јасно што atoi прави. Нацрта слика или да излезе со некои ментална слика на тоа во вашата глава. Следно, се пишува надвор pseudocode за ова. На квизот, ако сите ќе добиете е pseudocode, барем стави нешто. А потоа на сајтот кои pseudocode врз C. Ако имате проверка во вашата pseudocode, како проверите дали нешто е 1, кој мапи излез на ако состојба и така натаму. И, конечно, на програмата код во C. Па се врати на atoi и да преземат пет минути да кодот оваа на лист хартија, што е веројатно за износот на време ќе ги преземе за квиз за код atoi. Пет до 15 минути, од пет до 12, од пет до 10 минути, е во врска со износот на време сакате поминуваат на овој прашање во квизот. Па се земе пет минути, сега, ве молам. И ако имате било какви прашања, да се подигне својата рака и јас ќе дојдат околу. [СТРАНА разговори] ЈАСОН Hirschhorn: Добро, така што кој беше пет минути. Веројатно тоа беше за износот на време што би трошат на тоа на квиз, можеби ниско крајот на тоа време. Ќе повториме во малку. Да тргнеме кодирање ова. И ако ние не ги добиете сите начин преку, одговорите на ова и ова квиз прашање се достапни, повторно, Есен 2011 е кога ова прашање се појави на квизот. И тоа беше во вредност од осум поени на квизот тогаш. Осум поени е на високо крајот на износ на поени нешто вреди. Повеќето прашања се во опсегот од еден до шест точки. Па ова е повеќе предизвик прашање, за сигурен. Некој може да ме започна? Општо земено, она што сме ние ќе да сакате да го направите со овој функцијата atoi, логично? Што сакаме да направите? Па ние ќе да се напише некои pseudocode. СТУДЕНТСКИ: Конвертирај карактери во цели броеви. ЈАСОН Hirschhorn: Конвертирај карактери во цели броеви. OK. Значи колку знаци сме ние ќе треба да одат преку? СТУДЕНТСКИ: Сите од нив. Студент: Сите карактери во низа. ЈАСОН Hirschhorn: Сите карактери во стринг. Значи, ако сакавме да поминат низ секоја карактер во низа, што е нешто во C видовме дека е дозволено ни да поминат низ секоја карактер во низа? Студентите: A за јамка. ЈАСОН Hirschhorn: A за јамка. Па ние ќе поминете секој лик во ОК. Тогаш што ние нема да сакате да се направи кога ќе го добиеме специфичен карактер? Велат дека ние сме добивање донесе 90. Ќе го добиеме 9. Тоа е карактер. Што сакате да направите со дека карактерот 9? Студент: Одземете ја од карактерот 0? СТУДЕНТСКИ: Додади 0? ЈАСОН Hirschhorn: Одземете тоа од карактерот 0? Студент: Да. ЈАСОН Hirschhorn: Зошто сакате да го направите тоа? СТУДЕНТСКИ: [нечујни] вредност. Нејзините int вредност. ЈАСОН Hirschhorn: Добро, така што ние се карактер 9, тоа одземе од карактер 0 за да добиете Крај број 9. Слатка. И како да знам дека карактерот 9 минус 0 лик е 9? Што табелата се ќе се погледне? СТУДЕНТСКИ: Постојат логично девет места помеѓу 9 и 0. Или можете да се погледне на ASCII табелата. ЈАСОН Hirschhorn: ASCII табелата. Но да, ти си точно, како и. Па ние одземе 0. Па сега имаме цел број 9. И она што сакаме да се направи со тоа? Ако имаме 90, тоа е првиот број ние сме, она што ние сакаме да се направи? СТУДЕНТСКИ: Би се стави во привремена број низа, а потоа направи математика да го подоцна да го направи во крајот. ЈАСОН Hirschhorn: OK. Студент: Можете да почнете на крајот на низа и потоа се оди напред, така дека секој пат кога ќе се движат напред, го множи со 10. ЈАСОН Hirschhorn: OK. Тоа звучи како прилично релевантни идеја. Ние може да започне на крајот на нашата низа, и можеме да го користиме strleng. Можеме да го користиме strleng тука. Ние ќе дојдеме на должината на нашите стринг. Ние започне на крајот. И + првиот, ние едноставно се земе дека цел број, а можеби и ние создаваме како нови целобројна променлива до врвот, каде што ние сме чување сè. Па ние поминете секој знак во ОК од назад кон напред, ние одземе 0, и тогаш ние го земе, и во зависност од каде што е, ние го мултиплицираат со сила на 10. Бидејќи првиот, што ние мултиплицираат најдесната карактер од страна на? Студент: 10 до 0. ЈАСОН Hirschhorn: 10 до 0. Што се множи со втората најдесната карактер од страна на? СТУДЕНТСКИ: [нечујни]. ЈАСОН Hirschhorn: Што? Студент: 10 до 1. JASON Hirschhorn: 10 до 1. Трети најдесната карактер? Студент: 10 до 2. JASON Hirschhorn: 10 до 2. Студент: За жал, јас не го разбираат она што го правиме тука. ЈАСОН Hirschhorn: Добро, ајде да одиме назад, тогаш. Па ние ќе ја добиеме помина во низа. Затоа што сте пишување atoi. Па ние се донесе во низа. Велат дека ние сме добивање помина во низа од 90. Првото нешто што ние се случува да направите е да поставите нова целобројна променлива, дека ние сме само ќе се создаде како нашата нова цел број. Тоа е она што ние ќе да се вратат на крајот. Ние треба да поминат низ секој од ликовите во стрингот затоа што ние сме определени дека ние треба да ги допре секој од нив и потоа го додадете во нашата нова цел број. Но, ние не само да го додадете како број. Ние не може само да ги преземе 9 и додадете 9 до нашата цел број. Тоа зависи од она место е во низа. Ние ќе треба да се размножуваат тоа со сила на 10. Бидејќи тоа е како база 10 дела. Па ние ќе ја добиеме вистинската карактер, или вистински број број, со одземање карактер 0 од карактерот 9 како што направивме со одземање карактер главниот град А од што карактер имавме во една од овие проблеми. Па ние всушност ќе добиете голем број од 0 до 9 зачувана како реален број, а ние ќе множете се него од моќност од 10, во зависност каде ние сме во низа. А потоа ние ќе го додадете повторно во нашиот нов целобројна променлива. Така што ова ќе изгледа како би да се - ќе подготви овде. Ако ние се донесе во низа 90 - СТУДЕНТСКИ: [нечујни]. ЈАСОН Hirschhorn: Но, atoi зема стринг. Па ние ќе да поминат низ стопанството. Ние ќе се донесе во 90. Значи одиме од назад кон напред. Земаме 0. Студент: Жал ми е. Можеби ова е глупаво. Ако ние сме добивање помина во низа, зошто е 90 она што ние сме добивање донесен во? Бидејќи 90 е цел број. ЈАСОН Hirschhorn: Бидејќи atoi зема низа и ја претвора во целобројна застапеност на стрингот. Но стрингот 90 не е цел број 90 или број 90. Низата 90 е низа од два, или три карактери, туку на 9 карактер, 0 карактер, и обратна коса црта 0 лик. И ние сме пишување atoi затоа што, на На пример, кога ќе ги преземе командата линија аргумент, а тоа е зачувана во argv, таа е зачувана како стринг. Но, ако сакате да го третираат како број, што треба да го претворите до Крај на цел број. Кој ние го сторивме еден од нашите проблеми комплети. Кој ние го сторивме во голем број на нашиот проблем комплети. Секој што се цел број како командата. Па тоа е зошто нашите atoi функција потребно е стринг. Значи, повторно, во нашиот пример овде, ние сме случува да се земе последен. Ние ќе се одземе карактер 0 од тоа, бидејќи на ликовите 0 одзема од ликот 0 ви дава вистинскиот број 0, според на ASCII математика што правиме. Бидејќи ликови се претставени како различни од нивните вистински - на карактер, на пример, мали a е 97. Тоа не е - Упс! Тоа не е она што би очекувале да биде, 0, на пример. Значи мора да се одземе карактер да се добие 0. Па ние ќе да го стори тоа тука за да го добиете вистинскиот број. А потоа ние ќе се обидеме да го помножи со моќ на 10 во зависност од каде што е во низа, а потоа се земе дека и го додадете во нашата место носителот променлива, така што може да излезе со нашата крајна нови број. Дали тоа има смисла на сите? Па ние нема да кодот оваа токму сега, бидејќи ние сме добивање на кратко на време. Јас се извинувам за времето за тоа. Но тоа е она што, се надевам, ќе да биде во можност да се направи на квизот - на најмала рака, го добивате ова pseudocode испишана. А потоа, ако ние требаше да се напише pseudocode, всушност, би можеле да го направите ова прилично брзо. Секоја линија на коментари што ние напиша тука преведува на околу една линија на C код. Прогласување на нова променлива, пишување јамка, некои одземање, некои множење и некои задача. Ние би веројатно, исто така, сакаат да пишува враќање линија. Ние, исто така, можеби ќе сакате да се стави некои проверки тука. Да. Студент: Значи ние можеме да се третираат Кликнете ОК како вистински стринг? Бидејќи знам дека тоа е само адреса. Како, како ќе го добиете должината на стрингот се пренесува преку? ЈАСОН Hirschhorn: Па како не должината на стрингот? Strlen. Студент: strlen, да. Но може да се стави на како аргумент за тоа? ЈАСОН Hirschhorn: Значи strlen зема знак ѕвезда. И следува дека знак ѕвезда, и тоа држи брои додека не добива до обратна коса црта 0. strlen беше всушност еден од другите програми што се случува да се код. Тоа е уште еден добар за код. Дека една е малку полесно, затоа што ако сте ќе треба да се размислува за тоа концептуално - Јас само тоа го рече гласно - strlen следи покажувач и го задржува оди и броење и следење до ќе се постигне обратна коса црта 0. СТУДЕНТСКИ: Добро, го зедов тоа. ЈАСОН Hirschhorn: Така најдобро од среќа на квиз 0 утре. Ако имате било какви прашања, јас ќе биде надвор по ова. Се чувствуваат слободни да ми мејл. Допрат до вашата ТФ ако сте Не, во моето дел, или добие мојата е-пошта, ако го сакаат тоа. Ако сакате да навивач надвор и само испрати ми е-маил, на freakout е-маил, јас ќе ви испратиме назад, како, на лицето смешковци, или, како, шега или нешто слично. Па се чувствуваат слободни да го стори тоа како добро. Со среќа повторно, а јас ќе ќе ги видите сите следната недела.