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