Jason HIRSCHHORN: Maligayang Pagdating sa A5, sa lahat. Mayroon kaming isang kapana-panabik na linggo nang mas maaga sa amin, karamihan ay dahil may mga kaya maraming mga bagong Nakaharap sa kuwartong ito. Ito ay kahanga-hanga. Ang isang pulutong ng sa iyo dito sa pamamagitan ng aksidente, na kung saan ay mas mahusay. Kaya sana ay makikita mo panatilihin ang pagsali sa amin. Sa linggong ito kami ay pagpunta sa gastusin sa karamihan ng seksyon paghahanda para sa pagsusulit. Kaya alinsunod sa aming agenda, kami ay pagpunta sa makipag-usap ng kaunti tungkol sa mga mapagkukunan para sa mga klase, ngunit din para sa mga pagsusulit, at pagkatapos ay, muli, gastusin sa karamihan ng klase ng pakikipag-usap tungkol sa mga tanong. Sa sandaling tapos na kami ng pagsagot sa iyong katanungan, o kung ang iyong mga katanungan natural humantong sa amin sa ilang mga coding, ako may sample na mga problema mula sa midterms nakalipas na magkakaroon kami ng live na code sa seksyon na magkasama na nagdadala rin ng ilang iba pang mga magandang paksa upang masakop. Kaya una, bilang nai-nawala namin sa pamamagitan ng para sa nakalipas na ilang linggo upang ipaalala sa iyo guys, may mga isang tonelada ng mga mapagkukunan Available para sa kursong ito. Marami sa mga ito ay magiging hindi mapaniniwalaan o kapani-paniwala kapaki-pakinabang sa iyo bilang patuloy kang mag-aral para sa pagsusulit 0, dahil ito ay Martes hapon. Kaya lahat ng ka na pag-aaral para sa isang bit. May mga panayam tala at pinagmulan ang code na iyon dapat mong Talagang check out. Panoorin ang shorts. Tingnan ang study.cs50.net. At pagkatapos ay, na nakalista sa ibaba, ang isang numero ng iba pang mga mapagkukunan. Muli, pagsusulit 0 ay bukas sa 01:00. Kung hindi mo pa nagagawa, tingnan out ang Tungkol sa Pagsusulit 0 dokumento sa homepage kurso upang malaman kung kung saan ka ng paggawa ng mga pagsusulit. Ang pagsusulit ay nagsisimula sa 01:10 at ay nagtatapos sa 70 minuto sa ibang pagkakataon. Kaya kung lalabas ka pagkatapos ng 01:10, handa ka pagpunta upang makakuha ng na maraming mga mas kaunting minuto kaysa sa 70 na kumuha ng pagsusulit. Kaya't tiyakin na nandoon ka sa oras. Kung ikaw ay isang mag-aaral extension o mayroon ilang iba pang mga pagsasaalang-alang na pagsubok, ito maaaring hindi maging sa 1:00 bukas. Ngunit muli, suriin ang Tungkol sa Pagsusulit 0 idokumento upang matiyak na sa iyo kapag ka paglalaan ng pagsusulit. Isinulat ni ko 75 minuto up dito. Sa tingin ko na tama, hindi 70. Sinasaklaw nito ang lahat ng materyal mula sa isang linggo 0 upang magbigay ng panayam noong nakaraang linggo sa Miyerkules. At muli, para sa pagsusulit na ito, sa bawat na dokumento, makakakuha ka ng isa magkabilaan at 8 1/2 ng 11 sheet ng papel na nakakakuha ka ng na gagamitin bilang mga tala sa panahon ng pagsusulit. Maraming mga tao, kung hindi karamihan ng mga tao, mayroon natagpuan na ang nag-iisang pinaka-kapaki-pakinabang na paraan mag-aral para sa pagsusulit ay sa gumawa ng pag-aaral sheet, isang isa-sider, ng kanilang sariling. Kaya tumingin sa nakaraang mga bago kung nakita mo nakalipas bago. Abutin ang out sa mga kaibigan upang makita kung ano sila ay paglalagay sa kanila. Ngunit mga kamay-down, ang pinakamahusay na paraan maaari kang pag-aaral ay upang pumunta sa pamamagitan ng lahat ng bagay at pagkayas ito pababa sa kung ano ang dapat o nararapat hindi nabibilang sa na sheet ng papel, dahil iyan ay isang talagang lamang kapaki-pakinabang na paraan para sa iyo upang matiyak na ka ng pagpunta sa pamamagitan ng lahat ng bagay at kumuha ng pagpapalagayang-loob sa mga ito. Karamihan sa mga tao, nakita namin, kahit na sila na ang sheet ng papel sitting karapatan sa tabi ng mga ito sa pagsusulit, huwag i- upang ito, dahil, muli, na napaka proseso ng pagpunta sa pamamagitan ng impormasyon ay nakatulong sa kanila matuto ito. Kahit sinong mayroon ba kayong mga katanungan tungkol sa pagsusulit 0? May lahat - Hindi ako pagpunta sa gawin ang isang show ng mga kamay. Wala iyon. Ako ay pagpunta sa magtanong kung sino makapagsimula sa pag-aaral. Ngunit hindi ko nais upang gumawa ka lahat ng hindi taasan ang iyong mga kamay. Kaya tulad ng sinabi ko - oo, Avi, sige. AVI: Ano ang gusto maging isang kapaki-pakinabang na bagay ilagay sa mga one-pager? AARAL: Iyon ay nakasalalay sa iyo. Jason HIRSCHHORN: Makukuha mo na gamitin ang iyong paghatol. Mga kapaki-pakinabang mga bagay upang ilagay sa mga isahang-pager, kung ikaw ay lito tungkol sa mga malaki O runtime ng iba't ibang mga uri ng mga paghahanap at mga uri, ilagay na sa doon sa isang madaling-magamit na primera klase tsart. Sa ganoong paraan, kung tatanungin ka na sa pagsusulit, hindi mo kailangang subukan at figure ito o dahilan sa pamamagitan ng runtime. Maaari mong kopyahin lamang ito pababa. Kung tumingin ka sa mga pagsusulit nakaraan, ng maraming beses, na pinapagana may oras katanungan. Kaya na magiging isang halimbawa ng isang magandang bagay ilagay sa iyong one-pager. Iba pang mahusay na mga bagay upang ilagay sa, kung ikaw ay naguguluhan tungkol sa kung paano idedeklara isang pag-andar o kung ano ang iba't ibang bahagi ng ang pag-andar na pagpapahayag ay, sumulat na sa doon, isang generic na bersyon at pagkatapos ay marahil isang halimbawa. Kung ikaw ay naguguluhan tungkol sa mga payo, isang diagram ng kung paano pointer ng gawain ay marahil ay talagang kapaki-pakinabang. Kung ikaw ay naguguluhan tungkol sa recursion, isang makatikim ng recursive function na sa doon maaari ring patunayan na maging kapaki-pakinabang talaga. Ba na magbibigay sa iyo ng ilang mga ideya? AVI: Kailangan mong maunawaan ang buong proseso ng kino-compile, tulad ng paano na ang lahat ng mga gawa? Jason HIRSCHHORN: Lahat na na-sakop ng dati lalabas sa mga pagsusulit. Tanong - ngunit muli, ang ilang mga bagay ay magiging tinimbang mabigat kaysa sa iba. Ang ilang mga bagay na muli makabuo at muli sa klase, sa magbigay ng panayam, at seksyon. Iba pang mga bagay ay may hindi makaisip na madalas. Usapan kami ng maraming tungkol sa # include at -L isang bagay at kung ano ang mga ibig sabihin sa ang proseso ng compilation. Usapan kami ng maraming tungkol sa GDB, kapitan, mga iba't ibang mga flag na ginagamit namin kapag compile kami ng isang bagay, at kung ano make15, halimbawa, talaga Nangangahulugan at talagang gumagana. Hindi pa kami makipag-usap ng maraming tungkol sa bawat solong hakbang sa ang proseso ng compilation. Na-usapan pa rin namin ang tungkol dito. Kaya pa rin ito ng isang bagay na iyong Dapat na pamilyar ka. Ngunit muli, hindi namin pagpunta sa maging - mga bagay na makabuo ng mas madalas sa klase ay mas malamang na makabuo ng higit pa madalas at maging mas mabigat tinimbang sa pagsusulit. Cool. Anumang iba pang mga tanong tungkol sa pagsusulit 0? OK, kaya ko bang ilagay ang isang listahan ng mga mga paksa sa board. Nagpunta ako sa pamamagitan ng syllabus. Nagpunta ako sa pamamagitan ng seksyon ng pagsusuri mula sa kagabi at mga slide upang makabuo may isang di-lubusan listahan ng mga paksa na sakop namin sa ngayon sa CS50 at mga bagay na maaari lumitaw sa pagsusulit. Kaya ako hindi pagpunta sa pumunta sa pamamagitan ng bawat solong isa sa mga ito. Ito ay tumagal ng mas higit pa oras kaysa sa mayroon kami ngayon. Ngunit ko bang ilagay ito dito hanggang sa sana ay buhayin ang alaala iyong memorya bilang sa mga bagay na maaari o hindi maaaring maging kasing pamilyar sa iyo. At gusto ko iyan gastusin sa karamihan ng seksyon ng pagsagot sa iyong mga katanungan tungkol sa mga paksang ito, paksa na ay hindi sakop dito. Maaari naming isulat ang palsipikado code. Maaari naming isulat ang tunay na code upang matiyak na - Maaari ko bang sagutin ang iyong mga tanong at tulungan sa panimula maunawaan ang lahat ng marami sa mga paksang ito upang hindi mo na huwag mag- nakahanda at kumportableng ng pagpunta sa ang pagsusulit bukas. Kaya basahin sa ibabaw ng listahan. Ikaw sana ay sumapit sa seksyon may ilang mga katanungan pati na rin. Kapag handa ka na, itaas ang iyong kamay at kami ay makapagsimula. Isaisip, ang mga tanong na mayroon ka, walang mga ugok katanungan. Narinig namin na marami. At ang mga tanong na mayroon ka, handa akong sa taya, maraming iba pang mga tao sa parehong sitting dito at nanonood online mayroon din. Kaya maaari ka lamang makatulong sa mga tao sa pamamagitan ng pagtatanong. Marcus. Marcus: Sa pagitan ng stack at ang magbunton, ay mayroong isang pre-inilalaan porsyento ng memorya na tinukoy bilang ito ay para sa stack o para sa kimpal? O kaya kung paano gumagana iyon, nang eksakto? Jason HIRSCHHORN: Mahusay pinag-uusapan. Pupunta ako upang i-back Sundan ang ilang sandali. Gumagana ba sa lahat - mangyaring maging matapat dito. Alam ko ako humihiling sa iyo na taasan ang iyong kamay sa harap ng iyong mga kasamahan. Ngunit may mga tao na sa tingin hindi komportable sa stack at magbunton at gustong pumunta sa paglipas na at kung ano ang mga ibig sabihin? Itaas ang iyong kamay kung - OK. Salamat sa inyo. Kaya kami ay pagpunta sa pumunta sa ibabaw ng stack at ang magbunton talagang mabilis at pagkatapos ay ilipat sa pagsagot sa iyong katanungan. Kaya kung gumuhit namin ang isang kahon upang kumatawan memorya sa iyong computer, kung ano ang ilang mga mga bagay na pumunta sa kahon na ito? Main. Ang isang pangunahing pag-andar. Saan ang pangunahing pumunta? AARAL: [hindi marinig]. Jason HIRSCHHORN: Kaya kami ay ilagay pangunahing pababa dito. Ano pa ang napupunta sa kahon na ito? AARAL: Ang function na tawagan ka. Jason HIRSCHHORN: Ang mga pag-andar na tinatawag naming. At kung saan gumagana ang mga ito pumunta? AARAL: Sa stack. Jason HIRSCHHORN: Sila pumunta sa stack. Kaya kami ay pagpunta sa tumawag ito bagay down na dito ng stack. At hanggang tuktok, mayroon kaming ang magbunton. Kaya memorya ay hindi isang kahon tulad nito lamang. Ngunit ito ay talagang kaakit-akit na katulad. Ito ay pagpunta sa maging ng maraming mga kahon sa ibabaw at mahigit, depende sa kung gaano kalaki ang iyong computer ay o kung gaano kalaki ang iyong memorya ay. Sa quote-magpanipi "ilalim" ay ang stack. At mayroong maramihang bagay na pumunta sa stack. At iyon ay nakadepende sa mga function mayroon ka sa iyong code. Palagi kang magkaroon ng isa pag-andar sa iyong code na tinatawag na main, kaya walang palaging isang seksyon down na dito sa stack na nakatuon sa pangunahing. Ang mga bahagi sa stack ay tinatawag na stack na frame. Kapag tumawag ka ng isa pang function, sabihin pangunahing tawag ng binary function ng paghahanap, ilalagay namin ng isa pang frame sa stack. Mas partikular, kami ay pagpunta sa mag-abuloy ang isang tipak ng memory sa aming computer upang mag-imbak ng binary paghahanap ng lokal na mga variable at upang patakbuhin ang binary code ng paghahanap. Kaya tinatawag naming binary paghahanap. Sa ganitong tipak ng memory, kami ay pagpunta mag-imbak nito lokal na variable. Kami ay pagpunta sa mag-imbak ng printf tawag nito. Anuman ang mangyayari, na function ay pagpunta sa ma-imbak doon. Binary paghahanap ay pagpunta sa execute. Ito ay pagpunta upang makumpleto ang pagpapatupad. Ano ang salita sa C na Sumisimbolo na isang function dapat kumpletuhin ang pagpapatupad nito? AARAL: Return. Jason HIRSCHHORN: Bumalik. Kaya kapag nakita mo sa isang pabalik na pahayag, natapos na ang pag-andar kapag ito hit na iyon. Ay pindutin Kaya binary paghahanap balik nito. Ito bahagi ng memorya habilin talaga ay napalaya up. At pangunahing ay bumalik sa execution. Kaya pangunahing ipo-pause kung saan man ay, tawag binary paghahanap, makakuha ng ilang halaga return, at magpatuloy ng execution. Ito stack frame ay mapupunta ang layo. Kung tinatawag naming isang recursive function, kung saan ay isang pagpapaandar na tawag mismo sa ibabaw at higit sa, maaari naming makakuha ng - sabihin namin May ginawang binary paghahanap recursively. Maaari naming makakuha ng binary bersyon ng paghahanap ng isa, binary paghahanap ng dalawa, binary paghahanap tatlo, binary paghahanap apat, binary paghahanap limang. At pagkatapos ay ang panghuling binary paghahanap limang ay pindutin ang batayang kaso, at ng stack mga frame ay bumalik at panatilihin ang pagsasara hanggang sa makuha namin pabalik sa pangunahing. Maaari naming pumunta sa paglipas ng recursion sa isang bit. Ngunit ang lahat ng ito ay upang sabihin, kung ikaw ay pagtawag sa maramihang mga pag-andar sa isang pagkakataon, Makikita mayroong maramihang mga stack mga frame sa stack. Magbunton Ang, sa kabilang banda, hanggang dito, ay hindi para sa mga pag-andar, hindi para sa lokal na mga variable. Ito ay para sa mga magilas na inilaan mga variable. Kaya ito ay mga variable na maaari maging nasimulan sa alinman sa pangunahing o isang gumana na pangunahing mga tawag. Saanman sa iyong code, ang mga ito maaaring i-initialize. At ang pagsisimula ng isang pabagu-bagong inilalaan variable. Ano ang function sa C huwag naming gamitin? AARAL: Malloc. Jason HIRSCHHORN: Malloc. Tawagan mo malloc. Nakakuha ka ng puwang ng memory. At na puwang ng memory ay nasa magbunton. At na puwang ng memory ay mananatiling doon hanggang tawagan ka libre. Kaya dynamic na inilalaan variable sa magbunton ay umiiral para sa hangga't ka gusto ang mga ito sa umiiral, at sila ay hindi pumunta ang layo ng hanggang sa tahasan sabihin sa kanila upang pumunta ang layo. Maaari kang lumikha ng mga ito sa isang function. Stack na pag-andar ng frame ay mapupunta ang layo. Ngunit ay Umiiral pa rin ang variable na sa kimpal hangga't ito ay napalaya, potensyal na sa pamamagitan ng pag-andar na tinatawag na binary paghahanap o kahit anong. Kaya mga kimpal variable manatili doon para sa hangga't gusto mo ang mga ito upang manatili doon. At sila makakuha ng ilagay dito. At pagkatapos ay ang susunod na isa ay makakakuha ng ilagay doon. Panatilihin ang mga ito ay nagsisimula pa napunan, at sila manatili doon hanggang tawagan ka libre. At totoo, ang magbunton at ng stack, pagkuha sa tanong Marcus ni, lumaki patungo sa isa't isa. At kung sila ay magkaroon ng isa sa isa pa, ikaw ginagamit nito ang lahat ng memorya sa iyong computer, at ang iyong programa ay huminto dahil wala kang anumang higit pang memory ang natitira upang gamitin. Sa pagitan ng mga ito, may mga potensyal na iba pang mga bagay. Ngunit para sa saklaw ng kursong ito, mo Hindi kailangang mag-alala tungkol sa na. Kaya na ay ang kasagutan sa iyong katanungan. Huwag ninyong alalahanin ito. Ngunit iyon ay ang mahabang sagot. Lahat ng kailangan mong malaman ay ang magbunton at ng stack habilin - isa ay nagsisimula sa ibaba. Stack ang ginagawa. Magbunton Ang ang bahala doon. Sila ay lumago mas malapit sa isa't isa. At kung hawakan nila, na problema. Pinatatakbo ka na ng memory. Ngunit din, bilang karagdagan sa pag-alam kung saan ang mga ito ay, kung ano ay naka-imbak sa parehong stack at magbunton. Curtis. Curtis: Kapag mabangga nila, ay na ang isang stack overflow? Jason HIRSCHHORN: Kapag mabangga nila, hindi iyon stack overflow. Ang isang stack overflow ay isang iba't ibang mga lugar na maaari naming pumunta sa ibabaw kung nais mong. OK, magpapadala kami ay bumalik sa na sa ilang saglit. AARAL: Ano ang salita na tinatawag na kapag hit nila sa isa't isa, ang stack at ang kimpal? Jason HIRSCHHORN: Para sa ngayon, huwag mag-alala tungkol sa. Alam lang - Ako ay sagutin na tanong pagkatapos ng klase. Kung sila tumakbo papunta sa bawat isa, ang bumangga out ka ng memorya, dahil walang higit pa espasyo doon. AARAL: Paumanhin, kung ano ang isang seg fault? Jason HIRSCHHORN: Isang segment Kasalanan maaaring tinatawag na para sa - Depende ito sa kung bakit tinatawag na ang kasalanan ni seg. Minsan, ang iyong stack overflow, ipapakita ito sabihin seg kapintasan bilang ang error. AARAL: Ano ang tungkol sa dereferencing isang null variable? Iyan ba ay seg fault? Jason HIRSCHHORN: Dereferencing isang null pointer - OK, kaya kung mayroon kang isang pointer na sa iyo itakda ang katumbas ng null, mga payo, pagpapabalik, tindahan ng memory address bilang kanilang mga halaga. At isang null pointer ay mahalagang pag-iimbak ng 0, ang ika-0 tugunan sa variable na iyon. Kaya 0x, 0, 0, 0, 0, at iba pa. Ika-0 na address sa memory hindi iyon sa ating larawan, na ang bahala doon sa isang lugar, na nakalaan para sa mga computer. Hindi namin pinapayagan na hawakan ito. Kaya kapag ang iyong programa ay execute, kung isang bagay ay sinusubukan upang pumunta sa memory address 0, alam nito na na ay isang walang laman na halaga. Alam ito ng walang dapat na doon. Kaya kung susubukan mo at gamitin ang isang bagay doon at ituturing ng isang bagay tulad ng doon o sinusubukan upang pumunta sa lokasyon na iyon, handa ka pagpunta upang makakuha ng isang seg fault o isang error. Na sagutin ang iyong tanong? At ngayon, ipapakita namin bumalik pagpatung-patungin ang mga overflow. Mga bagay sa stack, pati na mayroon kang guys nakita bago, sa - gumuhit ng isang malapit na ipaalam up ng isang stack frame. Maaari ba lahat ng tao makita na? Kaya mayroon kaming ang aming stack frame. Kami ay pag-save ng isang array in bilang isang lokal na variable sa ito function. Kaya sabihin sa aming mga array ay may limang mga spot. Ang lahat ng limang ng mga maiimbak sa na stack na frame. Kung magsimulang namin sa pagsusulat ng lagpas sa hanggahan ng array na ito - kaya kung sisimulan namin ang pagsusulat sa, sabihin nating na 0. Iyon ang mga ini-index ng limang sa aming mga array. Kung magsimulang namin sa pagsusulat sa index 5, na wala kaming kapag mayroon kaming isang na hanay ng mga sukat 5, magsisimulang namin sa pagsusulat sa index ng 6, 7, 8, 9, kami ay maaaring makakuha ng isang Stack Overflow error. Sa pangkalahatan hindi ito - makikita mo marahil makakuha ng sa pag- kung kang pumunta sa ibabaw ng isa. Ngunit sa pangkalahatan, makakakuha ka ng sa karamihan ng problema kung kang pumunta sa paglipas ng sa pamamagitan ng isang pulutong at pumunta ka sa ngayon sa paglipas na sinulat mo sa ibabaw ng return address ng na function, na kung saan ay matatagpuan sa ilalim ng stack na frame. Dahil, tama? Ikaw - sa - paumanhin. Hindi "dahil karapatan." Sa stack frame, mayroon kang iyong lokal na variable. Sa pinakailalim ng stack frame ay ang return address. Iyon ay kung saan ang function napupunta kapag ito ay mahigit. At kung ikaw patungan balik na address, pagkatapos ay kapag ito stack frame, kapag tapos ka ng pagpunta sa pamamagitan ng stack -frame at pagpapatupad sa bawat linya, ikaw ay pagpunta upang pumunta sa iyong bagong tirahan na nakasulat doon sa halip na ang aktwal na isa. At na kung paano namin nakita ilang mga breaches seguridad Maaari itong mangyari sa mga computer. Kaya stack overflow, sa maikling salita, ay kapag mong patungan ang mga bahagi sa stack naka-dapat upang gamitin, ang mga lokal na variable na naka-dapat upang gamitin, at sa partikular na kapag nagsimula ka Sasapawan nito mahalagang bagay tulad ng bumalik address. At na kung saan makakakuha ka ng isang error. O siguro kahit na maaari mong simulan kahit pagsusulat sa - sabihin binary paghahanap ay kanang itaas pangunahing. Kung sinulatan papatong sa iyo ng maraming, mo makakasulat sa pangunahing. Ngunit sa pangkalahatan, makakakuha ka ng isang error bago pagkatapos, dahil alam ng computer na ikaw ay gumagawa ka ng isang bagay hindi dapat ginagawa. Oo. AARAL: Ano ang pagkakaiba sa sa pagitan ng isang stack overflow at isang buffer overflow? Jason HIRSCHHORN: Buffer overflow ay isang mas generic na uri ng ano na lang Inilarawan ko. AARAL: Kaya isang stack overflow ay isang halimbawa ng isang buffer overflow. Jason HIRSCHHORN: Mismong. Ito ay isang array maaari naming isipin bilang isang nagpapahina ng lakas, ng isang puwang para sa mga bagay upang pumunta in Ito ay isang stack buffer overflow. Maaari naming magkaroon ng isang kimpal buffer overflow. Kung nagkaroon ng buffer, na madalas doon ay isang array ang magbunton, at kami sinulatan papatong sa mga hanggahan, pagkatapos kami ay magkaroon ng isang kimpal buffer overflow. At hindi na saklaw ng kursong ito, sila ay nakita ng isang bit naiiba. Tagatala ay may espesyal na paraan ng pag-detect sa bawat isa. Ngunit isang buffer overflow ay isang mas generic uri ng kung ano ang aking inilarawan, na kung saan ay isang stack buffer overflow. Ang ibig na sagutin ang iyong tanong? Sweet. Nagawa Mayroon bang anumang iba pang mga tanong kaugnay na sa stack o ang kimpal? Oo. AARAL: Alam ko mayroon kang upang libreng mga string dahil hindi nila sa magbunton at hindi mo nais na tumagas memory. Ngunit ang mayroon ka sa libreng mga pangkalahatang variable at bagay-bagay tulad na? O kaya ay awtomatikong sila napalaya? Jason HIRSCHHORN: Magandang katanungan. Kaya sa CS50.H, lumikha namin ang bagay na ito para sa tinatawag na isang string. Ang isang string ay talagang kung ano? AARAL: pansamantalang trabaho bituin. Jason HIRSCHHORN: Ang isang pansamantalang trabaho bituin, isang pointer sa isang character, isang pointer sa isang array ng mga character. Iyon ay kung ano ang string ay. Kaya kailangan namin upang palayain ito, dahil getstring, na ginamit namin ng maraming - string pangalan ay katumbas ng getstring - na mallocs para sa amin ng ilang memory sa magbunton at pagkatapos ay bumalik sa isang pointer sa unang character ng na string, isang pansamantalang trabaho bituin. Kaya para baga, kung hindi mo pa naging pagsusulat ng libreng sa anuman sa iyong mga string na iyong na tinatawag na sa ngayon, mayroon kang Na-pagtulo ng ilang mga memorya. Siyempre hindi pa namin usapan tungkol sa ito, kaya walang sinuman ay nakuha sa pag para sa paggawa nito. Ngunit pasulong, oo. Kapag tumawag ka getstring, handa ka mallocing ilang espasyo sa magbunton. At kung hindi mo tawagan ang libreng mamaya sa na string, mayroon kang isang tumagas memory. Iyon sagutin ang iyong katanungan? Oo AARAL: Kaya't upang gawin iyon, huwag ginagamit namin libreng kanan bago balik? Tulad ng, sa loob ng saklaw ng, hulaan ko kung sabihin namin, tulad ng, int main, sa loob ng saklaw ng code na sa loob ng mga kulot tirante, bago mismo - mo alam kung saan ikaw ay karaniwang ilagay return. Huwag ilagay mo libreng bago na? Jason HIRSCHHORN: Kaya maaari kang maglagay ng libreng kahit saan mo nais na ilagay libre. Dahil ang mga ito ay dynamic na inilalaan variable, dahil maaari nilang mabuhay na hindi na saklaw ng isang partikular na function, kung tawagan ka malloc sa isang hiwalay na function, halimbawa, getstring, maaari mong tawagin libre sa pangunahing. Hindi mo kailangang tumawag ito sa mga partikular na function na kung saan malloc ay tinatawag na. Ngunit mo kailangang tumawag ito bago pangunahing babalik. At ito ay talagang dumedepende. Depende ito sa kung bakit mo malloced na puwang sa simula pa lamang. Ang ilang mga tao ay tumawag sa palayain medyo mabilis. Hindi Tatawagan libreng ilang tao hanggang ang katapusan ng kanilang programa. At ang mga ito pumunta sa pamamagitan ng at libre ang lahat. Depende ito sa kung bakit tinawag mo malloc. AARAL: At kung ano ang sasabihin sa iyo kung tinatawag mo paggamit getstring? Gusto mo sabihin libreng ano? Jason HIRSCHHORN: Kaya ang syntax para sa libreng ay simpleng libre, open paren, malapit paren, at ang pangalan ng pointer. Kaya kung sumulat ka ng pangalan ng string ay katumbas ng getstring, ilagay mo ang pangalan ng in dito. Iyon ang pangalan ng pointer. At alam ito sa libreng na memorya. AARAL: Kaya kapag pinakakawalan nito isang na memorya, ang pointer tumuturo pa rin sa lugar na iyon sa memory? O kaya ay ang pointer emptied din ng ang address na ito nagtuturo sa. Jason HIRSCHHORN: Kami ay dapat na subukan na. Dapat nating code na iyon. Ng bumalik kapag makuha namin sa Hayaan coding, at sabihin code na iyon. At kung gusto mong malaman ang kasagutan sa na, maaari mo ring code na sa habang panahon. Ngunit iyon lamang ang isang mahusay na tanong. AARAL: Posible bang libreng isang bagay masyadong sa lalong madaling panahon? Kaya ito kailangan mo pa rin para sa iyong programa, at napalaya ka na puwang ng memory? Jason HIRSCHHORN: Oo. Posible, kung libre ka ng isang bagay at pagkatapos nito mong gamitin muli, ay sa iyo tumakbo sa isang error. Ngunit iyon sa iyo, dahil napalaya mo isang bagay at pagkatapos ay tinatawag na ito sa ibang pagkakataon. Kaya na ay hindi sinasadya ng isang programmer ni. Ngunit oo. Maaari kang magsulat na. Anumang higit pang mga tanong sa - Oo. AARAL: Kaya kung ikaw ay dapat lamang palayain ito sa pangkalahatan bago ang Nagtatapos ang programa, ang ibig sabihin na kung ang Nagtatapos ang programa at hindi mo na palayain ito, na memorya ay inilalaan pa rin? Jason HIRSCHHORN: Kung nagtatapos ang iyong mga programa at makalimutan mo upang palayain ang isang bagay, at pagkatapos ay na memorya ay inilalaan sa buong ang buhay ng iyong programa. Kapag ganap na nagsara ang programa, na memorya ay hindi papunta sa upang manatili doon magpakailanman. Ang computer na ay sapat na smart na malaman na kapag nagsara ang programa, dapat mapupuksa ang lahat ng memorya na ay nauugnay sa programang iyon. Subalit, may mga kagamitang maaari mong patakbuhin ang sa isang programa upang makita kung, kapag ang programa tapos na, nakalimutan upang palayain ang ilan sa memorya. At para sa iyong susunod na problema kung saan nakatakda ikaw ay gumagamit ng malloc at gamit mga payo, ikaw ay tumatakbo na ito programa sa iyong programa upang makita kung, kapag pangunahing pagbalik, nagkaroon ka ng ilang bagay na naiwan unfreed. Kaya hindi sila titira malloced magpakailanman sa iyong computer. Iyon ay magiging bulagsak, dahil masyadong mabilis, mga computer Gusto maubusan ng memorya. Ngunit kung tumakbo sila hanggang sa katapusan ng iyong programa at hindi ito ay naka-napalaya at ang iyong programa lumabas, na pa rin ng problema na ang tool na ito ay makakatulong sa matugunan mo. AARAL: Iyan ba Valgrind? Jason HIRSCHHORN: Ito ay tinatawag Valgrind. At makikita mo - AARAL: Ngunit kami Hindi mo na kailangang malaman na para sa mga pagsusulit, bagaman? Ibig kong sabihin, ito ay usapan tungkol sa Medyo sa panayam. Jason HIRSCHHORN: Kaya Valgrind ay ang pangalan ng tool na. Pag-alam kung ano ang gagawin nito ay sapat na para sa mga pagsusulit. Ngunit hindi ka pa ginamit ito sa iyong itakda ang problema dahil hindi namin ay may isang hanay problema na tahasang Aaksyunan may malloc o iyo gamit ang malloc. Kaya hindi mo pa ginamit Valgrind. Ngunit gagamitin mo ito nang mas maaga sa halip na sa ibang pagkakataon. AARAL: Maari mong ulitin ano Valgrind ay? Jason HIRSCHHORN: Paumanhin? AARAL: Maari mong ulitin kung ano sa layunin ng Valgring ay? Jason HIRSCHHORN: Valgrind ay ang pangalan - tulad ng GDB ay tumutulong sa i-debug mo ang iyong programa, Valgrind tumutulong kang malaman kung mga bagay ay hindi nai-napalaya kapag nagsara ang programa. Kaya makikita mo patakbuhin ito sa iyong mga programa. At iyong programa lumabas, at sasabihin nito sabihin ang iyong programa na tinatawag na malloc ganito karaming beses para sa ganito karaming bytes, at mo tinatawag lamang libreng ito maraming beses. At kaya iniwan mo ang mga maraming mga byte nang hindi napalaya. O kaya makikita ito sabihin mo na napalaya ang lahat. Magandang trabaho. AARAL: OK. At ang tawag dito Valgring? Jason HIRSCHHORN: V-A-L-G-R-I-N-D. AARAL: Ang isang tanong tungkol sa mga payo. Kaya sabihin n mo pa lagyan ng star x ay katumbas ng isang bagay. Iyon ay katumbas ng, ang kahit anong naglalagay ka ng doon, ay na kung ano ang ilalagay sa loob ano ang x ay tumuturo sa, o ang pointer ng x? Jason HIRSCHHORN: Maari bang ma-mo ulitin ang mga katanungan? Puwede ba kaming gumuhit ito habang ito sabihin sa iyo? AARAL: Sa pagsusulit, talaga, ang isa na ipinadala mo sa amin, ito ay tulad ng, pansamantalang trabaho star katotohanan ay katumbas ng CS50 mga bato, tama? Kaya ang ibig sabihin na na na CS50 bato ay kung ano ang katotohanan ay tumuturo sa? Jason HIRSCHHORN: Kaya mo pinag-uusapan tungkol sa isang pansamantalang trabaho star sa isang string, kung paano na gumagana? Oo. OK. Ni gumuhit ito sa paglipas dito Hayaan. [Side-uusap] Jason HIRSCHHORN: Kaya ito variable ay magiging ng uri ng pansamantalang trabaho bituin. Paano malaki ay isang variable ng uri ng pansamantalang trabaho star? Gaano karaming bytes? ESTUDYANTE: Apat. Jason HIRSCHHORN: Ito ay apat na bytes. Gaano karaming mga karapatan ay isang variable ng uri int star? ESTUDYANTE: Apat. Jason HIRSCHHORN: Apat na bytes. Kung ito ay isang pointer, kung gayon ito ay palaging apat na bytes, dahil sa mga paalala, ang kanilang halaga ay isang memory address. At memory address sa CS50 appliance apat na bytes mahaba. Kaya kapag tinatawag naming getstring, o kapag kami sabihin nating, stringname katumbas, at pagkatapos ay sa double quote maglagay ng string, ay paglalagay namin - na rin, na ang isang ilan naiiba. Susubukan naming huwag getstring bilang halimbawa. O kaya pansamantalang trabaho star ng isang bagay ay katumbas ng string. Paumanhin, bigyan mo ako ng halimbawa na iyong nabasa na? AARAL: pansamantalang trabaho star katotohanan ay katumbas ng "Cs50 mga bato" sa double quotes. Jason HIRSCHHORN: Kaya ng bituin na ito, ito Makikita kami tatawag sa x variable na ito para sa aming mga generic na mga layunin. Lumikha kami ng isang variable na tinatawag na x. Ito ay uri ng pansamantalang trabaho bituin. Ito ay isang pointer sa isang serye ng mga character. Kaya pababa dito - Kaya ito ay kung paano ito gagawin magtrabaho sa memorya. Ito ay mag-imbak ng memory address. Ito-imbak sa memory address ng ang unang character sa array. At pagkatapos ay kapag ikaw ay sumunod ang pointer, gagawin mo makuha ang unang character. At kung binabasa mo ito bagay tulad ng isang string, ang iyong computer ay matalino sapat na malaman, basahin ang buong bagay hanggang sa ito ay nakakakuha sa isang sumasagot na hampas 0. Ngunit kung binabasa mo ito isang character sa isang oras, kaya ka iterating sa pamamagitan ng ang string na ito, pagkatapos ay mong basahin lamang ng isang na character sa isang panahon hanggang sa makuha mo upang backslash 0. Iyon ay maaaring sagutin ang iyong tanong, bagaman. AARAL: Oo, ngunit hindi mo pa malloced na espasyo pa para sa na pointer. Jason HIRSCHHORN: Kaya hindi ako masyadong sigurado eksakto kung ano ang hinahanap mo sa, dahil hindi ako gumawa na pagsusulit. Iyon ay dapat na maging isang kapaki-pakinabang Resource mula sa isa pang tf. Kung lumilikha ka ng isang string sa stack o bilang isang lokal na variable, ipapakita ito maging array ng mga singil sa halip na lamang sa pangkalahatan ay isang pansamantalang trabaho star na tumuturo sa isa pang string. Ngunit hindi ko alam. Iyon ay maaaring isang pointer sa isa pang string sa stack pati na rin. Oo. AARAL: alam ko na kailangan mo upang magtalaga ng memorya kung ang pointer ay nagsisimula pa ipinahayag sa loob ng isa pang function. Kailangan mong gawin ang parehong bagay kung ito ay ini ipinahayag sa loob ng main, ginagamit mo ito sa loob ng main? Jason HIRSCHHORN: So yes. Maaari mong magpahayag ng isang pointer sa anumang memory address sa memorya. Maaari itong maging ang memorya ng address ng isang lokal na variable, bagaman malimit, mga tao huwag magpahayag ng memory address sa mga lokal na mga variable dahil sila pumunta ang layo ng isang beses na pag-andar ay nagbalik, na ang dahilan kung bakit namin sa pangkalahatan malloc bagay. Ngunit oo, maaari mong magpahayag ng isang pointer sa isa pang lokal na variable. Ito ay lamang sa pangkalahatan ay hindi tapos na. Ngunit maaari kong tingnan ang na partikular na bagay pagkatapos ng klase. Oo. AARAL: tingin ko ito ang uri ng kung ano ang hihilingin. Ay mukhang kakaiba sa ma-initialize isang pointer hindi bilang isang address, ngunit bilang kung ano Mukhang tulad ng isang halaga. Mukhang tulad ng CS50 ay kung ano ang nasa loob ang bagay na itinuturo sa at hindi ang aktwal na address, i-right? Jason HIRSCHHORN: Kaya na hindi ito ang kaso, bagaman. Iyan ay hindi kung ano ang nangyayari. Kapag pinahahayag isang pansamantalang trabaho bituin, ito ay isang memory address. Mga payo ay ang lahat ng memory address na tumuturo sa ibang bagay. Iyon ibang bagay ay maaaring maging sa stack, ngunit halos palaging ay sa magbunton sa paraang gagawin namin makita ito ginagamit. Ngunit stringname ay katumbas ng double-quote "Getstring," maaari naming makita na at kami Maaari tingnan ng masinsinan na at code na iyon. getstring string ay hindi naka-save sa na variable, o anuman ang string pangalan ay ay hindi naka-save sa na variable, dahil hindi iyon paano mga payo gumana. Ba na magkaroon ng kahulugan? AARAL: Oo. Jason HIRSCHHORN: OK. Sana, na noon ay hindi nakakalito sa sinuman. Ngunit kung ito ay, maaari naming tumingin muli sa ito sa isang sandali, dahil aktwal na kami ay pagpunta sa code ng isang bagay na habilin sana gumagana sa mga string at makatulong sa tingin mo higit pa komportable sa kanila. Anumang iba pang mga katanungan na may kaugnayan sa mga paksa o iba pang mga paksa na Makikita ko bang ilagay ang back-up? At - sa ngayon. Oo, Alden. Alden: Kaya ito ay lubos na hindi kaugnay, ngunit maaari pumunta lamang namin ang higit sa talagang mabilis kung ano ang kailangan naming malaman tungkol sa pagkakaiba sa pagitan ng 32 at 64-bit na machine? Jason HIRSCHHORN: Oo. Kaya 32 bits ay kung gaano karaming bytes? Alden: Ito ay apat na bytes. Jason HIRSCHHORN: Ito ay apat na bytes. At 64 bits ay kung gaano karaming bytes? AARAL: Eight. Jason HIRSCHHORN: Eight bytes. Kaya muli, walong bits ay isa byte. Ang iyong CS50 appliance ay 32-bit na machine. Kaya memory address ay apat na bytes mahaba. May 2 sa 32 memory address. 0-2 sa 32 minus 1. At hindi ako positibo, ngunit iyan ay marahil ang saklaw ng kung ano ang kailangan mong i- alam para sa isang 32-bit na machine, na memory addresses ay, muli, apat na bytes mahaba, at iyon ang maximum na halaga ng memory address. Gayundin, mga uri ng data - maaaring ito ay isang bagay tulad ng mahusay na Sulit noting. Ang laki ng isang uri ng data ay depende sa ang machine nakikipagtulungan ka sa. Kaya isang pansamantalang trabaho, ang isang solong character, ay kung paano maraming bytes sa aming CS50 appliance? Ang isa byte. At ito ay tunay na isang byte bilang na rin sa 64-bit na machine. At karamihan ng mga uri ng data ay ang parehong bilang ng bytes sa parehong machine. Ngunit ang ilang mga uri ng data ay naiiba sa parehong machine. Kaya na magiging potensyal na ang tanging bagay na kailangan mong malaman. Ngunit kahit na, sa palagay ko, ay lampas sa hanggahan - Ako halos positibo, kung tiningnan mo likod sa lumang pagsusulit, sinasabi nito, ipinapalagay para sa coding problema na iyong ginagamit 32-bit na machine. Ngunit mayroong, na isasama sa na sa kaso ikaw ay interesado, may mga mga uri ng data na ay pareho laki sa lahat ng mga machine. Kung nakita mo ang isang bagay tulad ng uint32_t, maaari mo o maaari hindi nakita iyon. Iyan ay isang uri ng data. Iyon ay nagsasabi, maging 32 bit man kung ano ang machine ay ito sa. Kaya kapag ang mga tao ay sumusulat portable code, ang mga ito ay marahil hindi gagamitin ang ints. Sa halip nila makikita ginagamit ang ibang data mga uri na alam nila ang magiging pareho laki sa bawat solong machine. Madhu. MADHU: Mayroon akong isang tanong tungkol sa ang proseso ng compilation. Kaya't kung ikaw ay sumusulat ng isang program na gumagamit ng isang library tulad ng CS50 o isang bagay tulad na, alam ko na na library May sa, sa isang punto, maging pinagsama-sama at naka-link in Ngunit kung gaano kalaki na ang mangyayari sa panahon ng ang compilation ng iyong programa? Anong bahagi ng proseso na library nangyayari kapag ikaw ay kino-compile ang iyong sariling mga programa? Jason HIRSCHHORN: Kaya't sabihin pumunta sa ibabaw sa pangkalahatan ang mga hakbang ng proseso na ito. Isulat mo ang iyong mga c file.. Sa iyong c file., Mo # isama ang iyong Header ng mga aklatan, halimbawa, cs50.h. Ano ang matalim na isama linya gawin sa iyong programa? Akchar. AKCHAR: Nagdadagdag ito ng mga modelo ng ang mga pag-andar mula sa header mga file sa mga aklatan. Jason HIRSCHHORN: Mismong. Nagdadagdag ito sa mga function ng modelo sa iyong code. Kaya kapag ang iyong code ay pinagsama-sama sa ang maagang yugto, alam ang tagatala na ang mga pag-andar talagang umiiral, at na sa isang lugar ang mga ito ay tinukoy. Ang. H file huwag isama ang mga kahulugan para sa mga pag-andar o kung paano talaga gumagana ang mga ito. Kasama lamang Cs50.h isang bagay na nagsasabing getstring ay isang tunay na bagay na Maaari itong mangyari. At standardio.h sabi printf ay isang tunay na bagay na maaaring mangyari. Kaya iyong c wika na may ito. Header file ay makakakuha ng naka sa ilang code machine-nababasa, na malaon ay makakakuha ng naka sa binary code, 0 at 1 ni. At iyon ang code na ganap ay makakakuha ng pinaandar. Ang-l linya cs50 - halimbawa, kapag sumusulat ka kumalatong - at pagkatapos ay isama-l mo cs50, mong i-type na in At nakikita mo na. Kapag isulat mo gawin, makakakuha ka makita na line up dito. At muli naming makita na sa isang segundo kapag kami code o mamaya sa kung kailan namin code. Ngunit na-l cs50 linya ang isang bagay medyo iba kaysa ang # include cs50.h. Ano ang na-l cs50 linya gawin? Avi? AVI: gusto kong sabihin na ito nagli-link ang library sa pagpapaandar na tumawag, tulad ng. o mga file. Jason HIRSCHHORN: Kaya napaka malapit, kung hindi kawili-on. Ang-l cs50 tumatagal ang binary file at merges ito sa iyong mga binary file. Kaya cs50.h, walang point sa pag cs50.h mula sa C wika sa binary bawat solong oras na ito ginagamit. Iyon ay magiging walang isip, dahil na Gusto aksaya ng maraming oras. Kaya ito ay na-pinagsama-sama at naging isang executable. At ngayon ito ay pagpunta sa ay naka-merge gamit ang iyong file sa dulo. Kaya mga 1 at 0 ay pagpunta upang sumanib sa iyong mga bago at 0 ni sa dulo. Kaya ngayon makikita mo talaga magkaroon ng aktwal na 1 at 0 na matukoy kung paano getstring, halimbawa, ang gumagana, o kung paano printf, halimbawa, gumagana. At para sa higit pang impormasyon, mayroong isang maikling compiler na nagbibigay Nate na dapat mong suriin out na napupunta sa pamamagitan ng mga hakbang na ito. Ngunit - Oo. AARAL: palagi ba ang mga ito sa o file. kapag ang mga ito sa anyo library, handa na para sa Pinagsama, naka-link - tulad ng ang mga ito ay sa binary code? Jason HIRSCHHORN: OK. Ano - AARAL: Iyan ba palagi ang kaso para sa ang mga library kapag-link mo ang mga ito? Jason HIRSCHHORN: Oo. Kaya may mga file, na kung saan ay magiging kung. Ni code machine, na maaari ring maging misteriyoso sa iyo. Hindi mo kailangang mag-alala tungkol sa mga. Ngunit sa pangkalahatan, oo, makakakuha sila nasa. o ang mga file na handa na upang patakbuhin. AARAL: Kaya kapag nagpapadala ka sa isang library, huwag ipadala mo lamang ang. h at ang. o? Hindi mo na ipadala ang. C o ang. Ni. Jason HIRSCHHORN: So - at ito ay sa ang maikling pati na rin, kung Mukhang darating na isang ito impormasyon maliit mabilis. Ngunit ang maikling sa compiler uusap tungkol dito pati na rin. Kapag nagpapadala ka ng isang library, kung naipadala mo ang. h, ang header ng file, mga function ng mga modelo, at ang 1 at 0 ni, na ang lahat ng kailangan mong bigyan. Hindi mo na kailangan upang bigyan ang kung paano ang function na gumagana, ang. c file. Dahil ang punto ng abstraction, o ang ituro ang mga API, ang punto sa ito SPL, ang Stanford portable library, ito ay para sa iyo upang mag-alala tungkol sa kung paano bagong GRect gumagana, o kung paano ilipat ang mga gawa, o kung paano magdagdag ng mga gawa. Lahat ng kailangan mong malaman ay na add na ay isang katangian na maaari mong gamitin, at gagawin nito sa ito. Kaya mo ba talagang hindi na kailangan malaman kung paano ito ay nakasulat sa C. mo kailangan lang upang alam, narito ang ilan sa mga pag-andar, kung ano ang kanilang gawin, at narito ang ilan sa 1 at 0 kapag mo ba talagang gamitin ang mga ito. Cool. Anumang higit pang mga tanong sa compiler o iba pang mga paksa sa board? AARAL: Mayroon akong tanong ng pagpapatupad ng recursive function. Ang isang tanong tungkol sa recursion. Nagkaroon ako ng pakiramdam na makabuo. Kaya sabihin mabilis na pumunta sa pamamagitan ng recursion na may tukoy na Halimbawa, ang isang factorial na function. Dahil ito ay isang halimbawa na madalas ay lumalabas o ginagamit upang ilarawan recursion. Kaya "4!" ay read bilang 4 factorial. At kung ano ang ibig sabihin ng 4 factorial? Ano ang ibig na gawin? Paano kalkulahin mo 4 factorial? 4 na beses 3 beses 2 beses 1. Kaya isa pang paraan upang magsulat 4 factorial ay upang isulat ito. 4 na beses 3 factorial. Dahil 3 factorial ay 3 beses 2 beses 1. Kaya 4 na beses 3 factorial ay 4 beses 3 beses 2 beses 1. Ito ang dahilan kung bakit factorial ay isang magandang kandidato para sa recursion, dahil ito ay malinaw na mayroong isang bagay na ang mangyayari paulit-ulit at mahigit sa isang mas maliit na bilang ng mga bagay hanggang sa iyo na maabot ang dulo. Kapag naabot mo na 1, 1 factorial ay 1. Hindi mo magkano ang karagdagang maaaring pumunta. 0 factorial ay tinutukoy din bilang 1. Kaya kapag nakarating ka na sa 1 o 0, handa ka sa dulo, at maaari mong simulan ang pagpunta-back up. Kaya kung gusto naming magsulat ng isang recursive function na kalkulahin ang factorial, kami ay pagpunta sa sumulat ng ilang pseudocode para sa na ngayon. Bago namin isulat na pseudocode - Bibigyan kita ng guys ng ilang minuto upang isulat ang palsipikado code o tingin lang ang tungkol dito - may dalawang mga bagay sa bawat Kailangan ng recursive function. Ano ang mga dalawang bagay? Jack: Ito ay upang tawagan mismo. Jason HIRSCHHORN: Noah? Oh, Jack. Sige. Jack: Ito ay upang tawagan mismo. Jason HIRSCHHORN: Kaya isang recursive function na nangangailangan ng recursive tawag, isang tumawag sa sarili nito. Iyon ay isa. At ano ang iba pang mga bagay? Jack: Isang base kaso. Jason HIRSCHHORN: Isang base kaso. Ang isang base kaso ay, narito kung kailan titigil kami. Kaya ang iyong mga function na ay makakakuha ng tinatawag na. Ang unang base kaso ay. Gusto mong malaman kung ikaw ay sa dulo. At kung ikaw ay hindi sa dulo, mo gawin ang iyong mga recursive tawag. At pumunta ka muli sa pamamagitan ng pag-andar, suriin muli ang iyong base kaso. Kung hindi ikaw ang katapusan, gumawa ka ng isa pang recursive tawag, at iba pa, at iba pa. Iyon ang dahilan kung bakit recursive function palagi kailangan mga base ng mga kaso at mga recursive tawag. Kung wala kang isang recursive tawag, ito hindi magiging isang recursive function. Kung hindi ka magkaroon ng isang base ng kaso, Gusto mong pumunta magpakailanman at doon ay magiging walang nagtatapos. At ang batayang kaso laging mauna, sapagkat magkakaroon gusto mong palaging suriin kung ikaw una mong sa dulo. Kaya bago kami gumawa ng ilang pseudocode, bakit ay hindi nagkakaroon ka ng isang minuto upang isipin ang tungkol kung paano ang isang recursive function na factorial ay nakasulat? Gayundin, bilang maraming bilang ang iyong ginagawa, pagsulat ito sa isang sheet ng papel ay kung ano ang pagpunta mong magkaroon upang gawin sa pagsusulit bukas. Kaya marahil mahusay na kasanayan upang gumawa ng Siguraduhin na ang code mo ay sumusulat pababa sa sheet ng papel - o maaari mong gawin iyon. Alam mo kung saan ang semicolons ay. Tandaan mo ang syntax. Dahil hindi ka magagawang upang magkaroon ng isang sabihin tagatala mo ginawa ng error. Gayundin, kasama ang mga linya, bukas, kapag na-coding ng mga problema, kung ikaw ay rushed para sa oras, o kung ikaw ay napaka lito bilang sa kung paano ka dapat isulat ang partikular na bagay sa c, ito Gusto marapat sa iyo na magsulat hindi tunay na code o magsulat ng mga komento sa pati na rin. Dahil mayroong mga bahagyang credit para sa isang marami sa mga tanong sa pagsusulit. Kaya't sa iyo ay maaaring rushed, o mo baka lang malito. Nagsusulat sa mga komento o hindi tunay na code ay madalas na mga paraan na iyong makakakuha ng bahagyang kredito. Kaya huwag mag-iwan ng isang bagay blangko sa pagsusulit. Walang mga parusa para sa paglalagay ng mga bagay in Sa katunayan, paglalagay sa palsipikado-code o mga komento ay pagpunta upang matulungan ang greyder malaman kung ikaw talaga alam kung ano ang ka ng pakikipag-usap tungkol sa, at marahil award kang ilang mga bahagyang credit para sa na. Gayundin kasama ang mga linya, isulat nang malinaw. Kung hindi namin talaga kung ano ang iyong pagsusulat, Hindi namin pagpunta sa tawagan ka sa bukas hatinggabi sa figure out kung ano ang iyong sinulat ni. Lamang kami ng pagpunta sa tumagal-off point. Sumulat ng malinaw upang maaari naming marinig, o sa halip, maaari naming basahin kung ano ang iyong sinulat ni. At kung sinasabi nito dalawang mga pangungusap, huwag magsulat ng talata. Sundin ang mga tagubilin. Sumulat ng malinaw. At sumulat sa mga komento o pseudocode para sa mga katanungan na maaari award bahagyang kredito. OK, ni pumunta sa factorial ipaalam. Kaya mayroon kaming isang function factorial. Kung ako ay upang aktwal na isulat ito sa C, ano ang kailangan kong ilagay bago ang pangalan ng pag-andar? Ang uri ng return, na, sa ganitong kaso, bibigyan namin ito int. At pagkatapos ay sa loob ng mga kulot tirante, ay kung ano ang napupunta sa loob ng kulot tirante para sa isang function? ESTUDYANTE: uri ng argument. Jason HIRSCHHORN: mga argumento nito. Kaya factorial habilin marahil tumagal ng isang argumento. Ito marahil tumagal lamang ng isang argumento. At muli naming sabihin makikita tumagal isang integer na tinatawag na x. At muli, kapag sumusulat ang prototype ng isang function o pagsusulat ang pag-andar sa iyong code bago pagtukoy ito, mo isulat ang uri ng data at ang pangalan ng na variable para sa na function na lamang. Kaya maaari mong pumasa sa ilang mga numero sa ito function, magkakaroon ito ay tinutukoy bilang x sa loob. Mayroon kaming ang aming factorial na function. Kailangan namin ang dalawang bagay, isang base ng kaso at isang recursive tawag. Ano ang pangunahing kaso para sa factorial? Isang tao na sinulat ni ito out at kung sino ang may hindi pa pasalitang, ano ang pangunahing kaso para sa factorial? AARAL: Kung n Mababa sa 2, bumalik 1. Jason HIRSCHHORN: Kung n ay Mababa sa 2, bumalik 1. Gusto ko na, dahil iyon tumatagal ng pag-aalaga ng 0 at 1. Kaya gagawin namin x <2, bumalik 1. Kung makuha namin ang pumasa sa 0, kung makuha namin pumasa sa 1, ito function ng habilin agad na bumalik 1. Kung makuha namin ang pumasa sa ilang mga numero na mas malaki sa o katumbas ng 2, kami ay pagpunta sa Mayroon aming recursive tawag. At kaya kung paano na pagpunta ay upang gumana? Maaari bang ibang tao na nagtrabaho sa ito sino ay hindi pa pasalitang ninyo akong bigyan ang recursive tawag para sa pag-andar sa pseudocode? Kung natin nakapasa sa isang numero x at ito ay mas malaki kaysa sa 2, ano nais naming gawin? Inirerekumenda rin na ang isang halimbawa nakasulat sa gilid na maaaring magbigay sa iyo ng isang pahiwatig. AARAL: Tawagan beses x ang factorial ng x minus 1? Jason HIRSCHHORN: Eksaktong karapatan. Kami ay pagpunta sa bumalik ulit x ang factorial ng x minus 1. At iyon, kahit na ako ay sumulat up, talaga, kung ano ang sinabi mo sa Ingles, factorial function na ito ay makakapagsimula ulit na tinatawag. Ito execute sa x minus 1. Ito bumalik sa ilang mga integer, at pagkatapos ay magkakaroon ito i-multiply ang dalawang magkasama, at halaga na magiging ibinalik sa kahit anong tinatawag na ito factorial na function, na maaaring maging isa pang halimbawa ng ito factorial na function. Kaya na ay isang halimbawa ng isang recursive function, isang napaka- simpleng recursive function. Ngunit karamihan sa mga ito ay magiging tulad nito. Kung nais mong isang mahusay na recursive hamunin para sa pagsusulit, subukan ang coding binary paghahanap recursively. Dahil kung ginawa mo binary paghahanap para sa itakda ang problemang tatlong, malamang na ginawa ito iteratively sa isang habang loop. Ngunit ito ay maaari ding nakasulat recursively. Ikaw ay pagpunta sa kailangan upang isulat ang iyong sariling hiwalay na function na tumatagal ng ilang iba't ibang mga argumento command-line - o hindi argumento command-line, ang ilang mga iba't ibang lamang regular na mga argumento. Ngunit maaari kang sumulat ng binary paghahanap recursively pati na rin. AARAL: Kaya maaari mong isinulat din, sa halip ng x minus 1, mo sana nakasulat din x minus minus, o maaari kang magkaroon ng nakasulat minus minus x. Maaari mo bang ipaliwanag lang talaga mabilis bakit mga magiging iba't ibang mga bagay, tulad ng kung ano ang pagkakaiba ay sa pagitan ng x minus minus at minus minus x? Jason HIRSCHHORN: Hindi, hindi ako pagpunta sa pumunta sa na. Ngunit ako ay makipag-usap sa iyo tungkol dito pagkatapos class. x minus minus, minus minus x pagbawas x ng 1. Pero ginagawa nila ito ng kaunti naiiba. Ngunit hindi ko nais upang pumunta sa na. Iba pang mga tanong tungkol sa recursion o ang pagpapaganang ito? Iyan ay hindi talagang kahit pseudocode. Iyon ay isa lamang ang code sa C nais mong magsulat para na ito. OK, ang anumang iba pang mga tanong tungkol sa mga paksa dito? Oo. AARAL: Mayroon akong isang mabilis na rundown ng lumulutang na tuldok at katumpakan. Jason HIRSCHHORN: Lumulutang point at katumpakan. Maaari bang isang tao talagang mabilis ninyo ako ng rundown ng lumulutang na tuldok at katumpakan? Mo ang lahat ay nagkaroon upang gawin ito para sa iyong itakda ang problema, kaya ikaw ay ang lahat ng pamilyar sa mga ito. O siguro hindi lahat ng iyo. Sinuman? Bigyan mo ako ng isang makapagsimula na puwesto. Lumulutang point at katumpakan. Ano ang problema? Oo. Victoria? Vanessa: Vanessa. Jason HIRSCHHORN: Vanessa. Sorry. Vanessa: Mayroon lamang isang may hangganan bilang ng mga numero na maaaring katawanin dahil ikaw ay nasa isang, sa aming kaso, isang 32-bit na sistema. Kaya mo uri ng kailangang gumawa ng up ng ilang numero. Jason HIRSCHHORN: Kaya na akmang-akma. May lamang ng ilang halaga ng mga numero na maaaring katawanin. Kung i-multiply mo ang dalawang napakalaking numero, maaaring mapuno nito ang halaga ng mga puwang mayroon kang upang kumatawan isang integer. Iyon ang dahilan kung bakit minsan ay ginagamit namin ang isang mahaba mahaba sa halip ng isang int. Iyon ay may higit pang mga puwang. Iyon ay maaaring magkaroon ng isang mas malaking numero. Katumpakan Lumulutang punto ay gagawin sa iyon, ngunit din itong gawin gamit ang katotohanan na decimal na mga numero ay hindi laging kinakatawan. Sorry. Hayaan akong ilagay ito pabalik up. Ang decimal numero 1.0 ay hindi palaging kinakatawan katulad mo aasahan, 1.000000000. Minsan Ito ay kinakatawan bilang 1.000000001 o .999999999. Ito ay maaaring kahit na 89 itinapon doon sa isang lugar. Kaya mga decimal na numero ay hindi kinakatawan eksakto katulad ng ginagawa mo asahan ang mga ito upang katawanin. Kaya sa problema itinakda - ay ito ng dalawang? - itakda ang problema ng dalawa, kung saan kami Aaksyunan may lumulutang na tuldok numero, kapag gusto naming sa kanila upang kumatawan eksakto kung ano ang gusto namin sa kanila upang kumatawan, ang bilang ng pennies, o ang bilang ng mga cents, multiply namin ang mga ito sa pamamagitan ng 100. Bilugan namin ang mga ito. At pagkatapos ay i-cut-off namin ang lahat ng bagay sa likod ng decimal point. Iyon ay upang matiyak na ang mga ito ay lalabas talagang katumbas nang eksakto kung ano ang gusto namin ang mga ito upang pumatas. Dahil kapag kumuha ka ng isang bagay na isang float at i-on ito sa isang int, mo cut-off ang lahat ng bagay sa kanan ng decimal point. Dahil mayroong ilang mga lumulutang na tuldok imprecision, 100.000 ay maaaring maging kinakatawan bilang 99.999999999. At kung cut off mo lang ang lahat sa kanan agad, ka ng pagpunta sa makuha ang maling numero. Oo. AARAL: ako ay may isang tanong tungkol sa paghahagis. Ano order mangyari ito sa? Kung nais mong gawin ng float, bracket, 1 hinati sa pamamagitan ng 10, ang mga ito ay 1 hinati sa 10, pagkatapos makakuha 0.1, pagkatapos ay i- ito sa isang float? Jason HIRSCHHORN: Kung gagawin mo float 1 hinati sa 10 - AARAL: Oo, at pagkatapos ay katumbas ng - well, ito gagawin normal Mayroon itong katumbas sa - Oo. Gusto mong gawin itong isang float, tama? Jason HIRSCHHORN: OK, kaya kami ay pagpunta sa gamitin iyon upang segue sa pag-uunawa ang mga sagot sa mga tanong na ito sa pamamagitan ng coding. Dahil makikita mo marahil ay may napakaraming mga mga minutong katanungan, at isang mahusay na paraan upang malutas ang mga ito ay sa pamamagitan ng coding. Kaya kami ay pagpunta sa code na ito sa ngayon, at pagkatapos kami ay pagpunta sa bumalik at Code ng tanong na mayroon. Kaya ang unang linya - Hindi ko dapat na nakasulat na ito - ano ang unang bagay na gusto naming gawin kapag kami buksan up ng isang bagong file sa gedit? AARAL: Isama. Jason HIRSCHHORN: Isama ano? AARAL: CS50 library. Jason HIRSCHHORN: OK. Ano pa ang dapat naming isama? Lamang kami ng pagpunta upang suriin kung ano ang mangyayari kapag nagsumite ka ng isang bagay sa isang float. Ngunit ano ang kailangan namin upang isama kung hindi kami pagpunta sa magsulat ng isang programa C? AARAL: Standard ako / O. Jason HIRSCHHORN: stdio.h. Namin talagang hindi na kailangan, para ito programa, cs50.h, kahit na ito ay laging nakakatulong upang maisama ito. Ngunit palagi naming kailangang stdio.h. AARAL: Kapag coding sa C? Jason HIRSCHHORN: Kapag coding sa C. Kaya i-save ko ito bilang ito. C file. Nakakuha ako ng ilang magaling na syntax sa pagha-highlight. Isinulat ni ko walang bisa sa loob ng main. Ano ang ibig sabihin walang bisa? AARAL: Hindi tumagal ba ang anumang command-line na mga argumento. Jason HIRSCHHORN: walang bisa paraan, sa ganitong kaso, ang pangunahing ay hindi gumawa ng anumang command-line na mga argumento. Sa ibang mga kaso, ang ibig sabihin nito ang pag-andar Hindi tumagal ng mga argumento command-line. O kaya naman ang pag-andar, kung ako ay sumulat ng walang bisa pangunahing (walang bisa), na sasabihin pangunahing ni hindi nagbabalik ng anumang bagay. Kaya walang bisa lamang ay nangangahulugan na wala. Ano ang gusto kong isulat kung ako ay upang tumagal ng mga argumento command-line? AARAL: int arc c string arc v Jason HIRSCHHORN: int argc string argv. Iyan ba ang tama? AARAL: Ito ay pansamantalang trabaho star argv bracket. Jason HIRSCHHORN: Kaya maaari mong isulat string argv bracket o pansamantalang trabaho star argv bracket, ngunit kailangan mo ng mga bracket. Dahil argv ay isang array ng mga string, alalahanin. Ito ay hindi string ng isa lang. Kaya string argv ay, dito ay isa string na tinatawag argv. String argv bracket ay, narito isang array ng mga string. Kaya int argc string argv bracket ay magiging isang bagay na ako Gusto marahil magsulat. Kaya nais mong i-save sa isang integer? AARAL: Oo, integer. O kaya sa isang float. Jason HIRSCHHORN: Sa isang float? Tulad ng, ng float x ay katumbas ng 1 hinati sa 10. Jason HIRSCHHORN: OK. Paano ko i-print out ako ng float sa printf? Ano? AARAL:% f. Jason HIRSCHHORN:% f. Ano ang isang integer? d o i. Ano ang isang string? AARAL: s. Jason HIRSCHHORN: s. Paano ako makakakuha ng isang bagong linya? AARAL: Backslash n. Jason HIRSCHHORN: Ano ang gagawin ko bumalik kung pangunahing nagpapatakbo ng tama? AARAL: 0. Kailangan ko bang isulat ang linyang iyon, bagaman? AARAL: Hindi. OK, hindi namin isulat ito, pagkatapos. Maaari lahat basahin iyon? Mukhang isang bit maliit. Maaari ba lahat ng tao makita, o dapat Ginawa ito mas malaki? Sa tingin ko para sa mga camera, magsasagawa kami ng ito isang bit mas malaki, bagaman. Jason HIRSCHHORN: Kung gusto kong i ito . C-file sa isang executable, kung ano ako magsusulat? AARAL: Gumawa ng pagsubok. Jason HIRSCHHORN: Paumanhin? AARAL: Gumawa ng pagsubok. Jason HIRSCHHORN: Gumawa ng pagsubok. Kami ay pakikipag-usap tungkol sa ang linyang ito nang mas maaga. Kumalatong. Ano ang kumalatong? Ang pangalan ng tagatala. Ano ang linyang ito? AARAL: Itinatakda up ito para sa paggamit ng GDB. Jason HIRSCHHORN: Sets ito up para sa paggamit ng GDB. Linyang ito, kung ano ang na? AARAL: Ang source code. Jason HIRSCHHORN: Iyon ang source file, ang. c file. Ano ang mga dalawang linya gawin? O kaya naman ang dalawang hindi linya. AARAL: mga pangalan ito ng ito susubukan. Jason HIRSCHHORN: Kaya sinasabi ng gitling o, pangalanan ito ng isang bagay na naiiba. At dito ka sa pagtawag ito ng pagsubok. Kung hindi ko kinailangang na in, ano ang magiging ito pangalanan ito? AARAL: A.out. Jason HIRSCHHORN: A.out. Ano ang ginagawa ito? AARAL: Links ang matematika library. Jason HIRSCHHORN: nagli-link Ito sa matematika library. Hindi namin isama ang matematika library, ngunit dahil na kaya karaniwan, na sila ang nakasulat make na laging isama ang matematika library. At gayon din naman, ito ay kasama ang ang CS50 library. OK, kaya kung ilista namin, mayroon kaming ngayon isang executable na tinatawag na pagsubok. Upang maisagawa ito, isulat kong pagsubok. Nakikita ko na ang aking mga lumulutang na tuldok, tulad ng inaasahan, ay katumbas ng 0. Gumagana ba na - kaya - AARAL: Pagkatapos kung inilagay mo float ngayon, tulad mo cast ito bilang ng float - Jason HIRSCHHORN: Cast ang 1 sa isang float? AARAL: Hindi, nagsumite ang buong bagay - oo. Kung ginawa mo lang iyon, gagawin na gawin itong 0.1? Jason HIRSCHHORN: OK, kaya talagang mabilis, 1 hinati sa 10, mga mga integer na hinati. Kaya kapag hatiin mo ang integer, ang mga ito ay 0, at iyong sine-save na 0 sa isang float, dahil ang slash ay lamang integer division. Kaya ngayon naka pag kami ng isang bagay sa isang float. Ni makita kung ano ang mangyayari Hayaan. Gagawin namin pagsubok. Kaya ngayon nakita namin na na slash ay hindi integer division, ito ay lumulutang punto division. Dahil isa sa mga argumento nito ay cast sa isang float. Kaya ngayon sinasabi ito, ituturing ito division tulad kami pagharap sa lumulutang na tuldok, hindi na may integer. At gayon makuha namin ang kasagutan inaasahan namin. Ni makita kung ano ang mangyayari Hayaan - oops. Kung gusto kong i-print nang higit pa decimal spot, kung paano maaaring gawin ko na? Tuldok f Point, o kahit gaano karaming: AARAL decimal place hangga't gusto mo. Jason HIRSCHHORN: Kaya i-print ko 10 decimal spot. At nakikita namin ngayon namin nakukuha ang ilang mga kakatwang mga bagay-bagay. At na napupunta bumalik sa iyong katanungan tungkol sa mga lumulutang na tuldok imprecision. May kakaiba mga bagay-bagay na naka-imbak sa dito. OK, ang ibig na sagutin ang iyong tanong? Ano pa ang gusto mo sa code ng mabilis? AARAL: ako Nais lamang upang makita kung o Hindi, kung napalaya up ng ilang pointer, kung na pointer pa rin si naka-imbak sa ito ang address ng kung ano ito ay hindi naging na tumuturo sa dati. Jason HIRSCHHORN: OK, kaya ni gawin na ipaalam. Pansamantalang trabaho star ptr, ito ay lumilikha ng isang variable tinatawag ptr ng uri ng pansamantalang trabaho bituin. Paano ako magsulat malloc? Alden? Alden: malloc lang. Ngunit pagkatapos ito ay dapat na laki ng, at sa kasong ito, hulaan ko ikaw ay ay tumuturo sa pansamantalang trabaho. Kaya gusto itong maging pansamantalang trabaho. Jason HIRSCHHORN: OK, kaya nang higit pa generically, Inside - ni-edit ipaalam. Sa Loob ng malloc, gusto mo ang iyong numero ng bytes sa magbunton. Sa pangkalahatan, ano ang iyong nakita namin na hindi namin ginagawa namin ang pagpunta sa malloc mga string, halimbawa, o array ng integer. Kaya kung nais namin 10 integer, o 10 char, 10 ay magbibigay sa amin 10. At pagkatapos ay ang laki ng char ay magbibigay sa sa amin na ang laki ng char, na sa kasong ito ay 1 byte. Kumuha kami ng 10 bytes. Kung kami ay upang isulat ang laki ng int, na bigyan kami ng mga 40 bytes. Kaya nang higit pa generically, sa loob ng malloc ay ang bilang ng mga byte na gusto mo. Sa kasong ito, kami ay nakakakuha ng 1 byte. Aling tila tulad ng isang kakaiba paggamit ng malloc, ngunit para sa aming mga mga layuning pang-saysay. Kaya doon lang iyon. Kami ay pagpunta sa tumawag sa libre. Kami mapupuksa ito at ginagamit namin muli ptr. At ano ang nais mong suriin? AARAL: ako Nais lamang upang suriin kung o hindi nagkaroon ng anumang bagay sa loob nito. Jason HIRSCHHORN: Kaya kung ito itinuturo sa anumang bagay? AARAL: Oo, eksakto, kung ito ay nagkaroon pa rin ng isang memory address. Jason HIRSCHHORN: Kaya gusto mo upang suriin ang halaga ng ptr? AARAL: Oo, eksakto. Jason HIRSCHHORN: Ano ang gagawin ko isulat dito kung gusto ko upang suriin ang halaga ng point - ano, Jordan sinabi, ang halaga? O kung ano ay naka-imbak sa loob ng ptr? AARAL: Ang isang memory address. Jason HIRSCHHORN: Ang isang memory address. Kaya kung isulat ko pa lang ito, ipapakita ito magbigay sa akin ang halaga ng ptr. At paano ko ipi-print out isang address na memory? Ano ang format string para sa isang memory address? AARAL:% p. Jason HIRSCHHORN:% p. % S ay isang string. % P para pointer. Iyan ba ang tama? Iyon ang tama. Kaya ptr ay katumbas ng - ito pa rin ay may isang bagay sa loob nito. Marahil ito ay isang mas kawili-wiling tanong. Ano ang ibig na linya gawin? AARAL: Seg faults. Jason HIRSCHHORN: Ano? AARAL: Sa tingin ko ito seg faults. Jason HIRSCHHORN: Hm? AARAL: Sa tingin ko magkakaroon ito seg fault. Jason HIRSCHHORN: Kaya ang linyang ito ng code, bituin ptr, kung ano ang ibig sabihin ng mga bituin? AARAL: Nilalaman ng. Jason HIRSCHHORN: Oo. Pumunta upang makuha ang nilalaman ng. Kaya ito ay pagpunta sa pumunta sa memory tugunan doon at bigyan ako iyon. Ginamit ko% c dito mismo dahil doon ay nakaimbak doon character. Kaya kami ay pagpunta upang pumunta sa na address namin Nakita lamang - o magkakaroon ito marahil maging isang Medyo naiiba ito na patakbuhin namin ang programang. Ngunit ipagpapatuloy namin sa address na iyon na kung saan alam namin pa rin umiiral at makita kung ano ang doon. Kaya ito ay hindi seg fault. Ito lamang ay hindi magbibigay sa amin ng kahit ano. Ito ay maaaring aktwal na ibinigay sa amin isang bagay, kami lamang ay hindi maaaring makita ito. At na napupunta pabalik sa ideyang ito - at hindi kami ay pagpunta upang makakuha ng masyadong maraming sa ito, dahil na lagpas sa ang saklaw ng kursong ito. Ngunit usapan natin ang tungkol dito mismo, kung namin nagpunta sa ibayo ng hangganan ng array sa pamamagitan ng 1, hindi namin maaaring makakuha sa problema. Minsan, kapag pumunta off mo sa pamamagitan lamang ng 1, ikaw ay gumagawa ng mali, at ikaw maaaring makipag-problema. Ngunit wala ka laging makipag-problema. Depende nito kung magkano ng isang masamang bagay sa iyo ko, hindi ka pagpunta upang makakuha ng sa problema. Alin ang hindi na sabihin, maging nanggigitata sa iyong code. Ngunit ito ay upang sabihin, ang programa ay hindi laging quit, kahit na pumunta ka sa isang lugar hindi ka dapat pumunta. Ang isang mahusay na halimbawa ng iyon ay, ng maraming tao sa kanilang mga problema set 3, na ay 15, ay hindi suriin ang hanggahan ng board. Kaya mo ay tumingin sa kaliwa, tumingin sa kanan, tumingin sa tuktok, ay tumingin hanggang sa ibaba. Ngunit hindi mo suriin upang makita kung ang tuktok ay talagang pagpunta sa maging sa board. At may maraming mga tao na ginawa na at Naka na in, nagtrabaho ang kanilang mga programa ganap na ganap, dahil kung saan na board ay naka-imbak sa memorya, kung ikaw nagpunta isa nasa itaas nito o naka-check na memory address, nagkaroon hindi anumang bagay lalo na kalagim-lagim tungkol sa na, kaya ang iyong programa ay hindi pagpunta sa sigaw sa iyo. Ngunit nais naming mag-alis pa rin point kung hindi mo suriin na, dahil sa iyo ay paggawa ng isang bagay na ikaw ay hindi ipagpalagay na gawin, at maaari kang magkaroon ng nakuha sa problema. Logro ay, bagaman, marahil ang hindi. Kaya ito ay upang ipakita na, oo, maaari naming pa rin pumunta dito. At hindi namin nakukuha sa pag sa kasong ito. Kung sinubukan naming gawin basahin ang susunod na 100 character, kami ay marahil makakuha sa problema. At maaari mong code ng pagbabasa ng susunod na 100 character kung gusto mo sa pamamagitan ng paggawa ng ilang uri ng para sa loop. Oo. AARAL: Dahil tayo ay nakatalaga na espasyo isang aktwal na halaga, kami gagawin hindi talaga magawang makita ang anumang bagay. Dapat subukan namin ito sa pag-set na katumbas ng gusto c o ng isang bagay? Jason HIRSCHHORN: Mahusay pinag-uusapan. Paano ko itatakda ang halaga na - ano linya ng code ako magsusulat sa linya pito na gawin kung ano ang iyong sinabi? AARAL: Bituin ptr ay katumbas ng single quote c magtapos single quote. Jason HIRSCHHORN: Kaya na paglalagay isang character, c, sa lokasyon na iyon, dahil muli, na bituin Nangangahulugan pumunta sa doon. At kapag ginamit sa kaliwang bahagi ng isang pagtatalaga operator, na katumbas ng mag-sign, hindi namin pagpunta upang makakuha ng na halaga kaya magkano bilang itakda ang halaga. Ngayon sabihin makita kung ano ang mangyayari. Naglaan na kami ng isang bagay doon at ito ay doon. Tinatawag na kami ng mga libreng. Marahil nangyari ang ilang mga bagay-bagay sa ang magbunton. Kaya ito ay hindi doon ngayon. Ngunit muli, hindi namin nakukuha sa pag para sa pagpunta doon. Ako ginagawa ito out sa code upang ilarawan na marami sa mga mga tanong na mayroon ka, ang mga ito ay talagang kawili-wiling sumasagot ng maraming oras. At ang mga ito ay talagang mahusay na mga katanungan. At maaari mong malaman kung ang mga ito sa iyong sarili kung, halimbawa, hindi kami sa seksyon. Oo. AARAL: Dahil hindi ka Ipinapadala ang pointer kahit saan, kailangan mong i- gamitin ang malloc? Jason HIRSCHHORN: Kaya ito napupunta pabalik sa iyong paunang tanong. [? ?] Ito ba ay lamang ng isang lokal na variable? Malloc dito ay hindi na nakakahimok. Ang paggamit ng malloc dito ay hindi na nakakahimok dahil ito ay lamang ng isang lokal na variable. AARAL: Kaya magagawa mo pansamantalang trabaho star ptr ay katumbas ng kumusta? Jason HIRSCHHORN: Oh. Kaya kami ay pagpunta sa ngayon babalikan sa iyong paunang tanong. Sa tingin ko kayo ay hindi nasiyahan kasama ang aking sagot. OK? Tulad ng mga iyon? AARAL: Oo. Maghintay. Jason HIRSCHHORN: At kung saan nais mong i-print out? Kaya makikita print namin ang isang string tulad na? AARAL: Kawili-wiling. Jason HIRSCHHORN: Kaya ito sabi ni ito argumento ay ang uri ng isang character. Kaya ito ay dapat na isang character. AARAL: tumatagal lang ang unang isa. Jason HIRSCHHORN: So ito ay kung ano ang aking sinabi bago. Tulad ng sinabi ko, hindi ito ang pag-iimbak ang string sa loob variable pointer. Ito ay ang pag-iimbak - AARAL: Ang unang halaga ng string. Jason HIRSCHHORN: Ang address ng sa unang halaga ng string. Kung kami ay upang i-print out ito, hindi kami pagkuha ng mga halaga sa loob pointer. At muli naming makita ito ay, sa katunayan, address ng memorya. Ba na magkaroon ng kahulugan? Sorry. Maghintay, ay na sagutin ang iyong tanong, bagaman? AARAL: Oo. Jason HIRSCHHORN: Ito linya ng code ay paglikha ng isang string at pagkatapos ay isa pang variable pointer na tumuturo sa na string, na array. Oo. AARAL: Kaya kung nagpunta kami ng isa memorya tugunan ang karagdagang, nais makuha namin ang h? Ay ito ay naka-imbak bilang isang string? Jason HIRSCHHORN: Tulad ng, ginawa namin - kaya ito ay mahalaga na gawin. Ito ay point aritmetika, kung saan ka guys nakita bago at dapat ay medyo komportable. Ito ay kauri sa pagsusulat - kung kami ay upang isulat ito linya ng code, nakakita kami pagtatanda array bago. Ito ay dapat magbigay sa amin ang pangalawang halaga sa array, h. Kung ginawa namin ito, ito ay dapat ding magbigay amin ang pangalawang halaga sa na array. Dahil ito ay pagpunta hindi sa memory address ng unang bagay na, ngunit ang memory address ng bagay isa sa ibabaw. At pagkatapos ay ang bituin operator dereferences na pointer. At muli, sabihin makita. Kumuha kami muli h. AARAL: Ano ang eksakto dereference ibig sabihin? Jason HIRSCHHORN: Dereference ay isang magarbong salita para pumunta sa. Pumunta sa iyon at makakuha ng kung ano ang doon ay upang dereference isang pointer. Ito ay lamang ng isang magarbong salita para doon. AARAL: Kung gusto naming i-print ang buong string, magagawa namin gawin ampersand pointer? Jason HIRSCHHORN: OK, kami ay pagpunta sa i-pause dito. Pupunta kami sa mga end dito. Binibigyan ka ng ampersand ang address ng isang lokasyon, kaya kapag gumawa ka ng ampersand isang variable, binibigyan ka nito ng address kung saan variable na ay naka-imbak. Ampersand pointer ay magbibigay sa iyo ang address ng ptr kung saan ptr ay nasa memorya. Hindi namin pagpunta sa pumunta sa may halimbawang ito. Maaari mong malaman kung ang mga bagay sa inyong sarili. Ngunit muli, ito ay maaaring kahit na ma-verging isang bit na lampas sa kung ano ang kailangan mong malaman para sa ang saklaw ng ito mid-matagalang - o ito pagsusulit, sa halip. Sorry. Pupunta kami upang ilipat sa, dahil gagawin ko i gawin ang isa sa coding problema bago ang oras ay up. At kami ay pagpunta sa code kung ano ang aking tingin ay ang pinaka-nakakahimok ng mga halimbawa, atoi. Kaya ito ay isang tanong sa isang pagsusulit dalawang taon na ang nakakaraan. At mayroon akong ito sa board dito. Ang mga tao ay nagtanong sa pagsusulit - sila ay bibigyan ng kaunti pa tesxt sa ang tanong, ngunit eliminated ko ang teksto sapagkat ito ay hindi kinakailangang para sa aming mga layuning ngayon. Ito ay ilan lang sa background sa kung anong atoi ginawa. Ngunit mo ang lahat ng alam at napaka pamilyar sa atoi. Iminumungkahi ko sa iyo ang code na ito sa isang sheet ng papel. Iminumungkahi ko rin na gamitin mo ang diskarte na-nawala kami sa ibabaw marami sa aming seksyon. Una, tiyaking nauunawaan mo ang ano atoi ng paggawa. Gumuhit ng isang larawan o makabuo ng ilang mental na imahe ng ito sa iyong ulo. Susunod, isulat pseudocode para sa ito. Sa pagsusulit, kung ang lahat makuha mo ay pseudocode, ng hindi bababa sa iyo maglagay ng isang bagay pababa. At pagkatapos ay i-map na pseudocode sa C. Kung mayroon kang isang tseke sa iyong pseudocode, tulad ng suriin kung ang isang bagay ay 1, na maps sa isang kung kalagayan at iba pa. At sa wakas, code sa program sa C. Kaya bumalik sa atoi at tumagal ng limang minuto sa code na ito sa isang sheet ng papel, na kung saan ay marahil tungkol sa dami ng oras na gusto mong gawin sa isang pagsusulit sa atoi code. Limang sa 15 minuto, lima hanggang 12, lima hanggang 10 minuto, ay tungkol sa halaga ng oras na nais mong gastusin sa tanong sa pagsusulit. Kaya tumagal ng limang minuto ngayon, mangyaring. At kung mayroon kang anumang mga katanungan, itataas iyong kamay at ako makakakita dumating sa paligid. [Side CONVERSATIONS] Jason HIRSCHHORN: OK, kaya na noon ay limang minuto. Iyon ay marahil tungkol sa halaga ng oras na nais mong gastusin sa na sa isang pagsusulit, siguro ang mababang dulo ng oras na iyon. Susubukan naming pagbabalik-tanaw sa isang bit. Ipaalam sa amin simulan coding na ito. At kung hindi namin makuha ang lahat ng mga paraan sa pamamagitan, ang mga sagot sa mga ito at ito pagsusulit tanong ay magagamit, muli, Taglagas 2011 ay kapag pinag-uusapan ito Lumitaw sa pagsusulit. At iyon ay nagkakahalaga ng walong puntos sa pagsusulit pagkatapos. Eight point ay nasa mataas na dulo ng halaga ng mga puntos na ang isang bagay ay nagkakahalaga. Karamihan sa mga tanong ay nasa hanay ng 1-6 puntos. Kaya ito ay isang mas mapaghamong pinag-uusapan, para sigurado. Maaari kahit sino makakuha ako magsisimula? Sa pangkalahatan, ano kami makapupunta sa nais gawin sa ito gumana atoi, lohikal? Ano ang gusto naming gawin? Kaya kami ay pagpunta sa magsulat ilang pseudocode. AARAL: I-convert ang mga character sa integer. Jason HIRSCHHORN: I-convert ang mga character sa integer. OK. Kaya kung gaano karaming mga character ay namin pagpunta sa kailangan upang pumunta sa pamamagitan ng? AARAL: Ang lahat ng mga ito. AARAL: Lahat ng mga character sa string. Jason HIRSCHHORN: Lahat ng mga character sa string. Kaya kung gusto naming pumunta sa pamamagitan ng bawat character sa isang string, ano ang isang bagay sa C nasaksihan namin na pinapayagan amin upang pumunta sa pamamagitan ng bawat character sa isang string? ESTUDYANTE: Isang para sa loop. Jason HIRSCHHORN: Isang para sa loop. Kaya kami ay pagpunta sa loop sa pamamagitan ng bawat character sa s. Pagkatapos, anong kami makapupunta sa nais na gawin kapag makuha namin ang isang tiyak na character? Sabihing ka namin nagsisimula pa pumasa sa isang 90. Kumuha kami ng 9. Ito ay isang character. Ano ang gusto naming gawin sa na karakter 9? AARAL: Magbawas ng ito mula sa character 0? AARAL: Magdagdag ng 0? Jason HIRSCHHORN: Magbawas ito mula sa character 0? AARAL: Oo. Jason HIRSCHHORN: Bakit Gusto mo bang gawin iyon? AARAL: [hindi marinig] halaga. Int halaga nito. Jason HIRSCHHORN: OK, kaya kinukuha namin ang na character 9, ibabawas ito mula sa 0 karakter upang makakuha ng aktwal na integer 9. Sweet. At kung paano ang kilala mo na karakter 9 minus 0 karakter ay 9? Ano tsart ay kang tumingin sa? AARAL: May mga lohikal na siyam mga lugar sa pagitan ng 9 at 0. O maaari kang tumingin sa talahanayan ASCII. Jason HIRSCHHORN: ASCII table. Ngunit oo, ikaw ay tama rin. Kaya ibawas namin 0. Kaya ngayon ay mayroon kaming ang integer 9. At ano ang gusto naming gawin sa mga iyon? Kung mayroon kaming 90, ito ay ang unang integer na, kung ano ang gusto namin naming gawin? AARAL: gusto kong ilagay sa isang pansamantalang integer array, pagkatapos ay gawin sa matematika upang ito mamaya upang gumawa ng ito sa isang dulo. Jason HIRSCHHORN: OK. AARAL: Maaari mong simulan sa dulo ng ang array at pagkatapos ay sumulong kaya na sa bawat oras na ilipat mo inaabangan ang panahon, mo i-multiply ito ng 10. Jason HIRSCHHORN: OK. Iyan tulad ng isang kaakit-akit nakahihimok na ideya. Maaari naming magsimula sa dulo ng aming mga array, at maaari naming gamitin strleng. Maaari naming gamitin strleng in dito. Susubukan naming makuha ang haba ng aming mga string. Simulan namin sa dulo. At + ang una, kinukuha namin lamang na integer, at siguro lumikha kami tulad ng isang bagong variable integer up tuktok kung saan ka sa pag-iimbak namin ang lahat. Kaya loop namin sa pamamagitan ng bawat pansamantalang trabaho sa mga mula bumalik sa harap, ibabawas namin ang 0, at pagkatapos ay dadalhin namin ito, at depende sa kung saan ito ay, i-multiply namin ito sa pamamagitan ng kapangyarihan ng 10. Dahil ang unang isa, ano ang ginagawa namin multiply ang rightmost ng character sa pamamagitan ng? AARAL: 10 sa 0. Jason HIRSCHHORN: 10 sa 0. Ano ang multiply namin ang pangalawang rightmost ng character sa pamamagitan ng? AARAL: [hindi marinig]. Jason HIRSCHHORN: Ano? AARAL: 10 sa 1. Jason HIRSCHHORN: 10 sa 1. Ang third-rightmost ng character? AARAL: 10 sa 2. Jason HIRSCHHORN: 10 sa 2. AARAL: Paumanhin, hindi ko maintindihan kung anong ginagawa namin dito. Jason HIRSCHHORN: OK, sabihin bumalik, pagkatapos. Kaya kami ay pagpunta upang makakuha ng nakapasa sa isang string. Dahil kami ay sumusulat atoi. Kaya natin ang pumasa sa isang string. Sabihing ka namin nagsisimula pa pumasa sa sa string 90. Ang unang bagay na kami ay pagpunta sa gawin ay itakda isang bagong variable integer na kami lamang ng pagpunta sa lumikha bilang aming bagong integer. Iyon ay kung ano kami ay pagpunta upang bumalik sa dulo. Kailangan namin upang pumunta sa pamamagitan ng bawat character sa ang string dahil natukoy naming na kailangan namin upang hawakan ang bawat isa at pagkatapos ay idagdag ito sa aming bagong integer. Ngunit hindi namin maaaring idagdag lamang ito bilang isang numero. Hindi namin maaaring lamang tumagal ng 9 at magdagdag 9 sa aming integer. Depende ito sa kung anong lugar ito ay nasa string. Kami ay pagpunta sa kailangan upang i-multiply ito sa pamamagitan ng kapangyarihan ng 10. Dahil na kung paano base 10 mga gawa. Kaya kami ay pagpunta upang makuha ang aktwal na karakter, o ang aktwal na integer numero, sa pamamagitan ng pagbabawas ng character 0 mula sa character 9 tulad ng ginawa namin sa pagbabawas ng character capital A mula sa kami kahit anong character na nagkaroon sa isa sa ang mga problemang ito. Kaya makikita talaga kami makakuha ng isang numero mula 0 hanggang 9-save bilang isang tunay na numero, at kami ay multiply ito sa pamamagitan ng kapangyarihan ng 10 depende sa kung saan kami ay sa string. At pagkatapos ay kami ay pagpunta upang idagdag ito pabalik sa aming bagong variable integer. Kaya kung ano ang magiging hitsura ng iyong gagawin ma - ipapakita namin gumuhit sa paglipas dito. Kung makuha namin ang pumasa sa sa string 90 - AARAL: [hindi marinig]. Jason HIRSCHHORN: Ngunit atoi tumatagal ng isang string. Kaya kami ay pagpunta sa pumunta sa pamamagitan ng ang paghawak. Susubukan naming makakuha ng mga nakapasa sa 90. Pumunta namin mula sa pabalik sa harap. Isinasaalang-alang namin ang 0. AARAL: Sorry. Siguro ito ay bobo. Kung kami nagsisimula ka pa nakapasa sa isang string, kung bakit ay 90 ano kami ay nagsisimula pa ang pumasa sa? Dahil ang 90 ay isang integer. Jason HIRSCHHORN: Dahil atoi tumatagal ng isang string at lumiliko ito sa integer representasyon ng na string. Ngunit ang string na 90 ay hindi ang integer 90 o ang bilang 90. Ang string 90 ay isang hanay ng mga dalawang, o tatlong character, sa halip, ang 9 karakter, ang 0 karakter, at ang backslash 0 karakter. At kami ay sumusulat atoi dahil, para sa Halimbawa, kapag magdadala sa iyo ang command linya ng argumento, at na-save ito argv, na-save ito bilang isang string. Ngunit kung nais mong ituring ito bilang isang numero, kailangan mong i-convert ito sa isang aktwal na integer. Aling mga ginawa namin sa isa sa aming mga hanay ng problema. Aling mga ginawa namin sa isang numero sa aming mga hanay ng problema. Ang bawat tao'y na tumagal ng isang integer bilang isang argumento command line. Kaya na ang dahilan kung bakit ang aming atoi function na tumatagal ng isang string. Kaya muli, sa aming mga halimbawa dito, kami ay pagpunta sa gawin ang huling isa. Kami ay pagpunta sa ibawas ang karakter 0 mula dito, dahil ang mga character na 0 awas sa pamamagitan ng mga character na 0 ay nagbibigay sa iyo ang aktwal na bilang 0, ayon sa ang ASCII math na ginagawa namin. Dahil ang mga character ay kinakatawan bilang iba kaysa sa kanilang tunay - ang karakter ng, halimbawa, lowercase isang ay 97. Hindi ito - oops! Ito ay hindi ang kahit anong gusto mong asahan ito upang maging, 0, halimbawa. Kaya kailangan mong ibawas ang na character sa isang upang makakuha ng 0. Kaya kami ay pagpunta sa gawin iyon dito upang makuha ang aktwal na bilang. At pagkatapos ay pumunta kami sa multiply ito sa pamamagitan ng isang kapangyarihan ng 10 depende sa kung saan ito ay nasa string, at pagkatapos ay dadalhin na at idagdag ito sa aming mga may-hawak ng lugar variable upang maaari makabuo kami sa ang aming panghuling bagong integer. Ba na ang may katuturan sa lahat? Kaya kami ay hindi pagpunta sa code na ito sa ngayon, dahil kami pagkuha ng maikling sa oras. Humihingi ako ng paumanhin para sa tiyempo ng mga iyon. Ngunit ito ay kung ano ang, sana, gagawin mo magawa sa pagsusulit - sa napaka hindi bababa sa, kumuha ng mga ito pseudocode nakasulat out. At pagkatapos ay, kung kami ay upang isulat ang pseudocode, talaga, maaari naming gawin ito medyo mabilis. Ang bawat linya ng mga komento na sinulat namin kami dito isinasalin sa tungkol sa isang linya ng C code. Ang pagdeklara ng isang bagong variable, pagsulat ng loop, ang ilang mga pagbabawas, ang ilang mga pagpaparami, at ang ilan pagtatalaga. Nais naming marahil ring isaalang- isulat sa isang pabalik na linya. Maaari din namin nais na ilagay ilan sa mga pagsusuri sa dito. Oo. AARAL: Kaya maaari naming ituring s bilang ang aktwal na string? Dahil alam ko ito lamang ay isang address. Tulad ng, kung paano makuha mo ang haba ng ang string na dumaan sa? Jason HIRSCHHORN: Kaya kung paano ginawa ang haba ng isang string? Strlen. AARAL: strlen, oo. Ngunit mo maaaring ilagay s bilang ang argumento para sa iyon? Jason HIRSCHHORN: Kaya strlen tumatagal ng isang pansamantalang trabaho bituin. At sumusunod ito na pansamantalang trabaho star, at ito Pinapanatili ng pagbibilang hanggang sa ito ay nakakakuha sa isang backslash 0. strlen noon ay talagang isa sa iba pang mga programa namin ay pagpunta sa code. Iyon ay isa pang mahusay na isa sa code. Isa Iyon ay isang bit mas madali, dahil kung ka pagpunta sa isipin ang tungkol na conceptually - Lang sinabi ko ito nang malakas - sinusunod strlen isang pointer at pinapanatili ang pagpunta at pagbibilang at pagpapanatili ng track hanggang mong maabot ang isang backslash 0. AARAL: OK, nakuha ko. Jason HIRSCHHORN: Kaya pinakamaganda sa ka sana sa pagsusulit 0 bukas. Kung mayroon kang anumang mga katanungan, idedetalye ko nasa labas pagkatapos na ito. Huwag mag-atubili na mag-email sa akin. Abutin ang out sa iyong sariling tf kung ikaw ay wala sa aking seksyon, o makuha ang aking mag-email kung gusto mo. Kung nais mong taong kakatuwa out at magpadala lamang akin ng isang email, isang freakout email, idedetalye ko magpadala ka rin, tulad ng, isang SMILEY mukha, o, katulad, isang magbiro o isang bagay. Kaya huwag mag-atubili na gawin din iyon. Good luck muli, at idedetalye ko nakikita mo ang lahat ng mga susunod na linggo.