[Halisi kucheza] DAVID J. Malan: zote haki. [Kicheko] Karibu tena. Hii ni CS50. Na hii ya mwisho wa wiki tano. Na hadi sasa, tumekuwa pretty much imekuwa kuchukua nafasi ya kwamba kuna ipo hii mkusanyaji, Clang, kwamba wewe wameweza wamekuwa kutaja kwa njia ya hii chombo nyingine iitwayo kufanya kwamba kwa namna fulani magically waongofu chanzo yako kificho katika kitu kificho, zeros na ndio kwamba yako kompyuta CPU, kati usindikaji kitengo, kweli anaelewa. Lakini zinageuka kuna idadi hiyo ni kinachoendelea chini ya Hood katika kati ya pembejeo na mazao. Na ningependa kupendekeza kwamba sisi mwili kuwa nje kwa undani zaidi kidogo katika hatua hizi nne, kuwa na kitu kinachoitwa kabla ya usindikaji, kitu kuitwa kuandaa, ambayo tumeona, kitu kinachoitwa kukusanyika, na kitu kinachoitwa kuunganisha. Hivyo hadi sasa, katika baadhi ya yetu ya mipango, tumekuwa alikuwa mkali pamoja. Hivi karibuni tulikuwa na baadhi mkali amefafanua kwa constants. Hivyo zinageuka kuwa yale mambo ni prefixed na alama hash au alama ya pound ni kabla ya processor maelekezo. Hiyo ni njia tu ya dhana ya kusema ni mstari wa kanuni kwamba ni kweli waongofu katika kitu kingine kabla ya kompyuta hata kujaribu kubadili yako mpango katika zeros na ndio. Kwa mfano, kali ni pamoja na kiwango I / O h., Pretty much tu ina maana kwenda mbele, kunyakua yaliyomo ya mafaili stdio.h na kuweka haki yao huko. Hivyo hakuna zeros na ndio katika hatua bado. Ni kweli tu badala. Na kwamba kufanyika wakati kinachojulikana kabla ya usindikaji hatua, wakati wewe kweli kuendesha Clang au hasa Kufanya katika kesi nyingi. Hivyo wote hii imekuwa ikitokea kwanza moja kwa moja hivi sasa. Kisha huja hatua mkusanyiko. Lakini sisi tumekuwa oversimplified mkusanyiko. Kuandaa mpango wa kweli maana ya kuchukua kutoka kitu kama C, chanzo kanuni tumekuwa kuandika, chini kwa kitu kinachoitwa mkutano. Bunge lugha ni ngazi ya chini lugha hiyo, nashiriki, sisi si kuwa mengi tukio kuandika hii muhula. Lakini ni katika ngazi ya chini kabisa katika maana ya kwamba wewe literally kuanza kuandika kutoa na kujumlisha na kuzidisha na mzigo kutokana na kumbukumbu na kuokoa na kumbukumbu, msingi sana maelekezo ya kwamba kompyuta, chini ya Hood, kweli anaelewa. Mwisho, kukusanyika inachukua kwamba lugha kwa zeros na wale ambao tumekuwa kuelezea hivi sasa. Na kweli mwishowe, kuna kinachojulikana kuunganisha awamu, ambayo tutaweza kuona katika wakati huu tu, ambao unachanganya zeros yako na ndio na zeros na wale watu wengine kabla ya una umba. Hivyo kufikiria hili super rahisi mpango. Ni kutokana na Wiki 1. Ni tu alisema, Hello Dunia, kwenye screen. Sisi mbio hili kwa njia ya Clang. Au sisi mbio ni kwa njia ya kufanya ambayo mbio Clang. Na outputted wakati ambapo baadhi zeros na ndio. Lakini zinageuka kuna hatua ya kati. Kama mimi kwenda juu hapa - oops, hakuwa wanataka kumwona bado. Kama mimi kwenda juu hapa appliance yangu na mimi kufungua hello.c, hapa ni kwamba mpango huo. Na kile Mimi naenda kufanya katika terminal yangu dirisha hapa ni mimi nina kwenda kukimbia Clang badala ya kufanya, ambayo automates zote nne za wale hatua kwa ajili yetu. Na mimi naenda kufanya Clang-S na kisha hello.c na kisha kuingia. Na mimi kupata haraka blinking tena, ambayo ni nzuri. Na sasa katika dirisha kubwa kidogo, Mimi naenda kufungua gedit katika hapa. Na mimi nina kwenda kufungua faili kwamba, zamu nje, ni kuitwa hello.s hii lina lugha ya mkutano Mimi inajulikana mapema. Na hii ni nini wito mkutano lugha, haki ya chini ngazi maelekezo ya kwamba yako Intel CPU au chochote ni kwamba ndani ya anaelewa. Na MOV ni kwa hoja. simu ni kwa wito, chini sana ngazi ya kazi. ndogo ni kwa ajili ya Ondoa. Hivyo wakati una CPU hasa ndani ya ya kompyuta yako, nini inafanya tofauti, dhidi ya nyingine CPUs juu ya soko, ni maelekezo ambayo ni anaelewa na mara nyingi jinsi ufanisi ni ni, jinsi ya kufunga ni katika utekelezaji wa baadhi ya ya wale maelekezo. Sasa kwa zaidi juu ya hili, unaweza kuchukua ijayo Fall CS61 chuoni. Lakini hapa tuna, kwa mfano, wachache vitambulisho kwamba ili kuangalia ukoo. hello.c ni jina la mpango. . Asilia - kuna si mengi ya riba kuna tu sasa, kukumbuka kwamba maandishi sehemu, kama ya Jumatatu, ni wapi katika kumbukumbu ya mpango wako kwa kweli mwisho juu. Hivyo kwamba ni angalau bila kufafanua ukoo huko. Hapa, bila shaka, ni kutaja ya kazi yetu kuu. Scrolling chini, hizi kutaja mambo kinachoitwa madaftari, ndogo sana chunks ya kumbukumbu ndani ya CPU yako halisi. Na kama mimi kitabu chini hata zaidi, mimi kuona baadhi ya aina moja kwa moja kutaja ya ASCII. Na pale, kwa kweli, ni kamba kwamba, hello, comma, dunia. Hivyo muda mrefu hadithi fupi, hii imekuwa kinachotokea kwa ajili yenu, moja kwa moja, chini ya Hood yote ya wakati huu. Na kinachotokea kwa kweli ni mara moja umefanya kukimbia Clang, au kwa njia ya Kufanya, wewe ni kupata ya kwanza, kutoka chanzo code, kinachojulikana mkutano wa lugha. Kisha Clang ni kuwabadili kusanyiko hili Lugha chini zeros na ndio. Na hii ni slide kwamba sisi ilianza mjadala wetu katika Wiki 0 juu - na kisha Wiki 1 juu. Na kisha hatimaye, wale zeros na ndio ni pamoja na zeros na ndio kutoka maktaba wale tumekuwa kuchukua kwa nafasi kama darasa la I / O au Kamba Library au hata Maktaba CS50. Hivyo kwa rangi hii picha zaidi kuibua, tuna hello.c. Na, bila shaka, anatumia printf kazi ya kusema, hello dunia. hatua ya mkusanyiko inachukua ni chini ya kwamba faili sisi tu kuona hello.s, hata ingawa hiyo ni kawaida ilifutwa moja kwa moja kwa ajili yenu. Lakini hiyo ni kanuni ya kanisa katika hatua ya katikati. Na wakati sisi kukusanyika mkutano lugha, hivyo kusema, kwamba wakati wewe kupata zeros hizo na zile. Hivyo tumekuwa zoomed katika ufanisi leo juu ya nini tumekuwa kuchukua kwa nafasi, ina maana ya kwenda chanzo kanuni ya kupinga kanuni. Lakini mwishowe, sasa kwamba picha hiyo - hebu shove ni juu ya mkono wa kushoto upande. Na kutambua kwamba katika juu kuna Nilivyoeleza stdio.h. Hiyo ni faili kwamba tumekuwa pamoja katika karibu wote wa mipango tumekuwa imeandikwa. Na kwamba faili ambaye yaliyomo kupata nakala pasted, ufanisi atop code yako. Lakini zinageuka kuwa, kwenye kompyuta mfumo mahali fulani, kuna labda stdio.c faili kwamba mtu aliandika miaka iliyopita kwamba zana zote za kazi ambayo yalitangazwa katika stdio.h. Sasa katika hali halisi ni pengine si juu ya Mac au PC yako au hata katika CS50 appliance ni mbichi C kanuni. Mtu tayari ulioandaliwa ni pamoja na . O faili kwa ajili ya kitu au kanuni. faili, ambayo inahusu maktaba pamoja kwamba imekuwa kabla ya imewekwa na kabla ya ulioandaliwa kwa ajili yenu. Lakini tuseme kwamba kuna kweli ipo kwenye kompyuta yetu stdio.c sambamba na Clang. Kificho wako wa kuwa compiled na wamekusanyika. kanuni stdio.c 's ni kuwa ulioandaliwa na wamekusanyika, kwa hivyo hili sana mwisho hatua, hapa chini, inabidi kwa namna fulani kiungo, hivyo kusema, zeros yako na wale na yake zeros na ndio katika moja rahisi mpango ni kwamba hatimaye kuitwa tu Hello. Hivyo hiyo yote ya uchawi kwamba ni yakitokea hivi sasa. Na itaendelea kuchukua hizi michakato kwa nafasi, lakini kutambua kuna mengi ya maelezo Juicy kinachoendelea chini ya hapo. Na hii ni nini hufanya yako kompyuta na Intel ndani hasa tofauti. Kadhalika kumbuka kwamba, kama ungependa kujiunga na sisi kwa chakula cha mchana Ijumaa hii, kufanya kwenda kwa cs50.net/rsvp kawaida mahali, 1:15 Ijumaa hii. Na sasa matangazo machache. Hivyo tuna baadhi ya habari njema. Na tuna baadhi ya habari mbaya. Kuanza na baadhi ya habari nzuri hapa. [Kuugua] Wote haki. Naam, ni kitaalam likizo, hivyo siyo sana zawadi kutoka kwetu. Lakini basi habari mbaya ya shaka. [Kuugua] Mimi alitumia muda mwingi juu ya haya michoro. [Kicheko] Kutakuwa na kikao cha mapitio hii Jumatatu ijayo. Ni kwenda kuwa, saa 05:30. Sisi kuwakumbusha hayo maelezo yote kupitia barua pepe juu ya kozi tovuti katika michache tu ya muda siku. Itakuwa zingine na kufanywa kupatikana baada ya muda mfupi. Hivyo kama huwezi kufanya kwamba Jumatatu usiku yanayopangwa, msiwe na wasiwasi. Sehemu hii wiki ijayo mapenzi pia kuzingatia marekebisho kwa jaribio. Kama sehemu yako ni siku ya Jumatatu, ambayo ni kweli chuo kikuu likizo, sisi bado kukutana katika sehemu. Kama wewe tu hawezi kufanya kwamba sehemu kwa sababu wewe ni kwenda mbali, hiyo faini. Kuhudhuria Jumapili au Jumanne sehemu au tune-katika sehemu Jason, ambayo ni inapatikana online. Hivyo, zaidi ya habari mbaya. Hivyo kulingana na mtaala, tuna hotuba Ijumaa ijayo. Lakini habari njema - uwazi, Mimi alitumia muda mwingi sana juu ya hili. [Kicheko] Tutaweza kufuta ijayo mihadhara ya Ijumaa. Hivyo kwamba itakuwa zawadi kwa ajili yetu, hivyo unaweza kweli kuwa nzuri katika muhula kati ya wiki hii na wiki mbili hapa. Hivyo hakuna mihadhara wiki ijayo, tu vidogo Jaribio kidogo, ambayo unapaswa kuwa kupata inazidi msisimko. Basi hebu sasa kurejea mawazo yetu kwa kitu ambacho kwa kweli ni zaidi ya Visual na zaidi ya kusisimua na kuweka hatua kwa ajili ya nini kinaendelea kuwa kwenye upeo wa macho katika michache tu ya muda wa wiki. Baada ya jaribio la kwanza, tutaweza kugeuka lengo la tatizo letu seti mwingine domain maalum tatizo, ile ya forensics au usalama zaidi kwa ujumla. Kwa kweli, mila na tatizo hili kuweka ni kwa ajili yangu moja ya kufundisha wenzao au CAS kutembea katika chuo kuchukua picha ya baadhi ya zinazotambulika lakini si dhahiri watu, maeneo, au vitu, kisha kila mwaka mimi namna fulani kusimamia na ajali kufuta au kuharibu kadi digital vyombo vya habari kwamba ndani ya kamera yetu. Lakini hakuna mpango mkubwa. Siwezi kwenda mbele na kuziba kwamba katika kompyuta yangu. Siwezi kufanya sanamu ya kuchunguza mauaji ya hivyo, hivyo kusema, kwa kuiga zeros na ndio mbali ya kadi ya kwamba kumbukumbu, kama yake ya kadi ya SD au au kadi Compact flash chochote wewe ni ukoo na. Na kisha tunaweza mkono kwamba nje. Na hivyo changamoto mbele, kati ya mengine mambo kwa ajili yenu, itakuwa kuandika C kificho kwamba recovers rundo zima la JPEGs kwa ajili yangu na umebaini kuwa wale watu, mahali, au mambo. Na tutaweza pia kuzungumza, katika tatizo hili kuweka na katika siku zijazo, kuhusu graphics zaidi kwa ujumla. Tumekuwa kutumika kwao, bila shaka, kwa kuvunja nje. Lakini umefanya aina ya kuchukuliwa kwa nafasi kuna hizi ngazi ya juu fikra ya mistatili na ovals. Lakini chini ya Hood kuna saizi. Na wewe alikuwa na kuanza kufikiri juu ya hayo. Au wewe kwa ajili ya p-seti 4 na kufikiri kuhusu pengo kati ya matofali yako, jinsi haraka wewe ni mpira ni kusonga hela screen kwa kuvunja nje. Hivyo kuna wazo hili la dots juu ya screen yako kwamba ni kuja kucheza tayari. Sasa nini kuona, ingawa, ni nini kupata kwenye screen ya kompyuta. Kama ve milele watched baadhi nzuri au TV mbaya, ni tabia mbaya wao pretty much kutibu watazamaji kama technophobes ambao si kweli kujua mengi kuhusu kompyuta. Na hivyo ni rahisi sana kwa ajili ya polisi upelelezi kusema, unaweza safi kuwa hadi kwa ajili yangu? Au kuboresha, haki? Kuongeza ni kama neno buzz katika yoyote zaidi uhalifu kuhusiana show. Na ukweli ni kama kuchukua sana blurry picha ya mtuhumiwa kufanya kitu mbaya, huwezi tu kuongeza yake. Huwezi kuvuta kubwa. Huwezi kuona katika glint ya mtu jicho waliofanya kwamba hasa uhalifu, licha ya maambukizi ya hii kwenye TV. Na hivyo na kwamba hebu kuwahamasisha kwamba tatizo ujao kuweka na mtazamo saa baadhi inaonyesha na ambayo wapate kuwa ukoo. [Video avspelning] -OK. Sasa, hebu kupata nzuri kuangalia wewe. -Hold yake. Kukimbia kwamba nyuma. -Subiri dakika. Kwenda kulia. -Kuna. Kufungia kwamba. -Full screen. -OK. Kufungia kwamba. -Kaza juu ya kwamba, mapenzi ya? -Vector katika juu ya guy kwamba na gurudumu nyuma. -Zoom katika haki hapa kwenye doa hili. -Pamoja na vifaa vya kulia, imaged unaweza kuwa wazi kabisa na makali. -Ni nini hiyo? -Ni mpango kukuza. -Je, unaweza wazi kuwa hadi yoyote? -Mimi sijui. Hebu kuongeza yake. -Kuongeza kifungu-6. -I kuimarishwa undani na - -Nadhani kuna kutosha kuimarisha. Kutolewa kwa screen yangu. -Kuongeza kutafakari katika macho yake. -Hebu kukimbia hii kupitia video kukuza. -Edgar, unaweza kuongeza hii? -Hutegemea. -I've been kazi tafakari hii. -Mtu wa kutafakari. -Reflection. -Kuna tafakari ya uso wa mtu. -Kutafakari. -Kuna kutafakari. -Zoom katika juu ya kioo. -Unaweza kuona kutafakari. -Je, unaweza kuongeza picha kutoka hapa? -Je, unaweza kuimarisha haki yake hapa? -Je, unaweza kuongeza yake? -Je, unaweza kuongeza yake? -Je, tunaweza kuongeza hii? -Je, unaweza kuongeza yake? -Kushikilia pili, mimi itabidi kuongeza. -Zoom katika juu ya mlango. -X10. -Zoom. [Kicheko] Hoja-in -Subiri, kuacha. -Stop. -Pause yake. -Mzunguko digrii 75 kote wima tafadhali. [Kicheko] -Stop, na nyuma ya sehemu kuhusu mlango tena. -Got enhancer picha kwamba unaweza bitmap? -Labda tunaweza kutumia Sen Pradeep njia ya kuona katika madirisha. -Hii ni programu ya hali ya sanaa. Za thamani ya icon ni mbali. -Na macho haki ya algorithms. -Yeye kuchukuliwa algorithms kuja kwa ngazi ya pili na mimi unaweza kuzitumia ili kuongeza hii picha. -Lock juu na kupanua z-mhimili. -Kuongeza. -Kuongeza. -Kuongeza. -Freeze na kuongeza. [MWISHO video avspelning] DAVID J. Malan: Hivyo Tatizo Set 5 ni kile uongo mbele huko. Hivyo tutaweza karibuni kupata uelewa bora ya wakati na kwa nini unaweza na yetu haiwezi kuongeza katika njia hiyo. Lakini kwanza, hebu kurudi tahadhari yetu kwa baadhi ya vitalu jengo tutaweza haja ya kuwa na uwezo wa kuwaambia kwamba hadithi. Hivyo kukumbuka kuwa sisi akauchomoa hii picha kwenye Jumatatu na kidogo wiki iliyopita. Na hii inaelezea mpangilio wa mambo katika kumbukumbu ya kompyuta yako wakati mbio baadhi mpango. sehemu tech juu juu, kukumbuka, inahusu kwa zeros halisi na ndio ambayo kutunga programu yako. Kuna, chini ya kwamba, au baadhi ya initialized uninitialized data, ambayo kwa kawaida inahusu mambo kama constants au masharti au vigezo kimataifa kwamba kuwa imetangazwa mapema. Kuna lundo, lakini tutaweza kuja nyuma na kwamba katika kidogo. Na kisha kuna stack. Kiasi kama mkusanyiko wa sania katika mkahawa, hii ni wapi anapata kumbukumbu layered na layered wakati wowote kufanya nini katika mpango? Kile ni matumizi stack kwa? Yeah? Wito wa kazi. Wakati wowote wewe piga kazi, ni aliyopewa Sliver ya kumbukumbu kwa ajili ya wake mitaa vigezo au vigezo wake. Na pictorially, tunaona kwamba kwa kila kazi mfululizo kuitwa, wakati B C wito wito wito D, wao kupata layered kwenye stack. Na ndani ya kila moja ya vipande wale wa kumbukumbu kimsingi ni upeo wa kipekee kwa ajili ya kazi kwamba, ambayo, bila shaka, ni tatizo kama unataka mkono kutokana na kazi moja hadi nyingine kipande ya data kwamba unataka mutate au kubadilika. Hivyo kile alikuwa ufumbuzi wetu kuwezesha kazi kuwakilishwa na stack moja sura na mabadiliko ndani ya kumbukumbu wa mwingine sura ya stack? Jinsi ya kufanya wale majadiliano 12:58 mwingine? Hivyo kwa njia ya kuyatumia au anwani, ambayo, tena, tu kuelezea ambapo katika kumbukumbu, kwa njia ya maalum bite ya simu, hasa thamani inaweza kupatikana. Hivyo kukumbuka mara ya mwisho pia tuliendelea hadithi na inaonekana katika haki Buggy mpango. Na mpango huu ni Buggy kwa ajili ya wachache sababu, lakini inatia mashaka ni moja ya kwa sababu inashindwa kuangalia nini? Yeah, inashindwa kuangalia pembejeo. Pole? Kama ni zaidi ya wahusika 12. Sana smartly, wakati wito memcopy, ambayo, kama jina linavyosema, tu nakala ya kumbukumbu kutoka hoja yake ya pili katika hoja yake ya kwanza. Hoja ya tatu, sana smartly, ni checked kuhakikisha kwamba huna nakala zaidi, katika kesi hii, urefu ya bar, idadi ya wahusika, ndani ya marudio, ambayo ni hii safu C. Lakini tatizo ni kwamba kile ikiwa C yenyewe si kubwa ya kutosha kushughulikia kwamba? Wewe ni kwenda na nakala ya simu ya ka kwamba tumekuwa aliyopewa. Lakini je, kweli kuwa zaidi ka kuliko wewe kuwa na chumba kwa ajili ya? Naam, hii mpango upumbavu tu upofu kuendelea na kuchukua chochote ni aliyopewa, hujambo backslash 0 ni kubwa kama kamba ni mfupi kutosha, kama tano chars. Lakini kama ni kweli 12 wahusika au 1,200 wahusika, tuliona wakati wa mwisho kwamba wewe ni kwenda tu kabisa overwrite kumbukumbu kwamba siyo wewe. Na mbaya zaidi kesi, kama wewe overwrite kwamba nyekundu sehemu pale kwamba sisi kuitwa kurudi anwani - hii ni tu ambapo kompyuta moja kwa moja, kwa ajili yenu, nyuma ya pazia, tucks mbali thamani ya 32-bit kwamba kuwakumbusha kwa nini anwani ni lazima kurudi wakati foo, hii kazi nyingine, inafanywa utekelezaji. Ni chembe mkate wa kila aina ambayo kuirudisha. Kama wewe overwrite kwamba, uwezekano, kama wewe ni mtu mbaya, unaweza hawakuweza uwezekano wa kuchukua mtu kompyuta. Na wewe utakuwa hakika ajali hiyo katika kesi nyingi. Sasa tatizo hii ilikuwa tu exacerbated kama sisi kuanza kuzungumza juu ya kumbukumbu usimamizi kwa ujumla zaidi. Na malloc, kwa ajili ya mgao kumbukumbu, ni kazi kwamba tunaweza kutumia kutenga kumbukumbu wakati hatujui mapema tupate haja ya baadhi ya. Hivyo, kwa mfano, kama mimi kurejea kwa appliance hapa. Na mimi kufungua kutoka hello2.c mara ya mwisho, kukumbuka mpango huu hapa, ambayo inaonekana kitu kidogo kama hii, tatu tu mistari - hali ya jina lako, basi kamba jina, upande wa kushoto, sawa GetString. Na kisha sisi magazeti ya nje, jina la mtumiaji. Hivyo hii ilikuwa super rahisi mpango. Kuwa wazi, napenda kwenda mbele na kufanya hujambo-2. Mimi naenda kufanya dot kufyeka hujambo-2. Eleza jina yako - Daudi. Kuingia. Hujambo Daudi. Inaonekana kazi OK. Lakini ni nini kweli kinachoendelea chini ya Hood hapa? Kwanza hebu peel nyuma tabaka fulani. Kamba ni kisawe tu tumekuwa barabara kwa nini? Char nyota. Basi hebu kufanya ni kidogo zaidi arcane lakini zaidi ya utaalamu sahihi kwamba hii ni nyota Char, ambayo ina maana kwamba jina, ndiyo, ni kutofautiana. Lakini nini jina maduka ni anwani ya Char, ambayo anahisi ajabu kidogo kwa sababu mimi nina kupata nyuma kamba. Nina kupata nyuma nyingi chars si Char. Lakini bila shaka, haja tu ya kwanza anuani ya Char ya kukumbuka ambapo kamba nzima ni kwa nini? Jinsi gani unaweza kufikiri ambapo mwisho wa kamba ni kujua mwanzo? sifuri backslash. Hivyo, pamoja na dalili hizo mbili, unaweza kufikiri kabla ya mwanzo na mwisho wa kamba yoyote ni, hivyo muda mrefu kama wao ni vizuri hutengenezwa kwa null kwamba Terminator, kwamba sifuri backslash. Lakini hii ni wito GetString. Na zinageuka kuwa GetString muda wote huu imekuwa aina ya cheating kwa ajili yetu. Imekuwa ni kufanya hii kazi, kuwa na uhakika, kupata kamba kutoka mtumiaji. Lakini ambapo wa kumbukumbu kwamba wamekuwa kuja kutoka? Kama sisi kurudi nyuma kwa picha hapa na kuomba ufafanuzi kutoka tu wakati iliyopita, kwamba ni stack ambapo kumbukumbu huenda wakati kazi ni wito, kwa mantiki kwamba, wakati wewe piga GetString, na kisha mimi aina katika D-A-V-I-D Kuingia, ambapo ni D-A-V-I-D backslash sifuri kuhifadhiwa, ya msingi ya hadithi tumekuwa alituambia mbali? Inaonekana kuwa katika stack, haki? Wakati wewe piga kupata kamba ya kupata kidogo kipande cha kumbukumbu juu ya stack. Hivyo anasimama kwa kufikiri kwamba D-A-V-I-D sifuri backslash ni kuhifadhiwa huko katika stack. Lakini kusubiri dakika, GetString anarudi kamba kwamba, ili kuzungumza, ambayo ina maana ni tray kutoka mkahawa ni kuchukuliwa mbali stack. Na sisi alisema mara ya mwisho kwamba haraka kama kazi anarudi, na kwamba wewe kuchukua tray, hivyo kusema, mbali stack, nini unaweza kudhani kuhusu mabaki ya kwamba kumbukumbu? Mimi aina ya redrew yao kama alama swali kwa sababu wao kwa ufanisi kuwa haijulikani maadili. Wanaweza kutumika tena wakati baadhi kazi ya pili ni kuitwa. Kwa maneno mengine, kama sisi kutokea kuwa hifadhi - Mimi itabidi kuchora picha ya haraka hapa ya stack. Kama sisi kutokea kwa kuwa na kuchora chini sehemu ya kumbukumbu yangu, na tutaweza kusema kwamba hii ni sehemu ya kumbukumbu ulichukua na kuu na labda ARG c na ARG v na kitu kingine chochote katika mpango, wakati GetString inaitwa, labda GetString anapata chunk ya kumbukumbu hapa. Na kisha D-A-V-I-D kwa namna fulani mwisho juu katika kazi hii. Na mimi nina kwenda oversimplify. Lakini hebu kudhani kwamba wake-D A-V-I-D backslash sifuri. Hivyo ka hii nyingi zinatumika katika frame kwa GetString. Lakini kwa haraka kama anarudi GetString, sisi Alisema mara ya mwisho kwamba kumbukumbu hii juu ya hapa kila inakuwa - woops! - yote inakuwa ufanisi kufutika. Na tunaweza kufikiria hili sasa kama swali alama sababu ambaye anajua nini kinaendelea kuwa ya kumbukumbu hiyo. Hakika, mimi mara nyingi sana kuwaita kazi chochote zaidi GetString. Na haraka kama mimi wito nyingine kazi kuliko GetString, labda si katika mpango huu hasa sisi tu inaonekana saa lakini baadhi ya wengine, hakika baadhi ya wengine kazi inaweza kuishia kuwa kutolewa doa hii ijayo katika stack. Hivyo haiwezi kuwa maduka GetString D-A-V-I-D juu ya stack kwa sababu napenda mara moja kupoteza huduma hiyo. Lakini tunajua wao GetString tu anarudi nini? Ni si kurudi mimi wahusika sita. Je, ni kwa kweli hakuwa kurudi twaona mara ya mwisho? anwani ya kwanza. Hivyo kwa namna fulani, wakati wewe kuitwa GetString, ni kugawa chunk ya kumbukumbu kwa kamba kwamba aina ya watumiaji na kisha kurudi na anwani yake. Na zinageuka kuwa wakati unataka kazi kutenga kumbukumbu katika hii njia na kurudi kwa mtu ambaye kuitwa kwamba kazi, anwani ya kwamba chunk ya kumbukumbu, wewe kabisa hawawezi kuiweka katika stack katika chini, kwa sababu functionally ni tu kwenda si kuwa wako sana haraka, hivyo pengine unaweza nadhani ambapo sisi ni pengine kwenda kuwatupia badala yake, lundo kinachojulikana. Hivyo kati ya chini ya kumbukumbu yako mpangilio na juu ya kumbukumbu yako ya layout ni rundo zima la makundi. Moja ni stack, na haki ya hapo juu, ni chungu. Na lundo ni chunk tofauti ya kumbukumbu kwamba si kutumika kwa ajili ya kazi wakati wao ni kuitwa. Ni kutumika kwa ajili ya kumbukumbu ya muda mrefu, wakati unataka moja ya kazi kwa kunyakua baadhi ya kumbukumbu na kuwa na uwezo wa hutegemea ni bila ya kupoteza udhibiti juu yake. Sasa unaweza labda mara moja kuona kwamba hii si lazima kubuni kamilifu. Kama mpango wako zilizotengwa kumbukumbu kwenye stack, au kama wewe piga zaidi na zaidi kazi, au kama wewe kutenga kumbukumbu juu ya lundo na malloc mbali kama GetString ni kufanya, nini wazi inaonekana kuwa kuepukika tatizo? Haki. Kama ukweli kwamba haya mishale ni akizungumzia kwa kila mmoja hakuendani. Na kwa kweli, tunaweza haraka sana ajali mpango katika idadi yoyote ya njia. Kwa kweli, nadhani tuwe na kufanyika hii ajali mara moja. Au kama si hivyo, hebu kufanya hivyo makusudi sasa. Hebu kwenda mbele na kuandika super haraka programu inayoitwa dontdothis.c. Na sasa nitakwenda katika hapa na wala mkali pamoja stdio.h. Hebu kutangaza kazi foo inachukua hakuna hoja, ambayo ni ulionyehsa pamoja na utupu. Na kitu pekee foo ni kwenda kufanya ni wito foo, ambayo pengine si smartest wazo, lakini na iwe hivyo. Ent kuu utupu. Sasa kitu pekee kuu ni kwenda kufanya ni kuwaita foo pia. Na tu kwa mateke, mimi nina kwenda mbele hapa na kusema printf "Hello kutoka foo. " OK. Hivyo kama mimi si kufanya makosa yoyote, Kufanya dontdothis dot kufyeka. Na hebu kufanya hivyo katika dirisha kubwa - dot kufyeka, dontdothis. Kuja juu. Uh oh. Inavyoonekana, unaweza kufanya hivyo. Damn it. OK. Kusubiri. Kusimama kwa. Je, sisi - Hatukuwa kutumia kwa kufanya. [Anapumua] Najua lakini nadhani sisi tu kwamba imefutwa. Uh, yeah. Damn it. Kutatua Rob. Nini? Ni rahisi sana. Yeah, sisi akageuka optimization mbali. OK, kusimama bye. Sasa mimi kujisikia vizuri. OK. Wote haki. Basi hebu recompile hii - Kufanya wewe dontdothis. Unaweza kuwa na kubadili jina hili dothis.c katika muda tu. Kuna sisi kwenda. Asante. OK. Hivyo ukweli kwamba nilikuwa kuchapa kitu nje alikuwa kweli tu kupunguza kasi ya mchakato na ambayo sisi ingekuwa kufikiwa kwamba uhakika. OK. Phew! Hivyo ni nini hasa kinachoendelea? sababu kuna, kama tu kando, ni kufanya kitu chochote katika suala la pembejeo na pato huelekea kuwa polepole kwa sababu wewe kuwa na kuandika herufi kwa screen, Ina na kitabu. Hivyo muda mrefu hadithi fupi, alikuwa na mimi kwa kweli kilichotokea hivyo papara, tunataka kuwa kuona hii matokeo ya mwisho pia. Sasa kwa kuwa nilipata safari ya magazeti-ups, tunaona haki mbali. Hivyo ni kwa nini hili likitokea. Naam, maelezo rahisi, bila shaka, ni kwamba foo pengine lazima si kuwa wito yenyewe. Sasa kwa ujumla, hii ni recursion. Na sisi mawazo wiki kadhaa iliyopita kujirudia ni nzuri. Recursion ni njia hii ya kichawi ya kuonyesha mwenyewe super ufupi. Na ni kazi tu. Lakini kuna kipengele muhimu ya yote ya mipango ya kujirudia tumekuwa aliyesema kuhusu na inaonekana saa hivi sasa, ambayo ilikuwa kwamba walikuwa na nini? kesi ya msingi, ambayo ilikuwa ngumu baadhi coded kesi hiyo alisema katika baadhi ya hali wala kuwaita foo, ambayo ni wazi si kesi hapa. Hivyo kile ni kweli yanatokea katika suala la picha hii? Naam, wakati kuu wito foo, ni anapata kipande cha kumbukumbu. Wakati foo wito foo, anapata kipande cha kumbukumbu. Wakati foo wito foo, anapata kipande. Anapata kipande. Anapata kipande. Sababu foo ni kamwe kurudi. Sisi ni kamwe kufutwa mmoja wa wale muafaka kutoka stack. Hivyo sisi ni unavuma kupitia chungu, si kutaja ambaye anajua kile kingine, na sisi ni overstepping mipaka ya yetu ya kinachojulikana sehemu ya kumbukumbu. Kosa kwenda segmentation uongo. Hivyo suluhisho kuna wazi si kufanya hili. Lakini maana kubwa zaidi ni kwamba, ndiyo, kuna kabisa ni kikomo fulani, hata kama siyo vizuri defined, kama jinsi kazi nyingi unaweza kuwaita katika mpango, mara ngapi kazi wanaweza kupiga yenyewe. Hivyo hata kama tulivyofanya kuhubiri recursion kama jambo hili uwezekano wa kichawi michache ya wiki iliyopita kwa ajili ya sigma kazi, na wakati sisi kupata data miundo na CS50, utaona nyingine maombi kwa ajili ya hayo, siyo lazima kitu bora. Kwa sababu kama kazi ya wito yenyewe, wito yenyewe, hata kama kuna msingi kesi, kama huna hit kwamba kesi ya msingi kwa ajili ya 1000 au simu wito 10,000, na kwamba wakati unaweza kuwa na kukimbia nje ya chumba juu ya kinachojulikana yako stack na kibao baadhi ya makundi mengine ya kumbukumbu. Hivyo pia ni kubuni biashara-off kati ya ulimbwende na kati ya robustness ya fulani yako utekelezaji. Hivyo kuna mwingine upande wa chini au mwingine gotcha kwa nini tumekuwa wamekuwa wakifanya hivi sasa. Wakati mimi aitwaye GetString - napenda kwenda nyuma katika hujambo-2. Taarifa kwamba mimi nina wito GetString, ambayo ni ya kurudi anwani. Na sisi kudai leo kwamba anuani ni kutoka lundo. Na sasa mimi ni uchapishaji nje kamba katika anwani hiyo. Lakini tumekuwa kamwe kuitwa kinyume cha GetString. Tumekuwa kamwe alikuwa calll kazi kama ungetstring, ambapo mkono nyuma kwamba kumbukumbu. Lakini kusema ukweli sisi pengine ha. Kwa sababu kama sisi kuendelea kuuliza kompyuta kwa ajili ya kumbukumbu, kwa njia ya mtu kama GetString lakini kamwe kuwapa nyuma, hakika kwamba pia ni amefungwa na kusababisha matatizo ambapo sisi kukimbia nje ya kumbukumbu. Na kwa kweli, tunaweza kuangalia kwa ajili ya haya matatizo na zana mpya ambao matumizi ni fumbo kidogo na aina. Lakini napenda kwenda mbele na kuzisambaza it up juu ya screen katika muda tu. Mimi nina kwenda mbele na kukimbia Valgrind na parameter ambao kwanza amri line Hoja ni jina ya kwamba mpango hujambo-2. Na kwa bahati mbaya ni pato ni atrociously tata kwa sababu hakuna nzuri. Hivyo tunaona kwamba fujo zote. Daudi ni hali ya jina langu. Hivyo kwamba ni mpango kweli mbio. Na sasa sisi kupata hii pato. Hivyo Valgrind ni sawa katika roho kwa GDB. Siyo debugger per se. Lakini ni kusahihisha kumbukumbu. Ni mpango ambayo kukimbia yako mpango na kukuambia kama wewe aliuliza kompyuta kwa ajili ya kumbukumbu na kamwe kukabidhiwa nyuma, na hivyo kwa maana ya kuwa una uvujaji wa kumbukumbu. Na kumbukumbu uvujaji huwa na kuwa mbaya. Na wewe ni watumiaji wa kompyuta na pengine waliona hii, kama una Mac au PC. Je, umewahi kutumia kompyuta yako kwa wakati na si rebooted katika baadhi ya siku, au ve tu got mengi ya kuendesha programu, na jambo damn kupungua kwa mguu kusaga, au angalau ni super annoying kutumia, kwa sababu kila kitu tu got super polepole. Sasa kwamba unaweza kuwa na idadi yoyote ya sababu. Ni inaweza kuwa kitanzi usio, mdudu katika kanuni ya mtu, au, zaidi tu, ni inaweza kuwa na maana kwamba wewe ni kutumia zaidi kumbukumbu, au kujaribu, kuliko yako kompyuta kweli ana. Na labda kuna mdudu katika mpango wa baadhi ya kwamba kuendelea kuuliza kwa kumbukumbu. Browsers kwa miaka walikuwa sifa mbaya kwa hii, kuomba kwa ajili ya kumbukumbu zaidi na zaidi lakini kamwe kuwapatia nyuma. Hakika, kama wewe tu na finite kiasi cha kumbukumbu, huwezi kuuliza kubwa mara nyingi kwa baadhi ya kumbukumbu hiyo. Na hivyo nini unaweza kuona hapa, ingawa tena pato Valgrind ni usiokuwa tata kwa mtazamo saa kwanza, hii ni sehemu ya kuvutia. Chungu - katika matumizi ya exit. Hivyo hapa ni kiasi gani kumbukumbu ilikuwa katika matumizi ya chungu katika wakati mpango wangu exited - inaonekana sita ka katika kuzuia moja. Hivyo nina kwenda kwa wimbi mikono yangu saa nini kuzuia ni. Fikiria ni tu chunk, zaidi kiufundi kwa ajili ya neno chunk. Lakini sita ka - kile ni ka sita ambayo walikuwa bado katika matumizi? Hasa. D-A-V-I-D backslash sifuri, tano barua jina plus Terminator null. Hivyo mpango huu Valgrind niliona kwamba mimi aliuliza kwa ka sita, inaonekana, na njia ya GetString, lakini kamwe akawapa nyuma. Na kwa kweli, hii inaweza kuwa hivyo dhahiri kama mpango wangu si tatu mistari, lakini ni 300 mistari. Ili tuweze kweli kutoa amri nyingine line hoja ya Valgrind kwa kufanya hivyo zaidi verbose. Ni kidogo annoying kukumbuka. Lakini kama mimi kufanya - hebu angalia. Leak - Ilikuwa ni kuvuja - hata sikumbuki ni nini mbali mkono. - Leak-hundi sawa kamili. Yep, asante. - Leak-hundi sawa kamili. Kuingia. Mpango huo ni mbio. Aina katika Daudi tena. Sasa naona kidogo zaidi kwa undani. Lakini chini ya muhtasari wa chungu, ambayo ni sawa na nne - ah, hii ni aina ya nzuri. Sasa Valgrind ni kweli kuangalia vigumu kidogo katika kanuni yangu. Na ni kusema kwamba, inaonekana, malloc katika line - sisi zoom nje. Katika line - hatuoni nini mstari ni. Lakini malloc ni culprit kwanza. Kuna blog katika malloc. Wote haki? OK, hakuna. Haki? Mimi kuitwa GetString. GetString inaonekana wito malloc. Hivyo kile mstari wa kanuni ni inaonekana katika kosa kwa kuwa na zilizotengwa kumbukumbu hii? Hebu kudhani kuwa mtu aliandika malloc imekuwa karibu muda wa kutosha kwamba ni si kosa lao. Hivyo pengine mgodi. GetString katika cs50.c - hivyo kwamba ni faili mahali fulani kwenye kompyuta - katika mstari 286 inaonekana kuwa mhalifu. Sasa hebu kudhani kwamba cs50 imekuwa karibu kwa kiasi heshima ya muda, hivyo sisi pia ni dosari. Na hivyo pengine si katika GetString kwamba mdudu uongo, bali katika hujambo-2.c line 18. Basi hebu tuangalie nini kuwa mstari wa 18 ilikuwa. Oh. Namna fulani line hii si lazima Buggy, per se, lakini ni sababu nyuma kwamba uvujaji wa kumbukumbu. Hivyo super tu, gani shirikishi kuwa suluhisho hapa? Kama sisi ni kuuliza kwa ajili ya kumbukumbu, walikuwa kamwe kutoa ni nyuma, na kwamba inaonekana kuwa tatizo kwa sababu baada ya muda kompyuta yangu ili kukimbia nje ya kumbukumbu, ili kupunguza chini, mambo mabaya kinaweza kutokea, vizuri, nini rahisi ufumbuzi angavu? Kutoa tu nyuma. Jinsi gani unaweza bure juu ya kwamba kumbukumbu? Naam, nashiriki ni rahisi sana tu kusema jina bure. Na tumekuwa kamwe kufanyika hii kabla. Lakini unaweza kimsingi kufikiri ya bure kama kinyume cha malloc. bure ni kinyume cha kugawa kumbukumbu. Hivyo sasa napenda recompile hii. Kufanya hujambo-2. Basi mimi kukimbia tena. hujambo-2 Daudi. Hivyo inaonekana kufanya kazi katika hasa kwa njia hiyo. Lakini kama mimi kurejea Valgrind na kuendesha upya kwamba amri hiyo hiyo kwa wapya yangu ulioandaliwa mpango, kuandika kwa jina langu kama kabla - nzuri. Lundo muhtasari - katika matumizi ya exit - sifuri ka katika vitalu sifuri. Na hii ni super nzuri, kila vitalu lundo walikuwa huru. Hakuna uvujaji ni iwezekanavyo. Hivyo kuja juu, si kwa Tatizo Set 4, lakini pamoja na Tatizo Set 5, forensics na kuendelea, hii pia itakuwa kipimo cha usahihi wa yako mpango, kama au una au hawana uvujaji kumbukumbu. Lakini nashiriki, si tu unaweza kufikiri kupitia kwao intuitively, ambayo ni, arguably, rahisi kwa ajili ya programu ndogo lakini vigumu kwa ajili ya programu kubwa, Valgrind, kwa ajili ya programu hizo kubwa, wanaweza kukusaidia kutambua tatizo fulani. Lakini kuna tatizo moja nyingine ambayo yanaweza kina. Napenda kufungua faili hii hapa, ambayo ni, tena, mfano kiasi fulani rahisi. Lakini hebu kuzingatia nini mpango huu gani. Hii inaitwa memory.c. Tutaweza post hii leo baadaye katika zip ya chanzo kanuni ya leo. Na taarifa kwamba nina kazi kuitwa f kwamba inachukua hoja hakuna na anarudi chochote. Katika mstari wa 20, mimi nina inaonekana kutangaza pointer int na kuiita x. Mimi ni kumshirikisha kurudi thamani ya malloc. Na tu kuwa wazi, jinsi wengi ka am Mimi labda kupata nyuma kutoka malloc katika hali hii? Pengine 40. Wapi kupata kwamba kutoka? Naam, kama unakumbuka kwamba int mara nyingi ni 4 ka, angalau ni katika appliance, 10 mara 4 ni wazi kuwa ni 40. Hivyo malloc ni kurudi anwani ya chunk ya kumbukumbu na hifadhi ya kwamba kushughulikia hatimaye katika x. Hivyo kuwa wazi, nini basi kinachotokea? Vizuri, basi mimi kubadili nyuma na picha yetu hapa. Basi mimi si tu kuteka chini ya yangu kumbukumbu ya kompyuta, napenda kwenda mbele na kuteka Mstatili nzima kwamba inawakilisha yote ya RAM yangu. Tutaweza kusema kwamba stack ni juu ya chini. Na kuna sehemu ya asilia katika data uninitialized. Lakini nina kwenda tu abstract wale mambo mengine mbali kama dot, dot dot. Mimi tu kwenda kwa kutaja hii kama chungu kwa juu. Na kisha chini ya picha hii, kuwakilisha kuu, mimi naenda kuwapa kumbukumbu vipande juu ya stack. Kwa f, mimi naenda kuwapa kipande ya kumbukumbu juu ya stack. Sasa, mimi got kushauriana yangu chanzo kanuni tena. Je, ni vigezo mitaa kwa kuu? Inavyoonekana kitu, hivyo kipande kwamba ni ufanisi tupu au hata kama kubwa kama nimekuwa inayotolewa yake. Lakini katika f, nina kutofautiana za mitaa, ambayo inaitwa x. Hivyo nina kwenda mbele na kutoa f chunk ya kumbukumbu, wito ni x. Na sasa malloc ya mara 10 4, Hivyo malloc 40, ambapo kwamba kumbukumbu kutoka? Tumekuwa si kuchora picha kama hii kabla. Lakini hebu tuseme kwamba ni ufanisi kuja kutoka hapa, hivyo moja, mbili, tatu, nne, tano. Na sasa nahitaji 40 ya haya. Hivyo mimi itabidi kufanya dot, dot, dot zinaonyesha kwamba kuna hata zaidi ya kumbukumbu kurudi kutoka lundo. Sasa nini anuani? Hebu kuchagua holela wetu kushughulikia kama siku zote - Ox123, ingawa pengine ni kwenda kuwa ni kitu tofauti kabisa. Hiyo ni anuani ya Byte ya kwanza katika kumbukumbu kwamba mimi nina kuuliza malloc kwa. Hivyo katika line short, mara 20 executes, kile ni halisi kuhifadhiwa ndani ya x hapa? Ox123. Ox123. Na ng'ombe ni uninteresting. Ni tu ina maana hapa ni hexadesimoli idadi. Lakini nini muhimu ni kwamba kile nimekuwa kuhifadhi katika x, ambayo ni kutofautiana mitaa. Lakini sina data aina, tena, ni anwani ya int. Naam, mimi nina kwenda kuhifadhi Ox123. Lakini tena, kama kwamba ni kidogo sana ngumu usiokuwa, kama mimi kitabu nyuma, tunaweza abstract hii mbali kabisa sababu na kusema tu kwamba ni x pointer kwamba chunk ya kumbukumbu. OK. Sasa swali katika mkono ni yafuatayo - mstari 21, ni zamu nje, ni Buggy. Kwa nini? Pole? Haina - kusema kwamba kwa mara nyingine. Naam, haina bure. Hivyo hiyo ni ya pili lakini. Hivyo kuna mtu mwingine lakini hasa katika mstari wa 21. Hasa. Line hii rahisi ya kanuni ni tu buffer kufurika, overrun buffer. buffer tu ina maana chunk ya kumbukumbu. Lakini kwamba chunk ya kumbukumbu ni ya kawaida 10, 10 integers, ambayo ina maana kama sisi index ndani yake kwa kutumia sukari kisintaksia nukuu ya safu, mraba mabano, unaweza kupata x mabano mabano 0 x 1 x, bracket dot, dot, dot. x 9 mabano ni moja kubwa. Hivyo kama mimi kufanya x bracket 10, ambapo Mimi nina kweli kwenda katika kumbukumbu? Naam, kama nina 10 int - hebu kweli kuteka kila ya haya hapa. Ili kwamba ilikuwa mitano ya kwanza. Hapa ni nyingine tano ints. Hivyo x mabano 0 ni hapa. x mabano ni 1 hapa. x 9 mabano ni hapa. x bracket 10 ni hapa, ambayo ina maana Mimi ninawaambia, katika mstari wa 21, kompyuta na kuweka simu wapi? idadi 0 wapi? Naam, ni 0, ndiyo. Lakini tu ukweli kwamba wake 0 ni aina ya bahati mbaya. Ni inaweza kuwa idadi 50, kwa ajili ya wote sisi huduma. Lakini sisi ni kujaribu kuiweka katika mabano x 10, ambayo ni ambapo hii alama ya swali ni inayotolewa, ambayo si jambo zuri. Mpango huu ili vizuri sana ajali kama matokeo. Sasa, hebu kwenda mbele na kuona kama hii ni kweli, nini kinatokea. Kufanya kumbukumbu, tangu faili inaitwa memory.c. Hebu kwenda mbele na kukimbia kumbukumbu mpango. Hivyo tulipata bahati, kweli, inaonekana. Tulipata bahati. Lakini hebu angalia kama sisi sasa kukimbia Valgrind. Kwa mtazamo wa kwanza, mpango wangu ili kuonekana kuwa sahihi kabisa. Lakini basi mimi kukimbia Valgrind na - Leak-hundi sawa na kamili juu ya kumbukumbu. Na sasa wakati mimi kukimbia hii - kuvutia. Batili kuandika ukubwa wa 4 katika mstari wa 21 memory.c. Mstari wa 21 memory.c ni ambayo moja? Oh, kuvutia. Lakini kusubiri. Ukubwa 4, nini ni kwamba mnayosema? Mimi tu hakuwa moja kuandika, lakini ni ya kawaida 4. Kwa nini ni 4? Ni kwa sababu ni int, ambayo ni, tena, nne ka. Hivyo Valgrind kupatikana mdudu kuwa mimi, glancing katika kanuni yangu, hakufanya hivyo. Na labda TF yako gani au bila. Lakini kile Valgrind kwa uhakika kupatikana kwamba tumekuwa alifanya kosa huko, hata ingawa tulipata bahati, na kompyuta aliamua, eh, mimi si kwenda kwa ajali kwa sababu tu wewe kuguswa moja Byte, moja yenye thamani ya int ya kumbukumbu kwamba hakuwa kweli mwenyewe. Naam, kile kingine ni Buggy hapa. Anwani - hii ni mambo ya kuangalia anuani katika hexadesimoli. Hiyo ina maana tu mahali fulani katika lundo ni sifuri ka baada ya kuzuia wa kawaida 40 ni zilizotengwa. Hebu zoom nje hapa na kuona kama hii ni kidogo zaidi kusaidia. Kuvutia. Ka 40 ni dhahiri waliopotea katika hasara rekodi ya 1 ya 1. Tena, zaidi kuliko maneno ni muhimu hapa. Lakini kulingana na mistari yalionyesha, ambapo lazima mimi pengine kuzingatia yangu tahadhari kwa ajili ya mdudu mwingine? Inaonekana kama mstari 20 ya memory.c. Hivyo kama sisi kwenda nyuma ya mstari wa 20, kwamba ni moja kwamba kutambuliwa mapema. Na si lazima Buggy. Lakini sisi hii kuachwa madhara yake. Hivyo ni jinsi gani mimi kusahihisha angalau moja ya makosa hayo? Ningefanya nini baada ya mstari 21? Mimi naweza kufanya bure ya x, hivyo ni kutoa nyuma kwamba kumbukumbu. Na jinsi gani mimi kurekebisha hii mdudu? Mimi lazima dhahiri kwenda hakuna mbali zaidi kuliko 0. Hivyo basi mimi kujaribu na kuendesha upya hii. Samahani, dhahiri kwenda hakuna mbali zaidi kuliko 9. Kufanya kumbukumbu. Hebu rerun Valgrind katika dirisha kubwa. Na sasa kuangalia. Nice. Vitalu wote lundo walikuwa huru. Hakuna uvujaji ni iwezekanavyo. Na hadi hapo juu hapa, kuna hakuna kutaja yoyote zaidi ya haki batili. Tu kupata tamaa, na hebu kuona kama mwingine maandamano haina kwenda kama lengo - Sikuweza kupata bahati wakati iliyopita. Na ukweli kwamba hii ni 0 labda ni usiokuwa na kupotosha. Hebu tu kufanya 50, holela kiasi fulani simu, kufanya kumbukumbu dot kufyeka kumbukumbu - bado kupata bahati. Kitu ni crashing. Tuseme mimi tu kufanya kitu kweli wajinga, na mimi kufanya 100. Hebu remake kumbukumbu, dot kufyeka kumbukumbu - got bahati tena. Vipi kuhusu 1000? ints zaidi, takribani, ambapo mimi lazima? Kufanya kumbukumbu - damn it. [Kicheko] OK. Hebu si fujo karibu tena. Rerun kumbukumbu. Kuna sisi kwenda. Wote haki. Hivyo inaonekana wewe index ints 100,000 zaidi ambapo unapaswa kuwa katika kumbukumbu, mambo mabaya kutokea. Hivyo hii ni wazi si ngumu, kwa haraka utawala. Mimi ilikuwa aina ya kutumia kesi na makosa ya kufika huko. Lakini hii ni kwa sababu, kwa muda mrefu hadithi fupi, kumbukumbu ya kompyuta yako pia ni kugawanywa katika mambo haya kuitwa makundi. Na wakati mwingine, kompyuta kweli amewapa ninyi zaidi kidogo ya kumbukumbu kuliko wewe kuuliza. Lakini kwa ajili ya ufanisi, ni rahisi tu kupata kumbukumbu zaidi lakini tu kuwaambia kwamba wewe ni kupata sehemu yake. Na kama wewe kupata bahati wakati mwingine, kwa hiyo, unaweza kuwa na uwezo wa kugusa kumbukumbu kwamba siyo wewe. Wewe huna kuhakikisha kwamba thamani gani kuweka pale kukaa pale, kwa sababu kompyuta bado anadhani si yako, lakini siyo lazima kwenda kuikumba sehemu nyingine ya kumbukumbu katika kompyuta na kushawishi kosa kama hii moja hapa. Wote haki. Maswali yoyote basi juu ya kumbukumbu? Wote haki. Hebu tuangalie hapa, basi, katika kitu tumekuwa kuchukua kwa nafasi kwa muda kabisa, ambayo ni katika faili hii inaitwa cs50.h. Hivyo hii ni faili. Hizi ni baadhi tu rundo zima ya maoni juu juu. Na unaweza kuwa inaonekana saa hii kama wewe poked karibu juu ya appliance. Lakini zinageuka kuwa wakati wote, wakati sisi kutumika kwa kutumia kamba kama kisawe, njia ambayo sisi alitangaza kisawe kwamba alikuwa na hili Keyword typedef, kwa ajili ya ufafanuzi aina. Na sisi ni kimsingi akisema, kufanya kamba kisawe kwa nyota Char. Kwamba njia ambayo stack kuundwa magurudumu haya mafunzo inajulikana kama kamba. Sasa hapa ni mfano tu kwa getchar. Sisi kuwa na kuonekana hivyo kabla, lakini hiyo ni kweli nini anafanya. getchar inachukua hakuna hoja, anarudi Char. getdouble inachukua hoja hakuna, anarudi mbili. getfloat inachukua hakuna hoja anarudi, kuelea, na kadhalika. GetInt ni katika hapa. getlonglong ni katika hapa. Na GetString ni katika hapa. Na hiyo ni yake. Line hii ya zambarau ni mwingine Preprocessor maelekezo kwa sababu ya hashtag mwanzoni yake. Wote haki. Hivyo sasa napenda kwenda katika cs50.c. Na sisi si kuzungumza kwa muda mrefu sana juu ya hili. Lakini kukupa mtazamo wa nini kinachoendelea yote hii muda, niende - hebu kufanya getchar. Hivyo getchar ni zaidi ya maoni. Lakini inaonekana kama hii. Hivyo hii ni kazi halisi getchar ambazo tumekuwa kuchukua kwa nafasi ipo. Na hata kama sisi si kutumia hii moja kwamba mara nyingi, kama milele, ni angalau rahisi kiasi. Hivyo ni thamani ya kuchukua haraka kuangalia hapa. Hivyo getchar ina kitanzi usio, makusudi hivyo inaonekana. Ni kisha wito - na hii ni aina ya nzuri utumiaji wa kanuni ya sisi wenyewe aliandika. Ni wito GetString. Kwa sababu ni nini maana ya kupata Char? Naam, unaweza pia kujaribu kupata nzima mstari wa maandishi kutoka kwa mtumiaji na basi tu kuangalia moja ya wale wahusika. Katika mstari wa 60, hapa kidogo kidogo ya hundi sanity. Kama GetString akarudi null, basi si kuendelea. Kitu potoka. Sasa hii ni kiasi fulani annoying lakini kawaida katika C. Char max pengine inawakilisha nini tu msingi juu ya jina lake? Ni mara kwa mara. Ni kama thamani numeric ya kubwa Char unaweza kuwakilisha na bite moja, ambayo pengine ni ya simu 255, ambayo ni idadi kubwa ya wewe kuwakilisha bits nane, kuanzia sifuri. Hivyo nimekuwa kutumia hii, katika kazi hii, wakati kuandika kanuni hii, kwa sababu tu kama kitu fulani kitaenda vibaya katika getchar lakini madhumuni yake katika maisha ni kurudi Char, unahitaji kwa namna fulani kuwa na uwezo kuashiria kwa mtumiaji huyo kitu potoka. Hatuwezi kurudi null. Ni zinageuka kuwa ni pointer null. Na tena, getchar ina kurudi Char. Hivyo mkataba, kama kitu fulani kitaenda vibaya, ni wewe, programu, au katika kesi hiyo, mimi na maktaba, nilikuwa kuamua tu kiholela, kama kitu fulani kitaenda vibaya, mimi naenda kurudi idadi 255, ambayo ni kweli ina maana hatuwezi, mtumiaji anaweza si aina tabia ya kuwakilishwa na simu 255 kwa sababu tulikuwa na kuiba ni kama kinachojulikana sentinel thamani kwa kuwakilisha tatizo. Sasa zinageuka kuwa tabia 255 si kitu unaweza aina ya keyboard yako, hivyo ni hakuna mpango mkubwa. mtumiaji hana taarifa kwamba Nimekuwa kuibiwa tabia hii. Lakini kama umewahi kuona katika kurasa mtu juu ya mfumo wa kompyuta baadhi ya kumbukumbu ya kila kofia kama mara kwa mara hii kwamba anasema, katika kesi ya hitilafu hii nguvu ya mara kwa mara kurudishwa, hiyo ni baadhi ya binadamu wote walifanya miaka iliyopita ilikuwa kiholela aliamua kurudi thamani hii maalum na simu yake ya mara kwa mara katika kesi kitu fulani kitaenda vibaya. Sasa uchawi hutokea chini hapa. Kwanza, mimi nina kutangaza katika mstari 67 mbili wahusika, C1 na C2. Na kisha katika mstari 68, kuna kweli mstari wa kanuni kwamba ni kukumbusha ya rafiki yetu printf, kutokana na kwamba ni gani kuwa asilimia Cs katika quotes. Lakini taarifa ya nini kinatokea hapa. sscanf maana kamba Scan - maana Scan mpangilio kamba, ergo sscanf. Hiyo ina maana gani? Ina maana wewe kupita kwa sscanf kamba. Na mstari ni chochote aina user in Kupita kwa sscanf string format kama hii kwamba anasema scanf ni nini wewe matumaini ya mtumiaji typed in Wewe kisha kupita-katika anwani ya mbili chunks ya kumbukumbu, katika kesi hii, kwa sababu mimi na placeholders mbili. Hivyo nina kwenda kuwapa anuani ya C1 na anuani ya C2. Na kukumbuka kwamba kutoa kazi anuani ya variable fulani, nini Kidokezo? Nini unaweza kufanya kazi kwamba kama matokeo ya kutoa ni anwani ya kutofautiana, kinyume na kutofautiana yenyewe? Ni unaweza mabadiliko hayo, haki? Kama alikuwa mtu ramani ya kimwili anwani, wanaweza kwenda huko na kufanya wanataka chochote katika anwani hiyo. Same wazo hapa. Kama sisi kupita kwa sscanf, anuani ya mbili chunks ya kumbukumbu, hata hayo vidogo kidogo chunks ya kumbukumbu, C1 na C2, lakini sisi tunasema ni anuani yao, sscanf unaweza mabadiliko hayo. Hivyo kusudi sscanf katika maisha, kama sisi kusoma ukurasa mtu, ni kusoma kile mtumiaji typed katika, matumaini kwa mtumiaji kuwa typed katika tabia na labda mwingine tabia, na chochote mtumiaji typed, tabia ya kwanza inakwenda hapa, tabia ya pili huenda hapa. Sasa, kama kando, hii, na wewe ungekuwa tu kujua hii kutoka nyaraka, ukweli kwamba mimi kuweka nafasi tupu kuna tu ina maana kwamba mimi sijali kama mtumiaji hits bar nafasi chache mara kabla ya yeye au yeye inachukua tabia, nina kwenda kwa kupuuza nafasi yoyote nyeupe. Hivyo kwamba, najua kutoka nyaraka. ukweli kwamba kuna pili% c ikifuatiwa na nafasi nyeupe ni kweli makusudi. Nataka kuwa na uwezo wa kuchunguza kama mtumiaji Star up au hakuwa na kushirikiana. Hivyo nina matumaini kwamba mtumiaji tu typed katika tabia moja, kwa hiyo nina matumaini kwamba sscanf ni tu kwenda na kurudi thamani 1 sababu, tena, ikiwa mimi kusoma nyaraka, kusudi sscanf katika maisha ni kurudi kwa idadi ya vigezo kwamba walikuwa wamejaa na pembejeo mtumiaji. Mimi kupita katika vigezo mbili anwani, C1 na C2. Nina matumaini, ingawa, kwamba moja tu ya wao anapata kuuawa kwa sababu kama sscanf anarudi 2, nini labda Kidokezo mantiki? Kwamba mtumiaji hakuwa tu nipe moja tabia kama mimi aliiambia yake. Wao pengine typed katika angalau mbili wahusika. Hivyo kama mimi badala yake hakuwa na pili % C, mimi tu alikuwa moja, ambayo kusema ukweli itakuwa zaidi angavu mbinu, nadhani mtazamo wa kwanza, wewe si kwenda kuwa na uwezo wa kuchunguza kama mtumiaji imekuwa kutoa zaidi pembejeo kuliko wewe kweli alitaka. Hivyo hii ni fomu thabiti ya kuangalia makosa. Lakini taarifa nini mimi hapa. Mara baada ya mimi nina uhakika kwamba mtumiaji alinipa moja tabia, mimi huru line, kufanya kinyume cha GetString, ambayo kwa upande anatumia malloc, na kisha mimi kurudi C1, tabia ya kuwa mimi matumaini mtumiaji zinazotolewa na tu zinazotolewa. Hivyo haraka glimpsed tu, lakini maswali yoyote juu ya getchar? Tutaweza kurudi kwa baadhi ya watu wengine. Naam, napenda kwenda mbele na kufanya hii - tuseme sasa, tu kuwahamasisha yetu majadiliano katika wiki ya pamoja muda, hii ni faili inayoitwa structs.h. Na tena, hii ni ladha ya kitu ambacho uongo mbele. Lakini kumbuka kwamba mengi hii ni ya maoni. Hivyo basi mimi kuonyesha tu kuvutia sehemu kwa sasa. typedef - kuna kuwa Keyword sawa tena. typedef sisi kutumia kamba ya kutangaza kama aina maalum data. Unaweza kutumia typedef kujenga bidhaa mpya data aina ambayo haikuwepo wakati C ilizuliwa. Kwa mfano, int kuja na C. Char kuja na C. mara mbili kuja na C. Lakini hakuna dhana ya mwanafunzi. Na bado itakuwa pretty muhimu kuwa uwezo wa kuandika mpango kwamba maduka katika kutofautiana, ID ya mwanafunzi ya simu, jina lao, na nyumba zao. Kwa maneno mengine, tatu vipande ya data, kama int na kamba na kamba nyingine. Na typedef, nini pretty nguvu kuhusu hili na sturct Keyword kwa muundo, wewe, programu ya mwaka 2013, kweli anaweza kufafanua yako mwenyewe data aina ambayo haikuwepo miaka iliyopita lakini kwamba kemikali madhumuni yako. Na hivyo hapa, katika mistari 13 kupitia 19, sisi ni kutangaza takwimu mpya aina, kama int, lakini wito ni mwanafunzi. Na ndani ya kutofautiana hii ni kwenda kuwa na mambo matatu - int, kamba, na kamba. Hivyo unaweza kufikiria nini kweli kilichotokea hapa, ingawa hii ni kidogo ya kurahisisha kwa leo, mwanafunzi kimsingi ni kwenda kuangalia kama hii. Inaenda kuwa chunk ya kumbukumbu na kitambulisho, jina shamba, na shamba nyumba. Na tutaweza kuwa na uwezo wa kutumia chunks wale wa kumbukumbu na kupata yao kama ifuatavyo. Kama mimi kwenda katika struct0.c, hapa ni muda mrefu kiasi, lakini kufuatia muundo, ya kificho kwamba anatumia hila hii mpya. Hivyo kwanza, basi mimi kuteka mawazo yako na sehemu ya kuvutia juu juu. Mkali amefafanua wanafunzi 3, anatangaza mara kwa mara iitwayo wanafunzi na chukueni yake kiholela namba 3, tu hivyo nina wanafunzi watatu kwa kutumia mpango huu kwa sasa. Hiyo inakuja Kuu. Na notisi, jinsi gani mimi kutangaza safu ya wanafunzi? Naam, mimi tu kutumia syntax sawa. mwanafunzi wa neno ni wazi kuwa ni mpya. Lakini mwanafunzi, darasa, bracket wanafunzi. Hivyo kwa bahati mbaya kuna mengi ya utumiaji wa suala hapa. Hii ni idadi tu. Hivyo hii ni kama kusema tatu. Hatari ni yale tu nataka kuwaita kutofautiana. Mimi naweza kuiita wanafunzi. Lakini darasa, hii si darasa katika kitu oriented Java aina ya njia. Ni tu darasa la wanafunzi. Na aina ya data ya kipengele kila katika safu kwamba ni mwanafunzi. Hivyo hii ni tofauti kidogo na kutoka kwa kusema kitu kama hii, ni tu - Mimi kusema nipe wanafunzi watatu na kuwaita kwamba darasa safu. Wote haki. Sasa hapa ni kitanzi nne. Hii guy ya ukoo - iterate kutoka sifuri hadi kwenye tatu. Na hapa ni kipande mpya ya syntax. mpango wa kwenda haraka yangu, binadamu, kutoa ni mwanafunzi ID, ambayo ni int. Na hapa ni syntax na ambayo unaweza kuhifadhi kitu katika uwanja ID katika eneo darasani mabano I. Hivyo syntax hii si mpya. Hii ina maana tu nipe nane mwanafunzi katika darasa. Lakini ishara hii ni mpya. Hadi sasa, tumekuwa haiwezi kutumika dot, angalau katika kanuni kama hii. Hii ina maana kwenda struct inajulikana kama mwanafunzi na kuweka kitu huko. Vile vile, katika mstari huu ujao, 31, kwenda mbele na kuweka chochote mtumiaji aina kwa jina hapa na nini kufanya kwa ajili ya nyumba, kitu kimoja, kwenda mbele na kuiweka katika. nyumba. Basi ni nini mpango huu hatimaye kufanya? Unaweza kuona teaser kidogo huko. Hebu kwenda mbele na kufanya kufanya structs 0 dot kufyeka struct 0, ID ya mwanafunzi 1, kusema Daudi Mather, mwanafunzi ID 2. Rob Kirkland, mwanafunzi ID 3. Lauren Leverit - na kitu pekee mpango huu alivyofanya, ambayo ni haki kabisa holela, ni Nilitaka kufanya kitu na data hii, sasa kwamba nimepata alitufundisha jinsi ya kutumia structs, ni mimi tu alikuwa hii kitanzi ziada hapa. Mimi iterate juu ya safu ya wanafunzi. Nilikuwa yetu, labda sasa ukoo rafiki, kamba kulinganisha, stircomp kwa kuangalia ni nyumba 8 ya mwanafunzi sawa na Mather? Na kama hivyo, tu magazeti kitu kiholela kama, ndiyo, ni. Lakini tena, tu kunipa fursa kutumia na kutumia tena na kutumia tena hii mpya dot nukuu. Hivyo anayejali, haki? Kuja na mpango wa mwanafunzi ni kiasi fulani holela, lakini zinageuka kwamba tunaweza kufanya mambo muhimu kwa hii, kwa mfano kama ifuatavyo. Hii ni struct ngumu zaidi katika C. Ni got kadhaa au mashamba zaidi, kiasi fulani isiyoeleweka kirahisi jina. Lakini kama wameweza milele habari wa graphics file format kuitwa bitmap, BMP, ni zinageuka kuwa bitmap file format pretty kiasi kwamba inaonekana kama hii. Ni kijinga kidogo smiley uso. Ni picha ndogo kwamba nimepata zoomed katika juu ya pretty kubwa ili niweze kuona kila ya dots mtu binafsi au saizi. Sasa, ni zamu nje tunaweza kuwakilisha nyeusi dot na, kusema, idadi 0. Na dot nyeupe na namba 1. Hivyo kwa maneno mengine, kama unataka kuteka Smiley uso na kuokoa kwamba picha katika kompyuta, Inatosha kuhifadhi zeros na ndio kwamba kuangalia kama hii, ambapo, tena, ndio ni nyeupe na zeros ni nyeusi. Na kwa pamoja, ikiwa wewe kwa ufanisi na kujifunga ya ndio na zeros, una gridi ya saizi, na kama wewe kuweka yao nje, una cute kidogo smiley uso. Sasa, bitmap file format, BMP, ni ufanisi kwamba chini ya Hood, lakini kwa zaidi piseli sot kwamba wewe kweli anaweza kuwakilisha rangi. Lakini wakati una kisasa zaidi file format kama BMP na JPEG na GIF na ambayo unaweza kuwa na utambuzi, wale mafaili ya rekodi kawaida si tu kuwa zeros na ndio kwa saizi, lakini wana baadhi metadata pia - meta kwa maana ya kwamba ni kweli data lakini ni muhimu kuwa na. Hivyo hawa mashamba hapa ni ikimaanisha, na tutaweza kuona hili kwa undani zaidi katika P-kuweka 5, kwamba kabla ya zeros na wale ambao kuwakilisha piseli kwa mfano, kuna rundo la metadata kama ukubwa wa picha na upana wa picha. Na taarifa mimi nina kukwanyua mbali baadhi ya holela mambo hapa - upana na urefu. Kidogo kuhesabu na baadhi ya mambo mengine. Hivyo kuna baadhi ya metadata katika faili. Lakini kwa kuelewa jinsi files wamelazwa nje kwa njia hii, unaweza kweli kisha kuendesha picha, kupona picha kutoka disk, resize images. Lakini unaweza si lazima kuongeza yao. Mimi zinahitajika picha. Hivyo mimi akarudi RJ hapa, ambaye wewe aliona juu ya screen kabisa baadhi ya wakati uliopita. Na kama mimi kufungua Akitoa hapa, hii ni kile kinachotokea kama wewe kujaribu kuvuta na kuimarisha RJ. Yeye si kupata yoyote bora kweli. Akitoa sasa ni aina ya blurring ni kidogo kidogo, tu Gloss juu ukweli kwamba RJ haina kupata hasa kuimarishwa wakati zoom in Na kama kufanya hivyo kwa njia hii, kuona viwanja? Yeah, unaweza dhahiri kuona mraba projector. Hiyo ni nini kupata wakati kuongeza. Lakini katika kuelewa jinsi RJ yetu au Uso smiley ni kutekelezwa hebu kweli kuandika kificho kwamba kuyaharibu mambo hayo. Na nilifikiri ningependa kuishia kwenye kumbuka hii, pamoja na 55 sekunde ya kuongeza kwamba, Mimi kuthubutu, kusema badala ya kupotosha. [Video avspelning] -Yeye uongo. Juu ya nini, mimi sijui. -Basi je, sisi kujua? -Kwamba saa 9:15 Ray Santoya mara kwa ATM. -Basi swali ni nini ilikuwa yeye kufanya saa 9:16? -Risasi millimeter tisa katika kitu. Labda aliona sniper. -Au alikuwa anafanya kazi pamoja naye. -Subiri. Kwenda nyuma moja. -Unaona nini? -Lete uso wake juu, full screen. -Wake glasi. -Kuna kutafakari. -Hiyo baseball Neuvitas timu. Hiyo ni alama zao. -Na yeye kuzungumza na mtu yeyote ni amevaa kwamba koti. [MWISHO video avspelning] DAVID J. Malan: Hii mapenzi kuwa Tatizo Set 5. Tutaona wewe wiki ijayo. MALE SPIKA: Katika CS50 ijayo. [Crickets chirping] [Halisi kucheza]